Mani digitālie lauki

Emuārs par darbiem, nedarbiem u.c. lietām, kuras gribas publiski pierakstīt.
en lv

Kā ieslēgt kādu ierīci, kad uz RasberyPi tiek atskaņota skaņa

Jau kādus pāris gadus atpakaļ no KF5INZ tika nopirktas pāris vienkāršas Easy Digi ierīces. Sūtījumā gan saņēmu trīs. Kad piedāvāju viņam nosūtīt lieko atpakaļ, viņš tik atrakstīji, ka lai jau paliek bōnusā, jo sūtīšana bija gana dārga.

Toreiz bija plāns sapārot datoru un manu veco Kenwood TS-50S ar Easy Digi palīdzību. Un pamēģināt digitālās modes, kā arī tas varētu atvieglot sakaru žurnalēšanas processu. Bet tas izrādījās ne būt ne tik vienkārši, kā cerēts, jo radio bija jau gana sens un par cik principiāli darbojos iekš Linux, tad arī tīklā bija diezgan maz info par to. Tā nu šīs Easy Digi kastītes labu laiku noguleja plauktā, līdz pakļāvos vilinājumam tikt pie RasberyPi un atcerējos arī par Easy Digi. Ideja bija diezgan vienkārša - ar Easy Digi palīdzību izveidot saskarni ar radiostaciju. Un iesākumā dabūt gatavu kaut ko vienkāršu, piem.: vienkāršu papagaiļ repīteru, automātiski ierakstīt uztverto vai darbināt kopā ar kādu balss atpazīšanas progammu.

Iepriekš veiksmīgi jau biju Easy Digi, lai savienotu rokas rāciju kopā ar savu lielo Linux kasti iekš kuras tika uzstādīta Mycroft bals atpazīšanas progrogrammatūra. Bija iespējams pietiekami veiksmīgi caur citu rokas rāciju uzdot jautājumus Mycroft programmai un dabūt atbildes. Tomēr raidīšanai tika izmantota rokas rācijas VOX funkcija ar kuru es tā īsti nebiju apmierināts (tās bija lētās ķiniešu UV-5R rācijas). Tā nestrādāja gana stabili un arī Mycroft pats izdomāja dažkārt pārāk ātri reaģēt. Tā nu es meklēju risinājumus, kā raidīšanas ieslēgšanai izmantot kādu programatoriski elektronisku veidu.

Tuvāk risinājumam tiku, kad sāku krāmēties ar RasPi. Te arī neliela atkāpe par Easy Digi - tā ir ļoti vienkārša ierīce ar diviem transformātoriem RF izolācijai un vienkāršu ortokouplera shēmu, lai varētu saslēgt rādiosataciju PTT kontaktus. Tā var tikt vadīta izmantojot datora seriālo portu, vai RasPi gadījumā tā GPIO kontaktus.

Man ne īpaši veicās ar Linux programmu / skriptu piemēru meklējumiem priekš seriālā porta, tomēr priekš RasPi bija atrodama gana daudz info un piemēri. T.i. mani interneta izrakumi vainagojās ar panākumiem.

Zemāk ir manas piezīmes, kā panākt konkrēta RasPi GPIO kontakta voltāžas līmeņa izmaiņu atskaņojot skaņu uz skaņas kartes. Šo voltāžas līmeņa izmaiņu tālāk izmantojam, lai ieslēgtu kādu ierīci, piemēram radiostacijai raidīšanu.

Nosacījumi: Vajadzētu būt kādām zināšnām par RasPi un darbā ar Linux komandrindu. Pati Rasbery Pi ierīce ar USB skaņas karti. Sakonfigurēti atbilstošie skaņas draiveri un palīgprogrammas. Tās gan es neesmu dokumentējis, bet nu pamatā vnk. “apt-get install …”

Internetā tika atrakts, ka noteikt vai skaņa tiek atskaņota var pēc speciālas direktorijas, jeb drīzāk datnes esamības, kas tie izveidota skaņas atskaņošanas laikā.

Tomēr pirms to darīt labāk ir sakārtot skaņas saimniecību uz RasPi. T.i. mums ir vajadzīga USB skaņas karte, jo lai arī RasPi ir sava skaņas saimniecība, tomēr tur nav iespējas ievadīt skaņu, piem pieslēgt mikrofonu. Lai gan varam iztikt ar vnk. skaņas kartes iespraušanu, tomēr tas nozīmē, ka tā ticami būs sekundāra pēc RasPI orģinālājām skaņas izvades ierīcēm (pie tam tās tur jau ir vairākas - atceramies, ka HDMI arī ir skaņas izvade).

T.i. plāns ir izmantot RasPi t.s. bezgalvas modē (bez ekrāna) un ta, lai USB skaņas karte būtu primārā, jeb “sound card 0”

Vispirms pārbaudam skaņas ierīču secību:

$ cat /proc/asound/modules
 0 snd_bcm2835
 1 snd_usb_audio

Lai to mainītu, izveidojam sekojošu datni: /etc/modprobe.d/usb-sound.conf Datnes nosaukums var būt jebkurš, ja vien tā ir šinī direktorijā un tai ir paplašinājums .conf

Datnes /etc/modprobe.d/usb-sound.conf saturs:

# Set the index value of the cards.
options snd_usb_audio index=0
options snd_bcm2835 index=1

# Reorder sound cards
options snd slots=snd_usb_audio,snd_bcm2835

Kad esam datni saglabājuši, tad pārstartējam RasPi un pārbaudam:

Pievienojot kādu mikrofonu, vai skaņas avotu USB skaņas kartes ieejai veicam ierakstu datnē:

$ arecord test.wav

Un pec tam līdzīgā veidā pārbaudam, ko esam ierakstījuši:

aplay test.wav

Rezultātā būtu jādzird to, ko ierakstījām.

Lai noteiktu programmā, vai notiek skaņas izvade, pārbaudam sekojoša faila esamību::

/proc/asound/card0/pcm0p/sub0/status

Jūs variet pārbaudīt, kāds konkrēti tas ir Jūsu gadījumā, bet manā gadījumā tas atbilst skaņas karšu secībai (index=0) t.i. card0

Mums arī jāsaprot, kuru GPIO kontaktu mums vajdzētu un/vai kuru mēs gribētu izmantot skaņas statusa izvadei. Es izvēlējos izmantot GPIO 27, jo tas ir blakus zemes vai mīnusa (ground GPIO) kontaktam. T.i. tad tos ir vienkāršāk atrast un var izmantot arī pāra konektorus Easy Digi pievienošanai.

Izveidojam galvenā skripta datni, kas pārbauda skaņas kartes satusa datni un atbilstoši maina GPIO voltāžu.

sudo nano /usr/local/bin/sound2gpio.sh

Ievietojiet skripta saturu nano teksta redaktorā un tad aizveriet to saglabājot datni:

#!/bin/bash

#Sound card statuss "file"
DIR='/proc/asound/card0/pcm0p/sub0/status'

#GPIO number
OUTPIO=27

#Te vajadzētu pārbaudi, vai gpio jau nav aizņemti, bet par cik lietosim šo vienu caur servisa skriptu, tad var iztikt
echo $OUTPIO > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio$OUTPIO/direction

# Pārtraucot skripta darbību atbrīvojam GPIO 
function cleanup()
{
    echo $OUTPIO > /sys/class/gpio/unexport
    exit 0
}

trap cleanup SIGINT

status1='closed'
while true
do

    if grep -q 'state: RUNNING' $DIR ; then
	status2='open'
    elif grep -q 'closed' $DIR ; then
	status2='closed'
    fi

    if [[ $status1 != $status2 ]] ; then
	if grep -q 'state: RUNNING' $DIR ; then
		echo "1" > /sys/class/gpio/gpio$OUTPIO/value
        	echo "Sound Detected!"
        	status1='open'
    	elif grep -q 'closed' $DIR ; then
		echo "0" > /sys/class/gpio/gpio$OUTPIO/value
        	echo "Sound Stopped!"
        	status1='closed'
	fi
    fi
done

Piešķiram atbilstošu atļauju:

sudo chmod +x /usr/local/bin/sound2gpio.sh

Tagad mēs varam pārbaudīt, kā tas stradā, izmantojot kādu testeri sprieguma mērīšnai, ko pievieno GPIO 27 un GPIO Ground un atskaņojam kādu skaņas datni.

Ja viss ir bijis pareizi un spriegums mainās atbilstoši skaņas atskaņošanai, tad varam turpināt un automatizēt skripta palaišanu pie RasPi sāknēšanas un tā pastāvīgu darbošanos fonā.

To mēs varam paveikt izveidojot atbilstošu servisu t.i. servisa iestatījumu datni:

sudo nano /etc/systemd/system/sound2gpio.service

Tanī ievietojam sekojošās rindiņas un saglabājot aizveram:

[Unit]
Description=Sets GPIO hight when sound is outputing on sound card
After=network.target

[Service]
Type=simple
Restart=on-failure
ExecStart=/usr/local/bin/sound2gpio.sh

[Install]
WantedBy=multi-user.target

Tad izpildam sekojošas komandas:

sudo systemctl daemon-reload
sudo systemctl start sound2gpio.service
# Pārbaudam kļūdas
journalctl -xe
# Nosakam, ka serviss tiks startēts pie katras RasPi sāknēšanas 
sudo systemctl enable sound2gpio.service

Restartējam RasPi un atkal veicam voltāžas pārbaudi atskaņojot skaņu.

Ja viss ir kārtībā, tad varam pievienot radio izmantojt Easy Digi un sākt uztvert un raidīt izmantojot RasPi programmēšanas iespējas. Tomēr, lai to varētu darīt pienācīgā kvalitātē, tad mums nepieciešami pēdējie soļi - saskaņot skaņas līmeņus ar radiostaciju. Lai gan varam regulēt skaņas skaļumu rācijai, tomēr dažreiz ir labāk izslēgt automātisko mikrofona jūtības regulēšanu uz RasPi vai arī mums var būt arī rādio, kuram ir ierobežotas skaņas regulēšanas iespējas, kā piem. kādam vecam militāram rādio. Tāpat mums ticami, ka ir nepieciešams noregulēt skaļumu RasPi skaņas kartei, jo ne visām radiostacijām varam regulēt mikrofona jūtību.

Lai noregulētu skaņas karti izmantojam amixer Sekojošā komanda izvadīs skaņas kartes parametrus:

$ amixer --card 0 contents
numid=10,iface=CARD,name='Keep Interface'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=3,iface=MIXER,name='Mic Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off
numid=4,iface=MIXER,name='Mic Playback Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=31,step=0
  : values=16
  | dBminmaxmute-min=-23.00dB,max=8.00dB
numid=7,iface=MIXER,name='Mic Capture Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=8,iface=MIXER,name='Mic Capture Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=35,step=0
  : values=16
  | dBminmax-min=-12.00dB,max=23.00dB
numid=9,iface=MIXER,name='Auto Gain Control'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=5,iface=MIXER,name='Speaker Playback Switch'
  ; type=BOOLEAN,access=rw------,values=1
  : values=on
numid=6,iface=MIXER,name='Speaker Playback Volume'
  ; type=INTEGER,access=rw---R--,values=2,min=0,max=37,step=0
  : values=4,4
  | dBminmaxmute-min=-37.00dB,max=0.00dB
numid=2,iface=PCM,name='Capture Channel Map'
  ; type=INTEGER,access=r----R--,values=1,min=0,max=36,step=0
  : values=0
  | container
    | chmap-fixed=MONO

numid=1,iface=PCM,name='Playback Channel Map'
  ; type=INTEGER,access=r----R--,values=2,min=0,max=36,step=0
  : values=0,0
  | container
    | chmap-fixed=FL,FR

Lai izslēgtu automātisko mikrofona jūtības kontroli:

$ amixer -c 0 cset numid=9,iface=MIXER,name='Auto Gain Control' 0
numid=9,iface=MIXER,name='Auto Gain Control'
  ; type=BOOLEAN,access=rw------,values=1
  : values=off

Lai iestatītu mikrofona jūtības līmeni uz 25:

$ amixer -c 0 cset numid=8,iface=MIXER,name='Mic Capture Volume' 25
numid=8,iface=MIXER,name='Mic Capture Volume'
  ; type=INTEGER,access=rw---R--,values=1,min=0,max=35,step=0
  : values=25
  | dBminmax-min=-12.00dB,max=23.00dB

Ar šīm vērtībām ir nedaudz jāpaspēlējas un pašiem jāpatestē, lai iegūtu vēlamo rezultātu. Kad esam ar rezultātu apmierināti, tad ar šo saglabājam parametrus, lai tie tādi paliek ari pēc restarēšanas.

$ sudo alsactl store 0

Tagad varam izpausties tālākā RasPi programmēšanā, kas atkarīga vien no paša iztēles un zināšanām. Bet tas jau būs cits emuāra ieraksts… ;-)