Monday 12 December 2016

Arduino Shift Out Binary Options

Este proyecto implica descodificar varias entradas (en este caso 7) para mostrarlas como valores numéricos en una pantalla de siete segmentos (SSD) usando algo llamado Binary Coded Decimal (BCD), una matriz de diodos y un micro - chip llamado BCD4511 (o CD4511). Tuve una curva de aprendizaje muy empinada con este proyecto y exploré un número entero de opciones diferentes, incluyendo el uso de mi Arduino con shift-in y shift-out registros para la conservación de pines de E / S. Sin embargo, al final encontré esta solución para ser más robusto y quería recopilar toda la información útil que reuní durante mi búsqueda para que otros puedan tener un trabajo más fácil en hacer lo mismo. Paso 1: matriz de diodos Quería hacer una exhibición de posición de engranaje para mi moto como Ill se quita el ensamblaje de tablero existente como parte de convertirlo en una bicicleta de carreras. La moto tiene un interruptor dentro de la caja de cambios que conecta a tierra uno de los siete pines a la vez para indicar qué engranaje (o neutro) está seleccionado. Todo esto está bien y bien, pero conectar esos cables directamente a los pines de un SSD crearía un lío que inevitablemente alojaría errores de over-lap, ya que las partes de una conexión serían cortas a otras y empezaría a mostrar una combinación de Número 1 y 2 y así sucesivamente. Introduzca la matriz de diodos. Este perrito pequeño consigue alrededor de los errores causados ​​por tener que conectar segmentos del SSD juntos, y permite que cada conexión puesta a tierra (o entrada) exhiba solamente las piezas del SSD que usted desea. Al principio iba a utilizar únicamente la Matriz de Diodos para conducir el SSD, pero si cuentas los diodos requeridos en la imagen su alrededor de 33 (demasiada soldadura para mi gusto). Así que aquí es donde entran en juego los microcircuitos BCD4511 y Binary Coded Decimal (BCD). Quiero almacenar datos en serie de un Arduino, y ponerlos a disposición de un segundo Arduino para leer. ¿Existe un IC que puede recibir datos en serie, almacenarlos y enviarlos cuando sea necesario? Una solución que se me ha ocurrido es emparejar un registro de desplazamiento de serie a paralelo con un registro de desplazamiento paralelo a serie. Entonces podría, cambio de datos desde el primer Arduino en el registro de desplazamiento de serie a paralelo. Después de esto, los datos podrían ser desplazados fuera del registro de desplazamiento paralelo a serie y leídos por el segundo Arduino. Me gustaría encontrar un chip que podría hacer esto. ¿Existe uno existe preguntó 05 de mayo a las 5:49 cerrado como fuera de tema por tcrosley. Daniel Grillo. PeterJ. Asmyldof. Uint128t 5 de mayo a las 14:25 Esta pregunta parece estar fuera de tema. Los usuarios que votaron a cerrar dieron esta razón específica: quotQuestions buscando recomendaciones para productos específicos o lugares para comprarlos son fuera de tema, ya que rara vez son útiles para otros y rápidamente obsoletos. En su lugar, describa su situación y el problema específico que está tratando de resolver. Quot ndash tcrosley, Daniel Grillo, PeterJ, Asmyldof, uint128t Si esta pregunta puede ser reformulada para ajustarse a las reglas del centro de ayuda. Por favor, editar la pregunta. Cuántos datos que esperan para almacenar en el registro de desplazamiento Sólo un byte Más ndash duskwuff 5 de mayo a las 5:54 ¿Incluso tiene que almacenar los datos ¿Podría salir con una conexión directa y algunos software trickery ndash Sam 5 de mayo a las 7:02 ¿Cómo se desplaza los datos - cómo arbitrar ¿Cómo sabes que has leído los datos ¿Cómo sabes que han llegado nuevos datos Cuánto datos se pueden almacenar - ¿cómo informarás al destinatario qué Los nuevos datos están disponibles y qué tamaño En el estado de la clase su problema y don39t indica lo que usted piensa pudo ser un remedio porque su remedio está lleno de agujeros. Ndash Andy aka 05 de mayo a las 7:38 Como Andy Akas comenta, hay muy probablemente más a esto que un solo pin para el envío y recepción de datos, y actualmente la pregunta falta detalle importante. Sin embargo, esbozar una de las opciones puede ayudarle a entender el detalle que necesita una respuesta. Algunos ejemplos del tipo de detalle que puede ser importante, en ningún orden en particular, para responder a la pregunta: Tasa de datos - la rapidez con la que los datos deben ser transferidos latencia - cuánto tiempo puede ser el retraso entre el envío y la recepción de datos son los datos Bit o byte orientado, y es binario arbitrario es la transferencia de una manera o son sus algunos casos de uso que requieren transferencias bidireccionales por ejemplo Puede cualquiera de los extremos iniciar una transferencia puede Arduino 2 solicitud de datos, o es sólo controlado por Arduino 1, p. El esclavo estará siempre listo para recibir datos, o es su posibilidad de que no esté disponible o podría perder datos y, por lo tanto, puede necesitar una retransmisión de cuántos pines Arduino están disponibles para implementar el mecanismo de transferencia cuánto CPU overhead es aceptable para lograr La velocidad de datos en el emisor y el receptor es de 20 disponibles, o 10s / byte, puede bloquear uno o ambos extremos en espera de una transferencia sobre qué distancia va a pasar la transferencia, pulgadas (cm), yardas (m), millas ) Youre esquema sugiere que hay sólo una pequeña cantidad de datos en cada transferencia, pero incluso eso no está claro. La solución más sencilla es conectar los periféricos Arduinos ATmega SPI, Arduino 1 como maestro y Arduino 2 como esclavo. Esto requiere al menos dos pines, reloj y MOSI, entre Arduino 1 y Arduino 2. Es el mismo número de pines que serían utilizados por cualquier solución basada en registro de desplazamiento síncrono utilizando chips externos el periférico SPI ATmegas a bordo está diseñado para Implementar el mismo mecanismo. Si la transferencia a veces puede ser más rápida o más temprana que el esclavo, Arduino 2, puede usar los datos, entonces un buffer sería algo de RAM en la recepción (esclavo, Arduino 2) ATmega. O un pin adicional podría ser utilizado para enviar datos de vuelta desde el esclavo, Arduino 2. al maestro, Arduino 1 para controlar la velocidad de transmisión. El control de flujo se manejaría en software, y no por el periférico SPI. El ATmegas SPI periférico transfiere 8 bits a la vez, lo que parece comparable con el contorno de la solución. El ATmega SPI periférico es síncrono, y por lo tanto tiene una señal de reloj, generada por el maestro. El reloj puede detenerse mientras no hay datos para transferir. El SPI esclavo establecerá un indicador cuando se haya recibido un byte. Así que hay una manera de informar al esclavo que los datos están listos. Además, el periférico SPI esclavo puede elevar una interrupción cuando se ha recibido un byte, de manera que una rutina de servicio de interrupción que se ejecuta en el esclavo puede copiar el byte en un búfer en RAM. Por lo tanto, la transferencia no necesita limitarse a un byte. Además, el periférico SPI maestro puede elevar una interrupción cuando la transferencia de un byte está completa, de manera que una rutina de servicio de interrupción podría enviar múltiples bytes de datos desde un búfer en RAM con una sobrecarga relativamente pequeña. El SPI periférico es capaz de enviar y recibir datos simultáneamente, por lo que cualquier conexión que el software que se ejecuta en el maestro puede necesitar para asegurar que no está enviando datos demasiado rápido también se puede implementar en su software. Además, debido a que la velocidad de datos periférica SPI puede ser de hasta 4Mbit / segundo, la velocidad de transmisión de datos es más alta que una transferencia asíncrona y es tan rápida como la ATmega podría transferir datos a través de cualquier conexión en serie a un dispositivo externo. Además, la latencia (intervalo de tiempo) entre el envío de datos del maestro al esclavo puede ser bastante baja, a unos pocos ciclos de reloj por encima de 2s. A este ritmo, podría tener sentido enviar cantidades menores de datos si las necesidades de transferencia de datos son menores que un byte a la vez. Finalmente, el periférico SPI también soporta una señal de habilitación o selección, de manera que más de un dispositivo esclavo puede ser accionado por un maestro. Por supuesto, todo esto podría ser implementado en software, sin el uso del SPI periférico, pero utilizando sólo digital de lectura y escritura de pines GPIO. Algún beneficio sería un enfoque de software podría utilizar cualquier pines disponibles, y la transferencia no tendría que ser byte orientado, o utilizar un paquete de tamaño byte. El software se transferirá más lentamente y tendrá una sobrecarga de CPU más grande que el periférico SPI de hardware, pero es más flexible. print () Descripción Imprime los datos en el puerto serie como texto ASCII legible por el usuario. Este comando puede tomar muchas formas. Los números se imprimen utilizando un carácter ASCII para cada dígito. Los flotadores se imprimen de forma similar como dígitos ASCII, predeterminando a dos decimales. Los bytes se envían como un solo carácter. Los caracteres y cadenas se envían tal cual. Por ejemplo: Serial. print (78) da 78 Serial. print (1.23456) da 1.23 Serial. print (N) da N Serial. print (Hello world.) Da Hello world. Un segundo parámetro opcional especifica que la base (formato) a utilizar los valores permitidos son BIN (binario o base 2), OCT (octal o base 8), DEC (decimal o base 10), HEX (hexadecimal o base 16) . Para los números de coma flotante, este parámetro especifica el número de posiciones decimales a utilizar. Por ejemplo: Serial. print (78, BIN) da 1001110 Serial. print (78, OCT) da 116 Serial. print (78, DEC) da 78 Serial. print (78, HEX) da 4E Serial. println (1.23456, 0 ) Da 1 Serial. println (1.23456, 2) da 1.23 Serial. println (1.23456, 4) da 1.2346 Puede pasar cadenas basadas en la memoria flash a Serial. print () envolviéndolas con F (). Por ejemplo. Sintaxis Serial. print (val) Serial. print (val, format) Parámetros val: el valor a imprimir - cualquier formato de tipo de datos: especifica la base numérica (para tipos de datos integrales) o el número de decimales Sizet (long): print () devuelve el número de bytes escritos, aunque leer ese número es opcional Ejemplo: / Utiliza un bucle FOR para los datos e imprime un número en varios formatos. / Int x 0 // variable void configuración 40 41 123 Serial. Begin 40 9600 41 // abrir el puerto serie a 9600 bps: 125 void loop 40 41 123 // imprimir etiquetas Serial. Print 40 quotNO FORMATquot 41 // imprime una etiqueta Serial. Print 40 quot t quot 41 // imprime una ficha Serial. Impresión 40 quotDECquot 41 Serial. Impresión 40 quot t quot 41 Serie. Impresión 40 quotHEXquot 41 Serie. Impresión 40 quot t quot 41 Serie. Impresión 40 quotOCTquot 41 Serial. Impresión 40 quot t quot 41 Serie. Impresión 40 quotBINquot 41 Serial. Imprimir 40 quot t quot 41 para 40 x 0 x lt 64 x 41 123 // sólo parte del gráfico ASCII, cambiar a // imprimir en muchos formatos: Serial. Impresión 40 x 41 // impresión como un decimal codificado en ASCII - igual que quotDECquot Serial. Print 40 quot t quot 41 // imprime una ficha Serial. Impresión 40 x. DEC 41 // imprimir como una serie decimal codificada en ASCII. Print 40 quot t quot 41 // imprime una ficha Serial. Impresión 40 x. HEX 41 // imprimir como una serie hexadecimal codificada en ASCII. Print 40 quot t quot 41 // imprime una ficha Serial. Impresión 40 x. OCT 41 // imprimir como una serie octal codificada en ASCII. Print 40 quot t quot 41 // imprime una ficha Serial. Println 40 x. BIN 41 // print como un binario codificado en ASCII // luego agrega el retorno de carro con quotprintlnquot demora 40 200 41 // delay 200 milisegundos 125 Serial. Println 40 quotquot 41 // imprime otro retorno de carro 125 Consejos de programación A partir de la versión 1.0, la transmisión en serie es asíncrona Serial. print () volverá antes de que se transmitan caracteres.


No comments:

Post a Comment