MPU6050 vrací stále hodnotu 0

Hana
Příspěvky: 19
Registrován: 26 říj 2020, 19:45
Reputation: 0

MPU6050 vrací stále hodnotu 0

Příspěvek od Hana » 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));

}

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od pavel1tu » 30 říj 2020, 20:04

Kod se vkládá tlačítkem </>
No, nemám akcelerometr, tak alespoń co jsem viděl na první pokled
musím si to zkopírovat a v klidu prohlédnout

jako první zkus toto
Zásadní je - 2x deklaruješ Serial, stačí jednou a dal bych klidně 115200

Kód: Vybrat vše

Serial.begin(9600);
Serial.begin(38400);
- možná by bylo lepší vyčítat vzorky ve smyčce for - vyzkoušej v samostatném programu - je to čistší, ale asi to nemá vliv na funkci ani programu ani živočicháře (ftip z filmu)

Kód: Vybrat vše

for ( int pocet = 1; pocet <= pocet_vzorku; pocet++) {
    // tady vycitat ty vzorky
    
  }
  
  // tady počítáš průměr a pokračovat
  

pak tam dělíš "long" / "int" - nejsem si jist, ale někdy mi to blblo, třeba mne ostatní opraví, pokud to zde funguje a vrací správné čísla - jako bych nic neřekl

Kód: Vybrat vše

//zjistíme průmerné hodnoty
x = ax_p/pocet_vzorku;
y = ay_p/pocet_vzorku;
z = az_p/pocet_vzorku;


více mne zatím nenapadá

PS: knihovny - napiš odkud jsou, jestli instalované přímo z IDE nebo jsi je někde stahovala - vůbec ten axcelerometr
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od pavel1tu » 30 říj 2020, 20:29

Další problém je:

Kód: Vybrat vše

loop()

tady vyčteš poprvé z gyroskopu a uložíš
pak přičteš do počtu měření +1

     pak je podmínka jestli už jsi změřila 100x, pokud ano vypočteš x,y,z 

tady nuluješ proměnné pocet = 0; ax_p = 0; ay_p = 0; az_p = 0; takže vlastně nic nepčišítáš tan výše
pak počítáš úhel, ale neproběhla podmínka výše a stejně je vše vynulováno, takže výpočet nemůže proběhnou

pak odesíláš data
Já bych to řešil jinak

Kód: Vybrat vše

deklarace atd.
setup ()

loop()

tady bych dal smyčku for a Xkrát vyčetl akcelerometr

pak vypočítal průměr a úhel

odeslal

vynuloval co je potřeba


klidně se ptej
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od pavel1tu » 30 říj 2020, 20:40

No, zkompilovat to šlo
jestli to funguje - toť otázka

klidně se ptej - učeš to lépe,

Kód: Vybrat vše

#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(115200);
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() {

for ( int pocet = 1; pocet <= pocet_vzorku; pocet++) { // snad probehne 100x mam v tom nekdy hockej
    // tady vycitat ty vzorky
    accelerometer.getAcceleration(&ax, &ay, &az);
    ax_p = ax_p + ax;
    ay_p = ay_p + ay;
    az_p = az_p + az;
     }

// vypocet prumeru
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;

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));

// vynulujeme hodnoty pro další použití

//pocet = 0;
ax_p = 0;
ay_p = 0;
az_p = 0;

}
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Hana
Příspěvky: 19
Registrován: 26 říj 2020, 19:45
Reputation: 0

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od Hana » 30 říj 2020, 21:18

Děkuji, už mi to ukazuje různé hodnoty, ale zase mám problém s přenosem informací přes NRF. Na displeji mi pouze svítí vždy jedna nula. Měla bych použít něco jiného než funkci byte pro ten přenos?

Zde je kód k displeji (doufám, že tentokrát to sem dám správně):

Kód: Vybrat vše

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>


RF24 radio(7,8);
const byte addresses[][6] = {"00001", "00002"};

byte num1;
byte num2;
byte num3;
byte num4;

int latchPin = 9; //pin 12 on the 595
int dataPin = 6; //pin 14 on the 595
int clockPin = 10; //pin 11 on the 595

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openWritingPipe(addresses[1]);
  radio.openReadingPipe(1, addresses[0]);
  radio.setPALevel(RF24_PA_LOW);



  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
}


void loop () {
  


  delay(5);

  radio.startListening();
  if (radio.available()){
  radio.read(&num1, sizeof(num1));
    if (num1 == 0) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b11000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
    else if (num1 == 1) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b11111001);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
     else if (num1 == 2) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10100100);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num1 == 3) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10110000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num1 == 4) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10011011);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num1 == 5) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10010010);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num1 == 6) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10000010);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num1 == 7) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b11111000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num1 == 8) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num1 == 9) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10010000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
  } 

  if (radio.available()){
    radio.read(&num2, sizeof(num2));
     if (num2 == 0) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b01000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
    else if (num2 == 1) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b01111001);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
     else if (num2 == 2) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00100100);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num2 == 3) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00110000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num2 == 4) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00011011);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num2 == 5) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00010010);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num2 == 6) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num2 == 7) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b01111000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num2 == 8) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num2 == 9) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000010);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00010000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
  }

  if (radio.available()){
    radio.read(&num3, sizeof(num3));
     if (num3 == 0) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b11000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
    else if (num3 == 1) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b01111001);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
     else if (num3 == 2) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10100100);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num3 == 3) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10110000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num3 == 4) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10011011);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num3 == 5) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10010010);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num3 == 6) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10000010);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num3 == 7) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b11111000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num3 == 8) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num3 == 9) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000100);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10010000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
  }
  
  if (radio.available()){
    radio.read(&num4, sizeof(num4));
     if (num4 == 0) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b11000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
    else if (num4 == 1) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b01111001);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
     else if (num4 == 2) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10100100);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num4 == 3) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10110000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num4 == 4) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10011011);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num4 == 5) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10010010);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num4 == 6) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10000010);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num4 == 7) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b11111000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num4 == 8) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
       else if (num4 == 9) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00001000);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b10010000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
  }
}

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od pavel1tu » 30 říj 2020, 21:36

byte nevadí, prostě se z výpočtu uloží jen "celé" číslo 0-255 - více ta proměnná neumí

problém je že //podle mého názoru

Kód: Vybrat vše

if (radio.available()){
  radio.read(&num1, sizeof(num1));
přijme vše ale uloží jen poslední nebo první číslo

já tohle taky moc neumím, ale odesílal a přijímal bych to pomocí "struct"

hnedle to popíši
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od pavel1tu » 30 říj 2020, 21:46

ve vysílači i přijímači založíš struct, tam kde deklaruješ promněnné

Kód: Vybrat vše

typedef struct {         // struktura paketu pro odeslání
  byte num1;
  byte num2;
  byte num3;
  byte num4;
} dataPacket;
pak tam kde jsi ukládata vypočítané hodnoty

Kód: Vybrat vše

num1 = (angley/10)%10;
num2 = (angley/100)%10;
num3 = (angley/1000)%10;
num4 = (angley/10000)%10;

změníš na 

dataPacket packet;
packet.num1 = (angley/10)%10;
packet.num2 = (angley/100)%10;
packet.num3 = (angley/1000)%10;
packet.num4 = (angley/10000)%10;

tím to uložíš do jednoho balíku, tam můžeš níchat klidně cokoliv, 
jen musíš mít navlas stejnou deklaraci ve vysílači i přijímači
a musí to být stejné zařízení - Arduina (mezi Arduinem a STM32 to nemusí vždy fungovat)
pak odešlaš celý balík

Kód: Vybrat vše

    radio.stopListening();
    radio.write(&packet, sizeof(dataPacket));
    delay(5*sizeof(dataPacket)); //toto tam kdyžtak nemusí být, dělá to delay podle množství odesílaných dat
uff a jdeme na příjem
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od pavel1tu » 30 říj 2020, 21:57

v přijímači musí být úplně stejná deklarace struktury - i stejné pořadí proměnných !!!

pak přijmeš

Kód: Vybrat vše

    dataPacket packet;
    
    radio.startListening();  //pokud jen přijímáš, melo by to být jen v setupu - asi nevím určitě ale pokud funguje nech to tu

  if (radio.available()) {
    radio.read(&packet, sizeof(dataPacket));
    delay(100*sizeof(dataPacket));
tím se přijak celý balík dat pěkně srovnaný přesně jako ve vysílači
pak to máš uložené v packet.num1 packet.num2 packet.num3 packet.num4
a upravíš podmínky pro jednotlivé zobrazení - pokud to někdy zobrazovalo více čísel - nevím přesně o jaký display jde

Kód: Vybrat vše

if (packet.num1 == 0) {
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b00000001);
      shiftOut(dataPin, clockPin, MSBFIRST, 0b11000000);
      digitalWrite(latchPin, HIGH);
      delay(1);
      }
      
      a tak dále
jen nechápu proč přenášíš 4 hodnoty, doufám že to nejsou jednotlivé digity, v popisku to není tak si nejsem jistý
stačilo by přenést celé číslo a rozložit ho na digity až v přijímači, ale takto je to zajímavější ;)

aaa j eto tak - přehlédl jsem to na začátku, ale třeba to bude fungovat
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od pavel1tu » 30 říj 2020, 22:06

Máš rozchozený ten display ?
Že někdy fungovaly všechny digity ?
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: MPU6050 vrací stále hodnotu 0

Příspěvek od pavel1tu » 30 říj 2020, 22:21

Nepřepínáš digity (asi už tu jsem sám, že ?)
posíláš data jen na 1 digit

na tom přijímači si vypiš do serialu všechny 4 přijímané hodnoty co ti chodí

napiš sem podle čeho (odkaz na netu) jsi dělala ten display
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 14 hostů