듀이노는 아두이노를 노드로 제어하기 위한 클라이언트 프래임웍입니다.
듀이노에는 가상머신 코드가 구현 되어 있습니다. 사실 노드용 라이브러리를 사용하는것보다는 이 코드 체계만 그대로 사용하는편이 더 낫습니다.
시리얼포트로 직접 명령코드를 날려 사용하면 됩니다.
다운로드 받은후 src/du.ino 파일을 아두이노에 올려 사용합니다.
코드 정리
명령어는 다음과 같습니다.
00
pinMode01
digitalWrite02
digitalRead03
analogWrite04
analogRead97
ping98
servo99
debug
한번에 9~11바이트 단위로 명령어가 전달됩니다.
!로 시작 하고 그다음 2바이트는 명령어코드 그다음 2바이트는 핀번호 다음 3바이트는 입력값(0~255)입니다.
디지털의 경우는 0이면 low, 0이상이면 high입니다.
마지막은 마침표로 명령어가 끝났다는것을 알립니다.
void loop() {while(Serial.available() > 0) {char x = Serial.read();if (x == '!') index = 0; // startelse if (x == '.') process(); // endelse messageBuffer[index++] = x;}}
.표 까지 씨리얼포트에서 값을 얻어온 다음 process() 에서 전송받은 문자열을 해석합니다.
다음은 가장 핵심이 되는 process함수의 소스 부분입니다.
-------------------
/** Deal with a full message and determine function to call*/void process() {index = 0;strncpy(cmd, messageBuffer, 2);cmd[2] = '\0';strncpy(pin, messageBuffer + 2, 2);pin[2] = '\0';if (atoi(cmd) > 90) {strncpy(val, messageBuffer + 4, 2);val[2] = '\0';strncpy(aux, messageBuffer + 6, 3);aux[3] = '\0';} else {strncpy(val, messageBuffer + 4, 3);val[3] = '\0';strncpy(aux, messageBuffer + 7, 3);aux[3] = '\0';}if (debug) {Serial.println(messageBuffer);}int cmdid = atoi(cmd);// Serial.println(cmd);// Serial.println(pin);// Serial.println(val);// Serial.println(aux);switch(cmdid) {case 0: sm(pin,val); break;case 1: dw(pin,val); break;case 2: dr(pin,val); break;case 3: aw(pin,val); break;case 4: ar(pin,val); break;case 97: handlePing(pin,val,aux); break;case 98: handleServo(pin,val,aux); break;case 99: toggleDebug(val); break;default: break;}}
------------------
98 서보의 경우 val 값은 서보 명령어가 되고 aux 값이 데이터 값이 됩니다.
서보를 포함 핑,디버그 등 90번대 이상명령어의 경우는
cmd(2)pin(2)val(2)aux(3)
9 바이트 명령어가 됩니다.
서보의 val 값의 종류는 아래와 같습니다.
00: detach
01: attach
02:write
03:read
서보 다루기 예>
9번 포트 제어
!980901000. 포트 깨우기(attach)
!980902045. 45 각도로 이동
!980900000. 포트 잠자기(detach)
99 디버거는 처음명령어코드 중간 val(빨간 배경) 값만 사용됩니다.
디버거 켜기 !990011000.
디버거 끄기 !990000000.
pinMode 의 경우는 0이면 OUTPUT, 0이 아니면 INPUT 입니다.
구현 함수는 다음과 같습니다.
/** Set pin mode*/void sm(char *pin, char *val) {if (debug) Serial.println("sm");int p = getPin(pin);if(p == -1) { if(debug) Serial.println("badpin"); return; }if (atoi(val) == 0) {pinMode(p, OUTPUT);} else {pinMode(p, INPUT);}}
예>
!0113001.
! : 시작
01 : digitalWrite
13 : 핀번호
001 : high
. : 명령 종료
'컨버젼스' 카테고리의 다른 글
node.js 로 raspberry sound system 만들기 (0) | 2014.05.02 |
---|---|
how to arduino wifi-shield firmware upgrade (for macOS 10.9) (0) | 2014.04.22 |
아이폰으로 주파수분석해보기 - 1 (0) | 2013.04.30 |
pc 또는 맥에서 아두이노 BT Shiled 세팅하기 (2) | 2013.01.17 |
node.js 용 opencv 와 camera 모듈 설치하기 (0) | 2012.11.20 |