A python MPD client that handles speaker powering, oled display and physical user input (i.e; buttons)
Go to file
ABelliqueux 3afc1555f4 Fix readme 2024-12-19 18:09:08 +01:00
DejaVuSansMono.ttf Fix UI, use DejaVuMono 2024-03-24 21:11:20 +01:00
mpdlisten.py Use rpi-rotary-encoder library 2024-12-19 17:54:38 +01:00
mpdlistenpy.service Use rpi-rotary-encoder library 2024-12-19 17:54:38 +01:00
mpdlistenpy.sh Use rpi-rotary-encoder library 2024-12-19 17:54:38 +01:00
pot_cap.py Add pot volume 2024-03-27 11:36:20 +01:00
readme.md Fix readme 2024-12-19 18:09:08 +01:00
rot_lib.py Use rpi-rotary-encoder library 2024-12-19 17:54:38 +01:00

readme.md

mpdlistenpy

This python script is supposed to run on a rpi and does the following :

  • Relay trigger : Watches a MPD instance for play/pause/stop states and activates a relay via GPIOs accordingly ; the usecase for this is powering on/off a pair of speakers only when something is running.
  • OLED display : Drives a 0.96" OLED display (ssd1306) to display MPD status (volume, current artist, album, title...)
  • Button input : watches GPIOs for button input ; I'm using 5 push buttons for controlling playback (previous, next, toggle playback, stop, menu) or browse the database and add stuff to the playlist.
  • Rotary encoder for volume control.

Setup

Software

  1. Install the latest light version of Raspberry Pi OS and run it on the RPI model of your choice.
  2. Install the following dependencies (these are for mpd, the python script and filesystem handling):
sudo apt install --no-install-recommends --no-install-suggests mpd gvfs-fuse gvfs-backends gvfs libglib2.0-bin python3-musicpd  python3-luma.oled i2c-tools python3-pil libjpeg-dev zlib1g-dev libfreetype6-dev liblcms2-dev libopenjp2-7 libtiff5-dev exfat-fuse
  1. Configure '~/.config/mpd/mpd.conf' as you please and enable mpd systemd unit :
systemctl --user --full enable mpd
  1. See Installing the systemd service for installing the mpdlistenpy systemd service and start/enable it.
  2. See Automounting Samba shares on startup for setting up an automount service and start/enable it.

Hardware

Overall GPIOs usage

FUNCTION GPIO #
OLED GND, 3.3V, 2(SDA), 3(SCL)
5 BUTTONS GND, 7, 8, 9, 11, 25
POTENTIOMETER GND, 3.3V, 23
ROTARY ENCODER GND, 3V3, 27, 22

You can check these here : https://pinout.xyz/

Oled screen

Using the SSD1306 OLED screen involves a few steps described here :

https://luma-oled.readthedocs.io/en/latest/hardware.html

and here :

https://luma-oled.readthedocs.io/en/latest/software.html

Once you've gone through these steps, you should be good to go.

Relay circuit

We're using the circuit described on projects-raspberry.com :

Components
  • 5V DC coil relay
  • BC337 NPN transistor
  • 1N4002 diode
  • 1KΩ resistor
Diagram

https://web.archive.org/web/20240217011938/https://projects-raspberry.com/raspberry-pi-driving-a-relay-using-gpio/

source: https://projects-raspberry.com/raspberry-pi-driving-a-relay-using-gpio/

Buttons circuit

Dead simple way described here, using a common GND, and 1 GPIO/button :

http://razzpisampler.oreilly.com/ch07.html

The only difference is the addition of a resistor on the GND rail.

If you're short on GPIOs, there is a way to use a single GPIO for multiple buttons based on resistance described here :

https://www.instructables.com/RaspberryPi-Multiple-Buttons-On-One-Digital-Pin/

Potentiometer circuit

Using https://github.com/Tr3m/rpi-rotary-encoder, we can use a 3-pins rotary encoder to control volume.

Wiring
ENCODER RPI GPIO #
GND GND
+ 3V3
CLK 27
DT 22

Optional steps

Installing the systemd service

  • Copy the provided service file 'mpdlistenpy.service' to '~/.config/systemd/user/mpdlistenpy.service'.
  • Update, enable and start the service as a user :
 # If you need to edit the path to the script (should be in ~/mpdlisten by default)
 # systemctl --user --full edit mpdlistenpy.service
 systemctl --user daemon-reload
 systemctl --user enable mpdlistenpy.service
 systemctl --user start mpdlistenpy.service

Automounting Samba shares on startup

If you want to setup a systemd service that mounts smb shares on startup, follow these instructions :

Automount SMB shares on startup

source : https://root.nix.dk/en/utility-scripts/mount-samba-share-as-user

Automounting USB

https://gist.github.com/zebrajaeger/168341df88abb6caaea5a029a2117925