Una vez terminado de desarrollar los nodos y ser instalados en su sitio final puede ser que con el tiempo necesitemos actualizar el código grabado en el microcontrolador, el sketch, ya sea para añadir más funcionalidades o simplemente porque había un error o mal comportamiento que se nos paso por alto y que hay que arreglar.
Si nos encontramos en esa situación puede darse dos casos, o bien nos toca desmontar el nodo del lugar en el que este instalado, lo cual puede darnos bastante trabajo si estaba empotrado o escondido, para luego conectarlo por USB y programarlo, o bien le actualizamos el código de forma inalámbrica si desde un principio lo preparamos para soportar actualizaciones FOTA.
Para soportar este tipo de programación a distancia es necesario que tanto el hardware como el software este preparado para ello, a continuación explico como se haría para los nodos de interruptor que he fabricado aunque esto podría aplicarse para otros proyectos.
Configurar fuses del microcontrolador
Mediante un programador ISP lo primero que debemos hacer es comprobar que los fuses del microcontrolador estén correctamente configurados, si usamos un microcontrolador virgen lo normal es que venga configurado para funcionar a 1Mhz con el oscilador interno, por lo que deberíamos de configurarlo para que funcione a 8Mhz con oscilador interno o externo, o a 16Mhz.
Aquí explique cómo se graban los fuses, en cuanto a la configuración para 8Mhz con oscilador interno y externo son las siguientes respectivamente:
1 2 3 4 5 6 7 8 9 |
Internal 8Mhz: LOW = 0xE2 HIGH = 0xDA EXTENDED = 0x06 External 8Mhz: LOW = 0xFF HIGH = 0xDA EXTENDED = 0x06 |
Grabar bootloader
Hay disponibles gran variedad de bootloaders para Arduino, en el caso de los nodos para MySensors se recomienda usar MYSBootloade o Dualoptiboot, resumiendo las diferencias de uno y de otro son las siguientes:
MYSBootload:
En caso de que el proceso de grabado del nuevo sketch se interrumpa se puede recuperar el nodo volviéndoselo a enviar. Sin embargo es necesario cambiar el código de la antena RF que usemos.
Dualoptiboot:
No requiere modificar el código de la antena, pero necesita un chip de memoria flash externo y si se interrumpe el grabado el nodo queda inutilizado hasta que volvamos a grabarlo por USB.
Para profundizar un poco mas sobre este bootloader que es el que conozco, la forma en que funciona es la siguiente: El software encargado de actualizar el sketch, por ejemplo MYSController, envía el nuevo sketch en formato .HEX al nodo en cuestión, entonces el sketch que tiene grabado actualmente lee el nuevo código que le están enviando y lo va grabado según llega en el chip de memoria flash externo, cuando finaliza la recepción de todos los datos el microcontrolador se reinicia automáticamente, es entonces cuando el bootloader comprueba el chip externo y al haber un nuevo sketch lo que hace es leerlo y grabarlo en la memoria interna del microcontrolador, luego ejecuta el código y el nodo sigue funcionado con el nuevo código.
Esto obliga a que el sketch del microcontrolador no tenga errores (bucles o pausas infinitas, desbordamientos de memoria, etc.) y tenga activado las opciones de actualización inalámbrica, ya que debido a que es él quien lee del RF y graba a la flash externa la información, si se corrompe nadie mas podrá hacerlo.
En mi caso me he decantado por Dualoptiboot, para grabarlo en el microcontrolador la forma mas sencilla es que añadamos al IDE de Arduino un nuevo tipo de placa el cual lo incluye, así solo tendremos que seleccionarla y darle a grabar, aquí explican como se añade la nueva placa Sensebender Micro.
El chip de memoria flash hace uso del bus ISP mas un cable extra como Cable Select o SS, si en vuestro caso habéis usado el pin D8 como en la placa Sensebender Micro podréis usar el bootlader que incluye… sin embargo si como en mi caso habéis personalizado el pin SS por otro distinto sera necesario crear un nuevo bootloader con el pin correcto para después compilarlo de nuevo, es la única forma de decirle al bootloader con qué pin debe comunicarse con el chip flash externo.
Compilar Dualoptiboot con código personalizado
Es un proceso algo tedioso pero una vez tengamos todo configurado compilarlo tantas veces como necesitamos no nos costara nada.
1) Descargamos Atmel Studio desde aquí y lo instalamos en el ordenador, es un IDE de programación bastante pesado ya que se basa en Visual Studio.
2) Descargamos este proyecto de Atmel Studio que contiene el bootloader Dualoptiboot que usaremos como base para personalizarlo. (Es el bootloader del Gateway que compre 😉 )
3) Desde Atmel Studio abrimos el proyecto y tenemos que ir a sus propiedades para configurar algunas cosas antes de tocar código. A estas propiedades se puede ir con el atajo de teclado Alt+F7, veremos que aparecen 3 campos que tendremos que configurar de la siguiente forma:
Make file Name
Es el directorio del bootloader Dualoptiboot, veremos que dentro tiene un fichero que se llama Makefile, tendremos que indicar la ruta en el que se encuentra incluido el nombre del fichero.
Build Commandline
Los los parametros que se añadirán al comando make que crea el nuevo bootloader con extensión .HEX, en mi caso aplico el valor
atmega328 F_CPU=8000000L para especificar el microcontrolador para el que se ha de compilar el código y la frecuencia del cristal a usar, en mi caso 8Mhz, si usamos 16Mhz debemos utilizar el valor
16000000L
Clean Commandline
Esto hay que dejarlo con el valor
clean
4) Ahora abrimos desde Atmel Studio el fichero optiboot.c y deberemos editar las lineas siguientes:
1 2 3 4 5 6 7 8 9 10 11 12 |
/******************* SPI FLASH Code **********************************/ #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) #define FLASHSS_DDR DDRC // <<= Valor 1: "Dirección de memoria donde se encuentra el bloque de pines" #define FLASHSS_PORT PORTC // <<= Valor 2: "Bloque de pines" #define FLASHSS PINC0 // <<= Valor 3: "Pin 0 del bloque de pines indicado" #define SS PINB2 #elif defined (__AVR_ATmega1284P__) || defined (__AVR_ATmega644P__) #define FLASHSS_DDR DDRC #define FLASHSS_PORT PORTC #define FLASHSS PINC7 #define SS PINB4 #endif |
Será necesario modificar las constantes FLASHSS_DDR, FLASHSS_PORT y FLASHSS por los valores correspondientes al pin que estemos usando como pin SS para la memoria flash, en mi caso el pin A0. En la documentación de Arduino especifican los valores que se ha de usar para cada pin, ya que no se da valor de igual forma que cuando programamos un sketch.
1 2 3 4 5 6 7 8 9 10 11 12 |
//SPI INIT #if defined(__AVR_ATmega168__) || defined(__AVR_ATmega328P__) || defined(__AVR_ATmega88) || defined(__AVR_ATmega8__) || defined(__AVR_ATmega88__) DDRB |= _BV(SS) | _BV(PB3) | _BV(PB5); DDRC |= _BV(FLASHSS); //OUTPUT for FLASH_SS // <<= Valor 4:Inicialización del pin SS FLASH_UNSELECT; PORTB |= _BV(SS); #elif defined (__AVR_ATmega1284P__) || defined (__AVR_ATmega644P__) DDRC |= _BV(FLASHSS); //OUTPUT for FLASH_SS DDRB |= _BV(SS) | _BV(PB5) | _BV(PB7); FLASH_UNSELECT; PORTB |= _BV(SS); #endif |
Para terminar con las modificaciones del código sera necesario cambiar el valor 4 por el correspondiente al que hayamos usado, en mi caso DDRC.
5) Por ultimo deberemos de guardar y pulsar en el botón de ejecutar, o F5, para que se compile el nuevo bootloader que creara en la carpeta del proyecto, un fichero con el nombre: optiboot_atmega328.hex
Grabar bootloader personalizado
De nuevo, la forma mas sencilla de hacerlo es instalando la placa Sensebender Micro y después sustituir el bootloader que incluye por el nuestro, la ruta donde se encuentran los ficheros de Sensebender Micro se puede obtener desde el IDE yendo al menú: Archivo > Preferencias, y en la parte inferior veremos una ruta de nuestro ordenador donde esta guardado el fichero de preferencias del IDE y lo que hayamos instalado. (atentos al fichero preferences.txt que sera necesario modificar en el ultimo paso)
Una vez en ese directorio deberemos de navegar hasta: packages\MySensors\hardware\avr\1.0.1\bootloaders\DualOptiboot y remplazar el bootloader por el nuestro (usando el mismo nombre). Después ya solo nos quedara grabarlo con el programador ISP.
Otra forma de hacerlo es modificando el fichero boards.txt de Arduino que se encuentra en el directorio: [Directorio principal de tu IDE Arduino]\hardware\arduino\avr\boards.txt, yo siempre prefiero editar ese fichero ya que no me gusta tener placas de mas en el desplegable, por eso comento o borro las lineas de las placas de Arduino que no tengo ni voy a usar, este es mi fichero y al final se ve el bloque que he añadido con la nueva placa «MySensors Node»:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 |
# See: http://code.google.com/p/arduino/wiki/Platforms menu.cpu=Processor ############################################################## diecimila.name=Arduino Duemilanove diecimila.upload.tool=avrdude diecimila.upload.protocol=arduino diecimila.bootloader.tool=avrdude diecimila.bootloader.low_fuses=0xFF diecimila.bootloader.unlock_bits=0x3F diecimila.bootloader.lock_bits=0x0F diecimila.build.f_cpu=16000000L diecimila.build.board=AVR_DUEMILANOVE diecimila.build.core=arduino diecimila.build.variant=standard diecimila.upload.maximum_size=30720 diecimila.upload.maximum_data_size=2048 diecimila.upload.speed=57600 diecimila.bootloader.high_fuses=0xDA diecimila.bootloader.extended_fuses=0x05 diecimila.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex diecimila.build.mcu=atmega328p ############################################################## uno.name=Arduino Uno uno.vid.0=0x2341 uno.pid.0=0x0043 uno.vid.1=0x2341 uno.pid.1=0x0001 uno.vid.2=0x2A03 uno.pid.2=0x0043 uno.vid.3=0x2341 uno.pid.3=0x0243 uno.upload.tool=avrdude uno.upload.protocol=arduino uno.upload.maximum_size=32256 uno.upload.maximum_data_size=2048 uno.upload.speed=115200 uno.bootloader.tool=avrdude uno.bootloader.low_fuses=0xFF uno.bootloader.high_fuses=0xDE uno.bootloader.extended_fuses=0x05 uno.bootloader.unlock_bits=0x3F uno.bootloader.lock_bits=0x0F uno.bootloader.file=optiboot/optiboot_atmega328.hex uno.build.mcu=atmega328p uno.build.f_cpu=16000000L uno.build.board=AVR_UNO uno.build.core=arduino uno.build.variant=standard ############################################################## leonardo.name=Arduino Leonardo leonardo.vid.0=0x2341 leonardo.pid.0=0x0036 leonardo.vid.1=0x2341 leonardo.pid.1=0x8036 leonardo.vid.2=0x2A03 leonardo.pid.2=0x0036 leonardo.vid.3=0x2A03 leonardo.pid.3=0x8036 leonardo.upload.tool=avrdude leonardo.upload.protocol=avr109 leonardo.upload.maximum_size=28672 leonardo.upload.maximum_data_size=2560 leonardo.upload.speed=57600 leonardo.upload.disable_flushing=true leonardo.upload.use_1200bps_touch=true leonardo.upload.wait_for_upload_port=true leonardo.bootloader.tool=avrdude leonardo.bootloader.low_fuses=0xff leonardo.bootloader.high_fuses=0xd8 leonardo.bootloader.extended_fuses=0xcb leonardo.bootloader.file=caterina/Caterina-Leonardo.hex leonardo.bootloader.unlock_bits=0x3F leonardo.bootloader.lock_bits=0x2F leonardo.build.mcu=atmega32u4 leonardo.build.f_cpu=16000000L leonardo.build.vid=0x2341 leonardo.build.pid=0x8036 leonardo.build.usb_product="Arduino Leonardo" leonardo.build.board=AVR_LEONARDO leonardo.build.core=arduino leonardo.build.variant=leonardo leonardo.build.extra_flags={build.usb_flags} ############################################################## pro.name=Arduino Pro Mini pro.upload.tool=avrdude pro.upload.protocol=arduino pro.bootloader.tool=avrdude pro.bootloader.unlock_bits=0x3F pro.bootloader.lock_bits=0x0F pro.build.board=AVR_PRO pro.build.core=arduino pro.build.variant=eightanaloginputs ## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega328 ## ------------------------------------------------- pro.menu.cpu.16MHzatmega328=ATmega328 (5V, 16 MHz) pro.menu.cpu.16MHzatmega328.upload.maximum_size=30720 pro.menu.cpu.16MHzatmega328.upload.maximum_data_size=2048 pro.menu.cpu.16MHzatmega328.upload.speed=57600 pro.menu.cpu.16MHzatmega328.bootloader.low_fuses=0xFF pro.menu.cpu.16MHzatmega328.bootloader.high_fuses=0xDA pro.menu.cpu.16MHzatmega328.bootloader.extended_fuses=0x05 pro.menu.cpu.16MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex pro.menu.cpu.16MHzatmega328.build.mcu=atmega328p pro.menu.cpu.16MHzatmega328.build.f_cpu=16000000L ## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega328 ## -------------------------------------------------- pro.menu.cpu.8MHzatmega328=ATmega328 (3.3V, 8 MHz) pro.menu.cpu.8MHzatmega328.upload.maximum_size=30720 pro.menu.cpu.8MHzatmega328.upload.maximum_data_size=2048 pro.menu.cpu.8MHzatmega328.upload.speed=57600 pro.menu.cpu.8MHzatmega328.bootloader.low_fuses=0xFF pro.menu.cpu.8MHzatmega328.bootloader.high_fuses=0xDA pro.menu.cpu.8MHzatmega328.bootloader.extended_fuses=0x05 pro.menu.cpu.8MHzatmega328.bootloader.file=atmega/ATmegaBOOT_168_atmega328_pro_8MHz.hex pro.menu.cpu.8MHzatmega328.build.mcu=atmega328p pro.menu.cpu.8MHzatmega328.build.f_cpu=8000000L ## Arduino Pro or Pro Mini (5V, 16 MHz) w/ ATmega168 ## ------------------------------------------------- pro.menu.cpu.16MHzatmega168=ATmega168 (5V, 16 MHz) pro.menu.cpu.16MHzatmega168.upload.maximum_size=14336 pro.menu.cpu.16MHzatmega168.upload.maximum_data_size=1024 pro.menu.cpu.16MHzatmega168.upload.speed=19200 pro.menu.cpu.16MHzatmega168.bootloader.low_fuses=0xff pro.menu.cpu.16MHzatmega168.bootloader.high_fuses=0xdd pro.menu.cpu.16MHzatmega168.bootloader.extended_fuses=0x00 pro.menu.cpu.16MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_diecimila.hex pro.menu.cpu.16MHzatmega168.build.mcu=atmega168 pro.menu.cpu.16MHzatmega168.build.f_cpu=16000000L ## Arduino Pro or Pro Mini (3.3V, 8 MHz) w/ ATmega168 ## -------------------------------------------------- pro.menu.cpu.8MHzatmega168=ATmega168 (3.3V, 8 MHz) pro.menu.cpu.8MHzatmega168.upload.maximum_size=14336 pro.menu.cpu.8MHzatmega168.upload.maximum_data_size=1024 pro.menu.cpu.8MHzatmega168.upload.speed=19200 pro.menu.cpu.8MHzatmega168.bootloader.low_fuses=0xc6 pro.menu.cpu.8MHzatmega168.bootloader.high_fuses=0xdd pro.menu.cpu.8MHzatmega168.bootloader.extended_fuses=0x00 pro.menu.cpu.8MHzatmega168.bootloader.file=atmega/ATmegaBOOT_168_pro_8MHz.hex pro.menu.cpu.8MHzatmega168.build.mcu=atmega168 pro.menu.cpu.8MHzatmega168.build.f_cpu=8000000L ############################################################## nano.name=Arduino Nano nano.upload.tool=avrdude nano.upload.protocol=arduino nano.bootloader.tool=avrdude nano.bootloader.unlock_bits=0x3F nano.bootloader.lock_bits=0x0F nano.build.f_cpu=16000000L nano.build.board=AVR_NANO nano.build.core=arduino nano.build.variant=eightanaloginputs nano.upload.maximum_size=30720 nano.upload.maximum_data_size=2048 nano.upload.speed=57600 nano.bootloader.low_fuses=0xFF nano.bootloader.high_fuses=0xDA nano.bootloader.extended_fuses=0x05 nano.bootloader.file=atmega/ATmegaBOOT_168_atmega328.hex nano.build.mcu=atmega328p ############################################################## micro.name=Arduino Micro micro.vid.0=0x2341 micro.pid.0=0x0037 micro.vid.1=0x2341 micro.pid.1=0x8037 micro.vid.2=0x2A03 micro.pid.2=0x0037 micro.vid.3=0x2A03 micro.pid.3=0x8037 micro.vid.4=0x2341 micro.pid.4=0x0237 # If the board is a 2341:0237 use 2341:8237 for build and set # other parameters as well micro.vid.4.build.vid=0x2341 micro.vid.4.build.pid=0x8237 micro.vid.4.build.usb_product="Genuino Micro" micro.vid.4.bootloader.file=caterina/Caterina-Genuino-Micro.hex micro.vid.5=0x2341 micro.pid.5=0x8237 # If the board is a 2341:8237 use 2341:8237 for build and set # other paramters as well micro.vid.5.build.vid=0x2341 micro.vid.5.build.pid=0x8237 micro.vid.5.build.usb_product="Genuino Micro" micro.vid.5.bootloader.file=caterina/Caterina-Genuino-Micro.hex micro.upload.tool=avrdude micro.upload.protocol=avr109 micro.upload.maximum_size=28672 micro.upload.maximum_data_size=2560 micro.upload.speed=57600 micro.upload.disable_flushing=true micro.upload.use_1200bps_touch=true micro.upload.wait_for_upload_port=true micro.bootloader.tool=avrdude micro.bootloader.low_fuses=0xff micro.bootloader.high_fuses=0xd8 micro.bootloader.extended_fuses=0xcb micro.bootloader.file=caterina/Caterina-Micro.hex micro.bootloader.unlock_bits=0x3F micro.bootloader.lock_bits=0x2F micro.build.mcu=atmega32u4 micro.build.f_cpu=16000000L micro.build.vid=0x2341 micro.build.pid=0x8037 micro.build.usb_product="Arduino Micro" micro.build.board=AVR_MICRO micro.build.core=arduino micro.build.variant=micro micro.build.extra_flags={build.usb_flags} ############################################################## mega.name=Arduino Mega 2560 mega.vid.0=0x2341 mega.pid.0=0x0010 mega.vid.1=0x2341 mega.pid.1=0x0042 mega.vid.2=0x2A03 mega.pid.2=0x0010 mega.vid.3=0x2A03 mega.pid.3=0x0042 mega.vid.4=0x2341 mega.pid.4=0x0210 mega.vid.5=0x2341 mega.pid.5=0x0242 mega.upload.tool=avrdude mega.upload.maximum_data_size=8192 mega.bootloader.tool=avrdude mega.bootloader.low_fuses=0xFF mega.bootloader.unlock_bits=0x3F mega.bootloader.lock_bits=0x0F mega.build.f_cpu=16000000L mega.build.core=arduino mega.build.variant=mega # default board may be overridden by the cpu menu mega.build.board=AVR_MEGA2560 mega.upload.protocol=wiring mega.upload.maximum_size=253952 mega.upload.speed=115200 mega.bootloader.high_fuses=0xD8 mega.bootloader.extended_fuses=0xFD mega.bootloader.file=stk500v2/stk500boot_v2_mega2560.hex mega.build.mcu=atmega2560 mega.build.board=AVR_MEGA2560 ############################################################## mysn.name=MySensors Node mysn.upload.tool=avrdude mysn.upload.protocol=arduino mysn.upload.maximum_size=30720 mysn.upload.maximum_data_size=2048 mysn.upload.speed=57600 mysn.bootloader.tool=avrdude mysn.bootloader.unlock_bits=0x3F mysn.bootloader.lock_bits=0x0F mysn.build.board=AVR_PRO mysn.build.core=arduino mysn.build.variant=eightanaloginputs ## Arduino Pro Mini (8MHz Ext) w/ ATmega328 ## -------------------------------------------------- mysn.menu.cpu.8MHzExternal=ATmega328 (8MHz Ext) mysn.menu.cpu.8MHzExternal.bootloader.low_fuses=0xFF mysn.menu.cpu.8MHzExternal.bootloader.high_fuses=0xDA mysn.menu.cpu.8MHzExternal.bootloader.extended_fuses=0x06 mysn.menu.cpu.8MHzExternal.bootloader.file=DualOptiboot/DualOptiboot_atmega328_8Mhz.hex mysn.menu.cpu.8MHzExternal.build.mcu=atmega328p mysn.menu.cpu.8MHzExternal.build.f_cpu=8000000L ## Arduino Pro Mini (8MHz Int) w/ ATmega328 ## -------------------------------------------------- mysn.menu.cpu.8MHzInternal=ATmega328 (8MHz Int) mysn.menu.cpu.8MHzInternal.bootloader.low_fuses=0xE2 mysn.menu.cpu.8MHzInternal.bootloader.high_fuses=0xDA mysn.menu.cpu.8MHzInternal.bootloader.extended_fuses=0x06 mysn.menu.cpu.8MHzInternal.bootloader.file=DualOptiboot/DualOptiboot_atmega328_8Mhz.hex mysn.menu.cpu.8MHzInternal.build.mcu=atmega328p mysn.menu.cpu.8MHzInternal.build.f_cpu=8000000L ############################################################## |
Por ultimo sera necesario mover la carpeta del proyecto de Atmel Studio al directorio: [Directorio principal de tu IDE Arduino]\hardware\arduino\avr\bootloaders\DualOptiboot, quedando así:
El bootloader que he compilado desde ATmel Studio lo he renombrado a DualOptiboot_atmega328_8Mhz.hex como se ve en la imagen y que es el nombre que se indica en el fichero boards.txt
Ahora si abrimos el IDE veremos que aparece la nueva placa, la cual podremos seleccionar y grabar el bootloader.
Grabar sketch por USB
Antes de poder grabar el código a distancia sera necesario grabarlo por USB para que las próximas veces sea capaz de leerlo por RF, para ello en nuestro código deberemos de haber definido las constantes:
1 2 3 |
#define MY_OTA_FIRMWARE_FEATURE // Habilita las actualizaciones sin cables #define MY_OTA_FLASH_SS A0 // Pin SS del chip flash externo #define MY_OTA_FLASH_JDECID 0xEF30 // Esto puede hacer falta dependiendo del tipo de chip flash |
Grabar sketch por FOTA / inalambricamente
El fichero que debemos de enviar por RF debe ser un fichero .HEX que contenga nuestro código ya compilado, esto lo hace el propio IDE de Arduino pero como no sabemos en qué directorio lo realiza lo primero sera indicarle que lo haga en un directorio al cual tengamos acceso, esto se hace en el fichero de preferencias (el explicado en el apartado Grabar bootloader personalizado), deberemos de añadir la siguiente linea al final del fichero (este cambio hay que hacerlo con el IDE cerrado):
1 |
build.path=[Directorio principal de tu IDE Arduino]\hex\ |
En realidad puede ser cualquier directorio mientras se lo indiquemos correctamente, a partir de este momento cada vez que pulsemos en comprobar código o grabar en el IDE los ficheros compilados se guardaran en ese directorio (solo uno ya que borra todo el contenido anterior).
Con el fichero .HEX generado lo copiamos y vamos al directorio dónde tengamos el programa MYSController , ahí veremos un directorio llamado Firmware, donde deberemos pegar el fichero, y ademas editar el fichero firmware_config.csv icluyendo una nueva linea para el firmware/sketch nuevo.
Y ya por fin solo nos quedara desde MYSController seleccionar el nodo, el firmware/sketch deseado y enviárselo por RF: