You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
267 lines
5.9 KiB
267 lines
5.9 KiB
5 years ago
|
#include <Wire.h>
|
||
|
#include <TimerOne.h>
|
||
|
#include <SoftwareSerial.h>
|
||
|
#include <ArduinoJson.h>
|
||
|
|
||
|
#define MPU9250_ADDRESS 0x68
|
||
|
#define MAG_ADDRESS 0x0C
|
||
|
|
||
|
#define GYRO_FULL_SCALE_250_DPS 0x00
|
||
|
#define GYRO_FULL_SCALE_500_DPS 0x08
|
||
|
#define GYRO_FULL_SCALE_1000_DPS 0x10
|
||
|
#define GYRO_FULL_SCALE_2000_DPS 0x18
|
||
|
|
||
|
#define ACC_FULL_SCALE_2_G 0x00
|
||
|
#define ACC_FULL_SCALE_4_G 0x08
|
||
|
#define ACC_FULL_SCALE_8_G 0x10
|
||
|
#define ACC_FULL_SCALE_16_G 0x18
|
||
|
|
||
|
// This function read Nbytes bytes from I2C device at address Address.
|
||
|
// Put read bytes starting at register Register in the Data array.
|
||
|
void I2Cread(uint8_t Address, uint8_t Register, uint8_t Nbytes, uint8_t* Data)
|
||
|
{
|
||
|
// Set register address
|
||
|
Wire.beginTransmission(Address);
|
||
|
Wire.write(Register);
|
||
|
Wire.endTransmission();
|
||
|
|
||
|
// Read Nbytes
|
||
|
Wire.requestFrom(Address, Nbytes);
|
||
|
uint8_t index=0;
|
||
|
while (Wire.available())
|
||
|
Data[index++]=Wire.read();
|
||
|
}
|
||
|
StaticJsonBuffer<200> jsonBuffer;
|
||
|
|
||
|
// Build your own object tree in memory to store the data you want to send in the request
|
||
|
JsonObject& root = jsonBuffer.createObject();
|
||
|
|
||
|
SoftwareSerial ArduinoMaster(2,3);
|
||
|
String msg;
|
||
|
// Write a byte (Data) in device (Address) at register (Register)
|
||
|
void I2CwriteByte(uint8_t Address, uint8_t Register, uint8_t Data)
|
||
|
{
|
||
|
// Set register address
|
||
|
Wire.beginTransmission(Address);
|
||
|
Wire.write(Register);
|
||
|
Wire.write(Data);
|
||
|
Wire.endTransmission();
|
||
|
}
|
||
|
|
||
|
// Initial time
|
||
|
long int ti;
|
||
|
volatile bool intFlag=false;
|
||
|
|
||
|
// Initializations
|
||
|
void setup()
|
||
|
{
|
||
|
// Arduino initializations
|
||
|
pinMode(13,OUTPUT);
|
||
|
Wire.begin();
|
||
|
ArduinoMaster.begin(9600);
|
||
|
Serial.begin(9600);
|
||
|
|
||
|
// Set accelerometers low pass filter at 5Hz
|
||
|
I2CwriteByte(MPU9250_ADDRESS,29,0x06);
|
||
|
// Set gyroscope low pass filter at 5Hz
|
||
|
I2CwriteByte(MPU9250_ADDRESS,26,0x06);
|
||
|
|
||
|
|
||
|
// Configure gyroscope range
|
||
|
I2CwriteByte(MPU9250_ADDRESS,27,GYRO_FULL_SCALE_1000_DPS);
|
||
|
// Configure accelerometers range
|
||
|
I2CwriteByte(MPU9250_ADDRESS,28,ACC_FULL_SCALE_4_G);
|
||
|
// Set by pass mode for the magnetometers
|
||
|
I2CwriteByte(MPU9250_ADDRESS,0x37,0x02);
|
||
|
|
||
|
// Request continuous magnetometer measurements in 16 bits
|
||
|
I2CwriteByte(MAG_ADDRESS,0x0A,0x16);
|
||
|
|
||
|
pinMode(13, OUTPUT);
|
||
|
Timer1.initialize(10000); // initialize timer1, and set a 1/2 second period
|
||
|
Timer1.attachInterrupt(callback); // attaches callback() as a timer overflow interrupt
|
||
|
|
||
|
|
||
|
// Store initial time
|
||
|
ti=millis();
|
||
|
}
|
||
|
|
||
|
// Counter
|
||
|
long int cpt=0;
|
||
|
|
||
|
void callback()
|
||
|
{
|
||
|
intFlag=true;
|
||
|
digitalWrite(13, digitalRead(13) ^ 1);
|
||
|
}
|
||
|
|
||
|
// Main loop, read and display data
|
||
|
void loop()
|
||
|
{
|
||
|
readSerialPort();
|
||
|
// Send answer to master
|
||
|
if(msg!=""){
|
||
|
Serial.print("Master sent : " );
|
||
|
Serial.println(msg);
|
||
|
ArduinoMaster.print(msg);
|
||
|
msg="";
|
||
|
}
|
||
|
while (!intFlag);
|
||
|
intFlag=false;
|
||
|
|
||
|
// Display time
|
||
|
Serial.print (millis()-ti,DEC);
|
||
|
Serial.print ("\t");
|
||
|
|
||
|
|
||
|
// _______________
|
||
|
// ::: Counter :::
|
||
|
|
||
|
// Display data counter
|
||
|
// Serial.print (cpt++,DEC);
|
||
|
// Serial.print ("\t");
|
||
|
|
||
|
|
||
|
|
||
|
// ____________________________________
|
||
|
// ::: accelerometer and gyroscope :::
|
||
|
|
||
|
// Read accelerometer and gyroscope
|
||
|
uint8_t Buf[14];
|
||
|
I2Cread(MPU9250_ADDRESS,0x3B,14,Buf);
|
||
|
|
||
|
// Create 16 bits values from 8 bits data
|
||
|
|
||
|
// Accelerometer
|
||
|
int16_t ax=-(Buf[0]<<8 | Buf[1]);
|
||
|
int16_t ay=-(Buf[2]<<8 | Buf[3]);
|
||
|
int16_t az=Buf[4]<<8 | Buf[5];
|
||
|
|
||
|
// Gyroscope
|
||
|
int16_t gx=-(Buf[8]<<8 | Buf[9]);
|
||
|
int16_t gy=-(Buf[10]<<8 | Buf[11]);
|
||
|
int16_t gz=Buf[12]<<8 | Buf[13];
|
||
|
|
||
|
root["acceleratorx"]= ax;
|
||
|
root["acceleratory"]= ay;
|
||
|
root["acceleratorz"]= az;
|
||
|
|
||
|
root["gyroscopex"]= ax;
|
||
|
root["gyroscopey"]= ay;
|
||
|
root["gyroscopez"]= az;
|
||
|
root.prettyPrintTo(Serial);
|
||
|
Serial.println();
|
||
|
|
||
|
// Display values
|
||
|
// Accelerometer
|
||
|
|
||
|
/*
|
||
|
Serial.print ("ax: ");
|
||
|
Serial.print (ax,DEC);
|
||
|
Serial.print ("\t");
|
||
|
Serial.print ("ay :");
|
||
|
Serial.print (ay,DEC);
|
||
|
Serial.print ("\t");
|
||
|
Serial.print ("az :");
|
||
|
Serial.print (az,DEC);
|
||
|
Serial.print ("\t");
|
||
|
*/
|
||
|
// Gyroscope
|
||
|
|
||
|
/*
|
||
|
Serial.print ("gx: ");
|
||
|
Serial.print (gx,DEC);
|
||
|
Serial.print ("\t");
|
||
|
Serial.print ("gy: ");
|
||
|
Serial.print (gy,DEC);
|
||
|
Serial.print ("\t");
|
||
|
Serial.print ("gz: ");
|
||
|
Serial.print (gz,DEC);
|
||
|
Serial.print ("\t");
|
||
|
*/
|
||
|
/*
|
||
|
// _____________________
|
||
|
// ::: Magnetometer :::
|
||
|
|
||
|
|
||
|
// Read register Status 1 and wait for the DRDY: Data Ready
|
||
|
|
||
|
uint8_t ST1;
|
||
|
do
|
||
|
{
|
||
|
I2Cread(MAG_ADDRESS,0x02,1,&ST1);
|
||
|
}
|
||
|
while (!(ST1&0x01));
|
||
|
|
||
|
// Read magnetometer data
|
||
|
uint8_t Mag[7];
|
||
|
I2Cread(MAG_ADDRESS,0x03,7,Mag);
|
||
|
|
||
|
// Create 16 bits values from 8 bits data
|
||
|
|
||
|
// Magnetometer
|
||
|
int16_t mx=-(Mag[3]<<8 | Mag[2]);
|
||
|
int16_t my=-(Mag[1]<<8 | Mag[0]);
|
||
|
int16_t mz=-(Mag[5]<<8 | Mag[4]);
|
||
|
|
||
|
|
||
|
// Magnetometer
|
||
|
Serial.print (mx+200,DEC);
|
||
|
Serial.print ("\t");
|
||
|
Serial.print (my-70,DEC);
|
||
|
Serial.print ("\t");
|
||
|
Serial.print (mz-700,DEC);
|
||
|
Serial.print ("\t");
|
||
|
|
||
|
|
||
|
|
||
|
// End of line*/
|
||
|
Serial.println("");
|
||
|
// delay(500000);
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
void readSerialPort(){
|
||
|
while (ArduinoMaster.available()) {
|
||
|
delay(10);
|
||
|
if (ArduinoMaster.available() >0) {
|
||
|
char c = ArduinoMaster.read(); //gets one byte from serial buffer
|
||
|
msg += c; //makes the string readString
|
||
|
}
|
||
|
}
|
||
|
ArduinoMaster.flush();
|
||
|
}
|
||
|
/*bool sendRequest(const char* host, const char* resource) {
|
||
|
// Reserve memory space for your JSON data
|
||
|
StaticJsonBuffer<200> jsonBuffer;
|
||
|
|
||
|
// Build your own object tree in memory to store the data you want to send in the request
|
||
|
JsonObject& root = jsonBuffer.createObject();
|
||
|
root["sensor"] = "dht11";
|
||
|
|
||
|
JsonObject& data = root.createNestedObject("data");
|
||
|
data.set("temperature", "30.1");
|
||
|
data.set("humidity", "70.1");
|
||
|
|
||
|
// Generate the JSON string
|
||
|
root.printTo(Serial);
|
||
|
|
||
|
Serial.print("POST ");
|
||
|
Serial.println(resource);
|
||
|
|
||
|
client.print("POST ");
|
||
|
client.print(resource);
|
||
|
client.println(" HTTP/1.1");
|
||
|
client.print("Host: ");
|
||
|
client.println(host);
|
||
|
client.println("Connection: close\r\nContent-Type: application/json");
|
||
|
client.print("Content-Length: ");
|
||
|
client.print(root.measureLength());
|
||
|
client.print("\r\n");
|
||
|
client.println();
|
||
|
root.printTo(client);
|
||
|
|
||
|
return true;
|
||
|
}*/
|