Tengo un proyecto de máquina expendedora existente, medio completo, que se ejecuta en un Atmel UTC, que quiero portar al Pi.
Para comunicarse con los periféricos, como el aceptador de monedas, debe admitir el bus multipunto que tiene una interfaz de puerto serie de 9 bits de datos (además de bits de inicio, parada y paridad).
Aprendí de la manera difícil con la placa Atmel que piratea lo que uno encuentra sugerido en la red, que depende del uso del bit de paridad, ya que el noveno bit de datos puede causar problemas de temporización difíciles de detectar y corregir (así que, por favor, no referirme a esto , o similar. Gracias).
¿Alguien sabe si / dónde puedo comprar un verdadero puerto serie de 9 bits para el Pi (puntos de bonificación si de alguna manera puede funcionar con el Pi cero).
¿Hay, tal vez, un sombrero disponible? ¿O podría fácilmente (tengo un tipo / w, con poco conocimiento de h / w) usar otra placa para manejar el UART de 9 bits de datos y controlarlo desde un Pi?
Respuestas:
Mi biblioteca pigpio admite la lectura y escritura de datos en serie de 9 bits. Utiliza bit banging para que pueda usar cualquier GPIO disponible.
Si no recuerdo mal, cualquier velocidad de 19.2 kbps o más lenta fue bastante estable.
¿Qué bits por segundo necesitas?
Leer ( C , Python ) es un poco más fácil que escribir ( C , Python ).
fuente
Me asignaron un proyecto para ejecutar una máquina expendedora de bocadillos que utiliza el protocolo MDB para el pago y he completado el proyecto con Pi Zero (naranja).
He intentado bibliotecas de serie de hardware y software de 9 bits y tuve problemas de sincronización en Pi Zero. La comunicación serial de 9 bits de MDB se convirtió en una molestia. El protocolo MDB dice que los periféricos deben tener un% 5 de tolerancia para el tiempo de comunicación en serie, sin embargo, los diferentes proveedores de periféricos tienen diferentes tolerancias, no cumplen con el protocolo MDB. Cuando cree que ha logrado la comunicación en serie pero prueba con un periférico de pago de otro proveedor, simplemente no funciona. Por lo tanto, no confíe en la hoja de datos del protocolo MDB. Me cansé y cansé de implementar el controlador MDB para vendedores con errores. Además, algunos periféricos pueden drenar cantidades excesivas de corriente de los pines uart durante su proceso de arranque interno y pueden dañar su capa de comunicación en serie. Entonces, es mejor que uses una abstracción. Los optoacopladores están bien, pero aún así no lo haría No recomiendo manejar la comunicación serial MDB usando Pi Zero. La mejor manera es usar un enfoque de capa media usando un AVR.
En lugar de usar Uart en Pi Zero para la comunicación MDB, utilicé un AVR Atmega328 para el manejo, sondeo, etc. de Atmga328. Atmega328 controla los periféricos MDB usando la biblioteca de serie de software y envía datos legibles por humanos a Pi Zero en serie de hardware. Todos los esquemas electrónicos, las fuentes y la imagen Pi Zero Armbian, el código Python para las operaciones de Vending están disponibles aquí:
http://eliverse.com/content/vendiverse/
Puede consultar la página wiki para obtener más detalles sobre el control de motores, sensores de entrega de productos, refrigeradores y pantallas LCD de caracteres. Es un proyecto completo de controlador de máquinas expendedoras y está siendo utilizado por un par de productores de máquinas expendedoras.
fuente
También hice una demostración completa para la emulación UART de 9 bits (basada en paridad par / impar). Puede encontrarlo en http://bohdan-danishevsky.blogspot.com/2016/10/9-bit-serial-communication-in-linux.html .
Todas las fuentes disponibles en git.
Puede adaptarlo fácilmente a su dispositivo. Espero que te guste.
fuente
Todos los datos en serie son, por definición, 1 bit. Depende de las interfaces leer y escribir esos datos cómo acordar cómo interpretan los bits hacia y desde datos significativos.
Si desea 9 bits de datos, y un bit de paridad, y un bit de parada y un bit de inicio. Luego, depende de usted convertir sus datos a ese formato e interpretar los datos que lee en ese formato. El módulo pigpio mencionado en otra respuesta le dará la interfaz de hardware que necesita, o puede escribir la suya propia. Si está desarrollando en Python, le sugiero que eche un vistazo al módulo bitString.py de Scott Griffiths como una biblioteca que hace que sea bastante fácil manipular datos basados en bits.
fuente
Definitivamente prefiero UART de hardware sobre la implementación de software como lo hace pigpio.
Puede usar el bit de paridad para la comunicación de 9 bits. Hay un pequeño problema: el núcleo actual no tiene soporte CMSPAR (paridad de espacio / marca).
Pero podría cambiar la paridad par / impar para obtener el valor de noveno bit deseado incluso con el núcleo actual, por ejemplo:
Un mejor enfoque en mi humilde opinión es utilizar un parche de kernel pequeño para el soporte CMSPAR:
http://marc.info/?l=linux-serial&m=145706834101241&w=2
Agrega soporte de paridad de marca / espacio, lo que permite que el código sea un poco más simple.
PD: implementé MDB en serie con este enfoque. Funciona en Pi sin problemas.
El parche PPS ha sido aprobado y CMSPAR funcionará de manera inmediata comenzando con el kernel 4.6.
fuente
No es CONFIABLE conectar la serie RPi directamente al bus MDB debido al formato de 9 bits y a los estrictos tiempos de MDB. Los mensajes entre el periférico MDB y RPi deben convertirse sobre la marcha y en tiempo real. Consulte este enlace que ayudará: Convertidor DIY MDB-UART
fuente
La respuesta aceptada, que utilizaba un procesador Atmel con datos verdaderos de 9 bits URT que se comunicaba con un Pi, parece haber sido abandonada o tomada comercialmente.
Así que voy con https://www.vendingtools.ro/en para Eur 70, y eso conectará mi Pi con el bus de bits de datos MDB 9.
[Actualizar]
Ver también
https://www.qibixx.com/en/products/mdb-interface/
https://blog.abrantix.com/webshop/product/mdb-to-raspberry-pi/
fuente