#define KEY_A 0x04 // A key on keyboard, 'a' or 'A' #define KEY_B 0x05 #define KEY_C 0x06 #define KEY_D 0x07 #define KEY_E 0x08 #define KEY_F 0x09 #define KEY_G 0x0A #define KEY_H 0x0B #define KEY_I 0x0C #define KEY_J 0x0D #define KEY_K 0x0E #define KEY_L 0x0F #define KEY_M 0x10 #define KEY_N 0x11 #define KEY_O 0x12 #define KEY_P 0x13 #define KEY_Q 0x14 #define KEY_R 0x15 #define KEY_S 0x16 #define KEY_T 0x17 #define KEY_U 0x18 #define KEY_V 0x19 #define KEY_W 0x1A #define KEY_X 0x1B #define KEY_Y 0x1C #define KEY_Z 0x1D #define KEY_1 0x1E // 1 key on keyboard, '1' or '!' #define KEY_2 0x1F // 2 key on keyboard, '2' or '@' #define KEY_3 0x20 // 3 key on keyboard, '3' or '#' #define KEY_4 0x21 // 4 key on keyboard, '4' or '$' #define KEY_5 0x22 // 5 key on keyboard, '5' or '%' #define KEY_6 0x23 // 6 key on keyboard, '6' or '^' #define KEY_7 0x24 // 7 key on keyboard, '7' or '&' #define KEY_8 0x25 // 8 key on keyboard, '8' or '*' #define KEY_9 0x26 // 9 key on keyboard, '(' or '(' #define KEY_0 0x27 // 0 key on keyboard, '0' or ')' #define KEY_ENTER 0x28 // Keyboard Enter key, different from Keypad enter #define KEY_ESC 0x29 // Escape #define KEY_BACKSPACE 0x2A // Backspace #define KEY_TAB 0x2B // Tab #define KEY_SPACE 0x2C // Spacebar #define KEY_MINUS 0x2D // Minus key, '-' or '_' #define KEY_EQUAL 0x2E // Equals key, '=' or '+' #define KEY_LEFTBRACE 0x2F // Left brace, '[' or '{' #define KEY_RIGHTBRACE 0x30 // Right brace, ']' or '}' #define KEY_BACKSLASH 0x31 // Backslash key, '\' or '|' #define KEY_NONUSHASH 0x32 // Non-US '#' and '~' #define KEY_SEMICOLON 0x33 // Semicolon key, ';' or ':' #define KEY_APOSTROPHE 0x34 // Apostrophe key, ''' or double-quotes #define KEY_GRAVE 0x35 // Grave accent key, '' or '~' #define KEY_COMMA 0x36 // Comma key, ',' or '<' #define KEY_DOT 0x37 // Dot key, '.' or '>' #define KEY_SLASH 0x38 // Forward slash key, '/' or '?' #define KEY_CAPSLOCK 0x39 // Caps Lock key, #define KEY_F1 0x3A // Keyboard F1 key #define KEY_F2 0x3B // Keyboard F2 key #define KEY_F3 0x3C #define KEY_F4 0x3D #define KEY_F5 0x3E #define KEY_F6 0x3F #define KEY_F7 0x40 #define KEY_F8 0x41 #define KEY_F9 0x42 #define KEY_F10 0x43 #define KEY_F11 0x44 #define KEY_F12 0x45 #define KEY_SYSRQ 0x46 // PrintScreen Key #define KEY_SCROLLLOCK 0x47 // Scroll Lock key #define KEY_PAUSE 0x48 // Pause key #define KEY_INSERT 0x49 // Insert key #define KEY_HOME 0x4A // Home key #define KEY_PAGEUP 0x4B // Page up key #define KEY_DELETE 0x4C // Delete Forward key #define KEY_END 0x4D // End key #define KEY_PAGEDOWN 0x4E // Page down key #define KEY_RIGHT 0x4F // Right arrow #define KEY_LEFT 0x50 // Left arrow #define KEY_DOWN 0x51 // Down arrow #define KEY_UP 0x52 // Up arrow #define KEY_NUMLOCK 0x53 // Num Lock and clear #define KEY_KPSLASH 0x54 // Keypad Forward slash (/) #define KEY_KPASTERISK 0x55 // Keypad asterisk (*) #define KEY_KPMINUS 0x56 // Keypad minus (-) #define KEY_KPPLUS 0x57 // Keypad plus (+) #define KEY_KPENTER 0x58 // Keypad Enter, different from keyboard enter #define KEY_KP1 0x59 // Keypad 1 and End #define KEY_KP2 0x5A // Keypad 2 and Down arrow #define KEY_KP3 0x5B // Keypad 3 and Page Down #define KEY_KP4 0x5C // Keypad 4 and Left arrow #define KEY_KP5 0x5D // Keypad 5 #define KEY_KP6 0x5E // Keypad 6 and Right arrow #define KEY_KP7 0x5F // Keypad 7 and Home #define KEY_KP8 0x60 // Keypad 8 and Up arrow #define KEY_KP9 0x61 // Keypad 9 and Page up #define KEY_KP0 0x62 // Keypad 0 and Insert #define KEY_KPDOT 0x63 // Keypad . and Delete #define KEY_102ND 0x64 // Keyboard Non-US \ and | #define KEY_COMPOSE 0x65 // Keyboard application, right click-ish 'compose' key #define KEY_POWER 0x66 // Keyboard Power, not usually a phsyical key #define KEY_KPEQUAL 0x67 // Keypad = #define KEY_F13 0x68 // Keyboard F13 #define KEY_F14 0x69 #define KEY_F15 0x6A #define KEY_F16 0x6B #define KEY_F17 0x6C #define KEY_F18 0x6D #define KEY_F19 0x6E #define KEY_F20 0x6F #define KEY_F21 0x70 #define KEY_F22 0x71 #define KEY_F23 0x72 #define KEY_F24 0x73 // Keyboard F24 #define KEY_OPEN 0x74 // Keyboard Execute #define KEY_HELP 0x75 // Keyboard Help #define KEY_PROPS 0x76 // Keyboard Menu #define KEY_FRONT 0x77 // Keyboard Select #define KEY_STOP 0x78 // Keyboard Stop #define KEY_AGAIN 0x79 // Keyboard Again #define KEY_UNDO 0x7A // Keyboard Undo #define KEY_CUT 0x7B // Keyboard Cut #define KEY_COPY 0x7C // Keyboard Copy #define KEY_PASTE 0x7D // Keyboard Paste #define KEY_FIND 0x7E // Keyboard Find #define KEY_MUTE 0x7F // Keyboard Mute #define KEY_VOLUMEUP 0x80 // Keyboard Volume Up #define KEY_VOLUMEDOWN 0x81 // Keyboard Volume Down #define KEY_RETURN 0x9E // Keyboard Return #define KEY_LEFTCTRL 0xE0 // Keyboard Left Control #define KEY_LEFTSHIFT 0xE1 // Keyboard Left Shift #define KEY_LEFTALT 0xE2 // Keyboard Left Alt #define KEY_LEFTGUI 0xE3 // Keyboard Left GUI, windows key #define KEY_RIGHTCTRL 0xE4 // Keyboard Right control #define KEY_RIGHTSHIFT 0xE5 // Keyboard Right Shift #define KEY_RIGHTALT 0xE6 // Keyboard Right alt #define KEY_RIGHTGUI 0xE7 // Keyboard Right GUI, windows key #define KEY_PLAYPAUSE 0xE8 // Reserved? ...\/ #define KEY_STOPCD 0xE9 #define KEY_PREVIOUSSONG 0xEA #define KEY_NEXTSONG 0xEB #define KEY_EJECTCD 0xEC #define KEY_WWW 0xF0 #define KEY_BACK 0xF1 #define KEY_FORWARD 0xF2 #define KEY_SCROLLUP 0xF5 #define KEY_SCROLLDOWN 0xF6 #define KEY_EDIT 0xF7 void sendKey(byte key, byte key2, byte modifiers) { KeyReport report = {0}; // Create an empty KeyReport /* First send a report with the keys and modifiers pressed */ report.keys[0] = key; // set the KeyReport to key report.keys[1] = key2; report.modifiers = modifiers; // set the KeyReport's modifiers report.reserved = 1; Keyboard.sendReport(&report); // send the KeyReport /* Now we've got to send a report with nothing pressed */ for (int i=0; i<6; i++) report.keys[i] = 0; // clear out the keys report.modifiers = 0x00; // clear out the modifires report.reserved = 0; Keyboard.sendReport(&report); // send the empty key report } void loop(){ } // A fun sketch to demonstrate the use of the Tone library. // To mix the output of the signals to output to a small speaker (i.e. 8 Ohms or higher), // simply use 1K Ohm resistors from each output pin and tie them together at the speaker. // Don't forget to connect the other side of the speaker to ground! // You can get more RTTTL (RingTone Text Transfer Language) songs from // http://code.google.com/p/rogue-code/wiki/ToneLibraryDocumentation /************************************************* * Public Constants *************************************************/ #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE_GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE_GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTE_D3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE_GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE_B3 247 #define NOTE_C4 262 #define NOTE_CS4 277 #define NOTE_D4 294 #define NOTE_DS4 311 #define NOTE_E4 330 #define NOTE_F4 349 #define NOTE_FS4 370 #define NOTE_G4 392 #define NOTE_GS4 415 #define NOTE_A4 440 #define NOTE_AS4 466 #define NOTE_B4 494 #define NOTE_C5 523 #define NOTE_CS5 554 #define NOTE_D5 587 #define NOTE_DS5 622 #define NOTE_E5 659 #define NOTE_F5 698 #define NOTE_FS5 740 #define NOTE_G5 784 #define NOTE_GS5 831 #define NOTE_A5 880 #define NOTE_AS5 932 #define NOTE_B5 988 #define NOTE_C6 1047 #define NOTE_CS6 1109 #define NOTE_D6 1175 #define NOTE_DS6 1245 #define NOTE_E6 1319 #define NOTE_F6 1397 #define NOTE_FS6 1480 #define NOTE_G6 1568 #define NOTE_GS6 1661 #define NOTE_A6 1760 #define NOTE_AS6 1865 #define NOTE_B6 1976 #define NOTE_C7 2093 #define NOTE_CS7 2217 #define NOTE_D7 2349 #define NOTE_DS7 2489 #define NOTE_E7 2637 #define NOTE_F7 2794 #define NOTE_FS7 2960 #define NOTE_G7 3136 #define NOTE_GS7 3322 #define NOTE_A7 3520 #define NOTE_AS7 3729 #define NOTE_B7 3951 #define NOTE_C8 4186 #define NOTE_CS8 4435 #define NOTE_D8 4699 #define NOTE_DS8 4978 #define OCTAVE_OFFSET 0 int notes[] = { 0, NOTE_C4, NOTE_CS4, NOTE_D4, NOTE_DS4, NOTE_E4, NOTE_F4, NOTE_FS4, NOTE_G4, NOTE_GS4, NOTE_A4, NOTE_AS4, NOTE_B4, NOTE_C5, NOTE_CS5, NOTE_D5, NOTE_DS5, NOTE_E5, NOTE_F5, NOTE_FS5, NOTE_G5, NOTE_GS5, NOTE_A5, NOTE_AS5, NOTE_B5, NOTE_C6, NOTE_CS6, NOTE_D6, NOTE_DS6, NOTE_E6, NOTE_F6, NOTE_FS6, NOTE_G6, NOTE_GS6, NOTE_A6, NOTE_AS6, NOTE_B6, NOTE_C7, NOTE_CS7, NOTE_D7, NOTE_DS7, NOTE_E7, NOTE_F7, NOTE_FS7, NOTE_G7, NOTE_GS7, NOTE_A7, NOTE_AS7, NOTE_B7 }; char *song = "MissionImp:d=16,o=6,b=95:32d,32d#,32d,32d#,32d,32d#,32d,32d#,32d,32d,32d#,32e,32f,32f#,32g,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,g,8p,g,8p,a#,p,c7,p,g,8p,g,8p,f,p,f#,p,a#,g,2d,32p,a#,g,2c#,32p,a#,g,2c,a#5,8c,2p,32p,a#5,g5,2f#,32p,a#5,g5,2f,32p,a#5,g5,2e,d#,8d"; void setup(void) { pinMode(11, OUTPUT); pinMode(9, OUTPUT); delay(1000); // Lock Me 0.3 - Script opens Notepad and types a message concerning locking the computer - by SurfKahuna (RJC) sendKey(KEY_F2, 0, 0 | KEY_MODIFIER_LEFT_ALT); delay(2000); Keyboard.print("gedit"); sendKey(KEY_ENTER, 0, 0); delay(3000); Keyboard.print(" , ,\\ ,'\\,'\\ ,'\\ ,\\ ,"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" , ,\\/ \\' `' ` ' /|"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" |\\/ |"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" : |"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" : |"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" | |"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" | |"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" : -. _|"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" : \\ `."); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" | ________:______\\"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" : ,'o / o ,"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" : \\ ,'-----./"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" \\_ `--.--' )"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" ,` `. ,---'|"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" : ` |"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" `,-' |"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" / ,---. ,'"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" ,-' `-,------'"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" `. ,--'"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" `-.____/"); sendKey(KEY_ENTER, 0, 0); Keyboard.print(" \\"); sendKey(KEY_ENTER, 0, 0); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); Keyboard.print("I will learn to lock my computer."); sendKey(KEY_ENTER, 0, 0); sendKey(KEY_ENTER, 0, 0); Keyboard.print("There, just like Bart Simpson."); sendKey(KEY_ENTER, 0, 0); sendKey(KEY_ENTER, 0, 0); Keyboard.print("Please remember to lock your computer when you step away from your desk."); sendKey(KEY_ENTER, 0, 0); sendKey(KEY_ENTER, 0, 0); Keyboard.print("Thank you."); sendKey(KEY_ENTER, 0, 0); delay(1000); sendKey(KEY_SPACE, 0, 0 | KEY_MODIFIER_LEFT_ALT); delay(500); Keyboard.print("x"); play_rtttl(song); } #define isdigit(n) (n >= '0' && n <= '9') void play_rtttl(char *p) { // Absolutely no error checking in here byte default_dur = 4; byte default_oct = 6; int bpm = 63; int num; long wholenote; long duration; byte note; byte scale; // format: d=N,o=N,b=NNN: // find the start (skip name, etc) while(*p != ':') p++; // ignore name p++; // skip ':' // get default duration if(*p == 'd') { p++; p++; // skip "d=" num = 0; while(isdigit(*p)) { num = (num * 10) + (*p++ - '0'); } if(num > 0) default_dur = num; p++; // skip comma } // get default octave if(*p == 'o') { p++; p++; // skip "o=" num = *p++ - '0'; if(num >= 3 && num <=7) default_oct = num; p++; // skip comma } // get BPM if(*p == 'b') { p++; p++; // skip "b=" num = 0; while(isdigit(*p)) { num = (num * 10) + (*p++ - '0'); } bpm = num; p++; // skip colon } // BPM usually expresses the number of quarter notes per minute wholenote = (60 * 1000L / bpm) * 4; // this is the time for whole note (in milliseconds) // now begin note loop while(*p) { // first, get note duration, if available num = 0; while(isdigit(*p)) { num = (num * 10) + (*p++ - '0'); } if(num) duration = wholenote / num; else duration = wholenote / default_dur; // we will need to check if we are a dotted note after // now get the note note = 0; switch(*p) { case 'c': note = 1; break; case 'd': note = 3; break; case 'e': note = 5; break; case 'f': note = 6; break; case 'g': note = 8; break; case 'a': note = 10; break; case 'b': note = 12; break; case 'p': default: note = 0; } p++; // now, get optional '#' sharp if(*p == '#') { note++; p++; } // now, get optional '.' dotted note if(*p == '.') { duration += duration/2; p++; } // now, get scale if(isdigit(*p)) { scale = *p - '0'; p++; } else { scale = default_oct; } scale += OCTAVE_OFFSET; if(*p == ',') p++; // skip comma for next note (or we may be at the end) // now play the note if(note) { digitalWrite(9, HIGH); int danFreq; float danDur; danFreq = notes[(scale - 4) * 12 + note]; danDur = 1000000 / danFreq; unsigned long start = millis(); while (millis() - start <= duration) { digitalWrite(11, HIGH); delayMicroseconds(danDur); digitalWrite(11, LOW); delayMicroseconds(danDur); } digitalWrite(9, LOW); } else { delay(duration); } } }