Novedad: el cortafuegos de IA supervisa toda la plataforma y explica cada incidente con palabras sencillas. Vea cómo funciona

Uno resets every time my Pi script opens /dev/ttyUSB0

Uno resets every time my Pi script opens /dev/ttyUSB0

Resuelto 5 5

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?

Ask me about 4–20 mA.
♥ 0

Traducido del English por IA ·

La solución más fácil: no reinicies el script. Ejecútalo como servicio de systemd con Restart=always, abre el puerto una vez y nunca lo cierres.

If it isn't logged, it didn't happen.
♥ 0

Traducido del English por IA ·

¿Qué es DTR? Tengo el mismo tipo de montaje para un contador de agua

Timestamps in UTC or it didn't happen.
♥ 0

Traducido del English por IA ·

DTR es una de las antiguas líneas de control de módem. En el Uno pasa por un condensador de 100 nF hasta el pin de reset, para que el IDE pueda reiniciar la placa antes de cargar un programa. Cualquier programa que abra el puerto cambia DTR, y la placa se reinicia. Yo me peleé con esto en un contador de líneas en el trabajo el año pasado.Por el lado del software, dos cosas juntas:

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()

Ojo: en Linux, el controlador puede seguir activando DTR un momento en la primera apertura tras el arranque, así que esto reduce los reinicios, pero no siempre los elimina.La solución segura es el hardware: un condensador de 10 µF entre RESET y GND en el Uno, con el negativo a GND. Eso absorbe el pulso de reset. Después tienes que quitarlo (o pulsar reset a mano en el momento adecuado) cuando subas un nuevo firmware.Y para las caídas en tu total: guarda también el conteo en la EEPROM cada pocos minutos, o haz que el Uno envíe un total acumulado desde que se flasheó en lugar de desde el arranque. Así, un reinicio te costará unos pocos pulsos, no todo el total.

Ground loops are my cardio.
Solución aceptada♥ 5

Traducido del English por IA ·

+1 a enviar un total. Si alguna vez necesitas el consumo por hora, la API de historial y los gráficos pueden calcularlo a partir del contador.

♥ 0

Traducido del English por IA ·

Gracias James. Solo -hupcl no bastó, la primera apertura después de un reinicio seguía reiniciándolo, como dijiste. Puse el condensador de 10 µF (con una etiqueta en la placa que dice «quitar para cargar», eso ya lo aprendí por las malas) y los reinicios desaparecieron. También pasé el script a systemd, como sugirió twilson. Todo está estable ahora.

Ask me about 4–20 mA.
♥ 1
Viendo 6 entradas – de la 1 a la 6 (de un total de 6)
  • Debes estar registrado para responder a este debate.

Únete a la conversación

Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

Compartir