32 buttons for a fully-functioning hand-held USB keyboard.
/* LucidTronix LEO Keyboard * works as standard USB keyboard * Tutorial and details at: * http://www.lucidtronix.com/tutorials/51 * This code requires Arduino Leonardo */ int dataPin = 4;int clockPin = 5;int latchPin = 6;unsigned long last_press = 0;unsigned long last_key_press = 0;char* letters[] ={"abcdefgh","ijklmnop","qrstuvwx","yz -@#.@" };int leds[] = {7,8,9};int num_chars = 43;int num_registers = 4;byte button_states[] = {0x00,0x00,0x00,0x00}; //01001000int cursor_index = 0;int char_index = 0;char cur_char = 'X';boolean shifting = false;void setup() { Serial.begin(9600); pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, INPUT); for(int i = 0 ; i < 3; i++) pinMode(leds[i], OUTPUT); for(int i = 0 ; i < 3; i++) digitalWrite(leds[i], HIGH); delay(200); for(int i = 0 ; i < 3; i++) digitalWrite(leds[i], LOW); }void loop() { if (millis() - last_key_press > 450) read_keyboard(); if ( shifting ) digitalWrite(leds[0], HIGH); else digitalWrite(leds[0], LOW); delay(350);}void read_keyboard(){ //set it to 0 to transmit data serially digitalWrite(latchPin,LOW); //while the shift register is in serial mode //collect each shift register into a byte //the register attached to the chip comes in first for (int i = 0; i < num_registers; i++){ button_states[i] = shiftIn(dataPin, clockPin); } boolean something_in = false; for (int i = 0; i < num_registers; i++){ something_in = translate_buttons_2_keys(button_states[i], letters[i]); if (something_in) last_key_press = millis(); } digitalWrite(latchPin,HIGH);}boolean translate_buttons_2_keys(byte buttons, char* keys){ for(int i = 0 ; i < 8; i++){ if ( (1 << i) & buttons ){ cur_char = keys[i]; if (keys[i] == '-') Keyboard.write(KEY_RETURN); else if (keys[i] == '@') Keyboard.write(KEY_BACKSPACE); else if (keys[i] == '#' && shifting) Keyboard.release(KEY_LEFT_SHIFT); else if (keys[i] == '#' && !shifting) Keyboard.press(KEY_LEFT_SHIFT); else if (keys[i] == '|') Keyboard.write(21); else Keyboard.print(keys[i]); if (keys[i] == '#') shifting = !shifting; char_index++; return true; } } return false; }byte shiftIn(int myDataPin, int myClockPin) { int i; int temp = 0; int pinState; byte myDataIn = 0; pinMode(myClockPin, OUTPUT); pinMode(myDataPin, INPUT); for (i=7; i>=0; i--) { digitalWrite(myClockPin, 0); delayMicroseconds(20); temp = digitalRead(myDataPin); if (temp) { pinState = 1; myDataIn = myDataIn | (1 << i); } else { pinState = 0; } digitalWrite(myClockPin, 1); } return myDataIn;}
| Title | Description | # | Cost | Link | Picture |
| PCB Leo Keyboard | Printed Circuit Board for shift register based Leonardo Keyboard | 1 | $7.0 | Link |
|
| ATMEGA32U4-MU | Integrated Circuits MCU AVR 32K FLASH 16MHZ 44-QFNValue:2.7 V ~ 5.5 V 16MHz | 1 | $6.04 | Link |
|
| USB Micro B Female Connector | Micro USB Surface Mount, Right Angle, Horizontal | 1 | $0.72 | Link |
|
| Voltage Regulator 3v3 SMD | IC REG LDO 3.3V .15A SOT23 Up to 6V input output 3.3V 150mA (Max)Value:3.3V | 1 | $0.46 | Link |
|
| Shift Register | IC STATIC SHFT REG 8STG 16-TSSOP Parallel or Serial to Serial 3 V ~ 18 VValue: Parallel to Serial | 4 | $0.45 | Link |
|
| Switch | SWITCH SLIDE DPDT 6VDC 0.3A SMTValue:DPDT | 1 | $0.44 | Link |
|
| Button | Tactile switch SMD SPST 0.05A 12VValue:SPST | 33 | $0.2 | Link |
|
| Resistor Array | RES ARRAY 10K OHM 4 RES 1206Value:10k | 8 | $0.12 | Link |
|
| LED SMD | LED CHIPLED 645NM Red diffuse 1206. Green polarity indicator is opposite of normal.Value:1.8v Red | 4 | $0.11 | Link |
|
Comments: