Nouveau : le pare-feu IA surveille toute la plateforme et explique chaque incident en termes simples. Découvrez comment ça marche

La Uno se réinitialise à chaque ouverture de /dev/ttyUSB0 par mon script Pi

La Uno se réinitialise à chaque ouverture de /dev/ttyUSB0 par mon script Pi

Résolu 5 5

Traduit de Español par IA ·

Je débute un peu, désolé si c’est évident. J’ai un clone d’Arduino Uno (puce CH340) branché en USB sur un Raspberry Pi. La Uno compte les impulsions de l’interrupteur à lames (reed) de mon compteur de gaz et affiche une ligne toutes les 10 s, et un script Python sur le Pi lit ces lignes et les envoie à Hermetry.Problème : à chaque démarrage du script Python (et cron le relance s’il plante), la Uno se réinitialise. Le compteur d’impulsions repart à 0 et les premières secondes de données série sont perdues. Sur la carte dans Hermetry, je vois d’étranges chutes du total de gaz.

ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
# La LED de la Uno clignote, la ligne "boot" arrive, count=0

J’ai lu que c’est la ligne DTR. Comment désactiver DTR sur ttyUSB0 pour que le Pi arrête de réinitialiser l’Arduino ?

Ask me about 4–20 mA.
♥ 0

Traduit de English par IA ·

La solution la plus simple : ne redémarre pas le script. Lance-le comme service systemd avec Restart=always, ouvre le port une seule fois et ne le ferme jamais.

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

Traduit de English par IA ·

Qu’est-ce que DTR ? J’ai le même type de montage pour un compteur d’eau

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

Traduit de English par IA ·

DTR est l’une des anciennes lignes de contrôle de modem. Sur l’Uno, elle passe par un condensateur de 100 nF vers la broche de reset, afin que l’IDE puisse réinitialiser la carte avant un téléversement. Tout programme qui ouvre le port bascule DTR, et la carte se réinitialise. J’ai lutté contre ce problème sur un compteur de lignes au travail l’an dernier.Côté logiciel, deux choses à faire ensemble :

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

Attention : sous Linux, le pilote peut encore activer DTR un instant lors de la toute première ouverture après le démarrage. Cela réduit donc les réinitialisations, sans toujours les supprimer.La solution sûre passe par le matériel : un condensateur de 10 µF entre RESET et GND sur l’Uno, la borne négative sur GND. Il absorbe l’impulsion de reset. Il faut ensuite le retirer (ou appuyer sur reset à la main au bon moment) lorsque vous téléversez un nouveau firmware.Quant aux pertes dans votre total : enregistrez aussi le compteur dans l’EEPROM toutes les quelques minutes, ou faites envoyer à l’Uno un total cumulé depuis le flashage plutôt que depuis le démarrage. Une réinitialisation ne vous coûtera alors que quelques impulsions, et non tout le total.

Ground loops are my cardio.
Solution acceptée♥ 5

Traduit de English par IA ·

+1 pour l’envoi d’un total. Si tu as un jour besoin de la consommation par heure, l’API d’historique et les graphiques peuvent la calculer à partir du compteur.

♥ 0

Traduit de English par IA ·

Merci James. -hupcl seul ne suffisait pas, la première ouverture après un redémarrage réinitialisait toujours la carte, comme tu l’avais dit. J’ai ajouté le condensateur de 10 µF (avec une étiquette sur la carte indiquant « retirer pour téléverser », je l’avais déjà appris à mes dépens) et les réinitialisations ont disparu. J’ai aussi déplacé le script vers systemd, comme l’a suggéré twilson. Tout est stable maintenant.

Ask me about 4–20 mA.
♥ 1
6 sujets de 1 à 6 (sur un total de 6)
  • Vous devez être connecté pour répondre à ce sujet.

Rejoignez la discussion

Connectez-vous pour poser et répondre à des questions, aimer les messages utiles et marquer la réponse qui a résolu votre problème. Chaque contribution rapporte des points et des niveaux.

Partager