Stránka 4 z 10

Re: Pavouk Hiwonder

Napsal: 27 bře 2024, 17:36
od luger
Ahoj pablo74, ano jsem trošku starší - :D napoví ZX Spectrum, IQ151, PMD85 apod., ještě pořád uvažuji v Basicu a nemůžu se toho zbavit.

Teď k těm knihovnám. Samozřejmě že jsem zkoušel program upravit , ale narazil jsem na nutnost použití firemní knihovny LobotServoController k podpoře ovládání servocontrolleru Hiwonder a BUS serv. Bez této knihovny se pavouk ani nepohne. Dále je na pohyb ultrazvukového senzoru (kukadel) použíté jakési "antiblok servo" a samotný ultrazvuk senzor jede přes I2C. Takže samé knihovny.
Prozatím se omezuji jen na drobné doplňky typu - běhej pomalej nebo rychlej, čekej na PIR nebo na tlesknutí apod. Větší zásah do původního programu většinou způsobí kolaps.

Re: Pavouk Hiwonder

Napsal: 27 bře 2024, 18:15
od Pablo74
Takže období "soudružka učitelka, povinný sběr léčivých rostlin, tajný sledování ORF1, třídní původ a kádrový profil", chápu :-)

Já ti do toho nemluvím, pokud by ten multitasking nešel použít kvůli těm knihovnám, OK.

Obecně ale stojí za to si ten článek přečíst a tu myšlenku pochopit a použít. Pak se kód velmi zpřehlední a pozdější zásahy do kódu nemusí nic rozbít. Ikdyž... všichni to známe, že?

Re: Pavouk Hiwonder

Napsal: 28 bře 2024, 13:35
od luger
Tak jsem se , prozatím jen letmo, kouknul na ten multitasking. Ne všechno jsem úplně pochopil. Nejsem si jistý jestli to bude fungovat při volání knihovny Servo.h která vyžaduje právě čekání na dokončení pohybu serva do zadané polohy. Proto jsem se to pokoušel nahradit knihovnou VarSpeedServo která jede nezávisle. Snad by se mohl vyjádřit samotný kolega Stehlík. Pokud sem tedy někdy zavítá.

Re: Pavouk Hiwonder

Napsal: 28 bře 2024, 15:15
od gilhad
Teď jsem kouknul do knihovny Servo https://github.com/arduino-libraries/Se ... /Servo.cpp z Arduina a tam na nic nečekají, prostě do serva zapíšou hodnotu a ta tam pak je. (řádky 264-294 - metoda write, writeMicroseconds)
A servo se pomalu nebo rychle natočí do té polohy, ale o to už se starají časovače a interrupty a program zatím běží dál.

Nebo to tak na mě aspoň na první pohled působí.

Nebo jsem nepochopil to s tím čekáním na dokončení pohybu.

Re: Pavouk Hiwonder

Napsal: 28 bře 2024, 16:09
od kiRRow
No já bych docela rád viděl ten program co pavoukem hýbe.

Re: Pavouk Hiwonder

Napsal: 28 bře 2024, 17:59
od luger

Re: Pavouk Hiwonder

Napsal: 29 bře 2024, 17:15
od luger
Jedna část programu pro pavouka mi není jasná:

Kód: Vybrat vše

int getDistance() {                                         //čtení vzdálenosti ultrazvuku
  u16 distance1, distance2, distance3;
  int distance = 0;
  WireReadDataArray(0,(uint8_t *)&distance1,2);
  WireReadDataArray(0,(uint8_t *)&distance2,2);
  WireReadDataArray(0,(uint8_t *)&distance3,2);
  distance = (distance1 + distance2 + distance3 )/3;
  return distance;                                           //Back to the measured distance
}
Do proměnné getDistance by to mělo ukládat hodnotu vzdálenosti. Zřejmě je to volané nějakou knihovnou.
Není mi jasná ta syntaxe int getDistance() { ..........} to je nějaký typ voidu nebo co to je za zápis ?
Může mi to prosím někdo vysvětlit ? Díky

Re: Pavouk Hiwonder

Napsal: 29 bře 2024, 21:33
od gilhad
int je typ návratové hodnoty
getDistance je jméno právě definované funkce
() je seznam parametrů (prázdný)
{...} je tělo té funkce

uvnitř těla ta funkce deklaruje tři proměnné typu u16 a jednu typu int
načte tři hodnoty, spočte jejich průměr a dá ho do proměnné distance
return vrátí hodnotu té proměnné jako návratovou hodnotu té funkce

-----

void loop() {....}

void je typ návratové hodnoty (nevrací nic)
loop je jméno právě definované funkce
() je seznam parametrů (prázdný)
{...} je tělo té funkce

Protože funkce loop nic nevrací, tak tam není return s hodnotou. Klidně by tam někde mohl být return bez hodnoty, aby to skončilo dřív, ale nemusí.

Re: Pavouk Hiwonder

Napsal: 29 bře 2024, 22:20
od luger
Díky gilhad. Proč jsem se ptal - chtěl bych mezi to načítání vrazit pohyb serva s čidlem sem a tam a pak spočítat průměr. Vím že je to blbě, ale pro představu mělo by to vypadat asi takto:

Kód: Vybrat vše

int getDistance() {                                         //čtení vzdálenosti ultrazvuku
  u16 distance1, distance2, distance3;
  int distance = 0;
  servo.write (90);
  WireReadDataArray(0,(uint8_t *)&distance1,2);
  servo.write (70);
  WireReadDataArray(0,(uint8_t *)&distance2,2);
  servo.write (100);
  WireReadDataArray(0,(uint8_t *)&distance3,2);
  distance = (distance1 + distance2 + distance3 )/3;
  return distance;                                           //Back to the measured distance
}

Re: Pavouk Hiwonder

Napsal: 30 bře 2024, 01:05
od gilhad
Já se věnoval něčemu jinému, když jsem to psal (víceméně mechanicky), ale na první pohled jsem tam vyloženou chybu neviděl a jen jsem popsal co tam je, bez většího přemýšlení.

Spíš mě zarazilo označování getDistance za proměnnou (je to adresa funkce, ale ty ji stejně budeš spíš někde volat a pak se vždy provede a vrátí ten průměr) a "typ voidu" ... void je typ - spíš mi přišlo, že nemáš moc zažité funkce a věci a názvosloví okolo nich.

Ale pokud jde o vzdálenosti a pohyb pavouka, tak bych spíš čekal, že budeš vracet minimum, než průměr.

Pokud bude pavouk nabíhat na roh chodby, tak bude mít před sebou třeba 1cm místa k rohu, vlevo 2cm ke kolmé zdi od toho rohu, vpravo 3m chodbou okolo toho rohu. V průměru 1.01 metru a dalším krokem si nabije kokos.

Já bych asi spíš vracel minimum - čili 1cm a pavouk to zaflekuje a bude přemýšlet, jak a kam se otočit, aby si neulámal nohy. (A asi se taky pořádně rozhlédne a zváží situaci.)