You are on page 1of 42

Curso Arduino

terico Practico Intermedio


ACELEROMETRO, BLUETOOTH Y ARDUINO
CONTROL COCHE ROBOT

ndice
Introduccin.
Acelermetro
Comunicacin I2C
Acelermetro ADXL345
Configuracin Acelermetro.
Registros del acelermetro.
Configuracin por Arduino
Arduino 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.

Acelermetro
Los 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 I2C
Elbus 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 ADXL345
Elacelermetro 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 I2C
https://www.sparkfun.com/datasheets/Sen
sors/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 0x37
DATAX0, DATAX1,DATAY0, DATAY1,
DATAZ0, DATAZ1 (Solamente lectura) .
Estos registros son para la lectura de los
datos que enva el acelermetro.

Configuracin con Arduino


Antes 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 <Wire.h> //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 pin

Configuracin 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 datos
Creamos 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 datos
Creamos 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

Recepcin de datos
Creamos 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)<100);
if (millis()-start<100) {
for (int i=0;i<6;i++)
xyz->buff[i]=Wire.read(); // almacenamiento de los 6
bytes
}
}

Salida de datos
Funcin para poder apreciar los datos recibidos
por el acelermetro.
void output(XYZBuffer xyz) {
Serial.print("x= ");
Serial.print(xyz.value.x);Serial.print(", ");
Serial.print("y= ");
Serial.print(xyz.value.y);Serial.print(", ");
Serial.print("z= ");
Serial.print(xyz.value.z);Serial.println();
}

Arduino Acelermetro.
Una vez creado y programado las
funciones de configuracin , recepcin,
almacenamiento y salida de datos, es hora
de usar y probar nuestras funciones.

Programacin en Arduino
//Iniciamos declarando nuestra funcin principal de configuracin
#include <Wire.h> //Librera se comunicacin I2C
#define ACELEROMETRO 0x53 //direccin del ADXLX345
void setup(){
Serial.begin(9600); // Para ver los datos mediante le monitor Serial
Wire.begin();

// configura la comunicacin I2C

setupAccel(ACELEROMETRO); // configuracin del Acelermetro


}

Programacin en Arduino
//programa principal
void loop(){
union XYZBuffer acelerometro; // creamos nueva variable unin
readAccel(ACELEROMETRO,&acelerometro); // lectura acelermetro
output(acelerometro); // muestra el dato recibido por el monitor
Serial
}

Programacin en Arduino (pruebas)

Carro Controlado por Acelermetro

Carro Controlado por Acelermetro


Segn la pruebas con el acelermetro a una configuracin de
sensibilidad de 2g vemos
Los ejes X, Y, Z varias en rango normales de -260 a 260.
Los rangos pueden llegar hasta -512 a 512 en un movimiento
brusco.
Entonces convertiremos los valores de -260 a 260 a -255 a 255
para controlar el PWM(control del ancho de pulso) de los motores.
Y por ltimos pondremos un limitador, ya que de exceder los 255
y
-255 enviado por el acelermetro estos continen con su
valor de 255 y -255.

Programacin Arduino Transmisor


En este caso, vamos
recibir los datos del
acelermetro, e
inmediatamente
enviarlo por el
modulo bluetooth y
podremos apreciar el
flujo de datos por el
monitor serial.

Programacin Arduino Transmisor


#include <SoftwareSerial.h>
SoftwareSerial mySerial(7,12); //(RX,TX) creado un puerto serial virtual
//RX = pin 7 y TX = pin12 del Arduino.
//modificando nuestra funcin de salida anteriormente creada.
void output(XYZBuffer xyz) {
Serial.print("x= "); Serial.print(xyz.value.x);Serial.print(", ");
Serial.print("y= "); Serial.print(xyz.value.y);Serial.print(", ");
Serial.print("z= "); Serial.print(xyz.value.z);Serial.println();
mySerial.print('x'); mySerial.print(xyz.value.x); //salida por el bluetooth
mySerial.print('y'); mySerial.print(xyz.value.y); //salida por el bluetooth
}

Programacin Arduino Transmisor


void setup(){
Serial.begin(9600); // inicio serial para el monitor
mySerial.begin(9600); // inicio serial para el bluetooth
Wire.begin();

// configuracin comunicacin I2C

setupAccel(ACELEROMETRO); // configuracin del Acelermetro


}

Programacin Arduino Transmisor


void loop(){
union XYZBuffer acelerometro; //creando nueva variable
readAccel(ACELEROMETRO,&acelerometro); // lectura acelermetro
output(acelerometro); //salida para el monitor y el bluetooth
delay(5); // aumentar el delay para que el tiempo de transmisin
sea
//mucho menor que el de recepcin
}

Programacin Arduino Transmisor


El resultado seria.

Programacin Arduino Receptor(Coche)


Una vez enviado la lectura del
acelermetro a travs del modulo
bluetooth del transmisor, es hora recibir y
decodificar los datos para enviarlos a los
motores.

Programacin Arduino Receptor(Coche)


Antes de empezar a programar.. Sabemos que..
Tenemos que crear un puerto serial virtual para el receptor Bluetooth.
Variables que vamos a utilizar para la decodificacin.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(A2,A3);
char charvar;
boolean bX = false;
boolean bY = false;
String data = "";
int dataX;
int dataY;

Programacin Arduino Receptor(Coche)


Ahora configuramos nuestro Arduino la cual incluye la declaraciones de
pines de los motores.
void setup(){
Serial.begin(9600);

//Iniciamos comunicacin Monitor serial

mySerial.begin(9600); //Iniciamos comunicacin bluetooth


pinMode(3, OUTPUT); //pin de motor
pinMode(9, OUTPUT); //pin de motor
pinMode(10, OUTPUT); //pin de motor
pinMode(11, OUTPUT); //pin de motor
}

Programacin Arduino Receptor(Coche)


Creamos funciones para cada movimiento del motor
con entrada PWM
void mov_avanzar(int pwm){
analogWrite(9,pwm);
analogWrite(3,0);
analogWrite(11,pwm);
analogWrite(10,0);
}

Programacin Arduino Receptor(Coche)


Creamos funciones para cada movimiento del motor
con entrada PWM
void mov_retro(int pwm){
analogWrite(9,0);
analogWrite(3,pwm);
analogWrite(11,0);
analogWrite(10,pwm);
}

Programacin Arduino Receptor(Coche)


Creamos funciones para cada movimiento del motor
con entrada PWM
void mov_derecha(int pwm){
analogWrite(9,pwm);
analogWrite(3,0);
analogWrite(11,0);
analogWrite(10,pwm);
}

Programacin Arduino Receptor(Coche)


Creamos funciones para cada movimiento del motor
con entrada PWM
void mov_izquierda(int pwm){
analogWrite(9,0);
analogWrite(3,pwm);
analogWrite(11,pwm);
analogWrite(10,0);
}

Programacin Arduino Receptor(Coche)


Y por ultimo.
void mov_stop(){
digitalWrite(9,LOW);
digitalWrite(3,LOW);
digitalWrite(11,LOW);
digitalWrite(10,LOW);
}

Programacin Arduino Receptor(Coche)


Como sabemos, el acelermetro puede enviar datos hasta -512 a 512 producido por
golpes, a nivel normal solo recibiremos de -260 a 260, por lo cual limitaremos de -255 a
255 para el control de nuestros motores(PWM)
void controlMotor(){ //creando la Funcin para el control de los motores

if(dataX > 255) dataX = 255; if(dataX < -255) dataX = -255; //limitando dato recibido
if(dataY > 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 Bluetooth


Como 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: X122y58
Tenemos que decodificarlo para obtener el valor
de X e Y.
Para nuestro ejemplo X = 122 e Y =58.

Algoritmo de decodificacin Bluetooth


Para 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 Bluetooth


Veamos 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 == 'y' || bY == true) {


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

break;
}

Prueba Coche controlado por acelermetro

You might also like