OBJECTIU: Mitjançant la comunicació inal·làmbrica de dues XBees, connectar sensors i actuadors.
Controlarem el llum d'un LED mitjançant dos sensors, un LDR i un botó, i quatre actuadors, un LED groc de llum, un LED blau que indica el control manual d'aquesta, un LED vermell que indica el control automàtic i un interruptor per controlar la llum del LED de manera manual. Per defecte la llum s'anirà regulant amb el sensor de llum LDR segons la quantitat de llum que hi hagi. Quant el control d'aquesta es vulgui fer manualment s'haurà d'activar el botó, el qual permetrà que la llum sigui regulada mitjançant l'ús d'un interruptor. Cada cop que es canvi de mode s'encendran els LED's d'estat corresponent.
- Quant premem el botó, variem el valor de una variable booleana; segons aquest encenem un led o altre indicant així en l'estat en el que ens trobem.
- Després per alimentar la llum tenim dos camins(segons si estem en MAN o AUTO); un per on arriben els valors corresponents segons el valor del LDR, i l'altre on ens trobem un interruptor que tanca o obre el circuit. Aquests dos camins no estan continuament enviant informació, únicament s'activen en el cas de trobar-se en l'estat en qüestió.
- En el cas de trobar-nos en l'estat AUTOMÀTIC utilitzarem una SORTIDA ANALÒGICA
- En el cas de trobarnos en l'estat MANUAL utilitzarem una SORTIDA DIGITAL
Material necessari:
- Placa Arduino UNO
- Placa Arduino Micro Pro
- Placa Protoboard (x2)
- XBees Explorer (x2)
- Digi XBee (x2)
- Cables connectors
- Resistències:10(x3),12, 22 kOhms.
- Botó
- LDR
- LED's (x3)
2. Disseny del codi
- Sensor
} void loop(){ // emmagatzemem la quantitat de llum rebuda per l'LDR a la variable LDR_value LDR_value = analogRead(LDR_pin); if(autom==false){ // MODE MANUAL Serial.print('Z'); // S'envien Z delay(50); // quant es prem el boto, es canvia al mode automatic if(digitalRead(BUTTON) == HIGH){ autom=true; delay(500); } } if(autom==true){ // MODE AUTOMATIC // Pels diferents valors de LDR_value s'envien diferents lletres: // Quant LDR_value<128, s'enviar una A if(LDR_value<128){ Serial.print('A'); delay(50); } //Quant 128<LDR_value<256, s'enviar una B if(LDR_value>128 && LDR_value<256){ Serial.print('B'); delay(50); } //Quant 256<LDR_value<384, s'enviar una C if(LDR_value>256 && LDR_value<384){ Serial.print('C'); delay(50); } //Quant 384<LDR_value<512, s'enviar una D if(LDR_value>384 && LDR_value<512){ Serial.print('D'); delay(50); } //Quant 512<LDR_value<640, s'enviar una E if(LDR_value>512 && LDR_value<640){ Serial.print('E'); delay(50); } // quant es prem el boto, es canvia al mode manual if(digitalRead(BUTTON) == HIGH){
autom=false; delay(500); } } }
- Actuador
int LED1=5;
int LED2=3;
int LED_auto=7;
int LED_manual=8;
char missatge;
void setup(){
pinMode(LED1,OUTPUT);
pinMode(LED2,OUTPUT);
pinMode(LED_auto,OUTPUT);
pinMode(LED_manual,OUTPUT);
Serial1.begin(9600);
}
void loop(){
if(Serial1.available()>0){
missatge = Serial1.read();
// Interpretacio de les dades rebudes:
// Si rebem una Z, mode manual:
if (missatge == 'Z'){
pinMode(LED1,INPUT);
pinMode(LED2,OUTPUT);
analogWrite(LED1, 0);
digitalWrite(LED2, HIGH);
digitalWrite(LED_manual, HIGH);
digitalWrite(LED_auto, LOW);
delay(30);
}
// si rebem qualsevol altre cosa, mode automatic:
else {
digitalWrite(LED_auto, HIGH);
digitalWrite(LED_manual, LOW);
digitalWrite(LED2, LOW);
Serial.print(Serial1.read());
// Regulem la intensitat de llum segons la lletra rebuda:
if(missatge=='A')
{
analogWrite(LED1, 0);
delay(50);
}
if(missatge=='B')
{
analogWrite(LED1, 64);
delay(50);
}
if(missatge=='C')
{
analogWrite(LED1, 128);
delay(50);
}
if(missatge=='D')
{
analogWrite(LED1, 192);
delay(50);
}
if(missatge=='E')
{
analogWrite(LED1, 255);
delay(50);
}
}
}
}
3. Demostració:
4. Problemes:
En un inici volíem crear un laboratori que ens enfoqués més cap al projecte final de l'assignatura; controlar un servo-motor mitjançant un potenciòmetre de forma remota.
En principi no semblava tan difícil, però tot i aplicar la teoria tal i com la teniem entesa, veiem que el servo-motor actuava de forma aleatòria segons movíem la protoboard; després ens varem adonar de que el valor variava segons la distancia amb la taula(sota la protoboard tenim enganxada una placa aparentment d'alumini que creiem que es la culpable).
Un cop ens vam canviar de protoboard vam veure que el servo-motor no "entenia" directament les dades que sortien del potenciòmetre, amb la qual cosa buscant, vam trobar una funció de conversió de dades: la funció map(ValInMin,valInMax,valOutMin,ValOutMax).
Tot i així no vam trobar un resultat satisfactori amb el que es veigués un control precís del servo-motor.
Per tant vam decidir canviar a un projecte, aparentment més senzill.(jajaja): un exemple de control domòtic del llum de la llar.
Això ens va portar cap al mateix punt, una conversió de dades del LDR al LED, portant-nos a una mateixa falta de precisió, fins que amb l'ajuda del nostre professorat vam poder donar-li valors fixos al LED, introduint lletres A-E. D'aquesta manera obtenim una precisió segons diferents barems del LDR, variant la intensitat del LED.
No hay comentarios:
Publicar un comentario