My Virtual CD Changer Project

The is a computer-based music player for my car. I started this project, back in 2001, for three reasons:

Instead of using a stand-alone MP3 player, I decided to put a full-blown computerized setup in the car. This allowed me to get around the storage limitations of stand-alone music players and gave me the ability to pick the features I wanted.

When I started the project, I was driving a 1976 Buick Century. That car is gone now, but the lessons learned remain. Rather than start a new project for the 1997 Pontiac Bonneville, I kept the same computer and continued to make various improvements to the old setup over time.



Table of Contents

Project Requirements

I started with a basic set of goals:

  1. It must be reliable. My old CD changer never crashed on me. If the player doesn't work reliably, there's no point in having it.

  2. It must boot in a reasonable amount of time. My CD changer didn't take all day, this thing shouldn't either.

  3. It must be able provide CD quality sound.

  4. There must be a simple way to control it. I could operate my CD changer without too much trouble. This setup should also be easy to use.

  5. It must be able to hold my entire CD collection. In addition it must also have enough storage capacity to store all of my out-of-print and hard to find CDs in a lossless (or uncompressed) format. That way if one of these CDs gets lost, scratched or stolen, it can be brought back without generation loss.

  6. There must be a straight-forward way to add new tracks/CDs.

  7. It must have Disc/Title/Track naming capabilities.

  8. It must be able to play any MP3's that I choose to download.


Planning

Choosing an Operating System:

The most common options are Windows, Linux, and DOS. As mentioned before, time to boot, and stability are extremely important issues when trying to meet my requirements. For me, DOS was the obvious choice, provided that I could find some software that I was happy with. DOS is fast and simple, keeping the hardware requirements low. It's solid as a rock, and boots quickly. It's not for everyone, though. If I wanted/needed my computer to do a number of things simultaneously, play DVDs, GPS, etc, I would have picked something else.

Software:

Back in 2001, MPXPlay and Damp were among the most commonly used DOS-based music players. Both support disc/title/track naming. Both are capable of playing MP3 files. I ended up choosing MPXPlay because it can also play sound files in other formats (WAV, etc), and because its song list handling was more flexible. MPXPlay can load its list of songs from a playlist, or it can be pointed to a particular directory. I chose to do the latter, and write front-end software to handle the directory navigation.

Edit: As of November 2006, MPXPlay is still alive and well. Over the years, support for a number of audio compression formats has been added. This includes FLAC, APE, OGG, AC3, AAC, WMA and more. Hardware support has been expanded a great deal, as well, including support for a few PCI sound cards.


Controller/Display:

A full-sized keyboard would be impractical for obvious reasons. Other options include keypads, infrared remotes, and joysticks. Any of these will work.

A keypad seemed a bit cumbersome, though. If I used a remote I'd probably end up losing the thing. In the end I decided to use a joystick. Out of the many joysticks available, I chose the Gravis Gamepad Pro. Three reasons: First, it has an adequate number of buttons. Second, is has a layout that I'm happy with. Third, there is DOS-based keystroke emulation software available. This is important, because the Gamepad Pro uses the PC Gameport in a non-standard way.

Likewise, a computer monitor would not be a practical option. Two alternatives are TFT full-screen graphical LCD's, and LCD character displays. Due to cost and space requirements, I chose to go with a character display. There are two types of character displays: parallel and serial. Parallel LCDs are less expensive and have better software support, but require soldering and use thicker more expensive cabling. While serial LCDs are more expensive and have less software that supports them, they come pre-assembled, require less conductors in their cabling, and work better over longer distances.

In the end, I chose the Matrix Orbital 2041 serial character display. It's a 20X4 serial LCD which comes pre-assembled and is supported by a couple of front-end TSRs that were written specifically for MPXPlay.

The computer:

So far I haven't mentioned anything about the computer, itself. This was done for a reason. Issues like processor speed, memory requirements, and hardware compatibility are heavily dependent on the operating system and the software being used. There's no point in shelling out the money for a computer until one is sure that the operating system, software, display, and controller work together. In the meanwhile a person's home computer will usually be more than adequate, especially when using a boot manager.



Getting Started

To put the ideas into practice, I started by purchasing the LCD and joystick. These two items, in addition to my main computer were sufficient to start testing the software. I fed MPXPlay a few sound files. It worked as it should. The joystick came with drivers for Windows but nothing for DOS. After rummaging around Gravis's website, I found some older software that supported DOS. For the Matrix Orbital LCD, I found two add-on software packages that feed info from MPXPlay to the LCD: MPXFE, and MPXF.

Reality:

Unfortunately, I was disappointed with both. MPXFE had problems (may be fixed by now) passing command line parameters to MPXPlay. MPXF worked, but I had problems getting the layout that I wanted. Since this part of the project was going nowhere fast, I decided to put it on hold and began writing my own front end software to handle the directory navigation. After a while I finally got an early prototype hammered out.

At this point I got tired of tieing up my main computer for this project and proceeded to move the project development to my "basement computer" (an old Pentium 133). I added the joystick keystroke-emulation TSR to the machine's autoexec.bat file, and proceeded to do some testing with the joystick. The software did properly "fake the keystrokes", thus providing MPXPlay and my software with the necessary input (just as if it had been typed on the keyboard).

Trouble in Paradise:

It didn't take long before I experienced an annoying issue with the keystroke emulation software. It would cause the machine to lock up on startup about 1 in every 10 times the computer was booted. First I thought the old computer might be a little flaky. After further investigation, testing it on my main machine, I was able to reproduce the problem on a number of occasions. Well, my cd changer in my car starts up properly 10 out of every 10 times I turn it on. 9 out of 10 is something that I consider unacceptable.

I began searching for an alternative. In the end I found SNESkey. It's a generic keystroke-emulation tsr that works with a number of oddball joysticks. Initially I had some success, but I found that it locked up my machine if I held down any particular button for too long (buffer overflow??).

I was counting on the LCD add-on software, and the keystroke emulation software. Now I could count on neither. This left me with three options:

  1. Abandon DOS
  2. Abandon the LCD and joystick
  3. Write my own TSR


Problem Solving

I immediately dismissed option 1. I like DOS's speed, stability, light hardware requirements, and the fact that it doesn't care whether it's shut down properly.

Option 2 wasn't all that great, either. I was in no mood to abandon the hardware, that I spent my hard earned money on, without a fight. Time to investigate option 3.

First things first, I needed a way to get the joystick working. To accomplish this I needed to do the following:

  1. Figure out how to add keystrokes to the keystroke buffer
  2. Find out how the Gamepad Pro uses the joystick port
  3. Try to find a way to put this in a TSR.


Faking Keystrokes:

I found a possible solution to #1 in SWAG, the sourceware archive group. In addition they also have examples on how to read the joystick port. Their source code is written in Turbo Pascal...not a problem since I'm familiar with the language and enjoy using it.

Reading the Joystick:

#2 was a big problem. I wrote a simple program to echo data from the joystick port to the screen. The output looked like a bunch of gibberish. After a couple weeks of frustration, and while on the verge of ordering a different joystick, I found a description on a Linux joystick driver development page. Here is a direct link to the description. Although I wasn't able to make much sense out of their source code, the information was sufficient for me to write my own code.

Writing My First TSR:

I found a nice "tsr clock" example in SWAG. Once I figured out what made it tick, I removed their clock-related code and replaced it with my own. After a while I was faking keystrokes with my GamePad pro. It worked at the DOS prompt. It worked in Microsoft Edit. No go for MPXPlay. For some reason their method of reading the keyboard was different. I tried several different SWAG examples, but had no success with MPXPlay. In the end I found a solution that works, at Günther Klaming's low level hardware programming page.

Fortunately, displaying data on the LCD is much more straight-forward. The commands are documented, and example source code is available here. The one remaining issue involves grabbing data, displayed by MPXPlay, from screen memory. An example of this was available on SWAG.

With these issues resolved I had all of the tools necessary to write my own joystick/LCD tsr. Over time I developed working prototypes of the tsr and the front-end directory navigation software.



Construction

Custom Case:

The computer, an IBM Personal Computer 330, originally came with a plain looking IBM desktop case. The original case would adequate for a no-frills desktop system, but I had something else in mind.

[Circular Saw Case] Since I'm not very good at metalworking, I started looking for something that's pre-made. I searched various stores for a metal toolbox that had the proper dimensions. They were either too narrow, or too big. Finally I stumbled upon a "circular saw case". Although it's not the smallest thing in the world, it fits nicely in my trunk, the top flips right open, and it has a nifty little carrying handle.

[Motherboard Tray] With that part out of the way, next came the task of mounting the motherboard. The motherboard and original IBM case have a proprietary form factor. Since I had no stand-offs, and was kind of worried about getting the openings cut out properly I decided to cut away part of the original case and use it as a motherboard tray. Next, holes were drilled in the motherboard tray, so it could be temporarily mounted in the case. Then the tray was used as a guide to cut out the necessary openings.

Tip: A dremel and a cutting disc work fairly well for this. It helps to cut the holes slightly under-sized. Then use a file, or sanding drum to finish it off.

[Power Supply cut-out] Likewise, a hole was cut out for the power supply. This was a bit more difficult, since there was no easy pattern to follow. I started by cutting a small hole, then working my way out. Then holes were drilled for mounting the power supply. It helps to make a template out of paper or cardboard. That way it's easier to get the hole spacing right.

[Case Fan cut-out] With most of the hard work out of the way, it was time to cut out the hole for the case fan. A holesaw makes quick work out of it. It's definitely worth the $10-$15 price tag. I also drilled holes to mount the floppy drive. Since I only plan on using it in an emergency, I chose to mount the floppy drive inside the case.

[Riser Card Bracket] The next issue to tackle was the riser card bracket. On the original case, it was bolted to the front. This was not an option, because it would block the place where the hard drives were to be. I used a threaded rod to support the riser card. That way the front part of the riser card bracket (right portion of the picture) could be cut away to free up space for the hard drive plate. The threaded rod was attached to the bottom of the case using a female stand-off. Then a nut was attached just below the riser card bracket, and adjusted for height. Then another nut was put on top of the threaded rod.


Drive Mounting:

First, I made the drive plate out of a rectangular sheet of metal. To accommodate for future expansion I made the plate large enough to hold two drives. Holes were drilled in each corner of the plate, and in the bottom of the case.

Then using a spare hard drive as a pattern, I marked where to drill each hole in the plate. Three sets of holes were drilled: one set in the middle for the current drive, and two other pairs of holes on either side. That way I'd have the holes already drilled, when it comes time to add a second hard drive in the future.

The drive was side-mounted to the plate. Then the plate was attached to the bottom of the case using Sorbothane isolation mounts. The mounts have a bolt on one side, and a threaded hole on the other. I put the "hole side" down and attached screws from the bottom side of the case. The nuts were used to fasten the plate to the isolation mounts.

[Isolation Mounts Attached] [Drive Mounted in Case]

For further shock absorption I purchased three 4" X 4" squares of Sorbothane. I cut two of them diagonally and stuck them to the bottom corners of the case. Then I stuck the remaining square to the bottom center.


LCD Enclosure:

The LCD display also needed its own case. To keep things simple, I bought a 3" X 6" project case from Radio Shack. Although it's not the ideal case, it was adequate for my purposes.

Matrix Orbital does make a mounting kit. It's a bit overpriced, but I was going to order it anyway. But when they wanted to charge some outrageous amount to ship the thing, I said no thanks.

To keep thing properly centered and aligned I made my own template.

Note: The template isn't perfect. It's only intended to be used as a guide.

Then I ordered the following parts:
4-40 3/8" female standoffs (4)
4-40 1/8" machine screws (4)

[LCD Template] Using the template as a pattern I marked the rectangular window and the 4 mounting holes. Then the holes were drilled. I had to make a couple of the holes bigger to get the stand-offs correctly aligned with the LCD.

Next I cut the rectangular "window", but left some room around the edges. Then I used a file to get the "window" to match the LCD. The LCD uses four 4-40 screws to hold the display together. The nuts were removed from the back side of the display, and stand-offs were attached to the LCD case. Then the screws were threaded into the stand-offs to mount the LCD in place.

[LCD attached to stand-offs] [LCD mounted in case]

[Adding connectors] Finally, connectors were mounted on the back of the case. These can be whatever you want, as long as the LCD gets power, and data. To keep things standard, I used a 9-pin D-Subminiature connector for the data. Then, for the power, I used a 5.5mm O.D X 2.1mm I.D coaxial power jack. This will make things easier when it comes time to bring the LCD display inside to test my software. In addition I also mounted a 5.5mm O.D. by 2.5 mm jack for the LCD's general purpose output, just in case I need to use it in the future.


[Completed LCD case, in operation]
A quick test to verify that the display works properly.

Note: The polarity, and voltage applied to LCD must match the manufacturers specifications. There is no "second chance". Getting it wrong can cause permanent damage to the LCD display.



Cabling

Computer Power Wire:

To power the computer, I ran 10 gauge wire direct to the battery. To prevent fires and other mishaps an inline fuse holder was added, near the battery. A relay was used to switch the computer on and off with the vehicle's ignition. Below is a basic wiring diagram, which assumes that one power supply is being used.

[Wiring Diagram - Power]
Since I'm using two power supplies the wiring was a bit more complex. Additional relays were used to switch between the two power supplies.

Turn-on wire:

This wire was hooked to "accessory" in the car's fusebox. The wire doesn't need to be as heavy as the main power wire, because it's only used to trip the relay coil. This coil consumes a small amount of current. I used 18 gauge wire for this.

[Wiring Diagram - Serial] LCD Serial Cable:

A standard cable serial cable would work, but to save money I chose to build my own instead. The Matrix Orbital display only requires three conductors: 2 data lines, and a ground.

LCD Power Cable:

I used the computer's power supply to provide a clean source of 5 volts to the LCD. A pair of 18 gauge wires were used for this: one for +5, the other for the ground. Don't ground the LCD to the vehicle, or you'll risk frying the LCD display.

[Wiring Diagram - Joystick] Joystick Extension Cable:

The following extension cable will work for the Gravis Gamepad Pro if you're using a single controller in GrIP mode. Pin 1 supplies +5V. Pin 4 is a ground. Pins 2 and 7 are for 'button 1' and 'button 2'.

Note: When in GrIP mode the Gamepad Pro does not use the X&Y axis on the gameport.


Audio Cable:

For the audio connection to the front of the car, a pre-made RCA patchcable was used. Don't fall for the "$50 cable hype." As long as it has good shielding and is of sufficient length, it'll work fine.



Computer

CPU, Motherboard

I used an old IBM Personal Computer 360 - Pentium 75 that I got from a friend. Although the motherboard can handle faster processors I see left it as-is, for quite a while. The performance of DOS + MPXPlay + My frontend software was more than adequate, at the time. No reason to upgrade to a faster CPU that draws more power and creates more heat, when there's no compelling reason to do so. The motherboard has a proprietary form factor and uses a riser card. The card has 2 shared PCI/ISA slots + 1 ISA-only slot. The motherboard has on-board video (S3). Nothing fancy, but it's more than adequate for troubleshooting/debugging purposes.


Memory

The machine came with 32 megs of memory, which was way more than was needed. I downgraded it to 16 megs. Out of the 16 megs of remaining memory, the software doesn't even use half of that. I chose to keep the 16 megs, and devote half of it to a disk cache.


Sound

For sound, I planned on using a Sound Blaster 16 sound card. The card worked ok, but the sound quality was a bit disappointing. I replaced it with a cheap Pine Technologies ISA sound card, which is based on the CS4235 sound chip. It was a pain to set up. The card did come with DOS drivers, but the installer only would run from windows. (see the download page if you need them) Then the default settings didn't work too well. In the end I did manage to get it to work with MPXPlay in WSS mode. I used the following settings:

File: Cwdaudio.wcm
------------------
[PNP]
WssIO=534
WssInt=5
WssDmaPlay=1
WssDmaCapture=0
SbIO=Disabled
OplIO=Disabled
OplInt=Disabled
4232IO=Disabled
4232Int=Disabled
GameIO=200
MPU401IO=Disabled
MPU401Int=Disabled
CDIO=Disabled
CDInt=Disabled
CDDma=Disabled
Device4IO2=Disabled
Device5IO=Disabled
Device5Int=Disabled

File: autoexec.bat
------------------
c:\crystal\cwdinit.exe /o /c c:\crystal\cwdaudio.wcm
SET ULTRA16=530,1,5,0,0
--------------------


Networking

I started out using a 3Com 3C509 Etherlink III 10 megabit card. It worked flawlessly, but was a bit slow.


Feeding Sound to the Car

Rather than lose sound quality, using a cassette adapter or FM modulator, I wired it direct into my car stereo's passive equalizer. Since I didn't have a switchbox, I was stuck swapping cables whenever I wanted to switch between the radio, CD changer, and the computer.



I/O

Display

I'm using a Matrix Orbit 20X4 LCD character display. This LCD uses a RS232 serial interface. These units come pre-assembled, complete with a 9 pin DIN connector. This keeps the cabling simple and straight-forward. In addition, the display is backlit, so a person can see it at night.


Input

Out of the many options available, I chose the Gravis Gamepad Pro joystick. It's less cumbersome than a keypad, still has an adequate number of buttons, and unlike a wireless remote, I don't have to worry about losing it.



Power

DC/DC Power Supply

I made the decision use a DC/DC power supply, instead of an inverter, fairly late in the project. I chose the DC/DC power supply for two reasons:

A number of the people, who visit the MP3Car.com forums, recommended the Arise ACE 865-V. Another site recommended shelling out the extra money for the ACE 890-V, if the system is a pre-MMX Pentium. Evidently the pre-MMX Pentiums draw more power off of the 5V line.

With "Murphy's Law" in the back of my mind, I decided to do some testing. I purchased an AT power supply extension cable, and an extension cable for the hard drive's power connector. That way I could cut the wires on the extension cables, instead of cutting up the power supply's wiring.

I tested the +5V lines that run to the motherboard, the motherboard's +12V line, and the hard drive's +12V line. The motherboard draws a steady 3 amps on the +5V line once the machine is booted; 3.5 amps during the power-on-self-test. The motherboard draws less than .5 amp on the 12V line. I found that hard drive draws close to 2 amps while spinning up, but only .5 amps the rest of the time.

In the end I chose the ACE-890V but for a different reason than I thought I would. It turns out that both the 865 and 890 are adequate for the processor/motherboard combination that I'm using, but the 865 only provides 2.5 amps on the +12V line. This would limit me to only 1 hard drive. The 890, on the other hand, can supply up to 4 amps on the +12V line. The specifications of both models of Arise power supplies can be found here

The Arise ACE 890-V doesn't provide a +3V or a -5V output. The proprietary IBM power supply does. However, after doing some testing with both the +3 and -5V lines disconnected, the system still worked normally.

While ordering the power supply the sales representative asked which power cable I wanted. I chose the P8/P9 cable. This cable will work with most machines that use AT power supplies.

I wanted to be able to power the computer from the car, but also wanted to be able to power it from the AC house current. A simple way of achieving this would involve using the AC/DC power supply's 12V output to power the DC/DC power supply. Then a simple relay could be used to switch the DC/DC's input between 12V output of the AC/DC power supply, and the power connector used in the car.

Sounds great in theory, but the AC/DC power supply that I'm using doesn't supply enough current on the 12V line. Since the holes have already been cut for the propriatary AC/DC power supply I was pretty much stuck with it.

I ended up getting a DPDT relay and another 4PDT relay to switch between the outputs on the two power supplies. An AT power supply extension cable was cut in two. Wires were run to the relay (1/2 of the extension cable to one set of inputs on the relays, the other half to the outputs). Then another set of wires were ran between the DC/DC power supply and the relay. Finally the grounds were wired together.

This method worked, but involved a lot of wiring, soldering, and hours of work. I'd strongly recommend not using this method of wiring unless there is no other choice.



Parts


Computer

Maxtor 80 gig hard drive (bought in January 2001) Compucheap $290
Promise Ultra 66 HD Controller Card TechStore $23
Linksys LNE100-TX 10/100 Ethernet Card Worst Buy $25
Soundblaster Vibra 16 Sound Card Already Had It $0
Circular Saw Case Fleet Farm $30
Arise ACE-890V DC/DC Power Supply Arise Computer $98


I/O:

Matrix Orbital 2041 20X4 LCD Display Jameco $90
Gravis Gamepad Pro On Cue $20


Misc Parts:

Sorbothane Cylindrical
Mount 8-32 M/F Thread
McMaster-Carr 20125K24 4 ea.
Sorbothane 4" X 4" 1/2" thick 40 Durometer McMaster-Carr 8514K115 $6.40 ea.
10 Gauge Red Power Wire Parts Express 100-160 $.38 / ft
10 Gauge Black Power Wire Parts Express 100-162 $.38 / ft
Scosche Inline Fuse Holder Parts Express 263-327 $4.50
Phoenix Gold ARx.360 20ft RCA Patch Cable Parts Express 263-408 $9.90
12VDC Automotive Relay SPDT 30amp Parts Express 330-073 $.99
Gold Plated Ring Terminals 10 gauge 5/16" 2 Pair Parts Express 095-665 $1.10
Relay Socket Jameco 171424 $.29
D-Sub 9 Pin Female Connector Jameco 15771 $.49
D-Sub 9 Pin Male Connector Jameco 15747 $.35
9 Pin D-Sub Metalized Hood Jameco 25620 $.45
D-Sub 15 Pin Male Connector Jameco 15034 $.45
D-Sub 15 Pin Female Connector Jameco 15051 $.49
15 Pin D-Sub Metalized Hood Jameco 25566 $.45
100ft 24 Gauge 4 Conductor Shielded Cable Jameco 31860 $14.00
10 Female Standoffs 4-40 thread .375" Jameco 77500 $1.70
100 4-40 Machine Screws .25" Jameco 40951 $1.60
10 .100" Connectors 2 contacts Jameco 100811 $1.50
20 Female Pins Jameco 100765 $2.00
6" X 3" X 2" Project Case Radio Shack 270-1805 $3.69
Coaxial DC Power Plugs 5.5mm O.D. X 2.1mm I.D. Radio Shack 274-1569 $1.69
Coaxial DC Power Jack 5.5mm O.D. X 2.1mm I.D. Radio Shack 274-1582 $1.99
Coaxial DC Power Jack 5.5mm O.D X 2.5mm I.D. Radio Shack 274-1583 $1.99
DPDT 12VDC Relay Radio Shack 275-0218 $7.99
4PDT 12VCD Relay Radio Shack 275-0214 $7.99
High Current Power Connector (Male) Radio Shack 274-0151 $.99
High Current Power Connector (Female) Radio Shack 274-0154 $.99


Software

DOS

Out of the many flavors of DOS that exist, I chose "MSDOS 7.1". This is the version of DOS that comes with Windows 95 OSR2 and Windows 98. It supports large drives, and FAT32 partitions.


Drive Partitioning

First, a 500 meg FAT16 partition was created. This partition contains all of the software and a copy of Windows 95 OSR2, in case I ever need it. A second partition was created, which covers the rest of the drive . This serves as the storage area for all of my music.

Note: The version of Fdisk that comes with Windows 95 OSR2, 98, 98SE has a bug which prevents it working properly on drives larger than 64GB. An updated version of Fdisk is available from Microsoft. Some alternatives to Fdisk include Partition Magic, and Ghost's Gdisk. I've had good luck with both.


Windows

With plenty of hard drive space to burn, I did install a copy of Windows 95 OSR2, just in I need it for some reason in the future. Next a configuration change was necessary to make the machine boot into DOS, by default. This is done by doing the following in DOS:

Enter the following commands:
attrib c:\msdos.sys -h -r -s
edit c:\msdos.sys

Next look for a line like this: BootGUI=1 and change it to: BootGUI=0
To get rid of the startup screen (Optional) change or add the following: Logo=0
To stop scandisk when Windows isn't shut down properly: Autoscan=0
When you're done save, exit, and enter the following command:
attrib c:\msdos.sys +h +r +s

At this point DOS will be ready to go. If everything was done correctly rebooting will take you straight to a c:\ prompt. Additional configuration will be necessary. More to come in the next series of pages.


DOS Networking

DOS is certainly capable of being run in a networked environment, but requires third party software to make it happen. Out of the many networking packages available I tried the following:
Microsoft Network Client for DOS
PowerLAN
Invisible LAN


Microsoft Network Client for DOS

This client allows a machine to connect to network shares on any Windows machine. The software is free and works with just about any network card that comes with NDIS drivers. The following page gives full details on where to download, and how to install this software. Additional work is needed in order to make shares available. The procedure is described here. The Microsoft Client worked as it should. Unfortunately the networking performance was sub-par.


PowerLAN

I used PowerLAN for a while on my software development machine (I was using MSDOS 6.22 on this computer). With the installation of their network client on a Windows 9x machine, the two computers can talk to each other. The network performance was very good. The problem: PowerLAN's DOS client isn't compatible with DOS 7.1  PowerLAN and can be downloaded from this site.


InvisibleLAN

Like PowerLAN, this networking package requires network client software to be installed on the Windows 9x machine so the two computers can talk to each other. It will work just about any network card that has a working NDIS driver. The InvisibleLAN software and documentation can be downloaded here. Like PowerLAN, Invisible LAN requires share.exe to be loaded before it'll start. Unfortunately, share.exe isn't included with, and isn't compatible with DOS 7.1 Share.exe doesn't harm anything when used anyway, if fact it does nothing except appease Invisible LAN.

(Under DOS 6.22 and earlier share.exe deals with file concurrency issues. Under DOS 7.1, with share.exe not doing it's job, it's important not to have more than one machine write information to the same file at the same time.)

A copy of share.exe can be downloaded from here. Copy it it the InvisibleLAN directory. (e.g. c:\ilan) Share.exe normally will refuse to run under DOS 7.1, but you can trick it into thinking it's being run under an older version of DOS. First enter the following command:
setver share.exe 6.22
Next add the following line to the config.sys
devicehigh=c:\windows\command\setver.exe


MPXPlay

MPXPlay is an excellent DOS-Based WAV/MP3 player. The latest version can be downloaded from the author's website. The custom frontend software that I wrote is compatible with MPXPlay (1.46). This was the most recent non-beta version of MPXPlay available at the time.

Make a directory for MPXPlay and any of the frontend software you plan to use (e.g. c:\player). It's also a good idea to add MPXPlay to path statement in your autoexec.bat. That way MPXPlay can be run even when your not in the player's directory. To do this go into your autoexec.bat and look for a line like this:
PATH C:\WINDOWS;C:\WINDOWS\COMMAND;
Then add MPXPlay's directory to the path. If MPXPlay was placed in c:\player, the path should look similar to this:
PATH C:\WINDOWS;C:\WINDOWS\COMMAND;C:\PLAYER;

MPXPlay can be used in a number of ways. If you're using a playlist, the syntax will look similar to this:
mpxplay -@ playlist.m3u

If you're not using playlists, the following can be done:
mpxplay *.*
This tells MPXPlay to play all music files in a particular directory.

MPXPlay normally reads its song info from the ID3 tags in the MP3 files. It is also possible to have it load this information from a file. The syntax for doing this is:
mpxplay *.* -il fileinfo.txt
assuming that fileinfo.txt is the textfile supplying the track information.

See MPXPlay's documentation for further info.


VCC - Virtual CD Changer for DOS

VCC is the custom frontend software that I wrote specifically for my car computer. It consists of two parts:
-- a front-end which handles the directory navigation
-- a tsr which becomes active while MPXPlay is running

Instead of including zillions of options I chose to keep the software simple. There are two advantages to this approach. First, it keeps the code simple and easy to maintain. Second, it keeps the software smaller and less resource-hungry.

The music is organized in a two-level directory structure. From the music directory there are 26 subdirectories (A,B,C,..,Z). In each of subdirectories is another set of directories which have the music files in them. The directory structure is like this:

                   MUSICDIR
                 /          \
                A    ...     Z
               /              \
          ACDC1      ...       ZZTOP3
         /     \              /      \
       01.wav...10.wav    01.mp3...10.mp3

The music directory can be in any place, but requires this structure for the software to function properly. The navigation is entirely directory-based. This eliminates the need for playlists and the hassle of maintaining them. This system works like a 26-cartridge cd-changer would, assuming the cds were grouped alphabetically. Short filenames are used for both the music directories and the sound files.

Track and disc info are stored in two text files: fileinfo.txt and discinfo.txt  This totally eliminates the need for long-filenames and/or id3 tags.

An example fileinfo.txt is as follows:
01.WAV Jailbreak
02.WAV You Ain't Got a Hold on Me
03.WAV Show Business
04.WAV Soul Stripper
05.WAV Baby Please Don't Go

Likewise, discinfo.txt looks like this:
AC/DC
'74 Jailbreak

As an added bonus, no special utilities are needed to update any of this information. Your favorite text editor will do the job.

Hardware Requirements:
Gravis Gamepad Pro (the normal one, not the USB model)
Matrix Orbital 2041 20X4 serial LCD display
Pentium Class PC (a Pentium 75 or better)

Software Requirements:
DOS (tested on MSDOS 6.22 and MSDOS 7.1)
MPXPlay 1.46 (will probably work on MPXPlay 1.43 and later)

Installation:
Make a directory (e.g. c:\player )
Add this directory to the path statement in the autoexec.bat
Download and unzip MPXPlay 1.46 into this directory
Download and unzip VCC to the same directory
Make a music directory, and create the appropriate directory structure described above.

To make VCC startup automatically every time the machine is booted, add the following lines to the autoexec.bat:
c:\playerdir\vcctsr
c:\playerdir\frontend.bat musicdir

Replace playerdir and musicdir with the names of the directories that you made for the player and the music.

Operation:

[Gravis Gamepad Pro]
The 4 trigger buttons are used to switch between discs and categories of discs. The red and green buttons are used to switch between tracks. On the left is rewind/ffd and a volume control. The start button is used to pause MPXPlay. The select button isn't being used at this time.


Display:
The following info is displayed on the 20X4 LCD:
[20X4 LCD in action]  Line1: Band Name
 Line2 : Album Title
 Line3: Track #  /  Track Title
 Line4: Time / Level meter  /  Volume


Limitations:
*There is no software adjustment of the LCD contrast.
*There is no method to play random tracks.

Tech Stuff:
The frontend is responsible for the directory navigation. It natively supports the Gamepad Pro, and displays Artist / Band info on lines 1 and 2.
The frontend requires the user to push the play button before the music starts. In addition, it also allows you to change the volume while the MPXPlay isn't running. These two features ensure that the player doesn't automatically start, playing music at too high of a volume.
The TSR becomes active whenever MPXPlay is running. It is responsible for reading information (track info, volume, level) from screen memory and displaying it on lines 3 and 4 on the LCD. In addition is also polls the joystick, and "fakes keystrokes", allowing a person to control MPXPlay from the GamePad Pro joystick.



Modifications

In late 2001 the car computer was ready for daily use. Still, it was only a matter of time before some changes would have to be made. That time came sooner than I expected.



Car

After having driven it for 6 years, my old 1976 Buick Century bit the dust, in the summer of 2002. Rather than starting a new project for the 1997 Pontiac Bonneville, I kept the same computer and reused some of the car stereo components.


Car Stereo:

Prior to moving the system to my Pontiac Bonneville, I took the opportunity to address some problems that I encountered in my previous install:

In addition there were some other things to account for when moving the car stereo system:



Construction


Speaker Boxes:

With no good place on the back deck to mount the subwoofers, a pair of speaker enclosures needed to be built. The design needed to meet the following requirements:

With that in mind I climbed in the trunk and took some measurements. I measured the angle of the back seat, which turned out to be 66 degrees. To avoid blocking the pass-through, the speaker boxes couldn't be any wider than 14 inches. The maximum height measured in at 14 inches.

To avoid nasty resonance problems I didn't want any of the dimensions to be identical. Also, I wanted a little bit of fudge factor when it came to height. For those reasons I changed the height dimension to 13 inches.

[Car Speaker Diagram]With the height, and front angle determined I found a javascipt-based speaker calculation page and start playing with the numbers. In the end, I decided on a trapezoid-shaped enclosure with the following dimensions: 13"H x 14"W x 15.25" D1 x 21"D2.

[Speaker Box under Construction] [Speaker Box with Insulation]
[Finished Speaker Box - Front] [Finished Speaker Box - Back]



Wiring


Power Wire:

To power the computer, I ran 4 gauge wire direct from the battery to a distribution block in the trunk. To prevent fires and other mishaps an inline fuse holder was added, near the battery.

[Power Wire at Battery] [Power Wire under Hood]

Then at the distribution block power is sent to the power amp and the computer. A relay was used to switch the computer on and off with the vehicle's ignition.


Turn-on wires:

Two remote turn-on wires were run. The first wire was run from the red "12V Switched" wire on the CD Player's wiring harness to the relay on the car computer. This wire is live when the car's ignition is turned on, but dead when the car is turned off. The wire doesn't need to be as heavy as the main power wire, because it's only used to trip the relay coil. This coil consumes a small amount of current. I used 18 gauge wire for this.

The second wire was run from the "power antenna" lead on the CD Player to the power amplifier's "remote turn-on" input. It's live when the CD Player is turned on, and is used to turn the power amp on and off. Since this wire only carries a small amount of current, 18 gauge wire was sufficient.

[Wires Under Back Seat] [Wires routed to trunk]



OBD-II

[Completed OBD-II Box] [OBD-II Box Under Contruction] I ordered an OBD-II interface from ScanTool.net in the summer of 2002. The package included a interface board, a 25pin-to-9pin serial cable, and a J1962M connector. At the time, ScanTool.net didn't include pre-made cables, so I had to make my own using the J1962M connecter, some data cable, and a 9-pin connector. Since that time, they've made things easier by including pre-made OBD-II cables with their OBD-II kits. No case was included with this kit, but a quick trip to a local Radio Shack store took care of that. The OBD-II interface was mounted inside the dash.


OBD-II Cables:

The ELMScan VPW interface board has two connectors: a DB9M, and a DB25F. The "DB9F to J1962M" cable is used to connect the interface board to the car's OBD-II port. Then a "DB25M to DB9F" serial cable connects the interface board to a standard 9-pin serial port. Last, but not least, I made a "DB9M to DB9F" serial extension cable, and ran it to the trunk. This extension cable is identical to the LCD Serial Cable that I made when I first started this project.



Future

Computer technology has come a long way since 2001. At the time, 80GB hard drives cost $300. Laptop drives topped out at 30GB and cost even more money. Mini-ITX motherboards weren't available yet, and embedded/industrial motherboards were extemely expensive. Because of these limitations certain compromises had to be made. While a number of trade-offs will always exist, newer technology has a way of making the process less painful.


Storage:

While solid-state storage won't be practical for a number of years, laptop hard drives are the next-best thing. They're smaller, more shock-resistant, and draw less power than desktop drives. 160gb laptop drives are available today for a cool $150.


Case/Motherboard:

I'm looking for something that's small and reasonably priced. Mini-ITX boards and cases fit those goals really well. I still haven't decided whether to build a custom case, or to buy one off-the-shelf.


Controller:

My controller of choice, the Gravis Gamepad Pro, has been discontinued. When it comes time to build a new Car-PC, I'll probably bite the bullet and pick a different controller. I like the layout of the Logitech Precision Gamepad 2. It has a layout that's almost identical to the Gamepad Pro. It does use a USB interface, though. This would complicate things a bit, because there's no DOS driver for it. In fact, DOS has no built-in support for USB, at all. One possible solution would be to use a third party USB stack, like DOSUSB, but I'd still need to write a driver for the gamepad.


Last Update: 12-30-2006