Raspberry Pi – Python telnet script voor communicatie met Arduino

python tekst icon

Dit is het python telnet script om te kunnen communiceren met een Arduino welke dit script geladen heeft.

Beste seriële communicatie?
Ik heb een poos lopen zoeken op internet wat het beste te gebruiken is voor Linux om via de seriële poort te communiceren!
Veelal word verwezen naar een “PhpSerial CLASS“!, dit werkt als een SHELL om het Linux STTY commando en werkt niet goed!

Naast dat je diverse STTY instellingen en toegangsrechten moet instellen (voor de dialout group) krijg ik het niet aan de praat via PHP.

Wat werkt dan wel?
Met Linux zit je al snel aan Python, Perl (en evt. C++) als je “low-level” met randapparatuur (COM poort) wilt werken…met PHP kan je niet rechtstreeks een COM poort aansturen;-)
Dus ik heb als oplossing een tussen layer (relay) bedacht met een Python script, welke op commandolijn argumenten werkt om de seriële data door te spelen!

Hoe werkt het “telnet” systeem?
Beide computers wachten op een hekje # om het einde van de data aan te geven, daarna wordt wat met het commando gedaan, hieronder een overzicht:

Raspberry Pi –> commando# –> Arduino –> gegevens# –> Raspberry Pi

Python ‘serial’ module:
Voordat je met python aan de slag gaat, moet je eerst de seriele module voor Python installeren, dit doe je met het commando:  sudo apt-get install python-serial

Ik heb na veel research op het internet en trial-and-error het “seriële relay” script klaar, het commando voor dit script werkt als volgt:

sudo python serialrelay.py [POORT] [COMMANDO] [VLAG]

POORT = De seriele poort USB0 of ACM0 (De seriele poort bij de Arduino NANO is /dev/ttyUSB0 en bij de UNO is het /dev/ttyACM0)
COMMANDO = Het commando voor de Arduino.
VLAG = Verwachten we gegevens terug van de Arduino?, dan blijf  even luisteren voor data (als vlagdata kun je hier alles neerzetten, bijvoorbeeld een 1)

Een voorbeeld om de LED op de Arduino te schakelen: sudo python serialrelay.py USB0 aan

python_telnet_script


Probleem dat het script eindeloos blijft doorlopen

Probleem: Programma blijft eindeloos doorlopen (en kan er voor zorgen dat de Raspberry door de knieën gaat)

Ok, na wat tests blijken we een probleem te hebben, als we de vlag zetten voor het terugverwachten van data, en er komt niets terug van de Arduino (verkeerde commando of hardware problemen) dan blijft het python script eindeloop doorlopen en blijft wachten op ene hekje # vanaf de arduino (die er niet komt), zo kunnen dus veel python processen blijven hangen op de  Raspberry, dat is niet handig!

Na wat speurwerk om een goede oplossing te vinden, heb ik gekozen voor “multiprocessing”, hiemee kun je een python child proces maken met een timer.

Met een timer op een functie, in dit geval genaamd: relay(), kun je python de child en “parent” laten sluiten na een tijdsinterval, je kan met de variabele scripttijd een aantal seconden zetten wanneer het python script moet eindigen.

Het script ziet er nu als volgt uit: