INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 1 Bewertungen - 5 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Mit Rotary Encoder Tastatur simulieren?
07.11.2015, 19:19
Beitrag #1
Mit Rotary Encoder Tastatur simulieren?
Hallo,

habe eine Frage zum Drehencodern.

Würde gerne 2 Stück über einen Arduino am PI nutzen, um
eine Tastatur zu simulieren. Weiß nicht ob das geht.

Encoder 1:

Links drehen - Tastatur Pfeil Links
Rechts drehen - Tastatur Pfeil Rechts
Button drücken, kurz - Tastatur Enter
Button drücken, lang - Tastatur ESC

Encoder 2:
Links drehen - Tastatur Minus
Rechts drehen - Tastatut Plus
Button drücken, kurz - Tastatur 'x'
Button drücken, lang - Pi herunterfahren oder irgendeine andere Taste

Gibt es da ggf fertiges Lösungen, die ich bisher nicht entdeckt habe?
Für selber programmieren fehlt mir leider das Know-How Angel

Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.11.2015, 20:04
Beitrag #2
RE: Mit Rotary Encoder Tastatur simulieren?
Tja, fertig wirst Du da nix finden.
Funktionieren würd es aber.
Einzig mit "Simulation einer Tastatur" hätt ich auf Anhieb nix parat.
Aber ich hab auch schon gelesen, das sowas geht.

Der Raspberry kann aber auch direkt die Drehencoder auswerten.

Binatone
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.11.2015, 12:12 (Dieser Beitrag wurde zuletzt bearbeitet: 08.11.2015 12:14 von HaWe.)
Beitrag #3
RE: Mit Rotary Encoder Tastatur simulieren?
es ist kein Hardware-Problem, sondern ein Programmier-Problem, daher ist das Thema sicher im flaschen Forum.

Rivitg ist: man kann es durch auslesen von Rotationsencoder-Counts lösen, kein Problem.
Allerdings kann das weder der Arduino noch der Raspberry (!!!) direkt von sich aus , in beiden Fällen brauchst du den entsprechenden Qab-Code.

Encoderwert vergößert => nächster Buchstabe auf der Liste,
verkleinert => vorheriger Buchstabe.

hier 2 links, an der Komplexität erkennst du, dass es nicht ganz trivial ist:

http://www.mindstormsforum.de/viewtopic....624#p67235

http://www.mindstormsforum.de/viewtopic....=15#p67779
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.11.2015, 13:22
Beitrag #4
RE: Mit Rotary Encoder Tastatur simulieren?
danke erstmal.

habe mich mal schlau gegoogelt, denke der Leonardo macht das was ich brauche.

Brauche aber hilfe beim Code. Habs mal versucht, evtl kann einer mal drüber gucken, der Leonardo sollte mitte der Woche kommen.

Code:
int buttonStateLeft = 0;
int buttonStateRight = 0;
int buttonStateEnter = 0;
int buttonStateEsc = 0;

void setup()
{    
  pinMode(1, INPUT);
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  Keyboard.begin();
}

void loop()
{
    // Encoder 1: Drehe Links = sende Pfeil Links
    buttonStateLeft = digitalRead(1);
    if (buttonStateLeft == HIGH)
    {
    Keyboard.press(KEY_LEFT);
    delay(100);
    Keyboard.releaseAll();
    }

    // Encoder 1: Drehe Rechts = sende Pfeil Rechts
    buttonStateRight = digitalRead(2);
    if (buttonStateRight == HIGH)
    {
    Keyboard.press(KEY_RIGHT);
    delay(100);
    Keyboard.releaseAll();
    }
    
    // Encoder 1: Button Kurz = sende Taste Enter
    buttonStateEnter = digitalRead(3);
    if (buttonStateEnter == HIGH)
    {
    Keyboard.press(KEY_RETURN);
    delay(100);
    Keyboard.releaseAll();
    }

    // Encoder 1: Button Lang (>3sek) = sender Taste ESC
    buttonStateEsc = digitalRead(4);
    if(buttonStateEsc == HIGH)
    {
    while(buttonStateEsc == HIGH);
    delay(3000);
    Keyboard.press(KEY_ESC);
    Keyboard.releaseAll();
    }
}

Gruß
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.11.2015, 14:29
Beitrag #5
RE: Mit Rotary Encoder Tastatur simulieren?
Naja ich geh mal davon aus, es ist der nackte Drehwertgeber mit Tastfunktion gemeint
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
09.11.2015, 11:25 (Dieser Beitrag wurde zuletzt bearbeitet: 09.11.2015 13:25 von noxx.)
Beitrag #6
RE: Mit Rotary Encoder Tastatur simulieren?
Ja.
Sowas hier:
http://www.weiku.com/products/10387679/9...coder.html

Wichtig wäre mir zu wissen, ob der Code richtig wäre. Mit C habe ich nicht viel am Hut.

(warum geht hier eigentlich kein C-Highlighting? Im Editor steht nur PHP zur Verfügung, wozu man das auch immer beim Arduino braucht).
[/quote]
Code:
int buttonStateLeftRE1 = 0;
int buttonStateRightRE1 = 0;
int buttonStateButtonShortRE1 = 0;
int buttonStateButtonLongRE1 = 0;

int buttonStateLeftRE2 = 0;
int buttonStateRightRE2 = 0;
int buttonStateButtonShortRE2 = 0;
int buttonStateButtonLongRE2 = 0;

void setup()
{    
  pinMode(2, INPUT);
  pinMode(3, INPUT);
  pinMode(4, INPUT);
  pinMode(5, INPUT);
  pinMode(6, INPUT);
  pinMode(7, INPUT);
  pinMode(8, INPUT);  
  pinMode(9, INPUT);  
  Keyboard.begin();
}

void loop()
{
    // Encoder 1: Drehe Links = sende Pfeil Links
    buttonStateLeftRE1 = digitalRead(2);
    if (buttonStateLeftRE1 == HIGH)
    {
    Keyboard.press(KEY_LEFT_ARROW);
    delay(100);
    Keyboard.releaseAll();
    }

    // Encoder 1: Drehe Rechts = sende Pfeil Rechts
    buttonStateRightRE1 = digitalRead(3);
    if (buttonStateRightRE1 == HIGH)
    {
    Keyboard.press(KEY_RIGHT_ARROW);
    delay(100);
    Keyboard.releaseAll();
    }
    
    // Encoder 1: Button Kurz = sende Taste Enter
    buttonStateButtonShortRE1 = digitalRead(4);
    if (buttonStateButtonShortRE1 == HIGH)
    {
    Keyboard.press(KEY_RETURN);
    delay(100);
    Keyboard.releaseAll();
    }

    // Encoder 1: Button Lang (>3sek) = sender Taste BACKSPACE
    buttonStateButtonLongRE1 = digitalRead(5);
    if(buttonStateButtonLongRE1 == HIGH)
    {
    while(buttonStateButtonLongRE1 == HIGH);
    delay(3000);
    Keyboard.press(KEY_BACKSPACE);
    Keyboard.releaseAll();
    }
    
    // Encoder 2: Drehe Links = sende Minus (Lautstärke runter)
    buttonStateLeftRE2 = digitalRead(6);
    if (buttonStateLeftRE2t == HIGH)
    {
    Keyboard.press(45);
    delay(100);
    Keyboard.releaseAll();
    }

    // Encoder 2: Drehe Rechts = sende Plus (Lautstärke Hoch)
    buttonStateRightRE2 = digitalRead(7);
    if (buttonStateRightRE2 == HIGH)
    {
    Keyboard.press(43);
    delay(100);
    Keyboard.releaseAll();
    }
    
    // Encoder 2: Button Kurz = sende x (Wiedergabe Stop)
    buttonStateButtonShortRE2 = digitalRead(8);
    if (buttonStateButtonShortRE2 == HIGH)
    {
    Keyboard.press(120);
    delay(100);
    Keyboard.releaseAll();
    }

    // Encoder 2: Button Lang (>3sek) = Pi herunterfahren
    buttonStateButtonLongRE2 = digitalRead(9);
    if(buttonStateButtonLongRE2 == HIGH)
    {
    while(buttonStateButtonLongRE2 == HIGH);
    delay(3000);
    Keyboard.press(KEY_F12);
    Keyboard.releaseAll();
    }    
}

Edit

Habe mir mal die Arduino Software installiert und den obrigen Code probiert.

Die Software meldet aber einen Fehler:
Keyboard' not found. Does your sketch include the line '#include <Keyboard.h>'?

Auch wenn ich oben folgendes einfüge:

#include "Keyboard.h"
oder
#include <Keyboard.h>

gehts nicht....

Edit 2

Kompilieren ging nun. Musste über das Menü die Bibliothek Keyboard einbinden.
Ob das ganze funktioniert, werde ich sehen, wenn der Leonardo da ist.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.11.2015, 15:47
Beitrag #7
RE: Mit Rotary Encoder Tastatur simulieren?
Code funktioniert leider nicht. Einer Ahnung woran es liegt?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
11.11.2015, 21:53
Beitrag #8
RE: Mit Rotary Encoder Tastatur simulieren?
erst hat er überhaupt keine Zeichen ausgegeben. Inzwischen gibt er was aus, aber nur Müll....

Mehr als diese beiden Zeichen kommen nicht, auf allen Pins
Code:
ßßßßßßßßßß`ßßßßßßßßßßß`ß`ßßßßß`ß`ß`ß`ß`ß`ß`ß`ß``

Code:
#include <Keyboard.h>

const int buttonStateLeftRE1 = 2;
const int buttonStateRightRE1 = 3;
const int buttonStateButtonRE1 = 4;

const int buttonStateLeftRE2 = 5;
const int buttonStateRightRE2 = 6;
const int buttonStateButtonRE2 = 7;

int timer1 = 0;
int timer2 = 0;

void setup()
{    
  pinMode(buttonStateLeftRE1, INPUT);
  pinMode(buttonStateRightRE1, INPUT);
  pinMode(buttonStateButtonRE1, INPUT);
  pinMode(buttonStateLeftRE2, INPUT);
  pinMode(buttonStateRightRE2, INPUT);
  pinMode(buttonStateButtonRE2, INPUT);    
  
  Serial.begin(9600);
  Keyboard.begin();
}

void loop()
{
  // Encoder 1: Drehe Links = sende Pfeil Hoch
  if (digitalRead(buttonStateLeftRE1) == HIGH)
    {
    Keyboard.press(KEY_UP_ARROW);
    delay(100);
    Keyboard.releaseAll();
    }

  // Encoder 1: Drehe Rechts = sende Pfeil Runter
  if (digitalRead(buttonStateRightRE1) == HIGH)
    {
    Keyboard.press(KEY_DOWN_ARROW);
    delay(100);
    Keyboard.releaseAll();
    }
  
  // Encoder 1: Button
  if (digitalRead(buttonStateButtonRE1) == HIGH)
    {
        while(buttonStateButtonRE1 == HIGH)
        {
         //timer starten
         timer1 = 1;
         delay(1500);
         timer1 = 2;
        }

       if (timer1 == 1)
       {  
          Keyboard.press(118);
          delay(100);
          Keyboard.releaseAll();
          timer1 = 0;
       }
  
       if (timer1 == 2)
       {  
          Keyboard.press(119);
          delay(100);
          Keyboard.releaseAll();
          timer1 = 0;
       }
    } // End If
    
  
  // Encoder 2: Drehe Links = sende Minus (Lautstaerke runter)
  if (digitalRead(buttonStateLeftRE2) == HIGH)
    {
    Keyboard.press(45);
    delay(100);
    Keyboard.releaseAll();
    }

  // Encoder 2: Drehe Rechts = sende Plus (Lautstaerke Hoch)
  if (digitalRead(buttonStateRightRE2) == HIGH)
    {
    Keyboard.press(43);
    delay(100);
    Keyboard.releaseAll();
    }
  
  // Encoder 2: Button
  if (digitalRead(buttonStateButtonRE2) == HIGH)
    {
        while(buttonStateButtonRE2 == HIGH)
        {
         //timer starten
         timer2 = 1;
         delay(1500);
         timer2 = 2;
        }

       if (timer2 == 1)
       {  
          Keyboard.press(120);
          delay(100);
          Keyboard.releaseAll();
          timer2 = 0;
       }
  
       if (timer2 == 2)
       {  
          Keyboard.press(121);
          delay(100);
          Keyboard.releaseAll();
          timer2 = 0;
       }
    } // End If
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Pins am Drehregler (Rotary Encoder) facebraker 49 8.789 23.11.2015 09:29
Letzter Beitrag: noxx

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste