シリアル通信

シリアル通信ができるってことは好きな言語で Arduino をコントロールできるってことなので試す。

以下 Arduino 側。シリアル通信で 'h' で LED オン、'l' で LED オフ。

// Serial - Gauche - Test - Arduino 
#define LED 13
int inByte;

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  //  Serial.println("x");
  if (Serial.available() > 0) {
    inByte = Serial.read();
    if (inByte == 'l') {
      digitalWrite(LED, LOW);
    } 
    else if (inByte == 'h') {
      digitalWrite(LED, HIGH);
    } 
    else if (inByte == 's') {
      delay(100);
    }

    Serial.print("AR: ");
    Serial.println(inByte, BYTE);
    Serial.print("\n");
    delay(5);
  }
}

以下は gauche 側。

;; 20090810
;; gauche - arduino test
(use gauche.termios)

(define (arduino-info)
  (let ((arduino "/dev/cu.usbserial-A6008jmR"))
    (let* ((out (open-output-file arduino))
           (termios (sys-tcgetattr out)))
      (format #t ";; speed: ~a~%" (sys-cfgetospeed termios))
      (close-output-port out))))

(define (arduino-test msg)
  (let ((arduino "/dev/cu.usbserial-A6008jmR"))
    (let* ((out (open-output-file arduino))
           (in (open-input-file arduino))
           (termios (sys-tcgetattr out)))
      (format #t ";; speed: ~a~%" (sys-cfgetospeed termios))
      (write-char msg out)
      (close-input-port in)
      (close-output-port out))))

;; (arduino-test #\h)
;; (arduino-test #\l)

実はまだ挙動がおかしい。時々反応しなくなる。Arduino IDE でシリアルモニターを開くと治ったり。もう一息だなぁ。
多分いろいろと間違っている。