Beruflich Dokumente
Kultur Dokumente
Estahistoriapodracomenzaras:Eraseunavezunalavadoraconcuatroaos
deantigedadalaqueseleestropeelprogramadordigital.
EsunalavadoradelamarcaHaier,delagamabarata,elmotoresuniversaly
absolutamente todo se controlaba a travs del programador digital de la
lavadora. Estuve barajando la compra del programador, pero no mereca
realizarelgastode150euros,cuandopor50eurosmspodaadquirirotra,
pero la consigna del reciclaje y no sucumbir a la obsolescencia programada,
meanimaronarealizarunprogramadorparalavadoraconArduino.
Comenzamos:
Primero desmont completamente la lavadora, dejando unicamente el chasis de
acero, con la finalidad de lijarlo y sanar las zonas con corrosin, los
cableslosetiquetantesdecomenzaradesmontar.
Etiquetandoloscables
Aquconelchasisdelalavadora,pintandoyreparandolacorrosin.
Para el proyecto necesit una placa Arduino UNO, he utilizado una placa
compatibledelasbaratas,esosi,
mehadadoalgunosdoloresdecabeza,
algunospinesenestaplacaestn
cambiadoselHIGHconelLOW,porlo
tantomiconsejoesquesipuedes,te
compresunaoriginal.
Arduino puede controlar o interactuar a travs de sus pines (y sus 5v), con
una amplia gama de sensores y dispositivos. Por ejemplo unos rels
alimentadoscon5v,conlafinalidaddecontrolarlaselectrovlvulas,bomba
dedesage,electrocerradurayresistenciaquecalientaelaguadelavado.
Esmscmodoybaratocomprarestosmdulosquefabricarlosunomismo,cada
entrada dispone un optoacoplador que asla totalmente la tensin de 220v de
cargadelosrelsconlacircuiterade5vdeArduino.
Tenemos que seguir controlando el resto de la lavadora, por ejemplo el
motor,normalmentetevasaencontrarestetipodemotorenlamayoradelas
lavadoras,
es un
motor
universal
omotorde
escobillas
de entre
200 a 400
watios
Duranteelprocesodefabricacin
Unavezterminadalaplaca,nosdisponemosataladrarlospuntos
pordondesoldaremosloscomponenteselectrnicos.
Aqulaadquisicindeloscomponenteselectrnicosy
dispuestoalmontajedeldimmer.
LaideasobreelDimmerlatomdeTxapuzaselectrnicas,me
gustlaideadetenerundimmerconoptoacopladores
(aisladores)yunTriacdegranamperajequesoportarala
cargadelmotor.
Bien,puesdespusdelmontajeypruebasobreelmotorsobre
unabancada,ibadelujo,elproblema(queyameimaginaba)es
eltorquedelmotor,quesereducedrasticamenteyaunque
controlaslavelocidadpierdespracticamenteel95%dela
potencia,conelfindemejorarlohicelasiguienteprueba,alimentarel
motorconDCenvezdeAC,paraellopuseunpuentediodoeinclusoconun
condensadorparamejorarelarranque,yrealmentemejorenaproximadamente
un30%,noobstante,noessuficiente,meviresignadoabuscarotra
alternativa.
Aquunafotografaconeldiagramadeconexionesdelmotoruniversal,ste
enconcretodisponedetresconexionesalestator(bobinadofijo),dosalas
escobillas(roto),dosdelinterruptortrmicodeseguridadydosdel
tacmetro(estedispositivoestcolocadoalfinaldeleje,yesunpequeo
alternadorqueofrecede0a30voltiosdependiendodelasRPM.
Enestepequeodiagramapuedesobservarcomose
conectaunmotoruniversal.
Definitivamenteyporlafaltade
espacio,decidcolocarunacajaenel
lateraldelalavadoraparaalbergar
loscomponentesdelprogramador.
ParalaalimentacindeArduinohe
utilizadouncargadordelosnokia
antiguos,perocuandotuvequeutilizar
dosplacasderels,nodisponade
suficientesamperaje,ytuvequemeter
otrocargadornokia,lospuedes
observar(sinlacarcasa)enellateral
izquierdodelafotografa.
Enlapartecentralsuperiordos
modulosde4reles,debajoeldimmer
(quenosirvi),enelinferiorderecholaplacaArduinoUnocompatible,y
arribaunapequeaplacaquetienelasresistenciasPullDownyconexionesal
sensordetempratura,hidronivel,alimentaciones5vyGNDs,tambinun
buzzerparareproducirunamusiquillacuandolalavadorahaterminadola
colada.
Ahoraseguiremosconelcontroldemotor:
GoogleandoencontrunIC,elTDA1085C,deMotorola,queespecialmenteest
diseadopara
controlarestetipodemotores.
Informacinreferenteestecomponente:
AquelDatasheet
Undiagramaparafabricarlapcb.
Listadecomponentesparalapcb
Carainferiordelapcb,al
imprimirlodebeteneruntamaode
100mmx50mm
Carasuperiordedistribucinde
componentes
Lasresistenciasde0,1y5w
normalmenteseempleancomofusibles,
unaideaporsiteresultadifciladquirirla.
Tambinheencontradoquealgunaspersonasselohanfabricadoenunaplaca
perforada,aqutenislasfotosdelmontajeydelasconexiones:
Ahoramismomeencuentroenlafabricacindelreguladoryalaesperadeque
lleguenalgunoscomponentes.
Laideaessustituirelpotenciometrolinealporunpotenciometrodigital
paracontrolarloatravsdelarduino.
Seguiractualizandolainformacindeestepost.
Aquelcdigoenelqueestoytrabajando:
//CdigoCparaArduino,PROGRAMAUNIVERSALDELAVADORA
//LicenciaCreativeCommons
//Estecdigoseejecutaatravsdemilavadora,ypretendecontrolarlossiguientesinstrucciones:
//Controldeelectrovalvuladeprelavado/suavizante
//Controldeelectrovalvuladelavado
//SupervisaelsensordetemperaturadelaguatermistorNTC,yporlotantocontroldesutemperatura.
//Controlarlavelocidad(rpm)delmotoruniversal(deescobillas)conunPWM,ysieteposiblesvelocidades
//Controldeinversindegiroenlavadolentoderopa
//Controldevelocidadatravsdetacometrodelavadora?
//Controldelabombadevaciado
//Controldelhidronivel
//Controlderesistenciacalentadoradeagua
//Controldeunapantalladecristalliquidode4filaspor20columnas,concontrolI2C
//Controldebotonera:selectordetemperatura,selectorcentrifugado(lento,rpido),selectortipoderopa(tiempodelavado)
//Futurasmejoras====>inclusinderelojparaprogramarlahoradelavado(mejoradegastoenergtico)
//Estaeslarevisindecdigo1.0
#include<math.h>//SenecesitaparaelsensordetemperaturadetermistorNTClogartmica
#include<LiquidCrystal_I2C.h>
#include"pitches.h"
#include<Wire.h>//UsadoporelchipI2CRTC,eselreloj
#include"Chronodot.h"//SeutilizaparatraerydecodificarlosdatosdeRTC
ChronodotRTC;//CreandoelobjetoRTC
LiquidCrystal_I2Clcd(0x27,21,22);
unsignedlongcycleStart;//Seutilizaparahacerelseguimientodecuntotiempohaestadolavando.
//notasmeloda:
intmelody[]={
NOTE_C3,NOTE_C3,NOTE_C3,NOTE_GS2,NOTE_DS3,NOTE_C3,NOTE_GS2,NOTE_DS3,NOTE_C3,NOTE_G4,NOTE_G4,NOTE_G4,NOTE_GS4,NOTE_DS4
//notasduracin:4=quarternote,8=eighthnote,etc.:
intnoteDurations[]={
4,4,4,4,8,4,4,8,4,4,4,4,4,8,4,4,8,4};
//Designandopines
#defineOFFHIGH//noencuentroexplicacinporquemefuncionanalcontrario(@####@@#@#@#aaaaaarrrrrrgggggggg)
#defineONLOW
#definePinSinUtilizar00//PINSINUTILIZAR
#defineMotorVelocidad11//pinlavadolento
#defineMotorVelocidad22//pincentrifugadolento
#defineMotorVelocidad33//pincentrifugadorapido
//BOTONES
#defineBotonTemperatura4//pinbotondetemperatura
#defineBotonCentrifugado5//pinbotondeseleccinvelocidadcentrifugado
#defineBotonInicio6//pinbotondeinicio
//#definePinBuzzer7//BUZZERMUSICAFINAL
#defineCalentadorAgua8//pinencienderesistencia
#defineVaciadoPin9//pinbombadesague
#defineAguaIn111//pinelectrovalculaprelavadoosuavizante
#defineAguaIn210//pinelectrovalculalavadoojabn
#defineHidronivel12//pinhidronivel
//#definePinPuerta13//PINPUERTA
//Analgicos
#definetempSensorA4//pinthermistor
//#definebotonGOA1
//#definebotonStopA2
//#definePinSinUtilizarA3A3//PINSINUTILIZAR
//#definePinSinUtilizarA4A4//PINSINUTILIZAR
//#definePinPuertaA5//PINPUERTA
voidsetup(){
Wire.begin();//UsadoporelRTC
RTC.begin();//Igualmente
lcd.begin(20,4);//20x4LCDPanel
//declarandoposicindelasentradasdelospines
pinMode(Hidronivel,INPUT);
pinMode(tempSensor,INPUT);
pinMode(AguaIn1,OUTPUT);
pinMode(AguaIn2,OUTPUT);
pinMode(VaciadoPin,OUTPUT);
pinMode(CalentadorAgua,OUTPUT);
pinMode(MotorVelocidad1,OUTPUT);
pinMode(MotorVelocidad2,OUTPUT);
pinMode(MotorVelocidad3,OUTPUT);
//pinMode(MotorReverse,OUTPUT);
//pinMode(PinPuerta,OUTPUT);
//pinMode(botonGO,INPUT);
//digitalWrite(botonGO,ON);//activarresistenciadeactuacininternaparaestepindeentrada
//pinMode(botonStop,INPUT);
//INICIALIZOLOSPINESAOFFOLOW
digitalWrite(AguaIn1,OFF);
digitalWrite(AguaIn2,OFF);
digitalWrite(VaciadoPin,OFF);
digitalWrite(CalentadorAgua,OFF);
digitalWrite(MotorVelocidad1,LOW);
digitalWrite(MotorVelocidad2,LOW);
digitalWrite(MotorVelocidad3,LOW);
//digitalWrite(MotorReverse,OFF);
//===========================estoestabaenelloop===============================================//
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(F("Iniciando..."));
//digitalWrite(PinPuerta,ON);//cierralapuerta
//delay(3000);
//Irbotnfuepresionado,ejecuteatravsdelosciclos
//OJOCONTROLARCUANDOPASADEUNAFUNCINAOTRA
cycleStart=millis();
//VaciandoLavadora(15000,0);//unpocodevaciadoantesdecomenzar15sec
delay(100);
//llenarAgua(120000,1);//CUBETAPRELAVADO:valvulaprelavado/suavizante1,valvulajabon2
delay(100);
MotorLavado(600000,4,40);//PRELAVADO10MINUTOS(600000)parametro1=tiempodelavado,parametro2=pantalla"Lavando/Prelavado",p
delay(100);
VaciandoLavadora(120000,2);
delay(100);
//llenarAgua(120000,2);//JABN:valvulaprelavado/suavizante1,valvulajabon2
delay(100);
//MotorLavado(1200000,3,10);//LAVADOparametro1=tiempodelavado,parametro2=pantalla"Lavando",parametro3=temperatura
delay(100);
//VaciandoLavadora(120000,2);//VACIAPARACOGERSUAVIZANTE
delay(100);
//llenarAgua(120000,1);//SUAVIZANTE:valvulaprelavado/suavizante1,valvulajabon2
delay(100);
//MotorLavado(300000,5,0);//SUAVIZANTEparametro1=tiempo,parametro2=pantalla"Suavizante",parametro3=temperatura
delay(100);
//VaciandoLavadora(120000,2);
delay(1000);
//CentrifugadoSuave(120000);//SUAVEparametro1=tiempo1,5minutos=90000ms
//CentrifugadoFuerte(60000);//FUERTEparametro1=tiempo
delay(1000);
lcd.clear();
lcd.setCursor(0,3);
lcd.print(F("Lavadofinalizado"));
//digitalWrite(PinPuerta,LOW);
delay(10000);
musica();
musica();
lcd.clear();
//lcd.noBacklight();
//===========================finestoestabaenelloop===============================================//
}
//==================================================================================================
//==================================COMIENZOFUNCIONESDEPURADAS======================================
//==================================================================================================
doubleTermistor(intRawADC){
constfloatresistor=9800;//Elvalorenohmniosdelaresistenciadeltermistora25C
constfloatvoltage=4.76;//Elvoltajerealenelpunto5VccdetuplacaArduino
//Paraahorrarclculoslodefinimoscomoconstanteenestapartedelprograma
constfloatK=273.15;//ParapasaragradosKelvin
constfloate=2.718281828459045;//Constantematemtica
constfloatB=3760;//ValorBetadetutermistor,loconseguienestapagina,sinotendrasquecalcularlohttp://www.amwei.com/view
constfloatunodivr=1/(resistor*pow(e,(B/298.15)));//Conpowelevamosealresultado
floatT=0;//DeclaramoslavariableTemperatura
floattmedia;//Variableparacalcularmedia
intcnt;//temperaturamediaycontador
intgrados,decimas;//Paraponerlecomaalresultado(enespaol)
intsensorPin=A4;//Seleccionalaentradaparaeltermistor
intsensorValue=0;//Aqualmacenamoselvalordelsensor
//Parte1:Leemoselpuertoanalgico0yconvertimoselvalorenvoltios.
sensorValue=analogRead(sensorPin);//Leemosanalgico0
floatv2=(voltage*float(sensorValue))/1024.0f;
//Parte2:Calcularlaresistenciaconelvalordelosvoltiosmediantelaecuacindeldivisordevoltaje
//voltage=4.83
//R2=10000
//R1=Thermistorresistance
//V2=v2
//soV2=(R2*V)/(R1+R2)
//andr1=((r2*v)/v2)r2<final
floatr1a=(voltage*float(resistor))/v2;
floatr1=r1aresistor;
//Parte3:CalcularlatemperaturabasandoseenlaecuacinSteinhartHartylaecuacindelvalorBeta.
//T=B/ln(r1/rinfinit)
T=B/log(r1*unodivr);
T=T273.15;//ConvertimosdeKelvinaCyyatenemoslatemperatura
//ahoraobtenemoslaparteentera
grados=(int)T;
grados=(grados24);//chapuzamia
returngrados;
}
voidllenarAgua(unsignedlongtiempo,intvalvula){//DOBLESISTEMADESEGURIDAD,PORTIEMPOYPORHIDRONIVEL
lcd.begin(20,4);
lcd.clear();
muestraPantalla(1);
unsignedlongtiempollenado=millis();
inthidronivelestado=0;
hidronivelestado=digitalRead(Hidronivel);//lecturadelpinhidronivel
//while(((millis()tiempollenado)<tiempo)&&(hidronivelestado==0)){
while(((millis()tiempollenado)<tiempo)){
//while(hidronivelestado==HIGH){
if(valvula==1){digitalWrite(AguaIn1,ON);}else{digitalWrite(AguaIn2,ON);}
hidronivelestado=digitalRead(Hidronivel);
}
digitalWrite(AguaIn1,OFF);
digitalWrite(AguaIn2,OFF);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
voidVaciandoLavadora(unsignedlongtiempo,intpantalla){//argumento1=tiempo,argumento2=1(iniciando)2(vaciando)
unsignedlongvaciadoTiempo=millis();
muestraPantalla(pantalla);
while((millis()vaciadoTiempo)<tiempo){
digitalWrite(VaciadoPin,ON);
delay(100);
}
digitalWrite(VaciadoPin,OFF);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
voidMotorLavado(unsignedlongtiempo,intpantalla,inttemperatura){//argumento1=tiempo,argumento2=indicacinpantalla,argument
lcd.begin(20,4);//Lapantallaaparececuandoelmotorentraenaccin
muestraPantalla(pantalla);
unsignedlongtmpmotorgiro=millis();
//temperaturavariablesylecturas
intval;//Creaunavariableentera
inttemp;//Variabledetemperatura=temp
val=analogRead(A4);//Leeelvalordelpinanalogo2ylomantienecomoval
temp=Termistor(val);//RealizalaconversindelvaloranalogoagradosCelsius
while(temp<temperatura){//mientrasnoalcancelatemperaturaestaactivadolaresistenciacalentadoradeagua
digitalWrite(CalentadorAgua,ON);
delay(100);
temp=Termistor(val);//devuelvelatemperatura
}
digitalWrite(CalentadorAgua,OFF);
//fintemperaturavariablesylecturas
while((millis()tmpmotorgiro)<tiempo){//mientraslavado,giraenmotorenambossentidos
muestraPantalla(pantalla);
while(temp<temperatura){//mientrasnoalcancelatemperaturaestaactivadolaresistenciacalentadoradeagua
digitalWrite(CalentadorAgua,ON);
delay(100);
temp=Termistor(val);//devuelvelatemperatura
}
digitalWrite(CalentadorAgua,OFF);
//fintemperaturavariablesylecturas
//GIRAADERECHA
digitalWrite(MotorVelocidad1,HIGH);
delay(3000);
digitalWrite(MotorVelocidad1,LOW);
delay(6000);
}
digitalWrite(CalentadorAgua,OFF);
delay(100);
digitalWrite(MotorVelocidad1,LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
voidCentrifugadoSuave(unsignedlongtiempo){
lcd.begin(20,4);//Lapantallaaparececuandoelmotorentraenaccin
digitalWrite(VaciadoPin,ON);
unsignedlongtmpmotorgiro=millis();
while((millis()tmpmotorgiro)<tiempo){//mientraslavado,giraenmotorenambossentidos
//digitalWrite(MotorVelocidad1,HIGH);
//digitalWrite(MotorVelocidad2,HIGH);
digitalWrite(MotorVelocidad3,HIGH);//soloel3500rpm
delay(100);
muestraPantalla(6);
}
digitalWrite(MotorVelocidad1,LOW);
digitalWrite(MotorVelocidad2,LOW);
digitalWrite(MotorVelocidad3,LOW);
delay(10000);
digitalWrite(VaciadoPin,OFF);
lcd.begin(20,4);
lcd.clear();
}
voidCentrifugadoFuerte(unsignedlongtiempo){
lcd.begin(20,4);//Lapantallaaparececuandoelmotorentraenaccin
unsignedlongtmpmotorgiro=millis();
while((millis()tmpmotorgiro)<tiempo){//mientraslavado,giraenmotorenambossentidos
//1500rpm
digitalWrite(MotorVelocidad1,HIGH);
digitalWrite(MotorVelocidad2,HIGH);
digitalWrite(MotorVelocidad3,HIGH);
digitalWrite(VaciadoPin,ON);
delay(100);
muestraPantalla(7);
}
delay(10000);
digitalWrite(VaciadoPin,OFF);
delay(100);
digitalWrite(MotorVelocidad1,LOW);
digitalWrite(MotorVelocidad2,LOW);
digitalWrite(MotorVelocidad3,LOW);
delay(100);
lcd.begin(20,4);
lcd.clear();
}
voidmusica(){
for(intthisNote=0;thisNote<18;thisNote++){
intnoteDuration=1000/noteDurations[thisNote];
tone(7,melody[thisNote],noteDuration);//conectaelpin7
intpauseBetweenNotes=noteDuration*1.30;
delay(pauseBetweenNotes);
noTone(7);//desconectaelpin7
}
}
//==================================================================================================
//==================================================================================================
//==================================================================================================
voidmuestraPantalla(bytecurrentMode){//Noestoycontentoconestarutina.Necesitatrabajarla
unsignedlongelapsedSeconds=((millis()cycleStart)/1000);//Vamosconelnmerodesegundostranscurridos
unsignedlongelapsedMinutes=(elapsedSeconds/60);
unsignedlongelapsedHours=(elapsedMinutes/60);
lcd.setCursor(0,0);
lcd.print(F("Tiempolavado:"));
if(elapsedHours>0){//Nomostrarlashorastranscurridassihatranscurridomenosdeunahora.
lcd.print(elapsedHours);
lcd.print(':');
if(elapsedHours==1)elapsedMinutes=60;
if(elapsedHours==2)elapsedMinutes=120;
}
if(elapsedMinutes<10){//Slomuestraunsolodgito,porloquenecesitauncerodems.
lcd.print('0');
}
//temperatura
intval;//Creaunavariableentera
inttemp;//Variabledetemperatura=temp
val=analogRead(A4);//Leeelvalordelpinanalogo2ylomantienecomoval
temp=Termistor(val);//RealizalaconversindelvaloranalogicoagradosCelsius
//temperatura
lcd.print(elapsedMinutes);
lcd.setCursor(0,1);
lcd.print(F("TempAgua:"));
lcd.print(temp);
delay(1000);
lcd.print('C');
lcd.setCursor(0,3);
switch(currentMode){
case0:
lcd.print(F("Iniciando"));
break;
case1:
lcd.print(F("Llenando"));
break;
case2:
lcd.print(F("Vaciando"));
break;
case3:
lcd.print(F("Lavandoropa"));
break;
case4:
lcd.print(F("10minutosPrelavado"));
break;
case5:
lcd.print(F("Suavizante"));
break;
case6:
lcd.print(F("Centrifugadosuave"));
break;
case7:
lcd.print(F("Centrifugadofuerte"));
break;
}
}
voidloop(){/*
intval=analogRead(A4);//Leeelvalordelpinanalogicoylomantienecomoval
inttemp=Termistor(val);//RealizalaconversindelvaloranalogicoagradosCelsius
lcd.clear();
lcd.setCursor(0,1);
lcd.print(F("TempAgua:"));
lcd.print(temp);
delay(1000);
lcd.print('C');
while(temp<65){//mientrasnoalcancelatemperaturaestaactivadolaresistenciacalentadoradeagua
digitalWrite(CalentadorAgua,ON);
delay(100);
temp=Termistor(val);//devuelvelatemperatura
lcd.clear();
lcd.setCursor(0,1);
lcd.print(F("TempAgua:"));
lcd.print(temp);
delay(1000);
lcd.print('C');
}
digitalWrite(CalentadorAgua,OFF);
*/
}