sábado, 18 de febrero de 2012

Arduino Standalone

O lo que es lo mismo, hacer funcionar el atmega328 sin necesidad de la placa del arduino.

Razón de hacer esto:
- ahorro de espacio
- el atmega por separado es mucho más barato
- para proyectos dedicados no merece la pena perder una placa arduino

Tras una larga tarde buscando por internet como iban las conexiones, he conseguido hacer que funcione el ejemplo de blink y ha quedado así




Ingredientes necesarios:

1x Atmega328
1x 16MHz clock crystal
2x 22 pF capacitors
cable y alimentación a 5v

En el caso que tengas que alimentarlo con un voltaje mayor de 5v necesitarás un

1x L7805CV (este sirve para pasar un voltaje de entrada de hasta 40v a 5v para la alimentación del atmega, ojo que debe ser mínimo 7 u 8v)

OJO. He puesto en el dibujo 2 pilas AA pero sólo para indicar como va la entrada de corriente, que debe ser 5v, el dibujo es orientativo



Esto es lo mínimo que se puede poner, después ya te apañas tu para ponerle lo que necesites, si no te sabes de memoria que es cada patilla, puedes fijarte aquí



Y después de ponerle algo útil. Tenemos nuestro atmega funcionando



Si queremos programar el Atmega sin tener que sacarlo y ponerlo en la placa de arduino debemos hacer la siguiente conexión:



Y ya tenemos el primer paso hecho hacia el siguiente proyecto...

miércoles, 15 de febrero de 2012

Comenzando con IR (recepción de datos)

Bueno, dada la pereza, haré un breve pero interesante documento sobre lo que llevo hecho. La intención del proyecto es poder controlar cosas con IR así que esta es la primera parte, entender los datos.

Como emisor, usaré un mando a distancia cualquiera. Ya haré otra publicación sobre como hacer uno propio.

Parte del receptor:

He usado un receptor IR que tenía por ahi perdido, pero básicamente todos los receptores tienen 3 pines, uno para la entrada de 5v, otro para la tierra y otro para los datos.

Los 5v y tierra los conectamos a arduino, y el de datos lo conectamos al pin2 de los digitales.

En mi ejemplo he puesto que arduino, según lo leido por IR , controle un led bicolor y los he conectado a los pines 8 y 9






En cuanto al código, me he copiado descaradamente de esta web http://www.ladyada.net/learn/sensors/ir.html, en la cual aparece muy claramente una explicación y el código.

domingo, 24 de julio de 2011

Midiendo inductancias con Arduino

Cuando estas trasteando y aprendiendo en el mundo de la electrónica siempre es interesante mirar circuitos que otras personas han diseñado y probado para realizar funciones específicas que necesitas. Es simple, te bajas el esquema, te haces con los componentes y los sueldas en una placa perfboard o te haces tu propio PCB.

Pero hay un problema que siempre se me presenta con un circuito analógico medianamente complicado, y es ¿y como cojones se que inductancia tiene esta bobina?

Pues bien, acabo de ver en dangerous prototypes un método súper sencillo para medir inductancias usando arduino, echadle un vistazo y si alguno lo prueba, me contáis.

miércoles, 2 de febrero de 2011

Arduino: The Documentary

Para los fans de este maravilloso proyecto que es Arduino, aquí os dejo un excelente documental realizado por LABoral Centro de Arte y Creación Industrial (link) y filmado en Madrid, Gijón y Nueva York, que muestra los comienzos y la historia de este peculiar proyecto que cambió todos los esquemas en el mundo de la electrónica para aficionados (y no tan aficionados).

Aquí os dejo el trailer de Arduino: The Documentary.



Podéis encontrar el documental completo en su web: http://arduinothedocumentary.org/

sábado, 1 de enero de 2011

Eclipse + avr-gcc + avrdude

Si estais hasta los mismísimos del cutreIDE de arduino, existe una solución perfecta!

AVR-Eclipse

Es un plugin de eclipse que extiende CDT (el componente de C/C++) y te integra avr-gcc (el compilador libre, el mismo que usa arduino), avrdude (para programar el chip, soporta tb el bootloader de arduino) y eclipse, el IDE de programación preferido por los niños

Para rematar el conjunto, podéis incorporar las librerias arduino a vuestros proyectos escritos en C, pero esto ya lo dejo para otro post :P

lunes, 27 de diciembre de 2010

Pequeña alarma anti-robo

Hi again :)

Hoy volveremos a hacer un proyecto sencillo, pero resultón ;) Una sencilla alarma anti-robo, haciendo uso de un tilt sensor, es decir, un sensor de inclinación/vibración/movimiento... Este sensor, se comporta a efectos prácticos como un botón normal y corriente (ON/OFF).

Lo montaremos con ayuda de nuestra protoboard, de forma que cuando alguien mueva la protoboard, un LED se iluminará y un zumbador hará ruido. Para este proyecto necesitaremos:

- 1 tilt sensor.
- 1 resistencia de 10k Ohms.
- 1 zumbador piezo.
- 1 LED.


El circuito, que es bastante simple, se puede ver en la siguiente imagen:
















Como vemos, hemos conectado el tilt sensor al pin 2, y el buzzer al 7.


El código que hemos usado es el siguiente:


int ledPin = 13; // PIN del LED
int inPin = 2; // PIN del pulsador
int value = 0; // Valor del pulsador

void setup() {

pinMode(ledPin, OUTPUT); // Inicializa el pin 13 como salida digital
pinMode(inPin, INPUT); // Inicializa el pin 2 como entrada digital
Serial.begin(9600); // use the serial port

}

void loop() {

value = digitalRead(inPin); // Lee el valor de la entrada digital

if (digitalRead(inPin) == 1) {
value = 0;
noTone(7);
}
else {
value = 1;
tone(7, 150, 500);
}
digitalWrite(ledPin, value);
Serial.println(value);

}


El pequeño “arreglo” que hemos hecho en el loop, poniendo value a 0 cuando por el pin 2 se lee 1, y poniéndolo a 1 cuando se lee 0, es porque así el LED estará apagado en estado de reposo.


El resultado, una vez conectado todo y habiendo subido el programa al Arduino, se puede ver en el siguiente vídeo (por cierto, comentar que mi tilt sensor está un poco suelto, ya que las patillas son demasiado cortas, y no me apetecía ponerle alargadores, por eso lo aprieto contra la protoboard cuando levanto todo ;)):




Y esto ha sido todo. Espero que os haya gustado.

Un saludo :)

domingo, 26 de diciembre de 2010

Controlando la intensidad de un LED

Hola de nuevo :)

Siguiendo con nuestros proyectos para principiantes, a continuación veremos dos que nos permitirán controlar la intensidad de un LED (y ver los datos resultantes también en el Serial Monitor). Empecemos...


Control de intensidad de un LED con un potenciómetro

En este sencillo proyecto controlaremos la intensidad de un diodo LED mediante un potenciómetro que usaremos como manivela. Necesitaremos:

- 1 LED.

- 1 potenciómetro.

Conectaremos una de las patillas del potenciómetro que van juntas (hay dos en un lado y una sola en el otro) a tierra (negativo), y la otra a 5V (positivo). La patilla que va sola en su lado, la conectaremos al pin analógico (A0) de Arduino.

Por otra parte, conectaremos el negativo del LED a tierra, y el positivo al pin digital 9 de Arduino.

El resultado, con la ayuda de nuestra protoboard, es el siguiente:











El código que hará que podamos controlar la intensidad con el potenciómetro se expone a continuación:


int knobValue, fadeValue;

void setup() {

// initialize the serial port

Serial.begin(9600);

}

void loop() {

// read the value from the input

knobValue = analogRead(knobPin);

// remap the values from 10 bit input to 8 bit output

fadeValue = map(knobValue, 0, 1023, 0 , 254);

// use the input value to fade the led

analogWrite(ledPin, fadeValue);

// print the input value to the serial port for debugging

Serial.println(fadeValue);

}


Como veis es muy simple. El resultado se puede ver en este vídeo:



Control de intensidad de un LED con un botón

Ahora vamos a controlar la intensidad del LED mediante un botón. Cuando se pulsa el botón, la intensidad del LED va aumentando, y cuando se suelta, va disminuyendo.

Necesitaremos:

- 1 LED.

- 1 botón.

- 1 resistencia de 10k Ohms.

Conectaremos los componentes del siguiente modo:











Como se puede ver, usamos el pin digital 8 con el botón, y el 9 con el LED.

El código que hemos empleado es el siguiente:


const int fadeTimerFreq = 30;

// fadeTime is the total time it will take to complete the ease (in milliseconds)

const int fadeTime = 3000;

// <<

// additional variable for the timer

int currentTime, fadeTimerLast;

// these constant variables store the pin numbers

const int ledPin = 9;

const int buttonPin = 8;

const int fadeRange = 254;

// the amount to step the fade; must be between 1 and the fadeRange

const float fadeStep = (float(fadeTimerFreq) / (fadeTime)) * fadeRange;

int buttonValue, fadeTarget, fadeValueTweened;

float fadeValue;

void setup() {

// initialize the serial port; needed for debugging below

Serial.begin(9600);

// initialize the LED pin

pinMode(ledPin, OUTPUT);

// initialize the input pin

pinMode(buttonPin, INPUT);

}

void loop() {

// for all timers

currentTime = millis();

// checks to see if the number of milliseconds has passed

if ( abs(currentTime - fadeTimerLast) >= fadeTimerFreq) {

fadeTimerLast = currentTime;

// read the value from the input

buttonValue = digitalRead(buttonPin);

// step the fading

if(buttonValue == 1){

// if the button is pressed, increase the fade

fadeValue = fadeValue + fadeStep;

}

else{

// if the button is not pressed, decrease the fade

fadeValue = fadeValue - fadeStep;

}

// constrain the fadeValue so it can't go off toward infinity

fadeValue = constrain(fadeValue, 0, fadeRange);

// get the tweened value -- i.e. the smooth value

fadeValueTweened = Quad_easeInOut(fadeValue, 0, fadeRange);

// use the tweened value to set the brightness of the LED

analogWrite(ledPin, fadeValueTweened);

// print the values to the serial port for debugging

Serial.print(buttonValue);

Serial.print(", ");

Serial.println(fadeValue);

}

}

// Quad easing thanks to Robert Penner

// variables used are type "float" so that you can throw smaller numbers at it and it will //still work well

float Quad_easeInOut(float t, float fixedScaleStart, float fixedScaleEnd){

// float b = 0, c = 1, d = 1;

float b = fixedScaleStart;

float c = fixedScaleEnd - fixedScaleStart;

float d = fixedScaleEnd;

if ((t/=d/2) <>

return -c/2 * ((--t)*(t-2) - 1) + b;

}


El resultado se puede ver aquí:


Y... eso es todo :)

Un saludo.