====== Raspberry Pi automatic broadcast machine ======
Here is what I did, to get started..
- Take one Raspberry Pi model B, one 8gb SD card, one EDUP wifi adaptor and one 8gb USB flash drive.
- Install latest Rasbian image to SD Card. A google search will find instructions for the various ways to do this if you don't know how.
- Assemble USB devices and SD card into RPi. Connect Cat5 LAN cable between Pi and router/switch to get it on the local network.
- Power Pi up, wait for it to do DHCP request and get on the network.
- Interrogate your router or do IP scan to obtain RPi's IP address.
- SSH into RPi with the IP address found in previous step. If using Ubuntu like I do, open terminal and SSH pi@192.168.0.xx
Windows users can use putty.exe for SSH. Password is raspberry.
- Do raspi-config
and adjust GPU memory to 16mb, this is found under the advanced settings.
- Do sudo su
to enable root, then change root password with passwd
follow the prompts and set the password to your preference.reboot
- Wait for Pi to come back up again and SSH back into it, this time with the user root. SSH root@192.168.0.xx
The password will be what you created int step 8.
- Now we will put the Pi on the wifi network. Issue the command lsusb
and you should see something like this listed. Bus 001 Device 004: ID 0bda:8176 Realtek Semiconductor Corp. RTL8188CUS 802.11n WLAN Adapter
- Thats listed? All good, now we can configure the wireless network settings. Do nano /etc/network/interfaces
and make it look something like this.
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
auto wlan0
iface wlan0 inet dhcp
wpa-ssid "SSID"
wpa-psk "WPA-PSK"
- Do ifup wlan0
then do ifconfig wlan0
In the ifconfig report you will see the IP of your wifi interface as the inet address. Do reboot
pull the Cat5 cable and SSH to Pi on wifi IP. That done we can move onto the next step..
===== Preparing the Pi for broadcast duties =====
We need some additional software.. Now is the time to install it.
- Do apt-get update && apt-get upgrade
to update the Pi to the latest version.
- Do apt-get install mpg123
to install the mpg123 player that the scripts use to play the news files.
- Do apt-get install mp3gain
to install mp3gain used to normalise file levels.
- Do apt-get install ssmpt
to install the email software.
I have used a 8gb USB drive to store files on rather than using the SD card. Probably for no good reason.
-
- To do this we create an entry in fstabnano /etc/fstab
- Add a line that looks like this/dev/sda1 /media/USB ext4 defaults
- /media/USB is the location I chose to mount my USB drive. Now mount the drive. mount -a
- Now that this is done, we can create the sripts and crontab entries. The scripts live in /media/USB
I have 3 scripts doing the work. One gets the files and prepares them, the next puts the repeater into broadcast mode and the third plays the files.
===== The getnews script =====
getnews.sh
#!/bin/bash
# Set directory
NEWS="/media/USB"
LOG=$NEWS/log/getlog.txt
# Set date for file naming
DATE=`date +"%Y-%m-%d"`
# WIA file name
WIAFILENAME="wianews-`date +"%Y-%m-%d"`.mp3"
# Change directory
cd $NEWS
writelog ()
{
MESSAGE="`date '+%b %d %Y %T'` "$@
echo $MESSAGE >> $LOG
}
# Get WIA file
/usr/bin/wget http://www.wia-files.com/podcast/$WIAFILENAME && writelog "Got WIA file OK" || writelog "Download WIA file failed!"
cp $WIAFILENAME $NEWS/archive/wianews-$DATE.mp3 && writelog "Archived WIA file OK" || writelog "Archive WIA file failed!"
rm wianews.mp3 && writelog "Removed last weeks WIA file OK" || writelog "Remove last weeks WIA file failed!"
mv $WIAFILENAME wianews.mp3 && writelog "Rename WIA file to generic name OK, file prepared :)" || writelog "Rename WIA file to generic name failed!"
# Get VK7 file
/usr/bin/wget http://www2.vk7ax.id.au/wianews/VK7Regional.mp3 && writelog "Got VK7 file OK" || writelog "Download VK7 file failed!"
cp VK7Regional.mp3 $NEWS/archive/tasnews-$DATE.mp3 && writelog "Archived WIA file OK" || writelog "Archive WIA file failed!"
rm tasnews.mp3 && writelog "Removed last weeks VK7 file OK" || writelog "Remove last weeks VK7 file failed!"
mv VK7Regional.mp3 tasnews.mp3 && writelog "Rename VK7 file to generic name OK, file prepared :)" || writelog "Rename VK7 file to generic name failed!"
exit 0
===== The broadcast mode script =====
bcmode.sh
This gets played about 10 mins before start time
#!/bin/bash
# Set news directory
NEWS="/media/USB"
# Set pause time value
pause=1
# Change directory
cd $NEWS
# Set up GPIO 17 and set to PTT output
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
# Set up GPIO 18 and set to COR input
echo "18" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio18/direction
# Broadcast mode function
bcmode()
{
# PTT up
echo "1" > /sys/class/gpio/gpio17/value
# Wait a while
sleep $pause
# Play VK7DB
mpg123 $NEWS/VK7DB.mp3
# Wait a while
sleep $pause
# Play timeout disable
mpg123 $NEWS/bcmode.mp3
# Wait a while
sleep $pause
# PTT down
echo "0" > /sys/class/gpio/gpio17/value
# Goto end
end
}
# End function
end()
{
# Clean up
echo "17" > /sys/class/gpio/unexport
echo "18" > /sys/class/gpio/unexport
exit 0
}
# Main loop
while :
do
value=`cat /sys/class/gpio/gpio18/value`
if [ $value -eq 0 ]; then
bcmode
fi
done
# Goto end
end
===== The playnews script =====
playnews.sh
#!/bin/bash
# Set directory
NEWS="/media/USB"
LOG=$NEWS/log/playlog.txt
writelog ()
{
MESSAGE="`date '+%b %d %Y %T'` "$@
echo $MESSAGE >> $LOG
}
# Set pause time value
pause=1
thirty=30
# Change directory
cd $NEWS
# Set up GPIO 17 and set to output
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
# Wait 30 seconds
sleep $thirty
# PTT up
echo "1" > /sys/class/gpio/gpio17/value && writelog "PTT up" || writelog "PTT fail!"
# Wait a 30 seconds
sleep $thirty
# Play WIA news
writelog "Play WIA news start"
mpg123 $NEWS/wianews.mp3 && writelog "WIA play finished" || writelog "WIA play fail!"
# Play Tas news
writelog "Play VK7 news start"
mpg123 $NEWS/tasnews.mp3 && writelog "VK7 play finished" || writelog "WIA play fail!"
# Wait a while
sleep $pause
# Play timeout enable
writelog "Enable timeout start"
mpg123 $NEWS/26501.mp3 && writelog "Enable timeout done" || writelog "Enable timeout fail!"
# Wait a while
sleep $pause
# Play VK7DB
writelog "Play VK7DB start"
mpg123 $NEWS/VK7DB.mp3 && writelog "Play VK7DB done" || writelog "Play VK7DB fail!"
# PTT down
echo "0" > /sys/class/gpio/gpio17/value && writelog "PTT down" || writelog "PTT down fail!"
# Clean up GPIO
echo "17" > /sys/class/gpio/unexport
exit 0
===== RAOTC script =====
getraotc.sh
I have also written a script to get the RAOTC file, should Winston not be able to run it.
#!/bin/bash
# Set directories
NEWS="/media/USB"
LOG=$NEWS/log/getlog.txt
# Set date for file naming
DATE=`date +"%Y-%m-%d"`
# Set file naming
RAOTC=`date +%B%Y`.wma
RAOTC=${RAOTC,,} # convert to lower case
# Change directory
cd $NEWS
writelog ()
{
MESSAGE="`date '+%b %d %Y %T'` "$@
echo $MESSAGE >> $LOG
}
# Get RAOTC file
/usr/bin/wget http://www.raotc.org.au/Audio_files/$RAOTC && writelog "Got RAOTC file OK" || writelog "Download RAOTC file failed!"
cp $RAOTC $NEWS/archive/raotc-$DATE.wma && writelog "Archived RAOTC file OK" || writelog "Archive RAOTC file failed!"
rm raotc.wma && writelog "Removed last weeks RAOTC file OK" || writelog "Remove last weeks RAOTC file failed!"
mv $RAOTC raotc.wma && writelog "Rename RAOTC file to generic name OK, file prepared :)" || writelog "Rename RAOTC file to generic name failed!"
exit 0
==Play RAOTC Script==
playraotc.sh
#!/bin/bash
# Set news directory
NEWS="/media/USB"
# Set pause time value
pause=1
# Change directory
cd $NEWS
# Set up GPIO 17 and set to output
echo "17" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio17/direction
# PTT up
echo "1" > /sys/class/gpio/gpio17/value
# Play WIA news
mplayer $NEWS/raotc.wma
# Wait a while
sleep $pause
# Timeout enable
mpg123 $NEWS/26501.mp3
# Wait a while
sleep $pause
# Play VK7DB
mpg123 $NEWS/VK7DB.mp3
# PTT down
echo "0" > /sys/class/gpio/gpio17/value
# Clean up GPIO
echo "17" > /sys/class/gpio/unexport
exit 0
===== Cron Scheduling =====
These scripts are scheduled with cron
# m h dom mon dow command
@reboot /usr/bin/amixer set PCM 4dB unmute >/dev/null 2>&1
0 05 * * 0 /media/USB/getnews.sh >/dev/null 2>&1
50 08 * * 0 /media/USB/bcmode.sh >/dev/null 2>&1
59 08 * * 0 /media/USB/playnews.sh >/dev/null 2>&1
50 19 * * 2 /media/USB/bcmode.sh >/dev/null 2>&1
59 19 * * 2 /media/USB/playnews.sh >/dev/null 2>&1
===== Log Scripts =====
Just for something to do, I made another script log repeater usage to a file and echo it to the screen.
#!/bin/bash
NEWS=/media/USB
LOGDIR=$NEWS/log
CORLOG=corlog.txt
# Set up GPIO 18 and set to COR input
echo "18" > /sys/class/gpio/unexport
echo "18" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio18/direction
writeopen ()
{
echo; echo
echo "Mute opened at `date`"
echo "Mute opened at `date`" >> $LOGDIR/$CORLOG
}
writeclosed ()
{
echo "Mute closed at `date`"
echo "Mute closed at `date`" >> $LOGDIR/$CORLOG
echo >> $LOGDIR/$CORLOG
loop
}
loop ()
{
while :
do
cor=`cat /sys/class/gpio/gpio18/value`
if [ $cor -eq 1 ]; then
writeopen
while :
do
cor=`cat /sys/class/gpio/gpio18/value`
if [ $cor -eq 0 ]; then
writeclosed
fi
done
fi
done
}
loop
===Footnote===
I set the audio output of the Pi to 100% on startup and adjust level inside the modified PRM8010. This is done in cron @reboot /usr/bin/amixer set PCM 4dB unmute >/dev/null 2>&1
GPIO 18 is used as an input, it looks at the output of the CTCSS decoder in the receiver of the PRM8010.. When the repeater user stops transmission, the repeater tone encoder stops. Monitoring of the repeater mute allows the bcmode script to be polite if the repeater is in use.
The next trick will be to write errors to a separate error log file and email me the error log only if it exists.. If something has failed I can fix it, otherwise I don't need to know about it..
Special mention must be made of Matt VK3VS for thanks for his ideas and scripting assistance with this project.
Since I'm new to all of this, if someone can see a better or different way to do things, I'd be happy to know.
Dion.