BASIC4MCU | 질문게시판 | 아두이노 간단 자율주행
페이지 정보
작성자 뚤밥 작성일2021-06-17 02:18 조회10,645회 댓글1건본문
우선 제가 만드는것은 초음파 센서를 이용하여 방안을 돌아다니며 간식을 떨어뜨려주면서 삑 소리가 나는 바퀴 2개를 이용한 자동차입니다. 그리고 슬라이드 스위치를 이용하여 high일때는 원래 루프문 그리고 low 일때는 인터럽트를 사용하여 블루투스로 조종하는 rc 카로 기능하도록 코딩을 해보았는데요 메인 루프문은 잘돌아갑니다
제가 궁금한것은
스위치를 내려서 pull up 회로를 low 로 만들어주면 인터럽트 문으로 가긴 하는것같은데 여기서 블루투스값이 안읽혀지는지
아니면 모터동작을하고 딜레이가 없어서 그냥 스위치문을 나가버려서 그런지 아무리 값을 입력해도 작동을 하지 않습니다.
#include <Servo.h>
#include <SoftwareSerial.h>
Servo myservo; //서보모터 객체 생성
Servo feedservo;
int interruptPin=2;
int btRxPin = 11;//3 11해야할듯
int btTxPin = 3;
SoftwareSerial bluetoothSerial(btRxPin, btTxPin); //rx에 블루투스 tx tx에 블루투스 rx
int speaker = 4;
int echoPin = 12; //echo는 입력
int trigPin = 13; // trig는 출력
int B_1A=5;//왼쪽바퀴
int B_1B=6;
int A_1A=9;// 오른쪽
int A_1B=10;
float duration;
float distance;
int way=0; //방향
int feed =1;
int count;
volatile char cmd; // 인터럽트 내부에서 사용하는 블루투스 read값
void setup()
{ pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin),move,LOW); //상승 하강 로우 변화 있는데 스위치 ON 하면 계속 인터럽트 사용하려고 풀업 회로만들고 LOW로 사용
feedservo.attach(8); // feed서보
myservo.attach(7); //초음파 서보
pinMode(trigPin, OUTPUT); //초음파
pinMode(echoPin, INPUT); //초음파
pinMode(5, OUTPUT); // 5번핀을 출력모드로 설정합니다.모터
pinMode(6, OUTPUT); // 6번핀을 출력모드로 설정합니다.모터
pinMode(9, OUTPUT); // 10번핀을 출력모드로 설정합니다.모터
pinMode(10, OUTPUT); // 11번핀을 출력모드로 설정합니다.모터
Serial.begin(9600);
bluetoothSerial.begin(9600);
Serial.println("welcome");
}
void loop(){
float u_distance=Ultrasonic();
Serial.println(u_distance);
forward();
if(u_distance<25){
stopp();
way=servo_way();
if(way==1){
Serial.print("좌회전");
left();
delay(700);
}
else if(way==0){
Serial.print("우회전");
right();
delay(700);
}
}
}
void forward() {
//모터A 정회전
digitalWrite(A_1A,HIGH);
digitalWrite(A_1B, 0);
//모터B 정회전
digitalWrite(B_1A, HIGH);
digitalWrite(B_1B, 0);
}
void back() {
//모터A 역회전
digitalWrite(A_1A, 0);
digitalWrite(A_1B, HIGH);
//모터B 역회전
digitalWrite(B_1A, 0);
digitalWrite(B_1B, HIGH);
}
void right() {
//모터A 정회전
digitalWrite(A_1A, 0);
digitalWrite(A_1B, 0);
//모터B 역회전
digitalWrite(B_1A, HIGH);
digitalWrite(B_1B, 0);
}
void left() {
//모터A 역회전
digitalWrite(A_1A, HIGH);
digitalWrite(A_1B, 0);
//모터B 정회전
digitalWrite(B_1A, 0);
digitalWrite(B_1B, 0);
}
void stopp() {
//모터A 정지
digitalWrite(A_1A, 0);
digitalWrite(A_1B, 0);
//모터B 정지
digitalWrite(B_1A, 0);
digitalWrite(B_1B, 0);
}
float Ultrasonic(){
digitalWrite(trigPin, HIGH);
delay(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH); // echoPin 이 HIGH를 유지한 시간을 저장
distance = ((float)(340 * duration) / 10000) / 2; // 거리 계산
return distance;
}
int servo_way(){
myservo.write(150);//왼쪽
delay(800);
int ult_150=Ultrasonic();
delay(800);
myservo.write(30);
delay(800);
int ult_30=Ultrasonic();
Serial.print(ult_150);
Serial.print(","); //여러값 플로팅
Serial.println(ult_30);
if(ult_150>=ult_30){
way=1;
}
else{
way=0;}
myservo.write(90);
return way;
}
int servo_feed(){
feedservo.write(0);
tone(speaker,330,250);
feedservo.write(90);
delay(300);
myservo.write(0);
}
void delay_(int ms){
while(count!=ms){
delayMicroseconds(1000);
count++;}
count=0;
}// 인터럽트 내부에서 딜레이 함수 쓰려고 구현
void move(){
if (bluetoothSerial.available()) { // 블루투스 통신에 데이터가 입력되면(스마트폰 -> 아두이노)
Serial.write(bluetoothSerial.read()); // 블루투스 통신에 입력된 데이터를 시리얼 모니터로 출력(스마트폰 -> 아두이노 -> PC)
}
cmd = bluetoothSerial.read();
switch (cmd) {
case 'f':
//모터A 정회전
digitalWrite(A_1A,HIGH);
digitalWrite(A_1B, 0);
//모터B 정회전
digitalWrite(B_1A, HIGH);
digitalWrite(B_1B, 0);
delay_(800);
break;
case 'b':
//모터A 역회전
digitalWrite(A_1A, 0);
digitalWrite(A_1B, HIGH);
//모터B 역회전
digitalWrite(B_1A, 0);
digitalWrite(B_1B, HIGH);
delay_(800);
break;
case 'r':
//모터A 정회전
digitalWrite(A_1A, 0);
digitalWrite(A_1B, 0);
//모터B 역회전
digitalWrite(B_1A, HIGH);
digitalWrite(B_1B, 0);
delay_(800);
break;
case 'l':
//모터A 역회전
digitalWrite(A_1A, HIGH);
digitalWrite(A_1B, 0);
//모터B 정회전
digitalWrite(B_1A, 0);
digitalWrite(B_1B, 0);
delay_(800);
break;
case 's':
//모터A 정지
digitalWrite(A_1A, 0);
digitalWrite(A_1B, 0);
//모터B 정지
digitalWrite(B_1A, 0);
digitalWrite(B_1B, 0);
delay_(800);
break;
case'e':
feedservo.write(0);
tone(speaker,330,250);
feedservo.write(90);
delay_(300);
myservo.write(0);
delay_(800);
break;
}}
댓글 1
조회수 10,645master님의 댓글
master 작성일
#include <SoftwareSerial.h>
int btRxPin=11; //3 11해야할듯
int btTxPin=3;
SoftwareSerial bluetoothSerial(btRxPin,btTxPin); //rx에 블루투스 tx tx에 블루투스 rx
//
#include <Servo.h>
Servo myservo; //서보모터 객체 생성
Servo feedservo;
//
int interruptPin=2;
int speaker=4;
int echoPin=12; //echo는 입력
int trigPin=13; // trig는 출력
int B_1A=5; //왼쪽바퀴
int B_1B=6;
int A_1A=9; // 오른쪽
int A_1B=10;
//
float duration,distance;
int way=0,feed=1,count;
volatile char cmd; // 인터럽트 내부에서 사용하는 블루투스 read값
//
void setup(){
pinMode(interruptPin,INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin),move,FALLING);
feedservo.attach(8); // feed서보
myservo.attach(7); //초음파 서보
pinMode(trigPin,OUTPUT); //초음파
pinMode(echoPin,INPUT); //초음파
pinMode(5,OUTPUT); // 5번핀을 출력모드로 설정합니다.모터
pinMode(6,OUTPUT); // 6번핀을 출력모드로 설정합니다.모터
pinMode(9,OUTPUT); // 10번핀을 출력모드로 설정합니다.모터
pinMode(10,OUTPUT); // 11번핀을 출력모드로 설정합니다.모터
Serial.begin(9600);
bluetoothSerial.begin(9600);
Serial.println("welcome");
}
//
void forward(){ digitalWrite(A_1A,1); digitalWrite(A_1B,0); digitalWrite(B_1A,1); digitalWrite(B_1B,0); }
void back() { digitalWrite(A_1A,0); digitalWrite(A_1B,1); digitalWrite(B_1A,0); digitalWrite(B_1B,1); }
void right() { digitalWrite(A_1A,0); digitalWrite(A_1B,1); digitalWrite(B_1A,1); digitalWrite(B_1B,0); }
void left() { digitalWrite(A_1A,1); digitalWrite(A_1B,0); digitalWrite(B_1A,0); digitalWrite(B_1B,1); }
void stopp() { digitalWrite(A_1A,0); digitalWrite(A_1B,0); digitalWrite(B_1A,0); digitalWrite(B_1B,0); }
//
float Ultrasonic(){
digitalWrite(trigPin,1); delayMicroseconds(10); digitalWrite(trigPin,0);
duration=pulseIn(echoPin,1);
distance=((float)(340*duration)/10000)/2;
return distance;
}
//
int servo_way(){
myservo.write(150); delay(800); //왼쪽
int ult_150=Ultrasonic(); delay(800);
myservo.write(30); delay(800);
int ult_30=Ultrasonic(); Serial.print(ult_150); Serial.print(","); Serial.println(ult_30);
if(ult_150>=ult_30)way=1; else way=0;
myservo.write(90);
return way;
}
//
int servo_feed(){
feedservo.write(0); tone(speaker,330,250); feedservo.write(90); delay(300); myservo.write(0);
}
//
void move(){ cmd='a': } // 자동모드
//
void loop(){
if(bluetoothSerial.available()){ cmd=bluetoothSerial.read(); Serial.write(cmd); }
//
if(cmd=='a'){ // 자동모드
float u_distance=Ultrasonic();
Serial.println(u_distance);
forward();
if(u_distance<25){
stopp();
way=servo_way();
if(way==1){ Serial.print("좌회전"); left(); delay(700); }
else if(way==0){ Serial.print("우회전"); right(); delay(700); }
}
}
//--------------------------------------수동모드
else if(cmd=='f'){ forward(); delay_(800); }
else if(cmd=='b'){ back(); delay_(800); }
else if(cmd=='r'){ right(); delay_(800); }
else if(cmd=='l'){ left(); delay_(800); }
else if(cmd=='s'){ stopp(); delay_(800); }
else if(cmd=='e'){
feedservo.write( 0); tone(speaker,330,250);
feedservo.write(90); delay(300);
myservo.write( 0); delay(800);
}
}