Bei dem über die letzten Wochen stagnierenden Projekt „Modelleisenbahn-Beleuchtungssteuerung“ hab ich heute eine Weiche neu gestellt: Anstelle des zwar komfortablen, aber leider im Rahmen meiner eher geringen Arduino-C-Kenntnisse unerwartet störrischen PJON-Protokolls habe ich auf das simplere SoftwareSerial gewechselt. Da gibt’s zwar keine automatische Integritätsprüfung, Zustellungsgarantie und anderen Komfort, aber der sowieso schon enge Speicher im Arduino Nano ist mit der viel kompakteren SoftSerial-Bibliothek wieder fast zur Hälfte frei.
Die Idee:
Der System-Sender wandelt seine über Ethernet eintreffenden Befehle zu Seriell und schickt sie einfach blind über den einen Bus-Draht in die Anlage. Alle Schalter hören permanent zu, und wenn sie sich angesprochen fühlen, dann führen sie ihren Befehl aus. Keine Rückmeldung, nur Hoffnung.
Nachdem ich heute nur den Sender umgeschrieben habe (mit viel, viel Online-Suche nach Lösungen, die mir was sagen … Classes wie die SoftwareSerial in anderen Classes zu verwenden, ist zwar im Prinzip logisch, aber C hat seine Eigentümlichkeiten, die ich schlichtweg zu schlecht beherrsche), hier nur ein Foto vom Oszilloskop, das ein Datenpaket geschnappt hat. Sieht doch eigentlich ganz sauber aus, vom Signal her …
Ach ja, Notiz für mich selber:
#ifndef toytrainserialsender_h #define toytrainserialsender_h #include "Arduino.h" #include "SoftwareSerial.h" class toytrainserialsender { private: SoftwareSerial* softser; public: toytrainserialsender(); void setup( ); void send( byte recipient, char *sometext ); void loop(); }; #endif
und passend dazu:
#include "Arduino.h" #include "SoftwareSerial.h" #include "toytrainserialsender.h" toytrainserialsender::toytrainserialsender() { } void toytrainserialsender::setup() { Serial.println("SoftSerial TX pin = 2"); softser = new SoftwareSerial(3,2); softser->begin(9600); } void toytrainserialsender::send(byte recipient, char *sometext) { char mybuf[64]; snprintf( mybuf, sizeof mybuf, "T%i:%s", recipient, sometext ); softser->println(mybuf); } void toytrainserialsender::loop() { /* nothing to do yet */ }