Pushbutton & seriova linka

Programovacie jazyky, rady, poradňa...
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

Pushbutton & seriova linka

Príspevok od používateľa cheeseburger »

Ahojte, vytvaram pre jednu hru ovladac s Arduinom. Komunikacia medzi arduinom a hrou funguje na zaklade seriovej linky. Z arduina posielam na serivou linku stringy, a cez skript vlozeny v hre tieto stringy citam a nasledne na nich reagujem. Ukazem priklad s brzdou. Toto je kod Arduina

Kód: Vybrať všetko

...
void pushButton(){
  button = digitalRead(prkgbrake);
   if (button == HIGH && exbutton == LOW && millis() - last > ddelay){
      Serial.write("brake:1\n")
      while( digitalRead(prkgbrake) == HIGH){
    }
  }
}
...
LUA skript importovany v hre

Kód: Vybrať všetko

....
x = com.open("COM3", 115200, 0)

function offset(handle, str)
  ipc.log(str)
end

event.com(dev, 20, 1, 0, "readSerial")   
Problem je, ze v hre dostavam na seriovu linku najprv spravne stringy

Kód: Vybrať všetko

brake:1
brake:1
brake:1
brake:1
No po case mi zacne do hry chodit nieco taketo

Kód: Vybrať všetko

brake:1
br
ake:1
brake:1brake:1
brak
e:1
Neviete mi niekto poradit, kde moze byt problem? Dakujem velmi pekne.
ado130
Expert
Expert
Používateľov profilový obrázok
Príspevky: 163
Registrovaný: 01 aug 2012, 12:36

Re: Pushbutton & seriova linka

Príspevok od používateľa ado130 »

Ako máš definovanú premennú last?
Skus ešte znížiť rýchlosť po sériovke, 9600 prípadne 38400.
Máš v projekte nejak využité prerušenia (attachInterrupt)?
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

Re: Pushbutton & seriova linka

Príspevok od používateľa cheeseburger »

ddelay je nastavene na 200,
last nastavujem na konci toho ifu, zle som to skopiroval, takto by to malo vyzerat

Kód: Vybrať všetko

...
void pushButton(){
  button = digitalRead(prkgbrake);
   if (button == HIGH && exbutton == LOW && millis() - last > ddelay){
      Serial.write("brake:1\n")
      while( digitalRead(prkgbrake) == HIGH){
    }
   last = millis();
  }
}
Skusim este tu nizsiu rychlost. Prerusenia nemam ziadne.
ado130
Expert
Expert
Používateľov profilový obrázok
Príspevky: 163
Registrovaný: 01 aug 2012, 12:36

Re: Pushbutton & seriova linka

Príspevok od používateľa ado130 »

Mas k dispozícii logicky analyzator, prípadne aspon OSC?
Na akú vzdialenosť mas tu seriovku?
Skus pripojiť to tlačidlo na prerušenie, s nabeznou hranou.

Kód: Vybrať všetko

.   void my_interrupt_handler()
{
 static unsigned long last_interrupt_time = 0;
 unsigned long interrupt_time = millis();
 // If interrupts come faster than 200ms, assume it's a bounce and ignore
 if (interrupt_time - last_interrupt_time > 200) 
 {
   ... do your thing
 }
 last_interrupt_time = interrupt_time;
}     
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

Re: Pushbutton & seriova linka

Príspevok od používateľa cheeseburger »

Nemam ani oscilator ani logicky analyzator.
Vzdialenost asi 3m usbecko.
ado130
Expert
Expert
Používateľov profilový obrázok
Príspevky: 163
Registrovaný: 01 aug 2012, 12:36

Re: Pushbutton & seriova linka

Príspevok od používateľa ado130 »

Oscilator?
Skúšal si ten interrupt?
joejoe
Light Professional
Light Professional
Používateľov profilový obrázok
Príspevky: 733
Registrovaný: 03 apr 2007, 16:59

Re: Pushbutton & seriova linka

Príspevok od používateľa joejoe »

tam kde prijmas data zo seriovej linky si sprav buffer, ktory ti to bude citat zo seriovky kym napr. neprecita posledny ukoncovaci znak (napr NUL) a ptm ti to vypluje vystup. ...ak si na to v robote spomeniem poslem ti funkcny blok ktory podobny problem riesi

edit: http://pastebin.com/uSCvRBFb
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

Re: Pushbutton & seriova linka

Príspevok od používateľa cheeseburger »

ado130: osciloskop som myslel, nie oscilator, prepac. Ak si teda tym OSC myslel ten. Interrupt som neskusal, kazdopadne vyskusam pre zuajimavost aj ten. Keby to aj fungovalo velmi mi to nepomoze, lebo potrebujem viac pushbuttnov, a arduino nema na kazdom pine moznost detekovat prerusenie. Musim vyskusat este aj tu nizsiu rychlost, nemal som zatial cas to testnut.

joejoe: dakujem vyskusam si to spravit.

Dam vediet ako som dopadol

//autoeditácia príspevku (02 Sep 2016, 17:39)
Kazdopadne samotny problem sa asi nebude tykat push buttna, ale niekde inde. Pridal som si rotacny enkoder a v podstate robi to uplne to iste. Mozno vas este napadne kde moze byt chyba. Inak ten vysielaci buffer myslis co? Predtym som nenastavoval. Teraz som si vsak spravil funkciu pre arduino, no vysledok ten isty

Kód: Vybrať všetko

void sendData(const char* name, int state){
  char buffer[1024]; //bolo 30
  sprintf(buffer, "%s:%d\0", name, state);
  Serial.write(buffer);
  Serial.flush();
}


Idem skusit tu vec od joejoe
ado130
Expert
Expert
Používateľov profilový obrázok
Príspevky: 163
Registrovaný: 01 aug 2012, 12:36

Re: Pushbutton & seriova linka

Príspevok od používateľa ado130 »

Prípadne obdoba čo písal joejoe, skús odosielať "break: 1;" a tam kde čítaš, skús čítať kým nenarazí na znak ';'. Týmto by si teoreticky mohol odstrániť aj tú chybu, že ti zvyšok stringu dá do ďalšieho riadka, pretože on to bude stále brať ako ten prvý, po ten ukončovací znak ';'.
cheeseburger
Light Star
Light Star
Príspevky: 235
Registrovaný: 21 máj 2013, 18:49

Re: Pushbutton & seriova linka

Príspevok od používateľa cheeseburger »

Tak prisiel som na novu vec, a to bude zrejme problem v tom LUA scripte v hre. Ide o to, ze ten useknuty cast stringu, ktory mi uz neposle, sa posle az pri opatovnom stlaceni push buttnu resp otocenim rotaru. Skusal som v tom istom case posielat tie iste stringy na iny COM port, tam sa to posle pekne, ale v lue sa to posere. Uz ciste skusam len posielat stringy a vypisovat ich, bez akejkovek reakcie. Neviem co s tym. :/

//autoeditácia príspevku (08 Sep 2016, 22:49)
Ok, tak asi vyriesenie. Zmenil som baudrate na maximalny mozny, a zacalo sa to konecne spravat normalne.

Inak este ak sa mozem spytat, zrejme mam blbo osetrene tie zakmity, neviete mi pomoct, kde mam chybu? Stava sa mi, ze sa mi to posle niekedy dvakrat. Aktualny kod

Kód: Vybrať všetko

int reading;
int exbutton= LOW;
unsigned long ddelay= 200;
unsigned long last= 0;
void loop(){
    reading= digitalRead(prkgbrake);
   if (reading== HIGH && exbutton == LOW && millis() - last> ddelay){
    if (brake == 0){
      Serial.write("brake:1\n");
      while( digitalRead(prkgbrake) == HIGH){
      }
    }
    else{
      Serial.write("brake:0\n");
      while( digitalRead(prkgbrake) == HIGH){
      }
    }
    last = millis();
  }
Dakujem velmi pekne.
Napísať odpoveď