1. 준비물
(1) TTL to RS485 자동 흐름제어 컨버터 모듈 [SZH-CVBE-010]
(2) 아두이노 나노 (Slave#1 역할)
(3) 아두이노 메가 (Slave#2 역할)
(4) 라즈베리파이 (Master 역할)
아래의 사진은 TTL to RS485 컨버터.
Max 485로도 시도해봤으나 아래 컨버터가 더 심플하고, 추가적인 라이브러리 셋팅도 필요없어 간편했다.
2. 연결하기
아두이노 나노, 메가, 라즈베리파이 | RS485 컨버터 모듈 |
GND | GND |
Vcc(5v) | VCC |
Tx | RXD |
Rx | TXD |
RS485 컨버터 모듈의 D-/B, D+/A, GND 끼리 각각 연결해준다.
3. 동작 방식
시리얼 통신이라고 하는 게 TCP/IP 처럼 특정 디바이스에만 값을 요청하는것은 불가능하다.
대부분의 시리얼 통신 방식은 아래 그림1.과 같은데 Master가 Client1에만 값을 요청한다고 write()를 해도 client2, client3,,, client N까지 값을 read()할 수 있다.
//makeshare.org/bbs/board.php?bo_table=arduinoetc&wr_id=39
[아두이노 부품사용법] MAX485 TTL to RS-485 컨버터 모듈
개요 (Overview) MAX485를 사용한 시리얼 RS-485 컨버터 모듈입니다. RS-485는 RS232 RS422에 비해서 많은 드라이버/리시버를 사용할 수 있으며 RS232가 통신 거리가 15m임에 비해 거리는 1.2Km까지 전달할 수 있으며 통신속도도 10Mb/s까지 지원합니다. 특히 전송방식은 Half Duplex 방식이라서 하나의 선을 사용한 다수의 모터 제어를 위한 로보티즈사의 다이나믹셀 …
makeshare.org
다른 시리얼 통신을 해본적이 없는 나로써는 내 식대로 만들기로 했다. (근데 일반적으로 만드는 방법일지도?)
아두이노 나노와 메가에 각각 ID를 부여했다.
그리고 라즈베리파이 즉, 마스터는 그 ID를 배열로 저장해놓고 정해진 시간이 되었을 때 Slave에게 req를 보낸다.
Req 형식은 "@101!" 와 같은 식이다. 골뱅이와 느낌표 사이에 아이디를 적어주었다.
그래서 Slave 쪽에서는 read()로 하염없이 req를 기다리고 있다가 데이터를 수신하게 되면 나에게 요청을 한것이 맞는지 확인하는 함수를 한번 거친다.
if "내 아이디" == 수신한 시리얼 데이터의 아이디 write("내 데이터") else return위와 같은 형식이다.
회로도작업중
(RS485/MAX485 통신모듈(6편) 1:N통신 기본코드 버전2 만들기)
3편에서 만들어둔 통신방식의 문제점을 파악해보자
문제점을 해결할 아이디어가 무엇인가?
Response의 누락없이 데이터를 수신해보자
슬레이브가 오프라인일 경우 체크할 수 있는가?
슬레이브가 일정시간 응답이 없을 경우 어떻게 하지~~
등등 버전2에서 해결해보자!
예제124-1-1 (마스터코드)
* Request*Response 기능을 강화하기 위한 V2코드
* 마스터가 슬레이브들에게 패킷을 전송한다음 수신할때 까지 기다린다.
* 일정시간동안 슬레이브가 동작하지 않을경우 오프라인으로 처리한다.
124-1-1.txt
0.00MB
124-1-2.txt
0.00MB
124-1-3.txt
0.00MB
예제124-2-1 (마스터코드)
* Request*Response 기능을 강화하기 위한 V2코드
* 마스터가 슬레이브들에게 패킷을 전송한다음 수신할때 까지 기다린다.
* 일정시간동안 슬레이브가 동작하지 않을경우 오프라인으로 처리한다.
* 디지털 4,5,6,7번 핀에 LED를 배치하시오
* 4,5에 각각 녹색, 빨간색
* 6,7에 각각 녹색, 빨간색
* 슬레이브1이 온라인이면 4번(녹색)켜짐, 오프라인이면 5번(적색)켜짐
* 슬레이브2가 온라인이면 6반(녹색)켜짐, 오프라인이면 7번(적색)켜짐
124-2-1.txt
0.00MB
124-2-2.txt
0.00MB
124-2-3.txt
0.00MB
레퍼런스 강의(아두이노 #112 RS485 3편)
bota.tistory.com/1340