Tecnologia vestible

Per començar Elements d'entrada Programació CircuitPython   Recursos CITCEA
Elements no electrònics Elements de sortida Programació Arduino    
Projectes Elements de control Dades pràctiques   Inici

Sensor d'acceleració i camp magnètic

El sensor d'acceleració i camp magnètic LSM303 ens permet conèixer el camp magnètic i, per tant, actuar com a brúixola així com l'acceleració i determinar la verticalitat. Té un diàmetre de menys de 17 mm (com una moneda de dos cèntims) i un gruix inferior als 2 mm. Això facilita el seu us incorporant-los a elements tèxtils.

Avís: En el moment d'escriure aquesta pàgina no es podien compilar les biblioteques d'aquest sensor en les plaques Gemma.

Aquest sensor es connecta amb la placa del microcontrolador fent servir una comunicació i2c que ens permet transferir la informació fent servir només dos fils (més els dos d'alimentació). Cada placa de microcontrolador només pot tenir connectat un sensor LSM303 però sí admet altres elements i2c coexistint amb ell. Per això, la placa del sensor té duplicades les connexions i2c de manera que sigui fàcil encadenar els dispositius.

LSM303

A la placa hi ha representades unes fletxes que ens indiquen quines són les direccions X i Y considerades. La direcció Z és perpendicular a la placa.

Per fer servir aquest sensor cal connectar el born 3V (inferior a la foto) al born 3,3 V de la placa del microcontrolador (ATENCIÓ: No al born VBATT), el born gnd (superior a la foto) al negatiu de l'alimentació i els borns SDA i SCL amb els del mateix nom de la placa del microcontrolador. A la placa del sensor aquests dos borns hi apareixen dos cops de manera que podem triar la disposició que ens sigui més còmoda.

Per fer servir el sensor ens caldrà la Adafruit_LSM303 library i també la Adafruit Unified Sensor Driver. Si és necessari, podeu consultar la instal·lació de biblioteques.

Un cop ja tinguem les biblioteques, podem fer els nostres programes. A la part inicial, hem de carregar les biblioteques connesponents.

#include <Wire.h>  // Conté les funcions per a la comunicació i2c
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303.h>  // Permet interactuar amb el sensor d'acceleració i camp magnètic

A la part de declaració de variables, hem de crear un objecte Adafruit_LSM303.

Adafruit_LSM303 lsm;

En la inicialització del programa, cal inicialitzar el sensor. D'aquesta manera el nostre microcontrolador hi estableix connexió i convé preveure que la connexió no sigui possible.

	if (!lsm.begin()){
		Serial.println("Revisa la connexió amb el sensor!");
		while (1);
	}

En el programa cal llegir el sensor.

	lsm.read();

Un cop feta la lectura, tenim els resultats a les següents variables:

Acceleració (m/s2)                     Camp magnètic (μT)
Component Variable                     Component Variable
Coordenada X lsm.accelData.x Coordenada X lsm.magData.x
Coordenada Y lsm.accelData.y Coordenada Y lsm.magData.y
Coordenada Z lsm.accelData.z Coordenada Z lsm.magData.z

A continuació hi ha un programa de prova. En aquest cas, obrim també un canal sèrie que ens permeti veure si la connexió ha anat bé i les lectures del sensor al monitor sèrie.

El nostre programa de prova llegirà els valors del sensor i els mostrarà.

#include <Wire.h>  // Conté les funcions per a la comunicació i2c
#include <Adafruit_Sensor.h>
#include <Adafruit_LSM303.h>  // Permet interactuar amb el sensor d'acceleració i camp magnètic
Adafruit_LSM303 lsm;
void setup() {
	Serial.begin(9600);
	// Inicialitza el sensor
	// Si falla, mostra un misatge al monitor sèrie i es bloqueja el programa
	if (!lsm.begin()){
		Serial.println("Revisa la connexió amb el sensor!");
		while (1);
	}
}
void loop() {
	float pi = 3.1415927;
	lsm.read();
	float angle = (atan2(lsm.magData.y, lsm.magData.x) * 180)/pi;
	Serial.print("Accel X: ");
	Serial.print(lsm.accelData.x);
	Serial.print("  ");
	Serial.print("Y: ");
	Serial.print(lsm.accelData.y);
	Serial.print("  ");
	Serial.print("Z: ");
	Serial.print(lsm.accelData.z);
	Serial.print("  ");
	Serial.println("m/s^2 ");
	Serial.print("Magn X: ");
	Serial.print(lsm.magData.x);
	Serial.print("  ");
	Serial.print("Y: ");
	Serial.print(lsm.magData.y);
	Serial.print("  ");
	Serial.print("Z: ");
	Serial.print(lsm.magData.z);
	Serial.print("  ");
	Serial.println("uT");
	Serial.print("Angle en graus: ");
	Serial.println(angle);
	delay(1000);
}

Si volem treballar en CircuitPython ens caldrà descarregar la biblioteca del sensor. Anirem a aquesta pàgina i picarem al botó Clone or download, baixarem el fitxer zip i l'obrirem. La biblioteca és el fitxer adafruit_lsm303.py que ens copiarem al directori lib de la placa. En aquest directori també hi haurem de tenir la biblioteca adafruit_bus_device.

El següent programa en CircuitPython també ens permet llegir el sensor:

import time
import board
import busio
import adafruit_lsm303
i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_lsm303.LSM303(i2c)
while True:
    mag_x, mag_y, mag_z = sensor.magnetometer
    accel_x, accel_y, accel_z = sensor.accelerometer
    print("")
    print("Mag:    X = ", mag_x, "    Y = ", mag_y, "    Z = ", mag_z)
    print("Accel:  X = ", accel_x, "    Y = ", accel_y, "    Z = ", accel_z)
    time.sleep(1.0)

Per calcular l'angle hem de tenir present que la tangent de l'angle és igual a Y dividit per X. Però si fem la funció arctangent de Y dividit per X tindrem un problema ja que perdem informació. Per exemple, les tangents de 30° i 210° són totes dues 0,577 i, per tant, sabent la tangent no podem saber l'angle de forma segura ja que hi ha més d'una resposta. Per això fem servir la funció atan2 que rep els dos valors (X i Y) i els fa servir conjuntament per determinar l'angle correcte.

Per provar el programa és recomanable posar la placa del sensor horitzontal i amb la fletxa X apuntant aproximadament cap al nord. A la pantalla del monitor sèrie podrem veure les lectures del sensor que són el camp magnètic en microtesla (μT) multiplicat per 10 i l'acceleració en metres per segon al quadrat (m/s2) multiplicada per 100. També veure el valor de l'angle del nord.

Observeu el valor de l'angle i gireu la placa fins aconseguir un angle proper a zero. Si l'angle és negatiu heu de girar la placa en el sentit de les agulles del rellotge; si es positiu, en sentit contrari.

Hauríeu de tenir un valor d'acceleració a l'eix Z similar a 9,81 (l'acceleració de la gravetat és, aproximadament, de 9,81 m/s2) i valors molt més petits en els altres dos eixos.

Pel que fa al camp magnètic, a l'eix X hauríeu de veure un valor entre 25 i 65 (el camp magnètic terrestre sol estar entre 25 i 65 μT) i un valor molt petit a l'eix Y (si realment el sensor apunta l'eix X cap al nord).

En un sistema estàtic (que no es desplaça significativament), el sensor d'acceleració ens pot servir per saber la verticalitat. És el que fan servir les càmeres fotogràfiques i els telèfons per saber si estan en vertical o en horitzontal. En sistemes en moviment, ens pot servir per saber si el sistema s'accelera (augmenta de velocitat) o es frena i en quina direcció. Atès que la majoria de les persones no estem acostumades al concepte d'acceleració, caldrà fer proves a l'hora de fer servir el sensor en aquesta aplicació.

El camp magnètic que rep el sensor es pot veure molt influït per la proximitat de metalls o d'elements elèctrics (motors, cables, transformadors, etc.) o electrònics (carregadors, alimentadors, telèfons, etc.). Per això no sol ser recomanable intentar tenir en compte els valors del camp magnètic. Sí ens pot servir per saber cap on està el nord. Si existeix la possibilitat que la placa del sensor no estigui horitzontal, és convenient fer servir la indicació del sensor d'acceleració per saber com està la placa i després agafar els eixos corresponents per determinar cap a on està el nord.

En aquesta pàgina podeu trobar més informació sobre el sensor.

 

 

 

En aquest web, les fotografies marcades amb [AF] són del web d'Adafruit, les marcades amb [SF] del web d'Sparkfun i les marcades amb [AU] del web d'Arduino.

 

 

 

 

 

 

 

 

 

 

Llicència de Creative Commons
Aquesta obra d'Oriol Boix està llicenciada sota una llicència no importada Reconeixement-NoComercial-SenseObraDerivada 3.0.