jueves, 29 de mayo de 2014

Arduino - Programar Arduino o uC AVR con Gambas

Bueno siguiendo con mi idea de realizar un IDE grafico tipo ladder o lenguaje de escaleras para arduino se me ocurrio usar gambas por el "drag and drop", o en python, pero la idea del formato va a ser simil al RS-logix5.
Para los que no conocen el ladder es un lenguaje utilizado para programar PLC industriales como Allen-Bradley, sinceramente limitado en cuanto a PID y tuning mi punto de vista, anda miles de veces mejor la libreria PID para arduino, no hay nada mejor que el C o ASM, pero el ladder al ser grafico y orientado a contactos de rele simplifica el uso, para un tecnico electrico-electronico.




 Hay otra version nueva que utiliza lenguaje funcional para el PLC-Controllogix



Buscando por la red ya algo sabia por los PIC el cual habia que realizar el codigo en ensamblador y compilarlo en un hex y quemarlo o subirlo al PIC el arduino hace algo igual el IDE ARDUINO hecho en java utiliza unas librerias en C pero termina creando un codigo en C intermedio con macros en ASM, pero con intrucciones mas heavy.

Ejemplo del blink.c optenido de la web del ingeniero balau

Lo unico modificado es el parpadeo. :) podemos usar asm en linea y vi otros codigo todo en ASM pero es muy largo y no quiero estar toda la vida programando un blink.

**************ARD_.C************************************************


 ****************************************************************************

Ahora como lo compilamos desde gambas bueno ARDUINO IDE utiliza el compilador AVR-GCC y para cargarlo usa AVR-DUDE nada mas desde la terminal seria algo asi:

sudo avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o /home/pablo/pru23/ard_.o ard_.c

sudo avr-gcc -mmcu=atmega328p /home/pablo/pru23/ard_.o -o /home/pablo/pru23/ard_
 

sudo avr-objcopy -O ihex -R.eeprom /home/pablo/pru23/ard_ /home/pablo/pru23/ard_.hex

sudo avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:/home/pablo/pru23/ard_.hex


 la explicacion de todo esto seria
avr-gcc es el compilador o sea toma el .C y genera un .O luego se ensambla hasta llegar al .HEX y con AVR-DUDE lo sube a la memoria flash.

ard_.c --> ard_.o --> ard_ -->ard_hex -->sube a la flash del atmega328P  de la familia AVR, usado en arduino uno..


******************contenido del hex*****************************
 :100000000C9434000C9451000C9451000C94510049
:100010000C9451000C9451000C9451000C9451001C
:100020000C9451000C9451000C9451000C9451000C
:100030000C9451000C9451000C9451000C945100FC
:100040000C9451000C9451000C9451000C945100EC
:100050000C9451000C9451000C9451000C945100DC
:100060000C9451000C94510011241FBECFEFD8E026
:10007000DEBFCDBF11E0A0E0B1E0E2EDF0E002C0F4
:1000800005900D92A030B107D9F711E0A0E0B1E0E2
:1000900001C01D92A030B107E1F70E9453000C94FB
:1000A00067000C940000259A20E931E02D9A80E148
:1000B00097E2F9013197F1F70197D9F72D9880E18F
:1000C00097E2F9013197F1F70197D9F7EFCFF8945B
:0200D000FFCF60
:00000001FF
 ****************************************************************
es un quilombo son direciones de memoria e instrucciones en hexadecimal pero entendible por el micro AVR, mi no entender por ahora jeje.


Foto de lo generado






en Gambas seria asi es una prueba, hay que mejorarlo muchooo, donde dice contraseña va su contraseña de ROOT para poder usar los programas.


PUBLIC SUB Form_Open()
DIM buf, res AS String

SHELL ("echo contraseña | sudo -S avr-gcc -Os -DF_CPU=16000000UL -mmcu=atmega328p -c -o /home/pablo/pru23/ard_.o ard_.c")
 

SHELL ("echo contraseña | sudo -S avr-gcc -mmcu=atmega328p /home/pablo/pru23/ard_.o -o /home/pablo/pru23/ard_")
 

SHELL ("echo contraseña | sudo -S avr-objcopy -O ihex -R.eeprom /home/pablo/pru23/ard_ /home/pablo/pru23/ard_.hex")

 

SHELL ("echo contraseña | sudo -S avrdude -F -V -c arduino -p ATMEGA328P -P /dev/ttyACM0 -b 115200 -U flash:w:/home/pablo/pru23/ard_.hex")
 

END




 y subio el codigo jeje que alegria jejeje








bueno como sigue todo esto primero mejorar la interfaz grafica, editor de codigo y sintaxis de color, armar algo como el ladder y que genere el codigo en macro asm-c.

muy buen material aun no lo leo todo :)
http://www.ladyada.net/learn/avr/programming.html
http://www.arduino.cc/en/Reference/PortManipulation
http://www.engbedded.com/fusecalc
http://www.avrfreaks.net/


Sldoss.


************************actualizacion 30-05-14*******************************
Va tomando forma :P




:)



viernes, 16 de mayo de 2014

Arduino - Programador ICSP o SPI

Estoy con el proyecto del calentador controlado por pwm y viendo alguna opcion de seguridad, usar interrupciones para resetear el freaduino mega 2560 el cual uso se me ocurrio probar el reset del watchdog timer o perro guardian el cual chequea que el procesador este siempre funcionando si se demora es porque se bloquea y realiza un reset se me ocurrio hacerlo pero en una funcion implemente el siguiente codigo el cual me reiniciaba el freaduino mega y me lo bloqueo no podia bajarle codigo ni funcionaba tampoco :( crei que lo habia perdido, asi que no me quedaba mas opcion que recargarle el bootloader despues de muchos post no explicaban muy bien como como hacerlo, aqui dejo mi experiencia errores y quedo funcionando el cual era el objetivo.

codigo el cual sabia me hiba a ocasionar problema pero probar no cuesta nada

<include avr/wdt.h>

void setup()
{
wdt_disable()

wdt_enable(7); // WDT0_2S
}

void loop()
{
wdt_reset ; //aca cometi el error en teoria si el wdt no recibe señal dentro de los 2s resetea y quedo en un bucle infinito :P sisi puden decirme y vos sos programador jeje errar es humanooooo... :p

}


En teoria si el wdt no recibe señal dentro de los 2s resetea y quedo en un bucle infinito :P sisi puden decirme y vos sos programador ? jeje errar es humanooooo... :p

paso siguiente arreglar la macana que me mande para cargarle el bootloader de nuevo podemos usar un programador ISP puede ser un kit o podemos usar otro arduino funciona de la siguiente manera tendremos un arduino maestro y otro como esclavo conectado a trsves SPI o ISP.

pines arduino mega 2560
50     MISO
51     MOSI
52     SCK
53      Reset

pines del conector ISP o SPI

1    MISO
2    VCC
3    SCK
4    MOSI
5    Reset
6    GND

pines arduino uno

5vcc
gnd
10 reset
11 MOSI
12 MISO
13 SCK

1)Conectar el master y el slave

master            slave ISCP
12     50           ----   1
11     51           ----   4
13     52           ----   3
10     53           ----   5
5v     5v           ----   2
gnd   gnd         ----   6
uno   mega       ficha SPI

2)Descargarle el soft de la lista de ejemplos ArduinoISP al master  que vamos a usar de programador
3)Ponemos modo de programador ARDUINO ISP
4)Le damos  BURN BOOTLOADER
5)Cuando esta quemando nos da un error o aviso pero luego funciona igual.






Si les da errores al cargar los sketch, firmware, o un bootloader y esta todo bien conectado cambien de puerto USB me paso, lo intercambias y funciona todo bien..

Sldos...

******************************actualizacion 20-05-14*****************************
Otro ejemplo buscando mi GPS EM406 encontre una seeeduino mega 1280 el cual sin querer me enrede en el cable usb y le arranque la ficha :( hace tiempo atras trate de soldarle la ficha pero no tenia pista se despego totalmente no la tire de lastima porque no me servia para nada hasta ahora como subir un sketch de un arduino uno a un seeduino mega sin USB usando la comunicacion SPI.


1)vamos al ide de arduino y bajamos el ejemplo de arduinoISP al arduino uno sin conectar el positivo de seeduino mega.


Sketch ejemplo: ArduinoISP "lo convierte en un programador al arduino master"
Board o tarjeta: Arduino Uno
pines:10 - 11 - 12 - 13 - 5v - gnd
descargamos sketch al uno con el mega 1280 desconectado.

2)conectamos el positivo seleccionamos la tarjeta arduino mega 1280 y programador Arduino ISP
Cargamos el sketch a subir al mega 1280
Board o Tarjeta: Arduino Mega 1280
Vamos a archivo y seleccionamos descargar desde programador



en el arduino uno usamos los pines


12 *************1    MISO
5v *************2    VCC
13 *************3    SCK
11 *************4    MOSI
10 *************5    Reset
gnd*************6  GND


Esta imagen es genial esta bien explicada la conexion a la ficha.



En resumen podemos cargarle un bootloader a nuestro arduino o cargarle un sketch o firmware desde otro arduino usado como programador. :).



                                 

Sldos...


viernes, 2 de mayo de 2014

7 - Raspberry PI - Sincronizacion de archivos Bittorrent Sync

Este maravilloso programa nos permite sincronizar diferentes directorios con distintos dispositivos celulares, notebook, tablet, se puede utilizar como back-up o un SVN si tenemos proyectos o código para actualizar. :) desde Internet si logramos montar un server con raspberry pi ...

de donde descargar este excelente programa
http://www.bittorrent.com/intl/es/sync/downloads

eligen la versión que necesiten en mi caso ARM para raspberry pi ya que su procesador es ARM
para su ubuntu bajen 386 (32bits) o x64(64bits) segun el microprocesador de su notebook, tablet, o lo que sea.
para activar el servicio solo deben introducir el siguiente comando

sudo  ./btsync
y para acceder desde el navegador en su maquina local a ambos btsync por el puerto 8888 / gui

rasbpberry pi remoto
xxx.xxx.xxx.xxx:8888/gui






notebook local
xxx.xxx.xxx.:8888/gui
localhost:8888/gui



Primero eligen la carpeta local a sincronizar y generan el codigo el cual deben copiar es su llave, le dan add este indexa en su maquina o sea la lee cuenta archivos y tamaño del directorio.

en el raspy remoto elijen la carpeta y agregan el código generado hace un momento el copiado y le dan add les sincroniza los archivos agrega los que falta es muy buen soft.


Tambien pueden escaneralo con el cel lo agregan y sincroniza el cel con su maquina local ..diganme si no es genial..




Cuando deja sincronizado ambos directorios les aparece un synced con fecha y hora si modifican cualquiera de las dos carpetas o agregan un archivo este se sincroniza o se duplican.



Tiene algunos problemas con caracteres como ñ, acentos y simbolos ascii y letras rusas jejeje en los nombres de los archivos y no los actualiza, pero es genial para sincronizar pelicualas, vídeos y código fuente :)
Otro inconveniente era cargarlo como servicio ya que en raspberry pi tenes que hacerlo desde la la terminal asi que le hice el script en bash para arrancarlo
para realizarlo se van a cd /etc/init.d/ aqui se guardan los servicios a arrancar con start o stop

cd /etc/init.d
sudo nano btsync.sh

*y copian esto o hacen el suyo es muy sencillo ************************************

#!/bin/sh

case "$1" in

  start)
  echo  "Arrancando BitTorrent Sync"
  /usr/local/bin/btsync
  ;;

  stop)
  echo "Parando BitTorrent Sync"
  killall  btsync
  ;;

  *)
  echo "Uso /etc/init.d/btsync {start|stop}"
  exit 1
  ;;

esac

exit 0

********************************************************

y para actualizar la lista de servicios

sudo update-rc.d btsync.sh defaults 0

y cuando reinicien iniciara solo el btsync

 Sldosss.


6 - Raspberry PI - Montaje de dispositivos y asignacion de permisos.

Para montar un disco externo de manera automatica y asignar permisos de usuarios podemos usar la tabla filesystem o sistema de archivos, de esta manera podemos acceder desde la red SAMBA con sus permisos definidos en /etc/samba/smb.conf  y en nuestro raspberry pi con mayores privilegios.


 sudo nano /etc/fstab



/etc/fstab
# <file system>        <dir>         <type>    <options>             <dump> <pass>
/dev/sda1              /             ext4      defaults,noatime      0      1
/dev/sda2              none          swap      defaults              0      0
/dev/sda3              /home         ext4      defaults,noatime      0      2


Este archivo se divide, por el dispositivo el punto de montaje el tipo de particion o sistema de archivos y las opciones en las cuales podemos definir los permisos e identificacion del dispositivo, una muy interesante es la id UUID o la id unica asociada al dispositivo, disco externo, pendrive, etc, para averiguarla podemos usar el comando blkid

blkid

donde nos muestra el UUID del pendrive y quedaria algo asi

UUID="6FD9-2E1A" /media/PENDRIVE      vfat    auto,exec,rw,gid=www-data,fmask=0,dmask=0      0 0 


dentro de las opciones tenemos

auto = se monta el dispositivo automaticamente
exec=permite la ejecucion de binarios
rw=permite lectura y escritura
uid = id del usuario por ejemplo root o pi etc
gid= id del grupo por ajemplo root www-data etc.
fmask= bueno estos son como limitadores o sea quitan permisos a archivo
dmask=este es igual al anterior pero quita permisos a directorios

 seria algo asi

donde 1 permitido
donde 0 no permitido

y se dividen en U -> usuario G-->grupo O-->otros

       u    g   o
r     1    1   0
w    1    1   0
x     1    1   0

si usamos para dar permisos los siguientes chmod chgrp

sudo chmod u=r+w+x , g=r+w , o=r /archivo

si listamos vemos algo asi

ls -l archivo

drwxrwxrwx  -> un directorio con permisos u=rwx   g=rwx  o=rwx
-rwxrwxrwx ->   un archivo con permisos     u=rwx   g=rwx  o=rwx

Otra es verlo como un sitema octal porque usa 9 elementos o sea del 0 al 8 entonces podemos escribir
  u      g      o
rwx  rwx  rwx
111  111  111  ->binario
012  345  678  ->octal

sii activamos los siguientes bits
111 111 111   eso en ocatal es 777 el famoso

sudo chmod 777





El unmask es una mascara, es como hacer 777 - 022 = 755 que en binario seria 111101101
111 111 111    --> 777 chmod 777
000 010 010    --> 022 fmask o unmask 022 o los permisos que sean
111 101 101    --> 755 resultado chmod 755

es medio heavy pero es bueno saberlo....

Sldos...