Close
0%
0%

Mechanical GKOS keyboard for phones and tablets.

A no-compromise, mechanical switch, 6-button chording keyboard, placed on the rear side of a tablet or a mobile phone.

Public Chat
Similar projects worth following
This project is an attempt to implement a no-compromise, mechanical switch, 6-button chording keyboard, placed on the rear side of a tablet or a mobile phone. For the initial recipient, a 2-year old Lenovo Vibe has been selected, but the implementation could be ported to other phones and tablets of similar or larger size.

Unfortunately, GKOS keyboard open standard (http://gkos.com) seemingly switched to software implementation, thus producing "yet another" unusual on-screen keyboard for mobile phones. IMHO, the GKOS on-screen version, called ComboKey (http://combokey.com/), has all the disadvantages of your typical on-screen keyboard: occupies the precious screen space, has little tactile feedback, and is only good for typing an occasional SMS or a short e-mail reply.

The desired functionality, however, is to be able to write reasonably long and complex texts, such as technical notes from meetings.

A number of fundamental design choices must be made:

(1) Should the keyboard be integrated with the phone/tablet or a separate item? I have seen a number of implementations, such as this

The major problem is that Android relies heavily on finger gestures, and the mouse is not exceptionally useful; yet another is that both hands are occupied. Finally, one-handed chorders are good for typing, but I personally find them difficult for navigation (of course, your thumb may do arrows, but...) One-handed chorders could be excellent with conjunction of wearable computers, but for a phone/tablet? The current choice is to integrate.

(2) Should the keyboard use its own battery or the phone's? Currently I am undecided. On one hand, Arduino uses 20-25 mA of power -- the phone screen consumes way more. On the other hand, since the phone has an extra compartment on the back, why not to add a battery? Hey, the keyboard may even charge the phone! Something to be evaluated in the prototypes.

(3) Closely linked with the above, should the keyboard use Bluetooth or wired connection? If the former, a separate keyboard battery is a must, and both devices will drain the juice slightly faster. Let it be wired for now.

(4) What switches to use? The plan is to source several different types and evaluate.

sketch_gkos_lenovo_mark2.ino

Prototype software with national keyboard support.

ino - 22.89 kB - 05/17/2018 at 03:41

Download

  • 1 × Arduino Pro Micro ATmega32U4 ATMEGA32U4-AU 5V/16MHz
  • 2 × SPST PCB Mount Tactile switch with green LED Jaycar PN SP-0621
  • 2 × Micro USB plugs, male
  • 1 × SPDT Micro Slide Switch Jaycar PN SS0834
  • 8 × Resistors, 1.1k

View all 8 components

  • First Prototype

    ptrav3 days ago 0 comments

    The purpose of this was to check the software with real buttons and simultaneously evaluate the 12x12 mm tactile switches. A quick 3D print was made to hold the switches in the wanted positions:

    The micro-USB wire connects the Pro Micro inside the enclosure with the phone port. The phone was held by two rubber bands. The schematics is as following:

    The current version uses power from the phone. The 50k resistor between the USB lines 4 and 5 assures the phone can recognize the equipment on the other end of USB and send power. This is the same as an OTG cable. Lines 2 and 3 of the phone USB are connected to the same wires on the Arduino USB port, the power line 1 connects, via a slider switch, directly to the Arduino VCC. In the production version, the plan is to cut the Arduino own power regulator and use the USB power directly to reduce the power consumption (note that 5V Arduino is a must!)

    A USB charger can be connected via a dedicated micro-USB port.

    Arduino ports 16 and 9 control two front LEDs (integrated inside the Jaycar switches)

    Ports 10 and 14 are the Shifters, ports 3-8 -- finger switches. Port 15 is reserved to the possible optical readout.

    All four analogue ports and port 2 are not used (this is a potential mouse in the future).

    In terms of software everything worked fine, but the tactile switches proved to be a wrong choice. Individually they press sharp and nice, with a pleasant audible click and good tactile feedback, but it proved to be difficult to hold three switches together at the same time: the total force on one switch is about 50 gram, far too much for prolonged typing.

  • Completed programming

    ptrav6 days ago 0 comments

    The keyboard software is based on the quick-and-dirty GKOS keyboard I have tested earlier.

    The major difference presently is the absence of a mouse/joystick - on an Android phone, I found the mouse pointer pretty useless anyway (this is rather a pun to the Android team, who gave the mouse functionality such a low development priority). The mouse can be added later if I decide on an Raspberry Pi build.


    The keyboard operates in 5 modes:

    0 - normal (small letters)

    1 - single capital letter, then switches back to mode 0. This mode is activated by the left Shifter press and indicated by the left LED.

    2 - all capital letters. This mode is activated by the left Shifter double press and deactivated by the left Shifter. Left LED is lit (Probably will make it blink in the future).

    3 - single symbol / number , then switches back to mode 0. This mode is activated by the right Shifter press. Right LED is lit.

    4 - number mode. This mode is activated by the double right Shifter press. Both LEDs are lit. To cancel the mode back to 0, press any Shifter.

    Additionally, the keyboard handles Russian alphabet, simulating the de-facto standard JCUKEN layout, so Android does not need to deal with any special phonetic keyboards.  Arduino remembers if the current national layout has been activated and if the user moves to the "number" mode switches back to English. This way, the  Russian "e" will not end up in the exponential numbers and such. After the number mode is deactivated, the national symbol mode is automatically restored.

    The only additional (and optional) software on the mobile phone is the NULL Keyboard from wParam, available free on Playstore:

    https://play.google.com/store/apps/details?id=com.wparam.nullkeyboard&hl=en_AU

    It prevents the telephone on-screen keyboard popping up if one switches between input fields.

    The current mode is implemented as following:

      bool modebutton = ReadPinBool( 7);
      if( modebutton && !GKOS_prevRight)
      {
        GKOS_prevRight = true;
        switch (GKOS_mode)
        {
          case 3:
            GKOS_mode = 4;
            #ifdef _DEBUG
            Serial.println( "Mode set to NUM");
            #endif
            break;
          case 4:
            GKOS_mode = 0;
            ForceRusLat( GKOS_prevRussian);
            #ifdef _DEBUG
            Serial.println( "Mode set to NORMAL");
            #endif
            break;
          default:
            GKOS_mode = 3;
            GKOS_prevRussian = GKOS_Russian; 
            ForceRusLat( false);
            #ifdef _DEBUG
            Serial.println( "Mode set to SYMBOL");
            #endif
            break;
        }
        SetLEDs();
      }  
      if( !modebutton && GKOS_prevRight) GKOS_prevRight = false;
      modebutton = ReadPinBool( 6);
      if( modebutton && !GKOS_prevLeft)
      {
        GKOS_prevLeft = true;
        switch (GKOS_mode)
        {
          case 0:
            GKOS_mode = 1;
            #ifdef _DEBUG
            Serial.println( "Mode set to SHIFT");
            #endif
            break;
          case 1:
            GKOS_mode = 2;
            #ifdef _DEBUG
            Serial.println( "Mode set to CAPS");
            #endif
            break;
          case 3:
            GKOS_mode = 4;
            #ifdef _DEBUG
            Serial.println( "Mode set to NUM");
            #endif
            break;
          case 4:
            GKOS_mode = 0;
            ForceRusLat( GKOS_prevRussian);
            #ifdef _DEBUG
            Serial.println( "Mode set to NORMAL");
            #endif
            break;
          default:
            GKOS_mode = 0;
            #ifdef _DEBUG
            Serial.println( "Mode set to NORMAL");
            #endif
            break;
        }
        SetLEDs();
      }  
      if( !modebutton && GKOS_prevLeft) GKOS_prevLeft = false;
    

     The whole sketch is in the project files. If somebody is interested, I can make an English-only version.

View all 2 project logs

Enjoy this project?

Share

Discussions

Similar Projects

Does this project spark your interest?

Become a member to follow this project and never miss any updates