Category Archives: Arduino

ARDUINO: Pràctica 14: Cub de LED’s

Un cub de LED’s és una estructura formada per LED’s units entre ells formant un cub. Aquestes estructures poden ser més o menys grans depenen del nombre de LED’s que disposeu. La pràctica que fareu serà d’un cub 3x3x3, total 27 LED’s.

Per començar prepareu una plantilla per soldar els LED’s. Amb una fusta feu forats amb una broca de 5 mm de diàmetre i separats uns 2 cm entre ells formant un cub, tal com es veu a la figura:

Poseu 9 LED’s als forats doblegant el terminal més curt i dirigint-lo cap un dels LED’s del costat. Els terminals més llargs s’han de deixar verticals. Un cop fet, soldeu els terminals curts entre ells tal com es veu a la foto de sota. El LED del mig el soldeu a qualsevol dels del costat.
Quan els tingueu tots soldats, retireu l’estructura i torneu a fer el mateix dues vegades més per completar els tres pisos de l’estructura
Poseu de nou una de les estructura a la plantilla i aneu soldant els terminals llargs amb els d’una altra estructura tal com es veu a la foto:
Repetiu l’operació fins que tingueu els tres pisos muntats. Us ha de quedar més o menys així:

Per connectar a la placa Arduino l’estructura, heu de contar 9 columnes per 3 files. Soldeu un cable a cada fila i columna tal com es veu a la foto:

Quan els tingueu soldats munteu la següent l’estructura amb l’Arduino:
Els cables vermells són els de les 9 columnes, que van amb un resistor connectats als pins del 1 al 9. Els cables verds corresponen a les files, que van a través d’un transistor cadascuna d’elles conenctats als pins 10, 11 i 12.
Obriu el programa Arduino i copieu el següent codi per fer els efectes de llum:
int Columnas[] = {1, 2, 3, 4, 5, 6, 7, 8, 9};
int Filas[] = {12, 11, 10};
int RandFila;     //Variable para fila aleatoria
int RandColumna;  //Variable para columna aleatoria
void setup()
{
  int contador;
  for (int contador = 1; contador < 10; contador++){
    pinMode(Columnas[contador], OUTPUT); }
  for (int contador = 1; contador < 4; contador++){
    pinMode(Filas[contador], OUTPUT); }
}
void loop()
{
  RandLed();
}
void RandLed()
{
  RandFila = random(0,3);
  RandColumna = random(0,9);
  digitalWrite(Filas[RandFila], HIGH);
  digitalWrite(Columnas[RandColumna], HIGH);
  delay(75);
  digitalWrite(Filas[RandFila], LOW);
  digitalWrite(Columnas[RandColumna], LOW);
  delay(50);
}
Aquest és el vídeo de com us pot quedar:

PRÀCTICA AVANÇADA: busqueu per internet altres exemples de cubs 3x3x3 i busqueu els codis que els fan funcionar i proveu-lo amb els vostres. També podeu afegir un 4t pis amb 9 LED’s i reconfigurar el codi per incloure els nous.

ARDUINO: Pràctica 13: control de dos servos amb un joystick

En una pràctica anterior vàrem controlar un servomotor amb un potenciòmetre. En aquesta controlarem dos servos usant un joystick.
Un joystick no és més que dos potenciòmetres controlats per un comandament. A més a més, incorpora la funció de polsador.
Per començar, copieu el següent codi de bitbloq al vostre compte:
EL bloc del joystick té tres entrades, dues d’analògiques corresponents als dos potenciòmetres, i un de digital del polsador. Abans es defineixen les tres variables de cadascuna de les sortida.
  • El servo del pin 5 està controlat per la primera variable [0] del joystick. El concepte mapejar serveix per passar els 1023 valors que pot prendre el potenciòmetre com valor analògic als 180º que té el rang del servo de la sortida digital
  • El servo del pin 9 està controlat per la segona variable [1]. També es mapeja
El codi és el següent:
#include 
Servo servos[13];
/*** Global variables ***/
int _internal_readJoystick_array_A0_A1[3];
/*** Function declaration ***/
int * readJoystick_A0_A1();
void setup()
{
pinMode(7,INPUT_PULLUP);
servos[5].attach(5);
servos[9].attach(9);
}

void loop()
{
int *joy=(int*)malloc(3*sizeof(int));
joy[0]=0;
joy[1]=0;
joy[2]=0;
joy=readJoystick_A0_A1();
servos[5].write(map(joy[0],0,1023,0,180));
delay(1);
servos[9].write(map(joy[1],0,1023,0,180));
delay(1);

}

/*** Function definition ***/
int * readJoystick_A0_A1(){
_internal_readJoystick_array_A0_A1[0]=analogRead(A0);
_internal_readJoystick_array_A0_A1[1]=analogRead(A1);
_internal_readJoystick_array_A0_A1[2]=digitalRead(7);
return _internal_readJoystick_array_A0_A1;
}

Munteu el circuit usant amb la vostra placa. Aquest mateix circuit el podeu muntar amb Fritzing.

PRÀCTICA AVANÇADA: Amb la tercera variable del joystick, enceneu un LED quan es polsi el polsador.

ARDUINO: Pràctica 12: Control amb relés

Un relé és un dispositiu electromecànic que funciona com a interruptor controlat per un circuit elèctric en el qual per mitjà d’una bobina o electroimant, s’acciona un joc de contactes que permeten obrir o tancar altres circuits elèctrics.

La següent imatge mostra un esquema del funcionament d’un relé de forma interna:

 
El relé consta de dos circuits totalment independent, un de control amb una bobina, i un de potència amb dos contactes. La part de control funciona a voltatges baixos, 5v, mentre que la de potència es connecta a alters tensions, 230V. Els contactes del relé estan format de la següent manera:
Muntarem una pràctica on encendrem un LED a través d’un relé quan es pulsa un interruptor. Feu el següent muntatge a la placa:
Obriu bitbloq i copieu el següent codi:
El codi és el següent:
void setup()
{
pinMode(3,INPUT_PULLUP);
pinMode(7,OUTPUT);
}
void loop()
{
int boto=digitalRead(3);
if (boto == 0) {
digitalWrite(7,LOW);
}else if (boto == 1) {
digitalWrite(7,HIGH);
}
}
PRÀCTICA AVANÇADA: connecteu dos LEDs de manera que quan es pulsi el polsador, un LED s’encengui i l’altre s’apagui.

ARDUINO: Pràctica 11: Motors de corrent continu controlat per L293

Un motor de corrent continu és un actuador que consumeix una intensitat relativament elevada. La intensitat de corrent màxima que Arduino pot subministrar per un pin de sortida és de 40 mA. Així doncs, per poder governar a un DC motor, així com a qualsevol altre actuador de considerable potència, podem utilitzar:
  • un transistor.
  • un relé.
  • 1 integrat L293D (consisteix en un pont H de díodes, específic per al control de motors de corrent continu, inclusivament el canvi de gir).
Per al control dels nostres motors usarem el L293D

El circuit integrat  L293D








Aquest circuit integrat és un element que serveix per controlar el sentit de gir de 2 motors de corrent continu. Està basat amb els ponts en H que permeten canviar la polaritat dels motors. Aquest circuit per dintre és com es mostra a l’esquema de sota i tal com haurien d’anar connectats els motors:

Per veure com funciona, feu el muntatge de sota connectant un motor al circuit L293D i a la placa Arduino tal com es veu a sota. La placa Arduino està a 5V. Per al control de velocitat i sentit del motor ho farem amb un potenciòmetre, tal com està connectat a sota. Quan giris el potenciòmetre veuràs que podràs canviar la velocitat i el sentit de gir.
Entreu a bitbloq i copieu els següents blocs:
El codi és el següent:
void setup()
{
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
}

void loop()
{
int pot=analogRead(A0);
int motord=map(pot,0,1023,0,255);
int motore=map(pot,0,1023,255,0);
analogWrite(9,motord);
analogWrite(10,motore);
}

ARDUINO: Pràctica 10: El sensor d’ultrasons

Aquest sensor usa senyals d’ultrasonors per detectar objectes a una certa distància. Depenen de la resposta en el rebot del so, activa o desactiva l’entrada on està connectat a l’Arduino. Farem una pràctica per veure com es connecta.
Muntarem una alarma amb el sensor d’ultrasons. Necessitareu el sensor i un LED que s’encengui quan el sensor detecti presència, i un resistor per no cremar el LED.

El sensor llença un pols i rep una resposta a través de l’Eco que aquest fa en rebotar contra una superfície sòlida. En aquest cas, per exemple una paret. Aquest principi és el que utilitzarem per a poder mesurar la distància; mesurant el temps entre l’anada i la tornada i sabent la velocitat de propagació del so en l’aire. Munteu amb la placa el següent circuit.
Obre bitbloq i copia el següent esquema:

EL codi és el següent:
long TP_init(int trigger_pin, int echo_pin);
long Distance(int trigger_pin, int echo_pin);

void setup()
{
pinMode( 10 , INPUT );
pinMode( 9 , OUTPUT );
pinMode(7,OUTPUT);
}

void loop()
{
int Distancia=Distance(9,10);
if (Distancia < 40) {
digitalWrite(7,HIGH);
delay(1000);
}else {
digitalWrite(7,LOW);
delay(1000);
}
}

/*** Function definition ***/
long TP_init(int trigger_pin, int echo_pin)
{
digitalWrite(trigger_pin, LOW);
delayMicroseconds(2);
digitalWrite(trigger_pin, HIGH);
delayMicroseconds(10);
digitalWrite(trigger_pin, LOW);
long microseconds = pulseIn(echo_pin ,HIGH);
return microseconds;
}
long Distance(int trigger_pin, int echo_pin)
{
long microseconds = TP_init(trigger_pin, echo_pin);
long distance;
distance = microseconds/29/2;
if (distance == 0){
distance = 999;
}
return distance;
}

El pin 9 envia el senyal d’ultrasons, mentre que el 10 és el que el rep. Si la distància és menor de 40cm, s’encendrà el LED del pin 7. Si la distància augmenta, el LED s’apaga.

PRÀCTICA AVANÇADA: usa dos LEDS, un de verd i un de vermell. Quan la distància del sensor sigui més petit que 30 cm, s’encengui el vermell i s’apagui el verd. Si la distància és major, que s’encengui el verd i s’apagui el vermell.

ARDUINO: Pràctica 9: Cicle For(). Llums intermitents

Algunes vegades es requereix nomenar molts pins amb una sola instrucció i fer alguna cosa amb cada un. Per exemple, en aquest exemple parpellegen 6 LEDs connectats a Arduino, usant un cicle for () per al cicle d’anada i tornada a través dels pins digitals 2 a 7. Els LEDs s’encenen i apaguen en seqüència, usant les funcions digitalWrite () i delay ().
PRÀCTICA:
Què es necessita?
  • arduino
  • 6 Resistències de 220 ohms
  • 6 LEDs
  • Cables d’interconnexió
  • protoboard
Connectar dels sis LEDs cadascun amb una resistència de 220 en sèrie, als pins 2 a 7 de l’Arduino. Aquí es troba l’esquema.
Enteu a bit bloq i copieu el següent esquema:
En el cicle principal del codi, s’utilitzen dos cicles per recórrer de forma incremental, pas a pas a través dels LEDs, un per un, del pin 2 al pin 7. Quan el pin 7 està encès, el procés s’inverteix, fent que els LEDs es prenguin al contrari de com ja s’havia fet.
El codi és el següent:
void setup()
{
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(7,OUTPUT);
}

void loop()
{
digitalWrite(2,LOW);
digitalWrite(3,LOW);
digitalWrite(4,LOW);
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(7,LOW);

int pins=0;
for (pins = 2; pins <= 7; pins++) {
pinMode(pins,OUTPUT);
digitalWrite(pins,HIGH);
delay(100);
}
for (pins = 7; pins <= 2; pins--) {
pinMode(pins,OUTPUT);
digitalWrite(pins,LOW);
delay(100);
}

}

Proveu de canviar el temps d’espera per veure diferents efectes.

PRÀCTICA AVANÇADA: incorporeu més leds i mireu de fer el mateix efecte.

PRÀCTICA AVANÇADA 2: serieu capaços de fer la seqüència de manera que només estigui un llum encès?

ARDUINO. Pràctica 8: EL sensor CNY70

El dispositiu CNY70 és un sensor òptic infraroig de curt abast (menys de 5 cm) que s’utilitza per detectar colors d’objectes i superfícies. El seu ús més comú és per construir petits robots seguiu la línia. Conté un emissor de radiació infraroja (fotodiode) i un receptor (fototransistor). El fotodíode emet un feix de radiació infraroja, el fototransistor rep aquest feix de llum quan es reflecteix sobre alguna superfície o objecte.
Depenent de la quantitat de llum rebuda pel fototransistor el dispositiu envia un senyal de retorn a Arduino.
El sensor CNY70 pot utilitzar com a entrada digital o analògica. En aquest exemple s’ha utilitzat com a entrada digital per a distingir dos colors: blanc o negre. Quant el sensor està orientat cap a una superfície o objecte de color negre aquest absorbeix gran part de la llum emesa pel díode. Llavors el sensor enviarà un valor alt (HIGH – 1) a Arduino. Al seu torn quan el sensor se situa sobre una superfície o objecte de color blanc gran part de la llum emesa pel díode serà reflectida al fototransistor. Llavors, el sensor enviarà un valor alt (LOW- 0) a Arduino.
El CNY70 té quatre terminals. Per distingir els terminals per tal de poder fer la connexió correctament, has de col·locar el sensor amb la part del fotodíode i del fototransistor cap amunt i els terminals cap avall. A més, la cara del sensor que està serigrafiada amb el nom del dispositiu ha d’estar situada en la teva dreta, tal com es mostra en la següent imatge.
Aquest sensor disposa de 4 terminals, dos d’ells es connecten entre ells per connectar al positiu (cable vermell), un altre al negatiu (cable negre), i un tercer que és que va als pins d’entrada d’arduino (cable blanc de la foto).
Aquests sensors els podeu trobar ja encapsulats amb les connexions preparades.
La pràctica que fareu serà  encendre un LED quan aquest detecti una superfície negra. Entreu a bitbloiq i copieu el següent esquema. Al pin digital 8 hi ha el sensor, i al 5 poseu el LED. Recordeu de posar una resistència en sèrie per a que no es faci malbé.
L’Esquema que heu de fer amb la placa és el següent:
Carregueu el programa, i poseu un paper negre sota el sensor a veure què passa. El LED s’hauria d’encendre
El codi del programa és el següent:
void setup()
{
pinMode( 8 , INPUT);
pinMode(5,OUTPUT);}

void loop()
{ 
int color=digitalRead(8); 
if (color == 0) 
{ 
digitalWrite(5,HIGH); delay(300);
}
}

PRÀCTICA AVANÇADA: usant dos leds i el sensor d’infraroigs, feu que s’engegui un d’ells qua passi la superfície negra, i que s’encengui l’altre quan l’apartis, apagant el primer.

ARDUINO: Pràctica 7: Servomotor controlat per un potenciòmetre

Un servomotor és un motor que es caracteritza per la seva precisió, ja que pot situar-se en qualsevol posició dins d’un rang de gir, normalment de 0º a 180º. No són motors pensats per fer moure un vehicle que recorri certa distància, sinó per moviments de precisió com podria ser el d’un braç robot.

Són tres els cables de què disposa el servomotor, i hem connectar de manera correcta: 
  • Cable vermell: es connectarà a la tensió de 5 V. 
  • Cable negre: es connectarà a terra (0 V).
  • Cable blanc o taronja: es connectarà al pin de control (del 0 al 13).
Per al control dels servomotors Arduino posseeix una llibreria específica. Una llibreria és una col·lecció de funcions que estan especialment creades per facilitar el maneig de certs dispositius, i que no són carregades per defecte a Arduino. Algunes de les llibreries més utilitzades són les de control ús de: servomotors, motors pas a pas, pantalles de cristall líquid, matriu de LEDs, memòries SD, sensor d’ultrasò …
Amb el muntatge de sota, farem el control d’un servomotor usant un potenciòmetre. Aquest té el terminal del mig connectat a la sortida analògica A0, mentre que el servo està connectat a pin 9 digital. EL codi per l’Arduino el teniu a sota. Aneu movent el potenciòmetre per veure els diferents efectes sobre el servomotor. Munteu el següent circuit:

Entreu a bitbloq i copieu els següents blocs:

Aneu girant el potenciòmetre i veureu que el servo es va movent segons el valor pres a la variable mando.
La funció mapear serveix per fer proporcionals els 1023 valors de les entrades analògiques als 180º que gira el servo, de manera que quan el potenciòmetre valgui 0, l’angle serà 0, i quan valgui 1023, el servo girarà 180º.

PRÀCTICA AVANÇADA: Serieu capaços de controlar 2 servos amb 2 potenciòmetres?

ARDUINO: Pràctica 6: LED d’intensitat aleatòria

En moltes ocasions és molt útil utilitzar nombres aleatoris, seleccionats a l’atzar. Comportaments inesperats, sort, espontaneïtat, … són fruit d’usar nombres aleatoris. Vegem com treballar-los amb Arduino:
Abans de res, hem de configurar en el setup que Arduino comenci a generar nombres aleatoris, utilitzant l’ordre randomSeed ():
  • void setup() { randomSeed(0); }: genera un numero aleatori
  • randomSeed(analogRead(A5)): l’entrada analògica A5 agafa un valor analògic
Com a pràctica, simularem un LED com si es tractés d’una espelma, variant la intensitat de llum i la durada amb nombres aleatoris. Munteu el mateix circuit que amb la pràctica del blink, un LED connectat al pin 9.
Obriu bitbloq i podeu els següents blocs:
El codi queda de la següent manera:


void setup()
{
pinMode(9,OUTPUT);
}
void loop()
{
int brillo=random(100,256);
analogWrite(9,brillo);
int tiempo=random(50,151);
delay(tiempo);
}

  • int brillo; int tiempo: es defineixen dues variables,

  • pinMode(9,OUTPUT): el pin 9 té un led com a sortida (OUTPUT)

  • brillo=random(100,256): la intensitat agafa un valor aleatori entre 100 i 256

  • analogWrite(9,brillo): el led del pin 9 usa el valor brillo aleatori

  • tiempo=random(50,151): el temps de durada agafa valors aleatoris entre 50 i 151


ARDUINO: Pràctica 5: El potenciòmetre com entrada analògica

El potenciòmetre és un altre sensor d’entrada molt usat. Consta d’una resistència variable, que dependrà de la posició de gir en què es trobi la seva consola (o mànec). És molt important connectar el potenciòmetre de manera correcta per evitar que aquest es faci malbé (en cas de deixar passar tot el corrent per una secció del potenciòmetre de molt baixa resistència). Un potenciòmetre té tres potes:

La connexió amb arduino es fa a través del les entrades analògiques de la forma que es veu a continuació:


Per veure com funciona, farem una pràctica: encendrem 5 LEDs a través d’un potenciòmetre. Munteu el següent circuit amb la placa i l’arduino:

Obriu bitbloq, i poseu els següents blocs:



El codi del programa és el següent:
void setup()
{
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop()
{
int val=analogRead(A0);
if ((val >= 0) && (val < 204)) {
digitalWrite(5,HIGH);
digitalWrite(6,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
}
if ((val >= 204) && (val < 408)) {
digitalWrite(5,LOW);
digitalWrite(6,HIGH);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
}
if ((val >= 408) && (val < 612)) {
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(9,HIGH);
digitalWrite(10,LOW);
digitalWrite(11,LOW);
}
if ((val >= 612) && (val < 816)) {
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(9,LOW);
digitalWrite(10,HIGH);
digitalWrite(11,LOW);
}
if ((val >= 816) && (val < 816)) {
digitalWrite(5,LOW);
digitalWrite(6,LOW);
digitalWrite(9,LOW);
digitalWrite(10,LOW);
digitalWrite(11,HIGH);
}

}
Mirem el programa.

  • val=analogRead(A0): El potènciometre està conenctat al pin A0.

  • if(val>=204 && val<408 b="">: el potenciòmetre pot agafar valors d'entre 0 i 1023. Com hi ha 5 LEDs, es divideix per 5 els valors de manera que segons el valor que tingui el potenciòmetre, se n'encendra 1, en aquest cas s'encendrà només el led1.