Odeslat nové téma Odpovědět na téma  [ Příspěvků: 98 ]  Přejít na stránku Předchozí  1 ... 3, 4, 5, 6, 7
Autor Zpráva
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 18:57 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 708
Bydliště: Vysočina
Tak ať je to komplet, ještě (trochu zjednodušená) funkční verze podle YenyaKase, t.j.bez nulování čítače. Při použití Arduino Mini Pro 3,3V (8MHz) vrací cca 1000 - 2000.
Kód:
volatile uint16_t prev_time;
volatile uint16_t XXX;
byte icpPin = 8;

void setup() {
Serial.begin(115200);
pinMode(icpPin,INPUT);
  TCCR1A = 0x00;     
  TCCR1B = 0x02;
  TIMSK1 = _BV(ICIE1);
}

ISR(TIMER1_CAPT_vect) {
        uint16_t duration = (ICR1 - prev_time);
        prev_time = ICR1;
        if (! bit_is_set(TCCR1B ,ICES1)) {
           XXX = duration;
        }
        TCCR1B ^= _BV(ICES1);       
}

void loop() {
  Serial.println(XXX); // tohle zrovna dobrý není :-(
}


Nahoru
 Profil  
 
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 21.03.2018 23:20 
Moderátor serveru
Moderátor serveru

Registrován: 28.2.2005
Příspěvky: 17124
Bydliště: Rakovník, CZ
Obrázky: 0
No, jestli tomu porozumím tak to někde použiju :?
Ale samozřejmě dík, pokusím se :-)

_________________
Aby mně mé záliby bavily, nemusím je brát kdovíjak vážně - jyrry.cbcnet.cz


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: čtv 22.03.2018 22:50 
Moderátor serveru
Moderátor serveru

Registrován: 28.2.2005
Příspěvky: 17124
Bydliště: Rakovník, CZ
Obrázky: 0
No a nakonec jsem si to zkusil "po strojařsku" :mrgreen:
A taky to funguje. Pro potřeby udělátek jako servospínač, řízení pumovnice a pod. to myslím stačí přebohatě:
Kód:
// servo cteni:

namespace {
  int puls_uS = 1500;
  unsigned long actual_uS;
}

void setup() {
  pinMode(2, INPUT_PULLUP); // vstup PWM
  pinMode(3, OUTPUT); // servo na ověření výstupu
  Serial.begin(9600); // jen na zkoušku, to tu nebude
}

void loop() {
  cti_puls();
  pulz(puls_uS);
  Serial.println(puls_uS); // jen na zkoušku, to tu nebude
}

void pulz(int pulz_uS) {            // generování impulzu pro servo
  actual_uS = micros() + pulz_uS;
  digitalWrite(3, 1);               // začátek servoimpulzu
  while (micros() < actual_uS ) { } // tohle snad nepoužívá přerušení
  digitalWrite(3, 0);               // konec servoimpulzu
  }

void cti_puls() { // načtení délky příchozího pulzu
  while (digitalRead(2) == 1){ }  // čeká na nulu
  while (digitalRead(2) == 0){ }  // čeká na signál
  actual_uS = micros();           // dočkal se
  while (digitalRead(2) == 1){ }  // čeká na konec pulzu
  puls_uS = micros() - actual_uS; // načte délku pulzu
}

_________________
Aby mně mé záliby bavily, nemusím je brát kdovíjak vážně - jyrry.cbcnet.cz


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

Registrován: 12.2.2016
Příspěvky: 708
Bydliště: Vysočina
jyrry píše:
No a nakonec jsem si to zkusil "po strojařsku" ...
No já bych se u podobných úloh taky přerušením vyhýbal (píšu to pořád dokola - přerušení jen když je opodstatněné). Zůstává mně ale utajeno, proč se vyhýbáš třeba čtení pulsu (pulseIn), když už teda nechceš používat knihovnu servo. (A tu bych v tomto případě asi použil také, protože m.j. posílá impuls s vhodným opakováním sama - pokud by se to teda s něčím nehádalo, což může být při více servech problém.)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: pát 23.03.2018 8:01 
Moderátor serveru
Moderátor serveru

Registrován: 28.2.2005
Příspěvky: 17124
Bydliště: Rakovník, CZ
Obrázky: 0
Hm, to pulseIn jsem zatím neobjevil :oops: ale teď to zkouším. Funguje ale řízené servo je nervoznější než s tím mým dřevním principem čtení (stále pochroustává).
Na té servo.h knihovně mi trochu vadí tohle:
http://navody.arduino-shop.cz/arduino-projekty/servo-motor.html píše:
Úhel se pohybuje nejčastěji v rozsahu 0° až 180°. Nastavení tohoto úhlu se provádí zasláním impulsu o určité délce. Neutrální poloha (90°) odpovídá obvykle délce impulsu 1,5ms. Délka 0,5ms odpovídá úhlu 0° a impuls délky 2,5ms nastavuje úhel 180°. Impulsy se posílají motoru pravidelně každých 20ms.
To je šité na robotická serva, pro "naše" se musí hlídat ten "teoretický" úhel (45° - 135°), ne délka v mikrosekundách (1000-2000).
Rámec (20ms) mi vlastně ohlídá ten vstupující PWM signál a nemusím ho tedy nijak hlídat. Prostě načtu délku pulzu, pak vyšlu svůj (případně postupně své, je-li jich víc jako v "pumovnici") a zbytek času čekám na nový příchozí puls. Netluče se mi tedy rámec vstupu a můj. Nebo se to musí nějak synchronizovat?

_________________
Aby mně mé záliby bavily, nemusím je brát kdovíjak vážně - jyrry.cbcnet.cz


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

Registrován: 12.2.2016
Příspěvky: 708
Bydliště: Vysočina
jyrry píše:
Hm, to pulseIn jsem zatím neobjevil :oops: ale teď to zkouším. Funguje ale řízené servo je nervoznější než s tím mým dřevním principem čtení ....
Pokud to tak je, leze ti do čtení přerušení z ostatního kódu. Uzavři pulseIn() mezi cli() a sei(). Určitě je to přesnější než tvoje smyčka (teď jsem to i ověřil - pro sichr).
Ta servo knihovna není někdy ideální. Problém ms versus úhel ale nechápu. Používám ve výpočtech co je výhodnější (většinou vycházím z délky pulsu). U tak jednoduchý úlohy jako je pumovnice se ale bez knihovny snadno obejdeš (a nakonec i na čtení pulsu by stačily dvě polohy a ještě je můžeš i vynechávat :) - záleží na požadavcích).


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: čtv 05.04.2018 21:14 
Moderátor serveru
Moderátor serveru

Registrován: 28.2.2005
Příspěvky: 17124
Bydliště: Rakovník, CZ
Obrázky: 0
Zase si trošku hraju, dorazily nové zásilky :-D
Příloha:
čtení_a_tisk_PWM.jpg
čtení_a_tisk_PWM.jpg [ 106.66 KiB | Zobrazeno 511 krát ]
Příloha:
čtení_a_tisk_PWM_2.jpg
čtení_a_tisk_PWM_2.jpg [ 105.3 KiB | Zobrazeno 504 krát ]

Jo, jasně, jsou to us, ne ms... :|

_________________
Aby mně mé záliby bavily, nemusím je brát kdovíjak vážně - jyrry.cbcnet.cz


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Arduino a servo
PříspěvekNapsal: stř 11.04.2018 23:42 
Moderátor serveru
Moderátor serveru

Registrován: 28.2.2005
Příspěvky: 17124
Bydliště: Rakovník, CZ
Obrázky: 0
Další hračka...
Dopracoval jsem se k tomu že přes to nemůžu/neumím řídit serva přímo časem; převádím mikrosekundy na poměrné délky PWM, vlastně nastavuji šířku impulzu v rámci:
Kód:
#include <Adafruit_PWMServoDriver.h>
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();

int puls_us = 1000;

void setup() {
  pwm.begin();
  pwm.setPWMFreq(50);
  delay(10);
}

void loop() {
    pwm.setPWM(0, 0, float (puls_us/5.109));
    delay(500);
  }

Tu konstantu 5.109 jsem vyšetřil zkusmo, měřením délky impulzu... Skáče to podle ní, nejde rozlišit kratší čas v mikroseknundách... :?

_________________
Aby mně mé záliby bavily, nemusím je brát kdovíjak vážně - jyrry.cbcnet.cz


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ů: 98 ]  Přejít na stránku Předchozí  1 ... 3, 4, 5, 6, 7

 


Kdo je online

Uživatelé procházející toto fórum: Google Adsense [Bot] a 4 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