Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

Servo se zpětnou vazbou 270°

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další)
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
pdp7



Založen: Sep 15, 2014
Příspěvky: 287

PříspěvekZaslal: ne říjen 26 2025, 19:06    Předmět: Servo se zpětnou vazbou 270° Citovat

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.



servoDSS.ino.zip
 Komentář:

Stáhnout
 Soubor:  servoDSS.ino.zip
 Velikost:  522 Bajtů
 Staženo:  12 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
misocko



Založen: Jun 26, 2009
Příspěvky: 1454
Bydliště: Hlohovec (Sk)

PříspěvekZaslal: ne říjen 26 2025, 19:24    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Valdano



Založen: Jan 01, 2023
Příspěvky: 2675
Bydliště: Česká Lípa

PříspěvekZaslal: ne říjen 26 2025, 20:01    Předmět: Citovat

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?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pdp7



Založen: Sep 15, 2014
Příspěvky: 287

PříspěvekZaslal: ne říjen 26 2025, 20:07    Předmět: Citovat

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



screen.png
 Komentář:
 Velikost:  203.75 kB
 Zobrazeno:  6 krát

screen.png


Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Valdano



Založen: Jan 01, 2023
Příspěvky: 2675
Bydliště: Česká Lípa

PříspěvekZaslal: ne říjen 26 2025, 20:16    Předmět: Citovat

pdp7 napsal(a):
Valdano: Arduino Nano a nevím co tam má být napsáno jestli 3.3 či 5V

To záleží na tom na jaké provozní napětí máte to Arduino Nano. Dělají se totiž s provozním napětím na 5V a také na 3,3V a každé má jinou referenci.

Pokud máte verzi pro 5V tak je správně
kód:
napeti = val * (5.0 / 1023.0);


Pokud máte verzi pro 3,3V tak by tam mělo být
kód:
napeti = val * (3.3 / 1023.0);
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Valdano



Založen: Jan 01, 2023
Příspěvky: 2675
Bydliště: Česká Lípa

PříspěvekZaslal: ne říjen 26 2025, 20:33    Předmět: Citovat

Zkuste to takto.

kód:
#include <Servo.h>
Servo myServo;
int pos,val;
float napeti;
double dat;
unsigned long cas;

void setup()
{
  Serial.begin(9600);
  myServo.attach(9);
  myServo.write(0);
  cas = millis();
}

void loop()
{
  Serial.println("Enter position: ");
  if (Serial.available() > 0) {
    pos = Serial.readString().toInt();
    if (pos >= 0 && pos <= 180){
      myServo.write(pos);
      Serial.print("Turned to: ");
      Serial.println(pos);
    } else {
      Serial.println("Invalid postition!");
    }
  }
  if ((millis() - cas) > 10000 {
    val = analogRead(A0);
    napeti = val * (5.0 / 1023.0);
    Serial.print("Feedback: ");
    Serial.print(napeti);
    Serial.println("V");
    dat = (double)val * 0.47 - 33.4;
    Serial.print("Uhel: ");
    Serial.print(dat);
    Serial.println("°");
  }
}


Možná by to chtělo mrknout na ten pin A0 osciloskopem jestli to napětí na něm nějak výrazněji nekolísá. Měřák to nemusí zachytit.


Naposledy upravil Valdano dne ne říjen 26 2025, 21:05, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pdp7



Založen: Sep 15, 2014
Příspěvky: 287

PříspěvekZaslal: ne říjen 26 2025, 20:45    Předmět: Citovat

OK. Ale myslím si že to nefachá Rolling Eyes
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. Laughing



screen2.png
 Komentář:
 Velikost:  211.89 kB
 Zobrazeno:  1 krát

screen2.png


Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
bum



Založen: Sep 04, 2011
Příspěvky: 280

PříspěvekZaslal: ne říjen 26 2025, 20:53    Předmět: Citovat

Ú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.
_________________
www.mojeelektronika.mzf.cz


Naposledy upravil bum dne ne říjen 26 2025, 21:01, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovy WWW stránky
Valdano



Založen: Jan 01, 2023
Příspěvky: 2675
Bydliště: Česká Lípa

PříspěvekZaslal: ne říjen 26 2025, 20:53    Předmět: Citovat

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.

Zkuste to takto.

kód:
#include <Servo.h>

Servo myServo;
int pos,val;
float napeti;
double dat;
unsigned long cas;

void setup()
{
  Serial.begin(9600);
  myServo.attach(9);
  myServo.write(0);
  Serial.println("Enter position: ");
  cas = millis();
}

void loop()
{
  if (Serial.available() > 0) {
    pos = Serial.readString().toInt();
    if (pos >= 0 && pos <= 180) {
      myServo.write(pos);
      Serial.print("Turned to: ");
      Serial.println(pos);
    } else {
      Serial.println("Invalid postition!");
    }
  }
  if ((millis() - cas) > 1000) {
    val = analogRead(A0);
    napeti = val * (5.0 / 1023.0);
    Serial.print("Feedback: ");
    Serial.print(napeti);
    Serial.println("V");
    dat = (double)val * 0.47 - 33.4;
    Serial.print("Uhel: ");
    Serial.print(dat);
    Serial.println("°");
    cas = millis();
  }
}


Naposledy upravil Valdano dne ne říjen 26 2025, 21:13, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Celeron



Založen: Apr 02, 2011
Příspěvky: 19926
Bydliště: Nový Bydžov

PříspěvekZaslal: ne říjen 26 2025, 21:12    Předmět: Citovat

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

_________________
Jirka

Proč mi nemůže všechno chodit hned ?!!
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Valdano



Založen: Jan 01, 2023
Příspěvky: 2675
Bydliště: Česká Lípa

PříspěvekZaslal: ne říjen 26 2025, 21:21    Předmět: Citovat

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 Valdano dne ne říjen 26 2025, 21:25, celkově upraveno 1 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pdp7



Založen: Sep 15, 2014
Příspěvky: 287

PříspěvekZaslal: ne říjen 26 2025, 21:23    Předmět: Citovat

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?



screen3.png
 Komentář:
 Velikost:  233.61 kB
 Zobrazeno:  2 krát

screen3.png


Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Valdano



Založen: Jan 01, 2023
Příspěvky: 2675
Bydliště: Česká Lípa

PříspěvekZaslal: ne říjen 26 2025, 21:29    Předmět: Citovat

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.

Udělejte to přesně takto viz níže.

kód:
#include <Servo.h>

Servo myServo;
int pos,val;
float napeti;
double dat;
unsigned long cas;

void setup()
{
  Serial.begin(9600);
  myServo.attach(9);
  myServo.write(0);
  Serial.println("Enter position: ");
  cas = millis();
}

void loop()
{
  if (Serial.available() > 0) {
    pos = Serial.readString().toInt();
    if (pos >= 0 && pos <= 180) {
      myServo.write(pos);
      Serial.print("Turned to: ");
      Serial.println(pos);
    } else {
      Serial.println("Invalid postition!");
    }
  }
  if ((millis() - cas) > 1000) {
    val = analogRead(A0);
    napeti = val * (5.0 / 1023.0);
    Serial.print("Feedback: ");
    Serial.print(napeti);
    Serial.println("V");
    dat = (double)val * 0.47 - 33.4;
    Serial.print("Uhel: ");
    Serial.print(dat);
    Serial.println("°");
    cas = millis();
  }
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
pdp7



Založen: Sep 15, 2014
Příspěvky: 287

PříspěvekZaslal: ne říjen 26 2025, 21:31    Předmět: Citovat

Ještě k tomu napíšu, stavěl jsem motoricky ovládaný kryt na dalekohled aby ho bylo možno ovládat na dálku z PC z jednoho návodu na Githubu

https://github.com/jlecomte/ascom-telescope-cover-v2

kde je to vpodstatě se vším všudy. Ale ono to nefunguje ani podle toho (s tímhle mým obrazek_cenzuraím servem).[/url]
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Miniaturní počítače (Arduino, Raspberry a další) Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
Nemůžete odesílat nové téma do tohoto fóra.
Nemůžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Nemůžete připojovat soubory k příspěvkům
Můžete stahovat a prohlížet přiložené soubory

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.16 sekund