Forum: Mikrocontroller und Digitale Elektronik Python: Rasperry >> Arduino via UART


von Peer (Gast)


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

von Peer (Gast)


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

von Brain 2.0 (Gast)


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.

von Werner (Gast)


Lesenswert?

Brain 2.0 schrieb:

> Der Arduino macht nach dem Öffnen der seriellen Verbindung einen
> Neustart.

Da bin ich aber sehr skeptisch.

von Peer (Gast)


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?

von Mario M. (thelonging)


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.

von Werner (Gast)


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

von Brain 2.0 (Gast)


Lesenswert?

Sorry, etwas ausführlicher.
Der Neustart erfolgt beim Öffnen des seriellen Monitors.

von Wolfgang (Gast)


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.

von Joachim B. (jar)


Lesenswert?

Wolfgang schrieb:
> wenn man das Wackeln mit der DTR-Leitung unterbindet

auch wenn man DTR nicht zum Arduino bringt!
Wer braucht denn DTR für UART Kommunikation?

von Peer (Gast)


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!

von Ahnungsloser (Gast)


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

von Ahnungsloser (Gast)


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

von Ahnungsloser (Gast)


Lesenswert?

Sorry /dev/ttyUSB0 und nicht /dev/USBtty0

Ahnungsloser

von Brain 2.0 (Gast)


Lesenswert?

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

Ok....nur wer Arduino kennt, kennt auch das "Problem".

von Rainer V. (a_zip)


Lesenswert?

Brain 2.0 schrieb:
> Ok....nur wer Arduino kennt, kennt auch das "Problem".

Jetzt bin ich aber wirklich froh, hier reingelesen zu haben. Habe mir 
gerade ein paar Arduino's zum Spielen (nicht am Rasp) geordert und hätte 
an so etwas ganz sicher nicht gedacht!
Danke und Gruß, Rainer

von Rainer V. (a_zip)


Lesenswert?

...doch...nach einem Blick ins Schaltbild fällt einem doch wohl auf, 
dass vom CH340 der Pin DTR mit dem Reset des Controllers verbunden ist. 
Bin da übrigens schon mal drüber gestolpert, weil es auch 340'er mit 
Reset Eingang gibt...
Gruß Rainer

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.