Professional Documents
Culture Documents
con Arduino
Del poco tiempo que tengo ultimamente para hacer cosillas,
el Viernes por fin pude ir a la tienda de electrónica para
comprar materiales :).
Nueva práctica sobre encender una serie de LEDs tipo estrella fugaz,
ver Práctica 13.
2 //Estrella fugaz
3 int pinArray [] = {2,3,4,5,6,7,8,9,10,11,12,13 }; // Vector donde se van a declarar
4 int waitStart= 200; // Tiempo entre encender un LED y otro
5 int tailLength = 4; // Numero de LEDs activos
6 int lineSize = 12; // Numero total de LEDs
7
8 void setup()
9 {
10 int i;
11 for (i=0; i< lineSize; i++)
12 {
13 pinMode(pinArray[i], OUTPUT);
14 }
15 }
16
17 void loop()
18 {
19 int i;
20 int tailCounter = tailLength; // Se establece un contador con los LEDS
21 //que deben encenderse al mismo tiempoI set up the
22 length in a counter
23 for (i=0; i<lineSize; i++)
24 {
25 digitalWrite(pinArray[i],HIGH); // Se enciende tailLength LEDs de forma consecut
26 delay(waitStart); // Controla la rapidez de encendido de cada LED
27 if (tailCounter == 0)
28 {
29 digitalWrite(pinArray[i-tailLength],LOW); // Apaga los LEDs de la cola hacia a
30 }
31 else
32 if (tailCounter > 0)
33 tailCounter--;
34 }
35 for (i=(lineSize-tailLength); i<lineSize; i++)
36 {
37 digitalWrite(pinArray[i],LOW); // Apague los LEDs restantes
38 delay(waitStart); // Controla la rapidez con que se apagan los LEDs
39 }
}
Algoritmo 1 Código para encender y apagar un LED utilizando un
botón pulsador.
https://www.tinkercad.com/things/076jCBQwb8B-practica-13-encender-
una-secuencia-de-varios-leds
13.5 Conclusión:
En esta práctica se ha mostrado como encender una secuencia de LEDs
utilizando la tarjeta Arduino. Hemos avanzado en programación al
introducir el manejo de variables del tipo Array o vectores. El código
permite aumentar o disminuir el tiempo en el que encienden los LEDs y a
su vez definir cuantos LEDs van a estar encendidos (tiempo y cola de la
estrella fugaz)
Numeros binarios
Practica 6
Materiales:
1. 4 Leds
2. 4 Resistencias
Objetivo:
Con los 4 leds representar los números del 1 al 15 en binario, es decir, empezando del 0001 hasta el
1111, cada led representara una posición de un espacio del numero binario empezando de izquierda a
derecha, por medio del Monitor serial se ingresara un numero en decimal entre el 1 y el 15, el cual el
programa leerá y prenderá los leds en representación de su forma binaria.
Diagrama:
Código:
void setup() {
Serial.begin(9600);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
}
// 0 1 2 3 4
const byte segmento[] = {0b1111110, 0b0110000, 0b1111001, 0b1111001, 0b0110011,
// 5 6 7 8 9
0b1011011, 0b1011111, 0b1110000, 0b1111111, 0b1111011};
do {
estado = digitalRead(pin); // Leer el estado del botón y guardarla en la
variable "estado"
if(estado != estadoAnt) { // comparamos el estado actual del botón con el Ant
contador = 0; // si es diferente contador va a valer 0 y
reiciamos el contador, "!=" significa diferente a
estadoAnt = estado; // guardamos el valor de "estado" que leimos en
"estadoAnt"
}
else {
contador = contador + 1; // en caso de que sea igual "contador" sumará 1
}
delay(1);
} while(contador < tiempoAntirebote);
return estado;
}
void setup() {
void loop() {
}
// codigo botón Decr fin
Cambios:
1. Agregué esto
// 0 1 2 3 4
const byte segmento[] = {0b1111110, 0b0110000, 0b1111001, 0b1111001, 0b0110011,
// 5 6 7 8 9
0b1011011, 0b1011111, 0b1110000, 0b1111111, 0b1111011};
pin tiene la lista de tus salidas del display 7 segmentos. Al tenerlas en un vector simplifica el uso.
segmentos tiene una lista de como visualizas los segmentos en tu display.
0bXXXXXXX es una notación en formato binario.
Solo copia como tenias definido cada número.
Donde tienes un HIGH yo puse un 1 empezando por el segmento a y terminando por el g
0babcdefg es como estan dispuestos
Code: [Select]
void actualizarNumero() {
for (int i=0; i<7; i++){
digitalWrite(pin[i], segmento[cuenta]&(1<<(6-i)));
}
}
Esto se repite para cada caso tome el valor que tome cuenta lo que direccionará el valor del vector
segmento y siempre estaremos barriendo cada bit y como resultado de la operación lógica resultará
si debe encender o apagar.
Control de Display 7 Segmentos mediante Pulsadores
Por
José Villalaz
16384
En esta experiencia se mostrará cómo lograr el control de display de 7
segmentos mediante pulsadores. Para ello se utilizará botones tipo “push
button” los cuales aumentarán y disminuirán la cuenta mostrada en el display,
según sea necesario.
Una de las maneras más fáciles de controlar cierto tipo de proyecto es mediante el uso de
entradas (pulsadores) las cuales nos permiten manipular diferentes componentes. según
nuestras necesidades.
1 Protoboard.
7 resistencias de 220Ω.
2 resistencias de 4.7kΩ.
1 display de 7 segmentos (cátodo común).
Jumpers.
1 Placa Arduino Uno.
2 Pulsadores.
Podemos consultar la información que ya se ha publicado en este sitio web acerca del display
de 7 segmentos.
Cuando un pin del arduino no está conectado, el valor que nos devuelve la
función digitalRead() está indeterminado y puede variar aleatoriamente.
Debido a esto y para garantizar que la función nos devuelva un LOW cuando el botón no este
oprimido, debemos poner lo que se conoce como una resistencia pull down, en el lado del botón
conectado al pin de entrada. Esta resistencia pull down es una resistencia con un valor alto,
usaremos una de 4.7 KOhms, conectada al pin de tierra o GND del Arduino.
Pulsador con resistencia
pull-down
De esta manera, cuando el botón está abierto, aseguramos tener un valor de 0 Volts o LOW,
dado por la resistencia pull down conectada a tierra y cuando el botón esté cerrado, tendremos
un valor de 5 Volts o HIGH. La resistencia pull down evitará que se forme un corto circuito
entre el botón y el GND.
3 int timeAntirebote=15;//un valor entre 10 y 15 nos da una lectura correcta del estado del botón.
6 int EstadoBotonIncremento;
7 int EstadoBotonDecremento;
8 int EstadoBotonAnteriorIncremento;
9 int EstadoBotonAnteriorDecremento;
10
11 //Función Antirebote
13 int contador=0;
16
17 do {
18 estado=digitalRead(pin);
19 if (estado != estadoAnterior){
20 contador=0;
21 estadoAnterior = estado;
22 }
23 else{
24 contador = contador + 1;
25 }
26 delay(1);
27 }
29 return estado;
30 }
31
32 void setup(){
34 pinMode(BotonDecremento,INPUT);
35 DDRD=B11111110;
36 }
37
39 //puerto 0 libre
40 //puerto 1 al 7 display
41 byte
numero[10]={B11111100,B00011000,B01101110,B00111110,B10011010,B10110110,B11110110,B00011100,B11111110,B10011110};
42
PORTD=numero[valor];
43
}
44
45
void loop() {
46
//Botón de Incremento.
47
EstadoBotonIncremento=digitalRead(BotonIncremento);//leemos el botón
48
if((EstadoBotonIncremento !=EstadoBotonAnteriorIncremento) &&(antirebote(BotonIncremento))){//preguntamos si hay cambio
49 respecto al estado anterior y vemos si esta presionado
50 cuenta++;//aumentamos la cuenta
53 }
54 }
56
57 //Botón de Decremento.
59 if((EstadoBotonDecremento != EstadoBotonAnteriorDecremento)&&(antirebote(BotonDecremento))){
60 cuenta--;//disminuimos la cuenta
61 if(cuenta<0){
62 cuenta=9;
63 }
64 }
65 EstadoBotonAnteriorDecremento = EstadoBotonDecremento;
66 actualizarNumero(cuenta);
Uno de los problemas o dificultades que presenta el uso de pulsadores es que muchas veces la
señal no se comporta de manera limpia como nosotros queremos y esto ocasiona errores en
nuestro código; esto pasa porque Arduino ejecuta todo lo que está en la función loop muchas
veces, esto lo hace a una velocidad de millones de instrucciones por segundo. Entonces para
cuando soltemos el botón no sabemos en qué lugar quedo. Para ello crearemos una función
muy importante al momento de trabajar con pulsadores: la función Antirrebote.
“Una función es un pedazo de código que no está escrito dentro de nuestra sección principal,
que sería dentro del loop.”
Una de las maneras de crear un antirrebote es mediante un delay(), sin embargo esta es una
manera muy brusca de hacerlo y aun así sigue generando errores.
El siguiente código es una forma concreta de hacer una lectura correcta al presionar el
pulsador. Para ello utilizamos el ciclo do-while.
6 do {
9 contador=0;//reiniciamos el contador
10 estadoAnterior = estado;
11 }
12 else{
14 }
15 delay(1);
16 }
18 return estado;
19 }
Otra de las funciones que utilicé en este código fue la de actualizarNumero, en la cual
incluí: Registro Port (Puerto) la cual me permitió reducir en gran tamaño el código.
Código Utilizado:
void setup(){
1
pinMode(BotonIncremento,INPUT);
2
pinMode(BotonDecremento,INPUT);
3
DDRD=B11111110;
4
}
5
void actualizarNumero(int valor){
6
byte
7 numero[10]={B11111100,B00011000,B01101110,B00111110,B10011010,B10110110,B11110110,B00011100,B11111110,B1001111
0};
8
PORTD=numero[valor];
9
}
Dato Curioso:
En este código utilice arrays (en el cual pude almacenar los diversos números del display).
Para definirlos se utiliza la expresión:
tipo_de_elemento nombre_del_array[número_de_elementos_del_array];
byte numero [10];
Arrays en Arduino
Con este código podemos controlar los números en el display aumentándolo o disminuyéndolo
según nuestra necesidad.
Veamos algunas imágenes del circuito físico:
Circuito Físico
Circuito Físico
Saludos.
Contador binario con Arduino y registros DDR, PORT y PIN
En este tutorial se diseñará un contador binario con Arduino. La salida del contador se representará mediante LEDS.
Entonces para crear el contador se utilizará el registro DDRX para la asignación de valores lógicos. Esto se realizará en el
lenguaje Arduino. En este tutorial aprenderemos cómo controlar las salidas digitales para mostrará los números del 1 al 31
de manera secuencial por medio de registro de puertos. Para realizar el contador es necesario tener conocimientos sobre
el código binario y quizás en como convertir binario a decimal.
CONTADOR BINARIO ASCENDENTE Y DESCENDENTE CON
ARDUINO
Un contador binario con Arduino, ascendete y desendente, permitirá cada determinado tiempo en incrementar o
decrementar el contador. Para este contador se utilizarán 5 leds de 5mm para representar a 5 bits de un numero binario. La
cuenta máxima de este contador será:
MATERIAL:
Arduino UNO.
5 LED 5mm.
5 resistencias 220Ohm.
Los controladores y software Arduino lo puedes encontrar en: www.arduino.cc
REGISTROS DE PUERTOS EN ARDUINO
Para empezar los registros de puertos en Arduino nos permiten una manipulación más rápida de los pines de
Entradas/Salidas de la tarjeta Arduino UNO. Esta forma de programación es una alternativa al uso de las
clases pinMode y digitalWrite. El microcontrolador de esta placa tiene tres puertos:
pin digital de 8-13. Puerto B. Controlador por DDRB, PORTB y PINB.
pines de entrada analógica. Controlado por el puerto C, es decir, por DDRC, PORTC y PINC.
pines digitales 0-7. El puerto D controlado por los registros DDRD, PORTD y PIND.
Cada uno de estos puertos está controlado por tres registros los cuales se definen por DDRX, PORTX y PINX.
PUERTO DDRX EN ARDUINO
El puerto DDRX en Arduino, sirve para determinar o configurar si el pin correspondiente será entrada o salida.
SINTAXIS:
DDRD= B00001111;
Donde:
D es el puerto a controlar
0 =entrada 1=salida
Con respecto a este ejemplo estamos declarando que la mitad de nuestro puerto sea entrada y la otra parte salida, entonces
con esto evitamos escribir varias veces “pinMode(x,OUTPUT)” para declarar cada pin.
Tomando en cuenta que el primer número de la derecha es el menos significativo la relación de los pines será de la
siguiente manera:
Numero
insertado 0 0 0 0 1 1 1 1
Pin de
Arduino 7 6 5 4 3 2 1 0
Por otro lado si desea hacerlo en forma decimal solo bastaría con escribir “31” y esto sería igual a activar los primeros
cuatro pines como salida DDRD=31 o DDRD=255 si queremos activar todo el puerto como salida.
PORTD=10101010
Por consiguiente los pines 1, 3, 5, 7 están en estado alto mientras que los pines 0, 2, 4, 6 están en estado bajo.
REGISTRO PIN
Lee el estado de los pines de entrada establecidos.
PIND
Se lee todo el puerto que se ha configurado como entrada. Este registro nos da un 1 si a un pin del microcontrolador se le
está alimentando externamente, y un cero si esta en nivel bajo de voltaje.