|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161 |
- # Announcement Box
-
- Linux box with a loudspeaker and an emergency light to be used for announcements and notifications.
-
- ## Hardware
- * SBC with GPIOs and sound output :: OrangePi Zero with an expansion board
- * PA system
- * speaker :: 30W, 4 Ohms horn loudspeaker
- * sound amplifier :: mono 18W sound amplifier
- * relay module :: 12V low trigger relay
- * Warning Light system
- * warning light :: 12V 10W rotary orange warning light
- * relay module :: 12V low trigger relay
-
- ## Software
- * Operating System - Linux :: Armbian Bullseye for the OrangePi Zero
- * PA System
- * Voice Synthesizer :: Festival / ESpeak
-
- ## Implementation Notes
-
- ### Armbian + OrangePi Zero Installation
-
- #### Enable analog soundcard
- ```
- sudo armbian-config
- # System > Hardware > [*] analog-codec
- ```
-
- #### Software Dependencies
- ##### OS Packages
- ```bash
- apt install mplayer espeak-ng
- ```
-
- ##### GPIO toolkit
- ```bash
- # upstream:
- #git clone https://github.com/orangepi-xunlong/wiringOP
- # enhanced:
- git clone https://github.com/Dejvino/wiringOP
- cd wiringOP
- ./build clean
- ./build
- ```
-
- #### Initialize GPIOs
- ```bash
- # System Activity Indicator
- PIN_SALIGHT=11
- gpio mode $PIN_SALIGHT output
-
- # Emergency Light system
- PIN_ELIGHT=7
- gpio mode $PIN_ELIGHT output
-
- # PA system
- PIN_PASOUND=5
- gpio mode $PIN_PASOUND output
- ```
-
- ### PA System
- #### Text to Speech
- ```bash
- ## Festival
- # reading
- ...
- # to file
- text2wave text.txt > wave.wav
-
- ## ESpeak
- # voices:
- ls /usr/lib/arm-linux-gnueabihf/espeak-data/voices/
- # reading
- espeak -f text.txt -p 40 -s 160 -v "en-us"
- # to file
- espeak -f text.txt -p 40 -s 160 -k15 -g 1 -w wave.wav
- # using SSML (e.g.: https://www.xml.com/pub/a/2004/10/20/ssml.html)
- espeak -f ssml.txt -m
- ```
-
- #### Converting into a low-quality broadcast audio
- ```bash
- sox infile.wav outfile.wav downsample echo 0.5 1 1 1
- ```
-
- #### Playing a sound file
- ```bash
- aplay file.wav
- mplayer file.mp3
- ```
-
- ### Emergency Light
- #### Control Script
- ```bash
- cat /usr/local/bin/emergency-light
- #!/bin/bash
-
- PIN_ELIGHT=7
-
- # init
- gpio mode $PIN_ELIGHT output
-
- # command
- if [[ "$1" == "on" ]]; then
- gpio write $PIN_ELIGHT 1
- elif [[ "$1" == "off" ]]; then
- gpio write $PIN_ELIGHT 0
- elif [[ "$1" == "read" ]]; then
- gpio read $PIN_ELIGHT
- else
- gpio toggle $PIN_ELIGHT
- fi
- ```
-
- ### System Activity Light
- #### System Usage
- ```bash
- uptime | head -n 1 | cut -f3 -d, | cut -f2 -d:
- ```
-
- #### Daemon
- ```bash
- cat /etc/systemd/system/system-activity-light.service
- [Unit]
- Description=System Activity Light Daemon
-
- [Service]
- ExecStart=/usr/sbin/system-activity-light-daemon
-
- [Install]
- WantedBy=multi-user.target
- ```
-
- ```bash
- cat /usr/sbin/system-activity-light-daemon
- #!/bin/bash
-
- DELAY=10000
-
- while [[ true ]]; do
- ACTIVITY=2000
- TOP=`system-usage`
- if (( $(echo "$TOP > 1.0" | bc -l) )); then
- ACTIVITY=50
- elif (( $(echo "$TOP > 0.75" | bc -l) )); then
- ACTIVITY=100
- elif (( $(echo "$TOP > 0.5" | bc -l) )); then
- ACTIVITY=500
- elif (( $(echo "$TOP > 0.2" | bc -l) )); then
- ACTIVITY=1000
- fi
- echo $TOP
- system-activity-light blink $ACTIVITY $DELAY
- done
- ```
-
- ```bash
- sudo systemctl enable --now system-activity-light.service
- ```
-
|