?>

Hard Copy World

HCW

Q&A

Home > Forum >

Q&A

블루투스를 이용한 아두이노 사용에 대한 질문입니다.

페이지 정보

작성자 신지 쪽지보내기 메일보내기 자기소개 아이디로 검색 전체게시물 작성일16-05-31 16:35 조회855회 댓글1건

본문

초음파 센서를 이용해 거리를 지속적으로 측정하면서 'R'이나'L'의 신호가 오면 거리 정보는 지속해서 바꾸면서 LED신호를 바꾸려고 하는데 'R'이나'L'의 신호를 보내면 거리정보가 0~3중에 랜덤으로만 받아지게 됩니다. 초음파센서를 LED조작에 상관없이 항상 작동하게 할 수 있는 방법이 없을까 궁금해서 문의 드립니다. Thread 함수도 써보았고 multitasking 도 사용해 보았는데 거리센서에서 자꾸 오류가 발생합니다.

아래는 제가 작성한 코드입니다.


#include <SoftwareSerial.h>
  #include <LedControl.h>

LedControl lc=LedControl(12,11,10,3); 

int button =  9 ;

byte R[]=
{
  B00011000,
  B00111100,
  B01100110,
  B11011011,
  B10111101,
  B01100110,
  B11000011,
  B10000001
  };

 byte L[]=
 {
  B10000001,
  B11000011,
  B01100110,
 B10111101,
  B11011011,
  B01100110,
 B00111100,
  B00011000
 };
  
  byte B[]=
  {
  B11111111,
  B11111111,
  B11111111,
  B11111111,
  B11111111,
  B11111111,
  B11111111,
  B11111111
  };
 
  SoftwareSerial BTSerial(8, 7); // SoftwareSerial(tX, rX)
  byte buffer[1024]; // 데이터를 수신 받을 버퍼
  int bufferPosition; // 버퍼에 데이타를 저장할 때 기록할 위치
 
void setup(){
  BTSerial.begin(9600); 
  Serial.begin(9600); 
  
pinMode(2,OUTPUT);  // 센서 Trig 핀
  pinMode(3,INPUT);   // 센서 Echo 핀

  bufferPosition = 0; // 버퍼 위치 초기화
  lc.shutdown(0,false); 
  lc.setIntensity(0,8);    
  lc.clearDisplay(0);    
  lc.shutdown(1,false); 
  lc.setIntensity(1,8);    
  lc.clearDisplay(1);
  lc.shutdown(2,false); 
  lc.setIntensity(2,8);    
  lc.clearDisplay(2); 
  pinMode(button,INPUT);    
}

void l()
{  for (int i = 0; i < 8; i++)  
{
    lc.setRow(0,i,L[i]);
    lc.setRow(1,i,L[i]);
    lc.setRow(2,i,L[i]);
  }
}

void r()
{  for (int i = 0; i < 8; i++)  
{
    lc.setRow(0,i,R[i]);
    lc.setRow(1,i,R[i]);
    lc.setRow(2,i,R[i]);
  }
}        

void b()
{  for (int i = 0; i < 8; i++)  
{
    lc.setRow(0,i,B[i]);
    lc.setRow(1,i,B[i]);
    lc.setRow(2,i,B[i]);
  }
}

void c()
{  for (int i = 0; i < 8; i++)  
{
   lc.clearDisplay(0);  
   lc.clearDisplay(1);  
   lc.clearDisplay(2);  
  }
}     

void loop(){
long duration, cm;

  digitalWrite(2,HIGH);  // 센서에 Trig 신호 입력
  delayMicroseconds(10); // 10us 정도 유지
  digitalWrite(2,LOW);   // Trig 신호 off

  duration = pulseIn(3,HIGH); // Echo pin: HIGH->Low 간격을 측정
  cm = microsecondsToCentimeters(duration);
  
  Serial.print(cm);
  Serial.print("cm");
  Serial.println();
  if (Serial.available()) {
    BTSerial.print(cm);
  }
  
  delay(1000);  // 0.3초 대기 후 다시 측정
  

  if (BTSerial.available()){ // 블루투스로 데이터 수신
    byte data = BTSerial.read(); // 수신 받은 데이터 저장
    Serial.write(data); // 수신된 데이터 시리얼 모니터로 출력
    buffer[bufferPosition++] = data; // 수신 받은 데이터를 버퍼에 저장
  if(data=='R')
    {
      r();
    }
    else if(data=='L')
    {
      l();
      } 
      else if(data=='B')
      {
        b();
        }
        else if(data=='O')
        {
        
          }
    if(data=='\n'){ // 문자열 종료 표시
    
      buffer[bufferPosition] = '\0';
    } 
  }
}


long microsecondsToInches(long microseconds)
{
  // According to Parallax's datasheet for the PING))), there are
  // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per
  // second).  This gives the distance travelled by the ping, outbound
  // and return, so we divide by 2 to get the distance of the obstacle.
  // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf
  return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds)
{
  // The speed of sound is 340 m/s or 29 microseconds per centimeter.
  // The ping travels out and back, so to find the distance of the
  // object we take half of the distance travelled.
  return microseconds / 29 / 2;
}

댓글목록

최고관리자님의 댓글

최고관리자 쪽지보내기 메일보내기 홈페이지 자기소개 아이디로 검색 전체게시물 작성일

loop() 함수 안에서 delay() 함수를 쓰지 마세요. delay() 함수로 지연이되면 loop() 안에서 BTSerial 데이터 읽어와서 처리하는 부분이 지연이 되버립니다. 지연이 필요한 부분은 millis() 함수 이용해서 시간을 체크해서 실행 하세요.
http://www.hardcopyworld.com/gnuboard5/bbs/board.php?bo_table=lecture_begin&wr_id=18