Here's some additional information that I often explain to my clients:
The process of sending a command can be viewed as layers, originating from user input (type this, click that) and ending in your hardware doing something worthwhile (burning a disc).
Software is sort of the top level, for example Nero or Alcohol 120%. It can't be written with every specific machine command to tell every piece of hardware in the world exactly how to work or programs would be huge, so it sends generic signals to the next lowest layer (drivers).
Drivers are files on your computer that use the generic software instructions and pass on more specific instructions to firmware. Drivers also allow the use of special features of your hardware. This is why some hardware won't do everything it's supposed to if you just use a generic driver.
This data eventually reaches the piece of hardware. Hardware often has "flash memory" built in that can be updated by software. The info in this flash memory is called firmware becuase it's not hardware, and not quite software either. It is the receiving end for the drivers' specific instrutions and is what actually operates the hardware device - thus incorrect drivers can send specific instrutions that the firmware can't understand. Most firmware can understand generic commands, so generic drivers will usually work, but not necessarily very well.
The operating system is sometimes technically viewed as another layer on top of the drivers, upon which the software runs. But whatever.
Hopefully someone can learn something from this. :)