Uno setzt sich jedes Mal zurück, wenn mein Pi-Skript /dev/ttyUSB0 öffnet
Von Español mit KI übersetzt ·
Ich bin ein ziemlicher Anfänger, also entschuldigt bitte, falls das offensichtlich ist. Ich habe einen Arduino-Uno-Klon (CH340-Chip), der per USB an einem Raspberry Pi hängt. Der Uno zählt Impulse vom Reed-Kontakt meines Gaszählers und gibt alle 10 s eine Zeile aus. Ein Python-Skript auf dem Pi liest die Zeilen und sendet sie an Hermetry.Problem: Jedes Mal, wenn das Python-Skript startet (und cron es neu startet, falls es abstürzt), setzt sich der Uno zurück. Der Impulszähler geht auf 0 und die ersten Sekunden der seriellen Daten gehen verloren. Auf dem Board in Hermetry sehe ich seltsame Einbrüche beim Gasgesamtwert.
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
# Uno-LED blinkt, "boot"-Zeile kommt, count=0
Ich habe gelesen, dass es an der DTR-Leitung liegt. Wie schalte ich DTR auf ttyUSB0 aus, damit der Pi den Arduino nicht mehr zurücksetzt?
Bit of a beginner so sorry if this is obvious. I have an Arduino Uno clone (CH340 chip) plugged into a Raspberry Pi with USB. The Uno counts pulses from my gas meter’s reed switch and prints a line every 10 s, and a Python script on the Pi reads the lines and sends them to Hermetry.
Problem: every time the Python script starts (and it gets restarted by cron if it crashes), the Uno resets. The pulse count goes back to 0 and the first few seconds of serial are lost. On the board in Hermetry I get these weird drops in the gas total.
ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
# Uno LED blinks, "boot" line comes in, count=0
I read it’s the DTR line. How do I turn DTR off on ttyUSB0 so the Pi stops resetting the Arduino?
Von English mit KI übersetzt ·
Die einfachste Lösung: Starte das Skript nicht neu. Führe es als systemd-Dienst mit Restart=always aus, öffne den Port einmal und schließe ihn nie.
Easiest fix: don’t restart the script. Run it as a systemd service with Restart=always, open the port once and never close it.
Von English mit KI übersetzt ·
Was ist DTR? Ich habe die gleiche Art von Aufbau für einen Wasserzähler
What is DTR? I have the same kind of setup for a water meter
Von English mit KI übersetzt ·
DTR ist eine der alten Modem-Steuerleitungen. Am Uno läuft sie über einen 100-nF-Kondensator zum Reset-Pin, damit die IDE das Board vor einem Upload zurücksetzen kann. Jedes Programm, das den Port öffnet, schaltet DTR um, und das Board resetet sich. Ich habe mich letztes Jahr bei einem Zeilenzähler auf der Arbeit damit herumgeschlagen.Softwareseitig zwei Dinge zusammen:
stty -F /dev/ttyUSB0 -hupcl # don't drop DTR when the port closes
ser = serial.Serial()
ser.port = '/dev/ttyUSB0'
ser.baudrate = 9600
ser.timeout = 2
ser.dtr = False
ser.open()
Vorsicht: Unter Linux kann der Treiber beim allerersten Öffnen nach dem Booten DTR trotzdem kurz setzen. Das reduziert die Resets also, beseitigt sie aber nicht immer.Die sichere Lösung ist Hardware: ein 10-µF-Kondensator zwischen RESET und GND am Uno, Minuspol an GND. Der schluckt den Reset-Impuls. Du musst ihn dann zum Hochladen neuer Firmware wieder herausnehmen (oder im richtigen Moment von Hand die Reset-Taste drücken).Und zu den Aussetzern in deiner Summe: Speichere den Zähler außerdem alle paar Minuten im EEPROM, oder lass den Uno eine laufende Summe seit dem Flashen statt seit dem Booten senden. Ein Reset kostet dich dann ein paar Impulse, nicht die ganze Summe.
DTR is one of the old modem control lines. On the Uno it goes through a 100 nF capacitor to the reset pin, so the IDE can reset the board before an upload. Any program that opens the port toggles DTR, so the board resets. I fought this on a line counter at work last year.
Software side, two things together:
stty -F /dev/ttyUSB0 -hupcl # don't drop DTR when the port closes
ser = serial.Serial()
ser.port = '/dev/ttyUSB0'
ser.baudrate = 9600
ser.timeout = 2
ser.dtr = False
ser.open()
Be warned that on Linux the driver may still raise DTR for a moment on the very first open after boot, so this reduces resets, it doesn’t always kill them.
The sure fix is hardware: a 10 µF capacitor between RESET and GND on the Uno, minus to GND. That swamps the reset pulse. You then have to pull it out (or press reset by hand at the right moment) when you upload new firmware.
And for the drops in your total: also keep the count in EEPROM every few minutes, or have the Uno send a running total since it was flashed instead of since boot. A reset then costs you a few pulses, not the whole total.
Von English mit KI übersetzt ·
+1 zum Senden einer Summe. Falls du jemals den Verbrauch pro Stunde brauchst, können die History-API und die Diagramme ihn anhand des Zählerstands berechnen.
+1 on sending a total. If you ever need consumption per hour, the history API and charts can work it out from the counter.
Von English mit KI übersetzt ·
Danke James. Nur -hupcl hat nicht gereicht, das erste Öffnen nach einem Neustart hat den Reset trotzdem ausgelöst, genau wie du geschrieben hast. Ich habe den 10-µF-Kondensator eingebaut (mit einem Aufkleber auf der Platine „zum Hochladen entfernen“, das habe ich auf die harte Tour schon gelernt), und die Resets sind weg. Außerdem habe ich das Skript wie von twilson vorgeschlagen auf systemd umgestellt. Jetzt läuft alles stabil.
Thanks James. -hupcl alone wasn’t enough, the first open after a reboot still reset it, like you said. Put the 10 µF cap on (with a label on the board saying „remove to upload“, learned that the hard way already) and the resets are gone. Also moved the script to systemd like twilson said. Total is stable now.
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.
Mitdiskutieren
Melde dich an, um Fragen zu stellen und zu beantworten, hilfreiche Beiträge mit „Gefällt mir“ zu markieren und die Antwort zu kennzeichnen, die dein Problem gelöst hat. Jeder Beitrag bringt Punkte und Stufen.

