Magic 8 Ball (Magic 2 Ball) With Voice, Round Color LCD Screen and Motion Sensing

In the long tradition of fortune telling Magic 8 Balls I created a self-contained Magic 2 Ball running a Raspberry Pi Zero 2. When you shake the ball and turn it over, the answer tile is displayed on a round screen and the answer is spoken out loud. The 110mm diameter ball is 3D printed in three parts. The round color LCD screen has a 240 x 240 pixels resolution. The sound is high quality PCM and the ball’s orientation is read by a circuit board. The python programs and resources are maintained through a WIFI connection and additional answers can be added.

I had a full spool of dark blue 3D filament, so instead of an eight ball, mine is a Magic 2 Ball to match the color of the two pool ball. This project requires a steady hand and good vision for soldering the connections.

I am grateful to all of the people who have documented their previous Raspberry Pi projects on the web and will try to give credit when appropriate. I could not have made this without you.


Below are the parts I used. Others will work but may require wiring or program changes.

Computer Raspberry PI Zero 2 W

Raspberry Pi Zeros are available from various dealers. I used a Raspberry Pi Zero 2 W and soldered on the header. First I tried an original Pi Zero W, but the response was noticeably slower.

Memory Card SAMSUNG (MB-ME32GA/AM) 32GB 95MB/s (U1) microSDHC EVO Select


Any decent memory card with at least 32GB will do.

Audio Amplifier AITRIP 3 PCS MAX98357 Audio Power Amplifier Module I2S Class D


This board provides fantastic PCM sound at a decent volume.

Speaker WMYCONGCONG 4 PCS 1.5″ 4ohm 3W Audio Speaker


Or use any tiny 4 ohm 3W speaker.

Display 1.28″ Round LCD Display Module for Arduino/Raspberry Pi/Jetson Nano/STM32 240×240 Resolution 65K RGB Colors GC9A01 Driver SPI Interface


Other displays will probably work, including the one in the referenced link in the LCD section. Most are shipped from China.

Accelerometer               Adafruit LIS3DH Triple-Axis Accelerometer


This board is for motion sensing.

Jumpers Premium Breadboard Jumper Wires 22AWG


Jumpers Haitronic 120pcs 20cm Length Jumper Wire/Dupont Cable Multicolored (10 Color) M to F, M to M, F to F Each


Any similar jumpers should work. Heavy gauge 22 AWG is easier to strip and solder later.


Optional Parts

These parts are used to create a power extension.

USB Connector 20 Pcs Micro USB Male Type B 5-Pin Jack Port Solder Connector


USB Connector HiLetgo 10pcs Micro USB to DIP Adapter 5pin Female Connector B Type PCB Converter pinboard


Obsolete Parts

I originally prototyped a rechargeable battery system. It couldn’t provide enough power. I probably didn’t have enough room in the 110mm diameter ball anyway. If you can add a battery, you will have it all.

 Obsolete Charger HiLetgo 3pcs TP4056 Type-c USB 5V 1A 18650 Lithium Battery Charger Module Charging Board with Dual Protection Functions


Obsolete Voltage Regulator Frienda 10 Pieces MT3608 DC-DC Boost Converter 2A Adjustable Step Up Module Voltage Regulator Board Input Voltage 2V-24V to 5V-28V Output Voltage


Obsolete Battery IMREN 3.7v Rechargeable Battery 3000mAh


Or any 3.7v battery that has a similar wattage and size.

Step 1: Install Raspbian on Pi Zero

First install the Raspberry Pi Linux operating system on your Pi Zero. I followed the following link for a headless install.,6028.html

Remove the SD card from your other computer and insert it into your Zero. Turn the Zero on.

Connect to the Zero using your favorite SSH software. I use Putty. If you have trouble finding your Zero you can check your local router to get the wireless IP.

Sign in to your new system with the default user and password.

User pi

Password raspberry


Change your password. If you have or will have more than one Pi, change the host name from “raspberry” to a new value in two files. Then reboot.


sudo nano /etc/hostname
sudo nano /etc/hosts

sudo reboot

Restart your putty session. Sign in as pi with your new password.

Update your system. This will take a while!

sudo apt update
sudo apt upgrade -y
sudo apt autoremove -y

Step 2: GPIO Pins

This is an overview of ALL of the connections. I will expand on this in the later steps. Don’t do anything yet!

1 LCD screen                2 Amplifier

3 Accelerometer            4

5 Accelerometer            6 LCD screen

7                                    8

9 Amplifier                    10

11                                  12 Amplifier

13 LCD screen              14

15                                  16

17 Accelerometer         18 LCD screen

19 LCD screen               20

21                                   22 LCD screen

23 LCD screen               24 LCD screen

25 Accelerometer          26

27                                   28

29                                   30

31 Accelerometer          32

33                                   34

35 Amplifier                    36

37                                  38

39                                  40 Amplifier

Step 3: Install LCD

I’m indebted to the following website for the information to install the LCD.

You need 8 wires to connect the LCD module. I had a couple of module pins named differently than in the article. Of course you can use any 3V3 pin and any GND pin on the Zero.


Pin 1 3V3                                        3V3                                  VCC

Pin6 GND                                       GND                                GND

Pin 19 GPIO 10 MOSI SPI             SDA                                 DIN

Pin 23 GPIO 11 SCLK SPI             SCL                                  CLK

Pin 22 GPIO 25                              DC                                    DC

Pin 13 GPIO 27                             RST                                  RST

Pin 18 GPIO 24                             BLK                                  BL

Pin 24 GPIO 7 CEO SPI                 CS                                    CS


Enable SPI for the LCD.

sudo raspi-config

Interface Options > SPI > Yes > Enter

Install the required libraries.

tar zxvf bcm2835-1.68.tar.gz
cd bcm2835-1.68/

Configure and compile.

sudo ./configure
sudo make
sudo make check
sudo make install

Install wiring libraries.

sudo dpkg -i wiringpi-latest.deb


Install the unzip program, download the demo program and extract.

sudo apt-get install p7zip-full -y
sudo wget 
7z x LCD_Module_RPI_code.7z -O./LCD_Module_code

Test it.

cd ~/bcm2835-1.68/LCD_Module_code/LCD_Module_RPI_code/RaspberryPi/python/example 
sudo python3

If everything worked you will see a clock face on the screen. Copy the lib directory to your new program directory for ease of access.

mkdir ~/magic8 
cd ~/bcm2835-1.68/LCD_Module_code/LCD_Module_RPI_code/RaspberryPi/python   
cp -r lib ~/magic8
cd ~/magic8
sudo reboot

Step 4: Install Amplifier

For this I’m indebted to the following website.


You need 5 wires to connect the MAX98357 amplifier to the Raspberry Pi Zero: Of course you can use any 5V pin and any GND pin on the Zero.


ZERO HEADER                             MODULE           

Pin 2 5V                                          Vin

Pin 9 GND                                      GND

Pin 12 GPIO 18                             BCLK

Pin 35 GPIO 19                             LRC

Pin 40 GPIO 21                             DIN


Change the following file.

sudo nano /boot/config.txt

Comment out one line.

# dtparam=audio=on

Below this add the following two lines.


Add a new file.

sudo nano /etc/asound.conf

Add the following lines to the file.

pcm.hifiberry {
type hw card 0
pcm.!default {
type plug
slave.pcm "dmixer"
pcm.dmixer {
type dmix
ipc_key 1024
slave {
pcm "hifiberry"
channels 2


Sign back in.

Important A little conversation about the GPIO and hardware drivers. Behind the scene, drivers can reset the GPIO from its original configuration. The driver for the LCD module changes the pins you need for the amplifier. But you can change them back and the LCD module is still happy. You can run these commands at the prompt and I have added them to my program.

Display the current GPIO status, set four GPIOs to their original state and display the new status.

raspi-gpio get
raspi-gpio set 18 a0
raspi-gpio set 19 a0
raspi-gpio set 20 a0
raspi-gpio set 21 a0
raspi-gpio get

I installed mplayer to play my audio files. You can try other ones.

sudo apt install mplayer

Step 5: Install Accelerometer

The accelerometer can be read to determine the Magic 2 Ball’s relative position and if the ball has been shaken.

First turn on 12C.

sudo raspi-config

Interface options > 12C > Yes

You will need 5 wires to connect the accelerometer to the Zero. Of course you can use any 3V3 pin and any GND pin on the Zero.

ZERO HEADER                             MODULE           

Pin 17 3.3V                                    Vin

Pin 6 GND                                      GND

Pin 5 GPIO 3 SCL                          SCL

Pin 3 GPIO 2 SDA                          SDA

Pin 31 GPIO 6                                 INT

Install required Adafruit software.

sudo pip3 install adafruit-circuitpython-lis3dh
sudo pip3 install adafruit-circuitpython-busdevice 

If you haven’t already, create a new program directory. Create a new file.

mkdir ~/magic8
sudo nano

Add the following lines.

import time
import board
import digitalio
import adafruit_lis3dh
i2c = board.I2C()
int1 = digitalio.DigitalInOut(board.D6) # Set this to the correct pin for the >
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1)
i = 1
print("Move me")
while i < 6:
   x, y, z = lis3dh.acceleration
   print("#" + str(i), x, y, z)
   i = i + 1
print("Shake me")
while True:
   if lis3dh.shake(shake_threshold=10):


Run the test program.

sudo python3

Step 6: Power

I created a power connector using a pair of USB connectors as shown in the following link. Do not switch polarity!

(Fun project by the way!)

Now that I don’t use a battery, I would probably just run a permanent cable through a hole in the ball to the Zero!

Step 7: Tiles and Waves

Create the folders to hold the tiles and the wave files.

cd ~/magic8
mkdir tiles
mkdir waves

Use FileZilla or another program to transfer your tile files and wave files to each directory. You can use my tiles and waves or create your own. Tiles must be 240 pixels by 240 pixels. Of course, you can always add additional tiles and matching waves. (Be sure to change the random statement in the program to your new total.)

Step 8: Magic 8 Program

First a note about the program. Yes, it is very simplistic. But sometimes the ability to understand and easily change the program is more important than speed. Feel free to make your own changes!

Copy the “” python program available below to your magic8 subdirectory.

You can now run and edit the program.

cd ~/magic8
sudo python3
sudo nano

Step 9: Auto Start

First disable any traces of a previous start and create the following file.

sudo systemctl disable magic8.service
sudo nano /lib/systemd/system/magic8.service


Add the following lines.

Description=Start Magic 2 Ball
ExecStart=/usr/bin/python3 /home/pi/magic8/ > /home/pi/magic8/magic8wav.log 2>&1


Restart the daemon system, enable the service and reboot.

sudo systemctl daemon-reload
sudo systemctl enable magic8.service
sudo reboot

If you are having problems, you can check and erase the logs.

cat /home/pi/magic8/magic8wav.log
sudo rm /home/pi/magic8/magic8wav.log

Step 10: 3D Printing the Ball

The ball was designed using the free Tinkercad website. For complex items, I find it handy to create them using multiple steps. Create an item, export all of it as a STL file, import this as a whole into a new project, make changes. Repeat as needed (just like your shampoo). You can even import an item into Tinkercad and convert it to be used as a “hole”. This is how I added (subtracted) the speaker slots. But Tinkercad cannot design a smooth ball.

I originally designed the ball to accommodate the battery system. After I eliminated the battery I cut out all of the shelves in the number ball half. Besides I needed all of the available room to cram everything in!

I printed the parts on a $300 3D printer. The printing isn’t as precise as a more expensive model but it did the job. Slowly!

Step 11: Assemble the Ball

Important Before assembling the ball I removed all of the jumper pin covers, slid on shrink tube and soldered all of the connections. The ball will be shaken (not stirred) every time!

Insert the ring into one half before crossing between the two halves.

Your hot glue gun is your friend! I used dabs of hot glue to anchor the components inside the ball. Dried glue can be pried up later if you need to make changes.

The 3D printed ring fits snugly at the intersection of the two halves holding them together. I still needed a couple of dabs of glue to keep the halves in place.

Source: Magic 8 Ball (Magic 2 Ball) With Voice, Round Color LCD Screen and Motion Sensing

Current Project / Post can also be found using:

  • raspberry pi 4 with display projects
Scroll to Top
Read previous post:

The LMD-401 is a low power narrow band synthesized transceiver with GFSK modulation, designed for use in the North American...