CodingMaker

14강 Arduino 통신 본문

Fablab Academy

14강 Arduino 통신

메이커K 2017. 12. 11. 15:30


  아두이노 모듈 data sheet  


데이터 시트 검색하려면 이름을 쓰고 데이터시트 검색 아니면 pdf 검색하면 데이터 시트가 pdf로 작성되었기 때문에 원하는 LED가 있다면 어떤 전압에 어떤 전류를 사용하는지와 디지털 출력핀에서 5V가 최대 40mA까지 나올수 있다. 뭐 이런 정보를 알수 있다. 

led가 40mA 이상이 되면 터진다거나 이런 상황을 미리 알아볼수 있다. 220옴을 결정했다는 것은 30mA(max) 한번만 피크 찍는건 100mA까지 ..

납땜할때 5초동안 할떄 260도보다 높아서 속까지 열이 전도될수 있어 납땜할때 조심해야한다.


케소드 (-) 긴다리가 GND로 연결, 애노드 (+) 긴다리가 전원으로 연결

  통신  


직렬 - 한 선에 하나씩

병렬 - 여러가지 신호를 한번에 보낸다. 


빠른 통신이 필요할때 병렬을 쓴다. CNC 경우, 시리얼 통신은 TX (보내는 쪽) RX (받는 쪽)

보내는 것은 한번에 하나씩, 


9600으로 정한 이유는 시리얼 통신의 경우에 모스부호나 알수 없는 프로토콜을 보낼때 중간부터 들었을때 시작점을 모르니까 시작은 하나 끝날때 3개 등 시작과 끝에만 쓸 것을 정해주는 데이터를 줘야한다. 이렇게 하지 않아도 시작과 끝을 알수 있는 것은 클럭이다.


바우드 레이터(?)는 같은 신호인데 1초에 한번씩 읽으면 0001110011... 똑같이 속도를 맞추는 것이다.  통신은 시리얼과 패널로 나누기도 한다. 동기식(클럭이 있다) 비동기식(클럭이 없다) 등


아두이노 2개를 연결할때는 RX와 TX를 TX와 RX를 연결한다. 여러개도 붙일 수 있다. 채팅방 같은것도 만들 수 있다. 


통신 방식에 따라서 SPI(1대 n)통신을 할때 마스터 슬레이브 개념

주인이 한명이고 노예가 여러명일 경우에 사용한다. 다대다도 사용가능하다.(엄청 빠르다)


아이스퀘어시(선이 심플하다, 많이 사용) - LED Matrix 64개의 LED를 제어해야하는데 데이터만 보내고 클럭만 보내서 통신을 보낸다. 주고 받는 선이 하나라서 SPI보다 통신이 느리다.


  시리얼 모니터  


전압값을 이용해서 빛의 밝기를 표현할때 사용하는데 복잡해지면 어디서 잘못되었는지 알수가 없다. 버그가 발생한다. 디버깅하기위해서 시리얼 통신을 사용한다. 

시리얼 통신은 컴퓨터랑 아두이노랑 하는 통신 방식이고 업로드 하는 것도 시리얼 통신으로 볼수 있다. 

Serial.begin(); 글자 선택하고 참조에서 찾기 하면 

Serial.println(); 문자열을 출력한다. 문자일수도 있고 센서의 값일 수 도 있다.


  블루투스 통신 


앱을 다운로드 받아서 신호를 보내면 LED가 깜빡이게 하는 실습을 한다.

블루투스도 모듈이다. 블루투스와 아두이노가 통신을 한다. 시리얼 통신하는 블루투스가 0번핀 1번핀이 아니고 2번번 3번핀이냐하면 TX RX용으로 컨트롤러 내부에서 지정해 놓은 것이다.

물결표시는 TWM만 위해서 만들어 놓은 것이다. 소프트웨어 시리얼로 만들 수 있다.

2번 3번 핀으로 시리얼 통신을 한다. 컴퓨터와 통신한다. 


   App Inventor   


앱 만들기 쉬운 툴이 있다. 

http://ai2.appinventor.mit.edu/?locale=ko_KR#5484268453363712


앱 인벤터 공부에 참고할만한 유투브

https://www.youtube.com/watch?v=o0Fx-lNJINQ


블루투스 관련 파일은 현재 글의 (첨부파일참고)



  10 초음파센서로 거리 측정하기   


https://www.kocoafab.cc/tutorial/view/357

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
int echoPin = 12;
int trigPin = 13//초음파 센서의 핀 번호 설정
 
void setup() {
  Serial.begin(9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // trig를 출력모드로 설정, echo를 입력모드로 설정
}
 
void loop() {
  float duration, distance;
  digitalWrite(trigPin, HIGH);
  delay(10);
  digitalWrite(trigPin, LOW);
  // 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
  duration = pulseIn(echoPin,HIGH); //echoPin이 HIGH를 유지한 시간을 저장한다.
  distance = ((float)(340*duration)/10000)/2
  //HIGH 였을 때 시간(초음파가 보냈다가 다시 돌아온 시간을 가지고 거리를 계산한다.
  Serial.print(distance);
  Serial.println("cm");  //수정한 값을 출력
  delay(500);
}


실행동영상

초음파 센서의 송신부(Trig)에서 일정한 시간의 간격을 둔 짧은, 초음파 펄스를 방사하고, 대상물에 부딪혀 돌아온 에코 신호를 수신부(Echo)에서 받아, 이에 대한 시간차를 기반으로 거리를 산출한다.


1cm를 이동하는데 걸리는 시간은 다음과 같이 구할 수 있습니다.

따라서, t = 2 * 0.01 / 340 = 58.824µs 로, 초음파가 1cm를 이동하는데 걸리는 시간은 약 29µs가 걸리며, 초음파가 반사된 물체와의 거리는 다음과 같이 구할 수 있습니다.

거리(cm) = duration (왕복에 걸린시간) / 29 / 2 (왕복).



  10-1 RGB LED와 초음파센서   


물체와의 거리가 50cm 이상일떄는 초록색, 20~50cm 일떄 노란색, 20cm 미만일때 빨간색으로 변하게 만들어본다.

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
int R_Pin = 11// 11번 핀에 빨강 연결
int G_Pin = 10// 10번 핀에 초록 연결
int B_Pin = 9;  // 9번 핀에 파랑 연결
int echoPin = 12;
int trigPin = 13//초음파 센서의 핀 번호 설정
 
void setup() {
  Serial.begin(9600);
  pinMode(R_Pin, OUTPUT);
  pinMode(G_Pin, OUTPUT);
  pinMode(B_Pin, OUTPUT);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  // trig를 출력모드로 설정, echo를 입력모드로 설정
}
 
void loop() {
  float duration, distance;
  digitalWrite(trigPin, HIGH);
  delay(10);
  digitalWrite(trigPin, LOW);
  // 초음파를 보낸다. 다 보내면 echo가 HIGH 상태로 대기하게 된다.
  duration = pulseIn(echoPin,HIGH); //echoPin이 HIGH를 유지한 시간을 저장한다.
  distance = ((float)(340*duration)/10000)/2
//HIGH 였을 때 시간(초음파가 보냈다가 다시 돌아온 시간을 가지고 거리를 계산한다
  Serial.print(distance);
  Serial.println("cm");  //수정한 값을 출력
 
  if(distance>30){ //거리가 50cm 이상이면
    digitalWrite(R_Pin, LOW);
    digitalWrite(G_Pin, LOW); 
    digitalWrite(B_Pin, HIGH); //파란 LED on
  }
  else if(distance>10){ //거리가 10~30cm 이상이면 노란색 (빨간+초록)
    digitalWrite(R_Pin, HIGH);
    digitalWrite(G_Pin, HIGH);
    digitalWrite(B_Pin, LOW);
  }
  else { //거리가 10미만이면 
    digitalWrite(R_Pin, HIGH); //빨간색 on
    digitalWrite(G_Pin, LOW);
    digitalWrite(B_Pin, LOW);
  }
}


실행동영상


 10-2 RGB LED여러가지 색깔 표현하기 (for 문) 


코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
int R_Pin = 11// 11번 핀에 빨강 연결
int G_Pin = 10// 10번 핀에 초록 연결
int B_Pin = 9;  // 9번 핀에 파랑 연결
 
void setup() {
  pinMode(R_Pin, OUTPUT);
  pinMode(G_Pin, OUTPUT);
  pinMode(B_Pin, OUTPUT);
}
 
void loop() {  // i가 0~255 이 될 때 까지 {}안의 내용을 반복
  for (int i=0; i<256; i++){
    analogWrite(R_Pin, 255-i); //빨강을 점점 줄임
    analogWrite(G_Pin, i);
    analogWrite(B_Pin, 0);
    delay(10); //0.01초 씩 일시정지
  }
  //i가 0~255이 될 때 까지 {}안의 내용을 반복
  for (int i=0; i<256; i++){
    analogWrite(R_Pin, 0); 
    analogWrite(G_Pin, 255-i); //초록을 점점 줄임
    analogWrite(B_Pin, i);
    delay(10); //0.01초 씩 일시정지
  }
 
  for (int i=0; i<256; i++){
    analogWrite(R_Pin, i); 
    analogWrite(G_Pin, 0); 
    analogWrite(B_Pin, 255-i); // 파랑을 점점 줄임
    delay(10); //0.01초 씩 일시정지
  }
}


실행동영상


'Fablab Academy' 카테고리의 다른 글

Make Room  (0) 2017.12.11
15 Final Project  (2) 2017.12.11
13강 Arduino OUTPUT  (0) 2017.12.11
12강 Arduino INPUT  (0) 2017.12.11
11강 Arduino LED  (0) 2017.12.11