Zbyšek Voda
Vytvořené odpovědi
-
AutorPříspěvky
-
Zbyšek VodaSprávce
Dobře, díky. Původně jsem myslel, že jde o konflikt pinů, ale tím to asi není.
Kód pro ten enkodér mi přijde podivný, ale jestli vám to takto funguje samotné, tak OK.Problém bude v tom, že funkce knihovny pro obsluhu displeje (u8g.firstPage(), draw()…) vždy nějakou dobu trvají. Ony si vlastně seberou procesor pro sebe a ten pak nezjišťuje, jestli melete enkodérem – to zjišťuje až ve chvíli, kdy přijde řad na funkce digitalRead() apod..
Vy tedy musíte nějak zajistit, aby procesor změny na pinech z enkodéru neignoroval. Pro tento účel se používá tzv. přerušení (anglicky interrupt) – na pinech, na kterých máte enkodér připojený si nastavíte přerušení a při změně těchto pinů dojde k donucené obsluze tohoto přerušení – takže pohyby enkodérem procesor nebude přehlížet.
O přerušeních se můžete dočíst více zde. Musíte si dát pozor na to, abyste použil piny, které přerušení podporují – u UNO jsou to piny 2 a 3. Také pozor na to, že se přerušení nastavují pomocí jejich čísla a ne čísla pinu. Ke správnému zjištění čísla přerušení z čísla pinu slouží funkce digitalPinToInterrupt(interruptPin).
Potom samotné použití přerušení s enkodérem je popsáno zde – hledejte sekci Interrupt Example (the Encoder interrupts the processor). Uses both Interrupt pins.
Zbyšek VodaSprávceAle klon jaké desky? 🙂 UNO, Leonardo…?
Zbyšek VodaSprávceDobrý den, jakou Arduino desku máte?
Zbyšek VodaSprávceNapadá mě použití jiného způsobu odečítání, než přes měření AC.
Mohlo by dobře fungovat počítání otáček motoru tak, že na osu si nalepíte odrazku a pak IR diodou a IR fototranzistorem budete odečítat, kolikrát došlo k „průchodu“ odrazky před senzorem. Viz například http://www.instructables.com/id/Measure-RPM-DIY-Portable-Digital-Tachometer/?ALLSTEPS.
Podobně by mohl fungovat magnet s hallovou sondou.
Jen nevím, jestli ve vašem případě lze připevnit odrazku či magnet na osu motoru nebo jinou pohyblivou část.
Zbyšek VodaSprávceDobrý den, určitě by to nějak šlo.
Třeba tady http://www.instructables.com/id/Air-Conditioning-web-controlled-by-Arduino/?ALLSTEPS o tom píšou.Zbyšek VodaSprávceCo je připojeno na pinech 8 a 9?
Zkusím vás nasměrovat 🙂 Přidejte si ještě jednu proměnnou, ve které budete uchovávat, jestli je žaluzie zatažená, nebo roztažená.
Potom budete zkoumat:
-je hodnota nad určitou hodnotu a je roztaženo? -> zatáhni
-je hodnota pod určitou hodnotu a je zataženo? -> roztáhniTaké nesmíte zapomenout nastavit aktuální hodnotu proměnné po zatažení či roztažení.
PS. Asi v kódu myslíte analogový pin A0, ne jenom 0 🙂
Zbyšek VodaSprávceDobrý den, je to krásná práce 🙂
Je super, když je projekt i vizuálně zajímavý a to se povedlo! 🙂
Plánujete i nějakou šasi?Zbyšek VodaSprávceDobrý den, problém je v tom, že attachInterrupt očekává jako druhý parametr referenci na funkci bez parametru. Metody objektů jsou ale implementovány tak, že jako první parametr mají „skrytě“ referenci na třídu, ke které patří. To vám vlastně říká i chybová hláška:
cannot convert 'Pokus::Privatna' from type 'void (Pokus::)()' to type 'void (*)()'
Problém řeší i s navrženými řešeními zde:
Zbyšek VodaSprávceZkuste postupovat například pomocí tohoto návodu: http://www.instructables.com/id/Arduino-Tutorials-part-3-17-Tutorial-Pack/step6/Arduino-and-RF-Transmitter-MX-FS-03V-and-Receiver-/ ?
Zbyšek VodaSprávceDíky za upřesnění.
Jaká serva používáte?Zbyšek VodaSprávceTo „dosažení zadané pozice“ podle mě znamená to, že vy pošlete do SSC32:
„nastav servo 1 na úhel 100°“
Není ale možné, aby servo bylo okamžitě z 0° nastaveno na 100°, takže řídící elektronika s určitou rychlostí odesílá „nastav 1°“, „nastav 2°“, …, „nastav 50°“, …, „nastav 100°“ a v tento moment dojde k potvrzení, že je servo na požadované pozici.To je ale pouze potvrzení, že řídící elektronika odeslala servu, aby se nastavilo na 100°. Jestli tam ale servo skutečně je, to nikdo neví. Většinou ale na těch 100° skutečně je.
Podle původní otázky jsem myslel, že chcete mít skutečnou informaci o poloze serva (zjištěnou například nějakým senzorem). Teď to ale vypadá, že se jenom ptáte, jak získat z SSC32 informaci, že už servo bylo nastaveno na zadanou pozici. Jak to tedy myslíte?
Zbyšek VodaSprávcePokud chcete mít přehled o poloze serva, musíte mít servo, které je na to přizpůsobené a má na sobě například nějaký přídavný senzor. Třeba na tomhle servu: https://www.adafruit.com/product/1404 je vyvedený potenciometr, takže měřením analogové hodnoty máte přehled, kam až servo dojelo.
I kdyby šla informace o nastaveném úhlu z desky SSC32 získat zpátky (což myslím nejde), bude tato informace stejně irelevantní, jako kdybyste si jenom pamatoval hodnotu, kterou jste na servu nastavil – neměl byste reálný feedback o poloze serva, ale jenom domnělou hodnotu, kterou si SSC32 myslí, že servo má nastaveno.
Zbyšek VodaSprávceZbyšek VodaSprávceTo vypadá moc pěkně 🙂
Neplánujete i vytvořit třeba různé „tachometry“ a podobné?
Pak by se mohl z grafů a „tachometrů“ poskládat docela pěkný dashboard.Zbyšek VodaSprávceTo, že pin „obsahuje“ přerušení znamená, že umí přerušení vyvolat – že řekne programu „teď se zastav a dělej něco úplně jiného“.
Piny 2 a 3 jsou tedy piny, které mohou způsobit vyvolání hardwarového přerušení. Obslužná funkce tohoto přerušení se na ně připojuje pomocí funkce attachInterrupt().Na pinech 4 a 5 přerušení nevyvoláte (ve smyslu toho hardwarového přerušení).
Ve vašem programu ale pravděpodobně hardwarové přerušení vůbec nechcete. Vy jenom chcete například reagovat na koncový spínač apod. Tomu sice asi říkáte „přerušení“, ale s přerušením ve smyslu interrupt toto vůbec nesouvisí.
-
AutorPříspěvky