Adventure Design

본 토픽은 현재 준비중입니다. 공동공부에 참여하시면 완성 되었을 때 알려드립니다.

7. UART 통신 이용하기

열심히 프로젝트를 진행하던 도중 예상치 못한 국면을 맞이하게 되었습니다.

바로... 아두이노 디지털 입출력에 이용할 핀이 부족하다는 것이었습니다.

이 상황에서 선택가능한 선택지는 다음과 같았습니다.

 


1. 아두이노 확장보드나 쉴드를 구매한다.

2. 아두이노 통신을 이용한다. (아두이노가 집에 2개 였음)

3. 구현하려고 했던 기능 일부를 포기한다.


 

1번은 돈이 없었고, 3번은 멋이 없었기에 2번을 선택하기로 했습니다. (답정너)

 


UART 통신과의 조우


UART 통신, 일명 시리얼 통신이라고도 하는 이 통신법은,

아두이노의 0번 핀과 1번 핀끼리 연결해주는 것 만으로도 통신이 가능한 방식이었고

사용하기 매우 간단하다 판단해, 바로 프로젝트에 이용해보려고 했습니다.

 


UART 통신 개시


간단한 예제를 만들어, UART 통신을 실제로 이용할 수 있는지 그 가능성을 보려고 했습니다.

본 영상은, UART 통신을 이용해 왼쪽 아두이노에서 오른쪽 아두이노로 'LED를 켜!' 라는 신호를 보내는

모습입니다. 신호를 받은 오른쪽 아두이노가 LED를 켜는 것을 볼 수 있습니다.

 


UART 통신 응용


제 프로젝트에 이용 가능한지 바로 확인해봐야겠죠?

조금 더 심화적인 코드로 발전시켜 보았습니다.

 

첫번째 초음파 센서에 그릇이 닿으면 시리얼 분배기(서보모터)가 움직이고, 두번째, 세번째 초음파 센서에 닿으면 움직이지 않는 구조로 구성했습니다. 첫번째 센서에 그릇이 닿으면, 첫번쨰 아두이노가 이를 판단하고 두번째 아두이노에게 '시리얼 분배기 좀 움직여봐!' 라는 통신을 보냅니다. 그 통신을 알아 들은 두번째 아두이노는 시리얼 분배기를 움직이게 됩니다.

 

별건 없지만, 코드 입니다. 통신하는 부분을 형광펜으로 쳐뒀습니다.


송신부


//코드 안정화 삭제
// 초음파 센서 2개
// 서보모터랑 uart 통신까지
 
 
int IN1 = 3;
int IN2 = 4;
int ENA = 5;
int trig_1 = 7;
int echo_1 = 6;
 
int trig_2 = 9;
int echo_2 = 8;
 
int trig_3 = 10;
int echo_3 = 11;
 
long distance_return(int trig, int echo);
void motor_go(int IN1, int IN2, int ENA);
void motor_go_slow(int IN1, int IN2, int ENA);
void motor_stop(int IN1, int IN2);
void sensor_Print(long distance);
 
void setup() 
{
 
Serial.begin(9600);
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(trig_1, OUTPUT);
pinMode(echo_1, INPUT);
pinMode(trig_2, OUTPUT);
pinMode(echo_2, INPUT);
pinMode(trig_3, OUTPUT);
pinMode(echo_3, INPUT);
pinMode(ENA, OUTPUT);
}
 
void loop() 
{
  
  long new_distance_1 = distance_return(trig_1, echo_1);
  long new_distance_2 = distance_return(trig_2, echo_2);
  long new_distance_3 = distance_return(trig_3, echo_3);
  
  //sensor_Print(new_distance_1);
  //sensor_Print(new_distance_2);
  //sensor_Print(new_distance_3);
 
 
  
  if(new_distance_1 > 50 && new_distance_2 > 50 && new_distance_3 > 60)
  {
   motor_go(IN1, IN2, ENA);
 
  }
 
  else if (new_distance_1 < 50)
  {
    Serial.print("a");
    delay(250);
    motor_stop(IN1, IN2);
    delay(5000); // 나중에 토핑 나오는 시간으로 계산하자
    motor_go(IN1, IN2, ENA);
    delay(3000);
  }
 
  else if (new_distance_2 < 50)
  {
    delay(250);
    motor_stop(IN1, IN2);
    delay(5000); // 나중에 토핑 나오는 시간으로 계산하자
    motor_go(IN1, IN2, ENA);
    delay(3000);
  }
 
  else if(new_distance_3 < 60)
  {
    delay(250);
    motor_stop(IN1, IN2);
    delay(5000); // 나중에 토핑 나오는 시간으로 계산하자
    motor_go_slow(IN1, IN2, ENA);
    //delay(1000);
    motor_stop(IN1, IN2);
    delay(10000);
    
  }
 
  
 
 
 //마지막 센서 달아서는 거기서 완전히 끝나게 하기
 // 아마 while이랑 break를 쓰면 될것같긴함...
}
 
 
long distance_return(int trig, int echo)
{
  long duration, distance;
 
  digitalWrite(trig, LOW);
  delayMicroseconds(2);
  digitalWrite(trig, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig, LOW);
 
  duration = pulseIn(echo, HIGH);
 
  distance = duration * 170 / 1000 ;
 
 
  return distance;
  
  
}
 
void sensor_Print(long distance)
{
  Serial.print("거리: ");
  Serial.print(distance);
  Serial.println("mm");
  delay(100);
}
 
void motor_go(int IN1, int IN2, int ENA)
{
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW); 
  analogWrite(ENA, 100); 
}
 
void motor_go_slow(int IN1, int IN2, int ENA)
{
    
  digitalWrite(IN1, HIGH);
  digitalWrite(IN2, LOW);
  for(int pwm =100; pwm>=1; pwm-=0.5)
  {
     analogWrite(ENA, pwm);
     delay(100);
  }
  
}
 
void motor_stop(int IN1, int IN2)
{
  
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  
}

 

 


수신부


//받아오는 부분
#include <Servo.h>
Servo servo;
 
void Servo_go();
 
void setup() {
  Serial.begin(9600);
  servo.attach(13);
  servo.write(180);  
}
 
void loop() {
  if(Serial.available())
  {
 
  char Data = (char)Serial.read();
 
  if(Data == 'a')
  {
    delay(1000);
    Servo_go();
    
  }
  else
  {
    servo.write(180);
  }
 
}
 
}
 
void Servo_go()
{
    servo.write(30);
    delay(1000);
    servo.write(180);
    delay(1000);
}

 

댓글

댓글 본문
버전 관리
OreoChiz
현재 버전
선택 버전
graphittie 자세히 보기