Pages: [1]   Go Down
Author Topic: Keyboard problem with Arduino Leonardo  (Read 1473 times)
0 Members and 1 Guest are viewing this topic.
Norway
Offline Offline
Full Member
***
Karma: 1
Posts: 143
likes to program Arduinos!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi!
I'm trying to make an arcade controller for iPad (iCade controller) with my arduino Leonardo, but I some probelms.

when I push a button, the arduino will send a character, and when I release the button, the arduino will send a different character.

my code looks like this:
Code:

void setup() {
  pinMode(0, INPUT_PULLUP);
  pinMode(1, INPUT_PULLUP);
  pinMode(2, INPUT_PULLUP);
  pinMode(3, INPUT_PULLUP);
  pinMode(4, INPUT_PULLUP);
  pinMode(5, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
  pinMode(7, INPUT_PULLUP);
  pinMode(8, INPUT_PULLUP);
  pinMode(9, INPUT_PULLUP);
  pinMode(10, INPUT_PULLUP);
  pinMode(11, INPUT_PULLUP);
 
  Keyboard.begin();
}

void loop() {
  if(digitalRead(0) == LOW)                     //UP
  { Keyboard.press('w'); }
    else(Keyboard.release('w'));
    if(digitalRead(0) != LOW)
    { Keyboard.press('e'); }   
    else(Keyboard.release('e'));

  if(digitalRead(1) == LOW)                      //DOWN
  { Keyboard.press('x'); }
    else(Keyboard.release('x'));
    if(digitalRead(1) != LOW)
    { Keyboard.press('z'); }   
    else(Keyboard.release('z'));


  if(digitalRead(2) == LOW)                      //LEFT
  { Keyboard.press('a'); }
    else(Keyboard.release('a'));
    if(digitalRead(2) != LOW)
    { Keyboard.press('q'); }   
    else(Keyboard.release('q'));

  if(digitalRead(3) == LOW)                      //RIGHT
  { Keyboard.press('d'); }
    else(Keyboard.release('d'));
    if(digitalRead(3) != LOW)
    { Keyboard.press('c'); }   
    else(Keyboard.release('c'));

  if(digitalRead(4) == LOW)                      //A
  { Keyboard.press('y'); }
    else(Keyboard.release('y'));
    if(digitalRead(4) != LOW)
    { Keyboard.press('t'); }   
    else(Keyboard.release('t'));
   
    if(digitalRead(5) == LOW)                      //B
  { Keyboard.press('h'); }
    else(Keyboard.release('h'));
    if(digitalRead(5) != LOW)
    { Keyboard.press('r'); }   
    else(Keyboard.release('r'));   
   
     if(digitalRead(6) == LOW)                      //C
  { Keyboard.press('u'); }
    else(Keyboard.release('u'));
    if(digitalRead(6) != LOW)
    { Keyboard.press('f'); }   
    else(Keyboard.release('f'));   
   
    if(digitalRead(7) == LOW)                    //D
  { Keyboard.press('j'); }
    else(Keyboard.release('j'));
    if(digitalRead(7) != LOW)
    { Keyboard.press('n'); }   
    else(Keyboard.release('n'));       

    if(digitalRead(8) == LOW)                    //E
  { Keyboard.press('i'); }
    else(Keyboard.release('i'));
    if(digitalRead(8) != LOW)
    { Keyboard.press('m'); }   
    else(Keyboard.release('m'));   
   
    if(digitalRead(9) == LOW)                    //F
  { Keyboard.press('k'); }
    else(Keyboard.release('k'));
    if(digitalRead(9) != LOW)
    { Keyboard.press('p'); }   
    else(Keyboard.release('p'));       

    if(digitalRead(10) == LOW)                   //G
  { Keyboard.press('o'); }
    else(Keyboard.release('o'));
    if(digitalRead(10) != LOW)
    { Keyboard.press('g'); }   
    else(Keyboard.release('g'));     
   
    if(digitalRead(11) == LOW)                   //H
  { Keyboard.press('l'); }
    else(Keyboard.release('l'));
    if(digitalRead(11) != LOW)
    { Keyboard.press('y'); }   
    else(Keyboard.release('y')); 
   
    }


This code worked flawlessly with only six buttons in the code (including //B), but now, with 12 buttons, the arduino don't respont on button presses and sometimes output wrong caracters.
Whats wrong? can it be RAM limitations?
Logged

Queens, New York
Online Online
Faraday Member
**
Karma: 108
Posts: 3785
"Of all the things I've ever lost, I miss my mind the most" -Ozzy Osbourne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quick question, why do you need "digitalRead(0) == LOW" if all your inputs are pulled high?

Also you dont need the extra () in "else ( Keyboard.release('w') ) ;" just do this  "else  Keyboard.release('w') ;"

It might just be the timing, because the loop it is going throught a lot of IF statements, use if, else If, else for up/down, and left/ right, they dont need to be separate statements. It could make you processing a little faster.
Logged

Created Libraries:
TFT_Extension, OneWireKeypad, SerialServo, (UPD)WiiClassicController, VWID

Norway
Offline Offline
Full Member
***
Karma: 1
Posts: 143
likes to program Arduinos!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The buttons are just connected to ground, so when a button is pressed digitalRead(0) becomes low
Logged

Queens, New York
Online Online
Faraday Member
**
Karma: 108
Posts: 3785
"Of all the things I've ever lost, I miss my mind the most" -Ozzy Osbourne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok so then you dont need if(digitalRead(1) != LOW), you just need to check if at any point it goes LOW.
Logged

Created Libraries:
TFT_Extension, OneWireKeypad, SerialServo, (UPD)WiiClassicController, VWID

Norway
Offline Offline
Full Member
***
Karma: 1
Posts: 143
likes to program Arduinos!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The arduino is going to simulate the iCace controller for iPad.
this is the ASCII charaters form it:


Code:
iCade ASCII:
UP ON,OFF  = w,e  
RT ON,OFF  = d,c  
DN ON,OFF  = x,z  
LT ON,OFF  = a,q  
A  ON,OFF  = y,t  
B  ON,OFF  = h,r  
C  ON,OFF  = u,f  
D  ON,OFF  = j,n  
E  ON,OFF  = i,m  
F  ON,OFF  = k,p  
G  ON,OFF  = o,g  
H  ON,OFF  = l,v


the reason whi I have  if(digitalRead(0) != LOW) is because I want the arduino to print a different character when you release the button smiley
When you release the button, the arduino reads it as HIGH. I cound write if(digitalRead(0) == HIGH), that would give the same result
« Last Edit: December 20, 2012, 09:56:09 am by hansibull » Logged

Queens, New York
Online Online
Faraday Member
**
Karma: 108
Posts: 3785
"Of all the things I've ever lost, I miss my mind the most" -Ozzy Osbourne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hmm, ok could you maybe post the errors your getting, like a picture or screenshot?

WAIT, I think you have maybe a debounce issue. You have more code to process so your read time might not be good enough, to compensate for all the button presses.
« Last Edit: December 20, 2012, 10:17:21 am by HazardsMind » Logged

Created Libraries:
TFT_Extension, OneWireKeypad, SerialServo, (UPD)WiiClassicController, VWID

Norway
Offline Offline
Full Member
***
Karma: 1
Posts: 143
likes to program Arduinos!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ok, so what shoul I do? does that means this project is too heavy to do for an Arduino Leoardo, or is there any way you can go around it?
Logged

Queens, New York
Online Online
Faraday Member
**
Karma: 108
Posts: 3785
"Of all the things I've ever lost, I miss my mind the most" -Ozzy Osbourne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Look into the debouncing example and try it out.

But first, see exactly at what point you get those issues and comment out a button one at a time to see your current limits. Then adjust it with either the debounce or a simple delay.
Logged

Created Libraries:
TFT_Extension, OneWireKeypad, SerialServo, (UPD)WiiClassicController, VWID

Norway
Offline Offline
Full Member
***
Karma: 1
Posts: 143
likes to program Arduinos!
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

most of the time none of the buttons respond. but if I hit many buttons, it may be able to send out a single character
Logged

Queens, New York
Online Online
Faraday Member
**
Karma: 108
Posts: 3785
"Of all the things I've ever lost, I miss my mind the most" -Ozzy Osbourne
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

yea, thats a debounce issue.
Logged

Created Libraries:
TFT_Extension, OneWireKeypad, SerialServo, (UPD)WiiClassicController, VWID

Offline Offline
Newbie
*
Karma: 0
Posts: 2
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Keypad library now has debounce and, from what i can tell, edge detection of some sort, too. Not quite documented but you can look at the multi-key example included in the lib.
Logged

Des Moines, Iowa, USA
Offline Offline
Jr. Member
**
Karma: 0
Posts: 52
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi!
I'm trying to make an arcade controller for iPad (iCade controller) with my arduino Leonardo, but I some probelms.

If it helps, I have code I wrote for a Teensy 2.0 using the Arduino IDE that contains debounce code, etc. It also works on Arduino. If it is of help, you may find it here:

http://appleause.com/category/ios/icade/

I am not done with the project, but it may give you some ideas.
Logged

Embedded Software Engineer
UNO | Leonardo | Due | Teensy | BASIC Stamp
http://www.subethasoftware.com

Pages: [1]   Go Up
Jump to: