Beispiel | Linux PC oder Raspberry steuert zwei Arduinos

Vorlage

Beispiel: Raspberry oder Linux-PC Steuert zwei Arduinos im automatischen Betrieb mit Fernwartung.

Arduino Board 2 (Sketch-Id 111) sendet die Änderungen des Potentiometers über USB an den Raspberry Pi.

Der Raspberry stellt über USB die entsprechende Blinkfrequenz auf Arduino Board 1 (Sketch-Id 110) ein. Auf Wunsch kann die aktuelle Blinkfrequenz im EEPROM für den nächsten Start gespeichert werden.

Die USB-Verbindungen werden automatisch hergestellt und überwacht.


C Programm für Linux-PC oder Raspberry

Vorlage

Die vorgestellte Lösung zeigt die Möglichkeiten von Projekt c/ und kann als Vorlage für ähnliche Projekte verwendet werden.

Die vollständigen Implementierungen für Linux-PC oder Raspberry und Arduino findet man im Projektordner unter c/arduino/pcuno110.

Mit dem Befehl 'x Detatch Screen' kann eine Terminalsitzung beendet werden ohne das Programm zu beenden. Siehe Fernsteuern mit ssh.

Vorlage

Mit dem Befehl 'a Automatisch steuern'> werden die USB-Verbindungen mit den Sketch-Id's hergestellt und überwacht.

Projekt c/ Programme können in den Keyboardabfragen Rückruffunktionen für Dateiinputs installieren. Das Modul comapi.h verwendet diese Möglichkeit für die USB-Inputs. Diese Funktionen wurden in ioncon.h mit Linux select() implementiert.

Vorlage

Programm pcuno110 kann also in einer der Keybordabfragen (siehe iocon.h) parken und die Steuerung durchführen ohne unnötig Systemzeit zu verbrauchen.

Nach dem Verlassen von 'a Automatisch steuern' läuft die Steuerung weiter. Die USB-Verbindungen werden dann aber nicht mehr überwacht.

Vorlage

Mit dem Befehl 'i Infos' können Debuginfos ausgegeben werden.

USB-Devices
Die erste Zeile zeigt die Suchliste für USB-Devices mit Wildcards.

Globale Variablen:
Die globalen Variablen (siehe vars.h) können während der Laufzeit erzeugt werden und man kann im ganzen Programm über Namen (z.B. "Freq") zugreifen. Die Variablen können aus Konfigurationsdateien gelesen und geschrieben werden.

Com-Objekte
Jede USB-Verbindung wird mit einem Com-Objekt verwaltet. Alle Com-Objekte werden automatisch in die Liste ComLst eingetragen und entfernt. (siehe comapi.h)

Für eine neue USB-Verbindung wird zuerst mit ComNew(0,Sketch-Id) ein Com-Objekt angelegt. Mit ComOpenSketchId( Com, Wildcards) wird danach die richtige USB-Verbindung gesucht und geöffnet.


OpenCount: Damit können Unterbrechungen erkannt werden.
InListSize: Maximale Anzahl offener Antworten. Jede Anfrage bekommt eine eindeutige Antwortnummer (InSlot).
AlarmTask: Empfangsstruktur für Alarmmeldungen vom Arduino an Master.
Alarm: Alarmfunktion für Alarmmeldungen. Nur für Com[1] mit SketchId 111 gesetzt.

Vorlage

Mit 'd Debug' kann man in den Debugmodus schalten. Danach kann der Datenverkehr im Terminal beobachtet werden.
Die genaue Beschreibung der seriellen Kommunikation findet man in c/lib/libraries/com/com.h.

>[80](0c)[ff] Datenblock an Board 2 gesendet. [80] Befehl CMD_GET_ID. Sketch-Id des Boards abfragen. (0c) Aktuelle Antwortnummer (InSlot). - Keine Datenbytes. [ff] Ende Datenbytes und Blockende. <[80](0c)110[ff] Datenblock vom Board 2 empfangen. [80] Befehl CMD_GET_ID. (0c) InSlot. Antwort auf Anfrage 0x07. 110 3 Datenbytes ASCII<0x80. Sketch-Id vom Board. [ff] Ende Datenbytes und Blockende <[ae](00)862[ff]InSlot ist Alarmslot Alarmmeldung von Board 2 [ae] Befehlsnummer frei wählbar. Hier nicht verwendet. (00) Alarmslot immer 0x00. 862 3 Datenbytes ASCII<0x80. Gemessener Potentiometerwert 862. [ff] Ende Datenbytes und Blockende. >[a0](00)32[ff] Reaktion vom PC: Blinkfrequenz auf Board 1 einstellen. [a0] User-Befehl CMD_SET_Hz. Blinkfrequenz einstellen. (00) Alarmslot. PC erwartetet keine Bestätigung auf dem Alarmslot! 32 2 Datenbytes ASCII<0x80. ms für Blinkfrequenz zum Wert 862. [ff] Ende Datenbytes und Blockende.

Es folgen Ausschnitte der C Sourcen. Die vollständigen C-Implementierungen findet man im Projektordner unter c/arduino/pcuno110.


C++ Programme für Arduino

Es folgen Ausschnitte der C++ Sourcen für die Arduinos.

Die Programme für die Arduinos findet man im Projektordner unter:


Fernsteuerung mit ssh

Für die Fernsteuerung wird der Fenstermanager screen verwendet. Mit screen kann das Programm auch ohne Terminalfenster oder Console laufen.

Mit dem Projekt c/ Programm screenstart kann die Verwendung von screen vereinfacht werden.


Programmlinks in bin/

Für die praktische Arbeit ist es günstig, im Home-Ordner ein Verzeichnis bin/ für symbolische Programmlinks anzulegen. Dieser Ordner wird in die Suchliste $PATH eingetragen. Damit können die Programme ohne Pfadangaben gestartet werden.

Das Programm pcuno110 wird in einem beliebigen Terminal mit screenstart pcuno110 gestartet.
Mit dem Befehl 'x Detatch Screen' kann nun die Terminalsitzung beendet werden. Das Steuerung läuft aber weiter.
Die Kontrolle kann dann in jedem Terminal mit demselben Aufruf screenstart pcuno110 übernommen werden.


screenstart infos screenstart -i pcuno110 zeigt Programminfos.

Programm screenstart sorgt dafür, dass immer genau eine Instanz von pcuno110 und genau eine Screensitzung 'pcuno110' läuft.

screenstart -h zeigt alle Optionen an.



Automatischer Betrieb

crontab Mit dem Aufruf von 'crontab -e' kann ein vollautomatischer Betrieb programmiert werden.

pcuno110 nach dem booten automatisch gestartet. Danach wird periodisch geprüft, ob das Programm läuft. Wenn nicht, dann wird es wieder gestartet.

Die Einstellungen:

Debugging:

[    Beispiele    ]

Günther Schardinger. GNU C Linux, objektorientiert gcc make makefile C++ Qt Arduino Raspberry Pi 3, GPIO WiringPi i2c Bus, BCM Broadcom, RASPIAN Debian Jessie, C im 21. Jahrhundert, Programmieren in C, Makefiles, Terminalausgaben