Tornem a l’Arduino amb un plantejament diferent al que he tingut fis ara on l’important era aconseguir el valor de les diferents magnituds que mesuraven, com la pressió, la temperatura o el camp magnètic. Ara el que m’interessa és la mesura del temps entre esdeveniments, per exemple quan triga en passar una bola entre dos punts de la seva trajectòria, el que farà que el codi dels projectes tingui un altre aire.
Es tracta d’experiments en els que es mesura el temps de pas d’objectes en moviment gràcies a fotocèl·lules i (fotoportes, barreres de llum) controlades per Arduino. Les fotoportes normalment estaran constituïdes per un diode infraroig i un fototransistor infraroig (també podria ser per un diode visible i un fototransistor visible) o bé per una fotoresistència i una llanterna o un led blanc.
- La barrera de llum
- Temps de pas d’un mòbil entre dos punts
- Temps que triga un objecte en passar per una barrera de llum
- Temps entre talls d’una barrera de llum
La barrera de llum
La barrera de llum més típica està constituïda per un element que fa llum i un sensor que és capaç de veure-la. L’element que fa llum pot ser un led i el sensor un fotodíode, un fototransistor o una fotoresistència, i la llum amb la que es comuniquin pot ser tant visible com infraroja (IR).
Les característiques d’aquests components i les seves diferències les podeu mirar en aquesta pàgina web de l’empresa valenciana Solectro. En el bloc de Solectro també podeu trobar una gran quantitat de tutorials sobre Arduino i similars.
Es podria comprar un sistema de barreres en el mercat i oblidar-nos de tot el que ve a continuació, però no gaudiríem tant 😉 .


En tot cas nosaltres muntarem les fotoportes utilitzant prioritàriament la parella composada per un led transparent (emissor) i un fototransistor (receptor) de dues potes només (col·lector i emissor) de color negre que treballen tots dos a l’infraroig (940 nm). L’escollir preferentment l’IR és perquè així s’eviten interferències de les llums visibles de l’ambient.
S’han de col·locar els dos elements enfrontats de manera que la llum del led arribi directament al fototransistor ja que el seu angle de visió és d’uns 30º, i s’ha de deixar un espai entre ells per a que puguin passar els objectes dels que estudiem el moviment.

El fototransistor és un transistor i n’hi ha de tres potes, és a dir, també amb la pota base, però aquí no cal ja que la base està al caputxó i controlada per la llum que rep.
Aquests elements infrarojos són d’ús general i poden tenir un diàmetre de 3 o de 5 mm. Funcionen igual, així que compreu els que més us agradin. Són molt barats i es poden fer servir en molts projectes d’Arduino com ara sensors de moviment o de proximitat, robots, carros de seguiment de línies, comandaments a distància, etc.


També podríem comprar i utilitzar un mòdul ja muntat amb els dos elements junts, un al costat de l’altre, i que funciona per reflexió de la llum IR al reflectir-se a l’objecte que passa pel davant. El cos que es mou ha de passar a menys de 10 cm del sensor. Aquest mòdul també és prou barat.
Temps de pas d’un mòbil entre dos punts
La mesura del temps de pas d’un objecte (una bola, un cotxet, etc) entre dos punts pot servir per estudiar el seu moviment. Per exemple es pot estudiar el moviment uniformement accelerat d’una bola que cau per un pla inclinat, el moviment uniforme de la mateixa bola rodant pel damunt d’una taula, la caiguda lliure d’un cos, etc.
Deixant anar la bola sempre de la mateixa manera es mesura diverses vegades el temps que triga en recórrer diferents distancies, a partir sempre del mateix punt. Es pot obtenir així una taula de temps i posicions que es pot graficar i obtenir l’equació del moviment amb més precisió que si el temps es mesura amb el cronòmetre del telèfon mòbil, com per exemple fan amb fotoportes comercials Jordi Solbes, de la Universitat de València, i Francisco Tarin, de l‘IES L’Om de Picassent, a l’article ¿Qué hacemos si no coinciden la teoría y el experimento? (o los obstáculos de la realidad) del número 52 de la revista Alambique Didáctica de las Ciencias Experimentales.

Es necessiten dues barreres infraroges per detectar el pas de la bola per dos punts de la seva trajectòria. Cadascuna de les fotoportes les muntaren segons l’esquema de sota, que serà igual per tots els casos de barreres amb fototransistors de les que tractarem en aquesta entrada. L’esquema està copiat de la web Física i Arduino, a la que me referiré més vegades en aquesta entrada.

El muntatge és relativament senzill i consta del led i el fototransistor infraroig i de dues resistències de 220 Ω i 10 KΩ. La pota llarga del led (transparent) ha d’unir-se a la resistència de 220 Ω i la pota curta del fototransistor (negre) ha d’unir-se a la resistència de 10 KΩ.
Després s’han d’unir els extrems lliures de les dues resistències i connectar-les a les sortides de 5 V de la placa Arduino o ESP32. També s’han d’unir la pota curta del led i la llarga del fototransistor i connectar-les a terra (GND). Per últim, per indicar al microprocessador si el fototransistor està il·luminat, o no, s’ha de connectar la unió entre el fototransistor i la seva resistència al pin que s’indiqui en el codi de cada projecte; en el cas de la fotografia de sota al pin digital 26 del ESP32 (Wemos D1 R32).
Els pins a que es connecta el col·lector del fototransistor són digitals ja que el que aquí ens interessa no és mesurar el voltatge d’aquesta pota per saber si el transistor està més o menys il·luminat, sinó si al col·lector hi ha voltatge(HIGH), o no (LOW).

Les unions poden fer-se amb cables amb pinces de cocodril, cargolant les potes i els cables o millor soldant-les. Com he comentat abans, al realitzar el muntatge final convé ubicar ben enfrontats cada LED amb el seu transistor, de manera que la llum emesa pel primer arribi directa al segon.
El dibuix de sota és un exemple de muntatge de la barrera infraroja en un Arduino UNO. El col·lector del transistor està connectat al pin digital 12 d’Arduino. Quan el feix de llum és interromput, el fototransistor impedeix el pas de corrent pel col·lector i el microprocessador ho interpreta com un pols baix (LOW). En cas contrari és un pols alt (HIGH).

Per repassar com es fa per utilitzar les plaques Arduino i Wemos D1 R32 podeu mirar les entrades Mesura de distàncies en Física amb Arduino i el sensor d’ultrasons i Mesura de distàncies en Física amb una placa amb esp32, respectivament.
En tots els projectes d’aquesta entrada els valors dels temps mesurats s’envien a l’ordinador pel port sèrie per a la seva lectura ja que són poques les dades que s’obtenen i els experiments es fan sobre la taula del laboratori, així que no és necessari que els microprocessadors siguin autònoms i enviïn les dades per bluetooth. Per això no cal que la placa sigui un ESP32 amb bluetooth i n’hi ha prou amb un Arduino UNO, i més tenint en consideració que tots els codis aquí proposats van bé amb l’Arduino i els dos últims no funcionen en el Wemos.
Codi per mesurar el temps entre dues barreres
El codi que he obtingut d’anon90500195 en el fòrum d’Arduino no necessita cap llibreria. El que fa és mirar si en els pins corresponents a les entrades dels col·lectors dels fototransistors hi ha corrent, o no. Si no hi ha corrent (LOW) mesura el temps que ha passat (t1 = micros();). Si el sensor està connectat a 5 V, Arduino considera HIGH si hi ha més de 3 V, i 2 V si està connectat a 3,3 V. Considera LOW si els valors són menors.
El codi de sota serveix tant per l’Arduino UNO com pel Wemos D1 R32 (ESP32) i el podeu copiar o baixar-vos l’arxiu sketch_tiempo_dos_barreras.
/*
Tiempo en pasar entre dos barreras de luz
Modificado de anon90500195
https://forum.arduino.cc/t/medir-velocidad-entre-2-sensores-infrarrojos/932628/6
Con las conexiones de los sensores según
http://fisicayarduino.robotica.ar/periodo-de-un-pendulo/
*/
int sensor1 = 12; //se define el fototransistor 1 en el pin 12
int sensor2 = 13; //se define el fototransistor 2 en el pin 13
unsigned long t1 = 0; //se define el tiempo al pasar por el primer sensor
//y se le asigna de entrada el valor 0
unsigned long t2 = 0; //tiempo al pasar por el segundo sensor
unsigned long t12 = 0;
void setup() {
Serial.begin(9600);
pinMode(sensor1,INPUT); //se define el sensor1 como de entrada
pinMode(sensor2,INPUT);
}
void loop() {
while(digitalRead(sensor1) == LOW); // espera que pase por el 1er sensor. Dejará de recibir luz infrarroja
t1 = micros(); // guarda el tiempo en useg (microsegundos)
while(digitalRead(sensor2) == LOW); // espera hasta que pase por el 2do sensor
t2 = micros();
//envia por el puerto serie los valores de t1, t2 y t12
Serial.print("\nT1: ");
Serial.print(t1);
Serial.print("\nT2: ");
Serial.print(t2);
t12 = t2 - t1;
Serial.print("\nTiempo total: ");
Serial.print(t12);
Serial.print(" useg");
}
Temps que triga un objecte en passar per una barrera de llum

Només amb una fotoporta es poden realitzar diversos experiments. Per exemple es pot mesurar la velocitat a la que passa una bola o un cotxet pel punt en el que està el sensor. Si és una bola que es mou per una taula i cau, es pot predir la distància a la que tocarà al terra.
Si és una tanca amb franges transparents i opaques es pot deixar caure, com la de cartró en la foto del costat i obtenir el temps de pas de cada franja, el que permet estudiar el seu moviment i calcular l’acceleració de la gravetat, com proposaven Aparicio i Lozano utilitzant Multilog en Moviment de caiguda d’un regle (alumnat, professorat).

En la foto de dalt es fa passar la tanca per una barrera de fusta en la que els sensors estan encastats en uns forats fets amb un trepant, i així queden fixos.
Deixant caure lliurement la tanca de cartró a través de la barrera de llum, i utilitzant una placa ESP32 amb el codi que indico més a baix he obtingut el valors de sota. Considerant que la tanca talla i deixa passar la llum a 0, 6, 11, 17, 22 i 28 cm es pot dibuixar la gràfica posició/temps i obtenir l’equació de la línia de tendència.

L’equació mostra una acceleració de caiguda de a = 2×4,776 = 9,55 m/s2, el que és un valor molt acceptable per a l’acceleració de la gravetat.
Codi per mesurar el temps de pas en una barrera
El codi del projecte és una modificació del de la mesura del temps de pas entre dues barreres de llum i el que fa és que quan la barrera canvia d’un estat a un altre (per exemple, de HIGH a LOW) apunta el temps i torna a apuntar-lo amb la transició contraria. Aquest codi serveix tant per l’Arduino UNO com pel Wemos D1 R32 (ESP32). Podeu copiar el codi de sota o baixar-vos sketch_tiempo_pasando_barrera.
/*
Tiempo en pasar un objeto por una barrera
Modificado de anon90500195
https://forum.arduino.cc/t/medir-velocidad-entre-2-sensores-infrarrojos/932628/6
Con las conexiones de los sensores según
http://fisicayarduino.robotica.ar/periodo-de-un-pendulo/
*/
int sensor1 = 12;
unsigned long t1 = 0;
unsigned long t2 = 0;
unsigned long t12 = 0;
void setup() {
Serial.begin(9600);
pinMode(sensor1,INPUT);
}
void loop() {
while(digitalRead(sensor1) == LOW); // espera que pase por el 1er sensor. Dejará de recibir luz infrarroja
t1 = micros(); // guarda el tiempo en useg
while(digitalRead(sensor1) == HIGH); // espera hasta que termina de pasar el objeto. Vuelve a recibir luz infrarroja
t2 = micros();
Serial.print("\nT1: ");
Serial.print(t1);
Serial.print("\nT2: ");
Serial.print(t2);
t12 = t2 - t1;
Serial.print("\nTiempo total: ");
Serial.print(t12);
Serial.print(" useg");
}
Temps entre talls d’una barrera de llum
Amb una única fotoporta també es pot mesurar el temps d’oscillació d’un pèndol o una molla o de gir d’una roda.
Pel cas del període d’oscil·lació d’un pèndol, Alejandro de Física i Arduino ha fet una entrada en la seva web en la que explica com connectar els components d’una barrera de llum i proposa un codi per mesurar el període amb Arduino.
La idea és que per aconseguir un període bé el fil o bé la bola del pèndol han de passar dues vegades per la fotoporta, així que el programa suma el temps d’anada i de tornada, i el dona en mil·lisegons.
Codi període d’oscil·lació d’un pèndol
Podeu copiar l’Sketch de Arduino de sota o baixar-vos l’arxiu Sketch_Periodo_Pendulo. La pena és que aquest codi funciona bé amb Arduino UNO, però no ho fa amb un ESP32 i no he aconseguit saber a què es deu.
/*
Registrar el período de oscilación de un péndulo
Esquema conexiones y código de
http://fisicayarduino.robotica.ar/periodo-de-un-pendulo/
*/
unsigned long startTime; //variable siempre positiva para tiempo
unsigned long actualTime;
unsigned long period1;
unsigned long period2;
boolean firstPass; //variable boleana: 0 o 1
void setup() {
Serial.begin(9600);
// pullup para evitar poner una resistencia externa
pinMode(12,INPUT_PULLUP);
// comenzamos a tomar el tiempo en milisegundos
startTime = millis();
}
void loop() {
// registramos los milisegundos
actualTime = millis();
// si se interrumpe la barrera
if(pulseIn(12,HIGH)) {
// si pasa por primera vez
if(firstPass) {
// guardamos la primera mitad del periodo
period1 = actualTime - startTime;
firstPass = false;
} else {
// guardamos la segunda mitad del periodo
period2 = actualTime - startTime;
// enviamos la suma por el puerto serie
Serial.println(period1 + period2);
firstPass = true;
}
// reseteamos la variable temporal de comienzo
startTime = actualTime;
}
}
Codi passos successius pel mateix punt
Si no és un pèndol el que es mou sinó una roda i volem mesurar el temps de gir, interessa que l’arduino ens vagi proporcionant el temps de pas dels seus radis per un punt, per exemple. En aquest cas podem utilitzar una modificació del codi anterior per a mesurar el període del pèndol. Us el podeu baixar de sketch_tiempo_dospasosbarrera, o copiar el codi de sota. Com en el cas anterior, aquest codi funciona bé amb Arduino UNO, però no ho fa amb un ESP32.
/*
Registrar el tiempo del paso sucesivo de un objeto (por ejemplo, un péndulo) por un punto
Esquema conexiones y código modificado de
http://fisicayarduino.robotica.ar/periodo-de-un-pendulo/
*/
unsigned long startTime; //variable siempre positiva para tiempo
unsigned long actualTime;
unsigned long tiempodospasos;
void setup() {
Serial.begin(9600);
// pullup para evitar poner una resistencia externa
pinMode(12,INPUT_PULLUP);
// comenzamos a tomar el tiempo en microsegundos
//startTime = micros();
// comenzamos a tomar el tiempo en milisegundos
startTime = millis();
}
void loop() {
// registramos los microsegundos
//actualTime = micros();
// registramos los milisegundos
actualTime = millis();
// si se interrumpe la barrera
if(pulseIn(12,HIGH)) {
// si pasa por la barrera
tiempodospasos = actualTime - startTime;
// enviamos el valor por el puerto serie
Serial.println(tiempodospasos);
}
}