Pi Zero W
I got the first Pi Zero because I wanted to play with a webcam. Silly me I have not used the camera yet. I tested it, it works.
2021-01-30 Now I am trying to interface it to an ESP8266 today.
The first Pi Zero has the cute C4Labs Zebra Zero+ protoboard setup from Adafruit at the same time so I named it "Zebra".
First boot
- Plug in a cable to the Windows machine and see if it recognizes the Pi Zero as a smoke test.
- Download Raspberry Pi OS LITE image from https://www.raspberrypi.org/downloads/
- Download Raspberry Pi Imager.
- Run the imager to copy image to a 32GB card.
- While waiting, dig up the HDMI cable and USB keyboard.
- Discover there are many connectors in the world and they used an HDMI I don't have.
- Order a Type A (std HDMI) to Type C (Mini) cable. Note the BeagleBone Black uses Type D (Micro).
- Wait a few days. (11/26/18 cable arrived and works)
- OR use headless mode https://learn.adafruit.com/raspberry-pi-zero-creation/text-file-editing
- Configure the WiFI by editing wpa_supplicant.conf (see next section)
- OR BLUETOOTH headless mode!! I like this idea, I will try it tonight!
- Transfer card to Pi
- Connect HDMI monitor and USB keyboard if you go that route.
- Power on via a cellphone charger and a generic micro USB cable, everyone has those!
- Log in as "pi" with password "raspberry"
- Change the password! Do this by running raspi-config and setting everything else up, too.
Headless mode
Overview:
- Enable WiFI so card comes up on network.
- Enable ssh so I can log in.
Put the SD card in the Mac. Create these files.
cd /Volumes/boot touch ssh vi wpa_supplicant.conf
REMEMBER Pi Zero W is a 2.4 GHz ONLY radio!!! No 5 Ghz!
wpa_supplicant.conf should contain
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 country=US network={ ssid="YOURSSID" psk="YOURPASSWORD" }
The wpa_supplicant.conf file gets moved on boot so don't freak if it "disappears".
Remember to update the dnsmasq settings on Bellman to issue it a proper IP address.
ssh pi@zebra pi@zebra's password: ''raspberry'' Linux raspberrypi 4.14.79+ #1159 Sun Nov 4 17:28:08 GMT 2018 armv6l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. SSH is enabled and the default password for the 'pi' user has not been changed. This is a security risk - please login as the 'pi' user and type 'passwd' to set a new password. pi@raspberrypi:~$
and there was much rejoicing... seconds later, I realized that I cannot show it off because there are no LEDs to blink, no beeper, just this cold dead looking thing... anticlimax hits.
Serial console: I did not add enable_uart=1 to config.txt because I don't need it right now.
Serial console
This works for any Pi including my older Model B which has no built in WiFi or Bluetooth
- Install driver for Mac
- Add "enable_uart=1" to config.txt in the DOS boot partition
- Connect
- Connect USB to Mac
- Start a session with screen /dev/cu.SLAB_USBtoUART 115200
- Power up PI
- Observe and rejoice:
[ 7.878533] sysrq: SysRq : Resetting [ 7.883666] CPU2: stopping [ 7.888170] CPU0: stopping [ 7.892645] CPU1: stopping Raspbian GNU/Linux 9 raspberrypi ttyAMA0 raspberrypi login: pi password: raspberry
Bluetooth console headless mode
Mostly from https://hacks.mozilla.org/2017/02/headless-raspberry-pi-configuration-over-bluetooth/
Edit the disk image on a Mac using Vagrant. (We can't directly mount and modify an IMG file in EXT4FS)
- Unzip the downloaded Raspian image, the .img will be modified before transferring to SD.
- Start up a vagrant engine.
- mkdir debian && cd debian
- vagrant init debian/stretch64
- Edit VagrantFile to share Downloads folder
- vagrant up
- vagrant ssh
- Mount the IMG file
- List the partitions using fdisk -l *.img
- Calculate the offset using bc 512*start
- Mount the EXT4 partition. mount -v -o offset=XXXXXXX *.img /mnt
- cd /mnt
- Edit away.
- Enable ssh.
cd /etc/rc3.d && ln -s ../init.d/ssh S01ssh
- sudo vi home/pi/btserial.sh
- chown 1000.1000 home/pi/btserial.sh
- vi etc/rc.local
- add line: sh /home/pi/btserial.sh
- Change gb to us in /etc/default/keyboard and /etc/default/locale
- Edit wpa_supplicant.conf as above
- Enable ssh.
- Unmount the image; cd / && umount /mnt/root
- Shutdown the vagrant machine: vagrant halt
- Copy the image to a card using Etcher.
After booting the Pi connect on Bluetooth or SSH and then run updater and raspi-config.
btserial.sh:
#!/bin/bash -e echo PRETTY_HOSTNAME=zebra > /etc/machine-info # Edit /lib/systemd/system/bluetooth.service to enable BT services sudo sed -i: 's|^Exec.*toothd$| \ ExecStart=/usr/lib/bluetooth/bluetoothd -C \ ExecStartPost=/usr/bin/sdptool add SP \ ExecStartPost=/bin/hciconfig hci0 piscan \ |g' /lib/systemd/system/bluetooth.service # create /etc/systemd/system/rfcomm.service to enable # the Bluetooth serial port from systemctl sudo cat <<EOF | sudo tee /etc/systemd/system/rfcomm.service > /dev/null [Unit] Description=RFCOMM service After=bluetooth.service Requires=bluetooth.service [Service] ExecStart=/usr/bin/rfcomm watch hci0 1 getty rfcomm0 115200 vt100 -a pi [Install] WantedBy=multi-user.target EOF # enable the new rfcomm service sudo systemctl enable rfcomm # start the rfcomm service sudo systemctl restart rfcomm
Set up a new Zero
sudo -s apt update apt upgrade reboot apt install emacs-nox
LCD set up
This article shows the settings that work for my Adafruit 5" LCD with its attached HDMI decoder. Setting Up an 800X480 5inch HDMI LCD for Raspberry Pi
Add swap space
Edit /etc/dphys-swapfile and change CONF_SWAPSIZE I changed it from 100 to 1000 so that I can run a compiler SLOWLY but have it not crash.
Fix the various settings
You can run raspi-config to set the hostname, locale, keyboard, and time zone; this is easier than poking around in the various configuration files.
Bluetooth set up
Look up this article: https://www.cnet.com/how-to/how-to-setup-bluetooth-on-a-raspberry-pi-3/ and read the Terminal section. Works like a champ. I paired with an Apple keyboard.
sudo bluetoothctl agent on default agent scan on
Watch for the keyboard to show up, then enter
pair XX:XX:XX:XX:XX
If the keyboard is in pairing mode, then you will be prompted to enter the secret code on the keyboard. Enter the numbers and then hit Enter. The keyboard should pair. Not sure if you have to do the next step,
connect XX:XX:XX:XX:XX
but anyway then the keyboard should start
http://wiki.debian.org/BluetoothUser
Make the settings sticky.
Camera notes
Enable camera and reboot:
raspi-config reboot
Test camera: raspistill -o foo.jpg
Red Bear IoT pHAT board
I got one of these for my Model 3 B, so that it can have WiFi and Bluetooth too! I have not set it up yet. It was on sale for $5, I could not pass it up.
I2S audio
I am working to get the MEMS Mic and the I2S Bonnet to work at the very same time. So far only the bonnet works.
https://raspberrypi.stackexchange.com/questions/90647/i2s-recording-combined-with-i2s-playback
Microphone
Adafruit has a nifty I2S MEMS microphone breakout, get 2 for stereo! ;-) about $7
Using the mic with RPi: https://github.com/nejohnson2/rpi-i2s
DAC
Adafruit has an I2S audio DAC bonnet with 3.5mm/rca line outs. About $10, they also have a $7 breakout board using the same DAC if you don't want a bonnet.
While you are shopping at Adafruit consider this "20W" class D stereo amp for $20.
See HiFiBerry for more interesting choices for audio output.
Pimoroni Inky pHAT
RED/BLACK/WHITE electronic paper, which I intend to use with a Pi Zero W. Might use as part of my boombox project. First though I am building a Pi clock.
Setting up OpenCV
After 20 hours compiling opencv, Pi ran out of memory. I had to bump up swap space from 100MB to 1024 and start again.
Don't try to build on the Zero. Use a real computer. :-) In my case Bellman with an Intel NUC with an i5 4 core CPU. After getting a card set up on the Zero, shutdown and move it to a USB card reader. Put that on the Linux box.
I found a tip searching Stack Exchange and build these instructions.
sudo apt-get install -y qemu qemu-user-static binfmt-support sudo mkdir /media/sdcard sudo mount /dev/sdc2 /media/sdcard sudo mount /dev/sdc1 /media/sdcard/boot sudo cp /usr/bin/qemu-arm-static /media/sdcard/usr/bin/ sudo chroot /media/sdcard bash --login root@bellman:/boot# uname -a Linux bellman 5.4.0-84-generic #94-Ubuntu SMP Thu Aug 26 20:27:37 UTC 2021 armv7l GNU/Linux
Awesome, Bellman now thinks he is a Raspberry Pi.
root@bellman:/etc/apt# apt update Get:1 http://packages.microsoft.com/repos/code stable InRelease [10.4 kB] Get:2 http://archive.raspberrypi.org/debian buster InRelease [32.7 kB] Get:3 http://raspbian.raspberrypi.org/raspbian buster InRelease [15.0 kB] . . .
Once the SD card is mounted and we're chroot'ed, we can just proceed as if we're running a pi.
Following instructions were cribbed from https://www.pyimagesearch.com/2016/04/18/install-guide-raspberry-pi-3-raspbian-jessie-opencv-3/ but so far are still working on buster.
All this just to allow building from source... at least it's happening now at Core i5 speed with 32GB of ram.
apt -y install git cmake pkg-config apt -y install libjpeg-dev libtiff5-dev libpng-dev \ libavcodec-dev libavformat-dev libswscale-dev libv4l-dev \ libxvidcore-dev libx264-dev libgtk2.0-dev apt -y install libatlas-base-dev gfortran \ python2.7-dev python3-dev python3-setuptools
This part is for either source build or pip install
apt -y install libhdf5-dev libhdf5-serial-dev libwebp-dev \ libqtwebkit4 libqt4-test \ python3-pip
When working in chroot'ed environment at this point, I can drop root privileges by changing to the user 'pi', so that I can use virtualenv properly. Sort of the opposite of "sudo".
su - pi pi@bellman:~$ pwd /home/pi
My instructions used to say to install virtualenv here, but I prefer conda, so I am going to try using it instead. I installed it at /opt/miniconda3 instead of /root/miniconda3.
wget http://repo.continuum.io/miniconda/Miniconda3-latest-Linux-armv7l.sh sudo bash Miniconda3-latest-Linux-armv7l.sh
I added this to /home/pi/.bashrc myself: "export PATH=/opt/miniconda3/bin:$PATH:/home/pi/.local/bin", then I restarted the shell and made an env. If I don't specify a version, it will give me python 2.7, ick! And then the pip upgrade fails too. And the version available is 3.4, which is also too old. Conda is turning out to be a pain on the Pi.
conda create --name=opencv python=3.4.3
The "latest" version of conda for arm is apparently quite old so the "conda activate" command does not work. Instead, use
source activate opencv which python /home/pi/.conda/envs/opencv/bin/python
Pip suggested doing this, which screws things up "pip install --upgrade pip". I found python 3.4 was TOO OLD!! So here we go down the Linux rabbit hole, installing 3.9. I followed the lead from Theo, thanks whoever you are, https://itheo.tech/install-python-3-9-on-raspberry-pi Go have coffee while configure and make do their work.
sudo apt-get install -y build-essential tk-dev libncurses5-dev libncursesw5-dev libreadline6-dev libdb5.3-dev libgdbm-dev libsqlite3-dev libssl-dev libbz2-dev libexpat1-dev liblzma-dev zlib1g-dev libffi-dev wget https://www.python.org/ftp/python/3.9.7/Python-3.9.7.tar.xz tar xvf Python-3.9.7.tar.xz ./configure --prefix=/opt/python-3.9.7 make -j 4
At this point I'm thinking I should mount an SSD on this machine to make it go faster before I do the opencv build, the SD card is slowing me down. Fortunately I have some yard work to do.
Okay, I have a "workspace" ssd on Bellman that is unused mounted at /workspace so I did this
cd /media/sdcard sudo cp -rp home_real/pi /workspace sudo touch /workspace/pi/THIS_IS_THE_SSD_DRIVE sudo mount --bin /workspace /media/sdcard/home
This masks the /home drive but that's okay for now. It should speed up the builds.
Now trying this again with a newer python...works now
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py python get-pip.py
I want to make sure conda will use my new python so I change the links there.
cd /opt/miniconda3/bin sudo rm python python3 ln -s /opt/python-3.9.7/bin/python3.9 python ln -s /opt/python-3.9.7/bin/python3.9 python3
pip install numpy
On subsequent logins, you will need to start the environment again
source activate opencv
In one line, install the entire OpenCV package and skip 20 hours of compilation.
pip install opencv-contrib-python-headless
This fails, because there is a library missing.
ImportError: libImath-2_2.so.12: cannot open shared object file: No such file or directory
Build commands
Get the source
wget -O opencv.zip https://github.com/opencv/opencv/archive/4.0.0.zip unzip opencv.zip wget -O opencv-contrib.zip https://github.com/opencv/opencv_contrib/archive/4.0.0.zip unzip opencv-contrib.zip
Set up the makefile
cd opencv-4.0.0 mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local \ -D INSTALL_PYTHON_EXAMPLES=ON \ -D OPENCV_EXTRA_MODULES_PATH=~/opencv_contrib-4.0.0/modules \ -D BUILD_EXAMPLES=ON ..
Do the actual build, it will take about 21 hours on a Pi Zero. Do more than just drink coffee. :-)
make sudo make install sudo ldconfig cd /usr/local/python sudo python3 setup.py install
While I was waiting for the build on the Pi, I installed OpenCV from source on Bellman and plugged in a spare webcam. :-)
- Zebra: 1290 minutes (21 hours), with 'make' (just one CPU)
- Bellman: 48 minutes with 'make -j 8'
- Murre: 5 minutes with 'make -j 20' (10 hyperthreaded cores) more than 250 times as fast as a Pi Zero. :-)
Zebra is at 14% and for testing on Murre I had time to eat Thanksgiving dinner, then download and install the build toolchain, download sources, and do the build on Murre. I could hear the fans speed up on Murre, the first time ever.
or Cross compile BUILD on a REAL computer
Have not tried this yet though I probably have time...
Now for the app software
https://github.com/HackerShackOfficial/Smart-Security-Camera
MotionEyeOS https://www.raspberrypi-spy.co.uk/2017/04/raspberry-pi-zero-w-cctv-camera-with-motioneyeos/
MotionEye on Raspian https://www.techcoil.com/blog/how-i-setup-a-raspberry-pi-zero-w-cctv-camera-with-motioneye-and-raspbian-stretch-lite/
Built into a dummy camera case: https://www.instructables.com/id/Zero-Security-Camera/ Pi Zero (not wireless) + USB - LAN adapter
Cool 3D-printed case: https://www.thingiverse.com/thing:2544275