Arduino i GPS (II)

Després d’haber remenat una mica amb l’Arduino,  el GPS, el display i la proto-board, he vist que hi ha un munt de possibilitats per poder experimentar amb totes aquestes coses i… més. Així que m’he decidit a continuar per aquest camí durant una temporada.

Peró clar: utilitzar el GPS des de la ‘taula d’operacions’ no te cap sentit. Així que he començat a preparar un sistema compacte per poder experimentar amb tota la plataforma de manera fàcil i, a més, que sigui fàcil de transportar i poder experimentar a l’aire lliure.

El primer que he fet ha sigut decidir amb quins trastos vull experimentar i m’he decidit per l’arduino (com no!),  la placa GPS i unl mòdul transmissor, descartant el LCD de moment.

He agrupat tots aquests elements i he anat a buscar una placa de de circuit imprés suficientment gran per poder encabir-hi els tres mòduls. He soldat tires de pins allà on hi han d’anar els connectors dels mòduls i tambè he soldat cables entre els terminals corresponents a l’alimentació (+5V, GND) i la transmissió serie de dades (TXD, RXD).

El resultat de tot aixó ha sigut el següent conjunt compacte.

Desprès, tot aquest artilugi queda allotjat dins d’un tupper de 0,60€ dels xinos i es pot portar dins de la motxila per fer proves. I la primera prova que he fet ha sigut comprovar el funcionament del transmissor,de dades,  provant la cobertura en entorn urbà al voltant de casa. He pogut diagnosticar que aquest transmissor te una fiabilitat del 83% a 514mts. de distància i he pogut treure un arxiu .PLT, compatible amb el programa OziExplorer per veure el trajecte que he fet amb l’arduino carregat a la motxila.

El codi que he utilitzat en l’arduino per fer aixó és extremadament simple:

#include <TinyGPS.h>
#define EN_TRX 13
#define TEMPORIZADOR_1 15  //en seg.

long latitude, longitude, lat, longi;
unsigned long fix_age, time, date;
float latdeg, longdeg;
int Num_orden=0;
long temporizador_1=0;

TinyGPS gps;

void setup(){
 Serial.begin(9600);
 pinMode(EN_TRX,OUTPUT);
 digitalWrite(EN_TRX,LOW);
}

void loop(){
 while (Serial.available()){
 int c = Serial.read();
 gps.encode(c);
 }
 gps.get_position(&latitude, &longitude, NULL);
 gps.get_datetime(&date, &time, &fix_age);
 if (((millis()-temporizador_1)>=TEMPORIZADOR_1*1000) &&  (latitude<=9000000)){
 temporizador_1=millis();
 Num_orden++;
 digitalWrite(EN_TRX,HIGH);
 delay(150);
 Serial.print("EMISSOR1,BASE,");
 Serial.print(Num_orden);
 Serial.print(",");
 Serial.print(latitude);
 Serial.print(",");
 Serial.print(longitude);
 Serial.print(",");
 Serial.println(time/100);
 delay(30);
 digitalWrite(EN_TRX,LOW); 
 }
}

Aquest codi lúnic que fa es capturar la posició donada per el GPS i formar una trama de dades formada de la següent forma:

EMISOR, DESTINATARI,#ORDRE,LATITUD,LONGITUD,HORA

Aquesta trama s’emet cada 15 segons. Hi ha un altre mòdul rebent aquesta informació i guardant tota la col·lecció de trames . Amb un petit programa fet amb python es fa la decodificació;  generant-se un informe de cobertura i dos arxius per un full de càlcul i el .PLT per OziExplorer.

19 gener 2011 at 08:56 1 comentari

Arduino i GPS

Aquesta setmana vaig rebre un mòdul GPS demo board, per poder fer proves amb l’Arduino i les dades GPS. El mòdul esta prou be, ja que tè sortides USB, RS-232, bluetooth i TTL de 5 i 3,3V.

En la fotografia e pot veure el mòdul amb la seva antena externa. aquesta placa pot alimentar-se a través dels terminals de 5V de la propia placa o alimentar-se de forma paràsita des de el USB.

La eina més fàcil per fer anar un dispositiu GPS amb l’Arduino és la llibreria TinyGPS, que permet connectar qualsevol dispositiu GPS que compleixi l’estandard NMEA. Per qui no ho conegui, NMEA és un protocol que utilitzen la majoria de dispositius receptors GPS, el qual envia diferents trames de dades sobre la hora, la posició, la precissió i unes quantes dades més. Tota aquesta informació sempre es representa e la mateixa manera, peró cal conneixer el protocol per saber dins de quina trama podem trobar la informació que nosaltres necessitem (per exemple la de latitud i longitud). Així doncs, la llibreria tiny GPS ens estalvia la feina de buscar dins de les trames rebudes les dades que necessitem.

Una de les peculiaritats de la llibreria es que les dades de posició les retorna com a 100000-esimes de grau, és a dir, que 1º30′  està representat com 1500000 (aixó és 1,500º).

El funcionament de la llibreria és molt simple:

1er- Declarem un element tinyGPS.

2on- Configurem un port serie per un rebrem les dades (pot ser un port sèrie real o utilitzant la llibreria SoftSerial).

3er- Cada caracter que rebem per el port serie, l’enviem a un element decodificador.

4at- Fem la consulta de les dades que ens interessant (posició, dia y hora, velocitat o rumb).

I ja està!! Ara només cal que processem les dades o les presentem per una pantalla o les enviem per el port sèrie o….. el que volguem fer.

El que he fet ha sigut utilitzar una pantalla LCD juntament amb un Arduino Diecimilla i el mòdul GPS.

La connexió es la següent:

  • De GPS_DataIN del mòdul GPS conectat a el pin 0 (RX) del Arduino.
  • El display connectat al Arduino utilitzant una configuració de 4 bit.
  • Tota la alimentació connectada a través de 5V del arduino.

Al imprimir en la pantalla les dades de recepció de posició, aquestes tenen un aspecte com el que es mostra.

He preferit canviar el format de les dades per un format tipus: 41º43.18′, Es a dir, graus amb minuts decimals. Per fer-ho he jugat amb la funció mòdul (%).

El codi complert que he utilitzat es el següent

#include <LiquidCrystal.h>
#include <TinyGPS.h>

long latitude, longitude, lat, longi;
float latdeg, longdeg;

LiquidCrystal lcd(7,8,9,10,11,12);
TinyGPS gps;

void setup(){
 lcd.begin(40,2);
 lcd.clear();
 Serial.begin(9600);
}

void loop(){
 while (Serial.available()){
 int c = Serial.read();
 gps.encode(c);
 }

gps.get_position(&latitude, &longitude, NULL); 

if ((latitude!=lat)||(longitude!=longi)){
 lat=latitude;
 longi=longitude;

 int long_deg=longi/100000;
 float  long_min= (longi%100000)*0.6/1000.0;

 int lat_deg=lat/100000;
 float  lat_min= (lat%100000)*0.6/1000.0;

lcd.clear();
lcd.setCursor(0,0);
lcd.print("lat: ");
lcd.print(lat_deg);
lcd.print("o ");
lcd.print(lat_min);
lcd.print("'");

lcd.setCursor(0,1);
lcd.print("long: ");
lcd.print(long_deg);
lcd.print("o ");
lcd.print(long_min);
lcd.print("'");

}
 }

26 desembre 2010 at 09:14 2 comentaris

Libro: Computación Física en Secundaria

Hola chicos,

Después de bastante tiempo de trabajo ya he conseguido publicar mi primer libro donde hago un resumen de los trabajos y proyectos de mis clases con arduino, processing, scratch y otros…

Portada: Computación Física en Secundaria

Portada: Computación Física en Secundaria

El libro ahora mismo esta disponible solo desde lulu.com (que es la editorial) tanto en pdf como en papel:

http://www.lulu.com/product/tapa-blanda/computación-física-en-secundaria/6218641?productTrackingContext=center_search_results

También se han hecho eco en el conocido blog BricoGeek:

http://blog.bricogeek.com/noticias/arduino/libro-de-computacion-fisica-con-arduino-en-espanol/#more

21 gener 2010 at 06:31 5 comentaris

Efectos visuales con Arduino y Processing – Se abre el telón

Os presento este proyecto que en un principio se planteo como reclamo de acceso a un bar musical de unos amigos.
Tomando como base una pantalla LCD de 32 ” me plantee hacer algo divertido que hiciera interactuar a los clientes de ese local. La idea es crear una imagen fija en pantalla (en mi caso use una imagen de un telon de teatro retocada y escalada con Photoshop), asi cuando la persona se aproximara al sensor, cerca de la pantalla, el “telon” se abrira dejando ver la imagen que monitoriza la webcam (en este caso a la misma persona que se aproxima, pero la camara se puede colocar en otro lugar para que de lectura de otra imagen p. ej.).
Las herramientas fueron: una placa de Arduino, un sensor de proximidad, una webcam y logicamente un PC portatil que gestionara todo aquello. Asi de facil.
A nivel de software, use la version de Arduino 0014 y Processing en su version 1.06 pero que las ultimas versiones 0017 y 1.09 respectivamnente supongo que seran mas estables y con mas librerias. Tambien es necesario el soft WinVDIG, un parche de QuickTime para el reconocimiento de la webcam por parte de Processing.
Lo podeis descargar en estos links:
- http://www.eden.net.nz/7/20071008/
- http://a.parsons.edu/ ~ getFrame / estudiantes / Jacqueline / src / WinVDIG.exe
Aqui viene cuando me enrollo con la exposicion del proyecto:
- Instalaremos el soft WinVDIG en el PC. En este caso de 1ª prueba, yo use la webcam del portatil. Al ejecutar WinVDIG
una vez instalado, te da lectura de la webcam. Lo puedes cerrar una vez probado.
- “Pincharemos” el sensor en la placa de Arduino. Yo use el pin analogico cero (0) pero se puede usar otro, solo hay que
referenciarlo en el codigo.
- Conectamos Arduino al PC buscamos que puerto COM ha sido adjudicado para la placa (COM 10, p. ej.)
- Tecleamos el codigo que os doy a continuacion. Es un codigo muy sencillo, simplemente es para que Arduino monitorice
el sensor que mas tarde usara Processing.

int valA;
void setup ( ) {
Serial.begin (9600);
}
void loop ( ) {

valA = valA *0.7 + 0.3* analogRead (0); // aqui con esa formula

// “redondeo” la señal del sensor, usando el pin 0
Serial.println (valA);

}

- Clickeamos el comando para monitorizar la señal del sensor en el soft de Arduino (para probar que el sensor recibe señal
y Arduino recibe valores). He de decir que el sensor que yo use era muy inestable y tuve que ponderar la señal, aun asi,
no me ayudo mucho. Recomiendo un sensor de buena calidad.
- Llegados aqui, ya podemos cerrar el soft de Arduino. Ahora la señal de Arduino la gestionara Processing.
- Ejecutamos Processing y tecleamos el codigo siguente:

import processing.video.* ;
import processing.serial.* ; // importa las libreria de comunicaciones
Serial puerto ;
int numPixels ;
Capture video ;
int valorA ;
PImage foto ; // aqui integramos la variable de las imagenes
PImage foto1;
PImage foto2 ;
void setup ( ) {
size ( 800,600 ) ; // aqui la resolucion de la pantalla
video = new Capture( this, width, height, 24) ;
numPixels = video.width * video.height ;
loadPixels ( ) ;
println ( Serial.list ( ) ); // aqui imprime todos los puertos serie
puerto = new Serial ( this, Serial.list ( ) [ 0 ], 9600 ) ; // ojo, aqui es donde

//marco el pin 0 que usa Arduino
puerto.bufferUntil(10);
foto = loadImage ( “Telon.png” ) ; // selecionamos las imagenes que vamos a

//usar
foto1 = loadImage ( “izq_telon.png” ) ;
foto2 = loadImage ( “der_telon.png” ) ;
}

void draw ( ) {
if (video.available ( ) ) {
video.read ( ) ;
video.loadPixels ( ) ;

for ( int i = 0 ; i < numPixels ; i++ ) {
color col = video.pixels [i] ;
int r = int ( red (col ) ) ; // aqui las variables de color. Si variasemos sus

//valores, la imagen tenderia a ser mas rojiza, azulada, etc
int g = int ( green (col ) ) ;
int b = int ( blue (col ) ) ;
pixels [i] = color (r,g,b) ;
}
updatePixels ( ) ;
}

image ( foto1, 90 -valorA ,0 ) ; // aqui centramos en la pantalla las imagenes

//que tendran movimiento
image ( foto2, 380 +valorA ,0 ) ;
image ( foto, 0, 0 ) ; // como vereis la imagen que esta estatica mantiene las

//cordenadas X / Y a 0
}

void serialEvent (Serial puerto) {
String cadena = puerto.readStringUntil ( 10 ) ;

if (cadena ! = null ) {

cadena = trim (cadena ) ;
valorA = int (valorA*0.7+ int (cadena)*0.3 ) ;
println (valorA) ;
}
}

- Es importante que nombreis en el codigo de Processing el puerto y el pin que usa Arduino para que funcione
correctamente, es importante tambien que las imagenes del “telon” o las que vosotros useis esten en la misma carpeta del
proyecto de Processing, si no sera imposible que Processing las reconozca y dara error de codigo.
- Como podreis leer en el codigo, he dado una resolucion de pantalla de 800×600. Las imagenes del “telon” deben
estar en la misma resolucion. Vosotros podeis variarlas segun vuestras necesidades y los formatos de pantalla/monitor
con los cuales trabajeis.
- Ejecutamos Play en Processing y … deberia salir la imagen del “telon” que se abre cuando aproximamos algo al sensor.
- De no ser asi repasar los pasos y releer los codigos (sobretodo el tema de puertos y pin en Arduino, puede que tengais
que variar los de “mis” codigos para que se adapten a vuestros equipos).

Debo agradecer la ayuda de Marco de http://www.marfonline.com/ (es una maquina).

Espero no haberme enrollado mucho y que le saqueis partido a esta idea tan simple pero que puede dar mucho juego en diferentes campos, como publicidad en escaparatismo o  video-vigilancia en seguridad p. ej.

Un saludo.

Yusup K

La inestabilidad de la imagen se debe a la baja calidad del sensor usado y a la influencia de un fluorescente situado sobre el equipo.

13 desembre 2009 at 19:04 4 comentaris

RFid a Arduino

Modul RFID

Modul RFID

Aqui teniu un pdf que explica com fer funcional un modul RFID de id innovations amb arduino:  RFID

22 setembre 2009 at 08:03 Deixa un comentari

Els mòduls Xbee

Aquí tenu un pdf amb els esquemes i el programa per com fer servir un modul xbee amb arduino o processing: xbee

Modul Xbee
Modul Xbee

22 setembre 2009 at 07:59 Deixa un comentari

Mas inventos con Arduino y instrumentos MIDI: Zheremino

Video demostración de Zheremino (Theremin óptico con Arduino)

Continue Reading 30 agost 2009 at 20:16 1 comentari

Una màquina que es capaç de replicar-se a si mateixa.

A la web es poden trobar els planols i com fer-la.

http://reprap.org/bin/view/Main/WebHome

15 juliol 2009 at 13:12 Deixa un comentari

Reunión 30-06-09

He decidido escribir un pequeño resumen de nuestro encuentro y colgarlo en una cuenta de gmail. La cuenta es arduinaires@gmail.com y el passwd es el mismo del wordpress pero con un cero.

1 juliol 2009 at 19:54 Deixa un comentari

Convertint els servos en servos de rotació continua.

Ja he acabat de fer probes amb els servos nous. Es terriblement facil convertir-los en servos de rotació continua:

1.- Treure els 4 cargols llargs de la part de darrera.

2.- Treure els 4 o 5 engranatges blancs i recordar la seva posició, per desprès tornar-los a muntar.

3.- Tallar una punxa quadrada que sobre surt.

4.- Limar un tope que te l’engranatge blanc mes llarg.

5.- Tornar a muntar tot.

Modelcraft-TOP-Line-ES-05-Mini-Servo

P.D: La diferencia que tenen respecte als parallax son els polsos. treballen a una amplitut diferent. (s’han de fer probes)

26 juny 2009 at 17:42 Deixa un comentari

Older Posts


Fotos de Projectes

Imagen041

Imagen030

More Photos

Follow

Get every new post delivered to your Inbox.