정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

uart 통신 동작이 안되는 오류 ㅜㅜ
이아름 | 2015-05-21

코드 짜는것은

질문방에 도움을 얻어 잘 해결하였는데요

이번에는 동작이 오류네요

제대로 공부해서 아는게 아니라 야매로 과제를 하려니 어려움을 많이 겪는데

이렇게 뭐가 문제인지 도통 알길이 없는 오류는 해결하기가 참 힘이 듭니다 .............................다들 그러시죠?

 

자동차 속도계를 아두이노로 구현하고 있구요 속도에 따라서 rgb led가 다른색을 내는 시스템입니다

오렌지 보드 2개를 사용해서 uart통신을 사용중이구요

첫번째 오렌지보드에서 리드스위치를 사용해 속도를 만들어주고

그 속도를 두번째 오렌지 보드에 옮겨서 속도를 판단해서 rgb led가 어떤색으로 켜질지 선택하고 계기판 서브모터 각도를 제어합니다.

리드스위치로 속도를 만들고 lcd에 표시하는것은 프로젝트 메뉴에 있는 프로젝트 코드를 참고 했습니다.

 

지금 uart 통신이 되는거를 시리얼모터로 확인 되구요

정확히 속도 값을 주고 받고 있습니다 !

그런데 통신을 하기위해 RX, TX 선이 연결되면 RGB에 불이 들어오지 않아요 그전에는 초록색으로 깜빡이거든요

그치만 SERIAL MONITOR에서는 속도를 통신하는걸 확인할수있구요

업로딩도 잘되고 오류가 뜨지 않으니까

회로오륜가 싶은데 또 출력단자 이런걸 틀리진 않았어요 ㅜㅜ 함수내에서 문제일까요.. ㅜ??? 도움을 얻고 싶습니다. .ㅜ

//송신부 함수입니다. 송신부에는 LCD와 리드스위치가 연결되있습니다 속도를 계산하기위한 코드와 LCD코드가 있습니다


#include 

float radius = 500; // 바퀴당 이동 거리를 확인 하기 위해 자전거 바퀴의 반지름을 입력해 줍니다.(Cm 단위)
float circle = (2 * radius * 3.14) / 100;  //  바퀴의 둘레를 계산(단위를 m로 바꿔주기 위해 100을 나눕니다.)

float bySpeed = 0; // 자동차속도
float ckTime = 0;  // 리드스위치가 
float uckTime = 0; // Unckecked
float cycleTime = 0;  // 리드스위치가 인식이 안됬을 시간 부터 인식됬을 때까지의 시간
float distance = 0; //  누적 이동 거리
float lcdDis = 0; //  이동 거리를 LCD출력에 맞게 바꿔즌 값.(단위 수정 or 소숫점 제거)

int count = 0;  // 리드스위치의 노이즈를 제거하기 위해 카운트를 넣어줍니다.
boolean temp = 0;  // 리드 스위치가 닫혔는지 확인하는 변수
int sensor = A0;

LiquidCrystal lcd(3, 4, 10, 11, 12, 13);   //RS 핀, E핀, 데이터 핀 4개

void setup(){
 Serial.begin(9600);
 Serial.println("ho");   
  lcd.begin(16,2); // LCD 크기 지정, 2줄 16칸
  lcd.clear();     // 화면 초기화
}

void loop(){
  int sensorVal = bySpeed; //뒤에서 리드스위치가 계산 한 속도가 bySpeed로 저장되는데 이값을 전송합니다.
Serial.println(sensorVal);
  
  boolean check = digitalRead(A0); // 리드스위치의 상태를 확인합니다.
  
  if(check == 1 && temp == 0){  // 리드 스위치가 열릴 때(닫힘 -> 열림)
    ckTime = millis();  // 시간을 확인해서 저장합니다.
    temp = 1;  // temp값을 1로 바꿔줍니다.(리드스위치가 열려있는 상태값 저장)
  }
  
  else if(check == 0 && temp == 1 && count > 5){  // 리드 스위치가 닫히고(열림 -> 닫힘), 노이즈 방지 카운트가 5이상일때
    uckTime = millis();  // 시간을 확인해서 저장합니다.
      
    cycleTime = (uckTime - ckTime) / 1000;
    // 열릴 때 시각과 닫힐 때 시각의 차를 이용하여 바퀴가 한바퀴 돌때 걸린 시간을 계산합니다.
    bySpeed = (circle / cycleTime) * 3.6; // 바퀴가 한바퀴 돌때의 거리와 시간을 가지고 속도를 구해줍니다.(단위는 Km/h입니다.)
    temp = 0; 
    count = 0; 
    distance += circle;  // 한바퀴 돌았으면 이동거리를 누적 이동거리에 더해줍니다.
  }
  
  if(check == 1){  // 리드 스위치가 열려있으면 카운트를 1씩 증가 시켜 줍니다.
    count++;
    if(count > 150){ // 카운트가 150이 넘어가면(자전거가 멈췄을 때) 속도를 0으로 바꿔줍니다.
      bySpeed = 0;
    }
  }
  
  if(digitalRead(A1) == 0){  // 버튼을 누르면 누적거리를 0으로 초기화 합니다.
    distance = 0;
  }


  lcd.setCursor(0,0);          //커서를 0,0에 지정
  lcd.print("Speed: "); 
  if(bySpeed < 10){            // 속도가 한자리라면 앞에 0을 붙여 줍니다.
    lcd.print('0');
  }
  lcd.print(bySpeed);               
  lcd.print("Km/h");           // 속도를 lcd에 출력합니다.("Speed: xx.xxKm/h");
  
  lcdDis = distance / 1000;  
  lcd.setCursor(0,1);          // 커서를 0,1에 지정
  lcd.print("Distance: ");  
  if(lcdDis >= 100){           // 이동거리가 100Km가 넘어가면 소숫점을 지워줍니다.
    lcd.print((int)lcdDis);
  }
  else{
    lcd.print(lcdDis);               
  }            
  lcd.print("Km");             // 이동거리를 lcd에 출력합니다.("Distance: xx.xxKm")
  
  String lcdString = "";                      //문자열 초기화
  lcd.print("               ");        //전 글씨 삭제
  Serial.print("Speed : ");
  Serial.print(bySpeed);
  Serial.println(" km/h");             // 시리얼 모니터를 이용하여 속도를 확인합니다.
  Serial.println(bySpeed);
}
//수신부 코드입니다 수신부에는 계기판 바늘역할을 할 서브모터와 RGB LED가 부착되어있습니다. 

#include 
Servo servo;
int data;


const int RED_PIN1 = 7;    //RED LED와 디지털 7 핀 연결
const int GREEN_PIN1 = 6;  //GREEN LED와 디지털6 핀 연결
const int BLUE_PIN1 = 5;    //BLUE LED와 디지털 5핀 연결
const int RED_PIN2 = 4;    //RED LED와 디지털 4 핀 연결
const int GREEN_PIN2 = 3;  //GREEN LED와 디지털 3 핀 연결
const int BLUE_PIN2= 9;

void setup(){
 pinMode(RED_PIN1, OUTPUT);   
 pinMode(GREEN_PIN1, OUTPUT);  
 pinMode(BLUE_PIN1, OUTPUT);  
 pinMode(RED_PIN2, OUTPUT);    
 pinMode(GREEN_PIN2, OUTPUT);  
 pinMode(BLUE_PIN2, OUTPUT);   
 servo.attach(8);
 Serial.begin(9600);
}

 void loop(){
   while(Serial.available()){
     int data = Serial.parseInt();
     Serial.println(data);
   }
  
 int rad = map(data,0,240,0,240);
  if(rad != 180){
    servo.write(rad);
  }
 
 if (data < 80){
 digitalWrite(RED_PIN1,LOW);    // 80이하면 초록불
 digitalWrite(GREEN_PIN1,HIGH);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,LOW);    
 digitalWrite(GREEN_PIN2,HIGH);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
 
  digitalWrite(RED_PIN1,LOW);    
 digitalWrite(GREEN_PIN1,LOW);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,LOW);   
 digitalWrite(GREEN_PIN2,LOW);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
 
 digitalWrite(RED_PIN1,LOW);   
 digitalWrite(GREEN_PIN1,HIGH);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,LOW);    
 digitalWrite(GREEN_PIN2,HIGH);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
 
  digitalWrite(RED_PIN1,LOW);    
 digitalWrite(GREEN_PIN1,LOW);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,LOW);    
 digitalWrite(GREEN_PIN2,LOW);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
     }
    
     else if ( 80 < data && data < 120){
 digitalWrite(RED_PIN1,LOW);    //80 120 사이일때 노란불 
 digitalWrite(GREEN_PIN1,LOW);
 digitalWrite(BLUE_PIN1,HIGH);
 digitalWrite(RED_PIN2,LOW);    
 digitalWrite(GREEN_PIN2,LOW);
 digitalWrite(BLUE_PIN2,HIGH);
 delay(500);
 
   digitalWrite(RED_PIN1,LOW);   
 digitalWrite(GREEN_PIN1,LOW);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,LOW);    
 digitalWrite(GREEN_PIN2,LOW);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
 
   digitalWrite(RED_PIN1,LOW);    
 digitalWrite(GREEN_PIN1,LOW);
 digitalWrite(BLUE_PIN1,HIGH);
 digitalWrite(RED_PIN2,LOW);  
 digitalWrite(GREEN_PIN2,LOW);
 digitalWrite(BLUE_PIN2,HIGH);
 delay(500);
 
   digitalWrite(RED_PIN1,LOW);    
 digitalWrite(GREEN_PIN1,LOW);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,LOW);    
 digitalWrite(GREEN_PIN2,LOW);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
     }
    
     else if( data > 120){
 digitalWrite(RED_PIN1,HIGH);   //120 초과일때 빨간불
 digitalWrite(GREEN_PIN1,HIGH);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,HIGH);  
 digitalWrite(GREEN_PIN2,HIGH);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
 
   digitalWrite(RED_PIN1,LOW); 
 digitalWrite(GREEN_PIN1,LOW);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,LOW);   
 digitalWrite(GREEN_PIN2,LOW);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
 
    digitalWrite(RED_PIN1,HIGH);   
 digitalWrite(GREEN_PIN1,HIGH);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,HIGH);    
 digitalWrite(GREEN_PIN2,HIGH);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
 
   digitalWrite(RED_PIN1,LOW);   
 digitalWrite(GREEN_PIN1,LOW);
 digitalWrite(BLUE_PIN1,LOW);
 digitalWrite(RED_PIN2,LOW);    
 digitalWrite(GREEN_PIN2,LOW);
 digitalWrite(BLUE_PIN2,LOW);
 delay(500);
 }
 
 }

 

이전글   |    아두이노 LCD 질문입니다. 2015-05-21
다음글   |    FM 라디오 관련 질문 2015-05-22