Mastodon

Sunday 28 March 2021

PiCorder

I enjoy getting out and about when I can, nature reserves are a great place to go and I've thought a while about recording birdsong and other noises such as rivers and so on. I could use a phone but where's the fun in that and then once you get the phone out there's the distractions of social media. It's nice to leave those things behind.

I decided to knock up a sound recorder using a Raspberry Pi Zero W, it's never going to be brilliant, there's no display or controls on it so the sound is a fixed level but it had to be tried.



I got hold of one of these from Amazon, no drivers needed, just plug it in and it will work is what was said everywhere. Not quite really but in the end it wasn't too hard to get sorted.

I followed all the initial instructions and nothing happened, just an error so more searching on the Google thing found me this.


sudo nano /usr/share/alsa/alsa.conf

defaults.ctl.card 0

defaults.pcm.card 0

Change these to a 1 as shown below.

defaults.ctl.card 1

defaults.pcm.card 1

Save the file and it, sort of. Loads of noise on the recordings and suggestions of adding capacitors across the USB ports to dampen it down seemed drastic. Not a lot seemed to work, looked like it was going to be a complete failure.

So I had a poo and it came to me, first thing was get the recording level
up, I'm running everything here as root, there's nothing on here that is precious.

Run alsamixer and you should see this:

Press F4 to select the capture device and using the arrow keys increase the gain to the top as shown below.


Press escape to leave it.

As mentioned before, I was getting loads of noise when I tried this earlier, I decided to hard wire power and a record button onto the Pi, this meant soldering the power wires to the board on pins 2 and 6, you can see the complete list of pins here.

And the stop start button soldered to pins 36 and 34 (GPIO 16 and Ground)  Don't blame me if you break your Pi while doing this. 

I got hold of one of these so I could connect the mic into the Pi, no cables needed, again from them Amazon people.

Then I decided that as I wanted to keep power usage down I would disable the bluetooth connection and remove the bluetooth software.



Open the config.txt file with

sudo nano /boot/config.txt and then add this to the bottom of the file:


# Disable Bluetooth

dtoverlay=disable-bt

Save and close it then run the following to remove all the bluetooth stuff.

sudo systemctl disable hciuart.service

sudo systemctl disable bluealsa.service

sudo systemctl disable bluetooth.service

 sudo apt-get purge bluez -y

sudo apt-get autoremove -y

I rebooted and carried out a test recording and there was no electrical noise apart from the odd regular buzz, I disabled the wifi and retested and this time no noise at all.

It was now time to stick it in a box and make it work.

I needed a way of getting the files off afterwards, easiest option was install samba with 

apt install samba

Create a directory with 

mkdir /share

Open the samba config with

nano /etc/samba/smb.conf

Add the following at the bottom

[Sounds]

path = /share

public = yes

writeable = yes

browseable = yes

Restart Samba with service smbd restart


I decided to create a sound recording service with:

nano /etc/systemd/system/soundrec.service


[Unit]

Description=Sound Recording

[Service]

ExecStart=/bin/mtcapture

WorkingDirectory=/share

StandardOutput=inherit

StandardError=inherit

Restart=always

User=root

[Install]

WantedBy=multi-user.target


I'm not enabling the service to auto start

Create some files in the bin folder:

nano /bin/mtstart

#!/bin/bash

# shuts down the wifi

ifconfig wlan0 down

service soundrec start

# sleep 1

echo 0 >/sys/class/leds/led0/brightness

# Makes the green LED flash so we know it's recording

echo heartbeat >/sys/class/leds/led0/trigger


nano /bin/mtstop

#!/bin/bash

service soundrec stop

# Starts up the wifi

ifconfig wlan0 up

# sleep 1

echo 0 >/sys/class/leds/led0/brightness

sleep 3

# Leaves the green LED on so we know it's finished

echo 1 >/sys/class/leds/led0/brightness


nano /bin/mtcapture

#!/bin/bash

for (( ; ; ))

do

FILE=/share/filenum

if [ -f "$FILE" ]; then

    echo "$FILE exists."

else

    echo "$FILE does not exist."

echo "0"> /share/filenum

fi

read newfile < /share/filenum

echo $newfile

newfile=$((newfile+1))

echo $newfile > /share/filenum

arecord -f cd /share/AudioTux1-$newfile.wav

done

This increments the file number each time it's run so we can have as many files as we want until we run out of space.



You need to make all these executable with chmod +x filename


Then a little bit of python to get it working

nano record.py


# !/bin/python

import RPi.GPIO as GPIO

import time

from subprocess import call

import os

GPIO.setmode(GPIO.BCM)

GPIO.setup(16,GPIO.IN,pull_up_down=GPIO.PUD_UP)


flag = False

while True:

                input = GPIO.input(16)

                if(input == False):

                        if(flag == False):

                                print "Start"

                                os.system("/bin/mtstart")

                                flag = True

                                time.sleep(0.4)

                        else:

                                print "Stop"

                                os.system("/bin/mtstop")

                                flag = False

                                time.sleep(0.4)



Open up the rc.local file with

nano /etc/rc.local

And add the following just before the exit 0 at the bottom

python2 /root/record.py &


Then restart it, once it's up and running, pressing the button connected to the GPIO pins should start it recording. A second press will stop if, while it's recording the wifi will be disabled. If you want you can add a second button connected to pins 5 and 6 (GPIO 3 and Ground), add the following to the bottom of the /boot/config.txt file.

dtoverlay=gpio-shutdown

Reboot and on press on the button will shut the pi down, a second press will restart it.


Here's the finished item, it's not overly pretty as I got the wrong case but it works, the USB mic at the top can be unplugged and put on an extension cable and possibly fitted into a parabolic dish, but that's for another time.


It does work, seems to take ages to start recording as the service has to start and once started it then takes ages to stop the service.

It needed a rethink and so was born "PiCorder, the Next Generation"

Instructions are here.



Some more Pi

 Been a while since I've done anything on here, let's face it 2020 was a washout and the first bit of 2021 has gone that way too. It does mean that things at home have come higher up the list of things to do and one of those things was to add a camera to a Raspberry Pi, point it at the sky and take pictures. The main idea was to get some shots of the stars moving but the clouds looked interesting too.

The first attempt was a quick lash up stuck in a plastic bag to give it some water proofing and put on the floor in the garden out of site of the street light at the back. This was a Raspberry Pi 2 and the version 1 camera which can go down to about a 6 second exposure, nothing lower than that so the stars didn't really stand out that well and there is a lot light pollution too.

Here's my first test, not great but it seems to show a bit of promise if we can get a clear night and even more so if we could try somewhere with a darker sky.


The other plan or project was a camera at the from of the house which apart from doing some timelapse would also take a picture every day at dawn, noon and sunset for a year from the 21st of March. For no other reason than it can be done. The noon bit was fairly straight forward, the sunrise and sunset were going to be harder. Until I came across something called "Heliocron". You can use this app to run a task at various times of the day and it calculates sunrise and sunset for you. Many thanks to the author for this.

Let's get started with my SkyCam as I call it, to run properly the Raspberry Pi needs a connection to a network so it can get the correct time. I have a plan B for a travel version but I'll come back to that.

I'm going to build this with a Raspberry Pi 3, a version 2 camera which gives 8Mp and shutter speeds down to 10 seconds. I need a waterproof case so I can stick it outside and a power and ethernet lead out of it. There will be some code which I've borrowed and modified from various searches, I can't remember where I got them but if it's yours then it's much appreciated.

This may not be the best way of doing it but it seems to work.

The finished article looks like this, I've managed to find an old Tripod bush so I can mount it outside and adjust the position.

Using the above mentioned Heliocron, it changes the exposure settings as it gets darker and lighter to keep some detail. I'm not clever enough to get it to take a measurement and do it automatically.



The script that will be taking the pictures is called:

mtshutter

There's going to be a couple of versions of it called mtday, mtdusk, mtearly and mtnight.

I stick the mt in front as it makes them easier to find.

I'm storing them in the /bin folder, I can't see any reason as to why not but if I'm wrong I'm sure somebody will tell me.

They all look fairly similar except for the picture taking settings, starting with mtshutter:


The pictures once taken are stored on a small file server mounted at /mnt/webcam in their own folder called skycam1, there may be another one in the future. You can of course change the location to wherever you want.




#!/bin/bash

DATE=$(date +"%Y-%m-%d_%H%M%S")

raspistill -awb auto -bm -q 95 -w 3280 -h 2464  -o /mnt/webcam/skycam1/SkyCam1-$DATE.jpg





mtearly

#!/bin/bash


DATE=$(date +"%Y-%m-%d_%H%M%S")

raspistill -awb auto -bm -q 95 -w 3280 -h 2464 -ISO 300 -ss 8000000 -o /mnt/webcam/skycam1/SkyCam1-$DATE.jpg


mtday


#!/bin/bash


DATE=$(date +"%Y-%m-%d_%H%M%S")

raspistill -awb auto -bm -q 95 -w 3280 -h 2464  -o /mnt/webcam/skycam1/SkyCam1-$DATE.jpg


mtdusk

#!/bin/bash


DATE=$(date +"%Y-%m-%d_%H%M%S")

raspistill -awb auto -bm -q 95 -w 3280 -h 2464 -ISO 100 -ss 10000000 -o /mnt/webcam/skycam1/SkyCam1-$DATE.jpg


And finally mtnight

#!/bin/bash


DATE=$(date +"%Y-%m-%d_%H%M%S")

raspistill -awb auto -bm -q 95 -w 3280 -h 2464 -ISO 800 -ss 10000000 -o /mnt/webcam/skycam1/SkyCam1-$DATE.jpg



Make these executable with chmod +x /bin/mtshutter and so on. All these do is take one picture, which isn't much use for a timelapse camera.

Next we make a script to continually take pictures


This is mttakepic


#!/bin/bash


for (( ; ; ))
do

sh /bin/mtshutter

done


All it does is continually call the mtshutter script

We can get this running as a service on startup by creating another file:

 nano /etc/systemd/system/takepics.service

Paste this into it

[Unit]
Description=Take Pictures
After=network.target

[Service]
ExecStart=/bin/mttakepic
WorkingDirectory=/mnt/webcam
StandardOutput=inherit
StandardError=inherit
Restart=always
User=root

[Install]
WantedBy=multi-user.target

And activate it with systemctl enable takepics.service


All that will happen  now is the service will start, take some pictures, it will get dark and you won't see anything till it gets light again, this is where the other files come in to play.

At the moment we are running the daytime script, as it gets darker we need to shift to the dusk option.

nano /bin/duskmode

#!/bin/bash
echo "Dusk Mode" > ~/mode.log
service takepics stop
sleep 1
cp /bin/mtdusk /bin/mtshutter
service takepics restart
sleep 1


Then 

nano /bin/nightmode

#!/bin/bash
echo "Night Mode " > ~/mode.log
service takepics stop
sleep 1
cp /bin/mtnight /bin/mtshutter
service takepics restart
sleep 1


nano /bin/earlymode

#!/bin/bash
echo "Early Mode" > ~/mode.log
service takepics stop
sleep 1
cp /bin/mtearly /bin/mtshutter
service takepics restart
sleep 1


nano /bin/daymode

#!/bin/bash
echo "Day Mode" > ~/mode.log
service takepics stop
sleep 1
cp /bin/mtday /bin/mtshutter
service takepics restart
sleep 1

You will need to get Heliocron now which can be found here

I've made it executable and again put it in the /bin folder.

Now run crontab -e

# Change to early light
1 2 * * * /bin/heliocron --latitude 51.6214N --longitude 3.9436W wait --event nautical_dawn && /bin/earlymode

# Normal Daylight
15 2 * * * /bin/heliocron --latitude 51.6214N --longitude 3.9436W wait --event civil_dawn && /bin/daymode

# Getting Dark
05 10 * * /bin/heliocron --latitude 51.6214N --longitude 3.9436W wait --event civil_dusk && /bin/duskmode

# Dark
02 10 * * * /bin/heliocron --latitude 51.6214N --longitude 3.9436W wait --event nautical_dusk && /bin/nightmode

These are coordinates for Swansea, you will need to get yours for it to work properly.

At certain time of the day, the mtshutter will be overwritten and hopefully, we'll get a proper series of pictures which can then be compiled into a timelapse movie.


I've used mencoder to do it, you can install it with sudo apt install mencoder, I've got another script called mttimelapse which consists of the following.

#!/bin/bash
echo "Creating list of pictures"
ls *.jpg > stills.txt

echo "What device are these imaged from ?"
read camname


DATE=$(date +"%Y-%m-%d_%H%M")

mencoder -nosound -ovc lavc -lavcopts vcodec=mpeg4:aspect=16/9:vbitrate=8000000 -vf scale=1920:1080 -o /mnt/webcam/TimeLapse/$camname-$DATE.avi -mf type=jpeg:fps=24 mf://@stills.txt

It creates a list of pictures, asks you for a camera name and then compiles them into a movie that looks like this:


As soon as I have some decent shots and a clear night I'll upload a completed sequence.