====== 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.