42
Curso Arduino teórico Practico - Intermedio ACELEROMETRO, BLUETOOTH Y ARDUINO CONTROL COCHE ROBOT

Curso Arduino Teórico Practico -Acelerometro

Embed Size (px)

DESCRIPTION

Uso y programación del acelerometro

Citation preview

Curso Arduino terico Practico - Intermedio

Curso Arduino terico Practico - IntermedioACELEROMETRO, BLUETOOTH Y ARDUINOCONTROL COCHE ROBOTndiceIntroduccin.AcelermetroComunicacin I2CAcelermetro ADXL345Configuracin Acelermetro.Registros del acelermetro.Configuracin por ArduinoArduino Acelermetro.Programacin en Arduino.Recepcin y salida de datos del acelermetro por Arduino.Ejemplo de Aplicacin (Control Coche)Envi de datos por bluetooh.Recepcin de datos por bluetooth.Control de motores.

AcelermetroLos acelermetros son dispositivos electromecnicos que detectan las fuerzas de aceleracin, ya sea esttica o dinmica. Las fuerzas estticas incluyen la gravedad, mientras que las fuerzas dinmicas pueden incluir vibraciones y movimiento.

Comunicacin I2CElbus I2C, un estndar que facilita la comunicacin entre microcontroladores, memorias y otros dispositivos con cierto nivel de "inteligencia", slo requiere de dos lneas de seal y un comn o masa.

Comunicacin I2C

Acelermetro ADXL345Elacelermetro ADXL345de Analog Devices es un dispositivo pensado para aplicaciones mviles. Dispone de sensibilidad ajustableen y una resolucin de 16 bits. Se puede conectar fcilmente a travs de su interfaz SPI (3 o 4 hilos) e I2Chttps://www.sparkfun.com/datasheets/Sensors/Accelerometer/ADXL345.pdf

Configuracin Acelermetro.Antes de la configuracin del acelermetro en la comunicacin I2C, se puede apreciar en el Datasheets pagina 10 que el acelermetro ADXL345 tiene la siguiente direccin.

I2C Connection Diagram (Address 0x53)

Registros de acelermetro ADXL345 El acceso a los registros y la escrituras sobre ellos nos permites configurar el acelermetro, como su velocidad, su sensibilidad, entre otros como tambin acceder a los datos delos Ejes X - Y - Z.Ejemplo: En el registro POWER _CTL 0x2D, habilitando el bit D3(Measure). Configuramos a que el acelermetro este en modo medicin.Datasheets pagina 16.

Registros de acelermetro ADXL345 En el registro FIFO_CTL 0x38: enviando 0x84 o 0B10000100, significa FIFO puede retener los ltimos 32 datos. Cundo FIFO sobrepasa los 4 datos, los datos ms antiguos se sobrescribe con los datos ms recientes.Datasheet pagina18.

Registros de acelermetro ADXL345 El registro DATA_FORMAT 0x31, donde configuramos la sensibilidad del acelermetro, dejando este registro a 0 o sin configurar, el acelermetro se configura a una resolucin de 10 Bits con una sensibilidad de 2g.Datasheet pagina 17.

Registros de acelermetro ADXL345 Del Registro 0x32 al Registro 0x37DATAX0, DATAX1,DATAY0, DATAY1, DATAZ0, DATAZ1 (Solamente lectura) .Estos registros son para la lectura de los datos que enva el acelermetro.

Configuracin con ArduinoAntes de la Configuracin con el Arduino repacemos la direccin del acelermetro y la utilizacin de la librera de comunicacin I2C del Arduino.

#define ACELEROMETRO 0x53 //direccin de comunicacin.#include //Libreria se comunicacion I2C

NOTA: Verificar para diferentes placas de Arduino que pines maneja comunicacin I2C Arduino UNO TWI: A4 or SDA pin and A5 or SCL pinConfiguracin con Arduino void setupAccel(int device) { // configuracin del acelermetro Wire.beginTransmission(device); // iniciado la comunicacin I2C del dispositivo Wire.write(0x00); // registro de ID del dispositivo Wire.endTransmission(); // finaliza la trasmisin Wire.requestFrom(device,1); // peticin de 1 bytes recibido while (!Wire.available()); // mientras se dejo de transmitir byte ch=Wire.read(); // lectura del byte recibido Serial.print("El ID del acelermetro es 0x"); Serial.println(ch,HEX); // muestra en ID del dispositivo // Registro DATA_FORMAT defecto a 0, resolucin de 10 bits con 2g de sensibilidad Wire.beginTransmission(device); // inicia comunicacin de comandos Wire.write(0x2d); Wire.write(0x08); // registro POWER_TCL(Lectura/Escritura) Control del potencia, a modo medicin Wire.endTransmission(); // fin transmisin Wire.beginTransmission(device); // abriendo comunicacin I2C Wire.write(0x38); Wire.write(0x84); // registro FIFO (buffer de almacenamiento temporal) , buffer a 32 datos con actualizacin cada 4 datos Wire.endTransmission(); // finaliza la trasmisin}Recepcin de datosCreamos una Unin y Estructura en la cual almacenaremos los datos recibido por el acelermetro.

union XYZBuffer { // creado una unin y estructura para el // almacenamiento de datos struct { short x,y,z; } value; byte buff[6];};Recepcin de datosCreamos La funcin de inicio de la lectura del acelermetro.

void readAccel(int device,union XYZBuffer *xyz) { //iniciando lectura del // acelermetro Wire.beginTransmission(device); //abrimos la transmisin Wire.write(0x32); // Inicio del registro para la lectura de datos x, y, z Wire.endTransmission(); //cerramos la transmisin readXYZ(device,xyz);}Recepcin de datosCreamos La funcin de lectura y almacenamiento del acelermetro.

void readXYZ(int device,union XYZBuffer *xyz) { Wire.requestFrom(device, 6); long start=millis(); while (!Wire.available() && (millis()-start) 255) dataY = 255; if(dataY < -255) dataY = -255; //limitando dato recibido //algoritmo para el control del robot ver la siguiente diapositiva if(dataY > abs(dataX)) mov_avanzar(dataY); else if(abs(dataY)>abs(dataX) )mov_retro(abs(dataY)); else if(dataX > abs(dataY) )mov_derecha(dataX); else if(abs(dataX) > abs(dataY) )mov_izquierda(abs(dataX)); else mov_stop(); }Algoritmo de control de motores

if(dataY > abs(dataX)) mov_avanzar(dataY); else if(abs(dataY)>abs(dataX) )mov_retro(abs(dataY)); else if(dataX > abs(dataY) )mov_derecha(dataX); else if(abs(dataX) > abs(dataY) )mov_izquierda(abs(dataX)); else mov_stop(); Algoritmo de decodificacin BluetoothComo toda comunicacin serial los paquetes son recibido de un byte en un byte.Al transmisor bluetooh del acelermetro no enva x[byte][[byte]y[[byte][[byte]. Un ejemplo seria: X122y58Tenemos que decodificarlo para obtener el valor de X e Y. Para nuestro ejemplo X = 122 e Y =58.

Algoritmo de decodificacin BluetoothPara ver si estamos recibido dato del puerto receptor serial seria.void loop(){ if(mySerial.available()) { charvar = mySerial.read(); //tomamos el byte recibido decodeAccel(); // lo enviamos al decoder del acelermetro } }Algoritmo de decodificacin BluetoothVeamos por ultimo el Algoritmo de decodificacin.. decodeAccel(); Que cuenta con dos casos tanto para separar el dato de X del dato de Y que a la final son enviados a controlMotor().

if(charvar == 'x' || bX == true) { switch(charvar){ case 'x': bX = true; break; case 'y': bX = false; dataX = data.toInt();data = ""; break; default: data.concat(charvar); break; }

if(charvar == 'y' || bY == true) { switch(charvar){ case 'y': bY = true; break; case 'x': bY = false; dataY = data.toInt();data = ""; controlMotor(); break; default: data.concat(charvar); break; } Prueba Coche controlado por acelermetro