miércoles, 7 de marzo de 2018

Chuleta de equivalencias comandos



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

FIX: ImportError: cannot import name 'opentype'

Fix this problem:

File "/usr/local/lib/python3.5/dist-packages/oauth2client/_pure_python_crypt.py", line 24, in <module>
    from pyasn1_modules.rfc2459 import Certificate
  File "/usr/local/lib/python3.5/dist-packages/pyasn1_modules/rfc2459.py", line 20, in <module>
    from pyasn1.type import opentype

ImportError: cannot import name 'opentype'



SOLUTION: 

pip3 install --upgrade pyasn1-modules

Saber si el código se esta ejecutando en una Raspberry Pi

Estoy haciendo un código y deseo saber si se está ejecutando en una Orange Pi o en una Raspberry Pi

Para poder determinarlo se debe usar os.uname()

import os
os.uname()

Para la raspberry retorna:
posix.uname_result(sysname='Linux', nodename='raspberrypi', release='4.9.59-v7+', version='#1047 SMP Sun Oct 29 12:19:23 GMT 2017', machine='armv7l')

Para la orange:
posix.uname_result(sysname='Linux', nodename='OrangePI', release='3.4.39', version='#46 SMP PREEMPT Wed Nov 9 09:50:08 CST 2016', machine='armv7l')os.uname()
posix.uname_result(sysname='Linux', nodename='OrangePI', release='3.4.39', version='#46 SMP PREEMPT Wed Nov 9 09:50:08 CST 2016', machine='armv7l')

Best way to generate requeriments.txt

La mejor forma de generar un fichero requirements.txt

es con pipreqs

$ pip install pipreqs
$ pipreqs /path/to/project
Más info:
http://www.idiotinside.com/2015/05/10/python-auto-generate-requirements-txt/

jueves, 1 de marzo de 2018

Valid AVRDUDE Part model list

Valid parts are:
 uc3a0512 = AT32UC3A0512       [/home/pi/avrdude_gpio.conf:14158]
 c128     = AT90CAN128         [/home/pi/avrdude_gpio.conf:3255]
 c32      = AT90CAN32          [/home/pi/avrdude_gpio.conf:3639]
 c64      = AT90CAN64          [/home/pi/avrdude_gpio.conf:3447]
 pwm2     = AT90PWM2           [/home/pi/avrdude_gpio.conf:8684]
 pwm2b    = AT90PWM2B          [/home/pi/avrdude_gpio.conf:8877]
 pwm3     = AT90PWM3           [/home/pi/avrdude_gpio.conf:8867]
 pwm316   = AT90PWM316         [/home/pi/avrdude_gpio.conf:8904]
 pwm3b    = AT90PWM3B          [/home/pi/avrdude_gpio.conf:8891]
 1200     = AT90S1200          [/home/pi/avrdude_gpio.conf:1716]
 2313     = AT90S2313          [/home/pi/avrdude_gpio.conf:1945]
 2333     = AT90S2333          [/home/pi/avrdude_gpio.conf:2058]
 2343     = AT90S2343          [/home/pi/avrdude_gpio.conf:2186]
 4414     = AT90S4414          [/home/pi/avrdude_gpio.conf:1832]
 4433     = AT90S4433          [/home/pi/avrdude_gpio.conf:2310]
 4434     = AT90S4434          [/home/pi/avrdude_gpio.conf:2434]
 8515     = AT90S8515          [/home/pi/avrdude_gpio.conf:2517]
 8535     = AT90S8535          [/home/pi/avrdude_gpio.conf:2631]
 usb1286  = AT90USB1286        [/home/pi/avrdude_gpio.conf:11466]
 usb1287  = AT90USB1287        [/home/pi/avrdude_gpio.conf:11657]
 usb162   = AT90USB162         [/home/pi/avrdude_gpio.conf:11670]
 usb646   = AT90USB646         [/home/pi/avrdude_gpio.conf:11262]
 usb647   = AT90USB647         [/home/pi/avrdude_gpio.conf:11453]
 usb82    = AT90USB82          [/home/pi/avrdude_gpio.conf:11857]
 m103     = ATmega103          [/home/pi/avrdude_gpio.conf:2752]
 m128     = ATmega128          [/home/pi/avrdude_gpio.conf:3075]
 m1280    = ATmega1280         [/home/pi/avrdude_gpio.conf:9693]
 m1281    = ATmega1281         [/home/pi/avrdude_gpio.conf:9883]
 m1284    = ATmega1284         [/home/pi/avrdude_gpio.conf:4451]
 m1284p   = ATmega1284P        [/home/pi/avrdude_gpio.conf:4645]
 m1284rfr2 = ATmega1284RFR2     [/home/pi/avrdude_gpio.conf:10318]
 m128rfa1 = ATmega128RFA1      [/home/pi/avrdude_gpio.conf:10103]
 m128rfr2 = ATmega128RFR2      [/home/pi/avrdude_gpio.conf:10206]
 m16      = ATmega16           [/home/pi/avrdude_gpio.conf:3832]
 m161     = ATmega161          [/home/pi/avrdude_gpio.conf:5977]
 m162     = ATmega162          [/home/pi/avrdude_gpio.conf:4837]
 m163     = ATmega163          [/home/pi/avrdude_gpio.conf:5035]
 m164p    = ATmega164P         [/home/pi/avrdude_gpio.conf:4011]
 m168     = ATmega168          [/home/pi/avrdude_gpio.conf:7723]
 m168p    = ATmega168P         [/home/pi/avrdude_gpio.conf:7912]
 m169     = ATmega169          [/home/pi/avrdude_gpio.conf:5193]
 m16u2    = ATmega16U2         [/home/pi/avrdude_gpio.conf:12234]
 m2560    = ATmega2560         [/home/pi/avrdude_gpio.conf:9896]
 m2561    = ATmega2561         [/home/pi/avrdude_gpio.conf:10090]
 m2564rfr2 = ATmega2564RFR2     [/home/pi/avrdude_gpio.conf:10308]
 m256rfr2 = ATmega256RFR2      [/home/pi/avrdude_gpio.conf:10157]
 m32      = ATmega32           [/home/pi/avrdude_gpio.conf:5800]
 m324p    = ATmega324P         [/home/pi/avrdude_gpio.conf:4035]
 m324pa   = ATmega324PA        [/home/pi/avrdude_gpio.conf:4227]
 m325     = ATmega325          [/home/pi/avrdude_gpio.conf:12604]
 m3250    = ATmega3250         [/home/pi/avrdude_gpio.conf:12985]
 m328     = ATmega328          [/home/pi/avrdude_gpio.conf:8113]
 m328p    = ATmega328P         [/home/pi/avrdude_gpio.conf:8298]
 m329     = ATmega329          [/home/pi/avrdude_gpio.conf:5375]
 m3290    = ATmega3290         [/home/pi/avrdude_gpio.conf:5574]
 m3290p   = ATmega3290P        [/home/pi/avrdude_gpio.conf:5588]
 m329p    = ATmega329P         [/home/pi/avrdude_gpio.conf:5560]
 m32u2    = ATmega32U2         [/home/pi/avrdude_gpio.conf:12046]
 m32u4    = ATmega32U4         [/home/pi/avrdude_gpio.conf:11071]
 m406     = ATMEGA406          [/home/pi/avrdude_gpio.conf:14496]
 m48      = ATmega48           [/home/pi/avrdude_gpio.conf:7323]
 m48p     = ATmega48P          [/home/pi/avrdude_gpio.conf:7510]
 m64      = ATmega64           [/home/pi/avrdude_gpio.conf:2892]
 m640     = ATmega640          [/home/pi/avrdude_gpio.conf:9503]
 m644     = ATmega644          [/home/pi/avrdude_gpio.conf:4243]
 m644p    = ATmega644P         [/home/pi/avrdude_gpio.conf:4434]
 m644rfr2 = ATmega644RFR2      [/home/pi/avrdude_gpio.conf:10328]
 m645     = ATmega645          [/home/pi/avrdude_gpio.conf:12795]
 m6450    = ATmega6450         [/home/pi/avrdude_gpio.conf:12997]
 m649     = ATmega649          [/home/pi/avrdude_gpio.conf:5601]
 m6490    = ATmega6490         [/home/pi/avrdude_gpio.conf:5787]
 m64rfr2  = ATmega64RFR2       [/home/pi/avrdude_gpio.conf:10219]
 m8       = ATmega8            [/home/pi/avrdude_gpio.conf:6117]
 m8515    = ATmega8515         [/home/pi/avrdude_gpio.conf:6278]
 m8535    = ATmega8535         [/home/pi/avrdude_gpio.conf:6436]
 m88      = ATmega88           [/home/pi/avrdude_gpio.conf:7523]
 m88p     = ATmega88P          [/home/pi/avrdude_gpio.conf:7710]
 m8u2     = ATmega8U2          [/home/pi/avrdude_gpio.conf:12422]
 t10      = ATtiny10           [/home/pi/avrdude_gpio.conf:14451]
 t11      = ATtiny11           [/home/pi/avrdude_gpio.conf:1211]
 t12      = ATtiny12           [/home/pi/avrdude_gpio.conf:1275]
 t13      = ATtiny13           [/home/pi/avrdude_gpio.conf:1408]
 t15      = ATtiny15           [/home/pi/avrdude_gpio.conf:1583]
 t1634    = ATtiny1634         [/home/pi/avrdude_gpio.conf:14184]
 t20      = ATtiny20           [/home/pi/avrdude_gpio.conf:14461]
 t2313    = ATtiny2313         [/home/pi/avrdude_gpio.conf:8311]
 t24      = ATtiny24           [/home/pi/avrdude_gpio.conf:10339]
 t25      = ATtiny25           [/home/pi/avrdude_gpio.conf:8957]
 t26      = ATtiny26           [/home/pi/avrdude_gpio.conf:6594]
 t261     = ATtiny261          [/home/pi/avrdude_gpio.conf:6751]
 t4       = ATtiny4            [/home/pi/avrdude_gpio.conf:14407]
 t40      = ATtiny40           [/home/pi/avrdude_gpio.conf:14478]
 t4313    = ATtiny4313         [/home/pi/avrdude_gpio.conf:8500]
 t43u     = ATtiny43u          [/home/pi/avrdude_gpio.conf:10892]
 t44      = ATtiny44           [/home/pi/avrdude_gpio.conf:10523]
 t45      = ATtiny45           [/home/pi/avrdude_gpio.conf:9139]
 t461     = ATtiny461          [/home/pi/avrdude_gpio.conf:6942]
 t5       = ATtiny5            [/home/pi/avrdude_gpio.conf:14424]
 t84      = ATtiny84           [/home/pi/avrdude_gpio.conf:10707]
 t85      = ATtiny85           [/home/pi/avrdude_gpio.conf:9320]
 t861     = ATtiny861          [/home/pi/avrdude_gpio.conf:7133]
 t88      = ATtiny88           [/home/pi/avrdude_gpio.conf:7925]
 t9       = ATtiny9            [/home/pi/avrdude_gpio.conf:14434]
 x128a1   = ATxmega128A1       [/home/pi/avrdude_gpio.conf:13478]
 x128a1d  = ATxmega128A1revD   [/home/pi/avrdude_gpio.conf:13494]
 x128a1u  = ATxmega128A1U      [/home/pi/avrdude_gpio.conf:13504]
 x128a3   = ATxmega128A3       [/home/pi/avrdude_gpio.conf:13515]
 x128a3u  = ATxmega128A3U      [/home/pi/avrdude_gpio.conf:13525]
 x128a4   = ATxmega128A4       [/home/pi/avrdude_gpio.conf:13536]
 x128a4u  = ATxmega128A4U      [/home/pi/avrdude_gpio.conf:13594]
 x128b1   = ATxmega128B1       [/home/pi/avrdude_gpio.conf:13647]
 x128b3   = ATxmega128B3       [/home/pi/avrdude_gpio.conf:13706]
 x128c3   = ATxmega128C3       [/home/pi/avrdude_gpio.conf:13405]
 x128d3   = ATxmega128D3       [/home/pi/avrdude_gpio.conf:13458]
 x128d4   = ATxmega128D4       [/home/pi/avrdude_gpio.conf:13468]
 x16a4    = ATxmega16A4        [/home/pi/avrdude_gpio.conf:13136]
 x16a4u   = ATxmega16A4U       [/home/pi/avrdude_gpio.conf:13063]
 x16c4    = ATxmega16C4        [/home/pi/avrdude_gpio.conf:13116]
 x16d4    = ATxmega16D4        [/home/pi/avrdude_gpio.conf:13126]
 x16e5    = ATxmega16E5        [/home/pi/avrdude_gpio.conf:14053]
 x192a1   = ATxmega192A1       [/home/pi/avrdude_gpio.conf:13780]
 x192a3   = ATxmega192A3       [/home/pi/avrdude_gpio.conf:13796]
 x192a3u  = ATxmega192A3U      [/home/pi/avrdude_gpio.conf:13806]
 x192c3   = ATxmega192C3       [/home/pi/avrdude_gpio.conf:13717]
 x192d3   = ATxmega192D3       [/home/pi/avrdude_gpio.conf:13770]
 x256a1   = ATxmega256A1       [/home/pi/avrdude_gpio.conf:13880]
 x256a3   = ATxmega256A3       [/home/pi/avrdude_gpio.conf:13896]
 x256a3b  = ATxmega256A3B      [/home/pi/avrdude_gpio.conf:13917]
 x256a3bu = ATxmega256A3BU     [/home/pi/avrdude_gpio.conf:13927]
 x256a3u  = ATxmega256A3U      [/home/pi/avrdude_gpio.conf:13906]
 x256c3   = ATxmega256C3       [/home/pi/avrdude_gpio.conf:13817]
 x256d3   = ATxmega256D3       [/home/pi/avrdude_gpio.conf:13870]
 x32a4    = ATxmega32A4        [/home/pi/avrdude_gpio.conf:13225]
 x32a4u   = ATxmega32A4U       [/home/pi/avrdude_gpio.conf:13152]
 x32c4    = ATxmega32C4        [/home/pi/avrdude_gpio.conf:13205]
 x32d4    = ATxmega32D4        [/home/pi/avrdude_gpio.conf:13215]
 x32e5    = ATxmega32E5        [/home/pi/avrdude_gpio.conf:14105]
 x384c3   = ATxmega384C3       [/home/pi/avrdude_gpio.conf:13938]
 x384d3   = ATxmega384D3       [/home/pi/avrdude_gpio.conf:13991]
 x64a1    = ATxmega64A1        [/home/pi/avrdude_gpio.conf:13325]
 x64a1u   = ATxmega64A1U       [/home/pi/avrdude_gpio.conf:13341]
 x64a3    = ATxmega64A3        [/home/pi/avrdude_gpio.conf:13352]
 x64a3u   = ATxmega64A3U       [/home/pi/avrdude_gpio.conf:13362]
 x64a4    = ATxmega64A4        [/home/pi/avrdude_gpio.conf:13373]
 x64a4u   = ATxmega64A4U       [/home/pi/avrdude_gpio.conf:13241]
 x64b1    = ATxmega64B1        [/home/pi/avrdude_gpio.conf:13383]
 x64b3    = ATxmega64B3        [/home/pi/avrdude_gpio.conf:13394]
 x64c3    = ATxmega64C3        [/home/pi/avrdude_gpio.conf:13294]
 x64d3    = ATxmega64D3        [/home/pi/avrdude_gpio.conf:13305]
 x64d4    = ATxmega64D4        [/home/pi/avrdude_gpio.conf:13315]
 x8e5     = ATxmega8E5         [/home/pi/avrdude_gpio.conf:14001]
 ucr2     = deprecated, use 'uc3a0512' [/home/pi/avrdude_gpio.conf:14174]

FIX: Can't export GPIO 4 (AVRDUDE Raspberry)

Por alguna razón avrdude falla cuando se intenta utilizar el Pin 4 como RESET en una conexión ICSP.
Y muestra el siguiente error:
Can't export GPIO 4, already exported/busy?: Device or resource busy
avrdude done.  Thank you.

Para solucionarlo puedes usar otro puerto. Yo he usado el GPIO 12 y me fue de maravillas.