<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title></title>
      <link>https://friggeri.net</link>
      <description></description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://friggeri.net/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Thu, 25 Dec 2025 00:00:00 +0000</lastBuildDate>
      <item>
          <title>Electronic Travel Yahtzee</title>
          <pubDate>Thu, 25 Dec 2025 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://friggeri.net/projects/yahtzee/</link>
          <guid>https://friggeri.net/projects/yahtzee/</guid>
          <description xml:base="https://friggeri.net/projects/yahtzee/">&lt;p&gt;My wife loves &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Yahtzee&quot;&gt;Yahtzee&lt;&#x2F;a&gt;, but the problem with Yahtzee is that, as most games involving rolling dice, it&#x27;s particularly hard to play on the go and has been relegated to the dinner table. This year, I decided to remedy that and make her a more portable version of the game.&lt;&#x2F;p&gt;
&lt;p&gt;The result is a pocketable device with a machined aluminum case, tactile buttons, LED dice displays, and a custom PCB running firmware I compiled to WASM for browser-based testing before the hardware even arrived. You can &lt;a href=&quot;http:&#x2F;&#x2F;friggeri.github.io&#x2F;yahtzee&#x2F;&quot;&gt;try the simulator yourself&lt;&#x2F;a&gt; to see how it plays. The whole project took about 5 weeks from initial concept to assembled, working device.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;design-constraints&quot;&gt;Design Constraints&lt;&#x2F;h3&gt;
&lt;p&gt;Going into this project, I knew I wanted something that felt premium and played like the actual game, so I set myself a few constraints:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No screens&lt;&#x2F;strong&gt;: Yahtzee is a tactile game and I wanted my travel version to stay as analog as possible. Touching a pane of glass would defeat that purpose.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Pocketable&lt;&#x2F;strong&gt;: if it doesn&#x27;t fit in your pocket, it&#x27;s not travel friendly.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Premium&lt;&#x2F;strong&gt;: we&#x27;re talking Christmas present here, a cheap 3D printed plastic case won&#x27;t cut it.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;With this in mind, I knew I needed to keep a physical paper score pad: writing down the combinations you roll and tallying your score at the end is all part of the experience. I found a company that makes &lt;a href=&quot;https:&#x2F;&#x2F;www.boardgamesmaker.com&#x2F;print&#x2F;custom-scorepad-small.html&quot;&gt;custom score pads&lt;&#x2F;a&gt; with no minimum order, and in a happy accident, the height of their smallest pad is almost exactly 5 dice tall. This essentially determined the entire layout and dimensions of the device.&lt;&#x2F;p&gt;
&lt;figure&gt;
  
  &lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;processed_images&#x2F;layout.eeb7e9d828f661da.jpg&quot; alt=&quot;If you squint, you can see where the device is going.&quot;&gt;
  &lt;figcaption&gt;If you squint, you can see where the device is going.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;electronics&quot;&gt;Electronics&lt;&#x2F;h3&gt;
&lt;p&gt;With the form factor determined, I started working on the electronics. The device needed to:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Generate random dice rolls&lt;&#x2F;li&gt;
&lt;li&gt;Display the values of 5 dice&lt;&#x2F;li&gt;
&lt;li&gt;Show the number of remaining rolls&lt;&#x2F;li&gt;
&lt;li&gt;Lock and unlock individual dice&lt;&#x2F;li&gt;
&lt;li&gt;Handle button inputs&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;For the dice displays, I opted for a 3×3 grid of LEDs for each die instead of the traditional 7-LED arrangement. While only 7 LEDs are needed to show dice faces, the 3×3 grid would prove useful later for scrolling text and animations. I added a few more LEDs to indicate remaining rolls and the locked status for each die, along with buttons for rolling and locking.&lt;&#x2F;p&gt;
&lt;p&gt;I selected an &lt;a href=&quot;https:&#x2F;&#x2F;ww1.microchip.com&#x2F;downloads&#x2F;en&#x2F;DeviceDoc&#x2F;ATtiny1614-16-17-DataSheet-DS40002204A.pdf&quot;&gt;ATtiny1616&lt;&#x2F;a&gt; as the microcontroller, more than enough computing power to run the game logic and handle all the I&#x2F;O. An &lt;a href=&quot;https:&#x2F;&#x2F;www.lumissil.com&#x2F;assets&#x2F;pdf&#x2F;core&#x2F;IS31FL3729_DS.pdf&quot;&gt;IS31FL3729&lt;&#x2F;a&gt; matrix LED driver handles all the LEDs, freeing up GPIO pins and simplifying the routing. For power, I used the same USB-C rechargeable battery circuit I&#x27;ve iterated on across multiple projects.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;yahtzee&#x2F;schematic.svg&quot; alt=&quot;Schematic&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I routed the PCB as a 4-layer board (necessary given the routing density with so many LEDs in such a small space). The board went to &lt;a href=&quot;https:&#x2F;&#x2F;jlcpcb.com&quot;&gt;JLCPCB&lt;&#x2F;a&gt; for fabrication and SMT assembly. Given the size constraints, I used 0402 components throughout, and I definitely didn&#x27;t want to hand-solder dozens of those.&lt;&#x2F;p&gt;
&lt;figure&gt;
  
  &lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;processed_images&#x2F;IMG_1576.ca041acf22b8ac92.jpg&quot; alt=&quot;Front and back of the assembled PCB showing component placement and routing.&quot;&gt;
  &lt;figcaption&gt;Front and back of the assembled PCB showing component placement and routing.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;case&quot;&gt;Case&lt;&#x2F;h3&gt;
&lt;p&gt;The case design was straightforward in some ways (the score pad dictated both the height and thickness) but challenging in others. I wanted a machined aluminum case with anodized finish to meet the &quot;premium&quot; constraint. Each LED area needed a recessed pocket where I could inlay a small piece of acrylic to diffuse the light.&lt;&#x2F;p&gt;
&lt;p&gt;Space was extremely tight, so I designed custom buttons and sliders from scratch. Having these small mechanical parts machined from metal would have been prohibitively expensive, so I had them printed in MJF nylon instead. They turned out wonderfully: the buttons are satisfyingly clicky and tactile, exactly what I was hoping for.&lt;&#x2F;p&gt;
&lt;p&gt;I sent the metal parts to &lt;a href=&quot;https:&#x2F;&#x2F;jlccnc.com&quot;&gt;JLCCNC&lt;&#x2F;a&gt; for manufacturing, the acrylic diffusers to &lt;a href=&quot;https:&#x2F;&#x2F;ponoko.com&quot;&gt;Ponoko&lt;&#x2F;a&gt;, and the buttons and sliders to &lt;a href=&quot;https:&#x2F;&#x2F;craftcloud3d.com&quot;&gt;CraftCloud3D&lt;&#x2F;a&gt;. For the LEDs, I chose warm amber instead of white (less harsh on the eyes and it gives the device a nicer aesthetic).&lt;&#x2F;p&gt;
&lt;figure&gt;
  
  &lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;processed_images&#x2F;cad-top.c6d0f885fa1e95d4.jpg&quot; alt=&quot;CAD rendering of the aluminum case with inlaid acrylic diffusers.&quot;&gt;
  &lt;figcaption&gt;CAD rendering of the aluminum case with inlaid acrylic diffusers.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;software&quot;&gt;Software&lt;&#x2F;h3&gt;
&lt;p&gt;While waiting for the hardware to be manufactured, I turned my attention to the firmware. From the start, I decided to treat this as a &quot;serious&quot; project and introduced a Hardware Abstraction Layer (HAL) to cleanly separate the application logic from the hardware-specific code.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;architecture&quot;&gt;Architecture&lt;&#x2F;h4&gt;
&lt;p&gt;The HAL acts as an interface between the game logic and the actual hardware. The application code makes calls like &quot;turn on LED (2,3)&quot; or &quot;read button 5&quot; without knowing anything about the underlying hardware registers or protocols. This separation enabled some powerful development workflows.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;randomness&quot;&gt;Randomness&lt;&#x2F;h4&gt;
&lt;p&gt;The random number generation uses a &lt;a href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Linear_congruential_generator&quot;&gt;linear congruential generator&lt;&#x2F;a&gt;, re-seeded with the number of milliseconds since power-on whenever the player presses the roll button. This ensures each game session produces a different sequence of rolls.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;testing&quot;&gt;Testing&lt;&#x2F;h4&gt;
&lt;p&gt;By writing a virtual HAL that targets my development machine, I was able to write comprehensive tests for all the game logic with 100% code coverage. The tests run on my laptop, not on the microcontroller, but exercise the exact same application code that runs on the device. This caught several edge cases in the game state machine before I ever had hardware in hand.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;wasm-simulator&quot;&gt;WASM Simulator&lt;&#x2F;h4&gt;
&lt;p&gt;The HAL abstraction had another benefit: I could create a different virtual HAL targeting HTML&#x2F;JavaScript. By compiling the firmware to WebAssembly with this HAL, I built a &lt;a href=&quot;http:&#x2F;&#x2F;friggeri.github.io&#x2F;yahtzee&#x2F;&quot;&gt;browser-based simulator&lt;&#x2F;a&gt; that runs the actual game logic. You can click around and play with it yourself; it&#x27;s the real firmware, just running in your browser instead of on an ATtiny.&lt;&#x2F;p&gt;
&lt;p&gt;This let me test and iterate on the gameplay experience weeks before the PCBs arrived. I could tweak the state machine, adjust timing, and get a feel for how the game would play without waiting for hardware.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;features-and-polish&quot;&gt;Features and Polish&lt;&#x2F;h4&gt;
&lt;p&gt;With the core game logic working, I added some polish features. The 3×3 LED grids really shine here:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;A scrolling splash screen that displays &quot;Hello Molly&quot; on power-up&lt;&#x2F;li&gt;
&lt;li&gt;A dice rolling animation when you press the roll button&lt;&#x2F;li&gt;
&lt;li&gt;A firework-like animation when you roll a Yahtzee&lt;&#x2F;li&gt;
&lt;li&gt;A settings UI (accessible via long-press on the bottom button) where you can toggle animations, adjust brightness, and check battery level&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These small touches make the experience feel delightful. The rolling animation, the way the display wipes between turns, the Yahtzee celebration: they all add personality to what could have been a straightforward electronic dice roller.&lt;&#x2F;p&gt;
&lt;h4 id=&quot;hardware-validation&quot;&gt;Hardware Validation&lt;&#x2F;h4&gt;
&lt;p&gt;When the PCBs finally arrived, I used a PICkit 5 programmer to flash the firmware via UPDI. Before loading the full game, I wrote several simple test firmwares to validate the HAL: one to test individual buttons, one to cycle through LEDs, one to read the battery ADC. These isolated tests let me verify that the low-level hardware code worked correctly. By the time I flashed the actual game firmware, everything just worked.&lt;&#x2F;p&gt;
&lt;figure&gt;
  
  &lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;processed_images&#x2F;IMG_1305.6abe6e160592a1f9.jpg&quot; alt=&quot;Testing the PCB with the first revision using white LEDs.&quot;&gt;
  &lt;figcaption&gt;Testing the PCB with the first revision using white LEDs.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;assembly&quot;&gt;Assembly&lt;&#x2F;h3&gt;
&lt;p&gt;After several weeks, all the manufactured parts arrived. The PCB you see in these photos is actually the third revision (I iterated twice, first to switch from white to amber LEDs, then to add battery level monitoring via the ATtiny&#x27;s ADC).&lt;&#x2F;p&gt;
&lt;figure&gt;
  
  &lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;processed_images&#x2F;IMG_1577.ab72e482805f885b.jpg&quot; alt=&quot;All the manufactured components ready for assembly.&quot;&gt;
  &lt;figcaption&gt;All the manufactured components ready for assembly.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  
  &lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;processed_images&#x2F;IMG_1581.6a63700b0883dfcf.jpg&quot; alt=&quot;The assembled device showing the PCB mounted in the aluminum case.&quot;&gt;
  &lt;figcaption&gt;The assembled device showing the PCB mounted in the aluminum case.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;figure&gt;
  
  &lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;processed_images&#x2F;IMG_1586.045fb105a5208f9a.jpg&quot; alt=&quot;Close-up of the completed device with amber LEDs illuminated.&quot;&gt;
  &lt;figcaption&gt;Close-up of the completed device with amber LEDs illuminated.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;yahtzee&#x2F;yahtzee-animation.mp4&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;figcaption&gt;The Yahtzee animation&lt;&#x2F;figcaption&gt;
&lt;h3 id=&quot;packaging&quot;&gt;Packaging&lt;&#x2F;h3&gt;
&lt;p&gt;While ordering the custom score pads, I noticed that the same company makes &lt;a href=&quot;https:&#x2F;&#x2F;www.boardgamesmaker.com&#x2F;print&#x2F;custom-size-game-box-oem.html&quot;&gt;custom game boxes&lt;&#x2F;a&gt; with no minimum order quantity. This felt like the perfect finishing touch for a &quot;premium&quot; gift, so I took a photo of Molly and used ChatGPT to turn it into an illustration of her throwing dice (AI being notoriously bad at generating realistic dice I needed to do a little cleanup using PhotoShop). That became the box art.&lt;&#x2F;p&gt;
&lt;figure&gt;
  
  &lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;processed_images&#x2F;IMG_1322.d75e35ad30eee5ec.jpg&quot; alt=&quot;The custom game box with AI-generated illustration of Molly.&quot;&gt;
  &lt;figcaption&gt;The custom game box with AI-generated illustration of Molly.&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;h3 id=&quot;outcome&quot;&gt;Outcome&lt;&#x2F;h3&gt;
&lt;p&gt;I gave it to Molly on Christmas morning and she loved it! The device runs for weeks on a single charge, though I haven&#x27;t run exact battery life tests. I had assembled a second one, so now we play Yahtzee together sitting on the couch. The animations and small details really make the experience: it&#x27;s not just functional, it&#x27;s genuinely delightful to use.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>IXKB 60% Ortholinear with a Joystick</title>
          <pubDate>Tue, 09 Jan 2024 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://friggeri.net/projects/ixkb-60/</link>
          <guid>https://friggeri.net/projects/ixkb-60/</guid>
          <description xml:base="https://friggeri.net/projects/ixkb-60/">&lt;p&gt;This is the most complicated keyboard I&#x27;ve ever designed and built so far:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;ixkb-60&#x2F;1.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Custom hot swappable PCB built around an nrf52 module, all components smd mounted, no RGBs.&lt;&#x2F;li&gt;
&lt;li&gt;Power&#x2F;data through usb-c but the main goal is to use it wirelessly over BLE&lt;&#x2F;li&gt;
&lt;li&gt;Brass plate with flex cuts&lt;&#x2F;li&gt;
&lt;li&gt;The body is made of two black anodized CNC&#x27;d aluminum parts that are bolted together&lt;&#x2F;li&gt;
&lt;li&gt;The star of the show is an outrageous Grayhill 67C joystick, that doubles up as a push button rotary encoder. The Joystick cap is modeled after a fluted Davies 1900h knob, but with a skirt to make it more joystickable (also made out of black anodized aluminum).&lt;&#x2F;li&gt;
&lt;li&gt;Zilent V2 switches&lt;&#x2F;li&gt;
&lt;li&gt;SA keycaps in cream&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I have a small USB HID listener installed on my Mac that is controlled by the joystick and then relays the instructions to my pan&#x2F;tilt camera mount.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;ixkb-60&#x2F;2.jpg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;ixkb-60&#x2F;3.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Blanck Rev3</title>
          <pubDate>Mon, 01 Jan 2018 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://friggeri.net/projects/blanck-rev3/</link>
          <guid>https://friggeri.net/projects/blanck-rev3/</guid>
          <description xml:base="https://friggeri.net/projects/blanck-rev3/">&lt;p&gt;Very little to say about this keyboard, it&#x27;s similar to the &lt;a href=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;&quot;&gt;new blanck&lt;&#x2F;a&gt; but with a handmade walnut and maple case.&lt;&#x2F;p&gt;
&lt;p&gt;The lid has a small leather cushion that doubles as a hand rest.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck-rev3&#x2F;1.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck-rev3&#x2F;2.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck-rev3&#x2F;3.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck-rev3&#x2F;4.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The New Blanck Keyboard</title>
          <pubDate>Thu, 18 May 2017 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://friggeri.net/projects/new-blanck/</link>
          <guid>https://friggeri.net/projects/new-blanck/</guid>
          <description xml:base="https://friggeri.net/projects/new-blanck/">&lt;p&gt;After having used the Blanck keyboard for a few months, I realized there were a few things I wish I had done differently, like the wiring of the switch or having a slight angle to the keyboard. In parallel, I had been wanting to teach myself how to design circuit boards for a while, so I figured this would be a great occasion to learn.&lt;&#x2F;p&gt;
&lt;p&gt;Before going into the details of how the new Blanck keyboard came to be, let&#x27;s take a look at the finished product, here are some of its features:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Porcelain and leather case built around a walnut body&lt;&#x2F;li&gt;
&lt;li&gt;Keyboard is at a 7° angle for more comfortable typing&lt;&#x2F;li&gt;
&lt;li&gt;Custom designed PCB&lt;&#x2F;li&gt;
&lt;li&gt;Custom white&#x2F;magenta frankenswitches&lt;&#x2F;li&gt;
&lt;li&gt;On&#x2F;off push button switch with indicator LED&lt;&#x2F;li&gt;
&lt;li&gt;Cap lock LED&lt;&#x2F;li&gt;
&lt;li&gt;Same magsafe charger as the first Blanck, so I can reuse my cables&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;1-finished.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;circuit-board&quot;&gt;Circuit board&lt;&#x2F;h2&gt;
&lt;p&gt;As mentioned above, I had had this itch to learn how to design PCBs for a while, so over the course of a couple of days I taught myself how to use KiCAD and came up with the following. Aside from the miserable UX, it was a pretty easy process, given that most of what I am doing here is putting wires between a very simple set of components: switches, diodes, LEDs and a micro-controller board that has the actual electronic.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;2-pcb-kicad.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I actually went through two rounds of design: I first ordered some boards from OSH Park, but then went back to the drawing board because I really wanted was to be able to disconnect the battery and switch from the PCB, so I added some JST headers to avoid having to solder all the parts together. I then got those boards manufactured by EasyEDA. They are pretty good quality, and I love the white color, but the process was tedious and took far longer to deliver than I expected. Thankfully EasyEDA has a good customer service.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;3-pcb-left.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;4-pcb-right.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I had designed the circuit planning to use the Feather 32u4 Bluefruit LE as the micro-controller, but between then and assembly time Adafruit released the Feather nRF52 Bluefruit LE which has a compatible pinout and has only one chip on board instead of having one dedicated to computation and the other one to Bluetooth LE, so I swapped that at the last minute and rewrote my firmware to support the new API.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;case&quot;&gt;Case&lt;&#x2F;h2&gt;
&lt;p&gt;Having designed an all wood unibody keyboard, I wanted to experiment with something entirely different. While researching materials for this build, I remembered that a few months ago, I had come across Shapeways, an online 3d printing service that among other things does porcelain prints. Unfortunately, the maximum dimensions for that material doesn&#x27;t allow making a whole case out of it, so I had to find a workaround and I came up with the idea of building a segmented case: two porcelain end pieces with another contrasting material in the middle (my initial plans were walnut, but I ultimately decided that the visible part of that section should be leather).&lt;&#x2F;p&gt;
&lt;p&gt;With this in mind, I started putting things together in Sketchup. The body consists of four main parts: the porcelain ends, the walnut inner body, the walnut top plate, and the leather middle section. Because the top plate sits at a 7° angle, I designed the whole thing as a big brick, chopped its bottom and rotated it to lay flat. I also added two opening in the left porcelain part to fit a switch and expose the magsafe charger.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;5-case-render-left.png&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;6-case-render-right.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I had a couple of concerns using porcelain: because it has to be fired to harden it might lose its shape, and because of the glazing any openings might end up a little smaller than intended. After a few weeks I finally received the prints from Shapeways, the left piece had significant bowing on one edge, but I ultimately decided I&#x27;d still use the piece because I didn&#x27;t want to wait another month and a half to get started with the build (in the end, it isn&#x27;t bad looking, gives it a more organic look). As for the holes, I had designed them with a bunch of padding to account for the shrinking, the fit was very snug but I could loosen things up with some light filing.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;7-porcelain-render-left.png&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;8-porcelain-print-left.png&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;The next step was to build the skeleton of the case, to add some structure and rigidity to the body. I designed it to fit in the porcelain parts and then used my CNC to cut the different faces before glueing everything together. Because the porcelain parts have a very uneven surface, getting the inner body to fit in the end sections required an incredible amount of sanding, constantly checking the fit.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;9-porcelain-print-right.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;10-inner-body-sketchup.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;11-inner-body-faces.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;12-inner-body-assembled.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Given that the keyboard has a PCB, the top plate does not need to be rigid, so I could get away with using walnut again, and I again used the CNC to cut it out. I then drilled 4 holes in the inner body and epoxied in M2 standoffs to attach both of these together.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;13-inner-body-sanded.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;14-top-plate-cutting.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;15-top-plate-finished.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;16-inner-standoffs.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;h2 id=&quot;assembly&quot;&gt;Assembly&lt;&#x2F;h2&gt;
&lt;p&gt;I expoxied the walnut body to the porcelain end pieces, and then cut small walnut rectangles, covered them in leather before gluing them to the middle section. I then finished the bottom with a layer of felt and epoxied in the on&#x2F;off switch, which I soldered to a 3 pin JST connector. The battery is a 500mAh LiPo battery, and with this I&#x27;m getting a few days of typing before I need to charge the device.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;17-inner-topplate-assembled.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;18-bottom-case-assembled.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;19-bottom-wired-up.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;One of the most important parts of the build: the switches. For this one, I dissassembled Invyr Panda switches and replaced the linear stem with a tactile Originative MOD-L stem. It was pretty tedious to take all of these apart and then put them back together, but in the end it gives a crisper tactile bump than a Cherry Brown, but in a much smoother body, and a heavier touch. Also they look pretty great.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;20-switches.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And finally, the finished board. I used blank WV SA keycaps from the Nantucket Selectric set in 2–3–4–2 profile. It was a pain to find enough keycaps to cover a whole board: towards the end I was buying them a couple at a time from Mechmarket but after a couple of months I got all the ones I needed.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;21-finished-1.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;22-finished-2.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;23-finished-3.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;new-blanck&#x2F;24-finished-4.jpeg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The Blanck</title>
          <pubDate>Mon, 28 Nov 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://friggeri.net/projects/blanck/</link>
          <guid>https://friggeri.net/projects/blanck/</guid>
          <description xml:base="https://friggeri.net/projects/blanck/">&lt;p&gt;A month ago, I shared my &lt;a href=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;&quot;&gt;handwired Planck keyboard&lt;&#x2F;a&gt;. Over the last few weeks, I’ve been working on an updated version of it, which I’m calling the Blanck keyboard. It’s a Bluetooth LE mechanical keyboard, with a case milled out of a solid piece of walnut, a magnetic USB charger and a breathing activity LED, and I obviously had to write my own firmware from scratch to drive it.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck&#x2F;1-finished-keyboard.webp&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In my previous build, I had used a stainless steel plate and made a frame using walnut scraps. This time around I wanted to get rid of the metal altogether and use my CNC to mill the whole case out of a solid piece of walnut. Because I was making the case out of wood, I decided to make a very thick top layer to avoid any bending when typing.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck&#x2F;2-cad.webp&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck&#x2F;3-cad.webp&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Once the model was designed, I used Meshcam to create the toolpath and sent it to my Carvey for milling.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck&#x2F;4-milling.webp&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck&#x2F;5-milled.webp&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In hindsight, I made a few mistakes: first, I totally forgot to account for the metal part of the stabilizer for the space bar, but nothing that some filing wouldn’t fix. Second, the bit I used was too big and didn’t capture all of the details of the switch holes — again, more filing. I also added a pair of holes for the magnetic charger and LED to fit through, and then mounted the switches (Cherry MX brown). In my 3d model, I had added little tabs for the switches to grab on, but these disappeared with all the filing, so I ended up Epoxying them in place.&lt;&#x2F;p&gt;
&lt;p&gt;Before working on the wiring, I decided to build a bottom plate out of aluminum and felt. I tried using the CNC to cut the piece but it ended up jamming a couple of times, so I only used it to drill the holes for the screws and cut the aluminum sheet by hand.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck&#x2F;6-bottom.webp&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Finally I tackled the wiring. The board I’m using to drive the keyboard is a Adafruit &lt;a href=&quot;https:&#x2F;&#x2F;www.adafruit.com&#x2F;products&#x2F;2829&quot;&gt;Feather 32u4 Bluefruit LE&lt;&#x2F;a&gt;, which only had 15 available pins — I wanted an indicator LED, and I could not use pin 9 for I&#x2F;O because I wanted to be able to use it to monitor the battery level. Usually, such a keyboard is wired as a 4x12 &lt;a href=&quot;http:&#x2F;&#x2F;pcbheaven.com&#x2F;wikipages&#x2F;How_Key_Matrices_Works&#x2F;&quot;&gt;matrix&lt;&#x2F;a&gt; and thus requires 16 pins, but I took advantage of the fact that you can also wire it as an 8x6 keyboard (see picture below). Each physical “column” represents a pair of logical columns (for example physical column 1 is logical columns 1 and 2) and the parity of the physical row lets us distinguish between the two (for example, column 1, row 3, becomes column 1 row 2, whereas column 1, row 4 becomes column 2, row 2).&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck&#x2F;7-matrix.webp&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I then connected the microcontroller to the matrix, wiring up the indicator LED (those I had were too bright so I had to add a resistor in series), and finally I decided to add a physical switch to cut the battery so I had to drill yet another hole through the case.
Final step was to write the software. I initially thought of porting an existing firmware, but I eventually decided to write my own, both because I wanted to learn how the core of the system actually worked, and because I wanted to add bells and whistles such as a breathing light when the device is connected over bluetooth:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;blanck&#x2F;8-led.gif&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;In the end, it took a long time to get right: there is very little documentation as to what to implement to get a device to be recognized as a keyboard over BLE. Through trial and error I kind of figured it out, but it was pretty &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;afriggeri&#x2F;kb&#x2F;blob&#x2F;master&#x2F;bluetooth.cpp#L79-L110&quot;&gt;painful&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Handwired Planck</title>
          <pubDate>Wed, 19 Oct 2016 00:00:00 +0000</pubDate>
          <author>Unknown</author>
          <link>https://friggeri.net/projects/handwired-planck/</link>
          <guid>https://friggeri.net/projects/handwired-planck/</guid>
          <description xml:base="https://friggeri.net/projects/handwired-planck/">&lt;p&gt;After discovering the &lt;a href=&quot;https:&#x2F;&#x2F;www.olkb.com&quot;&gt;Planck&lt;&#x2F;a&gt; keyboard, I got really obsessed with the form factor. Unfortunately there were long shipping delays so I ended up building one by hand.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;1-finished-board.jpg&quot; alt=&quot;Finished Board&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;2-supplies.jpg&quot; alt=&quot;Supplies&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I used &lt;a href=&quot;http:&#x2F;&#x2F;keyboard-layout-editor.com&quot;&gt;keyboard-layout-editor.com&lt;&#x2F;a&gt; for the layout, then &lt;a href=&quot;http:&#x2F;&#x2F;builder.swillkb.com&quot;&gt;builder.swillkb.com&lt;&#x2F;a&gt; to generate the CAD, and ordered the top plate from &lt;a href=&quot;http:&#x2F;&#x2F;lasergist.com&quot;&gt;lasergist.com&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;3-top-plate.jpg&quot; alt=&quot;Top plate&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;I then fitted the switches in the top plate.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;4-mx-browns.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And soldered all the diodes and columns.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;5-wire-matrix.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Finally wired everything to the microcontroller.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;6-wire-mcu.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;Made a small wooden frame.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;7-wooden-frame.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
&lt;p&gt;And the final product!&lt;&#x2F;p&gt;
&lt;p&gt;&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;8-final-shot.jpg&quot; alt=&quot;&quot; &#x2F;&gt;
&lt;img src=&quot;https:&#x2F;&#x2F;friggeri.net&#x2F;projects&#x2F;handwired-planck&#x2F;9-detail.jpg&quot; alt=&quot;&quot; &#x2F;&gt;&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
