Ahoj, omylem jsem koupil servo bez zpětný vazby DSS-M15S (dělají se 2 typy).
Snažil jsem se to tam dobastlit připojením čtvrtého drátu na běžec poťáku a čekal ve správnou funkci. Minimálně se podle aktuální polohy výstupní hřídele ono napětí mění od 0.3 - 3V. Na 500us puls je ta nejnižší hodnota napětí.
Pokud na to pustím jednoduchý program v IDE umožňující mi zadat polohu přes serial monitor vrací mi to na analogRead nesmyslný hodnoty. Očekával bych tam na nejmenší úhel nejmenší napětí a postupně až ke druhému konci dojezdu serva největší (a nebo opačně) ale není to tak! Vracejí se fakt kraviny.
začal by som pomeranim napetia ktoré sa realne vracia do Arduina. Ak je to skutočne 0,3 - 3 V a arduino nameria neičo ine, zjavne maš chybu v programe alebo zapojeni (napr neni spoločná zem)
kam to kurňa davate, aj mozila aj bitdefender mi hlasia problem...
čo tak použiť vlastný google disk?
V příkladu používáte při přepočtu na napětí referenční hodnotu 5V. Jakou desku Arduina konkrétně používáte a je to opravdu verze 5V a nebo je to verze 3.3V?
Co hlásí problém, jako ten ino zdroják?
K tomu zapojení, jsou tam 4 dráty. napájení 5V, GND, PWM na D9, feedback na A0. Arduino je zapojené do PC přes USB, všechno.
Napětí do A0 jsem teď měřil na 1.5ms je cca 1.5V na 2.5ms 3V na 0.5ms je těch 0.3V.
Serial.print ukazuje něco jinýho. Viz. screen
Valdano: Arduino Nano a nevím co tam má být napsáno jestli 3.3 či 5V
OK. Ale myslím si že to nefachá
S tím osciloskopem si to myslím taky, že tam asi není uplně průběh takový jaký by měl být, a zdroj problému je moje vidlácká úprava serva.
Úpravte si program tak aby načítal a zobrazoval pouze surovou hodnotu z pinu A0 při určitém zadaném úhlu a na dalším řádku pak vypočítanou hodnotu napětí podle vzorečku co tam je . Nic víc pro zjištění chyby nepotřebujete, vypadá to že možná zlobí potenciometr v servu pokud se budou hodnoty z potenciometru plynule měnit tak je v pořádku. Pak si ze surové hodnoty nebo i vypočítané hodnoty napětí podle toho vzorečku vypočítejte jaké dostanete stupně natočení. Osobně na přepočty používám programy jeden co mi umožňuje z vypočítané hodnoty zobrazit jaká surová načtená hodnota odpovídá této hodnotě a druhý pak co mi vypočítá ze surové hodnoty načtené analogovým vstupem Arduina napětí. Raději používám sériový terminál než terminál v IDE někdy jsou hodnoty jiné než je skutečnost vlastní zjištění, například při oživování robotického ramene kde mi zajímali hodnoty napětí na běžci potenciometru jednoho použitého nového serva nakonec byl vadný potenciometr z výroby. Uvedené programy jsou na webu.
Naposledy upravil(a) bum dne 26 říj 2025, 21:01, celkem upraveno 1 x.
Máte tam chybu. AnalogRead musíte číst mimo ten if opakovaně třeba jednou za vteřinu a nezávisle na té podmínce při nastavení pozice, protože ta proběhne jen jednou při zadání pozice přes serial monitor. Servu pak trvá nějakou dobu to přestavení na pozici, ale vy čtete AnalogRead hned poté, a to je příliš brzy a v tom je ten problém.
A proč to neuděláš klasicky, zpětnou vazbou z potenciomeru do servozesilovače serva? To v servu není úplnej klasickej servozesilovač? Pak stačí zadat jen mikrosekundy a o zbytek se postará knihovna.
Myslím, že odběr motoru serva dělá pulzní úbytky na napájení serva a proto ti to analogový napětí z potenciomeru kolísá.
Tam nejde o kolísání napětí na vstupu A0, ale o to, že čte hodnotu napětí jen jednou při změně pozice a hned po zavolání myServo.write(pos); jenže to volání není blokující tj. nečeká až se pozice serva fyzicky nastaví na žádanou pozici. Tím, že hned poté zavolá AnalogRead() tak přečte hodnotu kdy je servo ještě v pohybu (přestavuje se na tu žádanou pozici) a tím mu chodí náhodné a nesmyslné hodnoty.
Když to udělá tak jak jsem upravil ten příklad naposledy výše tak by měl výslednou pozici vidět po chvíli správně až se servo na tu pozici nastaví tak by hodnota vrácená AnalogRead() měla odpovídat správné žádané poloze.
Naposledy upravil(a) Valdano dne 26 říj 2025, 21:25, celkem upraveno 1 x.
Děkuji že se snažíte poradit, ale já furt nevím co je blbě. Vyhodil jsem výpis napětí a úhlu a dal tam jenom výpis hodnot z převodníku a nevypadá to moc funkčně.
Nikdy jsem v Arduinu (wiring) nedělal, tak se omlouvám, za lamí dotazy.
Kde mám vypisovat tu val proměnnou?
Pořád to máte špatně. AnalogRead() nesmíte volat hned po zavolání myServo.write(pos); protože to volání není blokující tj. nečeká až se pozice serva fyzicky nastaví na žádanou pozici. Tím, že hned po myServo.write(pos); zavoláte AnalogRead() tak přečte hodnotu kdy je servo ještě v pohybu (přestavuje se na tu žádanou pozici) a tím vám chodí náhodné a nesmyslné hodnoty.
Valdano funguje. Teď ještě přijít na to proč se to servo nehejbe v případě toho krytu a ovládání ze seeeduina.
V PC seeeduino připojím, program pro ovládání observatoře ho vidí, ale servo si po kliknutí na otevřít jen tak tiše poťukává a jinak nic.
Na pinu PWM na osciloskopu vidím pulsy od 500-2500us, mosfet spíná studený konec napájení serva, ale funguje to divně, tak že gate budí jen při kliknutí na zavřít dekl. Podle mě to neví kde servo je a ve feedbacku je něco jinýho než u origo serva.