viernes, 11 de abril de 2014

Lab 4.1: Wireless Messaging

Per Aurora Ripoll i Jose Ángel Mohedano

OBJECTIU: Reproduïr les diferents notes musicals amb el teclat i mostrar els resultats per la pantalla LiquidCrystal mitjançant la connexió de dues XBees.


Material necessari:
- Placa Arduino UNO
- Placa Protoboard
- 2 XBees Explorer
- 2 Digi XBee
- Cables connectors


Part I: Xat simple

Esteblim la connectivitat inal·làmbrica entre un XBee Coordinador i un XBee Router. Per fer això caldrà instal·lar:
- el Software X-CTU: http://goo.gl/uAmiYa
- els drivers per l'FTDI: http://goo.gl/HE6LJX 

Una vegada muntat cada Digi XBee amb un XBee Explorer es connecten a ordinadors diferents, obrim el software i iniciem la configuració. S'exploren el ports de connexió per desobrir si hi ha moduls ràdio connectats a l'ordinador. Un cop identificats establim els rols de connexió:

Primerament comencem amb el coordinador:
- Cliquem damunt 'update firmware' on seleccionem 'XB24-ZB' al bloc de Product Family, 'XBee Coordinator AT' al bloc Function set i '22A7' al bloc de Firmware version.

- Un cop configurat el coordinador, anem a l'alte ordenador on tenim conectada l'altra DigiXBee i seguim el mateix procediment pero seleccionant 'XBee Router AT' al bloc de Function set


Una vegada arribat a aquest punt ja podem iniciar la conversa entre els dos, cliquem a tots dos Programes l'icona de enllaç i procedim a fer un test d'enviament i recepció de dades.
Un cop aconseguit això, decidim probar si podem interactuar de forma totalment remota amb la nostra placa Arduino; realitzant el següent experiment.



Part II : Escala musical remota
Mantenim els rols de configuració entre els dos XBee.

1) Muntatge del circuit
Material necessari(adicional):
- Resistència de 150 kOhms
- 1 LED
- Buzzer
- Pantalla LiquidCrystal - drivers
- mòdul I2C

Per poder utilitzar la pantalla LiquidCrystal hem descarregat els drivers actualitzats al directori per defecte `Arduino/ Libraries/LiquidCrystal` i darrerament, des del mateix entorn d'Arduino: > Sketch > ImportarLibrería > LiquidCrystal.
La conexió del cablejat s'indica a continuació.


2) Disseny del codi


//S’inclouent les llibreries necessàries

#include <FastIO.h>
#include <I2CIO.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal_SR.h>
#include <LiquidCrystal_SR2W.h>
#include <LiquidCrystal_SR3W.h>
#include <Wire.h>  
#include <LiquidCrystal_I2C.h>


// Definim l’adreça LCD I2C

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);  


int BELL = 5;                            // PIN 5   
int duracion= 500;                       // Duració del to (0.5 seg)

void setup() {
  pinMode(BELL, OUTPUT);
  Serial.begin(9600);
  lcd.begin(16,2);
}

void loop() {


// Definim les característiques específiques per cada nota

  
  if (Serial.available() >0) {         

      char valueSerial = Serial.read(); 


// DO

    if(valueSerial =='<'){               // Correspon a la tecla ‘<’
      analogWrite(BELL,150);
      delay(10);
      analogWrite(BELL, 0);
      tone(BELL, 654.06, duracion);      // Freq.DO 10: 654.06 Hz 
      lcd.clear();
      lcd.setCursor(7,0);                // Posició del caràcter a la pantalla
      lcd.print("DO");                   // ‘DO’es mostra per pantalla
    }


      //RE

    else if(valueSerial =='Z'){          // Correspon a la tecla ‘Z’       
      analogWrite(BELL,150);
      delay(10);
      analogWrite(BELL, 0);
      tone(BELL, 734.16, duracion);      // Freq.RE 10: 734.16 Hz 
      lcd.clear();
      lcd.setCursor(7,0);                // Posició del caràcter a la pantalla    
lcd.print("RE");                   // ‘RE’es mostra per pantalla


    }

      //MI

    else if(valueSerial =='X'){          // Correspon a la tecla ‘X’
     
      analogWrite(BELL,30);
      delay(10);
      analogWrite(BELL, 0);
      tone(BELL, 824.07, duracion);      // Freq.MI 10: 824.07 Hz 
      lcd.clear();
      lcd.setCursor(7,0);                // Posició del caràcter a la pantalla     
lcd.print("MI");                   // ‘MI’es mostra per pantalla


    }

      //FA

    else if(valueSerial =='C'){          // Correspon a la tecla ‘C’
     
      analogWrite(BELL,30);
      delay(10);
      analogWrite(BELL, 0);
      tone(BELL, 873.07, duracion);      // Freq.FA 10: 873.07 Hz 
      lcd.clear();
      lcd.setCursor(7,0);                // Posició del caràcter a la pantalla     
      lcd.print("FA");                   // ‘FA’es mostra per pantalla
    }
     
      //SOL

    else if(valueSerial =='V'){          // Correspon a la tecla ‘V’
    
      analogWrite(BELL,30);
      delay(10);
      analogWrite(BELL, 0);
      tone(BELL, 979.99, duracion);      // Freq.SOL 10: 979.99 Hz 
      lcd.clear();
      lcd.setCursor(7,0);                // Posició del caràcter a la pantalla
      lcd.print("SOL");                  // ‘SOL’es mostra per pantalla
    }


      //LA

    else if(valueSerial =='B'){          // Correspon a la tecla ‘B’
  
      analogWrite(BELL,30);
      delay(10);
      analogWrite(BELL, 0);
      tone(BELL, 1100, duracion);        // Freq.LA 10: 1100 Hz 
      lcd.clear();
      lcd.setCursor(7,0);                // Posició del caràcter a la pantalla
      lcd.print("LA");                   // ‘LA’es mostra per pantalla
    }

      //SI

    else if(valueSerial =='N'){          // Correspon a la tecla ‘N’
     
      analogWrite(BELL,30);
      delay(10);
      analogWrite(BELL, 0);
      tone(BELL, 1230, duracion);        // Freq.SI 10: 1230 Hz 
      lcd.clear();
      lcd.setCursor(7,0);                // Posició del caràcter a la pantalla
      lcd.print("SI");                   // ‘SI’es mostra per pantalla
    }

      //DO’
   
    else if(valueSerial =='M'){          // Correspon a la tecla ‘M’
     
      analogWrite(BELL,30);
      delay(10);
      analogWrite(BELL, 0);
      tone(BELL, 1300, duracion);        // Freq.SI 10: 1300 Hz 
      lcd.clear();
      lcd.setCursor(7,0);                // Posició del caràcter a la pantalla
      lcd.print("DO'");                  // ‘DO’’es mostra per pantalla
    }
    
  }
}

3) Demostració





viernes, 4 de abril de 2014

Lab 2.1 - Blinking LED

Per Aurora Ripoll i Jose Ángel Mohedano


OBJECTIU: Crear un programa que controli el parpelleig d'un LED utilitzant la placa Arduino. Per fer-ho s'extendrà de l'exemple bàsic Blink (http://arduino.cc/en/tutorial/blink).


Nosaltres controlarem la intensitat del LED utilitzant un sensor LDR. El qual no és més que una resistència que variarà el seu valor en funció de la llum rebuda.


Material necessari:


- Placa Arduino UNO
- Placa Protoboard
- Resistència de 150 kOhms
- 1 LED
- Cables connectors
- altaveu



Variació de la lluminositat d'un LED utilitzant un LDR



Passos seguits per aconseguir l'objectiu:


1) Disseny del circuit:


Esquema del circuit:






Esquemàtic:





2) Disseny del codi:


El que ens interessa és variar la lluminositat del LED segons la quantitat de llum que detecti el sensor LDR. Per fer-ho s'utilitzarà la funció analogWrite la qual utilitza una modulació PWM per crear aquest efecte de variació(http://arduino.cc/en/Reference/AnalogWrite?from=AnalogWrite.PWM). 

La intensitat de la lluminositat dependrà dels valors del cicle d'aquesta modulació. El LED estarà totalment apagat quan el cicle de PWM sigui igual a 0 i totalment encès quan sigui igual a 255. La variació d'aquest valor serà la variació de la lluminositat, la qual dependrà del valor rebut de l'LDR (resistència variable segons la lluminositat). L'altaveu està connectat en sèrie amb el LED de tal forma que aquest sonarà sempre que aquest estigui encès.



Codi:



const int Pin_led = 11;       // Pin digital (~PWM) escollit


int LDR_value;
int LDR_pin = 0;              // Variable LDR, pin 0



// Rutina setup: s'executa un cop al prémer reset (o al tornar a complirar el programa).


void setup() {       
 
 // inicialitzar el pin digital com a sortida.
 pinMode(Pin_led, OUTPUT);


 // Visualizació dels valors per la consola.
 Serial.begin(9600);  
}



// Rutina loop: execució infinita


void loop() {


 LDR_value = analogRead(LDR_pin);    // llegeix l'entrada de l'LDR (quantitat de llum)
 
   if(LDR_value<80){                 // Establim llindar per encendre/apagar el LED.
     
     analogWrite(Pin_led, 0);
     delay(30);}
     
   else{                               // per la resta de valors per sobre del llindar.
     
     analogWrite(Pin_led, LDR_value/4);  
     delay(30);}
 
 Serial.print("LDR = ");              // visualització per pantalla.
 Serial.println(LDR_value);
 
}



Demostració:

Apliquem un focus fixe de llum i anem atenuant-lo poc a poc: