Python: Rasperry >> Arduino via UART

Gast #6709797
Lesenswert?

Hallo zusammen,

ich möchte via UART Steuerkommandos vom Raspberry an meinen Arduino Uno 
schicken

- Arduino ist via USB ans Raspberry gesteckt --> /dev/ttyACM0
- Arduino reagiert aktuell auf '0' und '1'
- Wenn ich den Port via Minicom öffne und dann '0' oder '1' schicke, ist 
alles okay.

Nun mein kleines Skript, dass ich z.B. mit Parameter '0' aufrufe:
1
  
2
import sys
3
import serial
4

5
arduino = serial.Serial(port='/dev/ttyACM0', baudrate=9600)
6

7
if sys.argv[1] == '0':
8
    print("Leuchten links AUS")
9
    arduino.write('0'.encode('utf-8'))
10

11
// ...

- Es wird dann in den If-Zweig gesprungen (print-Ausgabe wird 
ausgegeben), der Arduino reagiert aber nicht.

- Wenn ich die Verbindung zum Arduino schon vorher per Minicom geöffnet 
habe und dann das Skript aufrufe, kommen dessen Kommandos zum Arduino 
korrekt durch (Mir war ehrlich gesagt nicht klar, dass überhaupt zwei 
Anwendungen "gleichzeitig" den Port nutzen können, scheint aber so zu 
sein. Jedenfalls sehe ich in der Minicom parallel auch die Antworten des 
Arduinos (die ich in meinem Skript aktuell nicht auswerte) ...)

- Ich habe verschiedene Varianten des Wartens (Stumpf 1 Sekunde warten 
nach öffnen des Port, warten solange nicht is_open(), verschiedene 
timeouts gesetzt) probiert, bringt alles keine Veränderung

- serial ist übrigens pyserial

- Ist mit Python 2 und 3 anscheinend erstmal das gleiche Verhalten...

Kann sich (oder noch besser mir ;)) da jemand einen Reim draus machen?

Viele Grüße
Peer
Gast #6709811
Lesenswert?

Es tut mir leid, aber ich habe tatsählich just in diesem Moment noch 
etwas herausgefunden. Nach dem Öffnen zu warten funktioniert, wenn es 
lang genug ist, also WIRKLICH lange...:
1
import sys
2
import serial
3
arduino = serial.Serial(port='/dev/ttyACM0', baudrate=9600)
4

5
time.sleep(2)
6

7
if sys.argv[1] == '0':
8
    print("Leuchten links AUS")
9
    arduino.write('0'.encode('utf-8'))
10
// ...

--> Dann gehts.. Aber es kann doch keine 2s dauern, bis der Port 
vernünftig geöffnet ist??

Und wenn dem so wäre: Wie kann ich darauf wirklich prüfen? is_open() hat 
ja bei mir leider nicht funktioniert..

Viele Grüße npochmal,#
Peer
Gast #6709967
Lesenswert?

Der Arduino macht nach dem Öffnen der seriellen Verbindung einen 
Neustart.
Verwende besser eine zusätzliche serielle Schnittstelle (SoftwareSerial) 
dafür.
Oder du lässt die Verbindung ständig bestehen, dann sollte es direkt 
funktionieren.
Gast #6710072
Lesenswert?

Werner schrieb:
> Brain 2.0 schrieb:
>
>> Der Arduino macht nach dem Öffnen der seriellen Verbindung einen
>> Neustart.
>
> Da bin ich aber sehr skeptisch.

Es würde mich ehrlich gesagt auch überraschen, immerhin initialisiere 
ich den Port ja auch auf dem Arduino... Ein Neustart würde dann ja zu 
einer endlosen Geschichte werden... Oder meinst wie meinst du das?
#6710087
Lesenswert?

Damit die Arduino IDE ein neues Programm hochladen kann, muss es eine 
Möglichkeit geben, den Arduino über Reset in den Bootloader zu bringen. 
Dies wird über das Steuersignal DTR bewirkt.

Um also mit dem Anwendungsprogramm auf dem Arduino über die serielle 
Schnittstelle zu kommunizieren, ohne den Arduino zu resetten, darf beim 
Öffnen der Schnittstelle das DTR-Signal nicht angefasst werden. Wie das 
im Einzelfall erreicht werden kann, hängt vom Betriebssystem und der 
Programmiersprache bzw. der jeweiligen seriellen Library ab.
Gast #6710112
Lesenswert?

Mario M. schrieb:
> Damit die Arduino IDE ein neues Programm hochladen kann, muss es eine
> Möglichkeit geben, den Arduino über Reset in den Bootloader zu bringen.
> Dies wird über das Steuersignal DTR bewirkt.
>
> Um also mit dem Anwendungsprogramm auf dem Arduino über die serielle
> Schnittstelle zu kommunizieren, ohne den Arduino zu resetten, darf beim
> Öffnen der Schnittstelle das DTR-Signal nicht angefasst werden. Wie das
> im Einzelfall erreicht werden kann, hängt vom Betriebssystem und der
> Programmiersprache bzw. der jeweiligen seriellen Library ab.

Plausible Erklärung. Auf dem Raspberry das DTR-Signal zu deaktivieren 
eine  Lösung.

https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0#27706
Gast #6710336
Lesenswert?

Werner schrieb:
> Brain 2.0 schrieb:
>
>> Der Arduino macht nach dem Öffnen der seriellen Verbindung einen
>> Neustart.
>
> Da bin ich aber sehr skeptisch.

Wenn der RaspPi beim Öffnen der Ports mit der DTR-Leitung wackelt, MACHT 
der Arduino einen Neustart, wenn man das Wackeln unterbindet, macht er 
das nicht.
Gast #6710421
Lesenswert?

Werner schrieb:
> Plausible Erklärung. Auf dem Raspberry das DTR-Signal zu deaktivieren
> eine  Lösung.

Ja, dem muss ich mich jetzt auch wieder anschließen! ;)

Brain 2.0 schrieb:
> Sorry, etwas ausführlicher.

Tatsächlich hätte etwas mehr Kontext geholfen, aber gelogen wars ja 
nicht ;) Danke so oder so!

Werner schrieb:
> 
https://raspberrypi.stackexchange.com/questions/9695/disable-dtr-on-ttyusb0#27706

--> So habe ich es jetzt auch gemacht: in der /etc/rc.local die Zeile
1
stty -F /dev/ttyACM0 -hupcl

ergänzt, alles gut (So funktioniert es problemlos auch nach Neustart. 
Puh, da muss man aber erstmal drauf kommen, aber hat ja mit Eurer Hilfe 
funktioniert. Thema geschlossen!
Gast #6710988
Lesenswert?

Wenn ein Arduino(UNO)an den PI Über USB? angeschlossen werden meldet er 
sich Über /dev/USBtty0 an. Wenn man was auf /dev/ttyACM0 schreibt 
interssiert das den Arduino wenig.

Damit man das doch über /dev/ttyACM0 zeige doch mal einen 
SchaltPLan(Skitze)
danach können sich die Vorredner über DTR und Rest selbbst zerreissen.

so. Ahnungsloser
Gast #6710990
Lesenswert?

Ahnungsloser schrieb:
> Wenn ein Arduino(UNO)an den PI Über USB? angeschlossen werden
> meldet er
> sich Über /dev/USBtty0 an. Wenn man was auf /dev/ttyACM0 schreibt
> interssiert das den Arduino wenig.
>
> Damit man das doch über /dev/ttyACM0 zeige doch mal einen
> SchaltPLan(Skitze)
> danach können sich die Vorredner über DTR und Rest selbbst zerreissen.
>
> so. Ahnungsloser

Die verwendete Schnittstelle findet man mit "lsusb" heraus.

immernoch

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren