Es mostren els missatges amb l'etiqueta de comentaris Arduino. Mostrar tots els missatges
Es mostren els missatges amb l'etiqueta de comentaris Arduino. Mostrar tots els missatges

dilluns, 7 de juliol del 2014

8bit pseudo-theremin (4): afegir un led bicolor per indicar el tempo

A l'article anterior vaig afegir un potenciòmetre per indicar el tempo. El problema és que no hi havia cap indicador visual del tempo actual. Per aquest motiu he decidit afegir un led de dos colors per indicar-ho.

Esquema del circuit

El codi no canvia gaire, a nivell bàsic s'ha afegit un vector amb dos pins (led vermell, led verd) i es va activant o desactivant depenent del cicle on s'estigui.


/*
 Translate HC-SR04 Ping distance sensor into buzzer tone with a potentiometer tempo
 
 Author: Ferran Recio
 This code is part of the project 8bit pseudo-theremin (http://laveudet.blogspot.com.es/2014/07/pseudo-theremin-8bits-part-0.html)
 
 Code based on:
 
 HC-SR04 Ping distance code by ScottC here: http://arduinobasics.blogspot.com.au/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html
 buzzer tutorial here:  http://arduino.cc/en/Tutorial/Tone
 
 on 04 Jul 2014.
 */

#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED
 
int potenPid = A1;

int buzzerPin = 10;
int buzztone = 0;

//buzzer tone range
int maxbuzztone = 2500;//4978;
int minbuzztone = 1;

int maximumRange = 30; // Maximum range needed
int minimumRange = 1; // Minimum range needed
long duration, distance; // Duration used to calculate distance

//marcador de tempo
int tempo[] = {2,3};//leds
int currled = 0;

int delayval = 25;


void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
  pinMode(buzzerPin, OUTPUT);   // sets the pin as output
  
  int i;
  for (i = 0; i < 2; i = i + 1) {
    pinMode(tempo[i], OUTPUT);
  }
  
}

void loop() {
  /* The following trigPin/echoPin cycle is used to determine the
   distance of the nearest object by bouncing soundwaves off of it. */ 
   digitalWrite(trigPin, LOW); 
   delayMicroseconds(2);
  
   digitalWrite(trigPin, HIGH);
   delayMicroseconds(10); 
   
   digitalWrite(trigPin, LOW);
   duration = pulseIn(echoPin, HIGH);
   
   //Calculate the distance (in cm) based on the speed of sound.
   distance = duration/58.2;
   
   if (distance >= maximumRange || distance <= minimumRange){
     //Serial.println("-1");
     digitalWrite(LEDPin, LOW);
     noTone(buzzerPin);
   }
   else {
     digitalWrite(LEDPin, HIGH);
     
     buzztone = map(distance, minimumRange, maximumRange, minbuzztone, maxbuzztone);
     buzztone = maxbuzztone - buzztone;
     
     tone(buzzerPin,buzztone);
   }
   
   //tempo
   if (currled==0) {
    currled = 1;
    digitalWrite(tempo[0], HIGH);
    digitalWrite(tempo[1], LOW);
   } else {
    currled = 0;
    digitalWrite(tempo[0], LOW);
    digitalWrite(tempo[1], HIGH);
   }

   
   //pillem el delay
   delayval = analogRead(potenPid);
   delay(delayval+1);
}

Aquest el vídeo de l'efecte:


divendres, 4 de juliol del 2014

8bit pseudo-theremin (3): afegir un potenciometre per marcar el tempo

El primer pas del 8bit Theremin convertia la distancia en notes del brunzidor. Tot i això, el so era força molest perquè arribava a notes molt agudes i perquè l'espera entre notes era de només 25 milisegons.

El següent pas és afegir un potenciòmetre per tal d'indicar l'espera entre tons. O sigui, el tempo.

Esquema del cablejat

En aquest cas, el codi recull el valor del potenciòmetre i el fa servir de cara a l'espera entre execucions de la funció loop. A més, s'han polit els distàncies i el rang de tons del brunzidor.


/*
 Translate HC-SR04 Ping distance sensor into buzzer tone with a potentiometer tempo
 
 Author: Ferran Recio
 This code is part of the project 8bit pseudo-theremin (http://laveudet.blogspot.com.es/2014/07/pseudo-theremin-8bits-part-0.html)
 
 Code based on:
 
 HC-SR04 Ping distance code by ScottC here: http://arduinobasics.blogspot.com.au/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html
 buzzer tutorial here:  http://arduino.cc/en/Tutorial/Tone
 
 on 04 Jul 2014.
 */

#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED
 
int potenPid = A1;

int buzzerPin = 10;
int buzztone = 0;

//buzzer tone range
int maxbuzztone = 2500;//4978;
int minbuzztone = 1;

int maximumRange = 30; // Maximum range needed
int minimumRange = 1; // Minimum range needed
long duration, distance; // Duration used to calculate distance

int delayval = 25;


void setup() {
  Serial.begin (9600);
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
  pinMode(buzzerPin, OUTPUT);   // sets the pin as output
  
}

void loop() {
  /* The following trigPin/echoPin cycle is used to determine the
   distance of the nearest object by bouncing soundwaves off of it. */ 
   digitalWrite(trigPin, LOW); 
   delayMicroseconds(2);
  
   digitalWrite(trigPin, HIGH);
   delayMicroseconds(10); 
   
   digitalWrite(trigPin, LOW);
   duration = pulseIn(echoPin, HIGH);
   
   //Calculate the distance (in cm) based on the speed of sound.
   distance = duration/58.2;
   
   if (distance >= maximumRange || distance <= minimumRange){
     digitalWrite(LEDPin, LOW);
     noTone(buzzerPin);
   }
   else {
     digitalWrite(LEDPin, HIGH);
     
     buzztone = map(distance, minimumRange, maximumRange, minbuzztone, maxbuzztone);
     buzztone = maxbuzztone - buzztone;
     
     tone(buzzerPin,buzztone);
   }

   
   //pillem el delay
   delayval = analogRead(potenPid);
   delay(delayval+1);
}

A continuació poso un vídeo de com funciona:


8bit Pseudo-Theremin (2): sensor d'ultrasons i buzzer

El primer pas per fer el meu pseudo-theremin de 8 bits consisteix en recollir el valor del sensor de distàncies d'ultrasons i convertir-lo en un to per al brunzidor. Per fer-ho només m'ha sigut necessari combinar els meus dos anteriors tutorials sobre aquests sensors.

Esquema de connexió

El codi no es especialment complicat d'entendre. La clau està en fer servir la funció map per fer una regla de tres entre la distancia i el to i després invertir-lo perquè sigui més agut com més aprop s'estigui del sensor.

/*
 Translate HC-SR04 Ping distance sensor into buzzer tone.
 
 Author: Ferran Recio
 This code is part of the project 8bit pseudo-theremin (http://laveudet.blogspot.com.es/2014/07/pseudo-theremin-8bits-part-0.html)
 
 Code based on:
 
 HC-SR04 Ping distance code by ScottC here: http://arduinobasics.blogspot.com.au/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html
 buzzer tutorial here:  http://arduino.cc/en/Tutorial/Tone
 
 on 04 Jul 2014.
 */


#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

int buzzer = 11;//buzzer pin

int buzztone = 0;

//buzzer tone range
int maxbuzztone = 4978;
int minbuzztone = 1;

//distance range
int maximumRange = 100; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance

void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
 
 pinMode(buzzer, OUTPUT);   // sets the pin as outpu
}

void loop() {
/* The following trigPin/echoPin cycle is used to determine the
 distance of the nearest object by bouncing soundwaves off of it. */ 
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
 //Calculate the distance (in cm) based on the speed of sound.
 distance = duration/58.2;
 
 if (distance >= maximumRange || distance <= minimumRange){
 /* Send a negative number to computer and Turn LED ON 
 to indicate "out of range" */
 Serial.println("-1");
 digitalWrite(LEDPin, HIGH);
 
 noTone(buzzer);
 }
 else {
 /* Send the distance to the computer using Serial protocol, and
 turn LED OFF to indicate successful reading. */
 //Serial.println(distance);
 digitalWrite(LEDPin, LOW); 
 
 buzztone = map(distance, minimumRange, maximumRange, minbuzztone, maxbuzztone);
 buzztone = maxbuzztone - buzztone;
 Serial.println(buzztone);
 tone(buzzer,buzztone);
 }
 
 //Delay 50ms before next reading.
 delay(25);
}

El so de moment es força horrible, però espero anar-ho polint. A continuació poso un vídeo del que fa (el vídeo és d'una versió anterior a invertir el to, pel que sona més greu com més aprop):

 Vídeo de com funciona

8bit Pseudo-Theremin (part 1)

Fa una parell de setmanes vaig tenir la sort d'assistir a la Mini Maker Fair Barcelona. Com ja va passar l'any passat, el principal atractiu seguien sent les impressores 3D (i no és per menys) però també hi havia molts altres projectes interessants i vaig sortir amb moltes idees.

Un d'aquest projectes va ser l'estand de Rockin' Tec Projects, on tenien un aparell anomenat RTP's etherial-arpeggiator. Aquest prototipus usava dos sensors d'ultrasons, arduino, i un programa de l'estil Pure Data, per fer quelcom que només pot ser descrit com un Theremin per a música electrònica. Per desgràcia l'únic vídeo que hi ha està a la pàgina de Facebook del projecte i no es pot fer embed.

Com a afegit, als pocs dies vaig trobar-me, a la pàgina Thingivers, amb un model 3D per imprimir que formava part d'un projecte anomenat VIA (Visual Impairment Aid). De nou, un arduino i un sensor de distància, aquest cop acompanyat d'un brunzidor.



Això ha fet que em piqui la curiositat i m'he proposat fer un pseudo-theremin de 8 bits. Si ve no crec que arribi tant lluny com els dos projectes anteriors ni que tingui cap utilitat real, sí que em servirà d'excusa per anar fent proves. Si tot va bé, durant els pròxims articles aniré explicant pas a pas el que vaig fent perquè serveixi a mode de tutorial.

dijous, 3 de juliol del 2014

Connectar un sensor de distància d'ultrasons a l'Arduino

Malgrat el nom que té, un detector de distància d'ultrasons es un dels components més clàssics d'Arduino, sobretot si estem interessats en la robòtica. Com el sou propi nom indica, aquest sensor detecta distàncies mitjançant ultrasons i permet, per exemple, detectar la distancia d'un mur o d'una mà. Com veurem, és un sensor força senzill d'usar i fàcil d'aconseguir.

Com és connecta

El sensor té 4 pins:
  • VCC: entrada de voltatge. Va directe a 5V de l'arduino
  • Trig: abreviació de "Trigger" (disparador en català), és el pin que es fa servir per indicar al sensor que emeti ultrasons. En aquest cas el connectarem al 7.
  • Echo: pin per rebre l'eco de l'ultrasò i calcular la distancia. En aquest cas el connectarem al 8.
  • GND: ground. Va directe a l'arduino
Esquema de la connexió (imatge feta amb Fritzing)

Com funciona

La principal dificultat d'aquest sensor es saber com funciona. Per sort hi ha gent mola eixerida que ho ha fet abans i ho documenta millor que aquest bloc (concretament el bloc de Arduino Basics). L'algorisme a grans trets és el següent:
  1. Posem el LOW el pin Trigger per garantis que no estiguéssim emeten
  2. Esperem una estona prudencial per evitar ultrasons residuals (2 microsegons)
  3. Posem el trigger a HIGH per emetre ultrasons
  4. Esperem una estona per permetre el rebot (10 microsegons)
  5. Posem de nou el trigger a LOW per deixar d'emetre
  6. agafem el resultat del pin Echo amb la funció pulseIn
  7. Calculem la distància dividint per la velocitat del so (en serio). Això sona molt difícil però realment es dividir el resultat del pas anterior per 58.2
Codi d'exemple

El següent exemple està directament agafat de la web de Arduino Basics. Concretament, llegeix la distància cada 50 milisegons i escriu el resultat al port serie.


/*
 HC-SR04 Ping distance sensor:
 VCC to arduino 5v 
 GND to arduino GND
 Echo to Arduino pin 7 
 Trig to Arduino pin 8
 
 This sketch originates from Virtualmix: http://goo.gl/kJ8Gl
 Has been modified by Winkle ink here: http://winkleink.blogspot.com.au/2012/05/arduino-hc-sr04-ultrasonic-distance.html
 And modified further by ScottChere: http://arduinobasics.blogspot.com.au/2012/11/arduinobasics-hc-sr04-ultrasonic-sensor.html
 on 10 Nov 2012.
 */


#define echoPin 7 // Echo Pin
#define trigPin 8 // Trigger Pin
#define LEDPin 13 // Onboard LED

int maximumRange = 200; // Maximum range needed
int minimumRange = 0; // Minimum range needed
long duration, distance; // Duration used to calculate distance

void setup() {
 Serial.begin (9600);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
}

void loop() {
/* The following trigPin/echoPin cycle is used to determine the
 distance of the nearest object by bouncing soundwaves off of it. */ 
 digitalWrite(trigPin, LOW); 
 delayMicroseconds(2); 

 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10); 
 
 digitalWrite(trigPin, LOW);
 duration = pulseIn(echoPin, HIGH);
 
 //Calculate the distance (in cm) based on the speed of sound.
 distance = duration/58.2;
 
 if (distance >= maximumRange || distance <= minimumRange){
 /* Send a negative number to computer and Turn LED ON 
 to indicate "out of range" */
 Serial.println("-1");
 digitalWrite(LEDPin, HIGH); 
 }
 else {
 /* Send the distance to the computer using Serial protocol, and
 turn LED OFF to indicate successful reading. */
 Serial.println(distance);
 digitalWrite(LEDPin, LOW); 
 }
 
 //Delay 50ms before next reading.
 delay(50);
}
 
NOTA: el codi font ha sigut formatejat amb hilite.me

dijous, 4 de juliol del 2013

Connectar un led RGB a l'Arduino

Així com a l'anterior article vaig comentar el led de dos colors (verd i vermell) també existeixen els leds tricolors, que permeten il·luminar amb vermell, verd i blau. Això fa que jugant amb les intensitats, sigui possible representar molts colors. En el meu cas aquest sensor al meu pack és el KY-011. I el tutorial d'on he tret com connectar-lo el podeu trobar a adafruit learning system.

Com es connectar

La connexió és ben senzilla ja que es fa com qualsevol altre led. Tant si està integrat en una placa com si es tracta d'un led independent, sempre tindrà tres pins:

  1. GND: que va directe a l'arduino
  2. R: pin vermell, que va connectar a una resistència de 220 ohm i després a un pin de sortida analógica de l'arduino (per exemple el #9)
  3. G: pin verd que va connectar a una resistència de 220 ohm i després a un pin de sortida analògica (per exemple el #10)
  4. B: pin blauque va connectar a una resistència de 220 ohm i després a un pin de sortida analògica (per exemple el #11)

Codi d'exemple

El següent exemple va rotant els colors que representa el led. Per fer-ho té 3 variables, una per cada component de la llum, que van incrementant-se a ritmes diferents.

int ledr = 9;
int ledg = 10;
int ledb = 11;

int red=0;
int green=0;
int blue=0;

void setup() {                
  pinMode(ledr, OUTPUT);
  pinMode(ledg, OUTPUT);
  pinMode(ledb, OUTPUT);
}

void loop() {
  
  analogWrite(ledr, red);
  analogWrite(ledg, green);
  analogWrite(ledb, blue);
  red=red+10;
  green=green+30;
  blue=blue+40;
  if (red>254) red=0;
  if (green>254) green=0;
  if (blue>254) blue=0;
  delay(200);
}



diumenge, 30 de juny del 2013

Connectar un led verd/vermell a l'Arduino

És molt típic que aparells com les televisions tinguin un led que canvia de vermell a verd quan s'engega. El nom del sensor al meu pack és KY-011.

Com es connecta

La connexió no és molt diferent de la d'un led normal, amb la diferència que té un pin pel color verd i un pel color vermell. Per la resta és idèntic i, com ja passava al led, cal posar una resistència de 220-ohm.

  1. Green: pin verd, a qualsevol pin digital de l'arduino
  2. Red: pin vermell, a qualsevol pin digital de l'arduino
  3. GND: directe a l'arduino

Com connectar-lo

Si voleu més informació, mireu l'article de com connectar un led.

Codi d'exemple

El codi no deixa de ser una variació del blink

int green = 13;
int red = 12;

void setup() {                
  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);  
}

void loop() {
  digitalWrite(green, LOW);
  digitalWrite(red, HIGH);
  delay(1000);
  digitalWrite(red, LOW);
  digitalWrite(green, HIGH);
  delay(1000);
}

Connectar un brunzidor (buzzer) a l'Arduino

Un buzzer és una mena de petit altaveu capaç d'emetre sons. Es tracta d'un sensor molt senzill de connectar però que es pot fer servir tant per emetre un "beep" com per fer sonar notes.

Connexió del brunzidor

La connexió és extremadament senzilla. Un buzzer bàsic només té dues potes, una que va directament al GND i l'altre que va al pin que es vulgui (millor si es connecta a un pin amb sortida analògica com el #9 ja que sinó no podrem enviar notes diferents).

Si teniu una versió amb placa, només cal connectar el pin S i el - (GND) ja que el +5V no es fa servir.

Emetre un beep amb un brunzidor

El següent exemple l'he tret d'aquesta web i explica com fer sonar un "beep" bàsic amb un buzzer.

int buzzer = 9;

void setup()  { 
  // declare pin 9 to be an output:
  pinMode(buzzer , OUTPUT);

void loop()  { 
  beep(200); 
}

void beep(unsigned char delayms){
  analogWrite(buzzer,20);
  //el 20 es arbritari, es el to que emetra
  delay(delayms);//temps que sonara
  analogWrite(buzzer,0);//apagar el buzzer
  delay(delayms);//esperar uns instants
}

Emetre notes amb un brunzidor

Per emetre notes amb un buzzer podem seguir el tutorial de la pàgina d'Arduino que, encara que explica com fer-ho amb un altaveu (la connexió és diferent) el codi és el mateix que per un buzzer.

Per fer-ho, el primer que cal fer és crear un arxiu amb els codis de les notes. Per fer-ho cal fer clic a la icona de triangle que hi ha al costat del nom de l'arxiu, seleccionar l'opció de nova pestanya i escriure "pitches.h". En aquest arxiu copiarem les definicions que podeu trobar aquí.

Com crear una nova pestanya a l'entorn d'Arduino

Un cop fet això, el codi fa servir les funcions:
  • tone (pin, freqüència, duració): que emet una nota. Si no es passa duració sonarà fins que es cridi notone.
  • notune (pin): que atura el buzzer
El codi d'exemple seria tal que així

/*
llibreria estandard on hi ha les notes
*/
#include "pitches.h"

int buzzer = 9;

//les notes
int melody[] = {
  NOTE_C4, NOTE_G3,NOTE_G3, NOTE_A3, NOTE_G3,0, NOTE_B3, NOTE_C4};
//la duracio
int noteDurations[] = {
  4, 8, 8, 4,4,4,4,4 };

void setup()  { 

void loop()  { 
  for (int thisNote = 0; thisNote < 8; thisNote++) {

    // la duracio va amb milisegons
    int noteDuration = 1000/noteDurations[thisNote];
    tone(buzzer, melody[thisNote],noteDuration);

    // temps de pausa entre notes
    int pauseBetweenNotes = noteDuration * 1.30;
    delay(pauseBetweenNotes);
    // para el buzzer
    noTone(buzzer);
    
    delay(2000);
  } 
}

Connectar un fotoresistor a l'Arduino

Aquest sensor bàsic venía amb el pack inicial d'Arduino. El tutorial on explica com fer-lo servir és de la pàgina oficial d'Arduino. Encara que hi ha altres tutorials com aquest altre.


Un fotoresistor és un element que varia la seva resistència segons la llum que rep. A nivell bàsic pot ser entès com un element que deixa passar més corrent com més llum li arriba i, per tant, ens pot servir per la mesurar quantitat de llum.

Connexió del sensor (amb el fotoresistor a seques)

La connexió del sensor recorda a la del led, però és un xic diferent. Com que quan li toqui la llum deixarà passar la corrent lliurement, és necessari posar unaresistència de 10K entre el GND i els +5V. Tot i això, 

Connexió del fotoresistor (via Nakkaya.com)

A la imatge es pot veure que la connexió és peculiar. Una de les potes del fotoresistor va directe al GND de l'Arduino i l'altre al pin analògic que volguem (A0 per exemple), però per evitar curtcircuits, afegim una resistència de 10K que va als 5V.

Connexió del sensor (amb la versió ja montada en una placa)

Al pack de sensors (aquest) em venia algun fotoresistor ja montat en una placa. La avantatge de la placa és que ja ve amb la resistència marcada. El problema és que la placa està mal etiquetada i els pins reals són (via DxArduinoModulePack):
  • GND:
  • +5V:
  • S: sortida analògica (per exemple al pin A0)
Si voleu fer servir la versió de placa, el meu consell és que re-etiqueteu directament a la placa, sinó correu el risc d'equivocar-vos cada cop.

Les connexión de la versió amb placa

Codi d'exemple

El següent codi llegeix el valor del fotoresistor del pin analògic A0 i el treu pel port serie (per veure el valor cal prèmer Control+Shift+M o bé anar a "Herramientas -> Monitor serial").

int photoresistor = A0;//pin A0

void setup(){
    Serial.begin(9600);
}

void loop(){
    Serial.println(analogRead(photoresistor));
    //els valors van de 0 (maxima llum) o 1023 (foscor)
    delay(100);
}


dissabte, 29 de juny del 2013

Connectar un sensor d'humitat i temperatura a l'Arduino

El component en qüestió venia amb el pack: http://dx.com/p/arduno-37-in-1-sensor-module-kit-black-142834 (podeu veure tots els components del pack catalogats aquí). El seu codi és Ky-015.

El tutorial d'on ho he tret és aquest, encara que en el seu cas el sensor té un pin de més que no es fa servir.

Connexió del sensor

El sensor és senzill de connectar. Té 3 pins:
  1. S: pin de dades, és connecta a un dels pins analògics. Per exemple a l'A0.
  2. +5v: directa a l'arduino
  3. GND: directe a l'arduino
Vista dels connectors

Instal·lació de la llibreria d'Arduino

Malgrat que es podria fer servir sense una llibreria, la veritat és que sempre és més fàcil si es pot reaprofitar el treball que ha fet algú altre. En aquest cas cal instal·lar la llibreria en zip que podeu trobar a hobbyist.co.nz.

En general, per instal·lar llibreries es recomana copiar-les al directori d'instal·lació de l'arduino al subdirectori "libraries", però aquí explico una altre manera de fer-ho:

Obrir l'entorn d'Arduino i anar al menú "Sketch ->Importar librerías -> Add library " 
Seleccionar l'arxiu zip (en aquest cas es diu DHT.zip) un cop fet tornareu a l'entorn de programació 
Tornar al menú "Sketch ->Importar librerías " i seleccionar al final de tot la llibreria importada i al codi ja us apareixerà una línia a l'inici on s'importa la llibreria (#include <dht.h>) 

Codi d'exemple

El següent codi agafa la temperatura i humitat del sensor i l'escriu pel port sèrie.

Mentre s'està executant connectat a l'ordinador, es pot consultar el que l'Arduino envia per sèrie prement "control+majúscules+M" o bé anant a "Herramientas -> Monitor Serial"

#include <dht.h>

#define dht_dpin A0 //pin de lectura A0

dht DHT;//llibreria importada 

void setup(){ 
 Serial.begin(9600); 
 delay(1000);//es recomana deixar un segon abans de llegir 

void loop(){

 DHT.read11(dht_dpin);
 Serial.print("Current humidity = "); 
 Serial.print(DHT.humidity); 
 Serial.print("% "); 
 Serial.print("temperature = "); 
 Serial.print(DHT.temperature); 
 Serial.println("C "); 

 delay(800);//es recomana consultar cada 2 segons 
 //encara que tambe funciona amb 0.8 segons 

Com queda la connexió 













diumenge, 23 de juny del 2013

Connectar un interruptor de mercuri a l'Arduino

El nom del sensor fins on sé és KY-017. El sensor és d'aquest pack de sensors (els teniu tots catalogats aquí)

Aquest sensor amb un nom tant rimbombant és en realitat ben senzill d'entendre, dins d'un tub de vidre hi ha una gota de mercuri que es mou lliurement i dos borns. Així, quan està vertical i cap a munt, la gota cau i fa contacte, en canvi quan està a baix els borns no es toquen.

Connexió

El sensor té només 3 pins:
  1. GND: directe al de l'Arduino
  2. +5V: directe al de l'Arduino
  3. S: que indica si els borns estan en contacte, és connecta al pin digital que es vulgui de l'Arduino (per exemple al 7)
Connexió del sensor

El sensor a més ve equipat amb un led vermell que ens indica si està els bors estan en contacte o no, pel que és força fàcil de veure si s'està connectant o bé o no.

Codi d'exemple

A l'exemple he connectat un led extra al pin 13 que s'ilumina quan els borns NO estan en contacte (al contrari del que fa el led que porta el propi sensor).

int led = 13;//led 
int mercury = 7;//interruptor de mercuri

void setup() {                
  pinMode(led, OUTPUT);
  pinMode(mercury, INPUT);
}
 
void loop() {
  int mercuryState = digitalRead(mercury);
  if (mercuryState == HIGH) {        
    digitalWrite(led, HIGH);  
  } else {
    digitalWrite(led, LOW); 
  }
}

Poso un petit vídeo del sensor funcionant.


dijous, 20 de juny del 2013

Connectar un joystick analògic a l'Arduino

El meu joystick és un dels components del següent pack: http://dx.com/p/arduno-37-in-1-sensor-module-kit-black-142834 (podeu veure tots els components del pack catalogats aquí).El text de la placa diu "Keyes SJoys" i, segons el llistat de components, es diu "XY-axis joystick module KY-023".

El seu funcionament és molt senzill (fins i tot més del que m'esperava). Té 4 pins:

  1. GND: directe d el'Arduino
  2. +5V: directe de l'Arduino
  3. VRx i VRy: que retornen el valor de l'eix X i Y. S'han de connectar als Analog IN (per exemple a A0 i A1)
  4. SW: que en teoria serveix per veure si s'ha premut en mode botó. De moment no he aconseguit capturar-ho.
Vista dels connectors


He trobat un tutorial de com connectar-lo aquí: http://jannehuo.wordpress.com/2013/02/07/arduino-joystick-2/. Només cal llegir els valors de VRx i VRy amb la funció "analogRead" com ja havíem fet amb el potenciòmetre. Aquí un codi d'exemple que treu per terminal els dos valors separats per coma.

Codi d'exemple

int joy1 = 0;//pin analogic de les X
int joy2 = 1;//pin analógic de les Y
int val1 = 0;//valor X
int val2 = 0;//valor Y

void setup() {
 Serial.begin(9600);
}

void loop() {
 //llegim els valors
 val1 = analogRead(joy1);
 delay(100); //recomanen posar-ho
 val2 = analogRead(joy2);

 //imprimim els valors
 Serial.print(val1);
 Serial.print(",");
 Serial.print(val2);
 Serial.println();
 delay(1);
}

Com queda la connexió

dimecres, 19 de juny del 2013

Connectar un potenciòmetre a l'Arduino

A nivell pràctic, un potenciòmetre no és més que una roda que retorna un valor analògic. Un exemple fàcil d'entendre és una roda de volum de qualsevol cadena de música.

El tutorial l'he tret d'aquí: http://arduino.cc/en/Tutorial/AnalogReadSerial. Aquí s'explica com llegir un valor de l'Arduino des de la consola de l'entorn, però en el meu cas faré que la intensitat d'un led al pin 9 vingui donada pel potenciòmetre del pin A0.

La idea és que l'Arduino té una sèrie de ports anomenats Analog IN que són capaços de llegir valors analògics com els d'un potenciòmetre i convertir-los en nombres enters.

Connexió del potenciòmetre (via http://arduino.cc/en/Tutorial/AnalogReadSerial)

Bàsicament, el potenciòmetre té 3 pins. El del mig retorna el valor (per això es posa al pin A0), el de l'esquerra va al 5V i el de la dreta al GND.

Codi del programa

El codi del programa és una variació de l'original que fa una regla de tres del valor del potenciòmetre (que va de 0 a 1023) al màxim del led (que va de 0 a 255)

int led = 9; // el pin del led

void setup()  { 
  // declarem el pin 9 com de sortida
  pinMode(led, OUTPUT);
  Serial.begin(9600);

void loop()  {
  // llegim el potenciometre
  int sensorValue = analogRead(A0);
  //fem una regla de 3 (1023 - 255)
  int brightness = (sensorValue/10)*255/102;
  // set the brightness of pin 9:
  analogWrite(led, brightness);
  // esperem 30 milisegons
  delay(30);        
}

Com queda tot plegat

Connectar un led a l'Arduino (mode analògic)

A l'article anterior vaig posar com connectar un led a una sortida digital de l'Arudino (això vol dir que només està encès al màxim o apagat). Tot i això, l'Arduino té alguns ports que poden emetre valors analògics i que, per tant, poden regular la lluminositat del led. A l'Arduino Uno aquests ports estan marcats amb un símbol "#" (com ara el #3, #5, #6, #9, #10 i #11).


L'exemple l'he tret de: http://arduino.cc/en/Tutorial/Fade i fa servir la funció "analogWrite()" per enviar una senyal pel port 9.

Connexió al port 9 (via http://arduino.cc/en/Tutorial/Fade)

Com en el cas anterior, la pota llarga del led es connecta al port 9 i la pota curta al GND, La única diferència és que la resistència de 220-ohm està posada a la pota llarga (del que dedueixo que no canvia res perquè tant és que estigui a un costat com a l'altre mentre hi sigui).

Això és com queda

Connectar un led a l'Arduino (mode digital)

Degut a que la meva base d'electrònica és zero. El que em costa més d'entendre amb l'Arduino és com connectar  els diferents sensors i interactuar amb ells. Per això, he decidit anar escrivint com connecto cada sensor perquè serveixi de guia.

Ja aviso que el que aniré explicant només aplica als sensors que tinc. Intentaré sempre anar posant les referències si és que les tinc a ma, però no em faig responsable del que pugui passar amb d'altres sensors.

Connectar un led

L'exemple del led l'he tret d'aquí: http://arduino.cc/en/Tutorial/Blink. A grans trets consisteix en aprofitar el programa "blink" que emet pels port 13.

Diagrama de com es connecta (via http://arduino.cc/en/Tutorial/Blink)

En el meu cas es tracta d'un led i una resistència 220-ohm. La pota llarga del led es connecta al port 13 i la curta a la resistència, que anirà a petar al GND de l'arduino.

Fàcil.

Configurar Arduino Uno en Windows 7

Farà cosa d'un any em vaig posar una mica amb l'Arduino i, si bé vaig fer algunes coses interessants, la veritat és que el món real es va imposar i no vaig poder dedicar-m'hi massa. Mesos després de l'últim intent i amb l'ordinador recent formatejat, em proposo continuar.

Com que no recordo com s'instal·lava l'entorn, crec que serà una bona idea deixa-ho escrit. En el meu cas es tracta d'un Arduino Uno (amb un starter pack de l'estil d'aquest) i, pel que sé, les versions posteriors són força més senzilles d'instal·lar.

NOTA: la guia oficial d'instal·lació és aquesta: http://arduino.cc/en/Guide/Windows.

1. Descarregar l'entorn

Des de la pàgina http://arduino.cc/en/Main/Software ens baixem l'instal·lador per windows. En el meu cas m'he baixat la 1.0.5. La instal·lació és un wizard normal i corrent.

2. Connectar el trasto

L'última vegada que ho vaig fer vaig haver d'instal·lar el driver a ma per l'Uno, però ara veig que ja l'han integrat a l'instal·lador. En connectar-lo el windows instal·lar els controladors.

Molt possiblement en fer això el led 13 (és un led integrat a la placa) de l'Arduino es posarà a pampalluguejar o es quedarà estàtic. Això és perquè té carregat un programa bàsic en memòria.

3. Engegar l'entorn d'Arduino i carregar el programa blink

Ara ja podem obrir el programa d'arduino i us apareixerà una finestra com aquesta:

Entorn Arduino

Després anem a "Archivo -> Ejemplos -> 01.basics ->Blink" i s'ens carregarà el primer programa.

Molt probablement l'aplicació no haurà detectat en quin port tenim el dispositiu, així que la solució més fàcil és l'assaig i error.

A la barra blau fosc on hi ha botons, el segon botó (rodó amb una fletxa cap a la dreta) és enviar el programa cap a l'Arduino. Si fem clic apareixerà una barra a la part superior. Si al cap d'una estona el led taronja de l'Arduino comença a pampalluguejar ràpid vol dir que està carregant i ja ho tindrem tot bñe. Sinó el programa ens donarà error i vol dir que hem de indicar el port i el model.

Per indicar el model es fa anant a "herramientas -> tarjeta" i seleccionant el model (en el meu cas Arduino Uno). I per indicar el port es va a "herramientas -> puerto serial", en el meu cas ha sigut COM3, però només es qüestió d'anar provant.

Si tot us ha funcionat, quan carregueu el programa "blink" a l'Arduino, el led 13 es posarà en mode intermitent amb una freqüència d'un segon.