Este pequeno Modulo da figura acima é o GY-521, usado como acelerômetro e giroscópio e sensor de temperatura. Utiliza o CI MPU-6050 do fabricante InvenSense.
O CI MPU-6050 possui uma excelente precisão ao fazer as medições, utilizando a tecnologia MEMS. O que mais impressiona neste Módulo e que o algoritmo de detecçao de movimento é processado dentro do próprio CI, graças ao recurso DMP (Digital Motion Processor).
Para mais informações, sugiro que visitem o excelente site especialidado em embarcados, o embarcados.com.br . Este site foi minha referência de estudo para este modulo.
Para montagem vamos utilizar a mesma interface do WebestufaServer, e estou imprementando o código do módulo GY-521.
Os pinos que iremos utilizar do Modulo GY-521 será:
- VCC : ligar ao 5V do Ethernet Shield;
- GND: ligar ao GND do Ethernet Shield;
- SDA: ligar ao SDA do Arduino Mega;
- SCL: ligar ao SCL do Arduino Mega.
Montagem Eletrônica
Aplicação em Funcionamento
Para acessar a página da aplicação digitei no navegador : http://192.168.0.99 .Lembrando que este endereço poderá ser alterado no código e usado de acordo com a classe de ip da rede em que desejar utilizar.
Código Fonte
Código Fonte: WebestufaServer_GY-521
//Programa : Arduino Ethernet Shield W5100 e GY-521 (MPU-6050)
//Código Fonte de Referência: https://www.embarcados.com.br/arduino-acelerometro-giroscopio/
//Adaptação: Marcelo | Webestufa
#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
//Endereco I2C do MPU6050
const int MPU=0x68; //pino aberto 0X68 , pino ligado em 3,3V 0x69
//Variaveis globais
int acelX,acelY,acelZ,temperatura,giroX,giroY,giroZ;
//Definicoes de IP, mascara de rede e gateway
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192,168,0,99); //Define o endereco IP
IPAddress gateway(192,168,0,1); //Define o gateway
IPAddress subnet(255, 255, 255, 0); //Define a máscara de rede
//Inicializa o servidor web na porta 80
EthernetServer server(80);
void setup() {
Serial.begin(9600); //inicia a comunicação serial
Wire.begin(); //inicia I2C
Wire.beginTransmission(MPU); //Inicia transmissão para o endereço do MPU
Wire.write(0x6B);
//Inicializa o MPU-6050
Wire.write(0);
Wire.endTransmission(true);
//Inicializa a interface de rede
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
}
void loop() {
Wire.beginTransmission(MPU); //transmite
Wire.write(0x3B); // Endereço 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false); //Finaliza transmissão
Wire.requestFrom(MPU,14,true); //requisita bytes
//Armazena o valor dos sensores nas variaveis correspondentes
acelX=Wire.read()<<8|Wire.read(); //0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
acelY=Wire.read()<<8|Wire.read(); //0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
acelZ=Wire.read()<<8|Wire.read(); //0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
temperatura=Wire.read()<<8|Wire.read(); //0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
giroX=Wire.read()<<8|Wire.read(); //0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
giroY=Wire.read()<<8|Wire.read(); //0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
giroZ=Wire.read()<<8|Wire.read(); //0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
//Aguarda conexao do browser
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean currentLineIsBlank = true;
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
// if you've gotten to the end of the line (received a newline
// character) and the line is blank, the http request has ended,
// so you can send a reply
if (c == 'n' && currentLineIsBlank) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println("Refresh: 2"); //Recarrega a pagina a cada 2seg
client.println();
client.println("<!DOCTYPE HTML>");
//INICIO DO CODIGO HTML
client.println("<HTML>");
client.println("<head><Webestufa</title></head>");
client.println("<BODY>");
client.println("<br><br><center><a href=\"http://www.webestufa.com.br\"> <img align=center width=350px heigh=150px src=https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg8coZfJlBHW0gqH_yc0ss45IlGAG41hvP57galtye4SG_MSWDNQdgeprZFXuN_kgd49rVAtEPhfupoEhTZmToqobXXExOU1WKJyTvoOqkr7oj-Z-iEYz7uCFTUxdjqIGgsI8xzFjyj1yw/s128/logowebestufa.gif></center></br></br>");
client.println("<H1><center>Arduino + Ethernet Shield W5100 + Acelerometro e Giroscopio</center></H1>");
client.println("<br />");
client.println("<br />");
client.println("<h2><center>");
//Valores lidos do Acelerômetro
client.print("<br><br><center>Acelerometro :");
client.print(" X: ");client.print(acelX);
client.print("\tY: ");client.print(acelY);
client.print("\tZ: ");client.print(acelZ);
client.println("<br />");
client.println("<br />");
//Envia valores lidos do giroscópio
client.print("\tGiroscopio:");
client.print(" X:");client.print(giroX);
client.print("\tY:");client.print(giroY);
client.print("\tZ:");client.print(giroZ);
//Temperatura em graus Celsius
client.print("\tTemperatura: ");client.println(temperatura/340.00+36.53);client.print("*C");
//Aguarda 500 ms
delay(500);
client.println("</center></h2>");
client.println("<br>");
break;
}
if (c == 'n') {
// you're starting a new line
currentLineIsBlank = true;
}
else if (c != 'r') {
// you've gotten a character on the current line
currentLineIsBlank = false;
}
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
}
}
Referência
Embarcados: https://www.embarcados.com.br/arduino-acelerometro-giroscopio/