martes, 2 de diciembre de 2014

10. Entrada Analógica

Se trata de configurar un canal de entrad analógico pin 5 y enviar el valor leído al PC
para visualizarlo



Programa
/* Entrada Analógica */
int potPin = 5; // selecciona el pin de entrada para colocar el potenciómetro
int val = 0; // variable para almacenar el valor leído por la entrada analógica
void setup() {
beginSerial(9600);
}
void loop() {
val = analogRead(potPin); // lee el valor del canal de ENTRADA analógica
printInteger(val); // Envía al PC el valor analógico leído y lo muestra en pantalla
serialWrite(10);
delay(100);
}

9 contador

Se trata de contar las veces que se pulsa un botón conectado en la entrada 7 de Arduino
a la vez que cada vez que contamos encendemos el led conectado en la salida 13. El
valor de la variable que almacena el número de impulsos generados se envía al PC para
que se visualice en la pantalla.





Esquema


/* Programa Contador
* -----------
*
* Detecta si el botón conectado a la entrada 7 ha sido presionado y enciende el LED
* Envía al PC el valor de la variable de cuenta ""Contador" vía puerto serie.
*
* Christian Nold & Erica Calogero
*
*/
int LED = 13;
int Boton = 7;
int valor = 0;
int contador = 0;
int estadoanteriorboton = 0;
void setup()
{
beginSerial(9600); // Configura velocidad de transmisión a 9600
Prácticas con Arduino Nivel I
30
pinMode(LED, OUTPUT); // inicializa como salida digital el pin 13
pinMode(Boton, INPUT); // inicializa como entrada digital el 7
}
void loop()
{
valor = digitalRead(Boton); // lee el valor de la entrada digital pin 7
digitalWrite(LED, valor);
if(valor != estadoanteriorboton){
if(valor == 1){
contador++;
printInteger(contador);
serialWrite(10);
serialWrite(13);
}
}
estadoanteriorboton = valor;
}


Podríamos prescindir de la resistencia colocada con el pulsador si habilitásemos la
resitencia interna Pull-up de la entrada PIN7 en ese caso el circuito quedaría como el
siguiente:




El programa en este caso seria muy parecido al anterior. Observese que ahora al pulsar
el boton introducimos un “=” en el PIN7 por lo tanto si quiero que se encienda la salida
PIN13 debo escribir en ella el valor leido del pulsador negado es decir “!valor”
/* Programa Contador Modificado
* -----------
*
* Detecta si el botón conectado a la entrada 7 ha sido presionado y enciende el LED
* Envía al PC el valor de la variable de cuenta ""Contador" vía puerto serie.
*
* Christian Nold & Erica Calogero J.M. Ruiz
*
*/
int LED = 13;
int Boton = 7;
int valor = 0;
int contador = 0;
int estadoanteriorboton = 0;
void setup()
{
beginSerial(9600); // Configura velocidad de transmisión a 9600
pinMode(LED, OUTPUT); // inicializa como salida digital el pin 13
pinMode(Boton, INPUT); // inicializa como entrada digital el 7
digitalWrite(Boton,HIGH); // Habilitamos la resitencia interna Pull-up del PIN7
}
void loop()
{
valor = digitalRead(Boton); // lee el valor de la entrada digital pin 7
digitalWrite(LED, !valor); // Escribimos en la salida el bvlaor leido negado
if(valor != estadoanteriorboton){
if(valor == 1){
contador++;
printInteger(contador);
serialWrite(10);
serialWrite(13);
}
}
estadoanteriorboton = valor;
}

8. Estrella fugaz

Descripción del ejercicio
Este ejercicio muestra como realizar un rayo de luz, o más poéticamente, una estrella
fugaz, moviéndose a través de una línea de LED-s. Podremos configurar tanto la
velocidad de de la estrella, así como la longitud de la cola. No es muy elegante porque
la cola brilla con la misma intensidad que la estrella, y al final, parecerá como si un rayo
sólido cruzase la línea de LED-s.

Elementos necesarios:
· 11 LED-s.
· 11 resistencias de 220 Ohmios.
· Una placa protoboard.
· Cables para realizar las conexiones.

Esquema

¿Cómo funciona?
Hay que conectar 11 LED-s a los pines digitales de la placa a través de resistencias de
220 Ohmios tal y como se muestra en la imagen superior.


El programa comienza encendiendo LED-s hasta que llegue al número de LED-s
establecido para la cola. En ese momento seguirá encendiendo LED-s hacia la izquierda
(si se monta tal y como se muestra en la fotografía inferior), para mantener el
movimiento de la estrella, al mismo tiempo que apaga LED-s por la derecha, para
asegurarnos de que vemos la cola. De otra forma seguiría encendiendo LED-s hasta
encenderlos todos. Esto ocurre cuando el tamaño de la cola es igual o mayor que el
número de LED-s.
El tamaño de la cola debería ser relativamente pequeño en comparación con el número
de LED-s de forma que podamos ver la estrella.



Código fuente
/* Estrella fugaz
*--------------
* Este programa es una variante del ejemplo del coche fantástico. Muestra mediante
* un loop una estrella fugaz que es dibujada en una línea de LED-s
* directamente conectados a la placa Arduino. Puedes controlar la velocidad a la que
* la estrella se mueve gracias a una variable llamada "waitNextLed". También
* puedes controlar la longitud de la cola de la estrella a través de la variable "tail
* length"
* @author: Cristina Hoffmann
* @hardware: Cristina Hofmann
*/
// Variable declaración
// Declaración de los PIN-es mediante un array
int pinArray [] = { 2,3,4,5,6,7,8,9,10,11,12 };
int controlLed = 13; // LED de control
int waitNextLed = 100; // Tiempo antes de encender el siguiente LED
// Número de LED-s que permanecen encendidos antes de empezar a apagarlos para
//formar la cola
int tailLength = 4;
// Número de LED-s conectados (que es también el tamaño del array)
int lineSize = 11;
void setup() // Configuración de los PIN-es como salida digital
{
int i;
pinMode (controlLed, OUTPUT);
for (i=0; i< lineSize; i++)
{
pinMode(pinArray[i], OUTPUT);
}
}
void loop()
{
int i;
// Se establece la longitud de la cola en un contador
int tailCounter = tailLength;
// Se enciende el LED de control para indicar el inicio del loop
digitalWrite(controlLed, HIGH);
for (i=0; i<lineSize; i++)
{
digitalWrite(pinArray[i],HIGH); // Se encienden consecutivamente los LED
// Esta variable de tiempo controla la velocidad a la que se mueve la estrella
delay(waitNextLed);
if (tailCounter == 0)
{
// Se apagan los LED-s en función de la longitud de la cola.
digitalWrite(pinArray[i-tailLength],LOW);
}
else
if (tailCounter > 0)
tailCounter--;
}
for (i=(lineSize-tailLength); i<lineSize; i++)
{
digitalWrite(pinArray[i],LOW); // Se apagan los LED
// Esta variable de tiempo controla la velocidad a la que se mueve la estrella
delay(waitNextLed);
}
}

Video: 


7. El coche fantástico

Descripción del ejercicio
Hemos denominado este ejemplo como "El coche fantástico" en memoria de la serie de
TV de los años 80 en la que el famoso David Hasselhoff tenía una máquina de IA
conduciendo su Pontiac. El coche estaba equipado con gran cantidad de LED-s de todos
los tamaños posibles que realizaban efectos parpadeantes.
De esta manera hemos decidido, con el objetivo de aprender programación secuencial y
buenas técnicas para programar la placa E/S, sería interesante usar el coche fantástico
como una metáfora.
Este ejemplo hace uso de 6 LED-s conectados a los PIN 2 a 7 de la placa mediante
resistencias de 220 Ohmios. El primer código de ejemplo hace parpadear a los LED en
secuencia de uno en uno, utilizando sólo las funciones
digitalWrite(pinNum,HIGH/LOW) y delay(time). El segundo ejemplo muestra como
usar una secuencia de control for(;;;) para hacer lo mismo, pero en menos líneas de
código. El tercer y último ejemplo se centra en el efecto visual de apagar y encender los
LED-s de una forma más suave.

Elementos necesarios:
· 6 LED-s.
· 6 resistencias de 220 Ohmios.
· Una placa protoboard.
· Cables para realizar las conexiones


Ejemplo 1

Código fuente
/* El coche fantástico 1
* ---------------------
*
* Básicamente una extensión del LED parpadeante.
*
*
* (cleft) 2005 K3, Malmo University
* @author: David Cuartielles
* @hardware: David Cuartielles, Aaron Hallborg
*/
int pin2 = 2; // PIN-es de los LED
int pin3 = 3;
int pin4 = 4;
int pin5 = 5;
int pin6 = 6;
int pin7 = 7;
int timer = 100; // Temporizador
void setup(){
pinMode(pin2, OUTPUT); // Configuración de los PIN-es como salida
pinMode(pin3, OUTPUT);
pinMode(pin4, OUTPUT);
pinMode(pin5, OUTPUT);
pinMode(pin6, OUTPUT);
pinMode(pin7, OUTPUT);
}
void loop() {
digitalWrite(pin2, HIGH); // Enciende y apaga secuencialmente LED-s
delay(timer);
digitalWrite(pin2, LOW);
delay(timer);
digitalWrite(pin3, HIGH);
delay(timer);
digitalWrite(pin3, LOW);
delay(timer);
digitalWrite(pin4, HIGH);
delay(timer);
digitalWrite(pin4, LOW);
delay(timer);
digitalWrite(pin5, HIGH);
delay(timer);
digitalWrite(pin5, LOW);
delay(timer);
digitalWrite(pin6, HIGH);
delay(timer);
digitalWrite(pin6, LOW);
delay(timer);
digitalWrite(pin7, HIGH);
delay(timer);
digitalWrite(pin7, LOW);
delay(timer);
digitalWrite(pin6, HIGH);
delay(timer);
digitalWrite(pin6, LOW);
delay(timer);
digitalWrite(pin5, HIGH);
delay(timer);
digitalWrite(pin5, LOW);
delay(timer);
digitalWrite(pin4, HIGH);
delay(timer);
digitalWrite(pin4, LOW);
delay(timer);
digitalWrite(pin3, HIGH);
delay(timer);
digitalWrite(pin3, LOW);
delay(timer);
}
Ejemplo 2




En este caso las luces se encenderán y apagaran todas en un sentido y luego , acabada la
secuencia en sentido contrario.

/* El coche fantástico 2
* ---------------------
*
* Reduciendo las líneas de código usando un for(;;).
*
*
* (cleft) 2005 K3, Malmo University
* @author: David Cuartielles
* @hardware: David Cuartielles, Aaron Hallborg
*/
int pinArray[] = {2, 3, 4, 5, 6, 7}; // Define el array de pines
int count = 0; // Contador
int timer = 100; // Temporizador
void setup(){
for (count=0;count<6;count++){ // Configuramos todos los PIN-es
pinMode(pinArray[count], OUTPUT);
}
}
void loop() { // Enciende y apaga secuencialmente los LED-s
for (count=0;count<6;count++) { // utilizando la secuencia de control for(;;)
digitalWrite(pinArray[count], HIGH); // Recorrido de ida
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer);
}
for (count=5;count>=0;count--) {
digitalWrite(pinArray[count], HIGH); // Recorrido de vuelta
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer);
}
}


Ejemplo 3
En este caso el efecto que se crea es una estela visual muy vistosa.



/* El coche fantástico 3
* ---------------------
*
* Este ejemplo se centra en el efecto visual.
*
*
* (cleft) 2005 K3, Malmo University
* @author: David Cuartielles
* @hardware: David Cuartielles, Aaron Hallborg
*/
int pinArray[] = {2, 3, 4, 5, 6, 7}; // PIN-es
int count = 0; // Contador
int timer = 30; // Temporizador
void setup(){
for (count=0;count<6;count++) { // Configuramos todas los PIN-es de golpe
pinMode(pinArray[count], OUTPUT);
}
}
void loop() {
for (count=0;count<5;count++) { // Enciende los LED creando una estela visual
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count + 1], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer*2);
}
for (count=5;count>0;count--) {
digitalWrite(pinArray[count], HIGH);
delay(timer);
digitalWrite(pinArray[count - 1], HIGH);
delay(timer);
digitalWrite(pinArray[count], LOW);
delay(timer*2);
}
}

6. Potenciómetro: Lectura de señal Analógica

Descripción:
El potenciómetro es un dispositivo electromecánico que consta de una resistencia de
valor fijo sobre la que se desplaza un contacto deslizante, el cursor, que la divide
eléctricamente. Como se muestra en el siguiente gráfico:

Vout=((R1/(R1+R2))*Vin (Aplicando la ley de Ohm)
Un potenciómetro es especificado por su resistencia total, R, entre los terminales
externos 1 y 3; El movimiento del cursor origina un cambio en la resistencia medida
entre el terminal central, 2, y uno cualquiera de los extremos.
Este cambio de resistencia puede utilizarse para medir desplazamientos lineales o
angulares de una pieza acoplada al cursor.
Se conectan en paralelo al circuito y se comporta como un divisor de tensión.
Un potenciómetro también puede ser usado como una resistencia variable (o reóstato)
de dos terminales, en ese caso, se cortocircuitan dos de las tres patas del potenciómetro.
Ejemplo:
Listado de componentes:
· 1 Potenciómetro de 10k
· 1 Diodo LED
· Varios cables
Circuito:
Se conectan tres cables a la tarjeta Arduino. El primero va a tierra desde el terminal 1
del potenciómetro. El terminal 3 va a la salida de 5 voltios. El terminal 2 va desde la
entrada analógica #2 hasta el terminal interno del potenciómetro.
Girando el dial o ajustando el potenciómetro, cambiamos el valor de la resistencia
variable. Esto produce oscilaciones dentro del rango de 5 y 0 voltios, que son
capturados por la entrada analógica.

5. Lectura de un sensor de inclinación

Descripción del ejercicio
El sensor de inclinación es un componente que puede detectar la inclinación de un
objeto. Sin embargo, no deja de ser un pulsador activado por un mecanismo físico
diferente. Este tipo de sensor es la versión ecológica de un interruptor de mercurio.
Contiene una bola metálica en su interior que conmuta los dos pines del dispositivo de
encendido a apagado, y viceversa, si el sensor llega a un cierto ángulo.


El código de ejemplo es el mismo que se empleó para el ejemplo del pulsador, pero
sustituyendo este último por el sensor de inclinación. Usamos una resistencia de pull-up
(de esta manera usamos la "activación a nivel bajo" para activar los pines) y conectamos
el sensor al pin de entrada digital que leeremos cuando lo necesitemos.
Se ha utilizado una resistencia de 1K para montar la resistencia de pull-up y el sensor.
Hemos elegido un sensor de inclinación de Assemtech.
Elementos necesarios:
· Una resistencia de 10K Ohmios.
· Un sensor de inclinación Assemtech.
· Un diodo LED.
· Cables para realizar las conexiones.


El esquema es el mismo que en el del ejemplo del pulsador

4. Lectura de un pulsador

Descripción del ejercicio
El pulsador es un componente que conecta dos puntos de un circuito cuando es
presionado.
Para generar una señal de tensión con el pulsador, se necesita un divisor de tensión.
Ejemplo:
La resistencia Rabajo(pull-down) en el primer circuito fuerza a Vout, llegando a nivel
CERO, hasta que se acciona el pulsador. Este circuito entrega una tensión alta, cuando
se presiona el pulsador. Un valor para la resistencia de 10 k es adecuada.
En el segundo circuito, la resistencia Rarriba (pull-up) fuerza a nivel ALTO a Vout,
mientras no se actúe sobre el pulsador. Al presionar el pulsador, se conecta Vout
directamente con 0 V. Es decir, este circuito entrega un nivel BAJO cuando se presiona
el pulsador.
Elementos necesarios:
· Un resistencia de 1K Ohmios.
· Un pulsador.
· Un diodo LED
· Cables para realizar las conexiones.

Se utiliza una resistencia pull-dowm, junto con un pulsador, para conectarla a un pin de
entrada digital, y de esta forma, poder saber cuando el pulsador es presionado. Si el
pulsador está presionado, el valor del pin 10 será de 0 voltios (LOW) en caso contrario
será de + 5 voltios (HIGH).
En una placa protoboard debe haber una resistencia de 10K conectada entre el pin de
entrada y tierra como se ve el esquema y foto inferiores.
Esquema
Código fuente
/* Pulsador
* --------
*
* Detecta si el botón ha sido presionado o no
* y enciende el LED en consecuencia.
*
* Massimo Banzi
*
*/
int ledPin = 13; // PIN del LED
int inPin = 10; // 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 10 como entrada digital
}
void loop() {
value = digitalRead(inPin); // Lee el valor de la entrada digital
digitalWrite(ledPin, value);
}



3. Secuencia Básica de 3 LEDs

Se trata de encender y apagar 3 LEDs colocados en las salidas 6, 7 y 8 (PIN6, PIN7 y
PIN8) con una cadencia de 200 ms. Las variables asignadas a cada led son ledPin1,
ledPin2 y ledPin3

Programa
// Encendido y apagado de 3 LEDs
int ledPin1 = 6; // Define las salidas de los LED´s
int ledPin2 = 7;
int ledPin3 = 8;
void setup() { // Configura las SALIDAS
pinMode(ledPin1, OUTPUT); // declarar LEDs como SALIDAS
pinMode(ledPin2, OUTPUT);
pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin1, LOW); // Apaga los LEDs
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, LOW);
}
void loop(){ //Bucle de Funcionamiento
digitalWrite(ledPin1, HIGH); // Apaga y enciende los leds cada 200 ms
delay(200);
digitalWrite(ledPin1, LOW);
digitalWrite(ledPin2, HIGH);
delay(200);
digitalWrite(ledPin2, LOW);
digitalWrite(ledPin3, HIGH);
delay(200);
digitalWrite(ledPin3, LOW);
{