자작 소스코드로 마무리를 하겠다.
적외선 감지, Arduino에서의 스레드효과 구현(Arduino에는 스레드가 존재하지 않는다고 알고 있다.)
등등의 여러가지 생각을 조합한 소스코드이다.
필자또한 실력자가 아님을 죄송스럽게 생각한다. 하지만 필자의 생각이 담긴 코드이므로 한번쯤은 볼만 할 것이다.
필자의 스레드 코드를 설명하겠다.
현재 Arduino 오픈소스로써 많은 스레드 구현 코드가 존재한다.
하지만 음악이 연주되면서 서보모터를 이용하여 자동차 운전을 하는것은 현재 불가능 한 것으로 알고있다.
이로인해 millis()함수를 이용하였는데, 이 함수는 프로그램이 켜진후 부터 시간을 측정해 주는 함수이다.
여기 코드에서 알 수 있는 것은, millis() % 500 == 0 이라 함은 매번 0.5초마다 라는 것을 의미한다.
즉 이 코드에서 매번 0.5초마다 0.4초동안 음을 낸다는 것이다.
처음에는 음악을 삽입하였는데, Arduino의 단점이 프로그램소스코드가 한바퀴 도는 것이
0.5초가 넘게 되어서 millis함수를 써도 똑같은 박자대로 진행이 안된다는 것이다.
따라서 이 소스코드는 그냥 주행을 하면서 음이 나온다는 것에 초점을 둔 것이다.
#include <Servo.h> // Include servo library
int BuzzerPin = 10; // 피에조의 핀번호를 설정한다.
// 따로 설명하지 않겠다. piezo내용을 참조.
char noteNames[] = {'C','D','E','F','G','a','b','c','d'};
int frequency[] = {1047,1174,1319,1397,1568,1760,1976,2093,2349};
byte noteCount = sizeof(noteNames);
char score[] = "C D E F G ";
byte scoreLen = sizeof(score);
int i = 0;
Servo servoLeft; // Declare left servo
Servo servoRight;
int rightled = 9; // 오른쪽 led 설정
int leftled = 11; // 왼쪽 led 설정
void setup()
{
pinMode(leftled,OUTPUT);
pinMode(rightled,OUTPUT);
pinMode(2, INPUT); pinMode(3, INPUT); // 적외선 핀코드이다. 2,3,4는 적외선을 받아들이는 핀번호이다.
pinMode(4, INPUT); pinMode(6,OUTPUT); // 6,7,8은 적외선을 쏘는 핀번호이다.
pinMode(8,OUTPUT);pinMode(7,OUTPUT);
servoLeft.attach(12); // 필자는 저번 내용에서는 Left를 13으로 Right를 12로 했는데
servoRight.attach(13); // 지금은 Left가 12 , Right가 13임을 알아야 한다.
tone(BuzzerPin,frequency[0],500); // 출발 신호음을 제작하였다.
delay(1000);
tone(BuzzerPin,frequency[0],500);
delay(1000);
tone(BuzzerPin,frequency[0],500);
delay(1000);
tone(BuzzerPin,frequency[7],800);
delay(1000);
}
void loop() {
if(millis() % 500 ==0) // 자동차 진행과 동시에 음이 흘러나오도록 만들었다. millis 함수이다.
{
if(i < scoreLen )
{
int duration2 = 400; // 박자는 0.4초로 고정시켰다.
playNote(score[i], duration2);
i++;
}
else if(i >= scoreLen)
{
i = 0;
}
}
// 아날로그 신호가 아닌 디지털 신호로 소스코드를 제작하였다.
// 디지털 값은 0이면 라인이 존재, 1이면 라인이 존재하지 않는 것이다.
int Rightsensor = digitalRead(2); // 오른쪽 센서에서 적외선 디지털 값을 읽는다.
int Centersensor = digitalRead(3); // 중앙 센서에서 적외선 디지털 값을 읽는다.
int Leftsensor = digitalRead(4); // 왼쪽 센서에서 적외선 디지털 값을 읽는다.
if((Leftsensor==1)&&(Centersensor==0)&&(Rightsensor==0)) // 오른쪽으로 라인이 존재할때
{
servoLeft.writeMicroseconds(1200);
servoRight.writeMicroseconds(1500);
digitalWrite(leftled,LOW);
digitalWrite(rightled,HIGH);
}
else if((Leftsensor==0)&&(Centersensor==0)&&(Rightsensor==1)) // 왼쪽으로 라인이 존재할때
{
servoRight.writeMicroseconds(1800);
servoLeft.writeMicroseconds(1500);
digitalWrite(leftled,HIGH);
digitalWrite(rightled,LOW);
}
else if((Leftsensor==0)&&(Centersensor==0)&&(Rightsensor==0)) // 교차로 라인이 존재할때 ( 직진 처리 )
{ // 즉, 십자가 모양으로 라인이 존재할 때는 계속 가던 방향으로 가도록 한 것이다.
servoRight.writeMicroseconds(1700);
servoLeft.writeMicroseconds(1300);
digitalWrite(leftled,HIGH);
digitalWrite(rightled,HIGH);;
}
/*
else if((Leftsensor==1)&&(Centersensor==1)&&(Rightsensor==1)) // 라인이 존재하지 않을때 ( 정지 )
{ // 이 코드를 디지털을 이용하여 첨가하면 끊김현상이 잦아서 아날로그를 사용할때 이 코드를 이용하자. 현재는 주석처리.
servoRight.writeMicroseconds(1500);
servoLeft.writeMicroseconds(1500);
ledstate(left_off_and_right_off);
} */
else if((Leftsensor==1)&&(Centersensor==0)&&(Rightsensor==1)) // 직진 라인
{
servoRight.writeMicroseconds(1700);
servoLeft.writeMicroseconds(1300);
digitalWrite(leftled,HIGH);
digitalWrite(rightled,HIGH);
}
else if((Leftsensor==1)&&(Centersensor==1)&&(Rightsensor==0)) // 우회전 라인
{
servoLeft.writeMicroseconds(1200);
servoRight.writeMicroseconds(1500);
digitalWrite(leftled,LOW);
digitalWrite(rightled,HIGH);
}
else if((Leftsensor==0)&&(Centersensor==1)&&(Rightsensor==1)) // 좌회전 라인
{
servoRight.writeMicroseconds(1800);
servoLeft.writeMicroseconds(1500);
digitalWrite(leftled,HIGH);
digitalWrite(rightled,LOW);
}
}
void playNote(char note, int duration)
{
for (int i=0 ; i<noteCount ; i++)
{
if (noteNames[i] == note)
tone(BuzzerPin, frequency[i], duration);
}
}
Arduino의 라인트레이서 까지 기본 내용들을 너무 허전하게, 너무 서툴게 끝낸 감이 있다.
Arduino를 처음 접하시는분은 조금 이 내용들이 생소 할 수도 있지만,
공부하고 있었던 분들에게는 도움이 되리라 조심스럽게 생각해 본다.
'Applied > Arduino' 카테고리의 다른 글
ServoMotor (0) | 2014.02.15 |
---|---|
Piezo (0) | 2014.01.15 |
Push Button (0) | 2014.01.15 |
LED fading (0) | 2014.01.15 |
LED Blink ( on / off ) (0) | 2014.01.15 |