아두이노 코딩 질문

ykw1101의 이미지

제가 아두이노로 대회를 나가는데.. 검은 선 밖으로 나가지 않고 장애물을 초음파센서로 탐지해 밀어내는 시합인데 이 코드에서 모자란 것이 무엇인지 궁금합니다.

int Left_motor_back=8; //좌측모터후진(IN1)
int Left_motor_go=9; //좌측모터전진(IN2)
 
int Right_motor_go=10; // 우측모터전진(IN3)
int Right_motor_back=11; // 우측모터후진(IN4)
 
int Echo = 12; // 초음파센서 Echo
int Trig = 5; // 초음파센서 Trig
 
int Front_Distance = 0;
int Left_Distance = 0;
int Right_Distance = 0;
 
int servopin=6;//서보모터핀을 2번으로 설정
int myangle;//서보모터각도
int pulsewidth;//펄스폭 설정
int val;
 
const int SensorRight = 3; //우측센서
const int SensorLeft = 4; //좌측센서
 
int SL; //좌측센서 상태
int SR; //우측센서 상태
 
 
void setup()
{
Serial.begin(9600);
//모터구동을을 위한 초기화
pinMode(Left_motor_go,OUTPUT); // PIN 8 (PWM)
pinMode(Left_motor_back,OUTPUT); // PIN 9 (PWM)
pinMode(Right_motor_go,OUTPUT);// PIN 10 (PWM) 
pinMode(Right_motor_back,OUTPUT);// PIN 11 (PWM)
 
//초음파센서 핀설정
pinMode(Echo, INPUT); // 입력설정
pinMode(Trig, OUTPUT); // 출력설정
//서보모터 핀설정
pinMode(servopin,OUTPUT);// 출력설정
 
 
pinMode(SensorRight, INPUT); //우측센서포트를 입력으로 정의
pinMode(SensorLeft, INPUT); //좌측센서포트를 입력으로 정의
 
}
 
 
void loop()
{
while(1){
 
SR = digitalRead(SensorRight); //적외선 센싱
SL = digitalRead(SensorLeft);
if (SL==HIGH || SR==HIGH) {//바닥이 검은색이면
back(3); //후진, 좀 더 업그레이드 하면 후반 센서가 감지될때까지 후진.
left(3);
brake(2); }//정지
else {
int minimumValue = Distance_test();
int finalDegree = 0;
 
for (int degree = 150 ; degree> 29 ; degree -=10) {
servopulse(6,degree);
delay(80);
int nowDistance = Distance_test();
 
if (nowDistance == 0) {
nowDistance = 200;
}
 
if (minimumValue > nowDistance) {
minimumValue = nowDistance;
finalDegree= degree;
}
}
delay(50);
Serial.println(finalDegree);
if(finalDegree>100) {
Serial.println(finalDegree);
servopulse(6,90);
left(3);//우회전
brake(1);
} else if (finalDegree<80) {
servopulse(6,90);
right(3);
brake(1);
} else {
servopulse(6,90);
run(3);
brake(1);
}
} 
 
}
}
 
 
float Distance_test() // 전방거리측정 
{
digitalWrite(Trig, LOW); // 트리거핀LOW 2μs
delayMicroseconds(2);
digitalWrite(Trig, HIGH); // 트리거핀HIGH 10μs
delayMicroseconds(10);
digitalWrite(Trig, LOW); // 트리거핀 LOW
float Fdistance = pulseIn(Echo, HIGH); // HIGH 시간 읽기 (단위:MICRO SECOND)
Fdistance= Fdistance/58; //58로나누면 CM로 변환, Y미터=(X초*344)/2
// X초=( 2*Y미터)/344 ==》X초=0.0058*Y미터 ==》CM = MICRO SECOND/58
return Fdistance;
} 
 
void servopulse(int servopin,int myangle) //서보모터를 각도만큼 회전
{
pulsewidth=(myangle*11)+500;//각도를 500-2480 사이의 펄스값으로 변환
digitalWrite(servopin,HIGH);//서보핀 HIGH
delayMicroseconds(pulsewidth);//펄스폭만큼 딜레이
digitalWrite(servopin,LOW);//서보핀 LOW
delay(20-pulsewidth/1000);//남은 딜레이
}
 
 
void front_detection() //전방 장애물 감지
{
 
for(int i=0;i<=5;i++) 
{
servopulse(servopin,90);//서보모터 PWM펄스 발생
}
Front_Distance = Distance_test();
}
 
void left_detection()
{
for(int i=0;i<=15;i++) 
{
servopulse(servopin,175);//서보모터 PWM펄스 발생
}
Left_Distance = Distance_test();
}
 
void right_detection()
{
for(int i=0;i<=15;i++) 
{
servopulse(servopin,5);//서보모터 PWM펄스 발생(우측서보패닝)
}
Right_Distance = Distance_test();
}
 
void run(int time) // 전진
{
digitalWrite(Right_motor_go,HIGH); // 우측모터전진
digitalWrite(Right_motor_back,LOW); 
analogWrite(Right_motor_go,65);//PWM값 0~255 조정,모터의 회전속도 조절.
analogWrite(Right_motor_back,0);
digitalWrite(Left_motor_go,HIGH); // 좌측모터전진
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,60);//PWM값 0~255 조정,모터의 회전속도 조절.
analogWrite(Left_motor_back,0);
delay(time * 100); //딜레이 
}
 
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);//딜레이 
}
 
void left(int time) //좌회전(좌측정지,우측직진)
{
digitalWrite(Right_motor_go,HIGH); // 우측모터전진
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,200); 
analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
digitalWrite(Left_motor_go,LOW); //좌측모터정지
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,0); 
analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
delay(time * 100); //딜레이 
}
 
void right(int time) //우회전(우측정지, 좌측직진)
{
digitalWrite(Right_motor_go,LOW); //우측모터정지
digitalWrite(Right_motor_back,LOW);
analogWrite(Right_motor_go,0); 
analogWrite(Right_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
digitalWrite(Left_motor_go,HIGH);//좌측모터전진
digitalWrite(Left_motor_back,LOW);
analogWrite(Left_motor_go,200); 
analogWrite(Left_motor_back,0);//PWM값 0~255 조정,모터의 회전속도 조절.
delay(time * 100); //딜레이 
}
 
void back(int time) //후진
{
digitalWrite(Right_motor_go,LOW); //우측모터후진
digitalWrite(Right_motor_back,HIGH);
analogWrite(Right_motor_go,0);
analogWrite(Right_motor_back,200);//PWM값 0~255 조정,모터의 회전속도 조절.
digitalWrite(Left_motor_go,LOW); //좌측모터후진
digitalWrite(Left_motor_back,HIGH);
analogWrite(Left_motor_go,0);
analogWrite(Left_motor_back,200);//PWM값 0~255 조정,모터의 회전속도 조절.
delay(time * 100); //딜레이 
}

긴 코드 죄송합니다.. 하지만 한번 봐주시면 감사하겠습니다.
세벌의 이미지

indentation 이 전혀 없군요. maintenance 는 어찌 하시려고...

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.