Odeslat nové téma Odpovědět na téma  [ Příspěvků: 38 ]  Přejít na stránku Předchozí  1, 2, 3  Další
Autor Zpráva
PříspěvekNapsal: pát 09.03.2018 7:47 
Protřelejší uživatel
Protřelejší uživatel

Registrován: 14.11.2013
Příspěvky: 141
Bydliště: Trenčianske Teplice
Nie je lacný, ale dobrý:
https://www.topmodelcz.cz/index.php?&desktop_back=eshop&action_back=&id_back=0&desktop=eshop&action=zbozi_detail&id=18257

_________________
Graupner mx-20, pohony elektro, pohodové lietanie


Nahoru
 Profil  
 
 
PříspěvekNapsal: úte 13.03.2018 22:08 
Protřelejší uživatel
Protřelejší uživatel
Uživatelský avatar

Registrován: 5.4.2011
Příspěvky: 109
Bydliště: Jindřichův Hradec, ČR
Ahoj slowake,
děkuju za odkaz. Vypadá že tester toho umí hodně, ale jestli jsem dobře hledal, tak rychlost přeběhu umí jen v 4 nebo 6 stupních. To je nejspíš málo.

Jirka


Nahoru
 Profil  
 
PříspěvekNapsal: stř 14.03.2018 13:07 
Protřelejší uživatel
Protřelejší uživatel

Registrován: 14.11.2013
Příspěvky: 141
Bydliště: Trenčianske Teplice
Medved74 píše:
Ahoj slowake,
děkuju za odkaz. Vypadá že tester toho umí hodně, ale jestli jsem dobře hledal, tak rychlost přeběhu umí jen v 4 nebo 6 stupních. To je nejspíš málo.

Jirka

Áno, rýchlosť oscilácie serv sa dá nastaviť v šiestich stupňoch.

_________________
Graupner mx-20, pohony elektro, pohodové lietanie


Nahoru
 Profil  
 
PříspěvekNapsal: čtv 15.03.2018 20:01 
Mecenáš serveru
Mecenáš serveru
Uživatelský avatar

Registrován: 18.3.2010
Příspěvky: 2878
Bydliště: Zavar, SK
Chlapci, vy ste tu taky šikovný v programovaní: nejako som sa dokopal k tomu, aby som cyklovanie serva strčil do prerušenia ( keďže vykresľovanie dispeja je príííšerne pomalé ), ale občas mi servo ako keby zakmitne. Nehodili by ste očkom po tom mojom kóde, či tam nemám nejakú vyloženú kravinu?
Malo by to bežať na Timer2 a keďže je len 8-bitový, tak interrupt beží na 1ms a 20ms z toho robím cez premennú citac .

Servotester SETUP píše:
void setup() {

// set up Timer 2
TCCR2A = 0; // normal operation
TCCR2B = bit(WGM22) | bit (CS22); // CTC, scale to clock / 256
OCR2A = 124; // compare A register value (256 * clock speed / 125)
TIMSK2 = bit (OCIE2A); // interrupt on Compare A Match

...


Servotester INTERRUPT ROUTINE píše:
ISR(TIMER2_COMPA_vect)
{ // zaciatok prerusenia
noInterrupts();
citac++;
if ( citac >= 20)
{
citac = 0;
static boolean state = false;
state = !state; // toggle
digitalWrite (LED, state ? HIGH : LOW);

if( val <= 0)
outservo = map(val, -100, 0, MinRange, MidRange); // scale it to use it with the servo (value between 0 and 180)
if( val > 0)
outservo = map(val, 0, 100, MidRange, MaxRange); // scale it to use it with the servo (value between 0 and 180)
myservo.writeMicroseconds(outservo); // set servo to mid-point
...
...
interrupts();
} // koniec prerusenia


_________________
X9D & T16Pro & TX16S & nejaké lietadlá, heli a koptéry www.rcmodelytt.sk


Nahoru
 Profil  
 
PříspěvekNapsal: pát 16.03.2018 22:30 
Mazák
Mazák
Uživatelský avatar

Registrován: 26.5.2013
Příspěvky: 1538
Bydliště: Brno
Jak je definována val? Je to globální proměnná? Jak je plněna?

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


Nahoru
 Profil  
 
PříspěvekNapsal: sob 17.03.2018 8: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
Mně celkem funguje (viz. název vlákna) toto:
Kód:
// servo rozsah a rychlost pohybu @ Arduino nano:
  int dir = 1;
  unsigned int min_uS = 1000;
  unsigned int max_uS = 2000;
  unsigned int puls2_uS = 1500;
  unsigned int wide_uS = 500;
  static unsigned int neutral_uS = 1500;
  static unsigned long period_uS = 20000;
     
  void setup() {
  pinMode(2, OUTPUT); // servo 1 @ pin 2 (servo s pohybem dle poťáku - klasický servotester)
  pinMode(3, OUTPUT); // servo 2 @ pin 3 (servo s rozkmitem a rychlostí dle poťáků)
  pinMode(4, OUTPUT); // servo 3 @ pin 4 (servo s trvalým neutrálem)
  pinMode(A1, INPUT); // potak1 @ pin A1
  pinMode(A5, INPUT); // potak2 @ pin A5
  }

void loop() {
  unsigned long aktual_uS = micros();
  unsigned int puls1_uS = analogRead(A1) + min_uS;
  unsigned int step_ = ( puls1_uS - min_uS ) / 10;
  wide_uS = analogRead(A5)/2;
  puls2_uS = puls2_uS + dir * step_;
  if (puls2_uS >= (neutral_uS + wide_uS) || puls2_uS <= (neutral_uS - wide_uS)) {
    puls2_uS = puls2_uS - dir * step_; 
    dir = -1 * dir;
  }
  pulz(puls1_uS, 2);
  pulz(puls2_uS, 3);
  pulz(neutral_uS, 4);
  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);
  }

Jasně, jde to udělat jinak a lépe ale mně na tom baví to že i tak to funguje :-)
No a chtěl jsem nepotřebovat tu knihovnu servo.h

_________________
jyrry.webnode.cz


Nahoru
 Profil  
 
PříspěvekNapsal: sob 17.03.2018 9:33 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 22.3.2007
Příspěvky: 4778
Bydliště: SK Bratislava
https://www.arduino.cc/reference/en/lan ... roseconds/


Nahoru
 Profil  
 
PříspěvekNapsal: sob 17.03.2018 18:39 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
Nevím co tam všechno máš ale TCCR2B bit WGM22 dle datasheetu ATmega328, nastavuje režim 4 (rezervováno) asi by mělo být:
TCCR2A | = (1 << WGM21); // režim 2, CTC
TCCR2B | = (1 << CS22);
Nemusí to být ale tím. Používat přerušení ve vyšších programovacích jazycích bývá problém. Je potřeba znát, které funkce používají rovněž přerušení a to z fragmentu kódu ani poznat nelze. A zákaz přerušení v přerušení by bylo další téma.


Nahoru
 Profil  
 
PříspěvekNapsal: sob 17.03.2018 20:47 
Mecenáš serveru
Mecenáš serveru
Uživatelský avatar

Registrován: 18.3.2010
Příspěvky: 2878
Bydliště: Zavar, SK
Chlapci, díky za všetky pripomienky, konečne to chodí jak má, HURÁÁÁ.
Takže po poradí:
ellet píše:
Nevím co tam všechno máš ale TCCR2B bit WGM22 dle datasheetu ATmega328, nastavuje režim 4 (rezervováno) asi by mělo být:
TCCR2A | = (1 << WGM21); // režim 2, CTC
TCCR2B | = (1 << CS22);
...
A zákaz přerušení v přerušení by bylo další téma.

Zákaz prerušení som tam dal ako posledný zúfalý pokus zabrániť nejakým hazardom, ale na funkci rostlináře to nemělo vliv, blblo to aj predtým. Už je odtiaľ preč
Ten setup pre Timer2 som vybádal z nejakých tutoriálov v hodne vyskej nočnej hodine, chodilo to. Do datasheetu som bol lenivý pozerať. Ten Tvoj setup bol brutál rýchly, takže som na rýchlo spravil prienik z môjho a Tvojho setupu a vzniklo toto:
Timer2 SETUP píše:
...
TCCR2A = (1 << WGM21); // režim 2, CTC
TCCR2B = bit (CS22)| bit (CS21)| bit (CS20);
OCR2A = 155; // approx 10ms
TIMSK2 = bit (OCIE2A); // interrupt on Compare A Match
...

Asi sa budem musieť predsa len pozrieť do datasheetu, keďže osciloskop doma nemám, ergo či prerušenie beží na 1ms ( 20ms s citac ) zatiaľ odhadujem len tak okometricky pohľadom na LEDku, akože mohla by blikať 25x za sekundu :mrgreen:
Trochu som si upravil ten program od jyrry, napriek tom, že by sa tuším delay nemal používať v interrupte, tak to beží:
pulz píše:
void pulz(int pulz_uS, byte servo) {
unsigned long out_uS = micros();
digitalWrite(servo, HIGH);
delayMicroseconds(pulz_uS);
digitalWrite(servo, LOW);
}

S
while (micros() - out_uS <= pulz_uS){}
to nebežalo :roll:
Inak si myslím, že problém bol kdesi medzi Servo.h a mojím prerušením, z času na čas sa proste nemali radi...
Keď sa dokopem k nejakému videu, tak sem dám, že by ste videli, čo som páchal.
Ešte raz vďaka.

_________________
X9D & T16Pro & TX16S & nejaké lietadlá, heli a koptéry www.rcmodelytt.sk


Naposledy upravil ddano007 dne sob 17.03.2018 21:27, celkově upraveno 2

Nahoru
 Profil  
 
PříspěvekNapsal: sob 17.03.2018 21:07 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
ddano007 píše:
Ten Tvoj setup bol brutál rýchly, takže som na rýchlo spravil prienik z môjho a Tvojho setupu a vzniklo toto...
Co jsem napsal bylo míněno jen jako oprava dvou řádků a to tak aby bylo zachováno tvoje nastavení (/64). Nic jsem nepočítal (taky nevím jaký používáš "hodiny") ale hlavně že to chodí! A datasheet je fakt základ. :)
A ještě - delay() a delayMicroseconds() není, z hlediska přerušení, jedno a totéž. (Popsáno na www.arduino.cc)


Nahoru
 Profil  
 
PříspěvekNapsal: sob 17.03.2018 23:03 
Mecenáš serveru
Mecenáš serveru
Uživatelský avatar

Registrován: 18.3.2010
Příspěvky: 2878
Bydliště: Zavar, SK
Chlapci, akým spôsobom sa handluje v Arduine prerušenie: nuluje sa požiadavka na prerušenie pri vbehnutí do prerušenia, alebo pri vybehnutí z prerušenia?
Dôvod mojej otázky: Timer2 mi beží na 1ms a generuje prerušenie. Napočítam 20 prerušení a cez delayMicroseconds generujem stále v prerušení až, povedzme, 2500us pulz pre servo. Ergo za tú dobu sa mi 2x reloadne Timer2 a nastaví flag prerušenia.
Ak sa požiadavka na prerušenie nuluje na konci obsluhy prerušenia, tak je to OK, ale ak na začiatku, tak vyletím z prerušenia a idem doň zas. Aká je správna odpoveď?

_________________
X9D & T16Pro & TX16S & nejaké lietadlá, heli a koptéry www.rcmodelytt.sk


Nahoru
 Profil  
 
PříspěvekNapsal: sob 17.03.2018 23:45 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 22.3.2007
Příspěvky: 4778
Bydliště: SK Bratislava
Mas to zhruba naopak ako by to malo byt, zaciatok pulzu by mal byt "zvonka" prerusenia, potom si nastavis timer na prislusnu dobu a ked pride prerusenie tak impulz ukoncis

ak mas delay v preruseni (nechapem preco, nevidim dovod, ale to je tvoj problem), musis si byt isty ze stihas, znamena ze za dobu pulzu ti dalsie nepride (to sa da ale potom je zase otazka naco to prerusenie vlastne mas ked si vlastne mohol cakat) ... a pokial by si to urobil spravne multiprocesorovo, to znamena ze kriticke veci vyriesis prve, potom povolis prerusenia a az potom zacnes robit delay, tak narazis na problem ze ti bude servami trhat ked ti tam niekde v impulze vznikne prerusenie

mimichodom ked si pozries servo library, zistis ze sa tam dost vela robi s casovacmi a preruseniami, takze ak to chces kombinovat z inymi preruseniami od casovacov, treba si dat pozor


Nahoru
 Profil  
 
PříspěvekNapsal: ned 18.03.2018 0:05 
Mecenáš serveru
Mecenáš serveru
Uživatelský avatar

Registrován: 18.3.2010
Příspěvky: 2878
Bydliště: Zavar, SK
1, prerusenie potrebujem, aby som casoval 20ms mimo hlavnu slucku, kde mam obsluhu displeja, ktora trva desatiny sekundy.
2, podla datasheetu pri vleteni do interruptu zablokuju vsetky prerusenia a odblokuju az s reti. Pokial to v prgrame nie je zmenene.
3, to, ze pocas interruptu sa mi reloadne Timer2 nie je problem, len neviem, kedy sa nuluje interfupt flag pre Timer2; na zaciatku obsluhy prerusenia, ci na konci?

_________________
X9D & T16Pro & TX16S & nejaké lietadlá, heli a koptéry www.rcmodelytt.sk


Nahoru
 Profil  
 
PříspěvekNapsal: ned 18.03.2018 10:10 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 1975
Bydliště: Vysočina, ČR
Nebudu ti to kritizovat, protože bych měl pocit, že bych měl vytvořit něco lepšího a to se mně teď nehodí.
Jdeš na to moc rychle a nechce se ti moc číst manuál, jak píšeš. A to není dobrá kombinace. Protože se jedná o programování v reálném čase, není to úplně triviální záležitost a přerušení by mělo být vždycky co nejkratší. (Promiň trochu kritiky)
Ale k tvé otázce. Odpověď je v datasheetu ale možná trochu skrytá, proto tedy ještě odpovím. Mazání příznaků přerušení je hardwarová záležitost a proto nemůže být automaticky provedena jinde než vstupem do přerušení. Návrat z přerušení je assemblerovskou instrukci reti, která z hlediska přerušení pouze povolí globální přerušení. Můžeš ale ovlivnit příznakové bity před koncem rutiny sám. Je tam drobné riziko, mohlo by dojít k události nastavující flag ještě před výstupem z rutiny.
(Chce to literaturu, hezky to ve svých knížkách popisuje David Matoušek. Čím dřív, tím líp. Zápal ti nechybí, stejně si ji koupíš :) )


Nahoru
 Profil  
 
PříspěvekNapsal: ned 18.03.2018 11:18 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 3.5.2003
Příspěvky: 11187
Bydliště: Břeclav, ČR
Navrhuji ispirovat se tu: https://manuals.velleman.eu/category.php?id=98

Jsou tam knihovny k řízení serv v robotovi. Umí to až osmnáct serv najednou.

Aktivuješ potřebný počet serv a přiřadiš je na výstupní piny. Tím pádem už mají PPM. Pak je tam rutina, kterou nastavíš cílovou polohu ve stupních serv, které mají popojet. A pak rutina, kterou když spustíš s parametrem doba v milisekundách tak serva přemístí patřičnou rychlostí do požadovaných poloh.

A z toho už si jednoduše sestavíš jakýkoliv pohyb jakoukoliv rychlostí.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 38 ]  Přejít na stránku Předchozí  1, 2, 3  Další

 


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 13 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