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
luger
Příspěvky: 146
Registrován: 30 dub 2023, 11:06
Reputation: 0

Re: Pavouk Hiwonder

Příspěvek od luger » 27 bře 2024, 17:36

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.

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

Re: Pavouk Hiwonder

Příspěvek od Pablo74 » 27 bře 2024, 18:15

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?

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

Re: Pavouk Hiwonder

Příspěvek od luger » 28 bře 2024, 13:35

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á.

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

Re: Pavouk Hiwonder

Příspěvek od gilhad » 28 bře 2024, 15:15

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.

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

Re: Pavouk Hiwonder

Příspěvek od kiRRow » 28 bře 2024, 16:09

No já bych docela rád viděl ten program co pavoukem hýbe.

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

Re: Pavouk Hiwonder

Příspěvek od luger » 28 bře 2024, 17:59


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

Re: Pavouk Hiwonder

Příspěvek od luger » 29 bře 2024, 17:15

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

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

Re: Pavouk Hiwonder

Příspěvek od gilhad » 29 bře 2024, 21:33

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í.

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

Re: Pavouk Hiwonder

Příspěvek od luger » 29 bře 2024, 22:20

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
}

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

Re: Pavouk Hiwonder

Příspěvek od gilhad » 30 bře 2024, 01:05

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

Odpovědět

Kdo je online

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