Arduino Nano V3 unter Mac OS X 10.6 mit Tcl/Tk 8.5

Hallo!

Ich würde die Arduino Nano Plattform (V3.0 - c't Bausatz von segor, ATMEGA328) unter Mac OS X 10.6.2 gerne mit der Skript-Sprache Tcl/Tk 8.5 (oder 8.6) nutzen, jedoch gelingt es mir nicht, über die USB-Schnittstelle /dev/tty.usbserial-09IP6009 Daten an Arduino zu übergeben, beziehungsweise zu lesen. Suchmaschinen- und Forumsrecherchen brachten bisher auch keine Lösung und die Kombinationen möglicher Einstellungen der seriellen Schnittstelle sind schier unendlich. Einzige Reaktion auf dem Arduino-Board: die blaue LED blinkt sehr kurz beim Öffnen der seriellen Schnittstelle unter Tcl.

Die zum Test auf Arduino laufende Anwendung, die Servosteuerung, lässt sich aus der Arduino-Entwicklungsumgebung wie mit screen benutzen, nur eben nicht über ein Tcl-Skript.

Hat jemand schon in der genannten Kombination aus Arduino-Plattform/Betriebssystem/Skript-Sprache eine Kommunikation über USB aufbauen können oder kennt eine Ressource, die die entscheidenden Hinweise oder ein Beispiel-Programm bereithält?

Guter Gruß joshi

Wie sieht dein code denn bisher aus?

Normalerweise willst du 9600baud, 8 Datenbits, 1 Stopbit, keine Parity haben... dafür musst Du auf dem Arduino die serielle Schnittstelle so starten:

Serial.begin(9600);

Hallo!

Der Arduino Code aus der [c’t] sieht folgendermaßen aus:

#include <Servo.h>           // Servo-Bibliothek einbinden 
Servo servo;                 // Servo-Objekt erzeugen
int servoPin = 9;            // Servo wird an Pin 9 angeschlossen
int pos = 0;                 // Variable zum Speichern der Position
void setup() {               // Initialisierung
  Serial.begin(9600);        // Serielle Verb., 9600 baud 
  servo.attach(servoPin);    // Servo mit servoPin verbinden
} 
void loop() { 
  if (Serial.available()) {  // Zeichen verfuegbar?
    pos = Serial.read();     // Zeichen lesen 
    // nur Zeichen zwischen " " und z auswerten
    if ((pos >= 32) && (pos <= 122)) {
      pos = (pos-32)* 2;     // Z.bereich auf Vollausschlag strecken
      servo.write(pos);      // Position an Servo senden
      delay(500);            // Warten, bis Position erreicht wurde
      Serial.println(pos);   // Position bestaetigen
    }
  }
}

Das Tcl-Test-Skript (8.5/8.6) unter Windows XP funktioniert und sieht so aus:

set sid [open COM4 r+]
fconfigure $sid -mode 9600,n,8,1 -buffering full -blocking 0
binary scan hello H* hex
puts -nonewline $sid $hex
close $sid

Die Variante für Mac OS X 10.6.2 funktioniert leider nicht, würde aber wie folgt aussehen:

set sid [open /dev/tty.usbserial-09IP6009 {RDWR NONBLOCK}]
fconfigure $sid -mode 9600,n,8,1 -buffering full
binary scan hello H* hex
puts -nonewline $sid $hex
close $sid

Am Arduino-Code sollte es nicht liegen, auch nicht an den Treibern für den USB/Seriell-Wandler, da es unter WinXP (Arduino Serial Monitor / Tcl-Skript wie oben gezeigt) wie Mac OS X (Arduino Serial Monitor / screen) ja prinzipiell funktioniert. Tcl selbst sollte der Sache nicht im Wege stehen, aber wie sieht es mit dem Mac OS X selbst aus? Die Serielle Schnittstelle ist in beiden Fällen ja schon unterschiedlich anzusprechen – WinXP: [open COM4 r+], Mac OS X: [open /dev/tty.usbserial-09IP6009 {RDWR NONBLOCK}]?

Guter Gruß
joshi

Hallo!

Eine Lösung?!

Der folgende Code scheint für Arduino/Mac OS X/Tcl zu funktionieren:

proc handle {sid} {
  after 100
  set answer [gets $sid]
  puts stdout "answer: '${answer}'"
}

proc input {sid} {
  global forever
  set in [gets stdin]
  if {$in eq "QUIT"} {
    set forever 1
  } else {
    puts -nonewline $sid $in
    flush $sid
  }
}

set sid [open /dev/cu.usbserial-09IP6009 {NONBLOCK RDWR}]
fconfigure $sid -mode 9600,n,8,1
fconfigure $sid -blocking 0 -buffering full
fileevent $sid readable "handle $sid"
puts stdout "type characters between SP(32) and 'z'(122), end with 'QUIT'"

fileevent stdin readable "input $sid"
fconfigure stdin -buffering none

set forever 0
vwait forever
close $sid

Warum nicht /dev/tty.usbserial-09IP6009 sondern /dev/cu.usbserial-09IP6009 das richtige Interface ist und warum die Reihenfolge von NONBLOCK RDWR so entscheidend ist, kann ich leider nicht sagen.

Guter Gruß joshi