The Cyber Chicklet is a mystery device - see how long it takes you to figure out its purpose as you watch the video....
I am making a blog in honor of arduino day and project14 and element14.
This blog is about some arduino applications that tie in to element14.
The next video is about a Destiny Button implemented on a custom PCB.
This video is simply - Happy arduino day!
I have designed a PCB that I call the HID Conglomerate that can perform all the above functions.
I have been holding off publishing this blog for over a month while waiting for the PCB to arrive.
Unfortunately it has not arrived yet, so I am publishing anyway. The PCB was fabricated over a month ago and I paid extra to have it air mailed here. Apparently it has been in the air for over a month. Canada Post has decided to no longer honor the tracking number systems of other countries, so I can only tell that it left the other country. It is taking longer than if I did not pay for faster delivery. (regular mail) This is the second project in a row that is all messed up by slow PCB mail.
This card can perform any HID function and it has an LCD to display useful information. I can describe a couple of functions I was(am) planning to implement in addition to the examples above:
- The Volume Commander - my Windows 10 computer is notorious for totally ignoring the volume icon in the tray and the keyboard shortcut makes volume changes in increments of 2, so the HID conglomerate would allow fine control of audio volume without needing the tray icon.
- The Browser Navigator - my computer at work has a mouse with no "Back" button so the HID Conglomerate would implement a function to go back to the previous browser page (or forward).
- The Copy Cat - when I am doing a lot of cut and paste, single buttons to perform these functions would be handy.
- The Caddie Hack - I want to implement precise single pixel mouse moves for my CAD systems and my drawing packages. I am a perfectionist when it comes to graphics and CAD drawings, and moving the mouse accurately to a single pixel can be very tedious. This functionality is going to be worth the price of admission by saving significant time performing accurate mouse movements. Note it can be used at the same time as the real mouse - so one device in each hand works well.
- The Perpetuity Paradox - this is the original name for the Cyber Chicklet
- The Destiny Button - described above was really an experiment to see if I could make the mouse fly. I actually wrote a little program that could "handwrite" "Happy arduino day" in a drawing package, but I gave up after writing "Happy" - it was just too tedious. It should be noted that mouse movement is not linear so it is really easy for it to lose track of where the arduino thinks the mouse is.
Update:
The PCBs finally arrived after spending over 6 weeks in air mail limbo, so I got to finish off the project. The finished project photo is added at the top of the blog.
The images below show what is in the module. Note that there are unused connectors that may be used for other projects and applications - because I ordered 10 of these cards (about $1 each).
Here is a little video of the result:
Here is the Cyber Chicklet code:
//Cyber Chicklet //by Doug Wong #include <Mouse.h> void setup(void) { Mouse.begin(); } void loop() { Mouse.move(0, 0, 0); // move mouse 0 pixels delay(120000); // wait 2 minutes }
Here is a program for the Destiny Button:
// //Destiny Project //by Doug Wong //#include <dht11.h> #include <Mouse.h> #include <Keyboard.h> #define DHT11PIN 20 #define PIN_SCE 6 #define PIN_RESET 7 #define PIN_DC 8 #define PIN_SDIN 16 #define PIN_SCLK 15 #define PIN_BL 9 #define LCD_C LOW #define LCD_D HIGH #define LCD_X 84 #define LCD_Y 48 const int led1 = 17; const int E14button = 4; const int Rbutton = 5; const int Lbutton = 10; const int Ubutton = 18; const int Dbutton = 19; int movx = -400; int movxx = 50; int movy = -400; int movyy = 50; int movcount = 0; static const byte ASCII[][5] = { {0x00, 0x00, 0x00, 0x00, 0x00} // 20 ,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 ! ,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 " ,{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 # ,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $ ,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 % ,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 & ,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 ' ,{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 ( ,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ) ,{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a * ,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b + ,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c , ,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d - ,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e . ,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f / ,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0 ,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1 ,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2 ,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3 ,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4 ,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5 ,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6 ,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7 ,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8 ,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9 ,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a : ,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ; ,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c < ,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d = ,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e > ,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ? ,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @ ,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A ,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B ,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C ,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D ,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E ,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F ,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G ,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H ,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I ,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J ,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K ,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L ,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M ,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N ,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O ,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P ,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q ,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R ,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S ,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T ,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U ,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V ,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W ,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X ,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y ,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z ,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [ ,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c ¥ ,{0x00, 0x41, 0x41, 0x7f, 0x00} // 5d ] ,{0x04, 0x02, 0x01, 0x02, 0x04} // 5e ^ ,{0x40, 0x40, 0x40, 0x40, 0x40} // 5f _ ,{0x00, 0x01, 0x02, 0x04, 0x00} // 60 ` ,{0x20, 0x54, 0x54, 0x54, 0x78} // 61 a ,{0x7f, 0x48, 0x44, 0x44, 0x38} // 62 b ,{0x38, 0x44, 0x44, 0x44, 0x20} // 63 c ,{0x38, 0x44, 0x44, 0x48, 0x7f} // 64 d ,{0x38, 0x54, 0x54, 0x54, 0x18} // 65 e ,{0x08, 0x7e, 0x09, 0x01, 0x02} // 66 f ,{0x0c, 0x52, 0x52, 0x52, 0x3e} // 67 g ,{0x7f, 0x08, 0x04, 0x04, 0x78} // 68 h ,{0x00, 0x44, 0x7d, 0x40, 0x00} // 69 i ,{0x20, 0x40, 0x44, 0x3d, 0x00} // 6a j ,{0x7f, 0x10, 0x28, 0x44, 0x00} // 6b k ,{0x00, 0x41, 0x7f, 0x40, 0x00} // 6c l ,{0x7c, 0x04, 0x18, 0x04, 0x78} // 6d m ,{0x7c, 0x08, 0x04, 0x04, 0x78} // 6e n ,{0x38, 0x44, 0x44, 0x44, 0x38} // 6f o ,{0x7c, 0x14, 0x14, 0x14, 0x08} // 70 p ,{0x08, 0x14, 0x14, 0x18, 0x7c} // 71 q ,{0x7c, 0x08, 0x04, 0x04, 0x08} // 72 r ,{0x48, 0x54, 0x54, 0x54, 0x20} // 73 s ,{0x04, 0x3f, 0x44, 0x40, 0x20} // 74 t ,{0x3c, 0x40, 0x40, 0x20, 0x7c} // 75 u ,{0x1c, 0x20, 0x40, 0x20, 0x1c} // 76 v ,{0x3c, 0x40, 0x30, 0x40, 0x3c} // 77 w ,{0x44, 0x28, 0x10, 0x28, 0x44} // 78 x ,{0x0c, 0x50, 0x50, 0x50, 0x3c} // 79 y ,{0x44, 0x64, 0x54, 0x4c, 0x44} // 7a z ,{0x00, 0x08, 0x36, 0x41, 0x00} // 7b { ,{0x00, 0x00, 0x7f, 0x00, 0x00} // 7c | ,{0x00, 0x41, 0x36, 0x08, 0x00} // 7d } ,{0x10, 0x08, 0x08, 0x10, 0x08} // 7e ← ,{0x78, 0x46, 0x41, 0x46, 0x78} // 7f → }; void LcdCharacter(char character) { LcdWrite(LCD_D, 0x00); for (int index = 0; index < 5; index++) { LcdWrite(LCD_D, ASCII[character - 0x20][index]); } LcdWrite(LCD_D, 0x00); } void LcdClear(void) { for (int index = 0; index < LCD_X * LCD_Y / 8; index++) { LcdWrite(LCD_D, 0x00); } } void LcdInitialise(void) { pinMode(PIN_SCE, OUTPUT); pinMode(PIN_RESET, OUTPUT); pinMode(PIN_DC, OUTPUT); pinMode(PIN_SDIN, OUTPUT); pinMode(PIN_SCLK, OUTPUT); digitalWrite(PIN_RESET, LOW); digitalWrite(PIN_RESET, HIGH); LcdWrite(LCD_C, 0x21 ); // LCD Extended Commands. LcdWrite(LCD_C, 0xBA ); // Set LCD Vop (Contrast). LcdWrite(LCD_C, 0x04 ); // Set Temp coefficent. //0x04 LcdWrite(LCD_C, 0x14 ); // LCD bias mode 1:48. //0x13 LcdWrite(LCD_C, 0x20 ); // LCD Basic Commands LcdWrite(LCD_C, 0x0C ); // LCD in normal mode. pinMode(E14button, INPUT_PULLUP); pinMode(Rbutton, INPUT_PULLUP); pinMode(Lbutton, INPUT_PULLUP); pinMode(Ubutton, INPUT_PULLUP); pinMode(Dbutton, INPUT_PULLUP); } void LcdString(char *characters) { while (*characters) { LcdCharacter(*characters++); } } void LcdWrite(byte dc, byte data) { digitalWrite(PIN_DC, dc); digitalWrite(PIN_SCE, LOW); shiftOut(PIN_SDIN, PIN_SCLK, MSBFIRST, data); digitalWrite(PIN_SCE, HIGH); } void setup(void) { LcdInitialise(); LcdClear(); LcdString(" ARDUNIO "); LcdString(" HID "); LcdString(" "); LcdString(" by "); LcdString(" DOUG WONG "); LcdString(" "); Keyboard.begin(); Serial1.begin(19200); Mouse.begin(); // dht11.begin(); } void loop() { if (digitalRead(Lbutton) == LOW) { Mouse.move(-1, 0, 0); // move mouse delay(10); while (digitalRead(Lbutton) == LOW) { delay(1); } delay(20); } if (digitalRead(Rbutton) == LOW) { Mouse.move(1, 0, 0); // move mouse delay(10); while (digitalRead(Rbutton) == LOW) { delay(1); } delay(20); } if (digitalRead(Ubutton) == LOW) { Mouse.move(0, -1, 0); // move mouse delay(10); while (digitalRead(Ubutton) == LOW) { delay(1); } delay(20); } if (digitalRead(Dbutton) == LOW) { Mouse.move(0, 1, 0); // move mouse delay(10); while (digitalRead(Dbutton) == LOW) { delay(1); } delay(20); } if (digitalRead(E14button) == LOW) { LcdClear(); LcdString(" ELEMENT14 "); LcdString(" "); LcdString(" Brought to "); LcdString(" you by the "); LcdString(" DESTINY "); LcdString(" BUTTON "); // Keyboard.println ("HAPPY BIRTHDAY ARDUINO "); // Keyboard.println ("HAPPY BIRTHDAY PROJECT14 "); // Keyboard.println ("HAPPY BIRTHDAY ELEMENT14 "); movx = -20; movy = 10; movcount = 0; while (movcount < 70) { Mouse.move(movx, movy, 0); // move mouse delay(5); movcount++; } movx = 5; movy = -13; movcount = 0; while (movcount < 10) { Mouse.move(movx, movy, 0); // move mouse delay(5); movcount++; } Mouse.press(MOUSE_LEFT); // click the left button down delay(20); Mouse.release(MOUSE_LEFT); // release the left button delay(50); Mouse.press(MOUSE_LEFT); // click the left button down delay(20); Mouse.release(MOUSE_LEFT); // release the left button } }
The project involved 3D printing 2 small cases and designing a custom PCB.
I actually use these HID devices every day, so it has been a very worthwhile project.
The single pixel mouse moves are very handy and I get a surprising amount of use out of the "element14" button.
The software is pretty simple - if you need it, indicate in the comments below and I'll add it here.
Hopefully these ideas are something you can use and have fun with - they are certainly simple to implement and the arduino only costs about $2.
This project was one of the lucky ones to be awarded a runner-up swag package.
Link to contest page:
Top Comments