극한의 아두이노 DIY생활 - 곡률측정기20
안녕하세요 Jimae입니다.
오늘은 우선 거리를 측정하는 알고리즘에 대해서 우선 글을 써보도록하겠습니다.
void LaserDistanceCalculation(void)
{
unsigned char c;
unsigned char num = 0;
if(distanceFlag != START) return;
switch(detectionOrderDistance)
{
case LASERSHOOT:
CenterLaserShoot();
laserAnswerTimeD = millis(); // 레이저 오류일때 다시보내기 위한 시간
detectionOrderDistance = LASERRREAD;
break;
case LASERRREAD:
waitTimeD = millis() - laserAnswerTimeD; // 레이저 오류일때 다시보내기 비교 시간
if(waitTimeD >= 1000) // 1초 이상
{
detectionOrderDistance = LASERSHOOT; // error 만약 3개의 레이저를 쓸때 한개라도 에러나면 전부다 다시 해줘야 한다.
break;
}
if (CENTERLASER.available())
{
c = CENTERLASER.read();
Distancequeue.enqueue(c);
if(c == ',') detectionOrderDistance = DATAPROCESS;
c = 0;
}
break;
case DATAPROCESS:
if(!Distancequeue.isEmpty())
{
c = Distancequeue.dequeue();
if(c == ':') // 길이 데이터만 건짐
{
for(num = 0; num < 6; num++) // 데이터 길이 6개 단위 M
{
DistanceData[num] = (Distancequeue.dequeue() - 48); // 아스키 코드를 숫자값으로 변환 - 48
}
}
else if(c == 'm') //큐 비우기
{
while(!Distancequeue.isEmpty()) c = Distancequeue.dequeue();
}
c = 0;
}
else detectionOrderDistance = DATACALCULATION;
break;
case DATACALCULATION:
laserCenterDistance = (double) (DistanceData[1] + (DistanceData[3] * 0.1) + (DistanceData[4] * 0.01) + (DistanceData[5] * 0.001)); // 배열값 계산 배열의 0번째 ' ' 2번째 '.'
//현재 cm단위
laserCenterDistance *= 100;
laserCenterDistance -= CENTERDISTANCECORRECTION;
if(laserCenterDistance <= 0) laserCenterDistance = 0;
detectionOrderDistance = LASERSHOOT;
break;
default:
detectionOrderDistance = LASERSHOOT;
break;
}
}
우선 distanceFlag 변수가 START를 눌러줘야 하는대요.
#define START 1
#define STOP 0
이것은
unsigned char distanceFlag = STOP;
void DistanceCalculationStart(void)
{
distanceFlag = START;
}
DistanceCalculationStart 함수가 실행을 해야 START로 설정을 할수있습니다.
void LCDSensorView(unsigned char selectSensor)
{
switch(selectSensor)
{
case CURVATURE:
CurvatureCalculationStart();
LCDScreen[1] = " R" + String(CurvatureRead()) + " cm ";
break;
case DISTANCE:
DistanceCalculationStart();
LCDScreen[1] = " " + String(DistanceRead()) + " cm ";
break;
case WINDSPEED:
LCDScreen[1] = " " + String(WindSensorRead()) + " m/s ";
break;
case ILLUMINANCE:
LCDScreen[1] = " " + String(LightSensorRead()) + " lux ";
break;
case LIGHT:
LightControl(RotaryLightRead());
LCDScreen[1] = "Please";
LCDScreen[2] = "Volume control";
break;
default:
break;
}
LCDdrawing();
LCDclear();
}
DistanceCalculationStart 이함수는 LCD 선택하는 화면에서 DISTANCE 데이터일때 실행이 됩니다.
위의 알고리즘 같은 경우
enum{LASERSHOOT = 0, LASERRREAD, DATAPROCESS, DATACALCULATION};
순서대로 실행이 됩니다.
LCD 화면에서 거리를 측정하게끔 선택이 된다면
위의 순서대로 실행이 되는대요.
case LASERSHOOT:
CenterLaserShoot();
laserAnswerTimeD = millis(); // 레이저 오류일때 다시보내기 위한 시간
detectionOrderDistance = LASERRREAD;
break;
우선 레이저를 쏩니다.
void CenterLaserShoot(void) // 거리측정 전용 레이저 즉 가운데
{
CENTERLASER.write(DISTANCE);
}
그것도 가운데에 있는 레이저 모듈을 사용해서 먼저 레이저를 쏘고난뒤에
case LASERRREAD:
waitTimeD = millis() - laserAnswerTimeD; // 레이저 오류일때 다시보내기 비교 시간
if(waitTimeD >= 1000) // 1초 이상
{
detectionOrderDistance = LASERSHOOT; // error 만약 3개의 레이저를 쓸때 한개라도 에러나면 전부다 다시 해줘야 한다.
break;
}
if (CENTERLASER.available())
{
c = CENTERLASER.read();
Distancequeue.enqueue(c);
if(c == ',') detectionOrderDistance = DATAPROCESS;
c = 0;
}
break;
두가지를 실행합니다. Error 발생하면 다시 레이저를 쏘기위해 LASERSHOOT으로 돌아가고
그렇지 않다면 데이터를 취득합니다.
오늘은 여기까지 다들 좋은 하루 되세요.
극한의 아두이노 DIY생활 - 곡률측정기1
극한의 아두이노 DIY생활 - 곡률측정기2
극한의 아두이노 DIY생활 - 곡률측정기3
극한의 아두이노 DIY생활 - 곡률측정기4
극한의 아두이노 DIY생활 - 곡률측정기5
극한의 아두이노 DIY생활 - 곡률측정기6
극한의 아두이노 DIY생활 - 곡률측정기7
극한의 아두이노 DIY생활 - 곡률측정기8
극한의 아두이노 DIY생활 - 곡률측정기9
극한의 아두이노 DIY생활 - 곡률측정기10
극한의 아두이노 DIY생활 - 곡률측정기11
극한의 아두이노 DIY생활 - 곡률측정기12
극한의 아두이노 DIY생활 - 곡률측정기13
극한의 아두이노 DIY생활 - 곡률측정기14
극한의 아두이노 DIY생활 - 곡률측정기15
극한의 아두이노 DIY생활 - 곡률측정기16
극한의 아두이노 DIY생활 - 곡률측정기17
극한의 아두이노 DIY생활 - 곡률측정기18
극한의 아두이노 DIY생활 - 곡률측정기19
Posted through the AVLE Dapp (https://avle.io)
Posted through the AVLE Dapp (https://avle.io)
[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.