Todo comenzó cuando el autor compró un dispositivo interesante en el mercado secundario: Smart Response XE (
Estos dispositivos fueron descontinuados hace varios años, y lo que las escuelas compraron por $100-$200 cada uno ahora aparece en eBay por $10 o menos. El hardware que hay allí es muy adecuado para experimentos geek:
- teclado de 60 teclas
- pantalla con una resolución de 384×136, 2 bits por píxel, similar a BC, CGA, pero 4 no colores, sino gradaciones de brillo
- microcontrolador ATmega128RFA1 (memoria flash de 128 kB, ROM de 4 kB, RAM de 16 kB, transceptor 802.15.4)
- Memoria flash externa (en relación con el microcontrolador, no con todo el dispositivo) de 1 megabit (128 kilobytes) con interfaz SPI
- Compartimento para 4 elementos AAA.
Por el nombre del microcontrolador se desprende claramente que pertenece a la familia AVR, lo que significa que hacer que el dispositivo sea compatible con Arduino es una tarea más que trivial...
De las noticias en adelante
Pero al autor le interesa más la posibilidad no de jugar en el dispositivo, sino de estudiar:
- memoria flash con interfaz serial SPI
- cargadores de arranque para AVR
- estándar 802.15.4
El autor comenzó escribiendo
Esto es suficiente para cargar el gestor de arranque Arduino, pero no el boceto: el puerto serie no está conectado allí, por lo que aún no puede prescindir de abrir la carcasa. Además, las líneas TX0 y RX0 del primer puerto serie se combinan con las líneas de sondeo de la matriz del teclado, es decir, aquellas que sondean las teclas de función en los lados de la pantalla. Pero, ¿qué puedes hacer? El autor creó esto:
Llevó las líneas JTAG allí y ahora no es necesario abrir el compartimento de la batería. Y para poder subir bocetos conecté ambos puertos serie al mismo conector, agregando también un interruptor, porque con las baterías instaladas es físicamente imposible apagar el dispositivo de otra forma.
Me llevó bastante tiempo trabajar con un soldador, una navaja y una pistola de pegamento. En general, cargar bocetos "por aire" es mucho más conveniente, necesitamos urgentemente inventar algo para esto.
Arduino IDE utiliza el programa para cargar bocetos
Después de probar diferentes formas de superar este problema, al autor se le ocurrió lo siguiente. El dispositivo tiene una memoria flash de 128 KB con una interfaz SPI: recibimos datos a través de cables (recuerde que el autor ya tiene un dispositivo con un conector en el lateral), usamos esta memoria como buffer y enviamos los datos por radio. canal a otro dispositivo. Hola desde Cybiko.
Después de escribir el código para trabajar con el canal de radio, así como la fuente, el cargador alcanzó una longitud de más de 4 kilobytes. Por lo tanto, el valor HFUSE tuvo que cambiarse de 0xDA a 0xD8. Ahora el gestor de arranque puede tener hasta 8 kilobytes de longitud y la dirección inicial ahora es 0x1E000. Esto se refleja en el Makefile, pero también se debe tener en cuenta al completar
El transceptor 802.15.4 del ATmega128RFA1 está diseñado originalmente para funcionar utilizando el protocolo
Resultó que los canales menos susceptibles a las interferencias WiFi son 15 y 26. El autor eligió el segundo de ellos. Descargo de responsabilidad: el traductor no sabe si está permitido simplificar ZigBee de esta manera. ¿Quizás deberíamos programar un poco más e implementarlo por completo?
En el primer dispositivo, es necesario implementar una máquina de estados finitos que transmita datos mediante el protocolo STK500. En su mayor parte, los mensajes transmitidos y recibidos son autosuficientes, pero algunos están ligados a los que pasaron anteriormente por el canal. Se da la descripción del diálogo.
Un componente importante de este diálogo es la transmisión de paquetes destinados a escribirse en la memoria flash del dispositivo de destino. Para los microcontroladores simples de la familia AVR, el tamaño de página es de 128 bytes, pero para el ATmega128RFA1 es de 256. Y para la memoria flash que se conecta mediante el protocolo SPI, ocurre lo mismo. El programa en el primer dispositivo, al cargar un boceto, no lo transfiere inmediatamente al segundo, sino que lo escribe en esta memoria. Cuando el IDE de Arduino comprueba la exactitud de la entrada, envía lo que estaba escrito allí. Ahora necesitamos transmitir los datos recibidos por canal de radio al segundo dispositivo. Al mismo tiempo, el cambio de recepción a transmisión y viceversa ocurre con bastante frecuencia. El protocolo STK500 es indiferente a los retrasos, pero no tolera la pérdida de datos (es extraño, pero se dijo anteriormente que los retrasos también afectan la transferencia de datos). Y las pérdidas durante la transmisión inalámbrica son inevitables. El ATmega128RFA1 tiene una implementación de hardware incorporada para solicitudes repetidas cuando hay dudas sobre la exactitud de la transferencia, pero el autor decidió implementar lo mismo en el software. Desarrolló un protocolo en el que fluyen muchos más datos en un sentido que en el otro.
No es perfecto, pero funciona. La página de 256 bytes se divide en cuatro segmentos, cada uno de los cuales se transmite por aire como un paquete. Un paquete puede contener hasta 125 bytes de datos más un byte de longitud y dos bytes de CRC. Por lo tanto, allí se colocan fragmentos de 64 bytes de longitud junto con los números de página y de segmento (de 0 a 3). El dispositivo receptor tiene una variable que le permite rastrear cuántos segmentos se han recibido y, cuando llegan los cuatro, el dispositivo emisor recibe la confirmación de que se ha recibido la página completa. Sin confirmación (CRC no coincidió): reenvíe la página completa. La velocidad es incluso mayor que cuando se transmite por cable. Ver:
Pero, en general, sería necesario prever una forma cómoda de conectar el cable a los dispositivos para cargar bocetos y a través de él. Por ejemplo, coloque un convertidor de interfaz en el CP2102 dentro, como en la foto, y péguelo a la placa para que pueda soportar la fuerza al conectar y desconectar el cable Micro USB.
También tiene un estabilizador de 3,3 voltios (y cómo usarlo en un dispositivo con una fuente de alimentación de 6 voltios; si solo tiene el mismo estabilizador y puede agregar dos diodos para seleccionar automáticamente cuál de ellos alimentará el dispositivo) . Los tres LED deben desoldarse de la placa convertidora de interfaz; de lo contrario, cargarán aún más las baterías cuando funcionen con ellos y también interferirán con el sondeo del teclado y el funcionamiento con la memoria flash con una interfaz SPI.
Perseguir una meta resultó ser aún más interesante que lograrla (y no hace falta ese chiste sobre el autobús). El autor aprendió mucho sobre los cargadores de arranque AVR, la memoria flash SPI, el protocolo STK500 y el estándar 802.15.4.
Todo el resto del código además de la biblioteca descrita anteriormente es:
Fuente: habr.com