극한의 아두이노 DIY생활 - 곡률측정기20

in kr-dev 커뮤니티2 years ago (edited)

안녕하세요 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)

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.030
BTC 58665.81
ETH 3153.57
USDT 1.00
SBD 2.44