bricoarduino: de arduino serial a pseudo pro

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.

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

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...

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.

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:

#! /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.

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

Weno, he editado el codigo un poco para que se vea mejor. Perdón que soy mu novato yo en esto :*

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

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.

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:

#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.