sábado, 31 de mayo de 2014

Lab 5.2: Sunset Sensor

Per Aurora Ripoll i Jose Ángel Mohedano


OBJECTIU: Crear un detector de posta de sol mitjançant la comunicació inal·làmbrica de dues XBees. 

Depenent de quina sigui la quantitat de llum rebuda per l'LDR s'interpretarà si és de dia, mitja tarda o nit. Amb això regularem la lluminositat d'un LED i a més a més es mostrarà per l'LCD en quin moment del dia estem. 


Material necessari:


  • Placa Arduino UNO
  • Placa Protoboard (x2)
  • XBees Explorer (x2)
  • Digi XBee (x2)
  • Cables connectors
  • Resistència 22 kOhms
  • LDR
  • LED's (x3)


1. Muntatge del circuit





2. Codi

#include <FastIO.h> #include <I2CIO.h> #include <LCD.h> #include <LiquidCrystal.h> #include <LiquidCrystal_I2C.h> #include <LiquidCrystal_SR.h> #include <LiquidCrystal_SR2W.h> #include <LiquidCrystal_SR3W.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); int LED_NIGHT=12; int LED_SUNSET=11; int LED_DAY=10; int debugLED=13; int analogValue=0; void setup(){ pinMode(LED_DAY, OUTPUT); pinMode(LED_SUNSET, OUTPUT); pinMode(LED_NIGHT, OUTPUT); pinMode(debugLED, OUTPUT); Serial.begin(9600); //LCD lcd.begin(16,2); } void loop(){ digitalWrite(LED_NIGHT,LOW); digitalWrite(LED_SUNSET,LOW); digitalWrite(LED_DAY,LOW); if(Serial.available()>=21){ // tot el que entri a partir d'aqui serà valid. if(Serial.read()==0x7E){ //Encén el LED per indicar quan es reben dades digitalWrite(debugLED, HIGH); delay(10); digitalWrite(debugLED,LOW);  

// legeix les variables que no estem utilitzant
for (int i = 0; i<18; i++) { byte discard = Serial.read(); } int analogHigh = Serial.read(); int analogLow = Serial.read(); analogValue = analogLow + (analogHigh * 256); } } if(analogValue > 0 && analogValue <= 350){ digitalWrite(LED_NIGHT, HIGH); delay(10); digitalWrite(LED_NIGHT, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("MORNING"); // ‘MORNING’es mostra per pantalla } if(analogValue > 350 && analogValue <= 750){ digitalWrite(LED_SUNSET, HIGH); delay(10); digitalWrite(LED_SUNSET, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("AFTERNOON"); //‘AFTERNOON’es mostra per pantalla } if(analogValue>750 && analogValue<=1023){ digitalWrite(LED_DAY, HIGH); delay(10); digitalWrite(LED_DAY, LOW); //LCD lcd.clear(); lcd.setCursor(7,0); lcd.print("NIGH"); // ‘NIGH’es mostra per pantalla } }

3. Demostració







domingo, 18 de mayo de 2014

Lab 5.1: Sensors and Actuators

Per Aurora Ripoll i Jose Ángel Mohedano


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.



  1. 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.
  2. 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)




1. Muntatge del circuit

  • Sensor


1) Muntatge del circuit



  • Actuador




2. Disseny del codi

  • Sensor



int BUTTON = 2; // Pin digital del boto int LDR_value; int LDR_pin = 0; // Pin analogic de l'LDR boolean autom = false; // variable "mode" void setup(){ pinMode(BUTTON, INPUT); pinMode(LDR_pin, INPUT); Serial.begin(9600);
} 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.