kopper:
One of the members, PaulS, suggested the Teensy USB Development Board, which is very similar to an arduino but appears to be much friendlier with the virtual keyboard setup.
The Teensy and Teensy++ are much better suited for Virtual Keyboard applications because they use a processor that has USB functionality built in. They actually have D+ and D- pins. I may get one as some point, especially if I need to do heavier USB processing. But for now, I would like to try and get this to work
kopper:
Happy to help getting your arduino running as a keyboard though if I can.
I thank you for your offer of help. So this is how I got to where I am.
I have tried a couple different sketches without success. My progress so far. I started out attempting to compile "VirtualUsbKeyboard.pde" from practicalarduino.com (GitHub - practicalarduino/VirtualUsbKeyboard: Use an Arduino to send HID (Human Interface Device) events to a host computer as if it were a keyboard) just as a starting point.
/**
* VirtualUsbKeyboard
*
* Enumerates itself as a HID (Human Interface Device) to a host
* computer using a USB shield. The Arduino then appears to the host to
* be a USB keyboard and keypress events can be sent on demand.
*
* This example watches the state of 6 push buttons and when a button
* is pressed it sends a matching keypress event to the host.
*
* Copyright 2009 Jonathan Oxer <jon@oxer.com.au>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version. http://www.gnu.org/licenses/
*
* www.practicalarduino.com/projects/easy/virtual-usb-keyboard
*/
// Requires the use of the "UsbKeyboard" library available from
// http://code.rancidbacon.com/ProjectLogArduinoUSB
#include "UsbKeyboard.h"
// Define the inputs to use for buttons
#define BUTTON_A 6
#define BUTTON_B 7
#define BUTTON_C 8
#define BUTTON_D 9
#define BUTTON_MSG 10
#define BUTTON_ENTER 11
// Use the on-board LED as an activity display
int ledPin = 13;
/**
* Configure button inputs and set up the USB connection to the host
*/
void setup()
{
// Set up the activity display LED
pinMode (ledPin, OUTPUT);
digitalWrite (ledPin, HIGH);
// Set the button pins to inputs
pinMode (BUTTON_A, INPUT);
pinMode (BUTTON_B, INPUT);
pinMode (BUTTON_C, INPUT);
pinMode (BUTTON_D, INPUT);
pinMode (BUTTON_MSG, INPUT);
pinMode (BUTTON_ENTER, INPUT);
// Enable the CPU's internal 20k pull-up resistors on the button
// inputs so they default to a "high" state
digitalWrite (BUTTON_A, HIGH);
digitalWrite (BUTTON_B, HIGH);
digitalWrite (BUTTON_C, HIGH);
digitalWrite (BUTTON_D, HIGH);
digitalWrite (BUTTON_MSG, HIGH);
digitalWrite (BUTTON_ENTER, HIGH);
// Disable timer0 since it can mess with the USB timing. Note that
// this means some functions such as delay() will no longer work.
TIMSK0&=!(1<<TOIE0);
// Clear interrupts while performing time-critical operations
cli();
// Force re-enumeration so the host will detect us
usbDeviceDisconnect();
delayMs(250);
usbDeviceConnect();
// Set interrupts again
sei();
}
/**
* Main program loop. Scan for keypresses and send a matching keypress
* event to the host
* FIXME: currently repeats as fast as it can. Add transition detection
*/
void loop()
{
UsbKeyboard.update();
if (digitalRead(BUTTON_A) == LOW) {
UsbKeyboard.sendKeyStroke(KEY_A);
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
}
if (digitalRead(BUTTON_B) == LOW) {
UsbKeyboard.sendKeyStroke(KEY_B);
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
}
if (digitalRead(BUTTON_C) == LOW) {
UsbKeyboard.sendKeyStroke(KEY_C);
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
}
if (digitalRead(BUTTON_D) == LOW) {
UsbKeyboard.sendKeyStroke(KEY_D);
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
}
if (digitalRead(BUTTON_MSG) == LOW) {
UsbKeyboard.sendKeyStroke(KEY_H, MOD_SHIFT_LEFT);
UsbKeyboard.sendKeyStroke(KEY_E);
UsbKeyboard.sendKeyStroke(KEY_L);
UsbKeyboard.sendKeyStroke(KEY_L);
UsbKeyboard.sendKeyStroke(KEY_O);
UsbKeyboard.sendKeyStroke(KEY_SPACE);
UsbKeyboard.sendKeyStroke(KEY_W, MOD_SHIFT_LEFT);
UsbKeyboard.sendKeyStroke(KEY_O);
UsbKeyboard.sendKeyStroke(KEY_R);
UsbKeyboard.sendKeyStroke(KEY_L);
UsbKeyboard.sendKeyStroke(KEY_D);
UsbKeyboard.sendKeyStroke(KEY_ENTER);
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
}
if (digitalRead(BUTTON_ENTER) == LOW) {
UsbKeyboard.sendKeyStroke(KEY_ENTER);
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle status LED
}
}
/**
* Define our own delay function so that we don't have to rely on
* operation of timer0, the interrupt used by the internal delay()
*/
void delayMs(unsigned int ms)
{
for (int i = 0; i < ms; i++) {
delayMicroseconds(1000);
}
}
Of course it failed. It says it need a library from (http://code.rancidbacon.com/ProjectLogArduinoUSB). So I downloaded it and copied the library "UsbKeyboard" into my Arduino IDE libraries. Attempted to compile again and it failed again.
Well in the UsbKeyboard library there is a text file "ArduinoNotes.txt" which says among other things:
At present the IDE won't compile our library so it needs to be pre-compiled with:
avr-g++ -Wall -Os -I. -DF_CPU=16000000 -mmcu=atmega168 -c usbdrvasm.S -c usbdrv.c
So from the command line in the library I run:
C:\Arduino\arduino-1.0.1\libraries\UsbKeyboard>C:\Arduino\arduino-1.0.1\hardware\tools\avr\bin\avr-g++.exe -Wall -Os -I. -DF_CPU=16000000 -mmcu=atmega328p -c usbdrvasm.S -c usbdrv.c
usbdrv.c:70: warning: only initialized variables can be placed into program memory area
usbdrv.c:80: warning: only initialized variables can be placed into program memory area
usbdrv.c:89: warning: only initialized variables can be placed into program memory area
usbdrv.c:111: warning: only initialized variables can be placed into program memory area
usbdrv.c:142: warning: only initialized variables can be placed into program memory area
Again I try and fail to compile and link the sketch. I get the following errors:
VirtualUsbKeyboard.cpp.o: In function UsbKeyboardDevice': C:\Arduino\arduino-1.0.1\libraries\UsbKeyboard/UsbKeyboard.h:139: undefined reference to usbInit()'
VirtualUsbKeyboard.cpp.o: In function UsbKeyboardDevice::update()': C:\Arduino\arduino-1.0.1\libraries\UsbKeyboard/UsbKeyboard.h:150: undefined reference to usbPoll()'
At this point I have hit a wall. I'm not sure what to try next. So near and yet so far.
What is the next step? What has worked for you? Does the new IDE not support this? Do I have an out of date library?