Odeslat nové téma Odpovědět na téma  [ Příspěvků: 17 ]  Přejít na stránku 1, 2  Další
Autor Zpráva
 Předmět příspěvku: Servoreverz s ATtiny25
PříspěvekNapsal: ned 12.05.2024 0:04 
Mazák
Mazák
Uživatelský avatar

Registrován: 23.4.2010
Příspěvky: 10572
Bydliště: Nový Bydžov ČR
Obrázky: 14
Potřeboval jsem na REX7 ještě jeden kanál a tak jsem dal vztlakovky, původně každá na jednom kanálu na společnej kanál přes Y kabel. No a klasika, jedna vztlakovka chodí nahoru, druhá dolů. Nechtělo se mě kuchat zalepený servo z křídla naví v servech jsou vývody motoru a potenciometru přímo zapájený do plošáku, tak by obrátit výchylky stejně moc dobře nešlo.
Protože mi po jiným projektu zbylo pár ATtiny25 SMD, tak jsem zkusil naprogramovat servoreverz do procíku. Je to pár řádků, vstupní impulzy se měří přes přerušení a z délky impulzu se dělá přes mapování reverzní hodnota výstupního servopulzu. Vstup je na PB2, výstup na PB1. Teplotně to je naprosto stabilní.
Je to na malý destičce 8 x 10 x 3 mm, (původně redukce SOIC na DIL) kromě ATtiny25 tam je jen odpor 10k z Vcc do resetu a je tantal 10u/10V z Vcc na GND. Chodí to od 2,2 do 5,5V. S naprogramováním a zapájením celkem 3 hodiny práce.
Mám ještě verzi, že si umí změřit opakovací periodu servopulzů pro rádia, co mají pro digi serva opakovací periodu menší než 20ms. A podle toho dělá reverz s opakováním jako má vstup. Ale tohle nemám pořádně odzkoušený, už se to do celkem malý paměti ATtiny25 nevejde, byl by potřeba ATtiny85.
Kód:
#include <Servo_ATTinyCore.h>
Servo myServo;  // servo objekt

volatile unsigned long startPulse, endPulse;
volatile bool isHigh = false;

// Interupt rutina
ISR(PCINT0_vect) {
  if (digitalRead(PB2) == HIGH) {
    startPulse = micros();        // ulož si začátek pulzu
    isHigh = true;                   // je vzestupná hrana
  } else if (isHigh) {
    endPulse = micros();          // ulož si konec pulzu
    isHigh = false;
  }
}
void setup() {
  pinMode(PB2, INPUT);      // pin vstupu impusů
  GIMSK |= _BV(PCIE);       // povolit interupt při změně stavu PB2
  PCMSK |= _BV(PCINT2);     // povolit přerušení pro pin PB2
  pinMode(1, OUTPUT);       // PB1 jako výstup
  myServo.attach(1);        // přiřaď servo na pin PB1
}

void loop() {
  unsigned long pulseLength = endPulse - startPulse;  // spočítej délku změřeného servoimpulzu
  unsigned long outputPulse = map(pulseLength, 800, 2200, 2200, 800); // Reverz mapa
 
  myServo.writeMicroseconds(outputPulse);   // řízení reverzovaného serva
  delay(20);                                // zpoždění pro opakování po 20 ms
}


Kdyby jste náhodou někdo našel něco, co se vám na tom nebude zamlouvat, tak sem s tím.


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: ned 12.05.2024 18:38 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 2000
Bydliště: Vysočina, ČR
Tohle se dá řešit mnoha způsoby (i bez přerušení). Ale když už, tak bych použil INT0 na náběžnou hranu. Načetl stav čítače, potom kontroloval kdy hrana spadne. Tím zjistím šířku a po kontrole (jestli je větší než 1 ms) ještě v přerušení odešlu puls na příslušný pin. Vyhodil bych všechny knihovny (na co servo?) a smyčka loop by mohla být prázdná. Ušetří to spoustu místa. Jen nevím, jestli bude fungovat delayMicroseconds() pro odeslání pulsu v přerušení. Pokud ne, odeslal bych puls po návratu z přerušení. Dělal jsem něco podobnýho v C, tam jsem použil vlastní měření a kód mám podstatně kratší. (Arduino si s tím poradí taky.)
Přerušení má být sice krátký, tady na tom ale nezáleží, protože to nic jiného stejně nedělá a času do další náběžné hrany je dost.

Takže něco jako: (v Cit mám délku pulsu, t.j. bez micros())
ISR(INT0_vect) {
Cit = 0;
while ((PINB & (1 << PINB2)) > 0) { ++Cit;}
.
.
.
}


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: úte 14.05.2024 16:45 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 2000
Bydliště: Vysočina, ČR
Nic neříkáš, tak jsem zachoval co máš, jen jsem to trochu přehrabal a něco vyházel. Je to menší a nezávislé na opakovacím rámci. (Když budeš chtít, napíšu to ale znovu podle svých představ. :mrgreen: )
Kód:
volatile unsigned long startPulse, endPulse;
volatile bool isHigh = false;

ISR(PCINT0_vect) {
  if (digitalRead(PB2) == HIGH) {
    startPulse = micros();        // ulož si začátek pulzu
                                  // je vzestupná hrana
  } else {
    endPulse = micros();          // ulož si konec pulzu
    isHigh = true;
  }
}
void setup() {
  pinMode(PB2, INPUT);      // pin vstupu impusů
  GIMSK |= _BV(PCIE);       // povolit interupt při změně stavu PB2
  PCMSK |= _BV(PCINT2);     // povolit přerušení pro pin PB2
  pinMode(1, OUTPUT);       // PB1 jako výstup
}

void loop() {
  unsigned long pulseLength = endPulse - startPulse;  // spočítej délku změřeného servoimpulzu
  unsigned long outputPulse = map(pulseLength, 800, 2200, 2200, 800); // Reverz mapa

  if (pulseLength>799 && pulseLength<2201 && isHigh) {
   PORTB |= (1<<PORTB1);   //puls serva
   delayMicroseconds(outputPulse);
   PORTB &= ~(1<<PORTB1);
   isHigh = false;                           
  }
}

Ještě jsem zapomněl vyhodit ten map. Mělo by stačit:
outputPulse = 3000 – pulseLength
(možná 3000 trochu upravit)


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: úte 14.05.2024 18:16 
Mazák
Mazák
Uživatelský avatar

Registrován: 23.4.2010
Příspěvky: 10572
Bydliště: Nový Bydžov ČR
Obrázky: 14
No nereagoval jsem, včera bylo nutný uklidit náklaďák dříví z ulice do sušáku na dvoře. Když jsem to dodělal, tak jsem se akorát tak svalil do postele, jelikož bólel celej člověk. :)
Tak ten původní code chodí jen s analogovejma servama. Digitály nahodile hrajou okolo neutrálu. Podle zajícočítače, když je vstup přesně 1,5ms, tak na výstupu to kolísá mezi 1,504 až 1,516ms. A vím proč, záleží v jakým okamžiku micros přijde přerušení od vzestupný a pak sestupný hrany. Obojí může dělat chybu až 2 micros, takže v extrému je to až 4 micros. No a na výstupu to je podobný a dohromady to je nakvadrát. A při každým následným čtení se to může změnit z maxima na minimum či naopak, takže to pak nahodile komíhá tak 1 stupeň na páce, po zpřevodování na kormidla to už je dost znát. Zajímavý ale je, že analogům to nevadí, digitálům jo.
Díky, že ses tím zaobíral ale ani to Tvoje měření vstupu nebude chodit přesně. Aby to měřilo správně, muselo by se použít něco aspoň 5 x lépe 10 x rychlejší, než je micros. Jenže to u ATtiny85 nejde, jelikož 1uS je u 8MHz krystalu nejvyšší kmitočet, kterým lze plnit časovač.
Jedinná možnost pokud nedat jinej procák co jede rychleji, zkusit při vzestupný vynulovat časovač a při sestupný ho načíst. Pak to bude měřit s přesností 1us, tedy aspoň si to myslím.
Kód:
volatile unsigned long pulseWidth; // Proměnná pro uložení délky impulzu
volatile bool isRisingEdge = false; // Indikátor vzestupné hrany

void setup() {
  // Nastavení pinu pro vstup signálu serva
  pinMode(PB2, INPUT_PULLUP);

  // Nastavení časovače 1
  TCCR1A = 0; // Nastavíme časovač 1 jako normální režim
  TCCR1B = _BV(CS10); // Nastavíme předdělič na 1 (žádný předdělič)
  TIMSK1 |= (1 << ICIE1); // Povolíme Input Capture přerušení
}

void loop() {
  // Zde dopsat generování výstupních impulzů.
}

// Interrupt rutina pro zachycení změn na vstupním signálu
ISR(TIMER1_CAPT_vect) {
  // Pokud nastane vzestupná hrana
  if (isRisingEdge == false) {
    TCNT1 = 0; // Vynulujeme časovač
    isRisingEdge = true; // Nastavíme indikátor vzestupné hrany
    TCCR1B |= (1 << ICES1); // Nastavíme časovač, aby sledoval sestupnou hranu
  }
  // Pokud nastane sestupná hrana
  else {
    pulseWidth = TCNT1; // Uložíme hodnotu časovače, což odpovídá délce impulzu
    isRisingEdge = false; // Nastavíme indikátor sestupné hrany
    TCCR1B &= ~(1 << ICES1); // Nastavíme časovač, aby sledoval vzestupnou hranu
  }
}


Nic přesnějšího na měření délky pulzu asi na ATtiny nevymyslíme. Jenže TCNT1 je jen 8 bitů, což při plnění 1us na 2,2ms nestačí, takže zpátky na stromy. :roll:
Jestli se Ti ellete chce něco napsat lepšího, tak sem s tím. Ale měj na paměti, že problém je měření a né v generování výstupu. Kolísání 4us na vstupu serva už pěkně vrčí a komíhá asi cca 1 stupeň.


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: úte 14.05.2024 20:01 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 2000
Bydliště: Vysočina, ČR
No, to není moje měřní, já jsem tam záměrně nechal tvoje měření a psals, že to vyhovuje. Já to měřím vlastní konstrukcí a zákmity nevidím ani na digi servech. Je to ale složitější na nastavení a hodiny mám16,5MHz. Ta konstrukce prostě není dobrá. Zkus tohle, i když je to taky s micros(), nemůže se to moc chvět.
Příloha:
servo_inv.zip [526 bajtů]
25 krát


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: úte 14.05.2024 23:21 
Mazák
Mazák
Uživatelský avatar

Registrován: 23.4.2010
Příspěvky: 10572
Bydliště: Nový Bydžov ČR
Obrázky: 14
Takže tam máš externí krystal 16,5MHz s keramikama 22p na GND?
Zkusil jsem to na interní RC 8MHz a ono to opravdu necuká. Tedy pokud dáš normální a reverzovaný digitální servo vedle sebe a opřeš se lehce o páčky, tak to nepatrně je u reverzovanýho serva cítit, že malinko chvěje. Ale ten krystal 16MHz nemá vliv na rychlost micros, nebo jo?
Díky moc, už jsem s tím chtěl fláknout do kouta.


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: úte 14.05.2024 23:34 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 2000
Bydliště: Vysočina, ČR
Celeron píše:
Takže tam máš externí krystal 16,5MHz...
Ne, můžu to nastavit přímo v Arduino IDE. Procesor to umí i bez krystalu. Můžu ti poskytnout ještě lepší verzi (bez micros), ale musel bych to trochu "zuniverzálnit" (i na 8MHz).


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: stř 15.05.2024 0:31 
Moderátor serveru
Moderátor serveru
Uživatelský avatar

Registrován: 22.3.2007
Příspěvky: 4795
Bydliště: SK Bratislava
To male arduino nepoznam, ale na 328 sa da vystup urobit na PWM vystupe, treba zistit ci staci rozlizenie. Ak to leze von hardverovo, nie je problem s vrcanim kvoli preruseniam. Mam to tak v jednej aplikacii urobene a nic nevrci, o nic sa programovo nestaram, len uplne asynchronne (je to vsetko bufrovane) prislusne nastavim dlzku impulzu a ten potom frci do nasledujucej zmeny.

Na vstupe treba zistit ci nenastalo v priebehu merania prerusenie od casovaca (treba pozriet ci sa nezmenil cas systemu) ak ano, bude tam oneskorenie a treba impulz zahodit. To by som volil normalnym poolovanim v loope a bud vhodne zabrzdil prerusenia, alebo zistil ci pocas testu neprebehlo prerusenie od T0 napriklad tak ze sa pozriem na milis() ( alebo pri rychlych hodinach lepsie pozriet na nejaku vnutornu premennu pocitajucu prerusenia (overflovy) ak sa nemylim je to timer0_overflow_count).

milis() pocita prerusenia, ak sa zmenilo, bolo prerusenie a je dobre impulz zahodit. mikros() bezi aj ked prerusenie nenastalo, lebo cita stav prescalera a pripocitava k milis() (zjednodusene povedane) takze v loope sa da krasne ohlalit ci taky prieser nastal alebo nie.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: stř 15.05.2024 12:34 
Mazák
Mazák
Uživatelský avatar

Registrován: 23.4.2010
Příspěvky: 10572
Bydliště: Nový Bydžov ČR
Obrázky: 14
ellet píše:
Ne, můžu to nastavit přímo v Arduino IDE. Procesor to umí i bez krystalu. Můžu ti poskytnout ještě lepší verzi (bez micros), ale musel bych to trochu "zuniverzálnit" (i na 8MHz).

Aha, tak ty nastavuješ PPL 16,5MHz tweaked. Předpokládám, že programuješ ATtiny v IDE přímo z ISP štekru z Arduino Uno. Pak se kromě Flash napečou podle nastavení v IDE taky Fuses. Jo tak to mi nechodí, programuju přes USBASP z Bascomu. Když v něm koukám na Fuse, tak má hodnotu E2 a v bitech FEDCBA je 1000101 což je interní RC 8MHz. Když se podívám na nabízený možnosti oscilátorů, tak tam víc než 8MHz není. Ale je tam možnost PPL Clock bez specifikace kmitočtu. Jenže je tam celkem 4x a to:
000001
010001
100001
110001
Takže nevím, kterej zvolit. Mám trochu obavu, aby špatná volba neblokla ATtiny a pak nešel programovat. Sice mám ubaslelenj HVresetátor, kterým se ATtiny dají natlačit do výrobního defaultu ale prý to je trochu riziková operace.
Jestli dáš ten ještě lepší FW, budu rád, aspoň se poučím jak se to dá dělat jinak.
Díky!


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: stř 15.05.2024 15:18 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 2000
Bydliště: Vysočina, ČR
Podle datasheetu to vypadá na bit 0..5 Fuse Low Byte. 0001 je High Frequency PLL Clock, bity 4..5 je náběh. Použil bych 110001 (pomalý náběh a 8x8=64 a 64MHz/4=16MHz popis v datasheetu).
Ten soft musím "vypreparovat". Dělal jsem asi před 5-ti roky mixer ze dvou nezávislých zdrojů. Musel jsem použít 2 přerušení a naučit je "aby se spolu uměly domluvit". Dalo to víc práce než jsem čekal.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: stř 15.05.2024 17:35 
Mazák
Mazák
Uživatelský avatar

Registrován: 23.4.2010
Příspěvky: 10572
Bydliště: Nový Bydžov ČR
Obrázky: 14
Půjčil jsem si fabrickej servoreverz, co se prodává na Ali. Chodí ale na digitálech cuká jako to cukalo mě. Je tam taky nějakej osminohej procák, stabilík a dva elyty a jeden odpor. Nepoužitelný, nikdo to nekupujte!!!!
Prodej ten svůj necukavej reverz PRCákovi, budeš v laufu. :mrgreen:
Jestli postíš i ten další reverz, rád se na to kouknu abych viděl práci s registrama.
Jinak já mám hotovo, vlastní reverz je menší než servosamec.


Přílohy:
IMG_20240515_172718.jpg
IMG_20240515_172718.jpg
[ 44.49 KiB | Zobrazeno 445 krát ]

Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: stř 15.05.2024 19:37 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 2000
Bydliště: Vysočina, ČR
Hezký provedení. Nemůžu nepomoct "spolužákovi", který taky studoval automatizaci (i když jsem teda o dost starší a úplně odjinud). Tak jsem nic nerozhrabával a nacpal jsem ty "moje postřehy" do programu co už máš. Je to připravený na 8MHz hodiny. Kontroloval jsem pulzy na levném osciloskopu…no, když tak si to uprav. U rychlejších hodin musíš pár čísel vynásobit. Neslibuj si nic poučnýho ani světobornýho. Mně se na tom líbí to, že hex má jen cca 440B (v jednoduchosti je krása), dalo by se proto lecos přidat (2 výstupy a mix …) a že to funguje, jak zhruba potřebuju.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: stř 15.05.2024 19:51 
Mazák
Mazák
Uživatelský avatar

Registrován: 23.4.2010
Příspěvky: 10572
Bydliště: Nový Bydžov ČR
Obrázky: 14
Zajímavý. Kdo umí ten umí. :) Díky, jdu to študovat, co tím chtěl autor říci.


Nahoru
 Profil Soukromé album {RCalbum.cz}  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: pon 20.05.2024 11:33 
Mazák
Mazák
Uživatelský avatar

Registrován: 12.2.2016
Příspěvky: 2000
Bydliště: Vysočina, ČR
Trošku varování, není to pro každé použití. Trpělivě jsem si s tím hrál (16MHz a bez micros() ). Na cca 15 cm dlouhé špejli na páce serva občas vidím drobný "nepokoj". Dá se to omezit třeba zavedením pásma necitlivosti ….
Lepším řešením by bylo použít 16 bit čítač, ten ale tento procesor nemá.


Nahoru
 Profil  
 
 Předmět příspěvku: Re: Servoreverz s ATtiny25
PříspěvekNapsal: úte 21.05.2024 21:13 
Celkem nový uživatel
Celkem nový uživatel
Uživatelský avatar

Registrován: 21.5.2003
Příspěvky: 57
Obrázky: 3
Doporučujem pozrieť toto video:
https://youtu.be/648Tx5N9Zoc


Nahoru
 Profil Soukromé album  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 17 ]  Přejít na stránku 1, 2  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