(upravil mechanik 5. 5. 2020 10:12)

Téma: Arduino, dialkové ovládanie, seriový monitor

Mám taký divný problem s arduinom (prakticky C++). Všimol som si že po cca 20 prijatych kódoch tlačítka, keď ho nepretržite držím prestane na dalšie reagovať.

Dal som si vypisovať kódy po seriovom monitore. Príde prvý kód tlačítka. Potom asi prvých 20 kódov pre funkciu opakovania. No a potom zrazu sa to správa ako keby som tlačitko prestal držať. Žiadne nové kódy. Keď ho pustím a znovu stlačím postup sa opakuje. Divné tiež je že občas príde kód opakovania 18x. Občas 20. Občas cez 20.

Ja potrebujem aby sa kód prijmal celý čas kým tlačítko držím. Pretože takto regulujem hlasitosť po krokoch 0,5db a po cca 10db to prestane reagovať a musím tlačítko pustiť a stlačiť znovu sad

Napadá niekoho v čom je problem? Myslel som si že jediné čo budem musieť riešiť je tá blbá funkcia opakovania. Ale že to po 20 kódoch záhadne prestane reagovať by som nečakal. Inak som skúšal rovno 3 DO a je to to isté. Mám SEKI, apple aj nejake malé plastové k arduinu.

Že by problem s knižnicou? Ale nahadzujú sa nejako divne. Neviem ako zvoliť inú knižnicu pre DO keď som nahral neskôr ešte druhú... Proste ich tam všetky nevidím vypísané s možnostou výberu.

(upravil laco 5. 5. 2020 10:50)

Re: Arduino, dialkové ovládanie, seriový monitor

mas to cez prerusenie (interrupt) ?

(upravil mechanik 5. 5. 2020 11:26)

Re: Arduino, dialkové ovládanie, seriový monitor

Fakt to IR nemám na interrupt pine. Včera som skúšal tie piny prehodiť. No dnes zistujem že som to omylom ani na druhý krát nedal na interrupt pin... Ale aj tak neviem, čo môže rušiť beh programu na pine bez interrupt keď ten program je len vypisovanie kódov z DO v seriovom monitore? Každopadne skúsim, dík.

Re: Arduino, dialkové ovládanie, seriový monitor

možná ten běh programu "ruší"  vlastní smyčka programu. Jediná možnost je použít int. pin, a zajistit, aby se to přerušení fakt využívalo, jenom nastavení na tenhle pin nestačí, teda pokud to nezajistí knihovna. Co používáš za knihovnu?  - pokud jich máš víc, tak se snad jinak jmenují a tím pádem jsou v jiných adresářích, nebo ne? potom je řešení zadat cestu ke knihovně absolutně. A nebo prostě ten druhej adresář smazat (přesunout tam, kam ide "nevidí") Obvykle je potčeba trochu prozkoumat příklady a pípadnou dokumentaci, nebo aspoň komentáře v souborech knihovny, teda pokud tam jsou...

(upravil laco 5. 5. 2020 19:23)

Re: Arduino, dialkové ovládanie, seriový monitor

nemusis pouzivat  specialne piny INT0 a INT1, kazdy pin ma PCINT. ide o kod a kniznice, ci pouzivaju INT alebo POLLING

INT refers to the dedicated hardware interrupt pins. PCINT refers to the interrupts that can be generated by almost any of the I/O pins.
PCINT has more overhead in determining what pin caused the interrupt as a group of pins share the same PCINT vector (there are 3 PCINT vectors) so you need to determine what pin caused the interrupt withing the ISR before acting on it.
The INT pin is linked to a dedicated interrupt vector so you always know what pin caused the interrupt when in the ISR.

Ja mam v AB-BOXe tiez IR na Volume a funguje dobre, pouzivam tuto kniznicu
https://github.com/z3t0/Arduino-IRremote (kuk Wiki)
a pin A3 (NANO)

(upravil mechanik 5. 5. 2020 21:10)

Re: Arduino, dialkové ovládanie, seriový monitor

Tak som použil interrupt pin. Ale je to bez rozdielu už so samotným kódom čo posiela výpis. Aj v tom mojom kode.

Knižníc mám k DO viac. Našiel som nejake v PC čo som nahrával... Vrátane tej tvojej. Keď som ju chcel nahrať vypísalo to že už existuje.

Keď kliknem na pridať knihovnu mám tam už nejake "IRremote" ale nič viac. To som tam určite nahral ja... Keď na to kliknem hodí to do programu rovno toto všetko:

#include <boarddefs.h>
#include <IRremote.h>
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>

S tým že ja vždy v kóde píšem "#include <IRremote2.h>"  Pretože to jediné mi nevypíše chybu pri kompilácií... Neviem, mám v tom zmätok big_smile

"irremote2" je zároveň ZIP ktorý som nahral, teda knižnica. ZIP tej "tvojej" knižnice sa volá z3t0-Arduino-IRremote-2.1.0-96-g2dc97b2. Nič také v arduine nevidím...

Predstavoval by som si nejake jednotné zobrazenie všetkých knižníc v priečinku arduina v Program Files/arduino... a ten istý zoznam keď sledujem knižnice v arduine. Toto je pre mna neprehladný bordel. Také knižnice v eagle sú uplne o inom big_smile

(upravil kaed 5. 5. 2020 21:40)

Re: Arduino, dialkové ovládanie, seriový monitor

Prohlídni si adresář library a zjistíš, že je to stejný. Základ je pochopit, jak to funguje, a to je analogický tomu eagle. to #include<> je stejný jako use v eagle. Nevypovídá to nic o tom, jestli vůbec tu knihovnu v programu používáš, a jak sám píšeš, asi ne...
Podle toho popisu používáš knihovnu IRremote2.h  Ale to nic neříká o tom, jak ji používáš (analogicky jakou součástku z knihovny eagle jsi použil) ani nic o tom, jak je použitá v programu (jak je daná součástka zapojena do obvodu) pokud máš v adresáři s arduino knihovnama víc souborů se stejným názvem, překladač vezme první ten, kterej najde, tuším ptrochází adresář podle abecedy, takže knihovna se shodným názvem (ale klidně fakticky jinej soubor) v adresáři Abc přijde na řadu dřív, než se stejným názvem v adresáři Xyz... Dobrý je prohlídnout adresář library, a nějaký pokusy, co nikam nevedly, odstranit. Ale to už píšu podruhý.
Co takhle do tagu code /code

vložit zdrojovej kód

třeba ti někdo poradí.
P.S zkus si nastavit vyšší a nebo nižší rychlost toho sériovýho portu. třeba 1200 bd nebo 115200 bd - sampozřejmě k tomu stejně i rychlost v sériovým monitoru. Mám takový tušení...

(upravil mechanik 5. 5. 2020 22:11)

Re: Arduino, dialkové ovládanie, seriový monitor

O ten môj kód nejde. Ten istý problém je vidieť v kóde ktorý len vypisuje prijaté kódy z DO po seriovom monitore.

#include <IRremote2.h>

const int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(115200);
  irrecv.enableIRIn();
}

void loop(){
  if (irrecv.decode(&results)){
        Serial.println(results.value, HEX);
        irrecv.resume();
  }
}

9600 alebo 115200 bd, je to to isté. Chcel som sem dať print screen ale ono to stačí skopírovať. Tak napríklad:

FF02FD
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF

Iné tlačítko:

FFC23D
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF

zase iné:

FF906F
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF
FFFFFFFF

Asi sa budem radšej venovať záhradníčeniu... big_smile

Re: Arduino, dialkové ovládanie, seriový monitor

ten vivrínovec ani nevím, co je, a ani google nedává rozumnou odpověď... - Myslíš si, že odpověď na podržení jakýhokoliv tlačítka FF FF FF FF  je správná? Já mám za to, že asi ne. začal bych tím, že smažu z adresáře library všechno, co by mohlo obsahovat irremote.h, irremote2.h, a nainstaloval si JEDNU knihovnu, nejlíp třeba takovou, která někomu spolehlivě funguje. pak vyzkoušet co to bude posílat, FF znamená log jedničku trvale, tj pravděpodobně v okamžiku odeslání dat na port se přeruší načítání z pinu, na kterej je zapojenej ir přijímač. Vypadá to, že ta tvoje knihovna nevyužívá přerušení, a proto to dělá tohle.

(upravil mechanik 5. 5. 2020 22:31)

Re: Arduino, dialkové ovládanie, seriový monitor

Ja už som to zahradničenie vymazal big_smile

V samotnom kóde to čítam ako 0XFFFFFFFF. Je to opakovacia funkcia. To je ok.

"If we receive 0XFFFFFFFF from the remote, it means a repetition of the previous key. "

Re: Arduino, dialkové ovládanie, seriový monitor

takže jedině zkusit to s jinou knihovnou, podobně jsem kdysi bojoval s I2Clcd...

(upravil mechanik 6. 5. 2020 0:58)

Re: Arduino, dialkové ovládanie, seriový monitor

Díky bohu display s modulom I2C fungoval s nejakou používanou knihovnou okamžite... Zase mám problém že občas po nahratí kódu alebo pripojení arduina k napájaniu ten OLED zblbne... Sú tam nejake divné znaky a musím natvrdno vypnúť napájanie a znovu zapnúť... LCD myslím funguje v pohode. Ale to ma teraz netrápi...

Fakt sa bojím že zmažem niečo čo nemám. Ja už som nahrával knihovne na všetko možné a mám v tom trochu zmätok. Možno skúsim PC v dielni. Tam sú knihovne tiež ale tie môžem zmazať.

Fotka pre spestrenie big_smile

https://i.postimg.cc/Hkrz32QD/20200504-222022-comp.jpg

Až sa dorieši to DO tak "už iba" ON/OFF. Pred OFF asi ukladanie funkcií do EEPROM. Neviem či by nebolo nejako resetovať celý MCU pri každom zapnutí... Tušim po určitej dobe, asi 200 dní sa to preplní a vynuluje... Potom asi millis aby som trochu skultivoval chod niektorých udalostí za sebou. Neviem či by stačil delay... No a TRIGGER OUT pre ovládanie dalších komponentov. Potom spínanie ešte nejakych drobností. Relé a nejakeho digitálu... big_smile

(upravil kaed 6. 5. 2020 11:59)

Re: Arduino, dialkové ovládanie, seriový monitor

delay se snaž pro časování nepoužívat, procesor nic nedělá a pak nemá čas smile je lepší dělat časování nějak takhle:

if ( (millis() -casopakovani)<lastmillis) then {
 lastmillis=millis() ;
 ... udělej co chceš}
 pokračování programu

A nebo použít utilitku https://www.xpablo.cz/?p=421 kde je ošetřený to přetečení millis(). Tohle používám třeba na to, když chci displej aktualizovat max. dvakrát za sekundu, vyčíst teplotu jednou za minutu a pod...
reset procesoru netřeba, stačí zprovoznit watchdog, klidně s nejdelší časovou konstantou.  Mám nějaký aplikace, který jedou bez vypnutí několik let, ale počty resetů neřeším.
Ukládání last stavu do eeprom je zajímavý, ale eeprom má konečnou životnost. Spíš to chce uložit do eeprom nějakej nejčastější stav (vstup, hlasitost...) - tohle udělat třeba podržením tlačítka na enkodéru - a po zapnutí (resetu) jenom načíst tuhle hodnotu. Pokud procesor nevypneš, tak udrží hodnoty v registrech fakt dlouho... Ještě se mrkni na funkce sleep   https://circuitdigest.com/microcontroll … onsumption , dost to sníží rušení a spotřebu, DO si procesor vzbudí přes interupt, encoder taky a  zbytek času (odhaduju víc než 99% času) může procesor prochrápat... Ostatně pokud se bude budit třeba 4x za 1s, tak to ani nepoznáš, že vlastně většinu času chrápe.
Určitě je dobrý povypínat periferie, který nepoužíváš, třeba ADC. klesne spotřeba, rušení.

(upravil mechanik 7. 5. 2020 0:10)

Re: Arduino, dialkové ovládanie, seriový monitor

kaed, ďakujem za užitočné rady. Budú sa hodiť neskôr až sa k tomu dostanem.

Tak som skúsil ten druhý PC a knihovnu z odkazu hore.

Funguje to tak že dostanem kód tlačítka. Potom tam mám zase zhruba 20x kód že funkcia bola opakovaná. Vždy po prijatí každého kódu mi na arduine MEGA bliká led "TX". No ale po tých cca 20 kódoch LEDka vždy na sekundu prestane svietiť a tiež v tom čase nepríde žiaden kód. Potom zase bliká a chodí opakovací kód, ale len 20. Potom zase sekundu nič a zase 20 a tak do okola...

Občas po tej sekundovej pauze príde jeden krát divný kód. Napríklad "2FA92AAC", zakaždým iný. Ale vždy divný, čo neodpovedá žiadnemu tlačítku. Pokračuje to zase cca 20x opakovacím. Ja samozrejme celý čas držím jedno a to isté tlačítko.

Takto zhruba sa správajú všetky 4 DO čo som k arduinu kúpil. Zároveň na SEKI vidím že LEDka na DO bliká celý čas čo držím tlačítko. Neverím že niekomu z vás sa to správa inak. Len ste možno narozdiel odo mna nepotrebovali tlačítko držať dlhšie než zhruba 20 intervalov. Tých 20 intervalov sú asi 4 sekundy. Ale mne by sa hodilo aby to tlačítko fungovalo tak dlho ako ho budem držať.

Obtažuje ma už ten samotný opakovací kód. Riešiť ešte že to po 4 sekundách nejde vôbec alebo z toho vylezie nejaka blbosť sa mi fakt nechce. Koho by napadlo že s DO môže byť taký problém.

EDIT: Tak som to preskúšal ešte v kompletnom kóde programu. Jeden kód DO/krok/0,5db. Takže držím tlačítko. Posuniem sa napríklad z -100db na -90db. Potom asi 2 sekundy nič. Potom sa dostanem na -85db. Zase nič. Potom -80db. Potom asi príde ten divný kód čo DO vôbec nemá vyslielať a už je teda uplný koniec. (Pretože po vyslaní nového kódu opakovací už tiež ide k nemu.) Ale väčšinou ten iný kód príde hneď po prvej fázi, alebo po druhej, takže to skončí celé skôr.

Divné je že sa to ani nespráva identicky... Tiež že z tých divných kódov príde vždy nejaky iný.

EDIT2: v zúfalstve som doplnil blokovanie napájania IR senzoru pretože môj modul ho nemá. Tiež som skúsil 2 DO čo som doma našiel. Pokrok 0.


Mohli by ste prosím niekto skúsiť DO a v arduine pozrieť v seriovom monitore či vám to beží do nekonečna alebo sa to seká ako mne?

(upravil kaed 7. 5. 2020 0:55)

Re: Arduino, dialkové ovládanie, seriový monitor

jdeš na to ze špatné strany. Máš aktivovanej watchdog? jestli jo, tak se nevynuluje časovač watchdogu a arduino se ti resetuje.
a nebo se děje něco jinýho. Je potřeba si doplnit hlášky na sériovej port, tj nebo aspoň blikání led  po každým průchodu smyčkou..

#include <IRremote2.h>
int pruchodu=0; //pocet pruchodu main loop
const int LED_PIN=13; //standartní led arduino
bool ledState; //aktuální stav LEDky
const int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup(){
  Serial.begin(115200);
  irrecv.enableIRIn();
Serial.println("startuju komunikaci po resetu");
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, HIGH); //rozsvítí led na desce
}

void loop(){
  if (irrecv.decode(&results)){
        Serial.println(results.value, HEX);
        irrecv.resume();
  }
pruchodu=pruchodu+1
Serial.print("pruchodu bez resetu ");   // tyhle dva řádky případně zakomentovat, pokud to bude zdržovat běh programu
Serial.println(pruchodu);
ledState = !ledState;  //změní stav LED
digitalWrite(LED_PIN, ledstate); //zhasne, rozsviti při každým průchodu smyčky   
}

doporučuju napřed zkusit jenom tu LED, a sledovat, jestli to bude vůbec pozorovatelný, jak bliká bez příjmu signálu a jak se signálem. pokud zůstane na 1s zhasnutá a pak se vypíše na serial hláška o restartu, tak je to jasný.
Další možnost je, že přeteče buffer pro sériovej port, a proto se to kousne, takže nevypisovat na sériovej port, ale třeba blikat ledkou, tj to blikání led přemístit k tomu if... odesílání na sériovej port něco trvá, a procesor pak nemusí mít čas na další věci.
Je potřeba zkusit pochopit, co se v tom krámu děje, a zjistit, co je špatně.  Další věc je chyba v knihovně, je fakt, že obvykle nikdo tlačítko tak dlouho nedrží, a nechápu, proč bys je měl držet tak dlouho ty.  Stačí do programu napsat, že když je přijato třeba zesílit a pak to fffff, tak se krok změní na 1dB, když přide třetí ffffff tak změnit krok třeba na 3dB a potom se hlasitost změní po 10 ti opakováních o 30dB, po dvaceti, když odečtu ty první 4, tak to bude skoro 60dB což by pro tvoje výkony zesilovačů mohlo být už uchem znatelný smile A když to přestřelíš, stačí zmáčknout krátce - a nebo přidržet jenom chvilku... Takže možná neřešit blbiny, ale řešit komfort ovládání. Držet ovladač 10s pro nějakou větší změnu hlasitosti nepovažuju za smysluplný, stejně tak je potřeba udělat akceleraci i u enkodéru, aby si se u toho neutočil k úplné smrti, i když máš luxusní encodér, a jeho klapání si náležitě užíváš smile Tam se dá použít to, že když se pootočí zprudka, tak se přepne do hrubšího kroku, a když pomali, tak jde po jednom. Ostatně to je implementovaný v každým autorádiu...
Ještě mě napadlo někde do smyčky dát třeba delay(10) nebo třeba delay(100) , aby se poznalo, jak si knihovna poradí s tímhle, protože procesor bude muset dělat i jiný věci, než číst z DO.

(upravil mechanik 7. 5. 2020 13:49)

Re: Arduino, dialkové ovládanie, seriový monitor

kaed, dík za kód a postrehy. Všetko skúsim.

Súhlasím držať DO 10 sekund je blbosť. Ale tie 4 sekundy, možno je to aj menej, sa mi zdajú ako málo.

Krok je 0,5db. Preskakovať na 3db nie je dobrý nápad. Jedná sa o odporovú sieť a relé. Mohlo by to robiť lupance. Lepšie je to riešiť v časovej oblasti. Tie relé stihnú v pohode do 5mS rozopnúť aj zopnúť. To je 200 krokov za sekundu. To je 100db. Cez DO sa nejake zrýchlenie bude musieť urobiť. Na encoder to nie je potrebné. Chcem aby sa to správalo zhruba ako potenciometer. Vychádza to oproti potenciometru asi na 2 otáčky. Takže by sa to malo ovládať pekne. O niečo jemnejšie. Som rád že si užijem krútenie trochu viac big_smile

Ak si skúsiš DO pri motorovom alpse tak myslím že celú dráhu za menej ako 8 sekund neprejde smile Rozhodne nie 4 sekundy a menej.

Tak napríklad tam bude 10 vstupov. Ak by som to naprogramoval na každý dotyk tlačítka tak by to bolo dosť neprijemne. Ak to naprogramujem na držanie. Dal by som tam každý vstup na 0,5s (názov na display) to je v celku zase 5s... Aj keby to spínalo po 0,25s tak by som chcel aby to listovalo vstupy dookola kým sa drží tlačítko.

Proste 4s alebo menej môže byť málo. Takže potrebujem zistiť kde je problém.

Re: Arduino, dialkové ovládanie, seriový monitor

Čo si použil ako útlmové členy? T-články alebo L- články? Skúsil si napr. prechod z -15,5 na -16dB, alebo z 31,5 na -32dB...Tam sa ukážu "lupance"..

(upravil mechanik 7. 5. 2020 20:30)

Re: Arduino, dialkové ovládanie, seriový monitor

Klasicky odporové deliče za sebou. Teda L články. Rozhodne by som tam dal plynulý krok po 0,5db. 5ms nie je nejaka velká strata času smile

Viem že ste o tých lupancoch písali. Ķeď sa prechádza z jedného útlmového článku na hromadu za sebou a asi aj opačne. Dal som si dosť záležať s viac vecami tak sa uvidí.

EDIT: v kóde boli 2 chyby. Nechcelo to skompilovať. Hádam som ich opravil dobre. Doplnil som tam deklaráciu LED state a bodkočiarku v loop. Robí to toto:

https://i.postimg.cc/QtLbYSPz/FFF.png

Keď nastavím rýchlejšiu komunikáciu tak je to FFFFFFFF asi len každý 30ty riadok. Tá LEDka sa nerozsvieti nikdy.

EDIT2: skúšal som do toho kódu ktorý som písal hore doplniť delay a normálne to funguje. Len je to pomalšie a stihne to menej výpisov. No prestane to fungovať po rovnakom čase ako bez delay.

Re: Arduino, dialkové ovládanie, seriový monitor

Už viem ako to vyriešim. Proste pozriem nejaky kód k ALPSu. Ten celú otáčku neurobí ani za 5 sekund smile

Re: Arduino, dialkové ovládanie, seriový monitor

Ahojte, mal by som otazku k arduino ovladaniu...viem aj softverovo vyriesit neaktivnost vsetkych vystupov arduina po vypnuti zariadenia, s tym, ze by reagoval iba na ir kod zapnutia , alebo potrebujem pouzit logicky clen ?