I was very excited to see Susan Kare borrow of of the mini Macs from a friend and give it a shout out on Twitter! These kind words from someone responsible for a lot of the original Macintosh design are quite humbling. 🙂
I was very excited to see Susan Kare borrow of of the mini Macs from a friend and give it a shout out on Twitter! These kind words from someone responsible for a lot of the original Macintosh design are quite humbling. 🙂
In building the project I wanted the computer to have the closest to the original feel as I could get. There were a few difficulties in the project, from the TFT screen, to the OS configuration. Yet in the end, I got a cute little replica running on top of a Raspberry Pi. I am not trying to break copyright, or profit from this. I simply do it as a fan of good hardware and past operating systems.
To start I want to mention that there are areas of this “guide” where I have been short, if you are unfamiliar with Linux, some of the parts in this config may give you problems. This project includes compiling code, adding scripts to boot, and configuring systems like VNC.
I loaded the standard Debian install onto a SD card to start (which at the time was Debian 6 or 7), then I started investigating the different original Motorola Mac emulators. The two main ones I found were Basilisk II and Mini vMac. Basilisk offers features such as Color, networking, and advanced features over Mini vMac. A very useful feature that Basilisk has is supporting a shared drive. You can tell the emulator that a folder on your Pi or any PC should show up as a hard drive in Mac OS 7. That way you can easily download games/software from archive.org or other locations, then load it onto the virtual system!
Mini vMac did offer greater compatibility for apps, while only being black and white, it seems to do a much deeper level of emulation; this makes it slower, but some apps that wont work on Basilisk will work on it. My solution in the end was to put both of the emulators on the box, pointing to the same virtual hard drive.
A script wraps the system, by default it auto boots into Basilisk, but if you “shutdown” the Mac in the emulator, you get a options screen that will allow you to switch modes the emulator is running in, the emulator itself, or some other settings. Some of the other settings including pairing Bluetooth, shutting down, or dropping to the console.
These files are available under https://github.com/daberkow/minimacparts. There is a SYSINIT script that starts the script, aka the wrapper, and gets the session started under the “pi” user, this goes in the /etc/init.d folder. Then there are folders for the different emulators in the /opt/mac folder.
Note: I used the current Raspberry Pi Debian build when I did this project, which at the time was using SYSINIT over the newer SystemD. If you want to use a newer build (which you probably should) you will have to translate my crummy SYSINIT script into a SystemD script. Feel free to pull request the repo! 🙂
One of the larger issues that had to be overcome was screen scaling. The screen I used is 480×320, but the original Macintosh resolution was 512 × 342. This had some of the emulators either cut off, or scrolling around the screen when the mouse got to a corner, which was not great. I could run the emulators at a smaller resolution, but some software was designed with that screen in mind and applications were cut off!
My solution was to use VNC, the system starts the emulator in a VNC session running at the native resolution, then the Pi screen connects to that session and enables scaling mode, shrinking it to the proper size. This way VNC worries about all the scaling, at a minor speed loss. I looked at different X configs to try to do the scaling that way, but the way this screen works, it gets upset and has problems very easily. The screen does not have a scaler of any sort, so you HAVE to send that resolution of 480×320 to it. The VNC solution works well. The different emulators have VNC config files that are copied to the running config right before its run depending on the emulators properties.
At this point we should discuss dependencies; TightVNC server was used for VNC. A quick minor note about VNC, you need to config the VNC users password, and then setup the script to auto-login with that password for the above script to work. Bluez Bluetooth stack and utils were used to be able so use Bluetooth peripherals. Basilisk and Mini vMac were compiled from source on the Pi 2 so that I could squeeze the most performance out of the little PC. Also its hard to find the latest versions ARM compiled online.
Basilisk has a good make file that you can use on the Pi as long as you have standard development environment setup, https://github.com/cebix/macemu/tree/master/BasiliskII.
The authors website offers a nice little service to have the website compile to code for you, or you can compile it yourself. Depending on your screen and how you want the app to start (a lot of those settings are hard coded in at compile time) http://www.gryphel.com/c/var/index.html.
I made one virtual hard drive, that both emulators used. Luckily they use a compatible hard drive image format. I set the first image up on my desktop just because it was easier. Then copied it over once I got the image in a good state. For years Apple gave out for free on their website Mac OS 7.5.3, then after a website update it seem to break a lot of the links. A few still worked but most over the years have stopped working. A lot of different sites have mirrors of those disks available though, if you search “System_7.5.3_01of19.smi.bin”, that should bring you to one of the mirrors. The one other thing you need is a ROM for a original Macintosh. I have some classic Macs at home, and you can dump the ROM from those. Or there are sites out there that have them hosted, I would guess that would not be to hard to find.
I put the virtual hard drive, and the ROM in a folder called “Shared” in the /opt/mac directory. You may have to tweak some of the configs/scripts to get everything working your way.
Once you get it working, there are a ton of games and pieces of software on archive.org for the old Macintosh, just make sure you get the 680*0 versions not the PowerPC versions. There are also a ton of abandonware sites, since half the companies that made this software are out of business, I doubt they will mind you taking a look, though legally its a grey area.
Those are the basics for how I got the system setup. One item that gave me a bunch of problems was the TFT screen. At the time you needed to load separate kernel modules and configure boot parameters for it. I think newer kernel images have added this, so that should be a simpler task for everyone.
The units themselves are laser cut acrylic. The front face that was put on the painted units was 3D printed. The designs for those pieces are on my GitHub page, https://github.com/daberkow/minimacparts . The original design was a tad bit smaller than the final unit. I ended up making it exactly about 1/3 scale, then realizing that there was not a screen on the market to do what I wanted to do. When I moved up to the 4″ screen, the resolution went up to a incredible 480×320. There were a bunch of issues around that resolution that I will get into in a later article.
For the Raspberry Pi I used a Raspberry Pi 2. The first version I made had a Pi 1 in it, and I ended up upgrading to the 2 just for the speed and added cores. With the system running a emulator, core 1 can get used up by that; having more available made sure things like SSH didnt lock up.
I designed two brackets, one set that holds the screen in place, and another that mounts the Pi to the inside of the case. The screen mounts are just two bars that are the exact with of the screen and help mount it inside, while leaving the port available for the IDE cable. The mount for the Raspberry Pi made it easier to take the Pi in and out of the case when building the unit. And a nice list so the Pi doesn’t get glued or screwed right into the side of the case.
For the front USB port, I got a USB 3.0, 6 inch cable. The most important part of this cable is finding one with a 90 turn at the end that does not stick out a lot. The Raspberry Pi is mounted in the end to the side wall of the case, and there is not much clearance. A USB cable that comes out from the top of the Pi is better as well. I ordered the wrong one for this last build, and then had to bend it a bit so it wouldn’t push against the side of the case.
A simple micro-usb extension cable was used for powering the Pi. The female jack goes to the back of the case, so that the unit can be powered. Again, the 90 degree male plug was important because that side sits right next to the screen. Audio was a random 90 degree 3.5mm extension cable off amazon. The first unit, the clear one, had a different make than ones i got later. Some of the later units had a splitter instead of a single extension. The original idea was to have a speaker inside for the start up sound. That quickly added to the complexity and was cut from the final project.
The networking port was important so that I could easily add new programs to it. The systems also had a tiny wifi receiver, but I figured hard wiring was also easy. That was a custom keystone jack to a RJ45 port.
I mentioned in Part 1 that the screen was connected to the Pi via a IDE extension cable. After looking around for other solutions that worked cleanly, this was the best one. The cable can handle the frequencies, and was easy to find. It also doesn’t do any flipping of pins or roll-over shenanigans.
To bring it all together, super glue was used, not the most glamorous, but strong and holds. I made a few little tools to help me try to put better right angles together when gluing the cases. Those didnt always work out great.
To wrap up, I will go over my build order, just in case anyone decides to try to make one of their own. I would first get the front piece, and glue that to the side walls. Let that dry for a few hours at least, superglue likes to dry fairly fast, but I wanted it to be solid through and through. Then I would add the bottom front panel area, and the sliver that goes between the front bottom, and that bottom panel. After I put the bottom of the unit on, I would stop working on the main body. Now its time to get the screen, with it powered on and working with the Pi, line it up to where it looks good in the cut out.
After I have found the spot the screen should go, put the brackets on it, and glue it into place. This has to be a little carefully done, any spare glue that drips into the screen can make it look bad. Once the screen has dried, getting the mounting arms for the Pi bracket, and gluing them in place was done. There is not a real science to where it went, I would put the whole Pi sled in, then see where it seemed to work well with all the cables attached. Then sharpie those spots and glue the arms down, watching them long enough to make sure they didnt fall over. Once that was done, and I felt good about where the Pi was, I would glue two tiny blocks I 3D printed to hold the Pi sled in place.
Gluing the front USB isnt too bad, its putting it in position then gluing the edge of the extender into the place it should sit. The hardest part is not getting glue in the connector, and doing multiple layers so that it doesnt move with normal user use.
Getting the back to stay in place was my least favorite part. There are little L brackets I 3D printed that the back could screw into. They work well but lining them up and gluing them into place, and not the back itself was tiring. I would tighten the brackets a fair amount to the back plate, then get the plate into position and glue the bottom two brackets into place. Then I would do the top two. At this point gluing the different connectors into the back ports isn’t too bad. I also made brackets for them, the brackets are bigger than the whole so that it covers the whole port when the piece is in it. These brackets weren’t held with little arms like the Pi, just glued into place.
Finally the top was glued in, and then the last little top slant area. The screen I mentioned getting before may not be available from Amazon, but there are a ton of others that are all seem to be made by the same place, then had another brand stamped on them. For the last build I did, I grabbed another brand (link) and it worked with the same drivers out of the box.
I saw online someone who made a tiny Mac (The Verge) and thought it looked like a neat project to attempt. I started by selecting the original Macintosh as the template I wanted to emulate. Several people had made 3D models of the original Macintosh over on thingiverse.com, I used a combination of those and other sources online including photos to make a cleaned up model for myself in Sketchup. After having that model I went about breaking down how I would make it.
I recently have been using laser cutters for fun at TechShop, so I made the body of the machine out of clear acrylic. Then 3D printed a face plate that was glued onto the acrylic case. After that, it was painted with several coats of spray paint. I left the back door off so that I could work on installing the electronics, and setting up the software. That will be another article later.
The first unit I made was for myself, then two more for friends; the original one never got painted, I thought the clear body was neat and showed off the internals. It also gave me a good model to hold when working with the opaque other units.
Each unit had a little screen that connected to a Raspberry Pi via a ribbon cable. Then a USB port in the front where the old unit had a keyboard port. The back had a ethernet port for updating the system itself, audio out, and micro-USB port for power. One of the hardest parts of the project was finding a ribbon cable that could handle the frequencies and work between the screen and the Raspberry Pi. A lot of the GPIO ribbon cables online actually flip what wire is in the 1 position with its neighbor; my solution was a 6 inch IDE extension cable. The cable can handle high frequencies, as well as fit the pin out perfectly.
After testing several different color paints, I ended up using Rost-Oleum Ivory Bisque semi-gloss as the beige shade. All the sides were glued together except the back, The back was held on by tiny brackets that were 3D printed and then screwed into. This allows access to the inside without breaking glue somewhere. Originally I was going to attempt to put a little handle on it, but that increased the complexity; in the end the top is flat.
All the laser cutting and 3D files I used I tracked with Git over at https://github.com/daberkow/minimacparts . I will put a few photos of the clear unit below, and of the final unit. Then later post another article about the electronics, and software to run it. There are also photos of the many many attempts at different sized bodies and painting side panels. My original model was almost exactly 1/3rd scale. Then I had to make it a tiny bit bigger because of the screen I used.
Standard disclaimer that I do not own or hold any rights for the Macintosh name, or Apple logo. I do this as a fan for fun.
For years I used a Windows Server 2008 for my home files, having TechNet I used Windows Server 2008 and then later 2008 R2. While this was nice, it was using software RAID and a random assortment of drives that were cloning (RAID 1 style) between themselves. I originally went with this for the ease that Windows brings to things, but in the end with it mainly being a file server it just sat there initialized.
Fast-forward to this November, with space running out, I decided it was time to get a new system and replace the aging AMD Windows Server.
I wanted a RAID 5 or 6, so that I was not losing as much space as the RAID 10s that I had been using. I also wanted the system to be less maintenance than a Windows Server that needs patched every month. Recently I had heard good things about FreeNAS (freenas.org), from reddit.com/r/homelab; after seeing all the features of ZFS, I decide on a RAID 6, with ZFS. This is also known as a RAIDZ-2.
At first I looked at HP Microservers, http://www8.hp.com/us/en/products/proliant-servers/product-detail.html?oid=5379860 – !tab=features, yet after looking at what you got for the price, decided I wanted to build the new system myself.
The first challenge was finding a small case, that could hold the amount of hard drives I wanted, at least 5, without having a large footprint. After some searching I came across the LIAN LI PCQ25B, http://www.newegg.com/Product/Product.aspx?Item=N82E16811112339, while not a cheap case, it offered a 5 hard drive tray and at the same time was not that large. This suited my purposes nicely.
Next I had to find which CPU I wanted; since I was hoping to keep the cost of the system down I looked at the AMD processors available. I was disappointed to see how cheap Intel processors were beating or matching far more expensive AMD chips. AMD would throw items in to sweeten the deal such as a decent GPU on the chip. However this was a NAS, I did not need all that extra stuff that would just sit there using power.
My final selection was an Intel Pentium G3220, http://www.newegg.com/Product/Product.aspx?Item=N82E16819116950; this part offers decent performance, and is the latest Haswell chip. This would allow me to upgrade the system down the road if need be. The part is also the latest socket, meaning that it could handle the larger memory sizes available, while I could use the MicroATX board the case required.
I threw in 16GB of ram (if you haven’t looked ZFS eats memory, you need about 1GB of memory per TB just to idle), and 5 – 3TB hard drives. I got the hard drives from different batches, so if something similar to Seagate’s 7200.11 drive failure happened again (http://www.theinquirer.net/inquirer/news/1050374/seagate-barracuda-7200-drives-failing) I would be protected.
Now that you know the hardware I will talk a little about the experience I have had with FreeNAS. The system is easy to install and has a nice interface. Using ZFS and the terminology they use takes a little getting used to, but the wiki can clear up a lot about what the different options do. I started the box on 9.1.0 and have updated to the latest 9.2.1; you can do updates through the web interface, and in the short time they have fixed a lot of little bugs, cleaned up the interface, as well as added new features. A nice new feature is the ability to make “Jails” of any Linux variety. These are hypervisor level VMS that can run on the system at little cost. I tend not to use them because when I use a VM to develop I tend to need a decent amount of memory, and my FreeNAS with ZFS uses 12GB of the 16GB doing nothing. But a nice feature non-the-less. FreeNAS also has some plugins that are a few clicks away; I installed Plex so I could stream media easily over the home network. FreeNAS uses Jails to run its plugins, creating a separate VM for each, this allows for security between your hosts data, and your plugins.
In the end, I am very happy with the box and its performance; my roommate and myself have been able to sustain 100MB/s writes to the box.
A quick side note, Plex is also a fantastic piece of software. You load it on a PC or NAS, point it at your media and sit back. It scans through all your media and gets all the metadata automatically. Then you can stream with the web interface, or through a DLNA device in your network. There are also iPhone and Android apps that let you stream without setting up weird port forwarding: just a very slick and well working product.
NOTE: This is for Dell OEM systems only, run at your own risk.
Recently I have RMAed motherboards for non-branded Dell servers. The problem I ran into is I was getting branded system boards back when I had originally had non-branded. The non-branded BIOSes would just be blank with a progress bar instead of having the Dell logo. I ended up spending more time and energy talking to Dell again trying to get boards to my specifications. I was told by several Dell engineers that unfortunately there was no way to fix this other than the factory setting the board up.
Well they were wrong, and because I didn’t find this anywhere online I am going to detail the instructions. Note: this is ONLY for people who need to un-brand systems from Dell, I have done this with 12th Generation servers and nothing else.
Now your OEM box that was impossible to unbrand has been unbranded.
This is article 3 of the Building a Radio Series, before we looked at the general project overview, along with how the Arduino was hooked up. Now we will be looking at the PC hardware along with the code being used to do all the music.
I was afraid that this project world have one critical weakness, that the pc running the show would end up taking a while to start up; making the whole thing slow and by the time it came up you didn’t want to use it. I ended up getting Intel D510MO, but any computer that runs Windows would do. To save myself from having to write my own music player/interface over a music player this project relied on Windows Media Player using C#. This made it really quick and easy to build the DJ software. Mine had 1GB of ram, and an 8GB Kingston SSD (model S100S2/8G), and a Kingston 19-in-1 media card reader. There was a USB hub in there so it could be just 1 USB cable instead of 2.
I have a MSDN account so I was able to get Windows XP really easily, it theoretically could have been Windows 2000 or newer, but I was worried about drivers for Windows 2000, so I went with the next lightest OS. I went through and cleaned it out a lot, disabling parts of Windows I didn’t need; there are a lot of guides online to speed up Windows XP. Just make sure Windows Media Player is on whatever OS you use, I was developing on Windows 7 Enterprise and it didn’t have it. I freaked out will I realized I just had to go to Add/Remove Programs -> Windows Components and add it. As mentioned in the earlier article, the speaker in the unit went to a USB sound card. The USB sound card ended up being a good amount louder than the built-in sound card. The code adjusts the Media Player sound volume, not Windows volume.
The software is commented, so if you are interested in depth, you may want to scroll down and download that. But a quick overview, the program scans for removable cards, and then it scans them for the folder structure it uses. Then if there is only one card that meets these criteria mounts it as its source. Then it goes to the com port that is saved in a settings file in the same location of the program. If the interface is used to change the interface it should change it in the settings file. One problem is I was under the clock in this project, thus my usual extensive testing wasn’t done; it is possible bugs exist, but I think I found all the big ones.
A thread is spawned off to get input from the knobs, this is a separate thread so it can change settings while other things are going on. It reads the input from the Arduino, and makes adjustments when needed. In the boot process it gets the channel number so that the radio knows where to build a playlist out of. It gets the songs, mixes them up then adds them to a list, it then grabs all the “spots” mixes them up and puts one in every 4 songs. After all this 30 minutes of static is put in; in theory once that starts there is a 30 minute timer to shutdown.
That is the basic view of the software; the code is available below, with comment that anyone can have fun with. Any questions can be emailed and/or posted on the blog. This wraps up the Building a Radio series, unless I think of anything else to put up about it. If anyone has a idea of another project shoot me a email.
The project I have been working on for the last two months was a radio for my parents anniversary; but not a normal radio, I got a replica of a 1934 Thomas Radio (Collector’s Edition), gutted it, then built my own system to put music on. I figured for fun I will write a few posts about it, and anyone who wanted to try to reproduce it again would have ample data.
To start let us look at the model radio I started with, most will work, just with varying degrees of work put into them. The closet website I can find to the version I have is here, http://tweakeddesigns.blogspot.com/2011/07/reproduction-of-1934-thomas-radio.html. I think this is the exact radio, but with a slightly different wood stain on it. First I got that radio, then ripped all the parts out of it, except for the two outer front knobs (potentiometers). It turned out that the middle knob was just a stick with a string around it that went to a sensor and the channel dial. So the whole dial moved then this string was twisted, but that was only held up by the old internal electronics. Since that was a very… janky, I removed that, and replaced it with a separate potentiometer and a servo to change the dial hands. I made a awesomely horrible 3D render of how this looked, with all the original parts removed, and a servo added. I will do another post all about the Arduino and how that was hooked up.
Now for the best of prototyping, I used cardboard to support all this, cardboard is your friend for prototyping, except when it catches on fire, then it’s bad. Afterwards, I got these wooden splints from Home Depot, and put them in to reinforce everything, they came in about 14 inches long by 1.5 inches wide by 1/8 inch thick. I secured them with super glue, then screwed the Arduino microcontroller into these supports. Of course with plenty of electrical tape over the wood to shield it all.
One key part of the system is how the music is played. The music is played through a Mini-ITX board that is attached on the back. I needed a power supply for this, so I got a Mini-ITX case(Antec Mini-ITX Case ISK100) and just removed the power parts. The original plan was to put the pc outside this device, in a normal pc case, but I figured I’d just go for this design. Then I drilled a hole in the side so that I could use the Antec cases external power brick, and just plug it in the side. That had plenty of electrical tape on its supporting splint, along with a plastic shield that the power supply part had under it in the Antec case. I don’t like fire, so I was sure to be careful when handling these power systems; also, this was the only splint that was secured with screws and super glue, I dont want a charged power supply falling. The picture below shows this.
In a simple wiring diagram, we have the Arduino all wired up, post to follow, that goes into the mini-itx board through a USB hub. The USB hub also has a SD card reader, the software and Ardunio goes into the USB hub to make everything easier. The SD card reader is aligned to the side port, where the tape drive used to be, then songs can be updated by taking SD card out and updating the files. Then we have the original speaker in the radio wired into a 3.5mm headphone jack, available at Radio Shack, I’m sorry THE SHACK, and that goes into the audio on jack of the mini-itx board. The power supply cable goes into the Mini-ITX board, along with the SATA SSD. I know that doesn’t explain it well, but I will be writing more articles, one about the wiring and the Arduino wiring; then another about the software running the Ardunio and on the Mini-ITX board.
I’m not great with technical documents, if anyone has any questions feel free to email or even better post a comment.