930 lines
17 KiB
HTML
930 lines
17 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en-us">
|
|
|
|
<head>
|
|
<link href="http://gmpg.org/xfn/11" rel="profile">
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
|
<meta http-equiv="content-type" content="text/html; charset=utf-8">
|
|
|
|
<!-- Enable responsiveness on mobile devices-->
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
|
|
|
|
<title>
|
|
|
|
Arduino Uno as HID keyboard · Caught in the Net
|
|
|
|
</title>
|
|
|
|
<!-- CSS -->
|
|
<link rel="stylesheet" href="/public/css/poole.css">
|
|
<link rel="stylesheet" href="/public/css/syntax.css">
|
|
<link rel="stylesheet" href="/public/css/hyde.css">
|
|
|
|
<!-- Icons -->
|
|
<link rel="apple-touch-icon-precomposed" sizes="144x144" href="/public/apple-touch-icon-144-precomposed.png">
|
|
<link rel="shortcut icon" href="/public/favicon.ico">
|
|
|
|
<!-- RSS -->
|
|
<link rel="alternate" type="application/rss+xml" title="RSS" href="/atom.xml">
|
|
</head>
|
|
|
|
|
|
<body class="theme-base-09">
|
|
|
|
<div class="sidebar">
|
|
<div class="container sidebar-sticky">
|
|
<div class="sidebar-about">
|
|
<h1>
|
|
<a href="/">
|
|
Caught in the Net
|
|
</a>
|
|
</h1>
|
|
<p class="lead"></p>
|
|
</div>
|
|
|
|
<nav class="sidebar-nav">
|
|
<a class="sidebar-nav-item" href="/">Home</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="sidebar-nav-item" href="/about/">About</a>
|
|
|
|
|
|
|
|
|
|
|
|
<a class="sidebar-nav-item" href="/archive/">Archive</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="sidebar-nav-item" href="/contattami/">Contact me</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a class="sidebar-nav-item" href="/feed.xml">RSS</a>
|
|
<a class="sidebar-nav-item" href="http://francescomecca.eu:3000/explore/repos">Personal Git</a>
|
|
<span class="sidebar-nav-item" href="" >Powered by Jekyll and Hyde</span>
|
|
</nav>
|
|
|
|
<p>© 2017. CC BY-SA 4.0 International </p>
|
|
</div>
|
|
</div>
|
|
|
|
<h3 class="masthead-title">
|
|
<a href="/" title="Home">Caught in the Net</a>
|
|
|
|
|
|
</h3>
|
|
|
|
<div class="content container">
|
|
<div class="post">
|
|
<h1 class="post-title">Arduino Uno as HID keyboard</h1>
|
|
<span class="post-date">05 Jul 2016</span>
|
|
<p>Turin is the hometown of Arduino. I have been at the <a href="http://fablabtorino.org/">fablab</a> multiple times but I had to come all the way to America to get my hands on a simple Arduino Uno.</p>
|
|
|
|
<p>For 60$ I bought a cheap (but still good!) mechanical keyboard by Qisan, a clone of the Arduino Uno and a USB host shield.</p>
|
|
|
|
<p>Given that is 3 years since I have been using a dvorak layout and it's a pain to change layout on every machine that you have to use.
|
|
You can imagine that given this three pieces of hardware together I put together an hardware key mapper for the keyboard.</p>
|
|
|
|
<p>I have never had experience with Arduino before but it was not that difficult to make it do simple things like blinking the led or send signal through to a serial monitor.</p>
|
|
|
|
<p>It took me half an hour to wear down all my excitement: the USB Host Shield library broke all the compatibility with the similar project I found wandering online.</p>
|
|
|
|
<p>In particular <a href="http://hunt.net.nz/users/darran/">this blog</a> has the most precious information and the guy wrote a HID driver that allows the Uno to be seen as a HID device.</p>
|
|
|
|
<p>It was a noob error but I didn't checked the various arduino alternatives and I discovered late that just a few have the HID capabilities that would make this work easier. I should have bought and Arduino Due or Leonardo maybe.</p>
|
|
|
|
<p>Also, the various guides about flashing with a dfu tool are specific to older models of the Uno and it took me some time to figure the name of the new components so that I could flash a new firmware.</p>
|
|
|
|
<h2 id="a-small-journey-in-the-arduino-world">A small journey in the Arduino world</h2>
|
|
|
|
<p>It feels pretentious to write a little guide for this kind of work, given also the fact that I have roughly 10 hours of experience with the Arduino. But the other resources are really outdated so I hope this piece can be useful to someone out there.</p>
|
|
|
|
<p>All the files I have used today are on <a href="http://francescomecca.eu:3000/pesceWanda/arduino_HID_keyboard">my repos</a> and I included also an outdated version of the USB Host Shield library that I used.</p>
|
|
|
|
<p>The original code from this <a href="http://hunt.net.nz/users/darran/weblog/c6f35/Arduino_USB_Keyboard_Passthrough.html">blog post</a> works like a charm but just as a simple passthrough.</p>
|
|
|
|
<p>It was not difficult at all to examine the code:
|
|
during each loop of the iteration a char array gets read from the shield and if it is contains information Arduino with the Serial.Write method send the data to the host.</p>
|
|
|
|
<p>The buffer array is a simple array of length 8 and the first two positions are reserved. In particular the first one represent the various modifier keys.</p>
|
|
|
|
<p>The dvorak layout has the same pairs as the US layout but eventually I got used to having the '@' where at the same place of 'Q' (qwerty) and '"' over the '2'.
|
|
Also, I am an avid vim user (I should thank Simone Basso for that) and I swapped some keys on the new 65 keys keyboard.
|
|
The modifier bit at the beginning of the array came in handy for my code.</p>
|
|
|
|
<p>An hardware key remapper is a simple but long switch C statement but I decided to consider also the modifier bit: in this way certain keys like the Window (UGH!) key is mapped to a different layer of keys.
|
|
I got all the codes for the HID events <a href="http://www.freebsddiary.org/APC/usb_hid_usages.php">here</a>.</p>
|
|
|
|
<p>The process of flashing the code on the Uno goes like this:</p>
|
|
|
|
<ul>
|
|
<li>write the looping code;</li>
|
|
<li>push it to the Arduino using the IDE;</li>
|
|
<li>shortcircuit the board so that it goes in DFU mode;</li>
|
|
<li>flash the .hex HID firmware;</li>
|
|
<li>try your code;</li>
|
|
<li>repeat until it's right.</li>
|
|
</ul>
|
|
|
|
<p><img src="/wp-content/uploads/2016/IMG_20160706_011304.jpg" alt="Everything fits in one picture"></p>
|
|
|
|
<h2 id="flashing-the-firmware">Flashing the firmware</h2>
|
|
|
|
<p>The firmware is in my repo but I got it from (here)[<a href="http://hunt.net.nz/users/darran/weblog/a6d52/Arduino_UNO_Keyboard_HID_version_02.html">http://hunt.net.nz/users/darran/weblog/a6d52/Arduino_UNO_Keyboard_HID_version_02.html</a>].
|
|
The tool I used to flash it is dfu-programmer (version 0.62).
|
|
Every time you want to flash a new firmware the Arduino must be put in DFU mode (you can see the difference with lsusb).
|
|
To do that simply create a shortcircuit using a small metal wire on the two pins near the reset button and a led will blink.
|
|
This <a href="https://www.youtube.com/watch?v=E8XyRwXQr8Q">video</a> shows the method briefly (no real need for a jumper).
|
|
The commands are the following and there is no risk to brick the Uno:</p>
|
|
<div class="highlight"><pre><code class="language-" data-lang="">dfu-programmer atmega16u2 erase
|
|
dfu-programmer atmega16u2 flash Arduino-keyboard-0.2.hex
|
|
dfu-programmer atmega16u2 reset
|
|
|
|
</code></pre></div>
|
|
<p>After each flashing the device needs to be disconnected once. Of course you can flash the original firmware back. It is included in my repo or on the official ones.</p>
|
|
|
|
<p><img src="/wp-content/uploads/2016/IMG_20160706_011143.jpg" alt="Arduino and the shield"></p>
|
|
|
|
<p>That's it, as you can see is not difficult at all. The worst part is gathering the various info that are left dormant in blogs or forums.</p>
|
|
|
|
</div>
|
|
|
|
<!--<div class="related">-->
|
|
<!--<related-posts />-->
|
|
<!--<h2>Related Posts</h2>-->
|
|
<!--<ul class="related-posts">-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2017/01/11/spazio-digitale-rant-facebook/">-->
|
|
<!--Titolo-->
|
|
<!--<small>11 Jan 2017</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/11/15/machine-learning-PARTE3/">-->
|
|
<!--Capire il Machine Learning (parte 3)-->
|
|
<!--<small>15 Nov 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/11/11/machine-learning-PARTE2/">-->
|
|
<!--Capire il Machine Learning (parte 2)-->
|
|
<!--<small>11 Nov 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/11/10/machine-learning-intro/">-->
|
|
<!--Capire il Machine Learning (parte 1)-->
|
|
<!--<small>10 Nov 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--<li>-->
|
|
<!--<h3>-->
|
|
<!--<a href="/pescewanda/2016/07/07/pres-berk/">-->
|
|
<!--A short talk about cryptography at the Berkman Klein Center-->
|
|
<!--<small>07 Jul 2016</small>-->
|
|
<!--</a>-->
|
|
<!--</h3>-->
|
|
<!--</li>-->
|
|
<!---->
|
|
<!--</ul>-->
|
|
<!--</div>-->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<h4>Similar Posts</h4>
|
|
<ul>
|
|
|
|
<li class="relatedPost">
|
|
<a href="/pescewanda/2016/11/15/machine-learning-PARTE3/">Capire il Machine Learning (parte 3)
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="relatedPost">
|
|
<a href="/pescewanda/2016/11/11/machine-learning-PARTE2/">Capire il Machine Learning (parte 2)
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="relatedPost">
|
|
<a href="/pescewanda/2016/11/10/machine-learning-intro/">Capire il Machine Learning (parte 1)
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="relatedPost">
|
|
<a href="/pescewanda/2016/05/15/genetic-alg/">Interpolation using a genetic algorithm
|
|
|
|
</a>
|
|
</li>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
</div>
|
|
<!--<link rel="alternate" type="application/rss+xml" title="Francesco Mecca RSS" href="/feed.xml">-->
|
|
|
|
</body>
|
|
</html>
|