극한의 아두이노 DIY생활 - NFC RC카10

in kr-dev 커뮤니티2 years ago

안녕하세요. Jimae입니다.

프로그램을 단계적으로 나워서 분석을 시작하도록 하겠습니다.

    case COMMANDREAD:
                     if (BTSerial.available())    // 컨트롤러에서 들어오는 데이터가 있을때
                     {
                        commandBugffer[commandBufferAddress++] = BTSerial.read();   // 데이터를 읽고

                        //Serial.println(commandBugffer[commandBufferAddress++],HEX);

                        if(commandBufferAddress >= 3)   // 3개 이상의 데이터가 들어왔을때
                        {
                          commandBufferAddress = 0; 
                          
                          programStep = COMMANDANALYSIS;    // 데이터를 분석하는 구역으로 변경
                          
                          break;
                        }
                     }
                     break;

우선 블루투스를 통해서 데이터 3개이상 들어오면 데이터를 분석하는곳으로 넘어가는대요.

commandBugffer 전역배열을 이용하여 블루투스에 데이터가 들어오는 족족 저장을 시킵니다.

 case COMMANDANALYSIS:     // 데이터 분석
                         if(commandBugffer[0] == 0xAA && commandBugffer[1] == 0xAA && commandBugffer[2] == CAHNGE)  // 특수코드 LED 및 ID 변환하는 명령어가 들어올때
                         {
                          programStep = CHANGENFCREAD; // 변환하는 구역으로 변경
                          break;
                         }
                         else if(commandBugffer[0] == rcCarID)    // 그게아니라 모터움직이는 명령어가 들어올때
                         {
                          programStep = MOTORDRIVING;   // 모터 움직이는 구역으로 변경
                          break;
                         }
                         programStep = COMMANDREAD;   // 그게아니면 다시 읽기
                         break;

여기서 3데이터의 들어와야하는 기준은 RC카 ID,0xAA, CAHNGE 값이에요.

CAHNGE값은 여기서 enum 으로 선언했었는대

enum{GO = 0x41,ARRIVE,COMPLETE,CAHNGE,ADVANCE,BACK,RIGHT,LEFT}; 

unsigned char rcCarID = 1;    // ID값을 저장 기본적으로는 1번

CAHNGE값은 다시말해서 0x45의 값을 가집니다.

즉 블루투스로 RC카 ID,0xAA,0x45의 값이 순서대로 들어와야지만 데이터를 읽은걸로 판단하여 다음시나리오로 넘어갑니다.

그렇지 아니하다면 COMMANDREAD 로 넘어가서 블루투스의 데이터를 대기할것입니다.

자 그런대 전원키고 난뒤 모든 RC카의 ID는 1의값을 가집니다. 그래서 그것을 설정을 해주기위해

처음에는 무조건 0xAA,0xAA,0x45의 값이 들어와야 CHANGENFCREAD RC카의 아이디를 초기화하는 시나리오로 넘어갈것이고.

그렇지 아니하고 RC카의 ID가 들어온다면 움직이는 시나리오로 넘어갈것입니다.

처음 전원을 넣었다고 가정을 하고 CHANGENFCREAD 시나리오를 살펴볼까요?

    case CHANGENFCREAD:  // ID,LED 변경하기전 NFC값 읽기
                       if(RFIDRead() == MI_OK)   // 우선 NFC 값을 읽는다
                       {
                        nfcNumber = RFIDIdCompare();  // 읽은 NFC값을 위에 아이디 배열과 비교해서 가공하여 번호로 저장
                        programStep = CHANGELED;    // LED 변경 및 보낼데이터 정하는 구역으로 변경 
                       }
                     
                       break;

초기화 시나리오로 와서 하는것은 NFC 태그를 읽어서 비교하는것입니다.

RFIDIdCompare함수부터 살펴볼게요.

unsigned char RFIDIdCompare(void)   //RFID 값을 1~30번 형태로 변환하기 위한 함수
{
  unsigned char locationNumber = 0;
  for(unsigned char num = 0; num < 30; num++)
  {
    if(NFCID[num][0] == nowId[0] && NFCID[num][1] == nowId[1]) locationNumber = num + 1;
  }

  return locationNumber;
}

NFC 의 값을읽어서 현재 몇번의 스티커의 값을 가졌는지 분석하는함수입니다.

const unsigned char NFCID[30][2] = {{0x6F, 0xDA}, // 1 
                                    {0x22, 0xCE}, // 2
                                    {0x3E, 0xC9}, // 3
                                    {0xFB, 0xD8}, // 4 
                                    {0x17, 0xCB}, // 5  
                                    {0x56, 0xCC}, // 6
                                    {0x85, 0xCD}, // 7
                                    {0xC5, 0xCB}, // 8 
                                    {0x1D, 0xD1}, // 9
                                    {0x6E, 0xCE}, // 10 
                                    {0x11, 0xD2}, // 11
                                    {0x0C, 0xD8}, // 12
                                    {0xF5, 0xD3}, // 13
                                    {0xCC, 0xCD}, // 14
                                    {0x87, 0xCB}, // 15
                                    {0x29, 0xC8}, // 16
                                    {0x36, 0xCC}, // 17
                                    {0x1E, 0xD3}, // 18
                                    {0x92, 0xD6}, // 19
                                    {0xD6, 0xDE}, // 20
                                    {0x1D, 0xE2}, // 21
                                    {0xA6, 0xC9}, // 22
                                    {0x91, 0xDC}, // 23
                                    {0xE0, 0xDD}, // 24
                                    {0xB2, 0xCB}, // 25
                                    {0xC4, 0xD7}, // 26
                                    {0x43, 0xCF}, // 27
                                    {0xC8, 0xD7}, // 28
                                    {0xA1, 0xCF}, // 29
                                    {0xCB, 0xD8}}; // 30

위에 NFC 스티커를 일일히 읽어서 적어놓은 배열값을 기준으로 비교를하죠.

현재 스티커의 번호를 알고난뒤 CHANGELED LED를 바꾸는 시나리오로 넘어가는대요.

글이 더 길어질것같아 오늘은 여기까지 하겠습니다.

다들 좋은하루 되세요.

극한의 아두이노 DIY생활 - NFC RC카1
극한의 아두이노 DIY생활 - NFC RC카2
극한의 아두이노 DIY생활 - NFC RC카3
극한의 아두이노 DIY생활 - NFC RC카4
극한의 아두이노 DIY생활 - NFC RC카5
극한의 아두이노 DIY생활 - NFC RC카6
극한의 아두이노 DIY생활 - NFC RC카7
극한의 아두이노 DIY생활 - NFC RC카8
극한의 아두이노 DIY생활 - NFC RC카9

Sort:  
 2 years ago 

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

Coin Marketplace

STEEM 0.21
TRX 0.20
JST 0.034
BTC 98129.50
ETH 3322.67
USDT 1.00
SBD 3.05