4월 10일 수업(day6)
6차시 수업은 아두이노의 통신 방식에 대해 집중적으로 학습하였다.
하드웨어 아두이노는 컴퓨터와 독립된 기기이기 때문에, 동일한 clock을 공유하지 못한다.
그렇기에 Asynchronous Serial 이라는 방식으로 신호를 주고받게 된다.
Asynchronous Serial 는 신호 전후로 신호의 시작과 끝을 알리는 추가적인 신호를 넣어줌으로써
서로 다른 clock을 사용하는 기기끼리도 문제 없이 신호를 주고받을 수 있는 교신방식이다.
하드웨어 아두이노에 코드를 올려주거나, 아두이노가 시리얼과 교신을 하기 위해서 이러한 교신방식을 사용한다고 한다.
아두이노는 양방향 통신을 위해 세 개의 핀을 필요로 하는데,
RX 리시버, TX 트랜스미터, GND 그라운드 이렇게 세 개의 핀을 사용하게 된다.
TX는 신호를 출력, RX 신호를 입력하는 역할을 한다.
GND는 두 기기의 전위가 달라 들어온 전압에 대해 잘못 이해하는 것을 방지하기 위해 두 기기의 전위를 맞춰주는 역할을 한다.
지금까지 아두이노 코드를 작성할 때, 의미를 알지 못하면서
Serial.begin(9600);
라는 메소드를 setup에 작성해왔는데, 그 의미는
신호가 9600bps(bits per second)로 들어오고 보낼테니 이에 맞게 신호를 이해하라는 이미인 듯 하다.
아두이노는 이 속도에 따라 들어오는 0과 1의 신호를 아스키코드로 해석하여 이해한다.
실습으로 다음과 같은 코드를 각각 아두이노와프로세싱에 작성한다.
실습시 촬영을 하지 못하였고 코드를 남기지 못했지만,
하드웨어 아두이노와 컴퓨터가 교신은 Serial을 통해서 이루어지는 것을 확인할 수 있었다.
지금까지의 과제에서 Serial monitor를 항상 아두이노에서의 출력을 받기 위해서만 사용해왔는데,
이번 실습시간에는 컴퓨터의 Serial monitor에서 char를 입력해줌으로써
하드웨어 아두이노가 이에 따라 반응하는 회로도 만들어보았다.
마찬가지로, 아두이노와 프로세싱을 연결해 줄 때 역시 Serial을 통해서 신호를 주고받게 된다.
<아두이노>
void setup() {
Serial.begin(9600);
}
void loop() {
int sensor = analogRead(A0);
Serial.write(sensor/4);
/*이 부분에서 Serial로 신호를 보내준다.
*print와 write의 차이가 존재하는 것 같긴 한데, 어떠한 차이를 내는 지 아직 잘 모르겠다.
*/시리얼을 통해 다른 프로그램과 신호를 주고받을 수 있는 듯 하다.
delay(10);
}
<프로세싱>
import processing.serial.*;
Serial myPort;
float xpos;
void setup(){
size(1000, 255);
//println(Serial.list()); ->이 부분으로 처음에 포트의 이름을 확인하였다.
String portName = "COM3";
myPort = new Serial (this, portName, 9600);
//프로세싱의 시리얼과 통신할 수 있는 인스턴스를 생성해 주었다
}
void draw(){
background(0);
fill(255);
xpos = map(xpos, 0, 255, 0, 1000);
ellipse(xpos, height/2, 20, 20);
//xpos의 값에 따라서 원이 그려지는 x좌표가 바뀌도록 ellipse메소드를 사용해준다.
}
void serialEvent (Serial myPort){
xpos = myPort.read();
//serialEvent를 통해 실시간으로 xpos변수에 포트를 통해 들어온 값을 넣어줄 수 있다.
}