Ivan Capdeville
Entradas etiquetadas con DIY
74HC595 shift register para controlar display de 7 elementos
26 sep

En un post anterior hablaba de como usar 8 puertos del Arduino para controlar un display de 7 elementos, es una manera rápida pero poco practica de controlar estos elementos.
Y es ocupar 8 salidas en el Arduino nos reduce la posibilidad de hacer otras cosas, nos deja 6 salidas libres.
Podemos usar un chip 74HC595 que nos sirve para controlar 8 salidas digitales mediante 3 salidas del Arduino, ademas se puede encadenar, por lo que podemos controlar bastantes salidas y tener libres 11 salidas del Arduino para agregarle cosas.
Antes de seguir, he de aclarar que este post y los demás relacionados son los menos técnicos, los menos formales y son solamente mis descubrimientos (no estudie nada relacionado a la electrónica o programación), pero hay que compartír lo que uno aprende, quizá haya personas como yo que no queremos ser ingenieros en algo para hacer algún aparato útil.
Hay una guía muy interesante aquí sobre como usar un 74HC595 con un Arduino para controlar LEDs, de hecho hay muchos otros tipos de shift register, pero usemos este (y aprovechando que me hice de 25 de estos a un súper precio).
El chip 74HC595 tiene 16 pins, 8 de ellos para controlar mismo numero de salidas, 3 para control 1 salida de datos (para conectar otros 74HC595)
Para conectarlo seguimos la recomendación de la pagina de Arduino
| Pin | Conectar a |
|---|---|
| 15, 1-7 | salidas digitales, leds, display |
| 8, 13 | GND |
| 9 | al pin 14 del segundo 74HC595 |
| 10, 16 | 5V |
| 11 | Arduino D12 |
| 12 | Arduino D8 |
| 14 | Arduino D11 |
Y aquí esta la imagen de dos 74HC595 conectados a 2 displays de 7 segmentos, el orden de los pins es sencillo, el pin-disp quedaria: 15-A, 1-B, 2-C, 3-D, 4-Dp, 5-E, 6-F, 7-G

Hasta aquí todo bien, pero empezamos con los problemas
Mis display son de Anodo común, lo que significa que un segmento se enciende al apagarse un pin del 74HC595, cual es el problema? pues tenemos que cambiar el modo en que enviamos los datos
para desplegar un 0 usando un display de cátodo común enviaríamos un byte 01101111 desde arduino, este encendería esos segmentos y tenemos un lindo 0; pero en uno de ánodo común tendríamos que enviar un byte 10010000 para que deje apagados (y por ende enciendan en el AC)
Ademas, claro, el byte depende de como hayamos hecho la conexión entre display y el 74HC595; así que si elegimos otro orden en los pins pues habrá que cambiar el byte de control. Lo que hace esto en poco standard y no podemos robarnos usar código de otras personas que hayan publicado.
Ya estando en el IDE de Arduino controlar el shift register es de lo mas fácil, muy pocas lineas de programación, ya que hay una instrucción que hace todo el trabajo por nosotros: shiftOut
/* Ejemplo de uso de un display de 7 segmentos ánodo común
usando un shift register 74HC595
Ivan Capdeville - ivan@darkapple.org
*/
const int latchPin = 8;
const int clockPin = 12;
const int dataPin = 11;
void setup() {
pinMode(latchPin, OUTPUT);
pinMode(dataPin, OUTPUT);
pinMode(clockPin, OUTPUT);
}
void loop() {
digitalWrite(latchPin,LOW);
shiftOut(dataPin, clockPin, LSBFIRST, *); // * caracter del segundo display
shiftOut(dataPin, clockPin, LSBFIRST, *); // * caracter del primer display
digitalWrite(latchPin, HIGH);
el código es simple, declaramos las salidas del arduino que conectamos al 74HC595, las configuramos como salidas digitales y vamos a usar esta secuencia para activar los caracteres
digitalWrite(latchPin,LOW);
cuando el latchPin se apaga el shift register se prepara para recibir nuevos datos
shiftOut(dataPin, clockPin, LSBFIRST, *);
Esta parte es quizá la mas interesante y complicada de dominar al inicio, hay que elegir como va leer el byte de entrada, si de derecha a izquierda (LSBFIRST) o de izquierda a derecha (MSBFIRST) y en que nos afecta esto? pues determina como vamos a confeccionar los caracteres, si usamos MSBFIRST usaremos el byte 10010000 para mostrar un 0, si usamos LSBFIRST usaremos el byte 00001001
ya que elegimos que segmentos vamos a querer, ponemos una linea por cada display (en orden inverso) ponemos esta linea para prender el latchPin y que se genere la instrucción
digitalWrite(latchPin,HIGH);
Afortunadamente para los que no queremos meternos tanto en rollos técnicos, resulta que podemos usar caracteres decimales para mostrar segmentos (aquí viene la rechifla después de leer tanto sobre números binarios)
Podemos usar números del 0 al 255 para controlar los segmentos a desplegar, pero no es tan sencillo como poner un 5 para desplegar un 5, pues no, tienen su representación, así que usamos, por ejemplo, el 14 para desplegar el numero 3 y el 156 para el numero 4. Aquí es donde usar binarios se vuelve mas simple (8 caracteres fijos y un 1 o un 0 para elegir si se muestra o no el segmento, así que todos los segmentos prendidos en un display de ánodo común seria un byte 00000000 (0) todos apagados 11111111 (256))
Esto hace mucho mas fácil el elegir que segmentos se prenderán (o en una matriz de leds lo mismo) se vuelve mas gráfico el elegir, usando números decimales aun no veo una relación o secuencia (quizá la haya pero ya después buscare)
Al final de tanto rollo, mi recomendación es usar LSBFIRST si usamos un display de anodo comun y byte binario, si usamos numeros decimales y el anodo comun hay que usar MSBFIRST y la conversion a decimal del byte
| Digito en display | Byte binario | Decimal |
|---|---|---|
| 0 | 10010000 | 9 |
| 1 | 11111001 | 159 |
| 2 | 01010100 | 42 |
| 3 | 01110000 | 14 |
| 4 | 00111001 | 156 |
| 5 | 00110010 | 76 |
| 6 | 00010010 | 72 |
| 7 | 01111000 | 31 |
| 8 | 00010000 | 8 |
| 9 | 00110000 | 12 |
| . | 00010000 | 247 |
Y sigue el vicio – Arduino con termómetro Dallas DS18B20
24 sep
Este es un post rápido
Mis camaradas del foro Infojardin me preguntaron como diablos se podría usar el Arduino para controlar humedad, temperatura y demás cuestiones en los invernaderos
Asi que aprovechando que llego mi termómetro Dallas DS18B20 (parece un transistor normal pero esta interesante, hasta protocolo de comunicación propietario tiene, el OneWire de Dallas (ahora Maxim)), vamos armando algo para leer temperatura y de acuerdo a un rango emita alguna señal, puede ser activando un ventilador y con eso bajando temperatura en el invernadero, que se yo.
Pero empecemos por lo fácil y sencillo, ponerlo a trabajar y obtener mediciones.
Aquí esta el cableado, muy sencillo pero con un cambio respecto a otros sensores, la lectura no se realiza a través de un puerto análogo, mas bien un puerto digital y la resistencia de 4.7K ohms va del pin 3 al 2.

El código para iniciarlo esta bastante complejo, trate de usar la librería OneWire para Arduino pero en mi Mac no funciona muy bien, me salen errores al compilar (ademas que según leí en la versión 1 del IDE de Arduino cambiaron nombres de librerías que hacen referencia otras, todo un relajo).
Me encontré este código que no usa la librería, así que ahí le echan un ojo.
#define TEMP_PIN 7
void OneWireReset(int Pin);
void OneWireOutByte(int Pin, byte d);
byte OneWireInByte(int Pin);
void setup() {
digitalWrite(TEMP_PIN, LOW);
pinMode(TEMP_PIN, INPUT);
Serial.begin(9600);
delay(100);
Serial.print("temperatura:\n");
}
void loop(){
int HighByte, LowByte, TReading, SignBit, Tc_100, Whole, Fract;
OneWireReset(TEMP_PIN);
OneWireOutByte(TEMP_PIN, 0xcc);
OneWireOutByte(TEMP_PIN, 0x44);
OneWireReset(TEMP_PIN);
OneWireOutByte(TEMP_PIN, 0xcc);
OneWireOutByte(TEMP_PIN, 0xbe);
LowByte = OneWireInByte(TEMP_PIN);
HighByte = OneWireInByte(TEMP_PIN);
TReading = (HighByte << 8 ) + LowByte;
SignBit = TReading & 0x8000; // test most sig bit
if (SignBit) // negative
{
TReading = (TReading ^ 0xffff) + 1; // 2's comp
}
Tc_100 = (6 * TReading) + TReading / 4; // multiply by (100 * 0.0625) or 6.25
Whole = Tc_100 / 100; // separate off the whole and fractional portions
Fract = Tc_100 % 100;
if (SignBit) // If its negative
{
Serial.print("-");
}
Serial.print(Whole);
Serial.print(".");
if (Fract < 10)
{
Serial.print("0");
}
Serial.print(Fract);
Serial.print("\n");
delay(5000); // 5 second delay. Adjust as necessary
}
void OneWireReset(int Pin) // reset. Should improve to act as a presence pulse
{
digitalWrite(Pin, LOW);
pinMode(Pin, OUTPUT); // bring low for 500 us
delayMicroseconds(500);
pinMode(Pin, INPUT);
delayMicroseconds(500);
}
void OneWireOutByte(int Pin, byte d) // output byte d (least sig bit first).
{
byte n;
for(n=8; n!=0; n--)
{
if ((d & 0x01) == 1) // test least sig bit
{
digitalWrite(Pin, LOW);
pinMode(Pin, OUTPUT);
delayMicroseconds(5);
pinMode(Pin, INPUT);
delayMicroseconds(60);
}
else
{
digitalWrite(Pin, LOW);
pinMode(Pin, OUTPUT);
delayMicroseconds(60);
pinMode(Pin, INPUT);
}
d=d>>1; // now the next bit is in the least sig bit position.
}
}
byte OneWireInByte(int Pin) // read byte, least sig byte first
{
byte d, n, b;
for (n=0; n<8; n++)
{
digitalWrite(Pin, LOW);
pinMode(Pin, OUTPUT);
delayMicroseconds(5);
pinMode(Pin, INPUT);
delayMicroseconds(5);
b = digitalRead(Pin);
delayMicroseconds(50);
d = (d >> 1) | (b<<7); // shift d to right and insert b in most sig bit position
}
return(d);
}
El dia que termine mi headlight quiza inicie un proyecto para controlar cosas de estas, ya sea una pecera o algun invernadero o plantas con riego programado
Arduino – Conectando un display de 7 segmentos
18 sep

Hace unos días me compré en Steren un display de 7 segmentos, el vendedor no tenia idea de si era ánodo común o cátodo común y menos el color del led y ya ni hablar de como conectarlo
Asi que hay que dar un poco de luz a los que como yo compran en Steren un display y no saben como conectarlo.
Lo primero, unos diagramas para saber como es el display, dimensiones y demás cosas que son útiles a la hora de hacer circuitos impresos, aquí viene algo muy importante: cada segmento se le asigna una letra y sigue un orden según las manecillas del reloj.

A pesar de que el display en Steren lo manejan como DA03 (aunque hay DA04 y nunca me supieron decir la diferencia, capaz es el color, capaz me compro uno para averiguar) en internet el modelo lo llaman LD3011A o LD3011B dependiendo si es catado común o ánodo común. (el A es cátodo común y el B es para el ánodo común).
El orden de los pins es importantísimo, el 1 (el que esta junto al punto decimal en el display) es el ánodo común (en el LD3011B) y el pin 6 también, estos los mandamos a corriente a través de una resistencia de 110 ohm (para 5V)
Ya dependiendo si usamos un shift register o un arduino o transistores o lo que queramos va a ser el orden de los pins, siempre respetando las letras (segmentos) y el sentido de manecillas de reloj.

Listo de cosas técnicas [sic], vamos a conectarlo al Arduino, tomando los puertos digitales del 2 al 9 (siempre que se pueda hay que reservar el 0 y el 1 para tx y rx)

Y ponemos un poco de código en el IDE, para probar que todas las conexiones están bien, vamos a prender todos los segmentos al mismo tiempo, así que tenemos un código como este
// Prueba de display 7 segmentos DA03 de Steren
// Ivan Capdeville - ivan@darkapple.org
int F = 2;
int G = 3;
int E = 4;
int D = 5;
int Dp = 6;
int C = 7;
int B = 8;
int A = 9;
void setup()
{
pinMode (F, OUTPUT);
pinMode (G, OUTPUT);
pinMode (E, OUTPUT);
pinMode (D, OUTPUT);
pinMode (Dp, OUTPUT);
pinMode (C, OUTPUT);
pinMode (B, OUTPUT);
pinMode (A, OUTPUT);
}
void loop()
{
digitalWrite(F, LOW);
digitalWrite(G, LOW);
digitalWrite(E, LOW);
digitalWrite(D, LOW);
digitalWrite(Dp, LOW);
digitalWrite(C, LOW);
digitalWrite(B, LOW);
digitalWrite(A, LOW);
}
si todo sale bien, tenemos un 8 y un punto decimal, ya después podemos hacer cosas mas interesantes con los dígitos o incluso letras (siempre que podamos representarlas con 7 segmentos)
Actualizacion
Se me olvido mencionar un detalle importante:
Al ser ánodo común el display tenemos la ventaja de usar menos resistencias (solo 2 para los pin 1 y 6) y a nivel Arduino, vamos a activar el segmento al poner nuestra salida digital como LOW en vez de HIGH, o sea, activamos con LOW y apagamos con HIGH ya que las salidas digitales deben cerrar el circuito proporcionando tierra (ground).
Pase al mismo Steren y ahora si ya entendí la diferencia entre sus display de 7 segmentos
Tienen la descripcion en el codigo:
DA = Display Anodo comun
03 = tamaño del segmento
Asi que hay tamaños 03,04 y 05 (con variaciones en la distribución de los pin)
y hay DA y DC (DC es por catodo comun)
Me compre un DA05 y en ese los pin para el ánodo común son el 3 y el 8
Al final me parece mas como el usar el display con ánodo común (por aquello de simplificar las conexiones con menos resistencias).
Proyecto de Ocio – Optoacopladores para disparar flash
3 sep

Una de las principales precauciones que hay que tener al disparar un flash, es la increíble cantidad de voltaje que maneja (vía un capacitor enorme para prender la lampara con buena intensidad), parte de ese voltaje se mueve en la zapata de disparo, he leído que en ciertos momentos se manejan hasta 270V en las terminales del Flash (en mi YN640 seguro maneja 27V es bien chafa)
Y como hace tiempo ya quemé un intento de disparador (incluido un flash que se quemó solidariamente), he buscado la forma de aíslar del voltaje del Flash al Arduino y la cámara.
Estudie Electronica en la secundaria (lastima que no seguí ese camino) así que mis conocimientos son de lo mas básico, seguro esto es lo mas básico del manual para muchos, pero para mi fue un gran descubrimiento, los optoacopladores.
Un optoacoplador es a groso modo un switch, pero sin contacto físico entre las partes; consta de 2 partes, un emisor de luz y un sensor, al percibir luz el sensor cierra el circuito, sin contacto con el emisor o la corriente del emisor.
Esto es sumamente útil para aislar voltajes, cargas, corrientes, como quieran llamarle en circuitos
Me hice de unos cuantos optoacopladores PC817, sumamente sencillos, con 4 patas es de lo mas fácil usarlos, armamos una corriente del lado del emisor y del otro lado el circuito que queremos cerrar
Aquí esta la imagen del optoacoplador sacada de su datasheet

Y bueno a probar el funcionamiento, usando un Breadboard y un LED (con sus respectivas resistencias) vamos a hacer que cuando oprimamos el botón, el LED se prenda

Bastante simple el diagrama, pero se puede apreciar perfecto el funcionamiento del optoacoplador PC817, aunque en este ejemplo al final comparten voltaje (porque solo tengo una fuente de alimentación para ambos lados del PC817), pero haciendo algo mas complejo, podemos hacer lo siguiente usando Arduino

En este ejemplo usamos una fotoresistencia (varia su resistencia dependiendo de la intensidad de la luz que recibe) la cual medirá los cambios de luz (si prendemos un foco, si activamos el foco del AF de la cámara, si usamos un disparador IR, etc) y dependiendo de como hayamos programado el Arduino va a emitir una respuesta vía un puerto digital que estará conectado al PC817.
Al recibir la señal esperada, el Arduino va a activar el Pin5 con lo que el PC817 emitirá señal y del otro lado el flash va a dispararse.
Esto del Hardware libre es súper interesante, he encontrado muchos ejemplos e ideas muy interesantes para completar mi súper proyecto: la fuente de luz Todo en uno, Que sirva de luz de modelado, de Beauty Dish, de Flash, de sincronizador para fotos de alta velocidad (usando láser, IR y sonido), de ser un slave, vamos a ver como va evolucionando el proyecto.
Los diagramas están hechos usando un programa libre llamado Fritzing (multiplataforma) es genial, ya haré un post al respecto (después del dolor de cabeza que implica usar el Eagle)
Truco DIY del día – Reducir ruido parasito en bocinas alimentadas por USB
22 ago
Como las bocinas que vienen con la macbook son una cosa realmente mala (bueno no tanto como las de las pcs) todo mundo siempre busca el poner unas bocinas externas, hay muchas formas, los mas fresas y burgueses usan audio inalámbrico mediante airplay (airport express), pero para el resto siempre están las buenas bocinas con su conector jack 3.5mm
Hace tiempo me compre unas bocinas Altec Lansing BXR1220 2.0, bastante interesantes, muy pequeñas, buen sonido, se alimentan mediante USB, así que puedes usarlas en cualquier lado, en el parque, en las trajinares, el unico problema? La falta de puertos USB en una macbook (cualquier portatil mac solo trae 2 puertos USB)
Asi que lo mas normal es usar un Hub USB para conectar mas aparatos a la mac mientras trabajas, ya que un disco externo (en mi caso 2) una tableta Wacom, mouse usb, el ipod, bocinas, el lector de tarjetas; bueno esos 2 ches puertos de la macbook son insuficientes.
Pero aquí viene lo malo, cuando conecto mis bocinas al hub USB (de muy bajo presupuesto, capaz los mas elevados no tengan este problema) un ruido en las bocinas, bastante agudo, bastante molesto, así que a buscar la solución bien DIY.
Echando ojo encontré una solución interesante, meterle unos capacitares a la entrada usb de las bocinas, así estos capacitares al mantener una corriente constante hacia las bocinas pues reducirá los picos de corriente (usamos un mismo puerto usb de la mac así que hay picos de voltaje segurísimo)

Asi que manos a la obra, visitar la tienda de electrónica de su preferencia y hacerse de algunos capacitares electrolitos, de 10uf y unas resistencias (para mantener constante la corriente)
Manos a la obra: hay que abrir las bocinas Altec Lansing, cosa que no me cuesta ya que desde que me llegaron las tuve que abrir para repararlas (un transformador desoldado, después un cable con corto, estas bocinas están saldas).
Usando un protoboard (tableta para prototipos? no se como se diga acá, mis clases de electrónica nunca llegaron a ese tema) vamos a probar los componentes para ver si es suficiente.

Aquí es un ensayo y error, hay que variar en valores de resistencia y capacitares dependiendo del ruido, ya que esta controlado (sin tener nada reproduciendo, que no haya ningún sonido de las bocinas es una súper ganancia), vamos a armar un circuito y acoplarlo a las bocinas

Y viene lo divertido, el hacer que las bocinas cierren de nuevo (siempre es todo un ritual de promesas si la tapa cierra de nuevo y no nos sobran tornillos), la forma mas rupestre de aislar el circuito nuevo es con silicona caliente, lo mío no es lo estético definitivamente.

Y listo, como buen representante de las personas con problemas de atención, hice esta reparación en vez de continuar con mi ringlight de LEDs, bueno ya ira saliendo el otro.
ATENCION: al estar soldando los componentes y los cables de corriente, hay que recordar desconectar todos los cables USB del hub y de la computadora, yo casi reviento el puerto USB de mi macbook por no desconectarlo y estar soldando de lo mas tranquilo (como conectarle la corriente AC a un puerto USB) afortunadamente fue en el cable de tierra y MAc OSX al detectar esa corriente desactivo el puerto (ese aviso como lo he apreciado)
Proyecto de ocio – Lumix Lx con disparador remoto de flash – Parte prima
24 may
Voy a iniciar un nuevo proyecto de ocio; esta vez vamos a hacer que mi queria Lu sea capaz de disparar uno (o varios) flashes externos.
Dedicatoria:
Quiero dedicar este proyecto a la prince gabo; un dia hace poco agarro sus alas de cuervo y desapareció, trate de localizarla y nada (bueno tampoco la busque mucho), espero que este contenta y feliz y sonria mucho. Sé que al contarle de este proyecto me hubiera regañado y dicho que hiciera algo con mi vida; pero bueno esto es lo que soy. Gabito espero que el gachups te trate cul.
Motivaciones
La unica motivación es el ocio, condimentado con el hecho de que no consigo quien me traiga de fayuca una reflex digital (y miren que ya hasta rogue 2 veces a alguien y nada, ya que).
Ademas las fotos con la lu son buenisimas ahora sumandole una iluminacion mas cuidada, seguro de aqui a Hollywood (sic)
Materiales:
El problema con la Lumix LX2 es que no posee una zapata para flash, entonces vamos a usar lo que tenemos a la mano siempre que sea de bajo presupuesto.
Necesitaremos
Que es lo que quiero lograr?
Voy a intentar que al disparar el flash integrado (pero bloqueando esta luz para que no altere la luz de los externos) la celula fotosensible envie una señal al PC Sync y le ordene al disparador remoto emitir una señal, la cual activara el receptor y activara el flash externo ( o los flashes).
Ire actualizando mi avance aqui