<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Waldo Bronchart</title><description>Software engineer and maker of things.</description><link>https://waldobronchart.com/</link><item><title>Shortcut Mapper: A Visual Shortcuts Explorer for Desktop Applications</title><link>https://waldobronchart.com/note/shortcut-mapper-release/</link><guid isPermaLink="true">https://waldobronchart.com/note/shortcut-mapper-release/</guid><pubDate>Wed, 14 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;a href=&quot;https://waldobronchart.com/note/blender-keyboard-shortcut-explorer&quot;&gt;A year ago&lt;/a&gt; I built an experimental web app to make Blender shortcuts easier to look up. Since then I&amp;#39;ve been working on a much more complete version, and I&amp;#39;m releasing it as &lt;a href=&quot;http://waldobronchart.github.io/ShortcutMapper/&quot;&gt;Shortcut Mapper&lt;/a&gt; — a visual keyboard shortcuts explorer for desktop applications.&lt;/p&gt;
&lt;p&gt;It supports multiple applications, versions, operating systems and keyboard layouts. The initial release includes Photoshop, Lightroom and Blender, and since the project is open-source, anyone can contribute new applications.&lt;/p&gt;
&lt;p&gt;The shortcut data for Adobe apps is scraped from their online documentation. For Blender, everything is accessible via the Python API, which makes export and version updates straightforward.&lt;/p&gt;
&lt;p&gt;Check it out: &lt;a href=&quot;http://waldobronchart.github.io/ShortcutMapper/&quot;&gt;waldobronchart.github.io/ShortcutMapper&lt;/a&gt;&lt;/p&gt;
</content:encoded></item><item><title>Ambient Light TV with a Raspberry Pi and a Webcam (Part 2)</title><link>https://waldobronchart.com/note/ambient-light-tv-with-a-raspberry-pi-and-camera-part2/</link><guid isPermaLink="true">https://waldobronchart.com/note/ambient-light-tv-with-a-raspberry-pi-and-camera-part2/</guid><pubDate>Sat, 14 Sep 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;In this post I&amp;#39;ll go into more detail about how I built the ambient light rig. Here&amp;#39;s the &lt;a href=&quot;https://waldobronchart.com/note/ambient-light-tv-with-a-raspberry-pi-part1&quot;&gt;previous part&lt;/a&gt; in case you missed it. I&amp;#39;m not the first to make one of these, so this isn&amp;#39;t going to be a step-by-step &lt;a href=&quot;http://www.instructables.com/id/TV-Dynamic-Ambient-Lighting/&quot;&gt;instructable&lt;/a&gt;. Instead, I&amp;#39;ll focus on the things I did differently (like the camera) and link to the resources I used for everything else.&lt;/p&gt;
&lt;p&gt;Most rigs out there use an Arduino linked to a PC, which is relatively easy to implement but only works with a video stream from the PC&amp;#39;s graphics card. For most people that&amp;#39;s fine. You can also buy ready-made systems that work the same way: &lt;a href=&quot;http://www.livelightproject.com/&quot;&gt;LiveLight&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I wanted every input to work: PC, cable TV, Apple TV and gaming consoles.&lt;/p&gt;
&lt;p&gt;For that I&amp;#39;d need access to all the feeds going into the TV. Intercepting an HDMI signal before it reaches the TV is technically possible, but the hardware was far too expensive. The only affordable alternative was a webcam, knowing that frame rate, lag and color inaccuracies were going to be a trade-off.&lt;/p&gt;
&lt;p&gt;The camera is best placed pointing directly at the screen to avoid glare and viewing angle color inaccuracies. In my case, I only had two viable options:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-1.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-2.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;As you see in the second picture, I had to close the curtains because at that angle the TV reflects everything from the window adjacent to it. This wasn&amp;#39;t a big problem since I prefer to close the curtains when watching a movie or playing games anyway.&lt;/p&gt;
&lt;p&gt;Pure blacks tend to be more blueish too, but I can live with that. This actually has a nice effect when the screen goes dark, as the whole rig glows blue providing some light in the room.&lt;/p&gt;
&lt;p&gt;For the webcam, I used a Logitech C250 (because I already had one). It captures at various resolutions and has a manual focus ring, which is great — you can intentionally set it out of focus to get color averaging for free.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://learn.adafruit.com/adalight-diy-ambient-tv-lighting&quot;&gt;Adalight tutorial&lt;/a&gt; was a good guide for building the frame. This is what I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;1x Raspberry Pi (any version works)&lt;/li&gt;
&lt;li&gt;2x &lt;a href=&quot;http://www.adafruit.com/products/738&quot;&gt;12mm Diffused Flat Digital RGB LED Pixels (Strand of 25)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1x &lt;a href=&quot;http://www.rapidonline.com/Electrical-Power/Stontronics-5V-4A-Desktop-Power-Supply-Unit-T2502ST-90-2577&quot;&gt;Stontronics 5V DC 4A Power Supply Unit T2502ST&lt;/a&gt; (Powers both the LEDs and the Pi)&lt;/li&gt;
&lt;li&gt;1x &lt;a href=&quot;http://www.rapidonline.com/Mechanical-Fastenings-Fixings/Rapid-ABS-Box-Black-100-x-75-x-40mm-30-0505&quot;&gt;100x75x40mm Housing for the Pi&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1x &lt;a href=&quot;http://www.rapidonline.com/Cables-Connectors/2-1mm-Panel-Mount-Power-Socket-20-0878&quot;&gt;2.1mm Power Socket (Rated 5A)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1x &lt;a href=&quot;http://www.rapidonline.com/Electronic-Components/DPST-Visible-On-Rocker-Switch-Red-75-0064&quot;&gt;Rocker Switch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1x Micro USB&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.rapidonline.com/Cables-Connectors/Grommet-Open-6-0x3-0x4-7-pack-of-100-04-0190&quot;&gt;Some grommets&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;4x Angled aluminium profiles&lt;/li&gt;
&lt;li&gt;Small nuts and bolts to attach the profiles&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The following gallery shows my process making the frame.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-4.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-5.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-6.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-7.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-8.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-9.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-10.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-11.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-12.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-13.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;At this point, I started to work on the server code for the Raspberry Pi. The first implementation was a Python program running in Debian linux LXDE gui mode. This was a failed approach for two reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The GUI mode was using too many resources on the Pi, so the experience would be quite sluggish&lt;/li&gt;
&lt;li&gt;The &lt;a href=&quot;http://codeandlife.com/2012/07/03/benchmarking-raspberry-pi-gpio-speed/&quot;&gt;Python GPIO library (wiringPi)&lt;/a&gt; I was using wasn&amp;#39;t fast enough to update 50LEDs.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So I went with a custom C implementation using the wiringPi C++ library. I wrote all the code on my PC and synced it to the Pi using rsync. The source code for the server is on &lt;a href=&quot;https://github.com/waldobronchart/AmbientLightServer&quot;&gt;GitHub&lt;/a&gt; — it should be fairly self-explanatory if you&amp;#39;re familiar with C++.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-14.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-15.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-16.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;I used &lt;a href=&quot;http://opencv.org/&quot;&gt;OpenCV&lt;/a&gt; to capture frames from the webcam, &lt;a href=&quot;http://www.digip.org/jansson/&quot;&gt;jansson&lt;/a&gt; for JSON settings, &lt;a href=&quot;http://log4cplus.sourceforge.net/&quot;&gt;Log4CPlus&lt;/a&gt; for logging, and Boost for network communication with a client program running on my PC.&lt;/p&gt;
&lt;p&gt;The client is used for tweaking camera color settings and setting the capture bounds of the frame. It communicates directly with the server on the Raspberry Pi. Here&amp;#39;s how it looks:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambilight_settings_sampler.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambilight_settings_colors.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambilight_settings_server.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;At this point I had everything pretty much working, and the main task now was to clean everything up and attach the Pi to the frame.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-19.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-17.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-18.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-20.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-21.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-22.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-23.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-25.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-26.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-27.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-28.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-30.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-32.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/ambi-light-34.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Capturing at full 640x480 was very slow — I suspect due to the limited USB bandwidth on the Pi. I had to drop all the way down to 160x120, which gives a relatively stable 20 FPS.&lt;/p&gt;
&lt;p&gt;The LEDs lag about 2 frames behind the TV. It&amp;#39;s noticeable, but you get used to it. Blending previous frames with the current one helps smooth out the color transitions.&lt;/p&gt;
&lt;p&gt;The other bottleneck was the webcam&amp;#39;s auto exposure: when the screen is dark, the camera takes longer per frame. The Linux driver I was using didn&amp;#39;t let me set a fixed exposure. &lt;strong&gt;Update:&lt;/strong&gt; I eventually found a way to lock the exposure, and it now runs at a smooth 30 FPS.&lt;/p&gt;
&lt;p&gt;If you&amp;#39;re interested in building one of these, here are some resources I used:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://siliconrepublic.blogspot.de/2011/02/arduino-based-pc-ambient-lighting.html&quot;&gt;http://siliconrepublic.blogspot.de/2011/02/arduino-based-pc-ambient-lighting.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://learn.adafruit.com/adalight-diy-ambient-tv-lighting/overview&quot;&gt;http://learn.adafruit.com/adalight-diy-ambient-tv-lighting/overview&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Ambient Light TV with a Raspberry Pi and a Webcam (Part 1)</title><link>https://waldobronchart.com/note/ambient-light-tv-with-a-raspberry-pi-part1/</link><guid isPermaLink="true">https://waldobronchart.com/note/ambient-light-tv-with-a-raspberry-pi-part1/</guid><pubDate>Wed, 15 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;After finishing my Arduino 8x8 LED Display, I got a Raspberry Pi, and this is what I made with it: a 50-pixel RGB ambient light rig for my TV.&lt;/p&gt;
&lt;div class=&quot;video-embed&quot;&gt;
  &lt;iframe
    src=&quot;https://player.vimeo.com/video/65981231?h=a7801f08d4&quot;
    frameborder=&quot;0&quot;
    allow=&quot;autoplay; fullscreen; picture-in-picture&quot;
    allowfullscreen&gt;
  &lt;/iframe&gt;
&lt;/div&gt;

&lt;p&gt;The colors are sampled from the edges of the TV screen using a webcam. After sampling from the captured frame, each LED is updated with the matching color. Watching movies and playing games with it on is great.&lt;/p&gt;
&lt;p&gt;The initial prototype used an Arduino — color sampling was done on the PC and sent to the Arduino over serial. That setup only worked when my computer was the video source (cloned monitor to TV). I also managed to break my Arduino, which forced me to use the Pi instead.&lt;/p&gt;
&lt;p&gt;With the webcam approach, the rig works with any input: cable TV, Xbox, Apple TV, Steam Big Picture and the Raspberry Pi itself. I briefly looked into HDMI splitters and frame grabbers, but they were far too expensive.&lt;/p&gt;
&lt;p&gt;Overall it took about 6 weekends to complete, spread over 7 months. I took a bunch of work-in-progress pictures along the way — those are in &lt;a href=&quot;https://waldobronchart.com/note/ambient-light-tv-with-a-raspberry-pi-and-camera-part2&quot;&gt;part 2&lt;/a&gt;.&lt;/p&gt;
</content:encoded></item><item><title>Arduino 8x8 LED Display</title><link>https://waldobronchart.com/note/arduino-led-display/</link><guid isPermaLink="true">https://waldobronchart.com/note/arduino-led-display/</guid><pubDate>Sun, 12 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Last year, one of my colleagues at work was showing off his automatic RC car project. He introduced me to Arduino and pointed me to where to get one. I picked up the &lt;a href=&quot;https://www.sparkfun.com/products/10174&quot;&gt;SparkFun Arduino Starter Kit&lt;/a&gt; with a multimeter. It comes with a bunch of components and tutorials. The tutorials were a great start, but I quickly got bored — for me the best way to learn is to get my hands dirty and deal with problems as they come up. YouTube is full of Arduino projects, and I quickly found something I wanted to build: an 8x8 LED screen that I could potentially expand and make mini games for.&lt;/p&gt;
&lt;p&gt;I found a similar project on &lt;a href=&quot;http://www.instructables.com/id/810-LED-Matrix-with-4017/&quot;&gt;Instructables&lt;/a&gt; which made it easy to figure out what components I needed. I ordered them from &lt;a href=&quot;http://www.hobbytronics.co.uk/&quot;&gt;Hobby Tronics&lt;/a&gt;, &lt;a href=&quot;http://www.coolcomponents.co.uk/&quot;&gt;Cool Components&lt;/a&gt; and &lt;a href=&quot;http://www.rapidonline.com/&quot;&gt;Rapid Online&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Here are some work-in-progress shots. It took about 2 months to complete, including delivery wait times and planning.&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-1.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-2.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-3.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-4.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-5.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-6.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-7.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-8.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-9.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/led-display-10.webp&quot; width=&quot;80&quot; height=&quot;80&quot; style=&quot;object-fit:cover;display:inline-block;margin:2px;&quot; /&gt;&lt;/p&gt;

&lt;p&gt;After all the soldering, most of the work was C++ code, but for me that was the easy bit! You can browse it on &lt;a href=&quot;https://github.com/waldobronchart/ArduinoLEDMatrix&quot;&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;video src=&quot;https://waldobronchart.com/images/projects/arduino-led-display/image-6.mp4&quot; autoplay loop muted playsinline style=&quot;max-width: 100%;&quot;&gt;&lt;/video&gt;&lt;/p&gt;
&lt;p&gt;And there you have it, a retina display for the Arduino! &lt;em&gt;(viewing distance 100 meters)&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Eventually I wanted to expand the screen to a 24x16 matrix (adding 5 more of the same blocks), but realised I&amp;#39;d need a separate power supply. All the power was coming directly from the Arduino, which is just enough to drive 64 LEDs. Adding more would mean reworking the circuit layout or adding a whole new breadboard.&lt;/p&gt;
&lt;p&gt;So I decided to park this project and move on to more exciting things.&lt;/p&gt;
</content:encoded></item><item><title>Blender Keyboard Shortcut Explorer</title><link>https://waldobronchart.com/note/blender-keyboard-shortcut-explorer/</link><guid isPermaLink="true">https://waldobronchart.com/note/blender-keyboard-shortcut-explorer/</guid><pubDate>Sun, 21 Apr 2013 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;I&amp;#39;ve been learning Blender on and off, and one thing I picked up early is that keyboard shortcuts are essential if you want to work fast. Memorising them is tough — most of the cheat sheets and keyboard layouts floating around aren&amp;#39;t up to date, so I&amp;#39;d usually end up searching through forum posts.&lt;/p&gt;
&lt;p&gt;Last weekend I was messing around with Python in Blender and noticed you can access all the keyconfig data through their API. I exported it to JSON and had fun building an interactive HTML keyboard that displays every shortcut. It even updates live as you press modifier keys.&lt;/p&gt;
&lt;p&gt;Check it out here: &lt;a href=&quot;http://waldobronchart.github.io/ShortcutMapper/&quot;&gt;waldobronchart.github.io/ShortcutMapper/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://waldobronchart.com/images/notes/blender-shortcuts.webp&quot; alt=&quot;Blender Shortcut Explorer Screenshot&quot;&gt;&lt;/p&gt;
&lt;p&gt;Because the data is pulled straight from Blender, keeping it up to date is much easier than maintaining a hand-made cheat sheet.&lt;/p&gt;
&lt;p&gt;Edit: This prototype eventually grew into a &lt;a href=&quot;https://waldobronchart.com/note/shortcut-mapper-release&quot;&gt;full release&lt;/a&gt; with support for over 20 applications.&lt;/p&gt;
</content:encoded></item></channel></rss>