Notes on Exploring Curio ROS: ros_control

When learning something new, I always find it useful to find a part that I could use as a foundation. Something I can use to build my new information on top of. I had trouble finding such a foundation for ROS as it was such a big system. So it was a great gift to have the chance to look at Rhys Mainwaring’s ROS stack for Curio rover, a sibling of my Sawppy rover. This meant the rover I designed and built was my foundation for learning Curio’s ROS software stack.

Such a foundation was less critical when I had explored Curio’s interaction between Arduino Mega and Raspberry Pi. But it was very useful when I explored how command messages were sent around inside the system. This was built using ros_control, a set of ROS packages that help abstract the concepts of robot motor control from the actual details of motor controller commands.

The promise here is allowing a robot builder to swap around different motor controllers without changing the logic about how a robot would use those motors. Conveniently, Sawppy has both of the basic categories: “Joints” specify a position, and that fits Sawppy’s four corner steering servos. Whereas “Transmission’ specify rotational motion like Sawppy’s six wheel motors.

The idea of abstracting motor control from implementation is common, I even had a primitive form of it inside SGVHAK_Rover software allowing us to hack a servo into a RoboClaw placeholder, and later adapted to Sawppy’s LX-16A serial bus servos. The power of such abstraction comes when it becomes open and flexible enough for software modules implementing either side of the abstraction to be reusable beyond its original author’s use. That certainly was not going to happen with a homebrew pack of servo software, but a convention in ROS is a different story.

Which is why I was puzzled to learn ros_control does not appear to be in the works for ROS 2. It is absent from the index, and I found only a discussion thread with no commitment and this page with a dead link. I thought ros_control would be a fundamental part of the platform, but it is not. Its absence tells me there’s an important gap between my expectation and ROS community’s actual priorities, but I don’t know what it is just yet. I’ll need to find its successor in the ROS2 ecosystem before I understand why ros_control is being left behind.

Notes on Exploring Curio ROS: Arduino Mega

I was very excited when I learned Rhys Mainwaring created ROS software for Curio rover, a sibling of my Sawppy rover. An autonomous Sawppy on ROS has always been the long-term goal but I have yet to invest the time necessary to climb the learning curve. Rhys has far more ROS experience, and I appreciated the opportunity to learn from looking over the Curio Github repository. Here are some of my notes. written with the imperfect accuracy and completeness of a ROS beginner learning as I go.

The most novel part of Curio is obtaining odometry data from LX-16A’s position sensor with the use of a filter that recognizes when we’re in the dead zone of that position sensor and rejects bad data. I believe Rhys has ambition to extrapolate position data while within the dead zone but I didn’t find the code to make it happen. Either I missed it or that is still yet to come.

I love the goal of odometry calculation without requiring additional hardware, but Rhys ran into problems with bandwidth and a little extra hardware was brought in to help as (hopefully?) a short term workaround. While Sawppy didn’t need to communicate with the servos very frequently, Curio needed to also poll servo positions far more frequently for the odometry filter. Rhys found that the LewanSoul BusLinker board’s serial to USB bridge could not sustain the data rate necessary for the filter to obtain good data.

As a workaround, Curio makes use of an Arduino Mega 2560 to communicate with BusLinker via its 5V UART TX/RX pins, and then translating that to USB serial for the Raspberry Pi. The Arduino Mega is necessary for this role because it has multiple hardware UART necessary to communicate with both BusLinker and Raspberry Pi at high speed. I only have Arduino Nano on hand, with a single UART, and thus unsuitable for the purpose.

Curio’s Arduino Mega also has a second job: that of interpreting PWM commands from a remote control receiver, relaying user commands from a remote control transmitter. This is an alternative to my HTML-based control scheme over WiFi.

Curio’s Arduino communicates with its Pi over USB serial, using the rosserial_arduino library. Rhys has set up Curio’s Arduino firmware code such that its two jobs can easily be separated. If a rover builder only wants one or the other function, it should be as easy as changing the values of ENABLE_ARDUINO_LX16A_DRIVER  or ENABLE_RADIO_CONTROL_DECODER to trigger the right #ifdef to make it happen.

Samsung 500T Now Runs On Solar Power

I wanted to have a screen in my house displaying current location of the international space station. I love ISS-Above but didn’t want to dedicate a Raspberry Pi and screen, I wanted to use something in my pile of retired electronics instead. I found ESA’s HTML-based ISS tracker, tested it on various devices from my pile, and decided the Samsung 500T would be the best one to use for this project.

One of the first device I tried was a HP Mini (110-1134CL) and I measured its power consumption while running ESA’s tracker. I calculated my electric bill impact to keep such a display going 24×7 would be between one and two dollars a month. This was acceptable and a tablet would cost even less, but what if I could drop the electric bill impact all the way to zero?

Reading the label on Samsung 500T’s AC power adapter I saw its output is listed at 12V DC. The hardware is unlikely to run on 12V directly, since it also has to run on batteries when not plugged in. It is very likely to have internal voltage regulators which should tolerate some variation of voltage levels around 12V. The proper way to test this hypothesis would be to find a plug that matches the AC adapter and try powering the tablet from my bench power supply. But I chose the more expedient path of beheading the AC adapter instead and rewiring the severed plug.

A quick test confirmed the tablet does not immediately go up in flames when given input voltage up to 14.4V, the maximum for lead-acid batteries. Whether this is bad for the device long term I will find out via experience, as the tablet is now wired up to my solar powered battery array.

This simple arrangement is constantly keeping tablet batteries full by pulling from solar battery. This is not quite optimal, so a future project to come will be to modify the system so it charges from solar during the day and runs on its own internal battery at night. But for now I have an around-the-clock display of current ISS location, and doing so without consuming any electricity from the power grid

Inspiration From Droids of Star Wars

Today is the fourth day of the month of May, which has grown into “Star Wars day” due to “May the Fourth” sounding like that film’s popular parting line “may the Force be with you.” A quick search confirmed I’ve never explicitly said anything about Star Wars on this blog and that should be corrected.

By the time I saw Star Wars, I had already been exposed to popular science fiction concepts like space travel, interstellar commerce, and gigantic super-weapons. And the idea of a cult that promises to make their followers more special than regular people… we certainly didn’t need science fiction for that. So none of those aspects of Star Wars were especially notable. What left a lasting impression was R2-D2.

R2-D2 had its own expression of duty and loyalty. Companion to humans, and a Swiss Army knife on wheels. A character that managed to convey personality without words or a face. R2-D2 was the most novel and compelling character for me in the film. I wouldn’t go far as to say R2-D2 changed the path of my life, but there has definitely been an influence. More than once I’ve thought of “does this help me get closer to building my own R2” when deciding what to study or where to focus.

I was happy when I discovered there’s an entire community of people who also loved the astromech droid and banded together to build their own. But that turned to disappointment when I realized the dominant approach in that community was focused on the physical form. Almost all of these were remote-controlled robots under strict control of a nearby human puppeteer, and little effort was put into actually building a capable and autonomous loyal teammate.

I can’t criticize overly much, as my own robots have yet to gain any sort of autonomy, but that is still the ultimate long-term goal. I love the characters of R2-D2 and the follow-on BB-8 introduced in the newest trilogy. Not in their literal shape, but in the positive role they imagined for our lives. This distinction is sometimes confusing to others… but it’s crystal clear to me.

Oh, I thought you loved Star Wars.

Star Wars is fine, but what I actually love are the droids.

I still hope the idea becomes reality in my lifetime.

Converting Power Input of USB-C Car Charger

The first introduction of USB-C into my life was my Nexus 5X cell phone. Intrigued by the promise of faster charging possible with USB-C, I bought a few additional chargers including this car charger sold by Monoprice.

MP USBC conversion 00 user end

This particular model is no longer carried by Monoprice, probably because there’s a flaw in the design. After several months, it became difficult for it to make good electrical contact with the standard car power socket that originally started as a cigarette lighter.

MP USBC conversion 01 plug end

My hypothesis is that there’s poor electrical conduction in the system, causing energy to be lost as heat that started melting the surrounding plastic. Eventually seizing up the spring-loaded mechanism so it is stuck.

MP USBC conversion 02 melty closeup

I first tried cutting the metal free from melted plastic and had no luck. This plastic is extremely durable.

MP USBC conversion 03 tough to cut

I then tried attacking the problem from the other end, and felt sheepish because the face plate is only held by friction and popped off easily.

MP USBC conversion 04 faceplate pops open

Looking inside, I could see two screws for further disassembly.

MP USBC conversion 05 two screws visible

Once they were removed, it was easy to pull the guts and lay them out.

MP USBC conversion 06 components laid out

There is a thin spring behind the contact showed heat darkening, consistent with hypothesis of too much power carried within that thin metal causing heating. My experiment of the day would be to replace that connector system, and the easiest type on hand is a commodity JST-RCY connector which is good for at least 3 amps and very commonly handling peak power higher than 3A in remote-control aircraft.

MP USBC conversion 07 JST-RCY soldered on

The first soldering effort was bad. The positive wire easily soldered to where the spring used to be, but the original ground contact is a huge piece of metal my soldering iron could not bring up to proper temperature for a good solder joint. For the second attempt I found another ground on the PCB to solder to, keeping the two wires tight enough so I could thread it through the partially melted hole where the spring-loaded positive contact used to be.

MP USBC conversion 08 JST-RCY threaded through

I reassembled the device without the original spring or its contact. I won’t be able to use it with a car power socket anymore but I should be able to keep using it to charge USB-C devices from other ~12V DC power sources.

MP USBC conversion 09 reassembled

Wheel Drive Motor Gearbox Swap for JPL Open Source Rover

It’s a lot of fun to run the JPL Open Source Rover across rough terrain, seeing its rocker-bogie suspension system at work. But it is possible to play too rough and break some gears in the wheel drive gearbox. Some rover builders on the forum who ran into this problem decided they wanted sturdier motors and upgraded all six drive motors to something bigger and beefier. I understand this upgrade was done for the JPL-owned example as well. But that can be an expensive proposition.

If a rover is not strictly required to traverse rough terrain, we can decide to stay with kinder gentler terrain. Returning to the official parts list we see they are Pololu’s item number 4888, 172:1 Metal Gearmotor LP 12V with 48 CPR Encoder. As of this writing, $35 each. The easy solution is to buy more of them but I hunted for a less expensive proposition.

My first question is: “Can we make replacement gears?” and I quickly decided it was not practical. These gears are too small for consumer grade FDM 3D printers to handle and demands more strength than 3D-printed plastic can deliver. I don’t have a machine shop with metal gear cutting equipment.

The next question is: “Can we buy replacement gears?” And I had no luck here as I didn’t know how to navigate the manufacturing industry landscape to find who might be willing to sell small numbers of these gears to individual consumers.

Following that: “Can we buy replacement gearboxes?” The best I found was a company selling them with a minimum order quantity of 1000. I suppose I could buy a pallet and go into business selling replacement gearboxes to rover builders, but that’s not my idea of entrepreneurship today. (UPDATE: While sharing this information to OSR forums, I found a vendor on Amazon(*) selling them at $16 each. For lowest cost, I also found a company on Alibaba willing to sell individual gearboxes as samples at $2.79 each.)

What’s left? Well, Pololu’s product chart shows item 3256 is the same motor and gearbox, but without the encoder. As of this writing, these are $20 each, a significant discount for not buying another encoder.

It offers a lower cost alternative to direct replacement. I had two broken gearboxes on hand. They correspond to the two front wheels on a rover that took too big of a drop off a curb. I bought two #3256 gearmotors without encoder, and swapped their gearboxes out with the rover’s two #4888 gearmotors with encoders, bringing the rover back up and running.

(*) Disclosure: As an Amazon Associate I earn from qualifying purchases.

Old Chromebook Lifespan Longer Than Originally Thought

A cracked screen seemed to be the only problem with this Toshiba Chromebook 2 (CB35-B3340). I found no other hardware or software issues with this machine and it seemed to be up and running well with an external monitor. The obvious solution was to buy a replacement screen module, but I was uncertain if that cost would be worthwhile. I based my opinion on Google’s promise to support Chromebook hardware for five years, and it’s been five years since this model was introduced. I didn’t want to spend money on hardware that would be immediately obsolete.

I’ve since come across new information while exploring the device. This was the first Chrome OS device I was able to spend a significant time with, and I was curious about all the capabilities and limitations of this constrained-by-design operating system. While poking around in the Settings menu, under “About Chrome OS” I found the key quote:

This device will get automatic software and security updates until September 2021.

I don’t know how this September 2021 time was decided, but it is roughly seven years after the device was introduced. At a guess I would say Google estimated a two year shelf life for this particular Chromebook hardware to be sold, and the promised five year support clock didn’t start until the end of that sales window. This would mean someone who bought this Chromebook just as it was discontinued would still get five years of support. If true, it is more generous than the typical hardware support policy.

Whatever the reason, this support schedule changes the equation. If I bought a replacement screen module, this machine could return to full functionality and support for a year and a half. It could just be a normal Chromebook, or it could be a Chromebook running in developer mode to open up a gateway to more fun. With this increased motivation, I resumed my earlier shopping for a replacement and this time bought a salvaged screen to install.

Old AMD GPU for Folding@Home: Ubuntu Struggles, Windows Win

The ex-Luggable Mark II is up and running Folding@Home, chewing through work units quickly mostly thanks to its RTX 2070 GPU. An old Windows 8 convertible tablet/laptop is also up and running as fast as it can, though its best speed is far slower than the ex-Luggable. The next recruit for my folding army is Luggable PC Mark I, pulled out of the closet where it had been gathering dust.

My old AMD Radeon HD 7950 GPU was installed in Luggable PC Mark I. It is quite old now and AMD stopped releasing Ubuntu drivers after Ubuntu 14. Given its age I’m not sure if it even works for GPU folding workloads. It was designed and released near the dawn of the age when GPUs started finding work beyond rendering game screens, and its GCN1 architecture probably had problems typical of first versions of any technology.

Fortunately I also have an AMD Radeon R9 380 available. It was formerly in Luggable PC Mark II but during the luggable chassis decommissioning I retired it in favor of a NVIDIA RTX 2070. The R9 380 is a few years younger than the HD 7950, I know it supports OpenCL, and AMD has drivers for Ubuntu 18.

A few minutes of wrenching removed the HD 7950 from Luggable Mark I, putting the R9 380 in its place, and I started working out how to install those AMD Ubuntu drivers. According to this page, the “All-Open stack” is recommended for consumer products, which I mean to include my consumer-level R9 380 card. So the first pass started by running amdgpu-install. To verify OpenCL is up and running, I installed clinfo to verify GPU is visible as OpenCL device.

Number of platforms 0

Hmm. That didn’t work. On advice of this page on Folding@Home forums, I also ran sudo apt install ocl-icd-opencl-dev That had no effect, so I went back to reread the instructions. This time I noticed the feature breakdown chart between “All-Open” and “Pro” and OpenCL is listed as a “Pro” only feature.

So I uninstalled “All-Open” and installed “Pro” stack. Once installed and rebooted, clinfo still showed zero platforms. Returning to the manual, on a different page I found the fine print saying OpenCL is an optional component of the Pro stack. So I reinstalled yet again, this time with --opencl=pal,legacy flag.

Running clinfo now returns:

Number of platforms 1
Platform Name AMD Accelerated Parallel Processing
Platform Vendor Advanced Micro Devices, Inc.
Platform Version OpenCL 2.1 AMD-APP (3004.6)
Platform Profile FULL_PROFILE
Platform Extensions cl_khr_icd cl_amd_event_callback cl_amd_offline_devices
Platform Host timer resolution 1ns
Platform Extensions function suffix AMD

Platform Name AMD Accelerated Parallel Processing
Number of devices 0

NULL platform behavior
clGetPlatformInfo(NULL, CL_PLATFORM_NAME, ...) No platform
clGetDeviceIDs(NULL, CL_DEVICE_TYPE_ALL, ...) No platform
clCreateContext(NULL, ...) [default] No platform
clCreateContext(NULL, ...) [other] <error: no devices in non-default plaforms>
clCreateContextFromType(NULL, CL_DEVICE_TYPE_DEFAULT) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_CPU) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_ACCELERATOR) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_CUSTOM) No devices found in platform
clCreateContextFromType(NULL, CL_DEVICE_TYPE_ALL) No devices found in platform

Finally, some progress. This is better than before, but zero devices is not good. Back to the overview page which says their PAL OpenCL stack supported their Vega 10 and later GPUs. My R9 380 is from their Tonga GCN 3 line, which is quite a bit older than Vega which is GCN 5. So I’ll reinstall with --opencl=legacy to see if it makes a difference.

It did not. clinfo still reports zero OpenCL devices. AMD’s GPU compute initiative is called ROCm or RadeonOpenCompute but it is restricted to hardware newer than what I have on hand. Getting OpenCL up and running, on Ubuntu, on hardware this old, is out of scope for attention from AMD.

This was the point where I decided I was tired of this Ubuntu driver dance. I wiped the system drive to replace Ubuntu with Windows 10 along with AMD Windows drivers. Folding@Home saw the R9 380 as a GPU compute slot, and I was up and running simulating protein folding. The Windows driver also claimed to support my older 7950, so one potential future project would be to put both of these AMD GPUs in a single system. See if the driver support extends to GPU compute for multi GPU folding.

For today I’m content to have just my R9 380 running on Windows. Ubuntu may have struck out on this particular GPU compute project, but it works well for CPU compute, especially virtual machines.

Desktop PC Component Advantage: Sustained Performance

A few weeks ago I decommissioned Luggable PC Mark II and the components were installed into a standard desktop tower case. Heeding Hackaday’s call for donating computing power to Folding@Home, I enlisted my machines into the effort and set up my own little folding farm. This activity highlighted a big difference between desktop and laptop components: their ability to sustain peak performance.

My direct comparison is between my ex-Luggable PC Mark II and the Dell laptop that replaced it for my mobile computing needs. Working all out folding proteins, both of those computers heated up. Cooling fans of my ex-Luggable sped up to a mild whir, the volume and pitch of the sound roughly analogous to my microwave oven. The laptop fans, however, spun up to a piercing screech whose volume and pitch is roughly analogous to a handheld vacuum cleaner. The resemblance is probably not a coincidence, as both move a lot of air through a small space.

The reasoning is quite obvious when we compare the cooling solution of a desktop Intel processor against one for a mobile Intel processor. (Since my active-duty machines are busy working, I pulled out some old dead parts for the comparison picture above.) Laptop engineers are very clever with their use of heat pipes and other tricks of heat management, but at the end of the day we’re dealing with the laws of physics. We need surface area to transfer heat to air, and a desktop processor HSF (heat sink + fan) has tremendously more of it. When workload is light, laptops keep their fans off for silent operation whereas desktop fans tend to run even when lightly loaded. However, when the going gets rough, the smaller physical volume and surface area of laptop cooling solutions struggle.

This is also the reason why different laptop computers with nearly identical technical specifications can perform wildly differently. When I bought my Inspiron 7577, I noticed that there was a close relative in Dell’s Alienware line that has the same CPU and GPU. I decided against it as it cost a lot more money. Some of that is branding, I’m sure, but I expect part of it goes to more effective heat removal designs.

Since I didn’t buy the Alienware, I will never know if it would have been quieter running Folding@Home. To the credit of this Inspiron, that noisy cooling did keep its i5-7300HQ CPU at a consistent 3.08GHz with all four cores running full tilt. I had expected thermal throttling to force the CPU to drop to a lower speed, as is typical of laptops, so the fact this machine can sustain such performance was a pleasant surprise. I appreciate the capability but that noise got to be too much… when I’m working on my computer I need to be able to hear myself think! So while the ex-Luggable continued to crunch through protein simulations, the 7577 had to drop out. I switched my laptop to the “Finish” option where it completed the given work unit overnight (when I’m not sitting next to it) and fetched no more work.

This experience taught me one point in favor of a potential future Luggable PC Mark III: the ability to run high performance workloads on a sustained basis without punishing hearing of everyone nearby. But this doesn’t mean mobile oriented processors are hopeless. They are actually a lot of fun to hack, especially if an old retired laptop doesn’t need to be mobile anymore.

Progress After One Thousand Iterations

Apparently I’ve got a thousand posts under my belt, so I thought it’d be fun to write down my current format. Sometime in the future I can look back on these notes and compare to see how it has evolved since.

Length: My target length has remained 300 words, but I’ve become a lot less stringent about it. 300 words is enough for a beginning, middle and end to a story. It is also about the right length to describe a problem, list the constraints, and explain why I made the decision I did. Sometimes I could get my thoughts out in 250 words, and that’s fine. When something goes long, I usually try to cut them into multiple ~300 word installments, but sometimes splitting up doesn’t make sense. I forced it a few times and they read poorly in hindsight, so if I run into it again (like this post) I just let those pieces run long.

Always Have A Featured Image: When I started writing I paid little attention to images, because the original focus is to have a written record I can search through. As it turned out, the featured image is really useful. First: it allows me to quickly skim through a set of posts just by their thumbnails, faster than reading each of their titles. Second: making sure I have at least one picture attached to every story is very helpful for jogging old memories. And sometimes, what I thought was a simple throwaway image became a useful wiring reference. I now believe pictures are a valuable part of documenting. Today’s cell phone cameras are so much better than they were four years ago, it only takes a few seconds to snap a high quality picture.

Still figuring out video: While images may have been an afterthought, video was not a thought at all when I started. Right now I’m in the middle of exploring video as an supplement — not a replacement — for these written records. It is another tool to use when appropriate, and cell phone camera improvements helps on this front as well. The only hiccup today is that I can’t directly embed video because VideoPress is only available to higher WordPress subscription tiers. As workarounds, short video clips are tweeted then embedded, and longer video clips are uploaded to YouTube and embedded. I expect video usage evolve rapidly as I experiment and see what works.

Use more tags, fewer categories: I started out trying to organize posts in categories, and that has become an unsatisfying mess representing a lot of wasted effort. When I want to find something I wrote, I go for the straight text search instead of browsing categories. And if I want to relate posts to each other in a search, I can use tags. It has advantage of arbitrary relations free of constraints imposed by a tree hierarchy.

Yet to stay with consistent voice: This is my blog about my own work, so I usually say “I”. But sometimes I slip into talking about “we” because in my mind I’m talking to my future self.

Keep up the daily rhythm: Scheduling a post to go out once a day, every day, is the best way I’ve had to keep the momentum going. I tried going to slower rhythms, like every other day, and it never works. If I stop for a single day, I’m liable to stop for multiple days that drag to weeks without a post. Usually there’s a good reason like a paid project that is consuming my time, but sometimes there isn’t. I’ve learned it is very easy to lose my momentum.

If it was interesting enough to take time, it’s interesting enough to write: I now describe tasks that took time, multiple searches, and multiple tries, before I found the solution. My original reasoning for not writing them down is the that since I found all the information online, my blog post won’t have anything new that people can’t find themselves. But there have been a few episodes where I forgot the solution and had to repeat the process again, and I was unhappy I didn’t write it down earlier. I’ve learned my lesson. Now if it took a nontrivial amount of time, I’ll at least jot down a few details in my “Drafts” folder for expanding to a full blog post later. Some of these are still sitting as a draft, but at least in that state they are still searchable.

One Thousand Posts

I just learned WordPress puts up a special milestone notification when a blog site has one thousand posts, because I triggered that notification with yesterday’s post about vaguely attainable somewhat humanoid robots.NewScrewdriver 1000 posts

It’s pretty common for a personal blog to have only a handful of posts — sometimes just one — before it goes dormant. My first attempt ended after less than a dozen. The second attempt had more than a dozen, but not by much. Fortunately for me, they have stopped taunting me as they have been erased by no actions of my own: both of them were hosted on small startup blog hosting services that have since gone out of business. Maybe fragments have survived in Google caches and what not, but I haven’t felt inclined to go searching for them.

I had no reason to expect the results would be any different with this third attempt, so again I started with the free tier of service. Except this time I started with a more established host:, the commercial hosting counterpart whose revenue helps support the free open-source blog software available from When I felt that I’ve found my groove and can keep this going, I upgraded to the “Personal” plan so I can have my own domain and remove WordPress ads.

So far I have felt no need to upgrade beyond the Personal tier. Most of the higher tier features are tailored to people trying to make money in one way or another but I have no revenue goals for this blog. This is mostly documentation for my own aims, and if my notes are useful for someone else, that’s just a happy coincidence. One way I’ve described this site to friends is “a diary with zero expectation of privacy”. My content is not tailored to maximize traffic and, in fact, is the wrong medium to do so: consumer traffic (and corresponding ad revenue) are migrating towards video and away from text.

But I want text. I like to read and learn at my own pace. While I’m glad YouTube (and other video sites) have implemented ability to adjust playback speed of a video, having to go and change that setting is still a hassle. And finally: as documentation for myself, I want to be able to search through my notes and that’s a lot easier with text than video.

But there are some things more suited to a video than the written word, and for them I’ve shot video footage and created a New Screwdriver YouTube channel to host them. Right now I see the YouTube channel as roughly analogous to my first few aborted blogging efforts: an exploration into the medium looking for a way to make this work. Hopefully it won’t go dormant, but the YouTube channel certainly won’t be my focus for the foreseeable future.

One thousand posts is a good milestone, and I intend to keep things going for the foreseeable future. But as things will continue to evolve and change, it’s a good time to write down the current state for future comparison.

New Project: Computer Control via USB Serial

Since I’ve started this blog I’ve explored several problem domains with a common thread: equipment automation by computer control. Most recently my CNC project running GRBL needed a computer G-code sender. 3D printers are similar, though most modern printers can run independently using G-code stored on a memory card. And finally the aborted thermoforming machine project that had ambition to use a Raspberry Pi as its brain.

In all of these cases, we had a piece of equipment that could communicate with a PC via a USB serial adapter, so we can let the hardware focus on low level tasks and the PC could perform higher level tasks. It would be useful to dig deeper into this world and get a better feel of the tools available for solving problems.

For this initial pass my focus will be on PC software that interfaces with arbitrary pieces of equipment that communicate via USB serial, and the primary motivation for PC involvement would be its ability to display data on a full sized computer monitor. These two considerations will be my “North Star” for prioritization.

As a starting point, I thought I’d look over a few examples from an existing ecosystem: that of computer controlled hardware for electronics measurement and testing automation. I didn’t think they would be directly applicable, but I didn’t know how to articulate why until I learned a little more.

As of this writing, my understanding is that such software’s value to professional engineers are in two areas that are near, but not quite, my own priorities for this investigation:

  • They are built around the IEEE-488 standard, a formalized version of GPIB interface that started as a proprietary solution (HP-IB) for Hewlett-Packard equipment but has grown into a de facto standard in this industry. This standard encompasses the physical connector, electrical interface, and software protocol. Recently, the popularity of USB meant USB has taken over the physical and electrical portions. But the GPIB communication protocol lives on as USB488, which I understand to be a part of USB TMC. This is different from USB serial adapters, which usually identify as USB CDC and/or ACM.
  • They offer an extensive collection of data analysis and visualization tools specialized to the field of electronics test and measurement. This does not necessarily mean they support custom rendering of arbitrarily large data sets.

As a first example of how those differences manifest in practice, let’s do a quick window-shopping pass of Keysight VEE.

Preparing Retired Laptops For Computing Beginners

I’ve just finished looking over several old laptop computers with an eye for using them as robot brains running ROS, a research project made possible by NUCC. Independent of my primary focus, the exercise also gave me some ideas about old laptops used for another common purpose: as cheap “starter” computers for people getting their feet wet in the world of computers. This intent involves a different set of requirements and constraints than robot building.

In this arena, ease of use becomes paramount which means most distributions of Linux are excluded. Even Raspbian, the distribution intended for people to learn in a simplified environment on a Raspberry Pi, can get intimidating for complete beginners. If someone who receives a hand-me-down computer knows and prefers Linux, it’s a fair assumption they know how to install it themselves as I had done with my refurbished Dell Latitude E6230.

Next, a hand-me-down laptop usually includes personal data from its previous owner. Ideally it is inaccessible and hidden behind password protection, but even if not, the safest way to protect against disclosure is to completely erase the storage device and reinstall the operating system from scratch.

Historically for Windows laptops such cleaning also meant the loss of the Windows license since the license key has almost certainly been separated from the computer in its lifespan. Fortunately, starting from Windows 8 there is a Windows license key embedded in the hardware, so a clean install will still activate and function properly. For these Windows laptops and MacOS machines, it is best to preserve that value and run its original operating system. This was the case for the HP Split X2 I examined.

If a Windows or MacOS license is not available, the most beginner-friendly operating system is Chrome OS. It is available for individuals to install as Neverware CloudReady: Home Edition. Putting this on a system before giving it to a beginner will allow them to explore much of modern computing while also sparing them much of the headaches. And if they dig themselves into a hole, it is easy to restart from scratch with a “Powerwash”. This was what I had done with the Toshiba Chromebook 2 I examined.

But modern computing has left 32-bit CPUs behind, limiting options for older computers lacking support for 64-bit x86_64 instruction set. It meant Neverware CloudReady is not an option for them either. It is possible the user can be served by a machine that is a stateless web kiosk machine, in which case we can install Ubuntu Core with the basics of web kiosk.

And if we have exhausted all of those options, as was the case for the HP Mini netbook I examined, I believe that means the machine is not suitable as a hand-me-down starter computer for a beginner. Computers unable to meet minimum requirements for all of the above would only be suitable for basic command-line based usage. And whether computing veterans like it or not, current convention wisdom says a command line is not the recommended starting point for today’s computing beginners.

So in order of preference, the options for a beginner-friendly laptop after wiping a disk of old data are:

  1. Windows (if license is in hardware) or MacOS (for Apple products)
  2. Either original Chromebook/Chromebox or Chrome OS via Neverware CloudReady.
  3. Ubuntu Snappy Core in Web Kiosk mode.
  4. Sorry, it is not beginner friendly.

[UPDATE: Since the time I wrote this up, I have discovered a lightweight Debian distribution suitable for old x86 computers made by the Raspberry Pi foundation. I put it on the HP Mini as well as an even older Dell Latitude X1 and it appears to be a valid option between steps 3 and 4 above.]

A Tale of Three Laptops

This is a summary of my research project enabled by the National Upcycling Computing Collective (NUCC). Who allowed me to examine three retired laptop computers of unknown condition, evaluating them as potential robot brain for running Robot Operating System (ROS).

For all three machines, I found a way to charge their flat batteries and get them up and running to evaluate their condition. I also took them apart to understand how I might mechanically integrate them into a robot chassis. Each of them got a short first-pass evaluation report, and all three are likely to feature in future projects both robotic and otherwise.

In the order they were examined, the machines were:

  1. HP Split X2 (13-r010dx): This was a tablet/laptop convertible designed for running Windows 8, an operating system that was also designed for such a dual-use life. Out of the three machines, this one had the longest feature list including the most modern and powerful Intel Core i3 CPU. But as a tradeoff, it was also the bulkiest of the bunch. Thus while the machine will have no problem running ROS, the mechanical integration will be a challenge. Its first pass evaluation report is here. For full details query tag of 13-r010dx for all posts relating to this machine, including future projects.
  2. Toshiba Chromebook 2 (CB35-B3340): This machine was roughly the same age as the HP, but as a Chromebook it had a far less ambitious feature list but that also gave it a correspondingly lighter and slimmer profile. It is possible to run a form of Ubuntu (and therefore ROS) inside a Chromebook, but there are various limitations of doing so. Its suitability as a robot brain is still unknown. In the meantime, the first pass evaluation report is here, and all related posts (past and future) tagged with CB35-B3340.
  3. HP Mini (110-1134CL): This was a ~10 year old netbook, making it the oldest and least capable machine of the bunch. A netbook was a simple modest machine when new, and the age meant this hardware lacks enough processing power to handle modern software. While technically capable of running ROS Kinetic, the low power processor could only run the simplest of robots and unable to take advantage of the more powerful aspects of ROS. The first pass evaluation report is here, and all related posts tagged with 110-1134CL.

While not the focus of my research project, looking over four old laptops in rapid succession (these three from NUCC plus the refurbished Dell Latitude E6230 I bought) also gave me a perspective on preparing old laptops for computing beginners.

Learning About Airflow From Three Years Of Dust

Three years ago I started this custom computer case project to build something tailored to run FreeNAS. The primary purpose was to get some hands-on time working with laser-cut acrylic, and I learned a lot building it. Now that I’ve decided to upgrade my home server to a different configuration, there will be too much hardware to fit in this box. I’ll start with a commodity PC tower case but I might build another custom case later. Either way, this little acrylic box will be retired.

Since the computer has been sitting in a corner unobtrusively serving up files for my home network, it has also collected three years of dust. The top layer is not particularly interesting, as they were deposited by gravity. The remainder, though, serve as indicator for airflow through the system and serves as a record of comparison against my intended airflow design for the box.

The biggest lesson for me was that convection played a much smaller role than I had expected. Most of the dust indicating flow was proportional to the size of their air channels, there’s no visible sign of convection altering the flow. The most visible example is the ring of dust near the CPU fan on my front panel. I had expected it to be slightly teardrop-shaped to reflect heat rising, but it is almost a perfect circle.

The most unexpected cluster of dust is on the auxiliary CPU power cable, running to the right side of the CPU fan alongside the USB wires. It appears most of the dust there were carried by air drawn in through the front panel gap. I hypothesize that, since it is a very narrow gap, airflow through that route is slowed and thus more likely to deposit dust on that cable bundle.

There were a few minor smudgest of dust whose origins are a mystery. Two up top near the PSU fan, and one on the bottom at the rear end of the PSU. I’m curious what they were, but their fine dust particle size implies they were not a significant factor, so I’m content to leave them as mysteries for now. Maybe they’ll make sense for me in the future once I learn more about designing for airflow. In order to preserve this information (all this dust will be disturbed and cleaned up when I disassemble this box) I shot a video for future reference:

(Cross-posted to

FreeNAS Box Decommissioned After Three Years

I’ve decided to retire my current home server running FreeNAS. It has worked well for three trouble-free years and will likely continue working for a few more. But I have enough motivations for an upgrade beyond its current capabilities.

First, I learned that FreeNAS has been making more and more use of its boot drive in its recent releases. At one point all the SATA ports on a FreeNAS box could be dedicated to storage devices, because FreeNAS itself is happy to boot from a USB flash drive, load to RAM, and run from there. Thus the boot drive is touched very little, minimizing wear on flash memory. However, FreeNAS documentation explained this has not been the case for several years. I have yet to run into any problems with the USB flash drives I’ve been using as mirrored boot volumes, but after three years of service I decided not to wait until problems crop up.

When looking at a boot drive for a modern operating system, my default choice is to use a solid state drive. SSDs were still an expensive luxury when I first started playing with FreeNAS, but they are now quite affordable and there’s been enough hardware churn for a few of my own SSDs to drop out of circulation and thus available for use. My first two Intel X25-M SSDs still report over 85% of wear life remaining. Their modest 80GB capacity is pretty cramped for modern desktop use, but quite spacious for a FreeNAS system drive. That capacity also means a lot of elbow room for flash wear-leveling.

The downside, of course, is that I need a SATA port on the motherboard to connect to my old but still functional X-25M. In order to have a X-25M as my FreeNAS system drive, I had to upgrade beyond this MSI AM1I motherboard with only two SATA ports.

Another motivation was an interest in hosting more functionality on the home server. While code with FreeBSD support can run in a jail, I needed virtual machines to run non-FreeBSD code such as ROS. When I started looking at FreeNAS, virtual machine support via bhyve was an experimental new feature. It has since grown to be a mature part of the feature set. With virtualization I can use the same physical box to host other software projects.

But a virtual machine also locks out a portion of system memory as any RAM allocated to the virtual machine is not available to the rest of FreeNAS. I have many 8GB DDR3 memory modules, but there were only two memory slots on an AM1I motherboard for 16GB. Moving to a motherboard with 4 memory slots will double the available memory to 32GB, plenty of room for playing with VMs.

With these points in mind, I powered off my homebuilt FreeNAS box built of laser-cut acrylic. The two storage drives will be moved to a commodity PC tower case. But before I take it all apart, I wanted to make note of a few observations from this computer’s three years of sitting on a shelf quietly running FreeNAS.

Mars-Bound Rover Perseverance

NASA has just announced the winner of their Name the Rover Contest: Perseverance. The contest invites K-12 students within the United States to submit names for the Mars 2020 rover along with an essay explaining why it is the best name. Sadly, not one of them suggested naming Mars 2020 rover “Sawppy” but I’ll just have to get past that personal disappointment somehow.

I’ve already seen a few people calling it “Persie”, “Percy”, and variants thereof. The official Twitter handle is @NASAPersevere and judging by the first few tweets, this account will follow the trailblazing Phoenix PR effort and tweet from the first person. I’m doing the same for Sawppy, and @SawppyRover has followed @NASAPersevere for future updates. If all goes well, Perseverance wouldn’t even be the only Mars-bound robotic explorer: the European Space Agency has designed one of their own. ExoMars 2020 is an interesting engineering marvel in and of itself, but that’s for another blog post.

Back to the naming contest: I really like the cartoony rover they used. I’ve spent a lot of time analyzing photos, videos, and CAD models of Curiosity and Mars 2020 Perseverance when building Sawppy. I see a lot of technical accuracy represented in the illustration. From the robot arm joints to the rocker-bogie suspension components, I’m very impressed at how well it blends technical details with classic cartoon techniques for appealing character animation. I’m definitely keeping this guy in mind for my future rover work.

In the meantime I have to get on various parts of Sawppy’s online documentation and update mentions of Mars 2020 to Perseverance. I’ll definitely update greeting pages, but I probably won’t bother to update every past project log. The rule of thumb: If it has a date, people can tell it was written before the announcement, so I will probably let it slide. If it doesn’t have a date, I should probably fix it.

Toshiba Chromebook 2 (CB35-B3340): Hardware Internals

While I contemplate buying a replacement screen to bring this Chromebook back to function, I removed the bottom panel as well, just for a look. Ten screws held the bottom panel in place, two of which were hidden under two rubber feet. (Top two as shown in this picture):

Toshiba Chromebook 2 CB35-B3340 bottom

Once removed, we could see the surprisingly roomy interior.

Toshiba Chromebook 2 CB35-B3340 internals

This was a relatively thin laptop for its age and screen size, so I had expected components to be packed densely. The battery, a single large module in the center, dominated the volume as expected. On either side are speakers, each with the luxury of the largest enclosures than I’ve ever seen in laptop speakers. Far larger than the volume allocated to speakers within the HP Split. I’ve read that interior volume for audio tuning is at an extreme premium, with sound designers fighting for millimeters, so it was a surprise to see this. And even with that use of volume, there are still room left unused near the corners.

Electronics occupied the area close to the hinge. They covered less than half of the available surface area and far less than half of the available volume within this laptop. Most of the main circuit board was covered by a metal shield, so I removed it to see components underneath. (In this picture, the machine was rotated 180 degrees relative to previous picture.)

Toshiba Chromebook 2 CB35-B3340 internals without EM shield

I see the CPU, RAM, and flash storage are all tightly integrated and soldered on board. No RAM or storage upgrades for this machine, which is consistent with the Chromebook ethos. About the only core component not soldered down is the commodity WiFi card, which I interpret to mean there was little to no cost savings to integrate an unit.

I had known about Chromebook’s concept of reduced complexity, but it was mostly in terms of software and maintenance. Since Chrome OS was running a Linux kernel under the hood, I expected the hardware to be just as complex as any other laptop. But apparently not this one, which I found very interesting. Now I’m curious if all Chromebooks have electronics guts simpler than equivalent full PC laptops. If I have the opportunity to take apart more Chromebooks in the future, I’ll keep an eye open to see if this is actually common across all Chromebooks or maybe the simplicity of this model is just good work on the part of the Toshiba Dynabook team which designed this Chromebook.

This was an interesting and instructive look inside the machine, time to put it back together and take stock of the current situation.

HP Split X2 (13-r010dx): Hardware Specifications

The first of three old laptops from NUCC to be examined stumped me at first. I found very little information printed on the device and it took a while before I realized it was a convertible tablet. All the information labels were hidden while the tablet was docked. Once I separated the pieces, I could read all the identifiers including its model number 13-r010dx. From there it was easy to find HP’s product page for this machine.

While in laptop mode, the device has a full size SD memory card slot, one HDMI port, and two USB ports. By detaching the base turning it into a tablet, we also expose a duplicate charging jack, a headphone jack, and a microSD memory card slot. I find it odd that the headphone jack is a tablet mode exclusive, and even more odd that they felt it was important to have two flash memory slots.

For robot brain purposes I would have preferred to have a physical Ethernet jack but I can do without. USB Ethernet adapters are plentiful, though the ones I’ve tried had problems with long term reliability. On the upside, both memory card slots are full depth slots so cards sits flush against exterior and would not jut out. So for example, I could keep a microSD card in the tablet and still dock it to the keyboard base without mechanical interference. For robot brain purposes, memory cards are useful for data transfer and logging.

Keyboard feel is decent and the accompanying touchpad is satisfactorily large. Sadly the screen resolution was a disappointing 1366×768. It was accompanied by tablet style features like a touchscreen and a portrait/landscape orientation sensor. None of these would be critical as a robot brain but might be pertinent for other uses.

A sticker proclaimed its processor to be a Core i3, the spec sheet elaborated it is a Core i3-4012Y that I expect to be capable but not super speedy. 4GB of RAM should be sufficient for most purposes, and storage is a SATA hybrid hard drive with 500GB of spinning magnetic platter storage backed by 8GB of NAND Flash memory cache. I don’t recall any prior experience with these hybrid drives and looking forward to seeing one in action. The charge port LED changed from orange to white indicating full charge by the time I was ready to turn it on.

Dell Latitude E6230: Working Too Well To Be Dismembered, NUCC to the Rescue

The previous few blog posts about my refurbished Dell Latitude E6230 was written several months ago and had sat waiting for a long-term verdict. After several months of use I’m now comfortable proclaiming it to be a very nice little laptop. Small, lightweight, good battery life, and decently high performance when I need it. (At the cost of battery life when doing so, naturally.)

The heart of this machine is a third generation Intel Core i5, which covers the majority of computing needs I’ve had while away from my desk. From the basics like 64-bit software capability to its ability to speed itself up to tackle bigger workloads. When working away from a wall plug and running on battery, the E6230 slows only minimally. Unlike my much newer Inspiron 7577 which slows drastically while on battery to the extent that it occasionally felt slower than the E6230. I can run my 7577 for perhaps two to four hours on battery, never far from a reminder of its limited on-battery performance. Whereas I can run the E6230 for around four to six hours on battery, without feeling constrained by reduced performance.

The E6230 has several other features I felt would be good for a robot brain. Top of the list is an Ethernet port for reliable communication in crowded RF environments. Several “SuperSpeed” USB 3 ports are useful for interfacing with hardware. And when I want more screen real estate than the built-in screen can offer, I have my choice of VGA or HDMI video output.

That built-in screen, with its minimal 1366×768 resolution, is about the only thing standing between this machine and greatness. Originally I did not care, because I had planned to tear the case apart and embed just the motherboard in a robot. But this laptop is working too darned well to be subjected to that fate! For the near future I plan to continue using the E6230 as a small laptop for computing on-the-go, and kept my eyes open for other old laptops as robot brain candidates.

An opportunity arose at Sparklecon 2020, when I mentioned this project idea to NUCC. They had a cabinet of laptops retired for one reason or another. I was asked: “What do you need?” and I said the ideal candidate would be a laptop with a broken screen and/or damaged keyboard, and have at least a Core i3 processor.

We didn’t find my ideal candidate, but I did get to bring home three machines for investigation. Each representing a single criteria: one with a busted screen, one with a busted keyboard, and one with a Core i3 processor.

Close enough! And now it’s time for me to get to work on a research project: determine what condition these machines are in, and how they can be best put to use.