Odeslat nové téma Odpovědět na téma  [ Příspěvků: 104 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6, 7  Další
Autor Zpráva
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: pon 05.03.2018 21:52 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
jyrry píše:
. ...
...a kdyby tam ještě nebyl ten delay, ale počítání času z loopu, tak by to byl plnohodnotný řídící program bez zbytečných prodlev. Jinak ale pěkný posuv správným směrem! !

_________________
MC-20HOTT,DS-16,X10S,14SG,S-trino MkII,SpeedFire, Extra 102",MiniCorado,LOGO550SE,Goblin570


Nahoru
 Profil  
 
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: pon 05.03.2018 22:08 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 28.2.2005
Příspěvky: 20822
Bydliště: Rakovník, CZ
Obrázky: 0
ellet: to je můj stolní komp optiplex 780 z nějakého levnepocitace.cz (nebo tak nějak); píchnul jsem to USB přes měřáček, ukazuje to max. 0,3A když to jedno servo zatížím, jinak 0,1-0,2 max...

BoŠ: na to se právě chystám a psychicky připravuju; nalil jsem si dvoudecku suchého bílého, nasypal pár oříšků v paprikovém těstíčku a jdu na to :mrgreen:

No a zabralo to, ještě jsem to trochu doučesal a zkrátil:
Kód:
// servo tester @ Arduino nano:
  int dir = 1;
  unsigned int min_uS = 1000;
  unsigned int max_uS = 2000;
  unsigned int puls2_uS = 1500;
  unsigned int puls3_uS = 1500;
  unsigned long period_uS = 20000;
     
  void setup() {
  pinMode(3, OUTPUT); // servo 1 @ pin 3
  pinMode(4, OUTPUT); // servo 2 @ pin 4
  pinMode(5, OUTPUT); // servo 3 @ pin 5
  pinMode(A0, INPUT); // potak @ pin A0
  }

void loop() {
  unsigned long aktual_uS = micros();
  unsigned int puls1_uS = analogRead(A0) + min_uS;
  unsigned int step_ = analogRead(A0) / 10;
  puls2_uS = puls2_uS + dir * step_;
  if (puls2_uS >= max_uS || puls2_uS <= min_uS) dir = -1 * dir;
  pulz(puls1_uS, 3);
  pulz(puls2_uS, 4);
  pulz(puls3_uS, 5);
  while (micros() - aktual_uS <= period_uS){}
  }

void pulz(int pulz_uS, byte servo) {
  unsigned long out_uS = micros();
  digitalWrite(servo, HIGH);
  while (micros() - out_uS <= pulz_uS){}
  digitalWrite(servo, LOW);
  }

_________________
jyrry.webnode.cz


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 5:22 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
jyrry píše:
...



No, ty delay a počítané smyčky se nepoužívají, protože v dané chvíli, kdy se čeká na odčasování, se procesor v podstatě fláká, a kdyby byl požadavek na obsluhu dalších zařízení, tak by se muselo čekat na odčasování. Počítání času se řeší většinou tak, že při obsluze funkce se do statické proměnné uloží čas vstupu do funkce, a při každém dalším zavolání se vyhodnocuje časový rozdíl.
Např. takto

Citace:
ISR(INT0_vect)
{
static unsigned long last_millis = 0;
unsigned long m = millis();


if (m - last_millis > DEBOUNCE_DELAY ) // ignoruj preruseni
{
cli();
state=!state;
digitalWrite (LED1, state);
sei();

}

last_millis = m;
GIFR = bit (INTF0); // clear flag for interrupt 0

}


Samozřejmě při tomto relativně jednoduchém prográmku je to jedno, ale pokud bys potřeboval reagovat třeba na aktivaci vstupu bez použití přerušení cyklickým čtením tohoto vstupu, tak při čekání na odčasování pulsu by nebyla žádná reakce na tu aktivaci vstupu. Ale to je jen detail. Jinak je to bezva!!

_________________
MC-20HOTT,DS-16,X10S,14SG,S-trino MkII,SpeedFire, Extra 102",MiniCorado,LOGO550SE,Goblin570


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 5:34 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 28.2.2005
Příspěvky: 20822
Bydliště: Rakovník, CZ
Obrázky: 0
BoŠ píše:
... v dané chvíli, kdy se čeká na odčasování, se procesor v podstatě fláká, a kdyby byl požadavek na obsluhu dalších zařízení, tak by se muselo čekat na odčasování. ...

Jojo, na PICech to tak mám řešené přes přerušení, tady se zatím rozkoukávám :-)
Trochu tápu v těch symbolech, například state = !state - to mění logickou úroveň? Je nějaký symbol na změnu znaménka, místo dir = -1 * dir ?

_________________
jyrry.webnode.cz


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 5:40 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
Vypadalo by to potom nějak takto:

Citace:
void pulz(int pulz_uS, byte servo) {
static unsigned long last_micros=0;
unsigned long out_uS = micros();

if(last_micros=0) last_micros=out_uS;

if(out_uS-last_micros < pulz_uS)
{
digitalWrite(servo, HIGH);
last_micros=out_uS;
}
else
{
digitalWrite(servo, LOW);
last_micros=0
}


A ještě by se musela upravit v loop sekvence volání jednotlivých pulsů. Ale to je opravdu spíš takové cvičení, tak jak to máš je to pro daný účel v pohodě :-)

_________________
MC-20HOTT,DS-16,X10S,14SG,S-trino MkII,SpeedFire, Extra 102",MiniCorado,LOGO550SE,Goblin570


Naposledy upravil BoŠ dne úte 06.03.2018 6:01, celkově upraveno 1

Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 5:47 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
jyrry píše:
Jojo, na PICech to tak mám řešené přes přerušení, tady se zatím rozkoukávám :-)
Trochu tápu v těch symbolech, například state = !state - to mění logickou úroveň? Je nějaký symbol na změnu znaménka, místo dir = -1 * dir ?


state = !state - ano, jedná se o inverzi, použito většinou u dvoustavových proměnných unsigned char (většinou se je_nula změní na není_nula, fyzická interpretace záleží na datovém typu). Změnu znaménka s ohledem na možnost různých datových typů bych řešil raději tvým případem, tj. dir=-1*dir. Šlo by to řešit např. na binární úrovni, ale asi by to bylo zbytečné.

_________________
MC-20HOTT,DS-16,X10S,14SG,S-trino MkII,SpeedFire, Extra 102",MiniCorado,LOGO550SE,Goblin570


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 9:46 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
jyrry píše:
Trochu tápu v těch symbolech, například state = !state - to mění logickou úroveň? ....
Držel bych se ustáleného výrazu - negace - jak je uváděno v literatuře.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 10:44 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
ellet píše:
Držel bych se ustáleného výrazu - negace - jak je uváděno v literatuře.

No, nevím, jaká je skutečná interpretace pro jednotlivé datové typy, pro binár to určitě negace bude, pro unsigned char si nejsem jist.

_________________
MC-20HOTT,DS-16,X10S,14SG,S-trino MkII,SpeedFire, Extra 102",MiniCorado,LOGO550SE,Goblin570


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 11:53 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
BoŠ píše:
No, nevím, jaká je skutečná interpretace pro jednotlivé datové typy....
Odvolám se na Herouta. Booleovský výraz negace je "!" (v Pascalu - NOT) a interpretace je podle datových typů různá. V jazyku C je používán datový typ int, kde nulová hodnota znamená FALSE a nenulová hodnota (nejčastěji 0 ale není to podnínkou) je TRUE.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 12:01 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
ellet píše:
Odvolám se na Herouta. Booleovský výraz negace je "!" (v Pascalu - NOT) a interpretace je podle datových typů různá. V jazyku C je používán datový typ int, kde nulová hodnota znamená FALSE a nenulová hodnota (nejčastěji 0 ale není to podnínkou) je TRUE.


Jj, tak si to také nějak matně pamatuji. Jinak na boolean proměnné používám unsigned char, unsigned int je zbytečné plýtvání pamětí. Pokud chci ještě více šetřit, tak používám k záznamu stavu bitové pole a maskování, to je ale v těchto jednoduchých programech zbytečné.

_________________
MC-20HOTT,DS-16,X10S,14SG,S-trino MkII,SpeedFire, Extra 102",MiniCorado,LOGO550SE,Goblin570


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 12:17 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
BoŠ píše:
Jj, tak si to také nějak matně pamatuji. Jinak na boolean proměnné používám unsigned char, unsigned int je zbytečné plýtvání pamětí. Pokud chci ještě více šetřit, tak používám k záznamu stavu bitové pole a maskování, to je ale v těchto jednoduchých programech zbytečné.
Tomu rozumím, hrál jsem si roky s assemblerem, kde se to jinak nedělá (nebo nedělalo). Já bych se ale nechtěl chlubit, že si něco pamatuju, věk už mě nutí k častějšímu opakování a studiu. :)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 12:24 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
ellet píše:
Tomu rozumím, hrál jsem si roky s assemblerem, kde se to jinak nedělá (nebo nedělalo). Já bych se ale nechtěl chlubit, že si něco pamatuju, věk už mě nutí k častějšímu opakování a studiu. :)


Však píšu, že matně ... :D

_________________
MC-20HOTT,DS-16,X10S,14SG,S-trino MkII,SpeedFire, Extra 102",MiniCorado,LOGO550SE,Goblin570


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: úte 06.03.2018 23:14 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 28.2.2005
Příspěvky: 20822
Bydliště: Rakovník, CZ
Obrázky: 0
Trochu jsem si zapájel a stvořil pidiperiferie :mrgreen:
Příloha:
nano.jpg
nano.jpg
[ 107.87 KiB | Zobrazeno 5607 krát ]


vlevo 2x tlačítko, pak 2x LEDka, vpravo LEDka a trimr
je to kompaktní a neválí se mi toho chumel u klávesnice

_________________
jyrry.webnode.cz


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 07.03.2018 9:41 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
jyrry píše:
...je to kompaktní a neválí se mi toho chumel u klávesnice
Asi si to taky pořídím, za 27Kč - nekup to.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 07.03.2018 10:53 
Mazák
Mazák
Uživatelský avatar

Registrován: 21.9.2008
Příspěvky: 3152
Bydliště: Nové Mesto nad Váhom, SK
ellet píše:
Asi si to taky pořídím, za 27Kč - nekup to.


Poprosím o link, tiež ma to zaujalo...

_________________
Realistické RC modely - http://rcmodely.cevaro.sk


Nahoru
 Profil {RCalbum.cz}  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 104 ]  Přejít na stránku Předchozí  1, 2, 3, 4, 5, 6, 7  Další

 


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 5 návštevníků


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat 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 přikládat soubory v tomto fóru

Hledat:
Přejít na:  

 

  Powered by phpBB® Forum Software © phpBB Group  Český překlad – phpBB.cz 

 

NAVRCHOLU.cz