아두이노 코딩-146: 초음파 센서 Adafruit 모터쉴드 RC카 코딩

in #kr6 years ago (edited)

noname01.png

Adafruit 모터쉴드로 DC모터를 제어하는 RC카에 초음파 센서 SR-04를 설치하자. 아무래도 장님 보다는 눈 없는 박쥐가 훨씬 나을 듯하다. 아두이노에서 초음파 센서를 사용하여 코딩하는 것이 그다지 어렵지는 않으나 해보면 될 때도 있고 안될 때도 있는데 코딩에 문제가 있는 것이며 그 원인을 정확하게 알아야 할 필요가 있다.

RC카에 초음파 센서를 배선하기 위해서는 Adafruit 모터 쉴드 보드가 사용하는 디지털 핀 범위를 정확히 파악해야 한다. 모더 쉴드가 사용하는 디지털 핀 범위는 3∼12번까지로 거의 다이고 남겨진 핀은 0, 1, 2, 13번 핀이다. 그중에서 1, 2번 핀은 HC-06 블루투스 보드가 스마트폰 앱인벤터 코드가 사용하는 핀이다.

noname02.png

남겨진 2,13번 핀을 대상으로 사진에서처럼 아두이노 우노 보드의 랜드에 핀을 설치하든지 또는 랜드에 직접 점퍼선을 납땜하도록 하자. 반드시 2번 핀은 초음파 센서 echo 핀에 13번 핀은 trigger 핀에 순서가 바뀌지 않도록 연결하도록 한다.

따라서 RC카에 설치된 아두이노 우노 보드에 약간의 배선 작업을 하고 초음파 코드를 작성 테스트해 보기로 한다. ⦁⦁⦁

noname03.png

motor1 과 motor2 는 각각 왼쪽과 오른쪽 모터를 나타낸다. 1 과 2를 L 과 R로 모조리 바꾸어도 무방하다. 문자 변수 command 는 앱인벤터에서 보내는 문자를HC-06 블루투스보드를 통해 아두이노 우노에서 입력버퍼를 통해 문자로 읽는다.
모터 스피드 값은 0∼255 사이의 값을 가지지만 220 이나 230을 사용할 경우 모터에서 징∼하는 소리가 날 수 있으므로 아예 최대값인 255로 설정하도록 한다.

setup()에서 통신속도를 비록하여 디지털 핀 출력 입력을 선언하고 RC카는 정지상태로 두어 블루투스 연결하는 시간 동안 10여초 대기 시키다.

noname04.png

loop()에서 시작하자마자 초음파 센서로 전방 장애물과의 거리를 측정하여 30cm 이내면 RC카를 정지시킨다.

noname05.png

하지만 RC카가 정지하다라도 loop() 가 계속 실행되어 입력버퍼에서 전진 후진 좌회전 우회전 명령 입력 여부를 체크하여 실행하게 된다. 특히 주행 명령 뒤에 따르는 delay(50) 명령은 스마트폰 키 제어 명령 지속 시간에 해당한다. 값이 클 경우 특히 회전 중에 지나치게 회전 후 멈추게 되므로 짧게 끊을 수 있는 50 msec 정도가 좋으며 필요하다면 여러번 연속 터치를 해야 한다.

아울러 스마트앱 키보드 사용 경험에 의하면 RC카의 반응이 다소 빠른 편이라 회전 후 정확한 각에서 멈추거나 또는 정지하려면 전진 후진 좌회전 및 우회전 키와 함께 연이어 멈춤 키를 눌러야 하므로 현재의 키보드 배열이 불편하게 느껴지며 곧 앱인벤터 코드를 수정할 계획이다.

//RCCAR_BT_ULTRASIONIC_01
#define ECHO 2
#define TRIG 13

#include <AFMotor.h>
AF_DCMotor motor1(3);
AF_DCMotor motor2(4);
int mspd = 255;
char command;

void setup() {
Serial.begin(9600);
pinMode(TRIG,OUTPUT);
pinMode(ECHO,INPUT);
Stop();
delay(11000);
}

void loop() {
digitalWrite(TRIG,HIGH); //Send Pulse
delayMicroseconds(10);
digitalWrite(TRIG,LOW);
int us = pulseIn(ECHO,HIGH); //get return time
int cm = us/58;
Serial.print("cm : ");
Serial.println(cm);
if( cm < 30 ) {
Stop();
delay(50);
}

if(Serial.available() > 0){
command = Serial.read();
if( command == 'F') {
forward();
delay(50);
}

 if( command == 'B') {
  back();
  delay(50);
 }

 if( command == 'L') {
  left();
  delay(50);
 }

 if( command == 'R') {
  right();
  delay(50);
 }

 if( command == 'S') {
  Stop();
  delay(50);
 }

}
}

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
}

//끝

Sort:  

I upvoted your post.

Best regards,
@Council

Posted using https://Steeming.com condenser site.

이오스 계정이 없다면 마나마인에서 만든 계정생성툴을 사용해보는건 어떨까요?
https://steemit.com/kr/@virus707/2uepul

Coin Marketplace

STEEM 0.26
TRX 0.11
JST 0.033
BTC 64266.94
ETH 3077.24
USDT 1.00
SBD 3.87