Outils pour utilisateurs

Outils du site


projets:esgourde2

Esgourdes

En cours ce début de février 2020

Comme une gourde à sons , les esgourdes se remplissent de sons. Ce sont des oreilles déportées.

Suite au projet Esgourde V1 j'ai continué les expérimentations, ESP32, NANOPI DUO, Olimex LIME, Raspeberry Pi Zero W…

La difficulté est de trouver un système d'alimentation et donc un consommation minimale pour avoir une durée maxi d'enregistrement; laisser l'esgourde 1 mois …

  • Avoir une grosse et solide source d'énergie, pas de fragile panneaux solaire, ni de batterie lithium pour fonctionner par tous les temps de -20° à +70°
  • Ne pas consommer trop genre < 150mA /5V
  • Bonne qualité du son, une paire d'electret
  • un accès aux données finales à distance serait bien pour ne pas polluer l'endroit de nos passages
  • pouvoir etre en place au moins 1 mois
  • avoir une horloge de temps (RTC)
  • avoir des plages d'enregistrement programmables, voir des systèmes de déclenchement par capteur
  • pouvoir avoir un tri minimal des fichiers sans interet
  • permettre le suivi sur une bonne distance (1km)

Pistes trouvée depuis:

Il semble y avoir 3 pistes aujourd'hui:

  1. ESP32 comme ESP32-ADF avec la nécessité d'un développement plus ardu mais une consommation très basse
  2. iMX233-OLinuXino-MAXI iMX233-OLinuXino qui possède une entrée audio et n'a pas l'air de consommer trop. Un peu datée ?
  3. RaspberryPi Zero W , facile d'accès , mais nécessitant l'ajout d'entrées audio

Suite à quelques expériences de consultation par WiFi des fichiers sons enregistrés, la solution envisagée est que l'esgourde transmette d'elle-même ses fichiers à une machine de collectage. Cela plutot que de faire le collectage une par une en ouvrant le Wifi par une télécommande. Car on évite ainsi la sonsommation de la télécommande

Ver une machines à plein d'esgourde Esgourde et Escarcelle

  1. Esgourde RSP0-W sur des plages horaires définies
    1. enregistre les sons
    2. transmet les fichiers à la machine de collecte SSID ESGOURDE
    3. récupère sa programmation de la machine de collecte
    4. boucle la dessus
  2. Esgourde de collecte sur des plages horaires définies
    1. est ouverte au collectage
    2. transmet les scripts et autres parametres aux esgourdes
    3. met à disposition une clée USB du collectage

La machine de collectage peut etre autre chose qu'un RSP zero , comme une RSPA+ qui consomme peut et a un connecteur USB plus solide et sur lequelle ou connecte une clée WiFi correcte qui va elle causer sur plusieurs centaine de mètres.

Je reprends ici mes essais sur RSP0

Horloge

Je viens de découvrir les carte Witty Pi qui pour une vingtaine d'euro font le taf ;-) Mais au cas ou j'expérimente aussi ma méthode plus simple et moins gourmande .

Bref , ma version n’utilise qu'une horloge couplée à un transistor pnp 2N2907 en inverseur pour un MOSFET (petite platine IRE520)

Sur cette base DS3231 qui a une double alarme que j'utilise avec un système de relai/tempo

En gros ,

  1. connexion sur le bus 1 de l'horloge
  2. sortie de l’interruption (SQW/nonINT) attention c'est nonINT :si alarme le signal passe en OFF!
# ajout std dans le /etc/rc.local
echo ds1307 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s

en fait ne pas faire cet ajout pour avoir la maitrise de l'horloge

Suppression fake-hwclock du boot

sudo update-rc.d fake-hwclock disable
sudo update-rc.d ntp disable

cat /proc/driver/rtc donne les info comme

rtc_time	: 13:19:14
rtc_date	: 2020-02-10
alrm_time	: 00:00:00
alrm_date	: 1970-01-01
alarm_IRQ	: no
alrm_pending	: no
update IRQ enabled	: no
periodic IRQ enabled	: no
periodic IRQ frequency	: 1
max user IRQ frequency	: 64
24hr		

De https://github.com/bablokb/pi-wake-on-rtc

  • rtcctl init au depart
  • rtcctl show alarm1
  • rtcctl on alarm1
  • rtcctl set alarm1 10.02.2020 18:03:01

j'ai modifié

 def set_alarm(self,alarm,state):
        """
        Set the given alarm-flag A1IE or A2IE in the control-register to the
        desired state (0 or 1)
        """
        control = self._read(self._CONTROL_REGISTER)
        control = _set_bit(control,alarm-1,state)
        control = int("00000101", 2)  # modif pour amener l'alarme a fonctionner ( SQW on )
        self._write(self._CONTROL_REGISTER,control)

    def dump_value(self,value):
...

Relai/Alimentation

Une platine MOSFET ( signal de IRE520 ) est connectée sur l’émetteur(3) d'un PNP 2N2907 qui joue le rôle d'inverseur de la sortie nonINT/SQW de l'horloge, consommation de la base 2,1mA

le déclenchement par l'horloge peut etre couplé par une diode et condensateur en parallèle qui diffère l'extinction de la RSP de presque une minute en maintenant le signal haut. Cela évite la perte de données voir de microSD.

Il y a aussi un retour d'allumage de las RSP0 par sa sortie GPIO12 (presente sur la ReSpeaker-2-Mics-Pi-HAT) connectée aussi sur l'entrée signale du MOSFET pour prendre la main sur l'alimentation et donc désarmer l'horloge. Cela permet de la reprogrammer sans couper l'alimentation. Le shutdown de la RSP descend 12 à 0 et le MOSFET coupe alors l'alimentation, en attendant un nouveau déclenchement par l'horloge ds3231.

Cartes audios

Wolfson Audio Card for Raspberry Pi

Cirrus Logic Audio Card

plus rescente qui (Cirrus ayant acheté la société Wolfson…)

mais deja plus dispo

Audioinjector

ReSpeaker-2-Mics-Pi-HAT

Hifiberry

Waveshare wm8960-audio-hat

Base SGTL5000

iqaudio

Expérience RSP ZERO W / ReSpeaker / ecasound

Après récupération d'un rasbian, http://wiki.seeedstudio.com/ReSpeaker_2_Mics_Pi_HAT/, les scriptes donnés fonctionnent bien (retour sur le kernel 4.19.75+)

/etc/rc.local

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# Print the IP address
_IP=$(hostname -I) || true
if [ "$_IP" ]; then
  printf "My IP address is %s\n" "$_IP"
fi

sleep 5

# lance esgoude
echo esgourde >> /tmp/alarm.log
su root -c /usr/local/bin/esgourde.sh &

exit 0

/usr/local/bin/esgourde.sh

#!/bin/bash
# /usr/local/bin/esgourde.sh
# script d'enregistrement automatique
#

# les sources de ALARM DUREE TEMPS ...
if [ -f /boot/esgourde.cfg ]
then
	source /boot/esgourde.cfg
else
	ALARM1=05:00:00
	DUREE=15
	TEMPS=600
	PASSBAS=10
	PASSHAUT=15000
fi

# module RCT DS3231
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
hwclock -s # ou hwclock --hctosys hard clock vers systeme

# changer heure
#hwclock --set --date "dd mmm yyyy HH:MM"
#hwclock -w # ou hwclock --systohc systeme vers hard clock

# liberer rtc du systeme
echo  0x68 > /sys/class/i2c-adapter/i2c-1/delete_device 

# GPIO12 comme temoin de fonctionnement
echo "12" > /sys/class/gpio/export                  
echo "out" > /sys/class/gpio/gpio12/direction
echo "1" > /sys/class/gpio/gpio12/value

# init RTC  heure de remise en route=demain meme heure
# set registre control 0x0E 0x05 (00000101)
if [ -z $ALARM ]; then
        echo "pas de config.cfg " >> /tmp/alarm.log
        exit
fi
# demain =  date -d tomorrow +"%d/%m/%Y"
DTDEMAIN=`date -d tomorrow +"%m/%d/%y"`
ALARM1="${DTDEMAIN} ${ALARM}"

#i2cset -y 1 0x68 0x0E 0x05
rtcctl init
sleep 1
rtcctl on alarm1
sleep 1
rtcctl set alarm1 $ALARM1
sleep 1
echo  0x68 > /sys/class/i2c-adapter/i2c-1/delete_device 
sleep 1
echo rtcctl set alarm1 "$ALARM1" >> /tmp/alarm.log

# lancement de la boucle d enregistrement
#su root -c alsactl -f alsactl_conf.ok restore # faire store avant
su pi -c /usr/local/bin/boucle_enregistre 2>&1 > /tmp/boucle.log &

# programme l arret
echo su root -c shutdown +$DUREE >> /tmp/alarm.log
su root -c shutdown +$DUREE

exit 0

/usr/local/bin/boucle_enregistre

#!/bin/bash
# les sources de ALARM DUREE TEMPS ...
if [ -f /boot/esgourde.cfg ]
then
        source /boot/esgourde.cfg
else
        ALARM1=05:00:00
        DUREE=15
        TEMPS=600
        PASSBAS=10
        PASSHAUT=15000
fi

mkdir -p /home/pi/SONS
cd /home/pi/SONS
while true
do
#arecord -d 5 -fcd esgourde_`date "+%F_%T"`.wav
# ecasound -t:duree en secondes
# ecsound -f bit,channel,rate
# -efh et -efl filtre passe haut et passe bas, fonction du micro
# -t duree d'un fichier
NOMFIC='/home/pi/SONS/'`date "+%Y%m%d_%H%M%S"`'.ogg'
export PS1='${debian_chroot:+($debian_chroot)}\u@record:\w\$'
if [ -f $NOMFIC ] ; then
        NOMFIC=${NOMFIC%.*}X.ogg
fi
ecasound -t:$TEMPS -f:16,2,44100 -efh:$PASSBAS -efl:$PASSHAUT -i alsahw,1,0  -o $NOMFIC 
#ecasound -t:6000 -f:16,2,44100 -efh:100 -efl:15000 -i alsahw,1,0  -o $NOMFIC 

sleep 10
done

Expérience RSP ZERO W / ReSpeaker / wittyPi / Gstreamer

conso 200mA sans le WiFi 340mA avec.

  • Suppression du wifi , option si on veut garder la main sur les futurs transferts samba
  • ouverture de la connexion série pour suivre le boot (pin 6,8,10)
  • en fin, une fois tout paramétré:passage du système de fichier en lecture seul (raspi-config)
apt install gstreamer1.0-alsa gstreamer1.0-tools gstreamer1.0-plugins-good flac samba samba-common 

Création d'une partition vfat sur la microSD pour le stockage SONS et modification /etc/fstab pour le montage

 /dev/mmcblk0p3 /home/pi/SONS vfat defaults,noatime,user,umask=0000 0 2

Modifications /etc/security/limits.conf

echo "
@audio           -       rtprio          99
@audio           -       nice           -10
@audio           -       memlock        unlimited
" >> /etc/security/limits.conf

Installation pour la carte Witty

cd /usr/local/bin/
wget http://www.uugear.com/repo/WittyPi2/installWittyPi.sh
sudo sh installWittyPi.sh

C'est wittyPi.sh qui permet de régler les alarmes.

4. Schedule next shutdown [?? 07:00:00]
5. Schedule next startup  [?? 05:00:00]

rc.local

/usr/bin/tvservice -o
su pi -c /usr/local/bin/esgourde_witty.sh 2>&1 >> /tmp/esgourde.log &
sudo nice -n5 /usr/local/bin/esgourde_trans.sh 2>&1 » /tmp/esgourde_trans.log & 

/boot/esgourde.cfg

#!/bin/bash
#Configuration des enregistrements
# /usr/local/bin/wittyPi.sh pour la conf des alarmes RTC
# NOM nom de la machine
NOM=esgourde1
# BOUCLE entre 2 prises en seconde
BOUCLE=900
# TEMPS d 'enregistrement pour un fichier
TEMPS=90000

# TEMPSTOT temps pour shutdown en minute
# doit etre avant extinction par wittyPi.sh
TEMPSTOT=115

# TAILLE des fichiers enregistrement en octet 1M=100000000
TAILLE=100000000
# nom des fichiers sans extention .flac
NOMFIC='/home/pi/SONS/$NOM_'`date "+%F_"`

# la commande lancee est
# gst-launch-1.0  alsasrc device=hw:1  ! audioconvert $AUDIO_CONVERT ! flacenc ! filesink location="${NOMFICTOT}.flac" &

# ESCARCELLE machine de collectage
#ESCARCELLE=toto@192.168.2.10:/var/www/html/SONS/
ESCARCELLE="sftp://toto:passblabla@192.168.2.10"
DESTINATION="/var/www/html/SONS"
PASS="&passblabla"
PORT=6123

/usr/local/bin/esgourde_witty.sh

#!/bin/bash
#set -x
# esgourde...sh enregistre du son a des heures programmees
# /boot/esgourde.cfg pour les sources de ALARM TAILLE ...
# BOUCLE en seconde
# TEMPS en milliseconde
# TEMPSTOT en minute
# il faut que BOUCLE > temps d enregistrement pour la TAILLE
# remettre a jour la date date --set 2020-MM-JJ puis date --set HH:MM
# ensuite repasser par wittyPi.sh
#
if [ -f /boot/esgourde.cfg ]
then
        source /boot/esgourde.cfg
else
        NOM=esgourde1
        NOMFIC='/home/pi/SONS/'`date "+%F_"`
        TAILLE=100000000
        TEMPS=90000
        AUDIO_CONVERT=
        BOUCLE=900
        TEMPSTOT=115
fi
sudo shutdown +$TEMPSTOT
mkdir -p -m 1777 /home/pi/SONS
mkdir -p -m 1777 /home/pi/SONS/TRANS
mkdir -p -m 1777 /home/pi/SONS/ARCHIVES

cd /home/pi/SONS

while true
do

killall gst-launch-1.0
NOMFICTOT=${NOMFIC}`date "+%H-%M"`
gst-launch-1.0 alsasrc device=hw:0 ! audioconvert $AUDIO_CONVERT ! flacenc ! filesink location="${NOMFICTOT}.flac" &
sleep $BOUCLE
killall gst-launch-1.0
mv "${NOMFICTOT}.flac" ./TRANS/

done
exit 0

esgourde_trans.sh

#!/bin/bash
cd /home/pi/SONS/TRANS
if [ -f /boot/esgourde.cfg ]
then
        source /boot/esgourde.cfg
else
        #ESCARCELLE=toto@192.168.2.10:/var/www/html/SONS/
        ESCARCELLE="sftp://toto:passblabla@192.168.2.10"
        DESTINATION="/var/www/html/SONS"
        PASS="passblabla"
        PORT=22
fi

#sudo ifconfig wlan0 up
#sleep 10
# en attente de fichier disponible
while true
do
ls  *.flac 2> /dev/null
RET=$?
if [  $RET -eq 0 ]
then
        for i in `ls -1 *.flac`
        do
        #sshpass -p $PASS rsync -az  --rsh='ssh -p $PORT' *.flac $ESCARCELLE
        lftp $ESCARCELLE -e "\
kill all; \
put -c -O $DESTINATION $i; \
bye" 2>&1 > /dev/null
        RET=$?
        if [ $RET -eq 0 ]
        then
                mv $i ../ARCHIVES/
        fi
        done
fi
sleep 60
done

exit 0

option ajout a la fin de /etc/samba/smb.conf

[share]
Comment = Pi shared SONS folder
Path = /home/pi/SONS
Browseable = yes
Writeable = Yes
only guest = no
Public = yes
Guest ok = yes

Autre

Il y a possiblité de faire

for i in `ls -1 *.flac`
do
sox $1 -n spectrogram -o $1.png
done

pour avoir les spectrogrammes des fichiers

Restafaire

  • organiser la connexion WiFi,
    • ouverture/fermeture à la demande par une telecommande (genre porte garage ou sonnette)
    • mise en place d'une hotspot hostapd
    • partage des fichiers par Samba sur ce WiFi
  • tester connexion LoRa supplémentaire (acces 1km)
    • pilotage à distance (ouverture/fermeture WiFi)
    • bilan des captations a partir de sonogramme (.png)
    • organisation d'une flotte d'esgourdes pilotées par un central

Expérience RSP ZERO W / RTC DIY / Gstreamer

Cette fois avec la carte son 2 entrées line Fe-Pi en attente de réception

Choix matériel

  1. Raspberry Pi zero W
  2. Carte d'horloge
  3. Carte sons AudioInjector (13) ou fe-pi-audio-z-v2
  1. Régulateur alimentation 5V acceptant de grande variation (hw-106 booster ou step-down) (2)
  2. Pile à dépolarisation air type cloture pour les animaux (15)
  3. paire de micro électret comme EM-172
  4. platine micro électret
    1. alimentation directement sur la batterie pour un + non parasité
    2. dessouder leurs électrets et les remplacer par les EM-172s

options:

  • plusieurs connecteurs longs
projets/esgourde2.txt · Dernière modification: 2020/03/22 13:37 par gepeto