Monday, November 24, 2014

Thinkery Robot Army

Recently I did some volunteer work with the Thinkery, which is a a children's museum here in Austin.  They wanted several simple robots that they could take around town and show off to schools and similar places to drum up interest in the museum.

I got pulled in to help with the Arduino "brain" of each robot.  I mostly wrote the firmware for the Arduino but also did some of the circuit design.

All of the robots runs a basic object avoidance routine and, just for fun, each 'bot periodically stops what it's doing and runs a dance sequence.  The robots turned out pretty well; here's a look at them:


The TurtleBot is a four wheeled robot.  Two continuous rotation servos run the wheels, one positional servo turns the head left and right.  An ultrasonic range finder is mounted in the head.  The robot travels forward until it encounters an obstruction, then it looks left and right to see if there is a clear path.  If it detects a clear path it turns in that direction and continues forward.

The tablet mount you can see in the picture was meant to hold a 7 inch Android tablet that would interface with the 'bot, but we ran out of time to implement that.  The beginnings of an Android app to interface with the 'bot is here.

An instructable with construction details is here and the Arduino source code for TurtleBot is available here.


PawsBot consists of a ultrasonic sensor, and two positional servos.  It walks forward on stilt legs until an obstruction is encountered then it backs away.  It doesn't have the ability to turn left or right.  The trickiest part of this robot is getting the legs adjusted correctly such that its gait is correct; the bend in the middle of the robot is important for that.

An instructable with construction details is here and the Arduino source code for the PawsBot is available here.


LegBot is the simplest robot of the three; it's only a positional servo and an ultrasonic range finder.  It works by moving it's legs with a scissor motion and since one foot is more heavily weighted than the other (one foot contains the batteries) it slowly moves forward.  Since the 'bot has no way to move backward or turn, it stops when it encounters an obstruction.

An instructable with construction details is available here and the Arduino source code for the LegBot is available here.

Wednesday, November 12, 2014

Evolution of a DIY PVR

Almost 10 years ago, I wrote an article for Make magazine about building a DIY digital video recorder (DVR).  At the time, there weren't any devices available, outside of subscription-based devices like Tivo, to help record TV.

My DIY device served me well for several years, but I get occasional questions on how or if I've updated my recorder, since much of the software and hardware I used at the time is now obsolete.

The answer is that I have been steadily upgrading that recorder during the intervening years, since there still isn't a commercial DVR on the market that meets my needs.

My original rig

The original article was here, but it appears to have been taken down, although the comments are still viewable. There is still a re-print of the article here.  Here is a brief summary of the components of that system:
  • Hardware: Dell Dimension 4500 with 512MB running Windows 2000 and a Hauppauge WinTV-PVR-250 TV card
  • BeyondTV: For TV recording, scheduling, and live TV overlays
  • WinDVD, Winamp, SlimServer: For media playback and streaming
  • Various console game emulators
  • Girder automation software: To create on-screen launcher menus
  • Cygwin and server software: For Linux-like ftp and ssh servers

Switch from BeyondTV to NPVR

Some time went by and I was getting annoyed with the amount of maintenance required to keep the machine up and running.  Various software components were always crashing and otherwise costing me time.  I started by removing the cygwin software because I wasn't using them enough to justify the time commitment.  At this point I also upgrade the PC I was using to Windows XP.

I also switched from using BeyondTV to NPVR (now called NextPVR).  NPVR had more features, such as DVD playback, and a good plugin system which allowed me to get rid of the extra media playback software like WinDVD.  I was also able to absorb the emulators into the NPVR interface using a plugin.  And best of all, NPVR was free!

The dominoes kept falling and since all of the functionality I needed was handled by NPVR, I got rid of the Girder-based menu system.

Streaming video to Roku
Up until this point I had my PC directly connected to my TV, but around this time, streaming set-top boxes were becoming inexpensive.  So I grabbed a Roku box, and found an obscure way to play media files from my local network, called the MyMedia channel.

While the MyMedia channel worked well, it needed a very particular video format, so I wrote a python script to transcode the video that NPVR produces automatically for me.  The script monitors a directory location for new files and then transcodes them using Handbrake and moves the resulting files to a location where the MyMedia server will pick them up.

I later added some more advanced features like also making the script monitor incoming video from bittorrent, and also making it intelligently rename the files and sort them into my existing video library.  I also made the script act as a simple system monitor and restart troublesome processes automatically to avoid crashes, hangs, and poor performance, which were a continual problem since I was still running on an old Windows XP box.

I also had a few more service running on the box, such as a Subsonic server for music streaming, a Ventrilo server for voice chat while playing games with friends,  an apache server to serve up my electronic parts database, a uTorrent client with a remote web interface.

Somewhere around this time I also invested in a Chromecast, and found I could use an app, Localcast, to stream media files to my TV.  This acts as a good backup to the Roku.

At this point I had a distributed video streaming network, with a central media server, and a remote web administration interface provided by NPVR.  This served me well for about 5 years.

Transition to Linux
About a year ago the coming demise of Windows XP and my growing fascination with Linux converged to make me take the plunge and re-implement my PVR on a Linux box.  I chose to go with Linux Mint 17 as my distro.

I had to port over all of the services that had been on my Windows box:
  • MyMedia server - cross-platform python script, so it just works
  • Subsonic - debian packages available
  • uTorrent - Switched to Deluge, since, at the time of this writing, the Linux version of uTorrent isn't robust
  • Ventrilo -  Linux versions available
  • transcoder script - python script, required a little bit of porting for paths and the like
  • Handbrake - needed by transcoder script, Linux versions available
  • smb file system support for streaming via LocalCast
  • various server software - apache, php, mysql, ssh, etc.
Most of those packages didn't have proper init scripts to make them run at system startup, so I wrote scripts for those that didn't have them.

My server is now much more stable and trouble-free, owing to the fact that Linux is better designed for running servers.  This also gave me a useful platform for software development, such as Node-Red,  and a private git repo for source code control.

Future Plans
Even though my current server box (can it even be called a PVR any more?), I still have some improvements I would like to make:
  1. Install mythtv so that I can record TV again.  You may have noticed that I didn't mention porting over to a replacement for NPVR.  Mythtv is that replacement, but I don't record that much TV anymore so I haven't yet bothered to take the time to set it up.
  2. Try out the Plex media server as a possible replacement to the MyMedia channel.  I've had multiple people recommend Plex to me for local media streaming and I'd like to give it a try and see if it's worth the fuss.