아두이노 코딩-154: 아두이너 RC카 다시 업그레이드 해 볼까요?

codingart(66)
Published in
#kr
Words
795
Reading
4 min
Listen
Play
8y

noname01.png

아두이노 RC카 이젠 질려버릴 만 하다고 생각할지도 모르겠지만 아두이노 배선과 코딩을 취미로 삼는다는 것은 웬만큼 중독성이 강하다는 골프나 도박 보다 결코 약하지 않다고 느낀다.

이미 아두이노 RC카 와 밸런싱 로봇 둘 다 리바이벌하여 업그레이드를 해보았다. 이번에 다시 해보려는 아두이노 RC카는 벌써 3회째에 접어든다. 만들어 둔 RC카가 디자인도 그렇고 해서 성능까지 그다지 마음에 드는 것은 아니지만 아직은 해야할 배선과 코드 업그레이드 작업이 꽤 남아 있다고 생각한다.

이번에 다루어 보려고 하는 것은 블루투스로 제어하는 아두이노 RC카에서 너무나 기초적으로 보일지도 모르지만 2개의 LED를 설치하여 차량에서처럼 ON OFF를 시켜볼 생각이다.

RC카가 STOP 또는 BACK 상태일 때 두 개의 LED 가 동시에 ON 이 되어야 하며 앞으로 출발(FORWARD)하게 되면 동시에 OFF 해야 한다.
좌회전 시에는 왼쪽 LED 가 일정 주기로 점멸해야 하며 우회전 시에는 그 반대이다.

#아두이노 LED 배선과 코딩
모터 쉴드를 사용하는 아두이노 쉴드 RC카에서 문제 중의 하나가 디지털 핀들이 더 이상 남아 있지 않다는 점이다.

noname02.png

디지털 핀 0번과 1번은 블루투스 RX,TX 용으로 할당이 되어 있고, 3∼12번까지 모조리 모터 쉴드가 사용하며 그나마 남은 2번과 13번 핀은 초음파 센서가 사용한다.

noname03.png

그렇다면 어디에서 디지털 출력을 위한 핀들을 조달해야 할까? 이 문제에 관해서 동호회 아두이노 전문가에게 1년전부터 들은 얘기가 있었다. 아날로그 핀이든 뭐든 다 쓰면 된다는 것이다. 물론 구체적인 방법 설명은 없었다. 그래서 혹 DDRD 및 PORTD 경험이 있어서 추리에 의존하여 DDRC 및 PORTC를 시험해보게 된다.

즉 아두이노에는 또 다른 방식의 핀 모드 설정 방식이 있다. 위 사진에서 오른쪽 디지털 핀 0∼7번이 PORTD 즉 PD0∼PD7 이며 디지털 핀 8∼13번이 PORTB 즉 PB0∼PDB5 로 pinout 다이아그램에 정의되어 있다.

아두이노코딩에 있어서 디지털 핀 0∼13번 핀을 사용하여 pinMode() 명령을 사용하여 출력 또는 입력 상태를 반드시 설정하여야 한다.

반면에 PORT 개념으로 코딩을 하려면 DDRD 또는 DDRB 명령이 사용되며 해당 핀에 출력 또는 입력을 위해서는 PORTD 나 PORTB 명령을 사용하게 된다. 다음의 비교 예제를 참고하자.

pinMode(3,HIGH) <---> DDRD |= B00001000
digitalWrite(3,HIGH) <---> PORTD |= B00001000

B00001000 은 8비트 이진법(binary)정보로 표시한 십진 수 3을 뜻한다.

LED ON에 대해서는 DDRC |= B00000010, PORTC |= B00000010
LED OFF 에 대해서는 DDRC |= B00000010, PORTC |= B00000000

을 코딩하여 시험해 보았으나 LED 가 ON 은 되었으나 OFF 가 되지 않았다.

이 문제를 해결하기 위해서 야후 사이트를검색해 보았는데 어느 포럼에 아두이노 아날로그 핀 A0∼A5번은 14∼19번으로 카운팅한다는 얘기거 있었다. 즉 그 번호로 pinMode() 와 digitalWrite() 명령을 사용할 수 있다는 뜻이다.

되는지 않되는지 확인 차원에서 RC카와는 별도로 실험을 해보기로 하자. 첫 번째는 LED와 전류제한 저항을 아날로그 핀인 A1 즉 디지털 핀 15번에 설치하여 0.5초 간격으로 점멸을 시켜 보기로 한다. 두 번째는 DHT11 온습도 측정 센서의 데이터 핀을 A0에 배선 후 온습도 측정을 해 시리얼 모니터로 보기로 하자.

int ledPin =15;
void setup() {
Serial.begin(9600);
pinMode(ledPin,OUTPUT);}

void loop() {
digitalWrite(ledPin, HIGH);
delay(500);
digitalWrite(ledPin, LOW);
delay(500);
}

배선 시험 결과는 동영상을 참조하자. 잘 작동했다.
https://youtu.be/3xWEb9zypIU

두 번째는 DHT11 온습도 측정 센서의 데이터 핀을 A0에 배선 후 온습도 측정을 해 시리얼 모니터로 보기로 하자. DHT11 온습도 센서는 70∼80년대부터 사용하던 타이밍 차트에 의한 디지털 인터페이스 방식을 그대로 사용하는 센서이다. 핀 번호만 정의한 후 실험 결과 잘 작동했다. 이로서 아날로그 핀 A0∼A5를 필요 시 디지털 데이터 핀으로도 사용할 수 있다.

noname04.png

#R C카 자율 주행 코딩
이미 제작했던 RC카를 스마트폰의 블루투스로 조종할 수 있으나 도영상 촬영과 블루투스 제어를 동시에 할 수 없으므로 RC카를 자율 주행 시키기로 했다. 자율 주행이 머신 러닝 코드를 심은 자율 주행이 아니라 짧은 시간 간격으로 전진 후진 좌회전 우회전을 반복하는 주행이다. 즉 블루투스 제어를 위한 HC-06보드의 Tx, Rx 핀을 뽑은 후 자율 주행 코드를 업로딩하면 된다. 초음파 센서도 부착되어 있지만 사용이 안된다.
LED 부착 후 FORWARD 전진 시 LED OFF, STOP 이나 BACK 시 LED ON, 좌회전 시 왼쪽 LED ON OFF 0.5초 간격, 우회전 시 LED ON OFF 0.5초 간격으로 코딩한다.

noname05.png

건전지로 구동하기 전에 RC카를 바퀴가 닫지 않도록 올려 놓고 LED 가 제대로 ON OFF 되는지 다음 동영상에서처럼 시험해 보자.

https://youtu.be/OOPye42W-50

좌우회전 시에는 실제 차량에서처럼 ON OFF를 일정 주기로 반복하여 껌뻑거림 효과를 주고 싶으나 아두이노가 순차적으로 작동하기 때문에 모터쉴드에 의한 모터 제어와 LED ON OFF 제어를 짧은 주기로 섞어 코딩하기는 불가능하다. 참고로 깜빡이는 효과를 연출하기 위해서는 아두이노에서 별도로 외부 555 발진기 LED 회로를 만들어 시작과 종료 디지털 신호를 줄 수 있어야 한다.

첨부한 아두이노 코드를 다운받아 실해해 보기 바란다.

#RCCAR_LED_ON_OFF_01
#include <AFMotor.h>

//creates two objects to control the terminal 3 and 4 of motor shield
AF_DCMotor motor1(3);
AF_DCMotor motor2(4);
int mspd = 200;
int rpin = 15;
int lpin = 16;

void setup() {
Serial.begin(9600);
pinMode(rpin, OUTPUT);
pinMode(lpin,OUTPUT);
}

void loop(){

  digitalWrite(rpin,LOW);
  digitalWrite(lpin,LOW);
  forward();
  delay(1000);

  digitalWrite(rpin,HIGH);
  digitalWrite(lpin,HIGH);
  back();
  delay(1000);

  digitalWrite(lpin,HIGH);
  digitalWrite(rpin,LOW);
  left();
  delay(1000);
    
  digitalWrite(rpin,HIGH);
  digitalWrite(lpin,LOW);
  right();
  delay(1000);

}

void forward() {
motor1.setSpeed(mspd); //Define maximum velocity
motor1.run(FORWARD); //rotate the motor clockwise
motor2.setSpeed(mspd); //Define maximum velocity
motor2.run(FORWARD); //rotate the motor clockwise
}

void back() {
motor1.setSpeed(mspd);
motor1.run(BACKWARD); //rotate the motor counterclockwise
motor2.setSpeed(mspd);
motor2.run(BACKWARD); //rotate the motor counterclockwise
}

void left() {
motor1.setSpeed(mspd); //Define maximum velocity
motor1.run(FORWARD); //rotate the motor clockwise
motor2.setSpeed(0);
motor2.run(RELEASE); //turn motor2 off
}

void right() {
motor1.setSpeed(0);
motor1.run(RELEASE); //turn motor1 off
motor2.setSpeed(mspd); //Define maximum velocity
motor2.run(FORWARD); //rotate the motor clockwise
}

void Stop() {
motor1.setSpeed(0);
motor1.run(RELEASE); //turn motor1 off
motor2.setSpeed(0);
motor2.run(RELEASE); //turn motor2 off
}

아두이노 코딩-154: 아두이너 RC카 다시 업그레이드 해 볼까요? | Ecency