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

in kr-dev 커뮤니티2 years ago

안녕하세요 Jimae입니다.

저번에 이어서 글을 마저 쓰도록 해보겠습니다.

                    if (CENTERLASER.available())
                    {
                        c = CENTERLASER.read();
                        Distancequeue.enqueue(c);
                        if(c == ',') detectionOrderDistance = DATAPROCESS;
                        c = 0;
                    }

레이저 기기에서 데이터를 읽은다음 넣는곳은 큐라는 저장장치 입니다.

이곳에 먼저 데이터를 넣으면 들어가는 순서대로 뺄수있습니다.

이러한 처리를 하는 이유는 데이터가 누락될수 있기 때문에 미리 데이터를 따로 저장하고 나중에 처리를 한다는 의미로 생각하시면 되요.

이렇게 데이터를 따로 저장하고난뒤에

  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;

데이터를 뺍닌다.

현재 들어오는 데이터는 아스키 코드라고 해서 총 128 숫자로 데이터를 표현하는 방식인대요.

이러한 암호코드 처럼 값이 들어오기 때문에 이것에 대한 처리가 필요합니다.

어차피 모든데이터는 숫자로 대부분 들어오기때문에

DistanceData[num] = (Distancequeue.dequeue() - 48);

이렇게 데이터를 구성한다면

우리가아는 아라비아 숫자 정수값으로 데이터를 한개씩 취할수있습니다.

이것을 배열에 또 따로 저장하여 나중에 처리를 하려고 합니다.

  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;

xx.xxx 기준으로 프데이터가 들어오기때문에

laserCenterDistance = (double) (DistanceData[1] + (DistanceData[3] * 0.1) + (DistanceData[4] * 0.01) + (DistanceData[5] * 0.001)); // 배열값 계산 배열의 0번째 ' ' 2번째 '.'

되게 길게 처리를 할거에요.

이것은 우리가아는 실수형태에 데이터를 취하는 방법이구요.

cm 단위로 데이터를 바꾸고 난뒤에

                //현재 cm단위
                laserCenterDistance *= 100;

                laserCenterDistance -= CENTERDISTANCECORRECTION;

이부분은 바로 기구와의 오차를 보정해주는 값이라고 생각하시면 됩니다.

모듈에서 나오는 거리를 재기때문에 조립하는 과정에서 기구와 어느정도 거리 오차가 생기기 때문에 이러한 값을 빼는 것입니다.

모든 처리가 끝나면 다시 LASERSHOOT 으로가서 레이저를 다시 쏘는것부터 다시시작 할것입니다.

이러한 일들을 반복하면서 레이저에 찍히는 거리를 주기적으로 LCD에 뿌려주는 역활을 지속합니다.

로터리 스위치로 멈추기 전까지요.

오늘은 여기까지 다들 좋은하루 되세요.

극한의 아두이노 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
극한의 아두이노 DIY생활 - 곡률측정기20

Sort:  
 2 years ago 

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

Coin Marketplace

STEEM 0.18
TRX 0.14
JST 0.030
BTC 58679.35
ETH 3155.04
USDT 1.00
SBD 2.44