How to use the Scripts in the Cat Protector Project

published: November 24, 2015 — last modified: October 23, 2025

It seems the cat protector project documentation has a small gap. There is just a hint that you have to use some scripts to prepare the SD card to play the audio files, but no details about this.

To use the scripts you need some knowledge how to use a command line interface on your operating system. The scripts are very simple to use on Linux and Mac OS X, but on Windows it is very tricky. I strongly advice you to use either Linux or Mac OS X. If you are working on Windows, just use a free virtual machine application and install a Linux (I suggest Ubuntu) or a Linux live CD where you don’t have to install anything.

Why? …. Why … that … complicated

The used microcontroller is not very fast, if the software on the microcontroller also has to deal with a complicated filesystem, no sequential blocks and other obstacles, changes are small to produce sound output in a good quality. Therefore I prepare the samples in a very simple format and instead of a complicated file system, I just store the blocks with the audio data sequentially onto the SD card.

Install Required Software

You have to install SOX which is a command line tool to convert audio files from one to many formats. SOX is available here. You find installers for all operating systems on this website.

After installing SOX, open a terminal window and test if SOX is working on the command line. Enter this command:

sox --help

You should get an output like this:

sox:      SoX v
Usage summary: [gopts] [[fopts] infile]... [fopts] outfile [effect [effopt]]...
SPECIAL FILENAMES (infile, outfile):
-                        Pipe/redirect input/output (stdin/stdout); may need -t
...
...

If you get an error message, there is something wrong. Check if you correctly installed the tool and if the tool is accessible.

The scrips also require the script language Perl to work. This is usually installed on all modern operating systems (except Windows).

Prepare the Sound Files

First prepare your sound files. Record them using any suitable audio tool and save them in any possible format which is supported by the SOX tool. I suggest you record and save your samples as uncompressed WAV files, 44.1kHz.

In this example I name the original audio files as shown below:

OriginalSound01.wav
OriginalSound02.wav
OriginalSound03.wav

Create the Work Directory

Create a new directory Work somewhere and copy the script files ConvertAudio.pl and CreateDiskImage.pl and your original sound files into this working directory.

Create a sub directory DiskA in the work directory.

Convert the Sound Files

Now use the ConvertAudio.pl script to convert your original sound files in the required raw format.

<pre>
> cd [to your work directory]/Work
> ./ConvertAudio.pl OriginalSound01.wav DiskA/v01.snd

Input File : ‘OriginalSound01.wav’ Channels : 1 Sample Rate : 22050 Precision : 16-bit Duration : 00:00:01.25 = 27563 samples ~ 93.7517 CDDA sectors File Size : 55.2k Bit Rate : 353k Sample Encoding: 16-bit Signed Integer PCM

In:100% 00:00:01.25 [00:00:00.00] Out:27.6k [!=====|=====!] Hd:0.4 Clip:0 Done.

Repeat the conversion with all your original files, until your directory DiskA contains all the sound files.

Please Note: Do not use any space or special character in the file names. Use simple letters and numbers, nothing else. The file names on the DiskA are stored in the disk image. They should be as short as possible.

Create the Disk Image File

As next step, convert the files in the DiskA directory to a disk image file.

<pre>
> ./CreateDiskImage.pl -i DiskA -o DiskA.bin
Create Disk Image
------------------------------------------------------------------------------
File "v01.snd" size=3177472 bytes startBlock=1
File "v02.snd" size=3763200 bytes startBlock=6208
File "v03.snd" size=3763200 bytes startBlock=13559
File "v04.snd" size=55126 bytes startBlock=20910
File "v05.snd" size=88200 bytes startBlock=21018.66796875
Writing disk image...
Writing file v01.snd ... position=512, block=1
Writing file v02.snd ... position=3178496, block=6208
Writing file v03.snd ... position=6942208, block=13559
Writing file v04.snd ... position=10705920, block=20910
Writing file v05.snd ... position=10761558, block=21018.66796875

Disk image was successfully written.

Now you have a new file DiskA.bin. This is the “disk image” which has to be written on the SD card. Not copied as a file on the SD card. We talk here about overwriting the contents (and filesystem) of a SD card with this binary file.

Write the SD Card

Absolute serious warning! No kidding, if you do the next steps wrong, you will definitely overwrite your operating system or lose random data. It will hurt, you will cry. Therefore read carefully.

For the next step we are using a low level write operation to write directly on the SD card. To do this, we need to know the correct device name for the SD card. By the way, the SD card will get overwritten, all previous stored files on the used SD card will be lost.

Linux

On Linux use the lsblk command. First use it without the SD card plugged in your computer. You will get an output like this:

> lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    20G  0 disk 
├─sda1   8:1    0    19G  0 part /
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0  1022M  0 part [SWAP]
sr0     11:0    1  1024M  0 rom  

Now plug the SD card into your computer, wait a few seconds and use the lsblk command again:

> lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0    20G  0 disk 
├─sda1   8:1    0    19G  0 part /
├─sda2   8:2    0     1K  0 part 
└─sda5   8:5    0  1022M  0 part [SWAP]
szz      8:48   1  59.9G  0 disk 
└─szz1   8:49   1  59.9G  0 part 
sr0     11:0    1  1024M  0 rom  

You see there is a new device szz. This has to be the plugged in SD card. For Linux the device path is therefore:

/dev/szz

Warning! This is an example, the name for the SD card is for sure different in your case.

Max OS X

On Mac us the command diskutil list First use it without the SD card plugged in your computer. You will get an output like this:

> diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            999.7 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3

Now plug the SD card into your computer, wait a few seconds and use the diskutil list command again:

> diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage Macintosh HD            999.7 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk4 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *64.3 GB    disk4
   1:               Windows_NTFS                         64.3 GB    disk4s1

You see there is a new device /dev/disk4. This has to be the plugged in SD card. For Mac OS X the device path is therefore:

/dev/disk4

Warning! This is an example, the name for the SD card is for sure different in your case.

For Mac OS X before you can write to the SD card, you have to “unmount” it with this command:

diskutil unmountDisk /dev/disk4

Write the Disk Image

Now you can use the dd command to write the SD card. You have to prefix the command with sudo to execute the command with admin rights. You will be prompted for the administrator password.

sudo dd if=DiskA.bin of=/dev/disk4 bs=512

Depending on the size of your image, this can take a while.

Success!

After this steps, the SD card is prepared to use it with the Cat Protector project.

More Posts

Three Ways to Integrate LED Light Into the Modular Lantern

Posted on 2023-01-29— 3D Printing, Build, Projects

I tested three inexpensive, easy methods to add LED lighting to my modular 3D‑printed lantern using USB power: reused LED modules, short 5V strips, and WS2812B RGB with a microcontroller. I share parts lists, soldering tips, diffuser advice, and firmware steps—read on for step‑by‑step instructions and printable models.

Read this post

SMD Components Under the Microscope

Posted on 2016-08-11— Learn

I photographed common SMD components through a microscope to reveal how small imperfections appear up close. I cropped each image for clarity and included a 1 mm scale and captions describing the parts. If you’re curious about what resistors, capacitors and tiny ICs look like under magnification, read on.

Read this post

Bottle Opener for Elderly People or with Disabilities

Posted on 2021-04-25— Projects

I designed a 3D-printable bottle opener to help seniors and people with limited grip turn 26–30mm plastic caps. The tapered 72-tooth socket adapts ±1mm and the handle has finger notches — print in PETG. Download the STL files and read the full post for print settings and tweaks.

Read this post

New Additions to the Storage Box System

Posted on 2023-10-17— 3D Printing

I've added a batch of new divider layouts across my storage box system — regular, flat, tall, triple and extended series — based on your feedback. I've updated documentation and uploads; downloads are available on the new platform. Please take a look and read the full post for details and download links.

Read this post

Huge Storage Boxes Update

Posted on 2021-11-16— 3D Printing, Projects

I’ve released a major update to my 3D-print storage box system: expanded sizes (up to 6x6 and 9x9 split), improved geometries, 3MF files, JPEG previews, and more dividers. If you use my boxes or print them yourself, read the full post for download links, compatibility notes, and printing tips.

Read this post

Event-based Firmware (Part 1/2)

Posted on 2019-07-05— C++, Improve your Code, Learn

I walk through a practical, minimal event-based approach to firmware using Arduino examples. Step by step I refactor blink sketches into modular events, introduce a millisecond timer, prevent skipped events, and encapsulate logic into classes and modules. Read on to follow the examples and apply them to your projects.

Read this post