Raspitone:easy to Use Jukebox

by ankou22 in Circuits > Raspberry Pi

554 Views, 2 Favorites, 0 Comments

Raspitone:easy to Use Jukebox

20190905_170608[1].jpg

Hello, my next project is, as I use to do, a not very useful project :

This a jukebox based on a Raspberry 3 B+

I know , something like this can be easily done with a smartphone and a Bluetooth speaker.

But for my project, I had two hard prerequisites:

I wanted to make something "vintage".

And overall, given the fact that my lady is definitively hopeless for computer or bluetooth or anything else from 21th century,(and even 20th), I had to do something very simple to use.........

So,the specifications were as follow:

One single push button to start the machine

A touch screen (very simple) to manage the music.

A single touch on the screen to stop the machine.

And to have a good sound .........

Supplies

For this I used:

1 Raspberry 3 B+

1 old home cinema that was useless due to DVD reader OOS (an old Samsung 2.1 with a woofer and 2 speakers that I modified to fit to the box)

1 HIFIBERRY DIGI+ board (with optical output for the power Amp)

1 capacitive touch screen 7" (mine is Makeasy for raspberry with HDMI input and powered via USB but any HDMI touch screen should be OK)

1 power suplly 5V 5A

1 relay shield

1 Arduino nano to manage the power ON/OFF process

1 IR led to drive the home cinema (led driven by a 2N2222 NPN transistor)

1 IR receiver (for the IR codes learning part of the project, I get mine from an old Multimedia hard disk with remote command)

3 led's

1 switch for maintenance mode

1 switch for working on the arduino (during the upload the arduino is reseted)

some JST and Dupont connectors

And for the box

Wood and plywood (but I will not describe deeply the making of the box). just to say that, regarding the boomer inside the box, 10 mm plywood and 18 mm wood are mandatory if you don't want to see the Jukebox crossing the living room while playing !!!!

Raspberry Part Description:

The Raspi has to manage different things:

1) the commands to the home cinema (via IR remote)

2) the music files

3) the touch screen

4) The heartbeat to the Arduino (wich manage the Wdt (watch dog timer))

I started from a Raspbian strech distribution on a 16 G SD card (As we will only read files from the SD card , the use of a HDD is not necessary). I will not spend time on this part as the web is full of tuto about it..

Let's see the different parts in the next steps....

The IR Remote Codes

As I could'nt find the circuit plan of the home cinema, I decided to drive it via remote commands

The first step I had to complete was to learn to Raspi the codes of the Home cinema remote command.
for that I used the very good tuto in Instructables from Austin Stanton IR codes

I had some differences, probably due to new version as the instructables is rather old, the hardware.conf file no longer exists (at least I didn't find it)

It seems also that the transistor used in the tuto is a PNP transistor ,for my part I used a 2N2222 which is NPN but the result is the same.(except the cabling !!!!!!!!)

The pin assignment is given in /boot/config.txt:

#autorisation de lirc le 08/07/2019
dtoverlay=lirc-rpi,gpio_out_pin=22,gpio_in_pin=23

The IR LED will be so connected to pin22 of the Raspi.

One important remark : when learning the codes to Raspi it is mandatory to use the keywords listed in the command

irrecord --list-namespace

Here is the file I built for my jukebox:

pi@raspitone:/etc/lirc $ cat lircd.conf

# Please take the time to finish this file as described in # https://sourceforge.net/p/lirc-remotes/wiki/Check... # and make it available to others by sending it to # #

# This config file was automatically generated

# using lirc-0.9.4c(default) on Thu May 9 17:33:37 2019 # Command line used: -d /dev/lirc0 /root/lircd.conf

# Kernel version (uname -r): 4.14.98-v7+ # # Remote name (as of config file): jukebox

# Brand of remote device, the thing you hold in your hand: # Remote device model nr:

# Remote device info url:

# Does remote device has a bundled capture device e. g., a

# usb dongle? :

# For bundled USB devices: usb vendor id, product id

# and device string (use dmesg or lsusb):

# Type of device controlled

# (TV, VCR, Audio, DVD, Satellite, Cable, HTPC, ...) :

# Device(s) controlled by this remote:

begin remote

name jukebox

bits 16

flags SPACE_ENC|CONST_LENGTH

eps 30

aeps 100

header 4470 4496

one 542 1693

zero 542 581

ptrail 553

pre_data_bits 16

pre_data 0xC2CA

gap 107863

toggle_bit_mask 0x0

frequency 38000

begin codes

KEY_POWER 0x807F

KEY_AUX 0x8877

KEY_VOLUMEUP 0xCC33

KEY_VOLUMEDOWN 0xDC23

end codes

end remote

As you can see, I just need 4 commands to drive the Home Cinema

Power (ON/OFF)

AUX => to switch to the optical input channel (as the HC always starts on DVD reader)

And Volume +/-

The related commands are executed via the LIRC commands :

for example: "irsend SEND_ONCE jukebox KEY_VOLUMEUP"

Main Programm

The main programm is written in Python :

As I am new in Python I guess there is a lot of improvement that can be done , but it runs....

The specifications:

1) manage the graphical screen:

For this , I used APPJAR which is TKINTER but civilized for student (my case) , this means much easier to use , probably with less possibilities, but it was enough for my purpose.

2) play the mp3 files:

I used mplayer for python.

3) generate random numbers for playing in shuffle mode:

As I didn't want to hear the same song every quarter, I built a small programm to check if the number was not present in the x previous numbers list (x depending on the length of the playlist).

The randint function in python is not so "random" as far as I saw.

4) send the "heartbeat" to the Arduino

5) manage files player:

As Mplayer is asynchronous, when the file is started there is no way to know for Python when it's finished (at least I didn't find a simple way)

To resolve that I used the mplayer commands giving the length of the file and the progress in the current file

For both 4 and 5 I used the possibility given by Appjar to generate a periodic task (as appjar is an event programm this is a way to create a periodic event). the function is:

#******************* start taskman **********************
app.registerEvent(taskman)

p.setPollTime(1000)

Taskman for "task manager" which is a def in the programm that manage all what is not screen events (end of the played file, populate progress bar, send heart beat to Nano,....)


Once started the screen looks like this:

Here is the programm:(can be opened via Notepad++ or Geany)

Downloads

Raspberry Part :autostart and Adding New Files

If you look at the programm you can see that I use some bash files :

1) Start_jukebox :

In fact the purpose is to power on the Home cinema and to shift to the D.IN input (optical input in my Home cinema)

pi@raspitone:/bin $ cat start_jukebox
#!/bin/bash

irsend SEND_ONCE jukebox KEY_POWER

sleep 7

irsend SEND_ONCE jukebox KEY_AUX

sleep 2

2) stop_jukebox:

To power Off the Home cinema

pi@raspitone:/bin $ cat stop_jukebox

#!/bin/bash

irsend SEND_ONCE jukebox KEY_POWER

These two bash files are called by Python with the os.system command

To start the Python script I made a small bash :

pi@raspitone:~ $ cat dem_jukebox.bash
#!/bin/bash

cd /home/pi

python jukebox_gui.py

For the auto start in GUI mode I just modified the autostart file in /etc/xdg/lxsession/LXDE-pi

pi@raspitone:/etc/xdg/lxsession/LXDE-pi $ cat autostart
@lxpanel --profile LXDE-pi

@pcmanfm --desktop --profile LXDE-pi

@xscreensaver -no-splash

@lxterminal --command="dem_jukebox.bash"

point-rpi

Adding new mp3 files:

To add new files , I preferred to make a small dedicated Python script :

new_song_file.py

I will first explain the system files organization :

All the files are in /home/pi

mp3 files are strored in /home/pi/Music directory

Each artist has his own sub directory hosting the related mp3 files

pi@raspitone:~/Music/Mike_oldfield $ ls -l
total 760516

-rwxr----- 1 pi pi 2254923 juin 30 2017 A_New_Beginning.mp3

-rwxr----- 1 pi pi 2691736 juin 30 2017 Arrival.mp3

-rwxr----- 1 pi pi 8383244 juin 30 2017 Ascension.mp3

-rwxr----- 1 pi pi 5410816 juin 30 2017 Blue_Night.mp3

-rwxr----- 1 pi pi 13125199 juin 30 2017 Castaway_(Instrumental).mp3

-rwxr----- 1 pi pi 12903583 juin 30 2017 Castaway.mp3

-rwxr----- 1 pi pi 2969869 juin 30 2017 Celt.mp3

-rwxr----- 1 pi pi 9047745 juin 30 2017 Chariots_(Instrumental).mp3

-rwxr----- 1 pi pi 9403263 juin 30 2017 Chariots.mp3

In the directory Documents we can find the built list of files to play.

pi@raspitone:~/Documents $ cat list.txt
Franz_Ferdinand/Michael_live.mp3

Franz_Ferdinand/evil_and_a_heathen.mp3

Franz_Ferdinand/Walk_Away_live.mp3

Franz_Ferdinand/love_and_destroy.mp3

Franz_Ferdinand/his_fffire.mp3

Franz_Ferdinand/eleanor_put_your_boots_on.mp3

Franz_Ferdinand/missing_you.mp3

Franz_Ferdinand/this_fire_(playgroup_remix).mp3

Franz_Ferdinand/Jacqueline.mp3

We also can find the playlists data (but this is built by the Python script)

The small Python script adds the new songs, saved in Music, in the list.txt after having formatted the tittles in UNIX format

Here is the script:(can be opened via Notepad++ or Geany)

Downloads

The Power Management Via Arduino Nano

As I wanted to have something easy to start, I decided to make it done by a small nano:

The principle:

When pushing the start button the devices are all powered , the nano starts (1 or 2 seconds ) and takes over the power management by triggering a relay which shunts the push button contacts.

Then Nano waits for 35 seconds to receive the heartbeat from Raspberry (means that start process is complete and the jukebox programm runs).

As long as nano receives the heartbeat it keeps the relay on (Watch dog timer)

If no heartbeat anymore (means the jukebox programm is stopped) Nano waits for 20 seconds (to be sure that the raspi is completely stopped) to release the power relay .

The jukebox is then totaly powered Off

I added a switch to activate an input of the nano to indicate maintenance mode (I use the jukebox to manage my other raspi servers via ssh et vnc) . Nano then deactivates the watch dog process

Remark:

the input for the heartbeat from Raspi needs to be pulled down (but the 3.3V from Raspi is considered as high level by Nano)

It could be done with NE555 but I am lazzy and have always some nano's in my drawer !!!!

Here is the short C programm (can be opened with Notepad++)

Downloads

The Cabling

20190712_171618[1].jpg
Raspitone_schéma.jpg

For the Screen:

A HDMI cable and a USB cable are used on Raspi to power and drive the screen.

For the front panel:

A USB cable is also connected from the Raspi to be able to upload new files or make backups.

A USB cable is connected from the Nano to be able to access the soft (for modifications if necessary)

I plug also a wireless keyboard dongle on the raspberry to be able to make maintenance without using the external USB plug

As Raspberry and Arduino are used , the cabling is rather simple .

All is located on a strip matrix board.

From raspberry 2 GPIO are used:

Pin22 for IR LED

Pin 27 for heartbeat to Arduino

on Arduino

Pin 2 is used as an interrupt pin for the heartbeat from Raspi.

Pins 3 to 5 are used for driving the led's (Start,Wdt,Maintenance).

Pin 6 is for the maintenance switch.

Pin 7 is output to relay shield .

Here is the fritzing file:

Downloads

The Box

20190826_112503[1].jpg

I will not describe a lot what I did as it depends on the power amp and on the speakers used .

As information the home cinema is located in the bottom of the box.

Just over the speakers:

1 woofer

2 medium speakers, that I modified to insert them in the box.

On the top :

The front pannel with the screen, the LED's, the switches and the USB plugs.

The wood:

For the speakers, the side pannels the top and the bottom I used 18 mm wood plank.

The front side is 10 mm plywood with 40 mm screws.

To facilitate the cabling and the maintenance (if needed!!!) I put the circuitry on a drawer behind the front pannel

To avoid overheating a big hole is done on the bottom of the rear pannel and I put a 5V fan (8 cm ) on the rear pannel just beside the circuitry.

The picture above is just to give an idea.

So, that's it !!!!!!!!!

Thank you for reading me

And see you next time for new adventures