Yeni: Yapay zekâ güvenlik duvarı tüm platformu izliyor ve her olayı sade bir dille açıklıyor. Nasıl çalıştığını görün

Python betiğim /dev/ttyUSB0 dosyasını açtığında Uno sıfırlanıyor

Python betiğim /dev/ttyUSB0 dosyasını açtığında Uno sıfırlanıyor

Çözüldü 5 5

Yapay zekâ tarafından Español dilinden çevrildi ·

Biraz acemiyim, bariz bir şeyse kusura bakmayın. USB ile bir Raspberry Pi’ye takılı, CH340 çipli bir Arduino Uno klonum var. Uno, gaz sayacımın reed anahtarından gelen darbeleri sayıyor ve her 10 saniyede bir satır yazdırıyor; Pi üzerindeki bir Python betiği bu satırları okuyup Hermetry’ye gönderiyor.Sorun şu: Python betiği her başladığında (çökerse cron tarafından yeniden başlatılıyor) Uno sıfırlanıyor. Darbe sayısı 0’a dönüyor ve seri iletişimin ilk birkaç saniyesi kayboluyor. Hermetry’deki kartta gaz toplamında bu garip düşüşleri görüyorum.

ser = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
# Uno LED'i yanıp sönüyor, "boot" satırı geliyor, count=0

Bunun DTR hattından kaynaklandığını okudum. Pi’nin Arduino’yu sıfırlamasını durdurmak için ttyUSB0 üzerinde DTR’yi nasıl kapatabilirim?

Ask me about 4–20 mA.
♥ 0

Yapay zekâ tarafından English dilinden çevrildi ·

En kolay çözüm: betiği yeniden başlatma. Restart=always ayarlı bir systemd servisi olarak çalıştır, portu bir kez aç ve hiç kapatma.

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

Yapay zekâ tarafından English dilinden çevrildi ·

DTR nedir? Bir su sayacı için de aynı türden bir kurulumum var

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

Yapay zekâ tarafından English dilinden çevrildi ·

DTR, eski modem kontrol hatlarından biridir. Uno’da bu hat 100 nF’lık bir kapasitörden geçerek reset pinine bağlanır; böylece IDE, yüklemeden önce kartı resetleyebilir. Portu açan her program DTR’yi değiştirir ve kart resetlenir. Geçen yıl işte bir satır sayacında aynı sorunla uğraştım.Yazılım tarafında iki şeyi birlikte yapın:

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

Şunu da bilin: Linux’ta sürücü, önyüklemeden sonraki ilk açılışta DTR’yi bir an için yine yükseltebilir; yani bu yöntem resetleri azaltır ama her zaman tamamen önlemez.Kesin çözüm donanımsal: Uno’da RESET ile GND arasına, eksi GND’ye gelecek şekilde 10 µF’lık bir kapasitör koyun. Bu, reset darbesini bastırır. Ancak yeni firmware yüklerken bunu çıkarmanız (veya doğru anda resete elle basmanız) gerekir.Toplam değerdeki kayıplar için: sayımı her birkaç dakikada bir EEPROM’a da kaydedin ya da Uno’nun önyüklemeden değil, firmware yüklendiği andan itibaren çalışan toplamı göndermesini sağlayın. Böylece bir reset, toplamın tamamını değil, yalnızca birkaç darbeyi kaybettirir.

Ground loops are my cardio.
Kabul edilen çözüm♥ 5

Yapay zekâ tarafından English dilinden çevrildi ·

Toplam değer gönderilmesi konusunda +1. Saatlik tüketime ihtiyacın olursa, geçmiş API’si ve grafikler bunu sayaç değerinden hesaplayabilir.

♥ 0

Yapay zekâ tarafından English dilinden çevrildi ·

Teşekkürler James. Yalnızca -hupcl yetmedi, yeniden başlatmadan sonraki ilk açılış yine resetledi, dediğin gibi. 10 µF kondansatörü taktım (kartın üzerine “yüklemek için çıkarın” yazan bir etiket koyarak, bunu zor yoldan zaten öğrenmiştim) ve resetler kesildi. Ayrıca scripti twilson’ın dediği gibi systemd’ye taşıdım. Artık sistem tamamen kararlı.

Ask me about 4–20 mA.
♥ 1
6 yazı görüntüleniyor – 1 ile 6 arası (toplam 6)
  • Bu konuyu yanıtlamak için giriş yapmış olmalısınız.

Sohbete katılın

Soru sormak ve yanıtlamak, yararlı gönderileri beğenmek ve sorununuzu çözen yanıtı işaretlemek için oturum açın. Her katkı puan ve seviye kazandırır.

Paylaş