miércoles, 15 de enero de 2014

Proposta de treball de recerca batxillerat

Vull fer un treball de recerca dins l'àrea de tecnologia. Es tractarà de desenvolupar un projecte d'aplicació pràctica fent servir eines de tecnologia actual. Avui en dia estem acostumats a utilitzar objectes d'alta tecnologia sense ser conscients de la complexitat d'aquestes eines per exemple un mòbil, Internet... Fins i tot una simple bàscula de cuina té uns sensors de pressió, un circuït imprès i un microprocessador.


He pensat utilitzar la tecnologia d'Arduino; es tracta d'un dispositiu de hardware basat en la filosofia de programari lliure, està composat d'un processador, una connexió USB i un conjunt de sortides a les que es poden diferents tipus d'elements electrònics.

En els darrers mesos he anat fent petites instal·lacions electròniques per familiaritzar-me amb Arduino. He fet servir com arxiu d'aquestes experiències aquest blog.

Les possibilitats que dona Arduino són gairebé infinites, a continuació explicaré unes quantes:
  • Jocs: Diana electrònica, roda de la fortuna automàtica...
  • Música: Sintetitzador musical, arpa sense cordes, bateria automàtica, pedal per guitarra elèctrica...
  • Muntatges audiovisuals: Cub de LED, expositors lluminosos.
  • Sistemes automàtics: Reg automàtic, dispensador d'aliments per a mascotes
  • Robots i drons: per realitzar tasques específiques.
  • Sistemes de control: Reguladors de temperatura, velocitat, brúixoles i compassos, enllumenat dels carrers, domòtica...
  • Impressores 3D

En el proper mes triaré algun tema en concret, amb l'ajuda del professor de tecnologia; mentrestant practicaré amb Arduino per conèixer millor el seu funcionament.

lunes, 6 de enero de 2014

Encendre un LED amb un botó

Materials necessaris

  • Placa arduino uno
  • Protoboard
  • Led monocromo
  • Resistència 220Ω ±5%
  • Botó
  • Resistència 10KΩ ±5%
  • Cablejat

Circuit

El circuit té dues parts:
  • LED amb resistència, igual a l'entrada anterior
  • Botó: d'una banda està conectat a la font de 5v. i per altra a terra mitjançant una resistència. D'aquesta manera l'Arduino llegeix 5v quan el botó està pressionat i llegeix terra al soltar-lo

Esquema del circuit fet amb Fritzi:


Programa

El programa presenta dos novetats respecte a l'anterior, d'una banda definirem variables abans del void setup. D'altra part farem servir el comando IF per fer accions si es compleixen determinades condicions.

En primer lloc fem un programa que encén el LED quan el botó està pressionat:

const int LED = 12; // el pin del LED
const int BUTTON = 7; // el pin d'entrada on es conecta el botó
int estat = 0; // valor per a quardar l'estat del pin d'entrada

void setup()
{
  pinMode(LED, OUTPUT); // LED-----> sortida
  pinMode(BUTTON, INPUT); // BUTTON--> entrada
}

void loop()
{
  estat = digitalRead(BUTTON); // llegir el valor d'entrada
  if (val == HIGH)
  {
    digitalWrite(LED, HIGH); // encendre el LED
  }
  else
  {
    digitalWrite(LED, LOW); // apaga el LED
  }
}




Veiem que el circuit funciona però es poc pràctic. Per això modifiquem el programa per tal de que al prémer el botó encenem el LED i al tornar-lo a pressionar s'apaga.
Hem d'introduir una nova variable ESTAT que "recorda" si el LED està apagat o encès per tal de poder canviar-lo al prémer el botó:

const int LED = 12; // el pin del LED
const int BUTTON = 7; // el pin d'entrada on es conecta el botó
int estat = 0; // valor per a quardar l'estat del
pin d'entrada
int sortida = 0; // 0 = LED apagat y 1=LED ences

void setup()
{
  pinMode(LED, OUTPUT);      // LED-----> salida
  pinMode(BUTTON, INPUT);    // BUTTON--> entrada
}

void loop()
{
  estat = digitalRead(BUTTON); // llegir el valor d'entrada 


// comprobar si l'entrada es HIGH (botó pulsat)  
if (estat == HIGH)
  {
    sortida = 1 - sortida;
  }


if (sortida == 1) {
    digitalWrite(LED, HIGH); // encender el LED
  } else {
    digitalWrite(LED, LOW);
  }
}



Es pot observar que funciona a vegades. Això està en relació amb el fet de que el LOOP s'executa a molta velocitat i es canvia la variable ESTAT moltes vegades mentre mantenim el botó pressionat. Per aixó hem de modificar el programa per tal de millorar-lo.
Afegim una altra variable per comparar si l'estat del botó canvia respecte a l'anterior.

const int LED = 12;// el pin del LED
const int BUTTON = 7;// el pin de entrada on es conecta el botó

int estat = 0; // guarda l'estat del botó          
int EstatPrevi = 0; // guardar el estado anterior del botón
int sortida = 0; // 0 = LED apagado y 1=LED encendido

void setup() {
  pinMode(LED, OUTPUT);      // LED-----> salida
  pinMode(BUTTON, INPUT);    // BUTTON--> entrada
}
void loop(){
  estat = digitalRead(BUTTON); // llegir el valor d'entrada


  // comprobar si la entrada es HIGH (botó apretat)i es diferent
  if ((estat == HIGH) && (EstatPrevi == LOW))
  {
    sortida = 1 - sortida;
  }
  EstatPrevi = estat;    // guarda el valor actual
  if (sortida == 1) {
    digitalWrite(LED, HIGH); // encendre el LED
  } else {
    digitalWrite(LED, LOW);
  }
}




Veiem que funciona millor però a vegades falla. Això es degut al rebot que es produeix en els botons, ja que son elements mecànics amb una certa imprecisió, com es veu a la figura:



Solucionarem el problema d'una manera senzilla afegint un retard d'uns microsegons. Existeixen sistemes més complexes però aquest, de moment, ens funciona:

const int LED = 12; // el pin del LED
const int BUTTON = 7; // el pin d'entrada on es conecta el botó

int estat = 0; // guarda l'estat del botó         
int EstatPrevi = 0; // guarda l'estat anterior del botó
int sortida = 0; // 0 = LED apagat i 1=LED encès

void setup() {
  pinMode(LED, OUTPUT);      // LED-----> sortida
  pinMode(BUTTON, INPUT);    // BUTTON--> entrada
}
void loop(){
  estat = digitalRead(BUTTON); // llegir el valor d'entrada


  // comprovar si l'entrada es HIGH (botó apretat)
  if ((estat == HIGH) && (EstatPrevi == LOW))
  {
    sortida = 1 - sortida;
    delay(20);
  }
  EstatPrevi = estat;    // guarda el valor actual
  if (sortida == 1) {
    digitalWrite(LED, HIGH); // encender el LED
  } else {
    digitalWrite(LED, LOW);
  }
}