komunikace zpomaluje arduino?

pfifferling
Příspěvky: 20
Registrován: 08 zář 2016, 13:07

komunikace zpomaluje arduino?

Příspěvek od pfifferling »

Ahoj, mam takovy dotaz, neresil nekdo krokovy motor v zapojeni s displejem? problem je v tom, ze kdykoliv neco poslu na displej, nebo klidne i jen na seriovou linku, tak to zpomali krokac, takze ten nejede plynule. Potrebuji zobrazovat aktualni polohu motoru v prubehu jeho pohybu. Zkusil jsem kde co, ruzne knihovny, ruzne drivery, ruzne displeje. Vzdy dochazi k preruseni. Je to stejne na unu i mega. Napada nekoho neco prosim?
Uživatelský avatar
gilhad
Příspěvky: 215
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: komunikace zpomaluje arduino?

Příspěvek od gilhad »

Pokud ten krokac je poveseny na pin primo ovladany timerem, tak by se to zpomalovat nemelo. Ale pokud ho ovlada knihovna primym tahanim za pin, tak je jasne, ze to dalsi knihovna muze rozhodit zakazovanim preruseni, nebo jen dost dlouhym cekanim pri posilani/prijimani - podival bych se na ten ovladac toho krokace, jak to vlastne dela a pak ev. na ty komunikacni knihovny.
pfifferling
Příspěvky: 20
Registrován: 08 zář 2016, 13:07

Re: komunikace zpomaluje arduino?

Příspěvek od pfifferling »

v komunikacni knihovne to nebude, dela to i primy zapis Serial.print obecne to vypada, ze arduino ceka pri poslani cehokoliv na serial na nejakou odezvu, jinak si to neumim vysvetlit. Pokud misto zapisovani na serial menim stav na nejakym pinu, pak je to uplne bez problemu.
Uživatelský avatar
gilhad
Příspěvky: 215
Registrován: 29 kvě 2015, 00:36
Kontaktovat uživatele:

Re: komunikace zpomaluje arduino?

Příspěvek od gilhad »

A jak ovladas ten krokac? Tahas za piny, nastavujes timer, pouzivas knihovnu a jakou?
DavidO
Příspěvky: 1005
Registrován: 01 kvě 2013, 21:27

Re: komunikace zpomaluje arduino?

Příspěvek od DavidO »

Pokud se použije HW seriová linka (což je obvyklý případ, tedy tak budu usuzovat), tak komunikace pomocí Serial.print je bufferovaná. Pokud se nenastaví vlastní velikost bufferu (což si dělá málokdo), tak je velký 16 nebo 64 posílaných bytů (podle konkrétního procesoru). Pokud je buffer úplně prázdný, ani se to do něj znak k poslání nedává a rovnou odešle, to je rychlé. Pokud není ani prázdný ani plný, dá se do bufferu, to je taky ještě docela rychlé, i když pomalejší než ten první. Ale když je buffer plný, čeká se, až se místo uvolní a to při komunikaci na defaultních 9600 baudů trvá dlouho. Navíc je potřeba brát v úvahu, že znak k poslání se musel nějak získat, například zkonvertovat z číselné hodnoty nějaké proměnné do řetězce k odeslání a to taky není okamžité a zdržuje to u jednoho každého znaku, co jde po lince (obzvlášť, kdyby krokáč nebyl řízený časovačem na přerušení, ale softwarově).

Dále, to posílání se provádí pomocí přerušení: když se znak postupně po jednotlivých bitech vysype ven, vyvolá se přerušení, které vezme z bufferu další znak a předá ho k vysypání. Po tuto dobu jsou přerušení obvykle zakázaná, takže i kdyby ten krokáč byl řízený timerem a přerušením, tak to může kulhat, protože čert zařídí, aby timer zazvonil zrovna když začíná přerušení od toho vysílače nebo přijímače seriové linky a tudíž se obsluha timeru opozdí a změní výstup pro krokáč mimo správný takt a krokáč kulhne. Ale takhle od stolu bez pořádného kouknutí do datasheetu a zdrojáků neřeknu, jak moc to může hrát roli.

Čili jestli se toho vypisuje víc jak tu a tam pár konstantních písmenek, tak to opravdu může zdržovat. A obvykle fakt zdržuje...
pfifferling
Příspěvky: 20
Registrován: 08 zář 2016, 13:07

Re: komunikace zpomaluje arduino?

Příspěvek od pfifferling »

Diky za vysvetleni, to zni vcelku rozumne:

- kulhani se nezlepsi nebo jen velmi nepatrne, pokud nastavim vyssi rychlost komunikace
- kulhani se dost lisi podle displeju - nejrychlejsi je sedmisegmentovej led displej, nejpomalejsi je SPI oled

Co tedy udelat aby komunikace nezastavovala ostatni preruseni? Moc se mi nechce pouzivat druhe arduino, protoze to vyvolava dalsi problemy :(
DavidO
Příspěvky: 1005
Registrován: 01 kvě 2013, 21:27

Re: komunikace zpomaluje arduino?

Příspěvek od DavidO »

Já jsem sice přehlídl, že jde i o displeje a psal jsem jen o seriové lince, nicméně SPI je to samý v bledě modrým, taky to je seriové a taky může být přenos implementovaný jako blokující. SPI sice může běžet docela svižně, ale záleží i na tom, jak je to z Arduina a jeho knihoven uchopené.

No a co takhle sem dát zdroják a napsat, které konkrétní periferie a jak jsou připojené a které konkrétní Arduiono to je? Ať tu zbytečně neteoretizujeme.
pfifferling
Příspěvky: 20
Registrován: 08 zář 2016, 13:07

Re: komunikace zpomaluje arduino?

Příspěvek od pfifferling »

jasan, obecne je asi jedno jaka je to knihovna, zkouseno vice. Taktez zkouseno Uno, Nano i Mega, original i CH340. Je i jedno jaky je tam displej - zde zrovna nextion co ma vlastni procesor a obecne je dost rychly.

Kód: Vybrat vše

#include <SoftwareSerial.h>
#include <Nextion.h>
SoftwareSerial nextion(2, 3);
Nextion myNextion(nextion, 9600);
#include <AccelStepper.h>
AccelStepper stepper(1, 4, 7); 
long millisOld = 0;


void setup(){  
 Serial.begin(115200);
 myNextion.init();
 stepper.setMaxSpeed(1000);
 stepper.setAcceleration(500);
 pinMode(EN, OUTPUT);
   stepper.moveTo(-3000);
 
}

void loop(){    

 if (stepper.distanceToGo() == 0)
     stepper.moveTo(-stepper.currentPosition());

   stepper.run();
  myNextion.setComponentText("t0", "test");
 }
DavidO
Příspěvky: 1005
Registrován: 01 kvě 2013, 21:27

Re: komunikace zpomaluje arduino?

Příspěvek od DavidO »

pfifferling píše:jasan, obecne je asi jedno jaka je to knihovna, zkouseno vice.
No uplně jedno to není, knihovny jsou velmi kolísavě kvalitní. A i tak, já když kompiluju tenhle kód, tak dostanu dvě fatální chyby, jednak není definováno EN a pak knihovnu Nextion mám zjevně jinou, neb ta moje nemá metodu setComponentText.
pfifferling píše:Taktez zkouseno Uno, Nano i Mega, original i CH340. Je i jedno jaky je tam displej - zde zrovna nextion co ma vlastni procesor a obecne je dost rychly.
Tohle hovoří pro obecnější problém, vzniklý z (teď v dobrém) neznalosti a nepochopení jak to celé funguje vevnitř. Je potřeba si jasně uvědomit, co jsou důležité věci, které se musejí dělat správně a pravidelně, co jsou důležité věci, které ale není třeba dělat pravidelně a co jsou doplňky, které můžou mít výpadky aniž by to vadilo.
Knihovna Accelstepper pokud vím vyžaduje, aby bylo run() voláno co nejčastěji a že udělá jen jeden krok. takže když se hlavní smyčka časově prodlouží a nestihne se to udělat maximálně v době toho časového intervalu, nutně to začne kulhat. Pak by bylo potřeba to celé přepsat, aby se zajistily požadavky toho krokáče.
pfifferling
Příspěvky: 20
Registrován: 08 zář 2016, 13:07

Re: komunikace zpomaluje arduino?

Příspěvek od pfifferling »

pardon en tam byt uz nema, zapomnel jsem odmazat. Nextion mozno vyhodit uplne a nahradit ho jen serial.print.
Knihovna Accelstepper umi i odjezd na pozici, situace je stejna. Totez je i s jinou knihovnou.

Jeste me napada, pomohlo by driver ke krokaci povesit na interrupt piny arduina?

ten displej muze mit vypadky a nevadi to, ale nevim jak mu nastavit nizkou prioritu. Jeste jsem se nekde docetl, ze arduino pri komunikaci odesle informaci a ceka na jeji zpetne potvrzeni. Coz mi presne prijde jako tento pripad. Da se to nejak obejit?
Odpovědět