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

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;

전원이 켜지면 가장먼저 블루투스를 통해 명령을 받고 그다음 RC카의 ID를 지정하고

다시 블루투스를 통해 명령을 받기위해 COMMANDREAD에서 블루투스만 쳐다보고 있습니다.

그후 Control 보드에서 블루투스를 통해 명령이 오면

    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;

여기서 명령을 분석하겠죠.

else if(commandBugffer[0] == rcCarID) 우선먼저 이조건을 만족한다는 정보가 들어온다고 가정하죠.

rcCarID는 이미 정해졌고 블루투스를 통해 그아이디에 맞는 데이터가 들어온다면 MOTORDRIVING로 넘어갈것입니다.

    case MOTORDRIVING:
                      MotorDirection(commandBugffer[2]);     // 명령어에 3번째 데이터 가야할 방향으로 모터 셋팅
                      
                      if(commandBugffer[2] == ADVANCE || commandBugffer[2] == BACK)  MotorAction(STRAIGHTANGLE,500);    // 전진, 후진 모터 움직임
                      else  MotorAction(ROTATIONANGLE,500);   // 회전 모터 움직임

                      timeFlag = START;                   //타이머 시작
                      programStep = MOTORNFCREAD;         //모터 움직이고난후  NFC데이터 확인하는 구역으로 변경
                      break;

그다음 2번째 데이터를 이용하여 모터의 방향을 지정합니다.

자 여기서 블루투스 프로토콜이 어떤식으로 구성되어있는지 아실수가 있습니다.

첫번째는 RC카의 ID, 두번째는 응답용 데이터, 세번째는 모터의 방향 이렇게 구성되어있습니다.

두번째 데이터가 아직 아리송하지만 그냥 넘어가도록 하죠

void MotorDirection(unsigned char moDirection)    // 가야할 모터 방향 제어
{
  switch(moDirection)
  {
    case ADVANCE:
                 digitalWrite(MOTOR_DIR_R, LOW);         // Motor DIR_R as CW (LOW)
                 digitalWrite(MOTOR_DIR_L, HIGH);         // Motor DIR_L as CW (LOW)
                 break;
    case BACK:
                 digitalWrite(MOTOR_DIR_R, HIGH);         // Motor DIR_R as CW (LOW)
                 digitalWrite(MOTOR_DIR_L, LOW);         // Motor DIR_L as CW (LOW)
                 break;
    case RIGHT:                 
                 digitalWrite(MOTOR_DIR_R, HIGH);         // Motor DIR_R as CW (LOW)
                 digitalWrite(MOTOR_DIR_L, HIGH);         // Motor DIR_L as CW (LOW)
                 break;
    case LEFT:
                 digitalWrite(MOTOR_DIR_R, LOW);         // Motor DIR_R as CW (LOW)
                 digitalWrite(MOTOR_DIR_L, LOW);         // Motor DIR_L as CW (LOW)
                 break;

    default:
                 break;
  }
}

MotorDirection 함수는 모터 드라이버를 제어하기 위한 함수이구요.

void MotorAction(unsigned int motorAngle,unsigned int motorSpeed)   // 모터 제어 함수  PWM 대신 딜레이를 사용하여 모터제어
{
  double stepCalculation = 0;

  stepCalculation = motorAngle / ONESTEPANGLE;    // 움직여야할 모터각도를 스텝으로 계산

  motorSpeed += 400; 
  
  digitalWrite(MOTOR_ENABLE, HIGH);       // Motor Enable as HIGH
  
  for(unsigned int num = 0; num < (unsigned int)stepCalculation; num++)
  {
      if(num < 400) motorSpeed--;
      else if((unsigned int)(stepCalculation - num) < 600) motorSpeed++;  //모터 속도 제어
      
      digitalWrite(MOTOR_CLK_L, LOW);     // Motor CLK_L as LOW    
      digitalWrite(MOTOR_CLK_R, LOW);     // Motor CLK_R as LOW          
      delayMicroseconds(motorSpeed);                          // wait for a second
      digitalWrite(MOTOR_CLK_L, HIGH);    // Motor CLK_L as HIGH     
      digitalWrite(MOTOR_CLK_R, HIGH);    // Motor CLK_R as HIGH 
      delayMicroseconds(motorSpeed);   
  }

  digitalWrite(MOTOR_ENABLE, LOW);       // Motor Enable as HIGH
}

이것은 실제 모터가 움직이게 하는 함수입니다. if문으로 각각 블루투스의 세번째 데이터의 기준으로

전진, 후진, 회전을 담당합니다.

이렇게 모터를 움직이고난뒤 다시 NFC를 읽을탠대 이부분에서 부터는 다음부터 하겠습니다.

다들 좋은하루 되세요.

극한의 아두이노 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
극한의 아두이노 DIY생활 - NFC RC카10
극한의 아두이노 DIY생활 - NFC RC카11

Sort:  
 2 years ago 

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