Learning   Examples | Foundations | Hacking | Links

Examples > Keyboard Library

Keyboard Reprogram

This example uses the Keyboard library to open a new Arduino sketch window, send keyboard commands that type in the Blink example, and reprograms the board. After running this sketch and connecting pin2 to ground, the Arduinio will have a new program.

NB: When you use the Keyboard.print() command, the Arduino takes over your computer's keyboard! To insure you don't lose control of your computer while running a sketch with this function, make sure to set up a reliable control system before you call Keyboard.print(). This sketch is designed to only send Keyboard commands after digital pin 2 is pulled to ground.

Hardware Required

  • Arduino Leonardo, Micro, or Due board
  • hookup wire

Software Required

  • Arduino IDE

Circuit
Connect your board to your computer with a micro-USB cable.

To run the sketch, connect a hook-up wire from pin 2 to ground. For this to run successfully, keep the Arduino software running as the frontmost application.

click the images to enlarge

image developed using Fritzing. For more circuit examples, see the Fritzing project page

Code

/*
  Arduino Programs Blink
 
 This sketch demonstrates the Keyboard library.
 
 When you connect pin 2 to ground, it creates a new
 window with a key combination (CTRL-N),
 then types in the Blink sketch, then auto-formats the text
 using another key combination (CTRL-T), then
 uploads the sketch to the currently selected Arduino using
 a final key combination (CTRL-U).
 
 Circuit:
 * Arduino Leonardo or Micro
 * wire to connect D2 to ground.
 
 created 5 Mar 2012
 modified 29 Mar 2012
 by Tom Igoe
 
 This example is in the public domain
 
 http://www.arduino.cc/en/Tutorial/KeyboardReprogram
 */


// use this option for OSX.
// Comment it out if using Windows or Linux:
char ctrlKey = KEY_LEFT_GUI;
// use this option for Windows and Linux.
// leave commented out if using OSX:
//  char ctrlKey = KEY_LEFT_CTRL;    


void setup() {
  // make pin 2 an input and turn on the
  // pullup resistor so it goes high unless
  // connected to ground:
  pinMode(2, INPUT_PULLUP);
  // initialize control over the keyboard:
  Keyboard.begin();
}

void loop() {
  while (digitalRead(2) == HIGH) {
    // do nothing until pin 2 goes low
    delay(500);
  }
  delay(1000);
  // new document:
  Keyboard.press(ctrlKey);
  Keyboard.press('n');
  delay(100);
  Keyboard.releaseAll();
  // wait for new window to open:
  delay(1000);

  // Type out "blink":
  Keyboard.println("void setup() {");
  Keyboard.println("pinMode(13, OUTPUT);");
  Keyboard.println("}");
  Keyboard.println();
  Keyboard.println("void loop() {");
  Keyboard.println("digitalWrite(13, HIGH);");
  Keyboard.print("delay(3000);");
  // 3000 ms is too long. Delete it:
  for (int keystrokes=0; keystrokes < 6; keystrokes++) {
    delay(500);
    Keyboard.write(KEY_BACKSPACE);
  }
  // make it 1000 instead:
  Keyboard.println("1000);");
  Keyboard.println("digitalWrite(13, LOW);");
  Keyboard.println("delay(1000);");
  Keyboard.println("}");
  // tidy up:
  Keyboard.press(ctrlKey);
  Keyboard.press('t');
  delay(100);
  Keyboard.releaseAll();
  delay(3000);
  // upload code:
  Keyboard.press(ctrlKey);
  Keyboard.press('u');
  delay(100);
  Keyboard.releaseAll();

  // wait for the sweet oblivion of reprogramming:
  while(true);
}

See Also

Share