Leonardo a Google maps

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

martinius96

Leonardo a Google maps

Príspevok od používateľa martinius96 » 19 Aug 2017, 22:52

Ahojte, to som zase ja a mám problém. Skúšam projekt Virtual Bike, ktorý sa na nete pred niekoľkými rokmi objavil.
http://hackaday.com/2012/06/26/bike-cro ... treetview/
Jednalo sa o virtuálne bicyklovanie v Google mapách v Street View móde. Pedále s magnetickým kontaktom boli vlastne counter, ktorý po pretočení pedálov určitý počet krát dali Arduinu signál, aby kliklo na obrazovku, resp tlačidlo šípku dohora.Pre lepšiu funkcionalitu som to chcel pridať 2 tlačidlá, aby cyklista mohol pozerať doľava a doprava a tým následne upravil svoj pohyb napríklad na križovatke a vydal sa smerom, ktorým potrebuje. Mám taký problém, že mi to nefunguje...
Obrázok
Jeden z používateľov sa pri tomto projekte vyjadril, že má totožný problém, no do dnešného dňa mi nedal odpoveď, že či vôbec tento problém nejako vyriešil. V IE to funguje, ale v Mozille, Chrome nie. Používam:
  • Keyboard.write(65); //a znak
  • Keyboard.write(216); //sipka vlavo
Stále bezúspešne. Skúšal som aj 'a' alebo aj hexadecimálne hodnoty. Počas držania tlačidla sa na Google mape nič nedeje, no nemôžem pohľad pohnúť ani šípkami klávesnice pokým držím tlačidlo na breadboarde. Stretol sa niekto s niečím podobným a vedel by mi poradiť? Ak si kliknem napr na link, či dokument tak pohyb/výpis znaku funguje OK, nefunguje to iba v Google mapách. Neblokuje to Google nejakým javascriptom?

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Leonardo a Google maps

Príspevok od používateľa peterple » 20 Aug 2017, 00:47

Myslím že to súvisí s tým že šipka vľavo vpravo sa v streetview obsluhuje inak ako si to predstavuješ. Pri udalosti keydown sa len nastaví stav že sa má obraz otáčať vľavo. Pokiaľ držíš tak sa otáča. (samozrejme to nie je také ľahké lebo asynchróne k tomu asi potrebuješ aj sťahovať data) No a keď pustíš tak sa otáčanie zastaví. Teda reaguje to na udalosť keyup
Arduino kód urobí asi to že pošle keydown a hneď na to keyup. Čo je fajn a vygeneruje to udalosť keypress ale udalosti keydown a keyup sú od seba vzdialené tak krátko že sa obraz ani nehne. Skús si to normálnou klávesnicou. ak stisneš šípku len na kratúčko, tiež sa to pohne minimálne. Ale to si robil mechanicky teda rozostup medzi udalosťami je aspoň 0,1 - 0,2 sekundy. Arduino kód to môže poslať hneď po sebe čo ten javaskript ignoruje buď preto že to zodpovedá strašne malému posunu, alebo zámerne lebo vedia že tak krátko to nie je možné na reálnej klávesnici urobiť a tak vedia že ich chce niekto riadiť nejakým kódom. No a rozpoznávať robotov je jeden zo športov čo google momentálne dosť pestuje.

Takže by si potreboval upraviť kód arduína aby tie udalosti keydown a keyup posielal nie hneď po sebe ale s dostatočne dlhým oneskorením aby sa ti obraz otočil o koľko treba.

-- Spojený príspevok 19 Aug 2017, 23:50 --

Inak skúšať posielať 65, 'a' alebo 0x61 je stratený čas. To sa totiž skompiluje vždy na ten istý kód pre procesor. To je len fičúra prekladača že to môžeš zapísať ako sa ti to najlepšie hodí.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

martinius96

Re: Leonardo a Google maps

Príspevok od používateľa martinius96 » 20 Aug 2017, 12:59

Áno, mali ste pravdu, využil som Keyboard.press, následne Keyboard.release v kóde namiesto Keyboard.write. Funguje to báječne! Ďakujem pekne :potlesk: K+

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Leonardo a Google maps

Príspevok od používateľa peterple » 20 Aug 2017, 14:03

ideálne by to bolo urobiť tak že press zavoláš pri stlačení tlačítka a release pri pustení. Tak ti to bude fungovať presne ako keby si stláčal klávesu na klávesnici. Takže treba detekovať nábežnú a dobežnú hranu. A samozrejme odstraňovať zákmity. Teda všetko to čo robí MCU čo je v bežnej klávesnici. Auto repeat asi nebude treba emulovať.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

martinius96

Re: Leonardo a Google maps

Príspevok od používateľa martinius96 » 20 Aug 2017, 14:05

Mám to takto, ešte zatiaľ bez ošetrenia zákmitov

Kód: Vybrať všetko

#include <Keyboard.h>
const int buttonleft = 5;
const int buttonright = 4;
int buttonleftState = 0;        
int buttonrightState = 0;          
void setup() {

  Serial.begin(9600);
  Keyboard.begin();
  pinMode(buttonleft, INPUT);
 pinMode(buttonright, INPUT); 
}
void loop() {

  buttonleftState = digitalRead(buttonleft);
  buttonrightState = digitalRead(buttonright);
 if (buttonleftState == HIGH) {         
  Keyboard.press(216);
  
 
  }else{
    Keyboard.release(216);
    }
     if (buttonrightState == HIGH) {         
  Keyboard.press(215);
  }else{
    Keyboard.release(215);
    }

}

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Leonardo a Google maps

Príspevok od používateľa peterple » 20 Aug 2017, 14:14

toto nie je bohviečo. Stále to posiela press, alebo release. Dokonca aj vtedy keď nie je nič stlačené. Ako som písal treba detekovať hrany a odstraňovať zákmity. Toto je také čisto hulvátske riešenie typické pre istú skupinu programátorov. Urobiť to poriadne aby kód bol robustný nie je až tak triviálna záležitosť.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

martinius96

Re: Leonardo a Google maps

Príspevok od používateľa martinius96 » 24 Aug 2017, 07:37

Neviem správne urobiť ten debouncing. Skúšal som to z tutoriálu Arduina
https://www.arduino.cc/en/Tutorial/Debounce
Ale nepodarilo sa mi to správne.. Nejaký tip lepší pre moje riešenie?

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Leonardo a Google maps

Príspevok od používateľa peterple » 24 Aug 2017, 20:24

Ak to nerobí nič iného tak kludne aj cez 50ms delay. Dôležitejšie je detekovať nábežnú a dobežnú hranu. Dva if alebo jeden. záleží od šikovnostti programátora. Nechám ti priestor na premýšlanie. Alebo sa ozvú ďalší arduinisti čo to už zvládajú.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: Leonardo a Google maps

Príspevok od používateľa alidedko » 24 Aug 2017, 21:34

Ved v tom linku je debounce uz navrhnuty.

Neviem posudit, ci uplne dokonale, ale podla mna funguje. Co na nom nevies spravit, okrem copy a paste? Vlep si ho do svojho programu a je to.
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Leonardo a Google maps

Príspevok od používateľa peterple » 24 Aug 2017, 22:56

to nie je také jednoduché, on má predsa tlačítka dve, a na to príklad nenašiel. Ctrl C Ctrl V v tomto prípade nefunguje a treba tomu rozumieť. A kedže inde sa pýta ako zmerať hodinu, tak určite nechápe ako pracuje milis().
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

martinius96

Re: Leonardo a Google maps

Príspevok od používateľa martinius96 » 25 Aug 2017, 00:25

Ako mám teraz vyriešiť dobežnú hranu?

Kód: Vybrať všetko

#include <Keyboard.h>


const int leftbutton = 4;   
int buttonState;
int lastleftbuttonstate = LOW;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

void setup() {
   Keyboard.begin();
  pinMode(leftbutton, INPUT);

}

void loop() {
  // read the state of the switch into a local variable:
  int readingleftbutton = digitalRead(leftbutton);
  if (readingleftbutton != lastleftbuttonstate) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (readingleftbutton != buttonState) {
      buttonState = readingleftbutton;
      if (buttonState == HIGH) {
        Keyboard.press(216);
      }else{
       Keyboard.release(216); 
        }
    }
  }
 lastleftbuttonstate = readingleftbutton;
}
Treba urobiť presne opačný proces ako pri nábežnej hrane, ale nie je mi jasné, čo by som zmenil pri

Kód: Vybrať všetko

  if (readingleftbutton != lastleftbuttonstate) {
    lastDebounceTime = millis();
  }

alidedko
Ultimate člen
Ultimate člen
Príspevky: 3963
Dátum registrácie: 04 Feb 2013, 22:04
Bydlisko: U alibabky v Poprade
Vek: 32

Re: Leonardo a Google maps

Príspevok od používateľa alidedko » 25 Aug 2017, 08:30

Tam, kde plnis readingleftbutton, nesleduj len zmenu stavu ako taku, ale sleduj zmenu z vysokej na nizku uroven (alebo opacne, podla zapojenia).

Ale to ti uz Peter hore pisal. If, mozno dva.
0
Motto: Nikto nie je tak velky, aby sa nevosiel do truhly.

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Leonardo a Google maps

Príspevok od používateľa peterple » 25 Aug 2017, 18:58

na dva if to urobí programátor ktorý nepozná funkciu xor. Ten čo pozná ako funguje xor tak to spraví jedným if-om ale samozrejme nebude vedieť či nastala nábežná alebo dobežná hrana. Bude len vedieť že hrana bola. Takže ten druhý if treba viac menej tak či tak. Na ten xor s jedným if treba ďalšiu premenú kde sa pamätá predošlý stav.
A to je vlastne už celé.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok