Go Down

Topic: bricoarduino: de arduino serial a pseudo pro (Read 2177 times) previous topic - next topic

donrodrigo

Feb 02, 2012, 10:43 pm Last Edit: Feb 02, 2012, 11:36 pm by donrodrigo Reason: 1
Weno, pues como soy un friki del bricolage, y me sobraban algunas plaquitas virgenes de arduino serial v2; me he liado la manta a la cabeza para montar un pseudo arduino pro con piezas de montaje convencional y programable a traves de cable ftdi o por puerto icsp. Asi que alla van las fotos del enjendro. Pillamos una pcb del modelo serial v.2 como esta

Montamos los componentes, pero suprimiendo todos aquellos que se emplean en el puerto serie rs232c. En su lugar montaremos un pad de 6 pins (ver el detalle del pin de masa como esta modificado) para usarlo como puerto ftdi.

observar tambien el detalle del condensador de 100 nf conectado al pin de reset. Luego veremos como conectar el otro terminal de este condensador.





donrodrigo

Ahora una vista general del enjendro completo y detalles del mismo.


copachino

te quedo muy guapa la verdad yo vere si cuando me vengan los atmega328 que pedi me armo alguna... aunque iba a probar con la paperduino que anda por ahi que solo tengo que pargar componerntes jejeje..

per bueno muy guapa esta la plaquita la verdad...

donrodrigo

#3
Feb 02, 2012, 11:20 pm Last Edit: Feb 02, 2012, 11:39 pm by donrodrigo Reason: 1
He empleado un atmega 328p virgen, sin bootloader (lo he grabado a posteriori a traves del puerto icsp. Pondre el codigo). Los componentes empleados son de los valores originales, solo que en vez de electroliticos he usado condensatas de tantalo solido que es lo ke tenia a mano. En vez del condesador c8 original, he colocado un led (azul, me molan de ese color, para usarlo como led de pin D13).

componentes eliminados:
-c8
- t1 y t2
- d2 y d3
- r1, r3, r4, r6, r7, r8 y r9
componentes añadidos:

-led azul de 5mm en puesto del c8, con anodo al pin marcado con "+".



-resistencia de 220 ohms y 250 mW de pin derecho de r3 a pin derecho de r1 (esta de pie).
- puente entre los pins de r3. He usado el terminal de la resistencia que he puesto de pie para hacerlo por debajo de la placa.
- puente entre los pins de r4.
- puente entre los pins de r8.
-puente entre los pins de r6.
-puente entre los pins de colector y base de t1.
- puente entre los pins de colector y base de t2
- puente de pin de emisor de t2 a pin 4 del puerto serie (he usado un cable por debajo de la placa). Tengo la intencion de eliminar este puente, para poder mantener alimentacion externa y el cable ftdi conectados al mismo tiempo.
- condensador de 100 nF conectado del pin1 del puerto serie al pulsador de reset (pin que no es masa). un cable por debajo de la placa.



donrodrigo

#4
Feb 02, 2012, 11:34 pm Last Edit: Feb 03, 2012, 07:12 pm by donrodrigo Reason: 1
Falta colocar el conector hembra para alimentacion externa, puesto que no tenia ninguno a mano. Para programar el bootloader he empleado un buspirate v3.a de sparkfun ( he de admitir que tengo debilidad por este juguetito), y puesto que soy muy comodon he empleado un script en bash ( lo siento soy muy friki) tal que este:

Code: [Select]
#! /bin/bash
avrdude -c buspirate -p m328p -P /dev/buspirate -u -U lock:w:0x3F:m
avrdude -c buspirate -p m328p -P /dev/buspirate -e
avrdude -c buspirate -p m328p -P /dev/buspirate -B 25 -u -U efuse:w:0x05:m -U hfuse:w:0xDA:m -U lfuse:w:0xFF:m
avrdude -c buspirate -p m328p -P /dev/buspirate -B 1 -b 57600 -U flash:w:ATmegaBOOT_168_atmega328.hex
avrdude -c buspirate -p m328p -u -P /dev/buspirate -U lock:w:0x0F:m


El hex lo he obtenido de la carpeta \arduino-1.0\hardware\arduino\bootloaders\atmega, y lo he puesto en la misma carpeta que el script. Con el firmware 6.1 del buspirate  se tuesta el bootloader en un pedo. En mi caso udev me reconoce el programador como "/dev/buspirate" pero funcionaria igual con "/dev/ttyUSB0".

Pues ala ahi queda eso.



copachino

hola muy buen trabajo de nuevo solo una cosa

pordiras editar el codigo y veras arriba un simbolo #  en medio de ellos pon el codigo para que pueda ser visualizado mejor

donrodrigo

#6
Feb 03, 2012, 07:19 pm Last Edit: Feb 03, 2012, 07:22 pm by donrodrigo Reason: 1
Weno, he editado el codigo un poco para que se vea mejor. Perdón que soy mu novato yo en esto :*

copachino

para nada gracias por el aporte que haces....... solo una cosa mas si pudiese colgar alguna información del funcionamiento seria excelente

donrodrigo

A efectos prácticos es idéntico al arduino pro o al arduino pro mini. Cualquier sketch que escribas para estas placas funcionara en esta con idénticos resultados. Hasta los pines de salida coinciden. De hecho puedes conectarla al pc con un cable ftdi o con un breakboard USB/ftdi, seleccionar en el ide arduino la placa arduino pro y usarla como si fuera la original. De hecho lleva su mismo bootloader. Ahora estoy fuera de casa pero el domingo puedo subir alguna foto de algún montaje con esta placa y su homologo con el arduino pro y con el mismo sketch. Por ejemplo un reloj con rtc.

donrodrigo

#9
Feb 05, 2012, 07:38 pm Last Edit: Feb 05, 2012, 09:22 pm by donrodrigo Reason: 1
programando el bricoarduino

cable FTDI

Programando el "brico", fijarse en la posicion del hilo de masa en el cable FTDI

Reloj operativo

Programando Arduino pro made in Sparkfun con el mismo sketch.

Aqui reloj operativo. El cambio de hora se debe a que he aprovechado para poner el rtc en hora.


Weno y por si alguien quiere ver un sketch patatero programado por un novato ahi va el codigo para el ide 1.0:
Code: [Select]
#include <Time.h>  
#include <Wire.h>  
#include <DS1307RTC.h>  // a basic DS1307 library that returns time as a time_t
/* reloj con rtc dsc1307, conectado por I2C a traves de los pins ANI4(sda) y ANI5(scl). Dos pulsadores a masa en los pins D2(int0) y D3 (int1)
alternan la visualizacion de hora-segs o fecha y el otro regula el brillo del lcd. Estabilizamos etos pins mediante resistencias de pullup a vcc
(10 Kohms). Visualizamos la hora mediante un display lcd serie, conectado a tx1 pin D1.*/
int bascula=0;
int brill=0;
void brillo()
{
 brill=brill+5;
 if (brill>250){
   brill=0;
 }
 Serial.write(0x7A);
 Serial.write(brill);

}
void digitalClockhora()
{
 char hora[2];
 itoa(hour(),hora,10);
 char minu[2];
 itoa(minute(),minu,10);
 if (hour()<10 && minute()<10){
   Serial.print("0");
   Serial.print(hora[0]);
   Serial.print("0");
   Serial.print(minu[0]);
 }
 else if (hour()<10 && minute()>=10)
 {  
   Serial.print("0");
   Serial.print(hora[0]);
   Serial.print(minu[0]);
   Serial.print(minu[1]);
 }
 else if ( hour()>=10 && minute()<10){
   Serial.print(hora[0]);
   Serial.print(hora[1]);
   Serial.print("0");
   Serial.print(minu[0]);
 }
 else if(hour()>=10 && minute()>=10){
   Serial.print(hora[0]);
   Serial.print(hora[1]);
   Serial.print(minu[0]);
   Serial.print(minu[1]);
 }
}
void digitalclockseg(){
 char segu[2];
 itoa(second(),segu,10);
 if (second()<10)
 {
   Serial.print("x");
   Serial.print("x");
   Serial.print("0");
   Serial.print(segu[0]);
 }
 else if (second()>=10)
 {
   Serial.print("x");
   Serial.print("x");
   Serial.print(segu[0]);
   Serial.print(segu[1]);
 }
}
void bascular()
{
 bascula=bascula+1;
 if (bascula>2)
 {
   bascula=0;
 }
}
void digitalclockfecha()
{
 char dia[2];
 char mes[2];
 char anyo[4];
 itoa (day(),dia,10);
 itoa (month(),mes,10);
 itoa (year(),anyo,10);
 if (day()<10 && month()<10)
 {
   Serial.write(0x77);
   Serial.write(0x02);
   Serial.print("x");
   Serial.print(dia[0]);
   Serial.print("x");
   Serial.print(mes[0]);
   delay (1000);
   Serial.write(0x77);
   Serial.print(0);
   Serial.print(anyo[0]);
   Serial.print(anyo[1]);
   Serial.print(anyo[2]);
   Serial.print(anyo[3]);
 }
 if (day()>=10 && month()<10)
 {
   Serial.write(0x77);
   Serial.write(0x02);
   Serial.print(dia[0]);
   Serial.print(dia[1]);
   Serial.print("x");
   Serial.print(mes[0]);
   delay (1000);
   Serial.write(0x77);
   Serial.print(0);
   Serial.print(anyo[0]);
   Serial.print(anyo[1]);
   Serial.print(anyo[2]);
   Serial.print(anyo[3]);
 }
 if (day()<10 && month()>=10)
 {
   Serial.write(0x77);
   Serial.write(0x02);
   Serial.print("x");
   Serial.print(dia[0]);
   Serial.print(mes[0]);
   Serial.print(mes[1]);
   delay (1000);
   Serial.write(0x77);
   Serial.print(0);
   Serial.print(anyo[0]);
   Serial.print(anyo[1]);
   Serial.print(anyo[2]);
   Serial.print(anyo[3]);
 }
 if (day()>=10 && month()>=10)
 {
   Serial.write(0x77);
   Serial.write(0x02);
   Serial.print(dia[0]);
   Serial.print(dia[1]);
   Serial.print(mes[0]);
   Serial.print(mes[1]);
   delay (1000);
   Serial.write(0x77);
   Serial.print(0);
   Serial.print(anyo[0]);
   Serial.print(anyo[1]);
   Serial.print(anyo[2]);
   Serial.print(anyo[3]);
 }  
}
void setup()  {
 Serial.begin(57600);
 Serial.write(0x77);//ENCENDER PUNTOS
 Serial.write(0x10);// SOLO DOS PUNTOS BIN 00010000
 setSyncProvider(RTC.get);   // the function to get the time from the RTC
}

void loop()
{
 if (bascula==0){
   attachInterrupt(0,bascular,FALLING);
   attachInterrupt(1,brillo,FALLING);
   Serial.write(0x77);//ENCENDER PUNTOS
   Serial.write(0x10);// SOLO DOS PUNTOS BIN 00010000
   digitalClockhora();  
   delay(1000);
 }
 if (bascula==1){
   attachInterrupt(0,bascular,FALLING);
   attachInterrupt(1,brillo,FALLING);
   Serial.write(0x77);//ENCENDER PUNTOS
   Serial.write(0x10);// SOLO DOS PUNTOS BIN 00010000
   digitalclockseg();
   delay(1000);
 }
 if (bascula==2){
   attachInterrupt(0,bascular,FALLING);
   attachInterrupt(1,brillo,FALLING);
   Serial.write(0x77);//ENCENDER PUNTOS
   Serial.print(0);// apaga puntos
   digitalclockfecha();
   delay(1000);
 }
}

weno pos ya'sta
Un saludo.

Go Up