Es un circuito muy simple basado en un ATTiny45 o ATTiny85 (que es lo mismo que el 45 pero con más memoria) y que permite manejar 4 ventiladores de 12 VDC con 4 botones táctiles o pulsadores (de los que no se mantienen), siendo cada botón táctil útil para manejar el ventilador con el mismo número (el botón 1 enciende el ventilador 1 y así).
Los botones táctiles funcionan a través de un pin analógico del ATTiny, por tanto no se entenderá que se pulsen dos a la vez (el ATTiny entenderá k se pulsa el de mayor número, y nunca generará cortocircuitos).
El circuito tiene:
Podeis ver un vídeo aquí (es un vídeo con el software antiguo, antes de añadir las funciones especiales).
El controlador visto desde arriba
El controlador visto desde abajo (los agujeros grandes marcan la orientación).
En la parte de atrás:
int input = 0; //Variable de controlint previnput = 0; //Variable de controlint state0 = 0; //Estado inicial del ventilador 1 (0 == OFF)int state1 = 0; //Estado inicial del ventilador 2 (0 == OFF)boolean state2 = false; //Estado inicial del ventilador 3 (false == OFF)boolean state3 = false; //Estado inicial del ventilador 4 (false == OFF)int maxPWMstates = 5; //Número máximo de estados en el PWM.int counter = 0; //Variable de controlint maxCounter = 10; //Sirve para filtrar pulsaciones muy cortasint specialCounter = 5000; //Ciclos a mantener pulsado para activar la función especial (5000 ~ 2s)void setup() {pinMode(0, OUTPUT);pinMode(1, OUTPUT);pinMode(2, OUTPUT);pinMode(3, OUTPUT);digitalWrite(0, LOW);digitalWrite(1, LOW);digitalWrite(2, LOW);digitalWrite(3, LOW);pinMode(4, INPUT);digitalWrite(4, LOW);}void loop(){input = analogRead(2)/256.0 + 0.5;if(input != previnput){if(input == 0 && counter >= maxCounter && counter < specialCounter){switch(previnput){case 1:state0 = (state0+1)%maxPWMstates;getPWMValue(state0, 0);break;case 2:state1 = (state1+1)%maxPWMstates;getPWMValue(state1, 1);break;case 3:state2 = !state2;getBitValue(state2, 2);break;case 4:state3 = !state3;getBitValue(state3,3);break;}}previnput = input;counter = 0;}else{counter++;if(counter == specialCounter && input > 0){if(input == 1){if(state0 == 0){state0 = maxPWMstates-1;}else{state0 = 0;}getPWMValue(state0, 0);}else if(input == 2){if(state1 == 0){state1 = maxPWMstates-1;}else{state1 = 0;}getPWMValue(state1, 1);}else{if(input == 3){state0 = maxPWMstates-1;state1 = maxPWMstates-1;state2 = true;state3 = true;}else{state0 = 0;state1 = 0;state2 = false;state3 = false;}getPWMValue(state0, 0);getPWMValue(state1, 1);getBitValue(state2, 2);getBitValue(state3, 3);}}}}void getPWMValue(int state, int pin){if(state == 0){digitalWrite(pin, LOW);}else if(state == maxPWMstates-1){digitalWrite(pin, HIGH);}else{int value = 128+127*state/(maxPWMstates-2);analogWrite(pin, value);}}void getBitValue(boolean state, int pin){if(state){digitalWrite(pin, HIGH);}else{digitalWrite(pin, LOW);}}
--
--
--
--
--
--
Con placa me refiero a una placa impresa no cutre como la mía XD.
--
--
Joe que envidia! Como os fuerais las cosillas! Eso es lo que intente ayer yo durante 1 hora jajaja y no fui capaz, eso de que iban más líneas a una resistencia.... Me tenía a mi mosca jajaja ahora ya puedo clonar la placa! Jejee placa placa! A ver si me pongo entre hoy y manana. Al final siempre copio y pego jejeje Ahora falta el modelo de placa de tiras jejeje ;) lo dejó caer...
--
--
--
Que chulo queda, por cierto, el ATTiny tiene que ir en un socket ya k puede mejorarse el software. Si no hay k poner un puerto para programarlo.
--
--
Conseguí k Atmel me mandase 52 chips gratis, es el único motivo :p Tengo 10 ATTiny45 y 10 ATTiny85 y luego el resto son grandes.
--
Los pides como muestra, tu mantente por debajo de los 100 euros para k no te pillen en Aduana. Pide ATTiny k aunque cuesten 2 euros y están muy bien.
--
Ah y si no te importa mucho, si pudieras poner el extractor de humos de soldar te estaría muy agradecido, me agobia estar con mascarilla en verano XD.
--
--
--
/******************************************* TinyFan Fan Driver 1.0 ******************************************** Codigo: ** + G.W.C. ** Placa de circuito: ** + Francisco M. ** + G.W.C. ******************************************** Publicado bajo la licencia: ** + Creative Commons 3.0 ** - Atribucion ** - Compartir igual *******************************************/#include <EEPROM.h>// Estados maximos de los vent. PWM (inlcuido el estado apagado).#define MAXPWMSTATES 5// Ciclos para que se tome en cuenta una accion (2500 ciclos ~ 1 sec)#define ACTION_COUNTER 10// Ciclos para que se tome en cuenta una accion especial#define SPECIAL_COUNTER 5000 //~2 sec// Utilizar memoria (al encencerse vuelve a cargar el ultimo estado)// Si no se desea usar la memoria comentar la siguiente linea://#define USEEEPROM 1// AVISO: la memoria EEPROM como la del ATTiny tiene una vida de 100.000 ciclos de borrado-grabado.// Despues de esto no esta garantizado que guarde la memoria. El chip ATTiny45 tiene 256 bytes de// EEPROM mientras que el chip ATTiny85 tiene 512. La memoria EEPROM no es la misma que la memoria// donde se guarda el programa, por lo que si llega a haber un problema la constante EEPROMFROM,// servira para establecer un punto de inicio para grabar y leer los datos.#define EEPROMFROM 0byte input = 0;byte previnput = 0;int counter = 0;// Estado inicial (sin memoria) de los ventbyte state0 = 0; //PWMbyte state1 = 0; //PWMboolean state2 = false;boolean state3 = false;void setup() {pinMode(0, OUTPUT);pinMode(1, OUTPUT);pinMode(2, OUTPUT);pinMode(3, OUTPUT);#ifdef USEEEPROMif(EEPROM.read(4 + EEPROMFROM * 5) == 255){EEPROM.write(4 + EEPROMFROM * 5,0);}else{state0 = EEPROM.read(0 + EEPROMFROM * 5);state1 = EEPROM.read(1 + EEPROMFROM * 5);state2 = EEPROM.read(2 + EEPROMFROM * 5);state3 = EEPROM.read(3 + EEPROMFROM * 5);}#endifsetState();pinMode(4, INPUT);digitalWrite(4, LOW);}void loop(){input = analogRead(2)/256.0 + 0.5;if(input != previnput){if(input == 0 && counter >= ACTION_COUNTER && counter < SPECIAL_COUNTER){switch(previnput){case 1:state0 = (state0+1)%MAXPWMSTATES;#ifdef USEEEPROMEEPROM.write(0 + EEPROMFROM * 5,state0);#endifgetPWMValue(state0, 0);break;case 2:state1 = (state1+1)%MAXPWMSTATES;#ifdef USEEEPROMEEPROM.write(1 + EEPROMFROM * 5,state1);#endifgetPWMValue(state1, 1);break;case 3:state2 = !state2;#ifdef USEEEPROMEEPROM.write(2 + EEPROMFROM * 5,state2);#endifgetBitValue(state2, 2);break;case 4:state3 = !state3;#ifdef USEEEPROMEEPROM.write(3 + EEPROMFROM * 5,state3);#endifgetBitValue(state3,3);break;}}previnput = input;counter = 0;}else{counter++;if(counter == SPECIAL_COUNTER && input > 0){if(input == 1){if(state0 == 0){state0 = MAXPWMSTATES-1;}else{state0 = 0;}#ifdef USEEEPROMEEPROM.write(0 + EEPROMFROM * 5,state0);#endifgetPWMValue(state0, 0);}else if(input == 2){if(state1 == 0){state1 = MAXPWMSTATES-1;}else{state1 = 0;}#ifdef USEEEPROMEEPROM.write(1 + EEPROMFROM * 5,state1);#endifgetPWMValue(state1, 1);}else{if(input == 3){state0 = MAXPWMSTATES-1;state1 = MAXPWMSTATES-1;state2 = true;state3 = true;}else{state0 = 0;state1 = 0;state2 = false;state3 = false;}#ifdef USEEEPROMEEPROM.write(0 + EEPROMFROM * 5,state0);EEPROM.write(1 + EEPROMFROM * 5,state1);EEPROM.write(2 + EEPROMFROM * 5,state2);EEPROM.write(3 + EEPROMFROM * 5,state3);#endifsetState();}}}}void getPWMValue(int state, int pin){if(state == 0){digitalWrite(pin, LOW);}else if(state == MAXPWMSTATES-1){digitalWrite(pin, HIGH);}else{int value = 128+127*state/(MAXPWMSTATES-2);analogWrite(pin, value);}}void getBitValue(boolean state, int pin){if(state){digitalWrite(pin, HIGH);}else{digitalWrite(pin, LOW);}}void setState(){getPWMValue(state0, 0);getPWMValue(state1, 1);getBitValue(state2, 2);getBitValue(state3, 3);}
--
GWCFM FAN Jejejeje o CWFan... Por Clone Wars :) aunque a mi TinyFan no me disgusta :P
Por cierto en cuanto al nombre tenemos TinyFan y WarFan, alguno mas y lo sometemos a votación? Hasta que no haya nombre no se pone en Thingyverse :p
--
A thingiverse y a instructables!!
Cualquier chorrada, yo puse k era para hacer un clon de Arduino k fue una de las finalidades XD y para mejorar la Prusa.
--
--
No, digo el flux, el plomo solo te mata XD
--
--
--
Hay un fallo en el código, donde pone int value = 128+127*state/(MAXPWMSTATES-2);, tiene que poner int value = 128+127*state/(MAXPWMSTATES-1);
--
--
Bueno, aquí os dejo la rev D de la placa solo con botones y la Rev A solo con cabeceras.Con esto y un bizcocho...
--
Pues dicho y hecho. Aquí los tienes.
On Wednesday, August 15, 2012 12:43:59 PM UTC+2, G.W.C. wrote:Si haces mas renders de los pcb k mi ordenador no puede cargar el programa k abre los POV
--
Lo prometido es deuda. Aquí os dejo una fotico del extractor de humos. Lo que hay dentro de la caja es el PCB que os dejo adjunto.
--
Yo estaba el otro día mirando las clases para manejar LCDs en Arduino cuando me encuentro uno firmado con fm y lo pienso y digo sera el mismo? Y si, es el nuestro :p
--
--
--
--
--