BASIC4MCU | 질문게시판 | 아두이노 rc카 소스코드중 이해 안가는 부분이 있어서 도움 부탁드립니다.
페이지 정보
작성자 쿤싼 작성일2019-11-01 15:34 조회3,840회 댓글0건본문
#include <LiquidCrystal.h>
LiquidCrystal lcd(3,4,7,8,11,12,13);
int Echo = A5; //Echo A5번핀에 지정
int Trig =A4; //Tirg A4번핀에 지정
int Front_Distance = 0; // 전방 거리 Front_Distance함수를 0으로 설정
int Left_Distance = 0; // 좌측 거리 Left_Distance함수를 0으로 설정
int Right_Distance = 0; // 우측 거리 Right_Distance함수를 0으로 설정
int Left_motor_back=9; // 왼쪽 모터 후방주행 9번핀에 지정
int Left_motor_go=5; // 왼쪽 모터 전방주행 5번핀에 지정
int Right_motor_go=6; // 오른쪽 모터 전방주행 6번핀에 지정
int Right_motor_back=10; // 오른쪽 모터 후방주행 10번핀에 지정
int key=A0; // key(스위치) A1번핀에 지정
int beep=A1; // Beep(부저) A1번핀에 지정
int servopin=2; // 서보모터 2번핀에 지정
int myangle; // myangle 정수?로 설정
int pulsewidth; // pulsewidth 정수?로 설정
int val; // val 정수?로 설정
void setup()
{
Serial.begin(9600);
pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM) Left_motor_go 출력으로 지정
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM) Left_motor_back 출력으로 지정
pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM) Right_motor_go 출력으로 지정
pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM) Right_motor_back 출력으로 지정
pinMode(key,INPUT);
pinMode(beep,OUTPUT);
pinMode(Echo, INPUT);
pinMode(Trig, OUTPUT);
lcd.begin(16,2);
pinMode(servopin,OUTPUT);
}
void run() //자동차가 달릴때 설정
{
digitalWrite(Right_motor_go,HIGH); // 오른쪽 전진모터 켬
digitalWrite(Right_motor_back,LOW); // 오른쪽 후진모터 끔
analogWrite(Right_motor_go,235); // 오른쪽 바퀴를 힘을 줄여 균형을 맞춤 255:220
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,HIGH); // 왼쪽 전진 모터 켬
digitalWrite(Left_motor_back,LOW); // 왼쪽 전진 모터 끔
analogWrite(Left_motor_go,255); // 왼쪽이 힘이 약함
analogWrite(Left_motor_back,0);
}
void brake(int time) //자동차 멈출때 설정
{
digitalWrite(Right_motor_go,LOW);// 오른쪽 전진 모터 끔
digitalWrite(Right_motor_back,LOW);//오른쪽 후진모터 끔
digitalWrite(Left_motor_go,LOW);// 왼쪽 전진 모터 끔
digitalWrite(Left_motor_back,LOW);// 왼쪽 후진 모터 끔
delay(time * 100); // 딜레이 = 시간*0.1초
}
void left(int time) // 자동차 좌회전
{
digitalWrite(Right_motor_go,HIGH); //오른쪽 전진 모터 on
digitalWrite(Right_motor_back,LOW);// 오른쪽 후진 모터 off
analogWrite(Right_motor_go,255);
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,LOW); // 왼쪽 전진 모터 off
digitalWrite(Left_motor_back,LOW);// 왼쪽 후진모터 off
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,0);
delay(time * 100);//딜레이 = 시간*0.1초
}
void spin_left(int time) //자동차 스핀 왼쪽
{
digitalWrite(Right_motor_go,HIGH);//오른쪽 전진 모터 on
digitalWrite(Right_motor_back,LOW);// 오른쪽 후진모터 off
analogWrite(Right_motor_go,255);
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,LOW); // 왼쪽 전진모터 off
digitalWrite(Left_motor_back,HIGH);// 왼쪽 후진모터 on
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,255);
delay(time * 100);//딜레이 = 시간*0.1초
}
void right(int time) //자동차 우회전
{
digitalWrite(Right_motor_go,LOW); //오른쪽 전진 모터 off
digitalWrite(Right_motor_back,LOW);//오른쪽 후진모터 off
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,HIGH);// 왼쪽 전진 모터 on
digitalWrite(Left_motor_back,LOW);// 왼쪽 후진 모터 off
analogWrite(Left_motor_go,255);
analogWrite(Left_motor_back,0);
delay(time * 100);//딜레이 = 시간*0.1초
}
void spin_right(int time)//자동차 스핀 우회전
{
digitalWrite(Right_motor_go,LOW);//오른쪽 전진 모터 off
digitalWrite(Right_motor_back,HIGH);//오른쪽 후진 모터 on
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,255);
digitalWrite(Left_motor_go,HIGH);//왼쪽 전진 모터 ON
digitalWrite(Left_motor_back,LOW);//왼쪽 후진 모터 OFF
analogWrite(Left_motor_go,255);
analogWrite(Left_motor_back,0);
delay(time * 100); //딜레이 = 시간*0.1초
}
void back(int time)// 자동차 후진
{
digitalWrite(Right_motor_go,LOW);;//오른쪽 전진 모터 OFF
digitalWrite(Right_motor_back,HIGH);//오른쪽 후진모터 ON
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,255);
digitalWrite(Left_motor_go,LOW);//왼쪽 전진 모터 ON
digitalWrite(Left_motor_back,HIGH);//왼쪽 후진 모터 OFF
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,255);
delay(time * 100); //딜레이 = 시간*0.1초
}
void keysacn()
{
int val;
val=digitalRead(key);
while(!digitalRead(key))
{
val=digitalRead(key);
}
while(digitalRead(key))
{
delay(10);
val=digitalRead(key);
if(val==HIGH)
{
digitalWrite(beep,HIGH);
while(!digitalRead(key))
digitalWrite(beep,LOW);
}
else
digitalWrite(beep,LOW);
}
}
float Distance_test() //거리 테스트
{
digitalWrite(Trig, LOW); //Trig off
delayMicroseconds(2); //2초
digitalWrite(Trig, HIGH);//Trig on
delayMicroseconds(10); //10초
digitalWrite(Trig, LOW); //Trig off
float Fdistance = pulseIn(Echo, HIGH); //Echo on
Fdistance= Fdistance/58;
return Fdistance;
}
void Distance_display(int Distance) //거리 표시
{
if((2<Distance)&(Distance<400)) //IF문 (2<거리<400)
{
lcd.home();
lcd.print(" Distance: "); //LCD에 거리표시
lcd.setCursor(6,2);
lcd.print(Distance);
lcd.print("cm"); //cm 표시
}
else //else문 if문 그외 거리
{
lcd.home();
lcd.print("!!! Out of range"); //out of range 표시
}
delay(250); //딜레이 0.25초
lcd.clear();
}
void servopulse(int servopin,int myangle) //서브모터 설정
{
pulsewidth=(myangle*11)+500; //플러스 스위치 = (myamgle*11)+500
digitalWrite(servopin,HIGH); //서브핀 on
delayMicroseconds(pulsewidth);//딜레이 = 플러스 스위치만큼
digitalWrite(servopin,LOW); //서브핀 off
delay(20-pulsewidth/1000); //딜레이 = (20-플러스스위치)/1000
}
void front_detection() //앞쪽 장애물 감지
{
for(int i=0;i<=5;i++)
{
servopulse(servopin,90); //서보 90도 회전
}
Front_Distance = Distance_test();
}
void left_detection() //왼쪽 장애물 감지
{
for(int i=0;i<=15;i++)
{
servopulse(servopin,165);//서보 175도 회전
}
Left_Distance = Distance_test();//
//Serial.print("Left_Distance:");
//Serial.println(Left_Distance);
}
void right_detection()
{
for(int i=0;i<=15;i++)
{
servopulse(servopin,15);
}
Right_Distance = Distance_test();
}
void loop()
{
keysacn();
while(1)
{
front_detection();
if(Front_Distance < 20)
{
back(2);
brake(2);
left_detection();
Distance_display(Left_Distance);
right_detection();
Distance_display(Right_Distance);
if((Left_Distance < 20 ) &&( Right_Distance < 20 ))
spin_left(0.7);
else if(Left_Distance > Right_Distance)
{
left(10);
brake(1);
}
else
{
right(10);
brake(1);
}
}
else
{
run();
}
}
}
빨간 단락 부분이 어떤 명령을 하는 단락인지 해석이 어려워서 질문 드립니다.
그외에 해석이 잘못된 부분이 있으면 지적 부탁드립니다.
많이 배워가고 싶습니다!!!
댓글 0
조회수 3,840등록된 댓글이 없습니다.