Conecté la salida RS-232 de un viejo indicador de báscula directamente al GPIO de la Pi 4, y llegan caracteres raros
Traducido del Türkçe por IA ·
Hola, soy programador de software y el lado del hardware me resulta un poco ajeno, así que decidme si estoy diciendo tonterías.En la entrada del almacén de un cliente hay un viejo indicador de báscula con una salida DB9 RS-232 en la parte trasera. Según el manual, imprime el peso línea por línea en cada pesada. Mi objetivo es leerlo con una Raspberry Pi 4, enviarlo a Hermetry como telemetría y después mostrar el tonelaje diario en un dashboard.Lo que hice: conecté los pines 2, 3 y 5 del DB9 con cables jumper a los pines GPIO14 (TX), GPIO15 (RX) y GND de la Pi. Activé el puerto serie desde raspi-config. En Python lo leo así:
import serial
s = serial.Serial('/dev/serial0', 9600, timeout=2)
while True:
print(s.readline())
La salida es esta:
b'ùæ þ'
b'ø '
b'àþ'
No sale nada con sentido. Además, de vez en cuando aparece en una terminal algo parecido a mi propia pantalla de login, y tampoco lo entendí. Tampoco estoy seguro de si voy a quemar el indicador o la Pi, porque medí con un multímetro algo como -9 V en la salida del indicador.
Selam, ben yazılımcıyım, donanım tarafı biraz yabancı, o yüzden saçmalıyorsam söyleyin.
Bir müşterinin depo girişinde eski bir kantar göstergesi var, arkasında DB9 RS-232 çıkışı var. Kılavuza göre her tartımda satır satır ağırlık basıyor. Amacım bunu Raspberry Pi 4 ile okuyup Hermetry’ye telemetri olarak göndermek, sonra dashboard’da günlük tonaj göstermek.
Yaptığım: DB9’un 2, 3 ve 5 numaralı pinlerini jumper kabloyla Pi’nin GPIO14 (TX), GPIO15 (RX) ve GND pinine bağladım. raspi-config’den serial’i açtım. Python’da şöyle okuyorum:
import serial
s = serial.Serial('/dev/serial0', 9600, timeout=2)
while True:
print(s.readline())
Çıktı şöyle:
b'ùæ þ'
b'ø '
b'àþ'
Hiç anlamlı bir şey yok. Bir de arada bir terminalde kendi login ekranım gibi bir şey çıkıyor, onu da anlamadım. Göstergeyi ve Pi’yi yakar mıyım diye de içim rahat değil açıkçası, gösterge çıkışında multimetreyle -9 V gibi bir şey ölçtüm.
Traducido del Türkçe por IA ·
¿Es correcta la velocidad en baudios? Podría ser 4800 o algo así en el menú del indicador.
Baud doğru mu? Göstergenin menüsünde 4800 falan olabilir.
Traducido del Türkçe por IA ·
Miré en el menú, dice 9600 8N1. El manual también lo indica.
Menüden baktım, 9600 8N1 yazıyor. Kılavuz da öyle diyor.
Traducido del Türkçe por IA ·
No es la velocidad en baudios, es la tensión. Si mediste -9 V, la respuesta ya está ahí.La señal RS-232 oscila aproximadamente entre ±3 y ±15 V y su lógica es invertida: en reposo es negativa, el «1» es negativo y el «0» es positivo. La UART de la Pi, en cambio, es TTL de 3,3 V, de 0 a 3,3 V, con lógica normal. Al conectarlas directamente, tanto el nivel como la polaridad son incorrectos, y esos caracteres basura en la salida son exactamente lo que cabe esperar. Además, aplicar una tensión negativa y unos 9 V al GPIO15 puede dañar el pin. Desconéctalo ya; es cuestión de suerte que la Pi siga en buen estado.En dos de mis instalaciones hice el mismo trabajo y usé dos caminos:1. Módulo MAX3232 (MAX3232, no MAX232; funciona a 3,3 V). VCC a los 3,3 V de la Pi, el lado TTL a GPIO14/15 y el lado RS-232 al DB9. 2. La opción más limpia: un convertidor USB-RS232 (chip PL2303 o FTDI). Aparece como /dev/ttyUSB0 y no tienes que tocar nada del GPIO.Sobre la pantalla de inicio de sesión: la consola serie de la Pi está abierta en /dev/serial0. En raspi-config > Interface > Serial Port, responde No a «login shell over serial» y Sí a «serial port hardware».Y sobre el cruce de TX/RX: no sabemos si la báscula es DCE o DTE. Si no llegan datos, intercambia los pines 2 y 3.Enviar los datos a Hermetry después es sencillo: con paho y un token de acceso, publicas en v1/telemetry:
import re, json, serial
import paho.mqtt.client as mqtt
c = mqtt.Client(client_id="kantar-1")
c.username_pw_set(TOKEN, "")
c.tls_set()
c.connect(BROKER_HOST, 8883, keepalive=60)
c.loop_start()
s = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
while True:
line = s.readline().decode('ascii', 'ignore')
m = re.search(r'(-?d+.d+)s*kg', line)
if m:
c.publish("v1/telemetry", json.dumps({"weight_kg": float(m.group(1))}), qos=1)
Baud değil, voltaj sorunu. -9 V ölçtüysen zaten cevap orada.
RS-232 sinyali yaklaşık ±3 ile ±15 V arası ve mantığı ters: boşta negatif, «1» negatif, «0» pozitif. Pi’nin UART’ı ise 3.3 V TTL, 0 ile 3.3 V arası ve düz mantık. Doğrudan bağlayınca hem seviye hem polarite yanlış, çıktıdaki çöp tam olarak bu. Üstelik GPIO15’e negatif ve 9 V civarı gerilim vermek pini öldürebilir. Hemen sök, Pi’nin hâlâ sağlam olması şans.
Bende iki depoda aynı iş var, iki yol kullandım:
1. MAX3232 modülü (MAX232 değil, 3232; 3.3 V ile çalışan). VCC’yi Pi’nin 3.3 V’una ver, TTL tarafı GPIO14/15, RS-232 tarafı DB9’a. 2. Daha temizi: USB-RS232 çevirici (PL2303 ya da FTDI çipli). /dev/ttyUSB0 olarak çıkıyor, GPIO ile hiç uğraşmıyorsun.
Login ekranı meselesi: Pi seri konsolu /dev/serial0 üzerinden açık. raspi-config > Interface > Serial Port’ta «login shell over serial» sorusuna Hayır, «serial port hardware» sorusuna Evet de.
Bir de TX/RX çaprazlaması: gösterge DCE mi DTE mi bilmiyoruz. Veri gelmezse 2 ile 3’ü yer değiştir.
Okuduktan sonra Hermetry’ye gönderme kısmı basit, paho ile access token’la v1/telemetry‘ye yayınlıyorsun:
import re, json, serial
import paho.mqtt.client as mqtt
c = mqtt.Client(client_id="kantar-1")
c.username_pw_set(TOKEN, "")
c.tls_set()
c.connect(BROKER_HOST, 8883, keepalive=60)
c.loop_start()
s = serial.Serial('/dev/ttyUSB0', 9600, timeout=2)
while True:
line = s.readline().decode('ascii', 'ignore')
m = re.search(r'(-?d+.d+)s*kg', line)
if m:
c.publish("v1/telemetry", json.dumps({"weight_kg": float(m.group(1))}), qos=1)
Traducido del Türkçe por IA ·
Convertirlo a número con una regex es importante. Si el indicador imprime texto como " 12.45 kg" y lo envías tal cual, en Hermetry se queda como texto, no se dibuja en el gráfico y no sale ni la media horaria ni el total. En un proyecto enviamos texto durante dos semanas y, cuando nos dimos cuenta, los datos históricos no servían para nada.
Regex’le sayıya çevirmesi önemli. Gösterge " 12.45 kg" gibi metin basıyorsa ve onu olduğu gibi gönderirsen Hermetry’de metin olarak kalır, grafikte çizilmez, saatlik ortalama ya da toplam da çıkmaz. Biz bir projede iki hafta metin göndermişiz, fark ettiğimizde geçmiş veri işe yaramıyordu.
Traducido del Türkçe por IA ·
Resuelto, gracias.No encontré un convertidor USB-RS232, así que conseguí un módulo MAX3232 con el técnico de electrónica. Lo conecté, seguían saliendo caracteres basura, luego, como dijo Esra, crucé los pines 2 y 3, y las líneas empezaron a llegar bien. También desactivé la consola serie, la pantalla de login desapareció. El GPIO15 también salió bien, tuve suerte.Gracias a la nota de Tuğba, weight_kg sale como número desde el principio, y se dibuja una gráfica en el dashboard.
Çözüldü, sağ olun.
USB-RS232 çevirici bulamadım, elektronikçiden MAX3232 modülü aldım. Bağladım, yine çöp geldi, sonra Esra’nın dediği gibi 2 ile 3’ü çaprazladım, satırlar düzgün gelmeye başladı. Seri konsolu da kapattım, login ekranı kayboldu. GPIO15 da sağlam çıktı, şanslıymışım.
Tuğba’nın notu sayesinde ilk günden weight_kg sayı olarak gidiyor, dashboard’da grafik çiziliyor.
- 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.

