BASIC4MCU | 질문게시판 | 아두이노 초음파 rc카
페이지 정보
작성자 pasha 작성일2020-01-19 20:39 조회15,299회 댓글2건본문
안녕하세요,
아두이노 초음파 rc카를 현재 만드는 중인데 문제가 있어 질문드리게 되었습니다.
현재 사용하는 모터드라이버는 L293B 모터 드라이버 IC 이며 보드는 아두이노 우노 보드입니다.
#define motor1EnablePin 10
#define motor1_1 9
#define motor1_2 8
#define motor2EnablePin 11
#define motor2_1 13
#define motor2_2 12
void forward(){
digitalWrite(motor1_1,HIGH);
digitalWrite(motor1_2,LOW);
analogWrite(motor1EnablePin,1023); //오른쪽 바퀴
digitalWrite(motor2_1,HIGH);
digitalWrite(motor2_2,LOW);
analogWrite(motor2EnablePin,1023); //왼쪽 바퀴
delay(1000);
}void backward(){
digitalWrite(motor1_1,LOW);
digitalWrite(motor1_2,HIGH);
analogWrite(motor1EnablePin,128);
digitalWrite(motor2_1,LOW);
digitalWrite(motor2_2,HIGH);
analogWrite(motor2EnablePin,128);
delay(1000);
}void turnR(){
analogWrite(motor1EnablePin,0);
digitalWrite(motor2_1,HIGH);
digitalWrite(motor2_2,LOW);
analogWrite(motor2EnablePin,1023);
delay(1000);
}void turnL(){
analogWrite(motor2EnablePin,0);
digitalWrite(motor1_1,HIGH);
digitalWrite(motor1_2,LOW);
analogWrite(motor1EnablePin,1023);
delay(1000);
}void setup() {
// put your setup code here, to run once:
pinMode(motor1_1,OUTPUT);
pinMode(motor1_2,OUTPUT);
analogWrite(motor1EnablePin,0);pinMode(motor2_1,OUTPUT);
pinMode(motor2_2,OUTPUT);
analogWrite(motor2EnablePin,0);
}void loop() {
// put your main code here, to run repeatedly:
forward();backward();
turnL();
turnR();
}
위의 코드를 사용하면 앞뒤와 우회전 및 좌회전까지 제가 원하는대로 움직입니다.
위 코드에서부터 초음파 rc카를 만들기 위해서 아래 코드를 짜보았습니다.
#include <Servo.h>
#define servoPin 7
#define trigPin 6
#define echoPin 5#define motor1EnablePin 10
#define motor1_1 9
#define motor1_2 8
#define motor2EnablePin 11
#define motor2_1 13
#define motor2_2 12
void forward(){
digitalWrite(motor1_1,HIGH);
digitalWrite(motor1_2,LOW);
analogWrite(motor1EnablePin,1023); //오른쪽 바퀴
digitalWrite(motor2_1,HIGH);
digitalWrite(motor2_2,LOW);
analogWrite(motor2EnablePin,1023); //왼쪽 바퀴
delay(1000);
}void backward(){
digitalWrite(motor1_1,LOW);
digitalWrite(motor1_2,HIGH);
analogWrite(motor1EnablePin,128);
digitalWrite(motor2_1,LOW);
digitalWrite(motor2_2,HIGH);
analogWrite(motor2EnablePin,128);
delay(1000);
}void turnR(){
analogWrite(motor1EnablePin,0);
digitalWrite(motor2_1,HIGH);
digitalWrite(motor2_2,LOW);
analogWrite(motor2EnablePin,1023);
delay(1000);
}void turnL(){
analogWrite(motor2EnablePin,0);
digitalWrite(motor1_1,HIGH);
digitalWrite(motor1_2,LOW);
analogWrite(motor1EnablePin,1023);
delay(1000);
}int angle=40;
Servo servo;
int state=0;int distance=0 ;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);pinMode(trigPin,OUTPUT);
pinMode(echoPin, INPUT);servo.attach(servoPin);
pinMode(motor1_1,OUTPUT);
pinMode(motor1_2,OUTPUT);
analogWrite(motor1EnablePin,0);pinMode(motor2_1,OUTPUT);
pinMode(motor2_2,OUTPUT);
analogWrite(motor2EnablePin,0);
forward();
}void loop() {
// put your main code here, to run repeatedly:servo.write(angle);
delay(50);
digitalWrite(trigPin, LOW);
delayMicroseconds(2);digitalWrite(trigPin, HIGH);
delayMicroseconds(10);digitalWrite(trigPin,LOW);
distance=pulseIn(echoPin, HIGH)/29/2;
Serial.print("distance: ");
Serial.print(distance);
if(distance>0 && distance<15){
backward();
if(angle>=90){
turnR();
Serial.print("turnRight");
}
else{
turnL();
Serial.print("turnLeft");
}
Serial.println();
angle=90;
delay(1000);
}if(angle==140) state=-10;
else if(angle==40) state=10;
angle+=state;
}
위 코드를 사용하면 motor2는 제대로 작동이 됩니다. 그런데 motor1이 가장 처음 forward()함수, 즉 직진하는 것부터 작동되지 않습니다. motor2는 제대로 앞으로도 가고 뒤로도 가는데요..ㅠㅠ
어느 지점이 문제인건지 잘 모르겠습니다. 보드나 핀을 아무것도 건드리지 않고 첫번째 코드를 실행시키면 motor1도 제대로 작동하는데 아래쪽 코드를 바로 업로드만 해도 작동이 되질 않습니다.
어느 지점에서 문제가 있는건지 가르쳐주시면 감사드립니다..
댓글 2
조회수 15,299master님의 댓글
master 작성일
#define motor1_EN 10
#define motor2_EN 11
PWM출력은 타이머 기능을 사용해서 출력하는 것인데요
초음파 등에서 PWM 의 타이머와 같은 타이머를 사용하게 되면 PWM출력이 안될 수 있습니다.
모터1 핀을 변경해서 돌려보세요
아두이노 우노는 타이머가 3개 있고
각각의 타이머는 핀이 2개씩 있습니다.
pasha님의 댓글
pasha 작성일해결되었습니다ㅠㅠ 감사합니다!!