MPU6050 vrací stále hodnotu 0
Napsal: 30 říj 2020, 19:09
Chtěla bych data získaná akcelerometrem MPU6050 přeposlat pomocí NRF24L01 na druhé arduino a zobrazit je na 4-místný sedmisegmentový displej. Když nahraju na Arduino kód týkající se pouze MPU6050, akcelerometr měří normálně, ale jakmile do kódu přidám i NRF24L01, vrací mi sériový monitor stále 0. NRF komunikace funguje nejspíše v pořádku, protože na displeji se zobrazují 4 nuly.
Zde je kód pouze pro MPU6050:
#include "Wire.h"
#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
// vytvoříme objekt s názvem
MPU6050 accelerometer;
// zadáme konstantu Ludofova čísla
// pro pozdější výpočty
const float pi = 3.141592;
//zde zadejte z kolika vzorku bude
// měření probíhat
const int pocet_vzorku = 100;
// pojmenovýní proměných
int16_t ax, ay, az;
float x, y, z;
int pocet;
float _angle_x, angle_x, _angle_y, angle_y;
long ax_p, ay_p, az_p;
void setup() {
// inicializace I2C
Wire.begin();
// zvolíme vyšší rychlost pro seriový port
Serial.begin(38400);
// inicializace akcelerometru
accelerometer.initialize();
// Když to hodí chybu vypíšeme hlášku
if (accelerometer.testConnection());
Serial.println("Spojeni OK...");
}
void loop() {
// zjistí všechny hodnoty z akcelerometru
accelerometer.getAcceleration(&ax, &ay, &az);
// sčítáme potřebný počet hodnot
ax_p = ax_p + ax;
ay_p = ay_p + ay;
az_p = az_p + az;
// pomocné určení počru vzorků
pocet++;
// když se dosáhne určeného počtu vzorků
if (pocet == pocet_vzorku)
{
//zjistíme průmerné hodnoty
x = ax_p/pocet_vzorku;
y = ay_p/pocet_vzorku;
z = az_p/pocet_vzorku;
// vypočteme sklon a náklon
angle_y = atan2(y, sqrt(square(x) + square(z)) )/(pi/180);
// vynulujeme hodnoty pro další použití
delay(2000);
pocet = 0;
ax_p = 0;
ay_p = 0;
az_p = 0;
// vypíšeme výsledky na seriový port
Serial.println(angle_y);
}
}
Zde pro MPU i NRF:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "Wire.h"
#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
RF24 radio(7,8); //NRF
const byte addresses[][6] = {"00001", "00002"};
MPU6050 accelerometer; //MPU
const float pi = 3.141592;
const int pocet_vzorku = 100;
int16_t ax, ay, az;
float x, y, z;
int pocet;
float _angle_x, angle_x, _angle_y, angle_y;
long ax_p, ay_p, az_p;
int angley;
byte num1;
byte num2;
byte num3;
byte num4;
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(addresses[0]); //00001
radio.openReadingPipe(1, addresses[1]); //00002
radio.setPALevel(RF24_PA_LOW);
Wire.begin();
Serial.begin(38400);
accelerometer.initialize();
if (accelerometer.testConnection());
Serial.println("Spojeni OK...");
}
void loop() {
accelerometer.getAcceleration(&ax, &ay, &az);
ax_p = ax_p + ax;
ay_p = ay_p + ay;
az_p = az_p + az;
pocet++;
if (pocet == pocet_vzorku){
x = ax_p/pocet_vzorku;
y = ay_p/pocet_vzorku;
z = az_p/pocet_vzorku;
}
// vypočteme sklon a náklon
angle_y = atan2(y, sqrt(square(x) + square(z)) )/(pi/180);
angley = angle_y;
// vynulujeme hodnoty pro další použití
pocet = 0;
ax_p = 0;
ay_p = 0;
az_p = 0;
Serial.println(angle_y);
num1 = (angley/10)%10;
num2 = (angley/100)%10;
num3 = (angley/1000)%10;
num4 = (angley/10000)%10;
delay(5);
radio.stopListening();
radio.write(&num1, sizeof(num1));
radio.write(&num2, sizeof(num2));
radio.write(&num3, sizeof(num3));
radio.write(&num4, sizeof(num4));
}
Zde je kód pouze pro MPU6050:
#include "Wire.h"
#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
// vytvoříme objekt s názvem
MPU6050 accelerometer;
// zadáme konstantu Ludofova čísla
// pro pozdější výpočty
const float pi = 3.141592;
//zde zadejte z kolika vzorku bude
// měření probíhat
const int pocet_vzorku = 100;
// pojmenovýní proměných
int16_t ax, ay, az;
float x, y, z;
int pocet;
float _angle_x, angle_x, _angle_y, angle_y;
long ax_p, ay_p, az_p;
void setup() {
// inicializace I2C
Wire.begin();
// zvolíme vyšší rychlost pro seriový port
Serial.begin(38400);
// inicializace akcelerometru
accelerometer.initialize();
// Když to hodí chybu vypíšeme hlášku
if (accelerometer.testConnection());
Serial.println("Spojeni OK...");
}
void loop() {
// zjistí všechny hodnoty z akcelerometru
accelerometer.getAcceleration(&ax, &ay, &az);
// sčítáme potřebný počet hodnot
ax_p = ax_p + ax;
ay_p = ay_p + ay;
az_p = az_p + az;
// pomocné určení počru vzorků
pocet++;
// když se dosáhne určeného počtu vzorků
if (pocet == pocet_vzorku)
{
//zjistíme průmerné hodnoty
x = ax_p/pocet_vzorku;
y = ay_p/pocet_vzorku;
z = az_p/pocet_vzorku;
// vypočteme sklon a náklon
angle_y = atan2(y, sqrt(square(x) + square(z)) )/(pi/180);
// vynulujeme hodnoty pro další použití
delay(2000);
pocet = 0;
ax_p = 0;
ay_p = 0;
az_p = 0;
// vypíšeme výsledky na seriový port
Serial.println(angle_y);
}
}
Zde pro MPU i NRF:
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include "Wire.h"
#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
RF24 radio(7,8); //NRF
const byte addresses[][6] = {"00001", "00002"};
MPU6050 accelerometer; //MPU
const float pi = 3.141592;
const int pocet_vzorku = 100;
int16_t ax, ay, az;
float x, y, z;
int pocet;
float _angle_x, angle_x, _angle_y, angle_y;
long ax_p, ay_p, az_p;
int angley;
byte num1;
byte num2;
byte num3;
byte num4;
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(addresses[0]); //00001
radio.openReadingPipe(1, addresses[1]); //00002
radio.setPALevel(RF24_PA_LOW);
Wire.begin();
Serial.begin(38400);
accelerometer.initialize();
if (accelerometer.testConnection());
Serial.println("Spojeni OK...");
}
void loop() {
accelerometer.getAcceleration(&ax, &ay, &az);
ax_p = ax_p + ax;
ay_p = ay_p + ay;
az_p = az_p + az;
pocet++;
if (pocet == pocet_vzorku){
x = ax_p/pocet_vzorku;
y = ay_p/pocet_vzorku;
z = az_p/pocet_vzorku;
}
// vypočteme sklon a náklon
angle_y = atan2(y, sqrt(square(x) + square(z)) )/(pi/180);
angley = angle_y;
// vynulujeme hodnoty pro další použití
pocet = 0;
ax_p = 0;
ay_p = 0;
az_p = 0;
Serial.println(angle_y);
num1 = (angley/10)%10;
num2 = (angley/100)%10;
num3 = (angley/1000)%10;
num4 = (angley/10000)%10;
delay(5);
radio.stopListening();
radio.write(&num1, sizeof(num1));
radio.write(&num2, sizeof(num2));
radio.write(&num3, sizeof(num3));
radio.write(&num4, sizeof(num4));
}