이번 제어는 UART 로 명령을 받아서 움직이는 "자동" 모드가 포함됩니다. 그래서, 간단하게나마 프로토콜이 필요하게 됩니다. 따라서 급하게 아래처럼 프로토콜을 정해봅니다.

[COMMON] 프로토콜의 구조입니다. HEADER/BODY/TAIL 이고, 심플합니다.

Field | Bytes | Description

## HEADER
STX | 2 | "ST"
DID | 1 | device ID

## BODY
CMD | 1 | Commands
DAT | 2 | Data / BIG-endian
RES | 2 | Reserved / BIG-endian

## TAIL
CRC16 | 2 | CRC16 (0,10)
ETX | 2 | "EX"

<설명>
DID : 0x11 - 창문 개폐기 1호


[COMMANDS]

<Control>

CMD : 0x11 - 창문 열기
DAT : 0x0000 (보드 설정사용), 0x0001 ~ 0x00FF (강제속도)

CMD : 0x21 - 창문 열기 강제 / S1 눌려도 무시하고 계속 모터 진행. !주의!
DAT : 0x0000 (보드설정사용), 
0x0001 ~ 0x00FF (강제속도)

CMD : 0x12 - 창문 닫기
DAT : 0x0000 (보드 설정사용), 0x0001 ~ 0x00FF (강제속도)

CMD : 0x22 - 창문 닫기 강제 / S2 눌려도 무시하고 계속 모터 진행. !주의!
DAT : 0x0000 (보드설정사용), 
0x0001 ~ 0x00FF (강제속도)

CMD : 0x13 - 모터 멈춤(급정거)

CMD : 0x14 - 모터 OFF

<RESPONSE - OK>
CMD : 0x00
DAT : "OK"

<RESPONSE - ERROR>
CMD : 0xF1 - 오류
DAT : 오류 코드
0x0001 - 데이터 오류 (CRC 불일치 / 재전송 요청)
0x0101 - 모터 오류

샘플 데이터 : 5354111100FF0000FFFF4554

위 프로토콜로 PC 와 통신 테스트를 합니다. 프로토콜 테스트는 ARDUINO NANO 를 활용해서 해봤습니다. 쬐그맣고 빵판에 그냥 심어놓고 하면 되기땜에 배선 시간이 줄어서 테스트할때는 이놈으로 합니다. UNO 와 PWM 출력핀 번호도 같아서 Schematic 도 그대로 사용하면 됩니다.




PC에서 속도를 조절해보고, 정/역회전 및 정지를 해봤습니다.

데이터가 깨지거나 맞지 않는 경우를 생각해서 STX/ETX가 안맞으면 패킷을 DISCARD 하도록 하였고 테스트 해보니 잘 동작합니다.

Debug 메시지를 출력중인데, Serial 을 잡고 출력하다보니 나중에 설치하여 동작할때(릴리즈)는 문제가 되겠다 싶어서, debug 출력 제어핀(D12)을 두었습니다.

아두이노 내부의 PULLUP 을 사용해서, 평소 HIGH (릴리즈모드), GND 로 묶을 때 LOW 로 가서 디버그 모드로 돕니다. 이때는 출력을 안하고(나중에 RESPONSE 만 줘야겠죠) 그냥 넘깁니다.


이제 모터 굴리고 UART 로 제어도 되었으니 남은건 CRC16으로 패킷체크 하는것과(뭐 이것까지 필요할까 합니다마는.. ) RESPONSE 주는것, 그리고 제일 큰일인 땜질용 빵판에 옮기는것이 남았습니다. (아.. 요걸 해야하나..)

그리고, DC모터를 제어하면서 문제점이 하나 보입니다. 바로 "정지" 기능인데요, 일반적인 서보모터는 지정 각도에서 딱 멈춰있는 반면, 이노무 "서보형 DC모터"는 그딴 기능이 없네요. 그냥 회전만 하는거라, L293에 브레이크를 먹여도 OFF 한것과 차이가 없이 휙휙 돌아갑니다.

나중에 설치하게 되면 문을 닫았을때는 크게 문제없겠지만, 당기고 있는(열기)때에는 어느정도 힘으로 끈을 붙들고(?)있게 해야겠네요.^^

그럼 또 진행하고 다음편 올라갈래요~


반응형
블로그 이미지

Good Joon

IT Professionalist Since 1999

,