×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 2,101,837명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)
busyhuman: 5000원(유용한 지식 감사합니다.)
익명 : 5000원(알고리즘 학습러)
반응형

자작 소스코드로 마무리를 하겠다.

 

적외선 감지, 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' 카테고리의 다른 글

line tracing with sensor moudule ( 라인트레이서 )  (0) 2014.02.15
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