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:
- 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
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...:
--> 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
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.
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?
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.
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
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.
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?
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!
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
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
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".
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
...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