3 Das UART Multiboard

Die Entscheidung zu Gunsten der Verwendung des Multiboards mit dem Arduino fiel unter anderem, weil unter Verwendung von nur 2 digitalen Ein-/Ausgängen die 4 wesentliche Sensoren einzubinden sind. Die Sensoren sind über industrieübliche BNC-Stecker mit der Auswerteeinheit verbunden. Die Dokumentation erscheint zunächst umfangreich und vollständig.

Mit ein wenig Löterei ist das Multiboard schnell zusammengebracht. Die Messeinheiten (Circuits) für pH, gelösten Sauerstoff, Leitfähigkeit nebst der Sensoren.

Multiboard_w_Ard_u_Circ

Dann wird das in der Beschreibung des Multiboards angeführte Programm compiliert in den Arduino geladen werden und …. dann geschieht nichts. Die im Netz des Herstellers verfügbare Doku gelesen und Ratlosigkeit macht sich breit. Zum Jahreswechsel ändern sich die Demoprogramme. Die Doku der Circuits enthält den Hinweis auf alte Chips mit einer Baudrate von 38400. Die neue Standardbaudrate beträgt 9600. Die neue, unter „pH_EZO_Datasheet“ herunterladbare Information (52 Seiten) nennt auf Seite 26 andere Befehle als die unter Legacy herunterladbare Information „pH_Ciruit_5.0.pdf“ auf Seite 10 von 16 zum gleichen Thema „Setting baud rate“. Der hier genannte Befehl funktioniert, aber die Angabe zum Default?

Die Reduktion des Aufbaus auf einen Schaltkreis auf dem Breadboard und kein Multiboard bringt schon etwas Erleuchtung.

pH_Chip_on_Breadboard

Der neue pH-Schaltkreis ist „nicht neu“. Er entstammt der alten Baureihe sondern aus Mai 2013. Auch die anderen Chips offenbaren entweder andere Versionen als der Aufdruck verrät.  Das Multiboard ist „neu“. Diese Versionenwundertüte kann nicht miteinander laufen. Die in der online-Dokumentation verfügbaren beschriebenen Befehle zum Beispiel das im Serial-Monitor einzugebende „SERIAL,9600“, das mit einer Zeilenrückführung <CR> funktioniert nicht. Die Bibliothek in der alten Doku „altsoftserial.h“ ist nicht zu verwenden.

Es liegen also Bauteile verschiedener Bauserien vor, die möglicherweise einen unterschiedlichen Befehlssatz benötigen? Im vorliegenden Fall konnte das nicht belegt werden. Die in der neuen Doku aufgeführten Befehle funktionieren für die Circuits.

Lediglich die Baudrate-Einstellung in den Zeilen 16 und 17 ist zunächst in der „EZ_com.ino“ auf 38400 zu ändern. Natürlich muss auch der Serial-Monitor mit dieser Geschwindigkeit kommunizieren. Zudem ist er so einzustellen, dass abgehende Befehle um das <CR> ergänzt werden.

#include <SoftwareSerial.h>                                                    //add the soft serial libray
#define rxpin 2                                                                //set the RX pin to pin 2
#define txpin 3                                                                //set the TX pin to pin 3


SoftwareSerial myserial(rxpin, txpin);                                         //enable the soft serial port


String inputstring = "";                                                       //a string to hold incoming data from the PC
String sensorstring = "";                                                      //a string to hold the data from the Atlas Scientific product
boolean input_stringcomplete = false;                                          //have we received all the data from the PC
boolean sensor_stringcomplete = false;                                         //have we received all the data from the Atlas Scientific product


  void setup(){                                                                //set up the hardware
     Serial.begin(9600);                                                      //set baud rate for the hardware serial port to 38400
     myserial.begin(9600);                                                    //set baud rate for software serial port to 38400
     inputstring.reserve(5);                                                   //set aside some bytes for receiving data from the PC
     sensorstring.reserve(30);                                                 //set aside some bytes for receiving data from Atlas Scientific product
     }

Ob die Kommunikation funktioniert, kann mit einem „i“ geprüft werden. Damit entlockt man dem angesprochenen Schaltkreis Informationen über seine Versionsnummer, Firmware-Version und Herstellungsmonat.

Der Befehl „z4“ stellt die Baudrate des Schaltkreises auf 9600 um. Damit ist nun keine Kommunikation über den Serial-Monitor mehr möglich bis im Programm EZ_com.ino die Zeilen 16 und 17 nun wieder auf die Initial im Programm stehende Baudrate 9600 umgestellt sind.

Kurzer Test: Nachdem auch der Serial-Monitor auf die 9600 umgestellt ist, klappt die Kommunikation prima. Das Auslesen von Sensorwerte ohne angeschlossenen Sensor ist zwar sinnfrei aber ebenfalls erfolgreich. Nachdem die bei allen auf dem Multiboard einzusetzenden Sensorschaltkreisen erfolgt und verifiziert ist können die Schaltkreise auf das Multiboard gesetzt werden.

Das für das Multiboard in der Dokumentation verlinkte Programm und die entsprechende gepackte Datei auf der Homepage von Atlas-Scientific waren bis zum 25.01.2015 buggy und disfunktional. Sie ließen sich zum Teil (neue Version) nicht in die Arduino-IDE laden. Im an sich richtigen Quelltext der neuen Dokumentation fehlt eine schließende geschweifte Klammer bei der serialEvent().

Hier die funktionierende Version für das UART-Multiboard:

//1:r<CR>
//2:i<CR>
//3:c<CR>
//4:r<CR>

//To open a channel and not send a command just send the channel number followed by a colon.

//1:<CR>
//3:<CR>

#include <SoftwareSerial.h>
#define rx 2
#define tx 3
//Include the software serial library
//define what pin rx is going to be
//define what pin tx is going to be

SoftwareSerial myserial(rx, tx);
char computerdata[20];
char sensordata[30];
byte computer_bytes_received=0;
byte sensor_bytes_received=0;
int Pin_x = 5;
int Pin_y = 4;
char *channel;
char *cmd;

void setup()
{
  pinMode(Pin_x, OUTPUT);
  pinMode(Pin_y, OUTPUT);
  Serial.begin(9600);
  myserial.begin(9600);
}

void serialEvent()
{
  computer_bytes_received=Serial.readBytesUntil(13,computerdata,20);
  computerdata[computer_bytes_received]=0;
}
void loop()
{
  if(computer_bytes_received!=0)
  {
    channel=strtok(computerdata, ":");
    cmd=strtok(NULL, ":");
    open_channel();
    if(cmd!=0)
    {
      myserial.print(cmd);
      myserial.print("\r");
    }
    computer_bytes_received=0;
  }
  if(myserial.available() > 0)
  {
    sensor_bytes_received=myserial.readBytesUntil(13,sensordata,30);
    sensordata[sensor_bytes_received]=0;
    Serial.println(sensordata);
  }
}

void open_channel()
{
  switch (*channel) 
  {
    case '1':
              digitalWrite(Pin_x, LOW);
              digitalWrite(Pin_y, LOW);
              break;
   case '2':
              digitalWrite(Pin_x, LOW);
              digitalWrite(Pin_y, HIGH);
              break;
   case '3':
             digitalWrite(Pin_x, HIGH);
             digitalWrite(Pin_y, LOW);
             break;
   case '4':
             digitalWrite(Pin_x, HIGH);
             digitalWrite(Pin_y, HIGH);
             break;
  }
}

Nachdem das nun funktioniert und auch mit anderen Terminalprogrammen keine Störungen auftreten, steht die Umsetzung der Kommunikation mit Lazarus an.

 

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.