Patrocinado por...

martes, 12 de agosto de 2014

Aumentando el número de salidas digitales en Arduino

Aumentando el número de salidas digitales en Arduino
En la reciente entrada "primeros experimentos con Arduino" hice un montaje que utilizaba un display 7 segmentos de 4 dígitos para mostrar datos numéricos. En ese momento tuve que utilizar una salida digital para cada uno de los siete segmentos del display y dos salidas más para controlar el dígito en el que se iba a mostrar el dato numérico. Evidentemente necesitar 9 salidas digitales para mostrar datos por un display 7 segmentos no es nada eficiente, teniendo en cuenta que nuestro arduino cuenta con sólo 14. Es por esto que necesitaba de algún método para poder utilizar el display con menos salidas digitales. Y es aquí donde entró en juego el registro de desplazamiento, que permite conversión de datos serie a paralelo y viceversa. En mi caso disponía de un registro de desplazamiento de serie a paralelo 74HC164D que obtuve (al igual que el display) del despiece de un TDT estropeado. Había olvidado un poco qué misión tenían los registros de desplazamiento, así que entre la múltiple información existente en internet utilicé éste tutorial de arduino con 7 segmentos para refrescarme la memoria. Con el circuito integrado a mano y con los conocimientos de su funcionamiento sólo restaba por realizar la programación en Arduino.  Y tengo que decir que más fácil es imposible, ya que existe una función en Arduino denominada ShiftOut en la cuál indicas cuál salida vas a utilizar como pin de datos, cuál como reloj, el orden (si usando el bit más significativo o el menos) y el byte que que quieres pasar. De esta forma, en lugar de 7 salidas digitales hemos utilizado 2.


Un ejemplo de código pasa a ser algo tan reducido como

-

-

Nota: 8/9/2014
Hay un bug en el código, ya que el numero 2 y 3 estan mal calculados. se ha equivocado al calcular el número que hay que restar. Os comento como encontrar el número correcto:

Para el 2:



Para el 3:







Fuente Original:
http://geekenformacion.blogspot.com.es/2012/12/aumentando-el-numero-de-salidas.html#gpluscomments


Otro entrada interesante:

Registros de desplazamiento utilizando Arduino

Para nuestro proyecto de Arduino, es necesario aprender a utilizar y como poder manejar muy pocas entradas del Arduino para controlar más salidas, por lo que para esta entrada hablaré del registro de desplazamiento que vamos a utilizar en el cubo de leds, en donde mostraré un ejemplo en donde tenemos con solamente 4 salidas del arduino, controlar 16 Leds.

Un registro de desplazamiento se puede utilizar para controlar 8 salidas simultaneas usando unos pocos pines del microcontrolador, incluso es posible conectar dos demultiplexores y sacar 16 salidas, que es lo que hicimos para esta entrada.

El integrado 74HC595, lo compramos en AG electronica y este integrado es un registro de desplazamiento de 8 bits con entrada serie, salida serie o paralelo con latch (o sea, bloqueos), de 3 estados.

¿Cómo funciona?

Este integrado funciona de la siguiente manera, utiliza comunicación serie sincrona, en donde tu puedes transmitir un byte enviando pulsos altos y bajos por un pin y otro pin, viene siendo el clock o reloj en donde va enviando pulsos constantes para ir diferenciando los bits enviados por el pin que envia los pulsos diferentes, por lo que este es muy diferente a una comunicación serial asicrona ya que utilizando la función Serial.begin() el emisor y el receptor fijan la forma de una velocidad de tranferencia, por lo que a diferencia, este una vez que le enviamos el byte completo al registro, los valores ya sean los altos o los bajos, se lo asignan a cada pin de salida, provocando una salida en paralelo.

La salida en serie de este integrado es el agregr un pin extra que retransmite la información que le estamos mandando del arduino sin cambios, por lo que podemos como comunicar dos de estos integrados y tener la capacidad de transmitir 16 bits donde los primeros 8 bits atraviesen al primero y después se almacenen en el segundo, esto es lo que hicimos como ejemplo.

Bueno este es la información de los pines del integrado que utilizamos, tomado de aquí

PINS 1-7, 15Q0 " Q7Pins de salida
PIN 8GNDGround, Vss
PIN 9Q7"Salida Serie
PIN 10MRMaster Reset, activo = low
PIN 11SH_CPPin Clock
PIN 12ST_CPPin Latch
PIN 13OESalida disponible, activo = low
PIN 14DSEntrada Serie
PIN 16VccVoltaje

Para checar como funciona, es preferible hacer un programa que nos ayude a probar los integrados y de las conexiones, por lo que utilizamos este diagrama de circuito, con 16 LEDs, 16 resistencias de 220 Ohm, dos integrados demultiplexores 595 y un condensador 0.1 uf o 100 nF.

Este es el diagrama.




Para verlo mejor o más grafico, estas son las conexiones utilizando 3 protoboards.

Y este es el código que realizamos para verificar su funcionamiento.

12345678910111213141516171819202122232425262728293031323334353637
const int latchPin = 8;
const int clockPin = 12;
const int dataPin = 11;
char inputString[2];
int arreglo[] = {2,4,6,8,10,12,14};
unsigned int bitsToSend = 0;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
Serial.begin(9600);
Serial.println("reset");
}
void loop() {
for(int pos = 0; pos<7; pos++){
registerWrite(arreglo[pos]);
delay(200);
}
}
void registerWrite(int pos) {
digitalWrite(latchPin, LOW);
bitWrite(bitsToSend, pos, HIGH);
byte registerOne = highByte(bitsToSend);
byte registerTwo = lowByte(bitsToSend);
shiftOut(dataPin, clockPin, MSBFIRST, registerTwo);
shiftOut(dataPin, clockPin, MSBFIRST, registerOne);
digitalWrite(latchPin, HIGH);
delay(300);
}
view rawgistfile1.c hosted with ❤ by GitHub

En donde podemos ver que tenemos un arreglo con los leds que queremos prender y este los va leyendo y pasando la información a los integrados para que realicen su función.

En esta liga aquí vienen algunos ejemplos, pero nos dimos cuenta que algunos no funcionaban, por lo que nos dimos la tarea de realizar un programa por nosotro mismos, en base a los ejemplos.

Estos fueron los resultados.









Fuente:
http://roberto-mtz.blogspot.com.es/2012/04/registros-de-desplazamiento-utilizando.html



Otra entrada curiosa: usando otro arduino:

Aumentar Pines Digitales en Arduino Uno

Cómputo Integrado
Laboratorio
Mientras experimentaba un poco con mi Arduino Uno encontré información valiosa en internet, acerca del uso de los pines que tenemos disponibles.

Una de las cosas con las que aveces lidiamos es la cantidad de salidas/entradas digitales en nuestra placa Arduino, pero podemos hacer un poco de maravillas con ella sin necesidad de comprar un componente más. Esto es usando todos los pines como salidas o entradas digitales.

Mi compañera Cecilia Urbina hizo una entrada para aumentar en número de pines pero cuando se tiene a la mano otro Arduino.

Enlace directo a la publicación: Aumentar I/O en Arduino

Veamos como están distribuidas las entradas y salidas digitales, seriales y analógicas de nuestra placa de Arduino Uno.


De forma predeterminada los pines del Arduino están distribuidos de la siguiente manera.
  • Terminales digitales 0-1 E/S serie - TX/RX (verde oscuro).
  • Terminales digitales 2-13 (color verde).
  • Terminales de entrada analógica 0-5 (azul claro).

Pero algo que es bueno saber cuando se necesitan más entradas o salidas digitales es que las terminales 0 y 1 (TX y RX) si no estan siendo utilizadas como salidas seriales, como por ejemplo, usando Serial.begin(9600); pueden usarse sin problema como salidas digitales donde podemos usar digitalWrite();.

Y también tenemos 6 entradas analógicas (A0 - A5) que podemos utilizar, siempre y cuando no estemos usando ninguna de ellas para la lectura de algún sensor, ya que con una sola terminal que necesitemos para un sensor, en automático todos los demás también se activan para el mismo uso. Así que mientras no usemos ningún sensor, hemos ganado 6 entradas y salidas digitales.

Cree un pequeño ejemplo donde utilizo todas las terminales del Arduino para prender leds.

12345678910111213141516171819202122232425262728
void setup() {
pinMode(0, OUTPUT);
pinMode(1, OUTPUT);
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(14, OUTPUT);
pinMode(15, OUTPUT);
pinMode(16, OUTPUT);
pinMode(17, OUTPUT);
pinMode(18, OUTPUT);
pinMode(19, OUTPUT);
}
void loop() {
for (int pin = 0; pin < 20; pin++) {
digitalWrite(pin, HIGH);
}
}
view rawpinesdigitales.pde hosted with ❤ by GitHub

Si podemos ver las terminales A0, A1, A2, A3, A4 y A5 son usadas como 14, 15, 16, 17, 18 y 19, al ser usadas en pinMode();.

Y esto es una forma fácil de tener más salidas o entradas digitales en nuestro Arduino sin gastar en más componentes.

Otra opción aumentar I/O Arduino

En esta entrada les compartiré una manera bastante simple de poder aumentar las entradas o salidas del Arduino sin necesidad de comprar shift registers, pero teniendo en cuenta que disponemos de 2 Arduinos, esto es el mejor camino para aumentar salidas o entradas cuando tenemos ArduInos de sobra :).
Materiales que ocupamos:


  • 2 Arduinos
  • 1 Led
  • 4 cables 
  • Fuente de poder


Lo primero que vamos a hacer es conectar nuestros Arduinos de una manera muy simple:



Podemos ver que ocupamos los mismos puertos del Arduino master y del Arduino esclavo, conectamos la salida de 5v del master al esclavo, la salida GND del master al esclavo, y las entradas analógicas 4 y 5 del master al esclavo también a la 4 y 5.

Ahora colocamos un led en el pin 13 del Arduino esclavo, ya que nuestro programa tendrá como propósito apagar y prender un led.

Ahora programamos para el Arduino master:

1234567891011121314151617181920212223
#include <Wire.h>
void setup()
{
Wire.begin();
}
int algo;
void loop()
{
algo = HIGH;
Wire.beginTransmission(2);
Wire.send(13);
Wire.send(algo);
Wire.endTransmission();
delay(500);
algo = LOW;
Wire.beginTransmission(2);
Wire.send(13);
Wire.send(algo);
Wire.endTransmission();
delay(500);
}
view rawgistfile1.java hosted with ❤ by GitHub



Y para el Arduino esclavo:

12345678910111213141516171819202122232425
#include <Wire.h>
int pin;
int estado;
void setup()
{
Wire.begin(2);
Wire.onReceive(receiveEvent);
}
void loop()
{
}
void receiveEvent(int howMany)
{
pin = Wire.receive();
estado = Wire.receive();
digitalWrite(pin, estado);
}
view rawgistfile1.java hosted with ❤ by GitHub



Básicamente estamos diciendo en el programa master en el loop que escriba en el pin 13 del Arduino 2, y manda valores HIGH y LOW cada ciertos segundos para apagar y prender el led.
En el programa esclavo, se recibe el evento y se escribe en la salida digital el estado y el pin que se mando en el master.
Es muy fácil de hacer y bastante útil.

Aquí un vídeo y fotos de como me quedo a mi:



            

Fuentes:
http://ramon-gzz.blogspot.com.es/2012/05/aumentar-pines-digitales-en-arduino-uno.html
http://cecilia-urbina.blogspot.mx/2012/05/otra-opcion-aumentar-io-arduino.html