Software apps and online services
Hand tools and fabrication machines
This is a sweet little Hitachi I-89-311 portable television that I've converted into a retro wall-mounted information hub! It displays useful content in a series of full-screen Chrome tabs, and turning the tuning dial switches between the pages, just as you'd originally have changed TV channels. The volume button controls scrolling, the on-off button refreshes the page, and it has a PIR motion sensor so the screen turns off when you walk away.
It uses a Pimoroni 8" 4:3 screen and a Raspberry Pi 3 to display the content, and some custom-made switches allow all of the original TV controls to be used.
In case you can't see the embedded video it's at: https://youtu.be/aQ6a6QbbFlY
This TV cost me all of £5 at a sale during the summer, and I couldn't wait to get home and dismantle it. I had in mind to simply take it apart, chop it down, replace the screen with my old 10" tablet and hang it on the wall - a nice quick project! The teardown certainly went well, everything came apart very cleanly and thanks to a new magnetic parts tray I didn't lose any of the screws for once. Once I held the tablet up to the stripped down case however it was obvious it would never fit, the bezel around the screen was far too thick to fit in the case.
I had imagined just customising an Android home screen with widgets to show upcoming calendar appointments, weather, news and so on, but with that out of the window I turned to Raspberry Pi options. I started looking at software to display dashboards first, as this seemed to be roughly what I was after. I tried dashing.io after recommendations but found it a bit clunky to set up and configure. Many of the other options were more business-focussed so less likely to have features like displaying a live CCTV webcam feed. After a while I pretty much decided to build my own web page to display just the content I wanted - but then the idea struck, why not have multiple web pages and be able to scroll between them using the TV controls? This would mean fewer compromises around what would fit on the small screen, and would make it really easy to add or remove elements. After this "Eureka" moment all I had to do was make it happen - and it wan't too complicated.
For the web pages idea to work the first thing I needed to do was figure out how to open the Chromium browser full screen on boot, with multiple predefined tabs. Thanks to the flexibility of the Pi and Chromium this was actually quite easy to achieve, just a case of editing the autostart file:
sudo nano .config/lxsession/LXDE-pi/autostart
...and adding in
@chromium-browser --noerrdialogs --start-fullscreen http://url1 http://url2 http://url3
...to the end of the file, saving the changes.
Next I had to find a way to somehow use the TV's buttons to control the browser tabs. I planned to have a separate wireless keyboard & mouse combo nearby so didn't use Kiosk Mode and wasn't interested in mouse movements or clicking, but I did want to be able to do the basic "I'm off to work" info-grab just using the original TV controls. I knew that I'd likely be connecting the switches to the Pi's GPIO and controlling them in Python, so looked around for some code that would mimic keypresses, so that I could harness a script to send these via the input from a physical switch.
After some trawling I came across xdotool, which was perfect for the job, as it lets you simulate keystrokes using code that can be embedded easily into Python. First I installed it...
sudo apt-get install xdotool
...then using the terminal tinkered with a command to switch the tabs in Chrome, mimicking the CTRL-TAB keyboard shortcut:
xdotool search --onlyvisible --class "chromium" windowfocus && xdotool key ctrl+Tab
I then did the same thing to create a piece of code to perform the "Refresh" action, mimicking an F5 Keypress:
xdotool search --onlyvisible --class "chromium" windowfocus && xdotool key F5
Now that I had the basic bits of code working the next job was to sort out the physical buttons, wire them to the GPIO and create a Python script to make them control the browser.
The star of the show button-wise was the lovely big tuning dial, so I worked on that first. I needed the rotary action of the dial to translate into GPIO-fired keypresses to trigger the browser tab switch, so that turning it would change "channel". Conveniently I'd done something similar before, for my Neon Infinity Television project, so I decided to use the same method.
To start I took a 1 pole 12 way rotary switch and soldered alternate terminals to each other, so that 6 of them were connected to a single wire. The other wire was connected to the node of the switch, so that each rotary click would move it between an open and closed state. This meant that each channel change would take 2 "clicks", one to click the switch "closed" and one to open it again.
After testing it with a multimeter I moved on to the next button (On/Off) - I only wanted this to "refresh" the page so used a standard push-to-make switch.
WIth both of these finished I soldered them to a small bit of protoboard alongside a jumper header, so that the wiring would be easier. Next I connected them to the Pi (GPIO6, GPIO26 and 3v) and put together a Python script to translate their physical movements into keystrokes to control the browser window. The script I used is fairly simple and is available on GitHub. Once it was fully working I set it to autostart by adding in the line...
@sudo python /home/pi/tabswitch.py
...to the autostart file, just underneath where I'd added the @chromium-browser command earlier.
So that was two buttons down, one to go!
I really wanted the third button (Volume) to scroll the browser page up & down for scanning the headlines and weather outlook - that was a great concept but tricky to achieve! I explored different options but came back to one of my favourites - cheap USB mice. A trip to the car boot yielded four old squeakers in various states (around 50p each), and I hoped one of them would have a hackable circuit board that I could just drop into the case, connecting the scroll wheel to the volume knob and the USB cable to the Pi.
It wasn't quite that easy however, as all of the mice had their scroll wheel fixed at 90 degrees to the main circuit board, which makes perfect sense for a mouse but is no good for fitting in a tight TV case! To make things more flexible I snipped the rotary control off one mouse and wired it into the circuit board of a second, leaving cables in between so I could fix it at whatever angle I wanted. Even though the mice were from different makers this worked fine!
I knew the TV was going to be on the wall of the hallway, so I didn't want it to be switched on 24/7, but at the same time I wanted to be able to glance at it in passing and not have to push a button to turn the screen on. I decided to use a PIR sensor to detect nearby motion, so the screen would stay off (or at least on a blank screensaver) unless someone was in front of it.
I'd not used a PIR sensor with the Pi before, so followed along with the excellent Parent Detector tutorial and got the code I needed working pretty quickly, in the terminal at least.
The PIR sensor was straightforward to cable in to the Pi's GPIO (5v, GND and GPIO4) but took some experimenting with the fiddly "trimpots" to get the delay and sensitivity just right.
The next step was to make the screen come on when motion was detected. Again there are various options for this, but I decided to make it so that motion detected by the PIR sensor would just turn off the screensaver. I had assumed that I'd be able to use xdotool again to send any old keypress and that would wake the screen, but unfortunately that didn't work.
To give me more control over the screensaver type and options I installed xscreensaver:
sudo apt-get install xscreensaver
This was perfect, as I could now control fully the screensaver delay time via the Preferences menu - what was even more handy is that xscreensaver has many command-line options, meaning I could use the code...
...to wake up the screen. I added this command to the PIR script (also on GitHub) and once it was working added in...
@sudo python /home/pi/PIR.py
...to the autostart file, just below the earlier entries for the Chromium and tabswitch commands.
So now most of the Pi work was complete, and with PIR sensor, push-button, rotary switch and butchered USB mouse all connected I moved onto the tricky part - making it work with a small screen and fitting it all in the case.
Finding a suitable screen for this project was always going to be tricky, as the "hole" was both an awkward size at 9-10 inches and also in 4:3 format.
After a spell of fruitless bargain-hunting I decided to buy new - mainly for the reason that I wanted this to be a practical addition to my home, and so needed to have confidence in it being plugged in most of the time. I finally started searching for 800x600 and 1024x768 LCD panels, and turned up the Pimoroni 8" screen. This was the ideal option as I liked the retailer, the screen was well reviewed and the perfect shape - the only compromise was that it was slightly smaller than I'd have liked, but that didn't really affect the final build.
The screen kit came with its own driver board and menu buttons, and these were easily connected up for a bit of a test on the workbench. I'd read to my delight that the screen could be powered from the Pi itself, so powered it up and - nothing! I tried different USB ports for the power, then different HDMI cables but it just wouldn't come on. After much head-scratching I found the solution online - because it was being powered by the Pi's USB it wasn't showing as "Present" early enough in the boot process for the Pi to realise it was there. All I had to do was edit the file...
...and uncomment the option...
...and Hey Presto! It worked straightaway. It always amazes me how simple some solutions can be, I was convinced I'd fried the screen somehow but one tiny code tweak made all the difference. Now that the whole thing worked on the bench I just needed to fit it into the case and somehow keep it working.
Although it was the ideal size there were a couple of problems - the bezel of the LCD panel was shiny silver, and also there were gaps showing around the outside where the original TV tube had been curved. I first thought of spraypainting the bezel black, especially as it still had its screen protector in place, which would have been ideal masking. After some thought I managed to kill two birds with one stone, and added strips of thick black self-adhesive felt around the screen edges, which covered the silver strips and overlapped enough to fill up the gaps.
With the screen fixed in place the buttons, Pi and cables were next!
To secure the screen I'd cut out a section of translucent plastic from the lid of an old storage crate, using the original TV screws and screw-posts to fix it firmly in place, so decided to do the same thing to hold the buttons. The beauty of making brackets with this kind of plastic is that you can place it over the case and see through it to mark exactly where the screw-holes need to be!
I cut out a small section of plastic to hold the TV controls and first marked and drilled the holes to secure it to the TV's original fixings. Next with it screwed to the case I marked the centre of the button-holes from the outside to make sure they'd be aligned properly when poking through the case. This went pretty smoothly for the rotary and push switches, I just had to resort to the hot glue to set the "mouse wheel" in just the right place.
Next I built another "deck" to sit above the switches and hold the Raspberry Pi, using the same method as before and more of the original screw-posts. This worked well but unfortunately the back of the rotary switch stuck up too high, so I had to re-solder it after bending the terminals flat with its base. Lastly I lightly glued the PIR sensor in place behind a vent, still unsure if it would work without being fully exposed.
Now that all the parts were fixed in their "final" positions I had to add in the control knobs. The rotary switch was easy as they're a standard shape and it just needed a trim to fit the dial. For the on/off switch I used part of the original spindle from the TV and superglued it to the push switch. The mouse wheel was a bit trickier, again I used an original spindle from the TV, joined to the mouse wheel spindle with a plastic "cuff".
You'd think that would have been quite enough messing about with buttons, but there was more to come! The LCD screen had its own set of 5 microswitches on a board for controlling the brightness, colour etc so I wanted these to be accessible without having to take the TV off the wall.
With some light plastic-nibbling there was just enough space to fit the board to the edge of the "inner" case, all I had to do then was cut holes in the "outer" case to make the microswitches accessible. I also needed to find some kind of physical buttons to poke through the case and line up with the microswitches. In the past I've used silver "pen clickers" for this but had no luck finding cheap ones this time. In the end I snipped the legs off some old LEDs and fitted them into the holes I'd drilled in the case - these were perfect as the flared bases of the LEDs kept them from slipping out and they were just the right shape and size. With no more drilling I took a deep breath and moved on to the "big cut".
With all the boards, screen and switches installed I could now see exactly how deep the TV's outer case needed to be, or rather how thin I could make it. Leaving a couple of centimetres gap between the circuit boards and what would be the wall, I marked out the case and chopped it down using a rotary tool. This was by far the most nerve-wracking moment as it was very noisy and one slip could have ruined the case.
The final cut was pretty good though and just needed some sanding and trimming around the edges to finish it off before painting - the TV "back" was originally white but had yellowed over the years.
The next problem was how to hang the TV on the wall, making sure it was level and secure but at the same time easy to remove for maintenance. I'd read about using "French cleats" or "Z-brackets" for hanging large pictures before but had never tried them, so ordered some from Amazon - they turned out to be absolutely ideal! The packet even came with its own tiny spirit level.
Fixing the wall bracket was easy, I had it screwed to the workshop wall for testing within minutes, next I had to figure out how to fit its opposite number to the TV. The outer case would be screwed to the front part of the TV in four places so was pretty sturdy, I decided this would be the best place for the bracket. The difficulty was fixing the bracket in the right place, so that it wouldn't interfere with the boards or wires. I also didn't want to have bolts showing through the top of the case.
At some point my brain figured out that I could re-use the TV's original handle, make a feature of it and also use it to hold the bracket in just the right place. After carefully measuring I drilled new holes for the handle, then fitted it to the z-bracket using a couple of small right-angle brackets and an offcut of wooden flooring, all bolted firmly together.
For the final touches I sanded and spray-painted the outer case and handle, doing the latter in red for contrast and as a nod to the Raspberry inside. Once the paint had hardened all of the pieces assembled nicely, the knobs and "Solid State" labelled screen cover were last to be popped into place. The screen cover was slightly smoked but after a tweak of the brightness and contrast (glad I included those LCD buttons) the display was looking as bright as before.
Before long I moved the z-bracket from the workshop wall to its "final" home in the hallway and hung the TV, adding some thin plastic conduit to tidy up the Pi's power cable. Now that it was installed came the fun part - deciding which web pages to display!
While researching dashboard options I'd stumbled across Dakboard - a web-based dashboard that you can link to your online calendar to display appointments, a news feed and the weather. I discounted it as too simple at the time, but this was ideal for one of my pages. My favourite thing about it is being able to display my own Google photos album - especially as it happily displays animated GIFs.
The next couple of tab decisions were pretty predictable, BBC News and BBC Weather, both essential to check before leaving the house.
Next I added in a link to the live feed from one of my Pi Zero cameras - this has already proved useful in keeping a lookout for the postman or shopping deliveries.
Lastly I added in our Google Shopping List - we're quite in the habit of using the Google Pi Intercom to add items to the list so it's well worth a check before heading out.
I collated the URLs from the laptop into a notepad document and copied this to the Pi, then added them to the @Chromium line in the autostart file (see above).
I really enjoyed this build, making something I know I'll use daily really stops me from cutting corners - even if it does take much longer. My favourite thing is that big dial for changing channels, it's really satisfying to use the original mechanism.
The thing that went much better than expected was the PIR sensor, which I was convinced wouldn't work tucked inside a case vent - I didn't really want to expose the whole sensor so I'm really glad this worked out. It's pretty sensitive and we all enjoy trying to creep past it without the screen turning on. It did prove really challenging to photograph though, that smoked screen cover is so reflective!
I love the look of it in the hallway and it works just as I'd hoped - a few clicks back and forth and a bit of a scroll are usually enough to get me out of the door in the morning with all the information I need.