dunio 사용법

|

듀이노는 아두이노를 노드로 제어하기 위한 클라이언트 프래임웍입니다.


https://github.com/ecto/duino



듀이노에는 가상머신 코드가 구현 되어 있습니다. 사실 노드용 라이브러리를 사용하는것보다는 이 코드 체계만 그대로 사용하는편이 더 낫습니다.

시리얼포트로 직접 명령코드를 날려 사용하면 됩니다.


다운로드 받은후 src/du.ino 파일을 아두이노에 올려 사용합니다.


코드 정리

명령어는 다음과 같습니다.

  • 00 pinMode
  • 01 digitalWrite
  • 02 digitalRead
  • 03 analogWrite
  • 04 analogRead
  • 97 ping
  • 98 servo
  • 99 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; // start
    else if (x == '.') process(); // end
    else 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

. : 명령 종료 








And