Componentes
Se utilizarán los siguientes componentes:
- Una Raspberry Pi 3 Model B con Raspbian 9 como SO
(También se probó en una Orange Pi con Ubuntu server 16.04)
- Un Arduino Uno o un Mega 2560
Proceso
El proceso sería el siguiente:
1- Un usuario carga el código compilado (hex) a firebase
2- Firebase envía la notificación de cambio a la raspberry (Utilizando la base de datos en tiempo real)
3- La raspberry descarga el código
4- La raspberry sube el código al Arduino
Conexiones
Puedes alimentar el Arduino por USB o por los pines GND y VCC del ICSP.
Puedes cambiar los pines a utilizar, pero no puedes usar el BCM 4 (PIN 7) que por alguna razón da problemas (Ver más info aquí)
Note que las conexiones en la Raspberry son a los pines BCM.
Arduino ICSP | Raspberry BCM
reset | 12; # Pin 32
sck | 11; # Pin 23
mosi | 10; # Pin 19
miso | 9; # Pin 21
Conexiones Arduino -> Raspberry ICSP |
Así quedó |
Instalando avrdude
La versión 6.2 y 6.3 de avrdude por alguna razón muy rara no está habilitada para usar los GPIO para cargar código (linuxgpio) y no funciona bien. Pude hacerlo funcionar con la versión 6.1
Debes ejecutar lo siguiente:
sudo apt-get install bison flex libusb-dev gcc gcc-avr avr-libc libelf-dev libusb-1.0-0-dev libusb-1.0-0-dev libftdi1-dev libftdi-dev libhidapi-libusb libevent-pthreads-2.0-5 libpthread-workqueue0 -y
wget http://ftp.nchc.org.tw/Unix/NonGNU/avrdude/avrdude-6.1.tar.gz
tar xfv avrdude-6.1.tar.gz
cd avrdude-6.1
./configure --enable-linuxgpio
make -j4
sudo make install
Probando la instalación de avrdude
Copias el fichero avrdude.conf al home del usuario
cp /usr/local/etc/avrdude.conf ~/avrdude_gpio.conf
Luego abres el fichero que acabas de copiar
nano ~/avrdude_gpio.conf
y le agregas esto al final
programmer
id = "pi_1";
desc = "Use the Linux sysfs interface to bitbang GPIO lines";
type = "linuxgpio";
reset = 12;
sck = 11;
mosi = 10;
miso = 9;
;
Luego probamos la conexión con el Arduino ejecutando lo siguiente:
sudo avrdude -p atmega2560 -C avrdude_gpio.conf -c pi_1 -v
Deberías ver algo así en la consola:
Y el arduino debe parpadear como en el siguiente video:
Probando la carga del código
Primero debemos generar el codigo compilado con extensión .hex.
Para ello abrimos Arduino IDE en cualquier PC (no necesariamente en la raspberry) y entramos en Preferencias y marcamos lo siguiente:
Para ello abrimos Arduino IDE en cualquier PC (no necesariamente en la raspberry) y entramos en Preferencias y marcamos lo siguiente:
Luego compilamos (Estoy usando el ejemplo de Blink) y buscamos el archivo .hex y lo copiamos y pegamos en el home de la raspberry al lado del fichero avrdude_gpio.conf
Para subir el codigo al Arduino debes ejecutar el siguiente comando:
sudo avrdude -p atmega2560 -C ~/avrdude_gpio.conf -c pi_1 -v -U flash:w:NOMBRE_DEL_HEX:i
En nuestro caso como el fichero se llama Blink.ino.hex:
sudo avrdude -p atmega2560 -C ~/avrdude_gpio.conf -c pi_1 -v -U flash:w:Blink.ino.hex:i
NOTA: Debes tener MUCHO cuidado con ese comando y el parámetro "p". He cargado por error un codigo compilado para atmega2561 en mi atmega2560 y se ha brickeado.
Referencias:
https://learn.adafruit.com/program-an-avr-or-arduino-using-raspberry-pi-gpio-pins
http://ozzmaker.com/program-avr-using-raspberry-pi-gpio/
http://blog.stevemarple.co.uk/2012/07/avrarduino-isp-programmer-using.html
El "diagrama UML" que has hecho para el proceso es bastante gracioso. Con LibreOffice Draw puedes hacer los diagramas, e incluyen el "person" ese que has dibujado :-)
ResponderEliminarEl blog es justo lo que muchos terminamos teniendo, un block de notas online para evitar buscar 20 veces lo mismo :-)
Muy bien explicado y muy bien por usar las letras en rojo para lo que es "chungo".
Saludos!