viernes, 2 de marzo de 2018

Usar una Raspberry Pi como programador AVR

En esta entrada veremos el proceso de creación de un Programador Remoto de AVR.


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:


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

1 comentario:

  1. 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 :-)

    El 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!

    ResponderEliminar