Pavouk Hiwonder

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
Pablo74
Příspěvky: 95
Registrován: 03 lis 2019, 17:00

Re: Pavouk Hiwonder

Příspěvek od Pablo74 » 20 lis 2024, 15:15

Asi jsem se vyjádři neobratně. Jde o to, že podle displeje a knihovny provedeš inicializaci displeje přes nějakej objekt s názvem třeba display a pak na něm voláš jednotlivý funkce jako clear(), print(), setCursor() a další.

Pokud už s displejem umíš pracovat, je to OK.

luger
Příspěvky: 233
Registrován: 30 dub 2023, 11:06

Re: Pavouk Hiwonder

Příspěvek od luger » 20 lis 2024, 15:28

nějak to nechce přežvíkat. Záleží na prvním znaku ? text nebo Text ? Já mám - char stav [10];
Hlásí chybu incompatible types in assignment of 'const char [4]' to 'char [10]'

Pablo74
Příspěvky: 95
Registrován: 03 lis 2019, 17:00

Re: Pavouk Hiwonder

Příspěvek od Pablo74 » 20 lis 2024, 15:52

Jazyk/knihovna Wiring - v tom programuješ - je vlastně Céčko a to je case-sensitive; rozlišuje velký a malý písmena v názvech konstant, proměnných, funkcí, příkazů, klíčových slov...

Dej se tu část kódu, kde je problém při překladu, dej sem i deklaraci proměnných; pak jsme schopni se pohnout z místa.

luger
Příspěvky: 233
Registrován: 30 dub 2023, 11:06

Re: Pavouk Hiwonder

Příspěvek od luger » 20 lis 2024, 16:05

tak to bude trochu složitější :( program má cca 800 řádků a tak to budu hledat :cry:

úseky programu, no nevím jesli to pomůže

char stav [10]; // pro výpis stavu na oled
.
U8GLIB_SSD1306_128X64 oled(U8G_I2C_OPT_NONE); // inicializace OLED displeje z knihovny U8glib
.
stav = "PIR";
.
oled.setPrintPos(2,44); // nastavení pozice kurzoru
oled.print("stav: "); // výpis informace
oled.setPrintPos(37,44); // nastavení pozice kurzoru
oled.print(stav); // ----------------------

Uživatelský avatar
kiRRow
Příspěvky: 1275
Registrován: 07 kvě 2019, 07:03
Bydliště: Opava

Re: Pavouk Hiwonder

Příspěvek od kiRRow » 20 lis 2024, 18:23

to tě pobaví ... :lol:

Kód: Vybrat vše

char stav [10]; // pro výpis stavu na oled - špatně
char stav[10]; // pro výpis stavu na oled - správně
a jestli na to příjdeš :-D

luger
Příspěvky: 233
Registrován: 30 dub 2023, 11:06

Re: Pavouk Hiwonder

Příspěvek od luger » 20 lis 2024, 19:26

To si děláš kozy :D
hned to jdu vyzkoušet

luger
Příspěvky: 233
Registrován: 30 dub 2023, 11:06

Re: Pavouk Hiwonder

Příspěvek od luger » 20 lis 2024, 21:46

Zatím to nefunguje, vypisuje jeden podivný znak, nebo jiný podivný znak. A co takhle String ?

luger
Příspěvky: 233
Registrován: 30 dub 2023, 11:06

Re: Pavouk Hiwonder

Příspěvek od luger » 22 lis 2024, 11:40

Nakonec jsem použil String a už to funguje. Díky za nápady.
Ale mám problém s gyroskopem.
Tento kod funguje perfektně - jedná se o vodováhu v osách X,Y,Z (stáhnuté s hwkitchen )

Kód: Vybrat vše

#include "Wire.h"
#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
 
MPU6050 accelgyro;
 
const float pi = 3.141592;


const int counter_w = 100;

int16_t ax, ay, az;
float x, y, z;
int counter;
float  angle_x, angle_y, angle_z, _angle_x, _angle_y, _angle_z;
long ax_p, ay_p, az_p;
 
void setup()
{
  Wire.begin();
  Serial.begin(9600);
  
  Serial.println("Spousteni zarizeni MPU6050");
  accelgyro.initialize();
  
  Serial.println("Testovani zarizeni");
  Serial.println(accelgyro.testConnection() ? "Zarizeni funguje spravne" : "Zarizeni se nepodarilo pripojit");
}
 
void loop()
{
  // zjistí všechny hodnoty z akcelerometru
  accelgyro.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;

  // pocitadlo mereni
  counter++;
  
  // az bude mereni counter_w (100), tak:  
  if (counter == counter_w)
  {
    //zjistíme průmerné hodnoty
    x = ax_p/counter;
    y = ay_p/counter;
    z = az_p/counter;
     
    // vypočteme sklon a náklon [°]
    angle_x = atan2(x, sqrt(square(y) + square(z)))/(pi/180);
    angle_y = atan2(y, sqrt(square(x) + square(z)))/(pi/180);
    angle_z = atan2(z, sqrt(square(x) + square(y)))/(pi/180);
     
    // vynulujeme hodnoty    
    counter = 0;
    ax_p = 0;
    ay_p = 0;
    az_p = 0;

    // hodnoty si vypíšme do portu  
    Serial.print(angle_x); Serial.print("\t"); 
    Serial.print(angle_y); Serial.print("\t"); 
    Serial.println(angle_z);
  }
}

zajímavé je, že funguje i bez knihovny "Math" a i bez načítání těch 100 hodnot. Prostě a jednoduše dám do výpočtu úhlu místo např. proměnné x vrazím přímo ax. Možná je to méně přesné, ale to já nepotřebuji - kontroluji jen překročení určitého úhlu +/- 15 °

Takže výsledný očesaný kod je :

Kód: Vybrat vše

#include "Wire.h"
//#include "Math.h"
#include "I2Cdev.h"
#include "MPU6050.h"
 
MPU6050 accelgyro;
 
const float pi = 3.141592;

int16_t ax, ay, az;
int  angle_x, angle_y, angle_z, _angle_x, _angle_y, _angle_z;
 
void setup()
{
  Wire.begin();
  Serial.begin(9600);

  accelgyro.initialize();
  }
 
void loop()
{
  // zjistí všechny hodnoty z akcelerometru
  accelgyro.getAcceleration(&ax, &ay, &az);

    // vypočteme sklon a náklon [°]
    angle_x = atan2(ax, sqrt(square(ay) + square(az)))/(pi/180);
    angle_y = atan2(ay, sqrt(square(ax) + square(az)))/(pi/180);
    angle_z = atan2(az, sqrt(square(ax) + square(ay)))/(pi/180);
     
    

    // hodnoty si vypíšme do portu  
    Serial.print(angle_x); Serial.print("\t"); 
    Serial.print(angle_y); Serial.print("\t"); 
    Serial.println(angle_z);
    //delay (100);
  }

A další dotaz:
Nikde jsem nenašel funkci square. Je to mocnina ale nikde není zmiňovaná. Záhadná a tajemná funkce :D Jestli někdo může tak prosím o odkaz na tuto funkci. Nenašel jsem ale možná blbě hledám.

Uživatelský avatar
gilhad
Příspěvky: 839
Registrován: 07 bře 2018, 11:22

Re: Pavouk Hiwonder

Příspěvek od gilhad » 22 lis 2024, 12:33

square je druhá mocnina, takže něco jako

Kód: Vybrat vše

double square(x) {return x*x;}
nebo pro jiné vhodné typy

A to s tím char[4] a char[10] nejspíš nefungovalo, protože tohle jsou obyčejná pole a asi nemají přetížené operátory přiřazení, které by nad nima dělaly stringové operace, takže to pak musí napsat člověk sám, třeba pomocí strcpy()

luger
Příspěvky: 233
Registrován: 30 dub 2023, 11:06

Re: Pavouk Hiwonder

Příspěvek od luger » 22 lis 2024, 13:52

Takže ta knihovna "Math" je tam jen tak , jen že existuje? Aby to zabralo víc místa ? :D Dohledal jsem funkci sq() což by měla být druhá mocnina. S touto funkcí to samozřejmě nefunguje :( .
Proč se nato ptám?
Pokud použiji jen samostatně výše uvedený program tak gyroskop funguje správně a vypisují se správné hodnoty ve stupních. Pokud ho vrazím do pavoučka tak sice gyroskop reaguje, ale hodnoty nejsou ve stupních ale v rozsahu 0-255. A to ještě nějak podezřele divně :shock:
Knihovny jsou stejné, inicializace taky, v podstatě je to jen překopírované.

Odpovědět

Kdo je online

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