Source Code
Sphero Mini Control
Control your Sphero Mini robot ball via Bluetooth Low Energy using Python and bleak.
Features
- ๐จ LED Control - Change main LED color and back LED intensity
- ๐ฏ Movement - Roll in any direction at variable speeds
- ๐ฒ Random Mode - Cat play mode with unpredictable movements
- ๐ Draw Shapes - Squares, stars, circles with programmable patterns
- ๐ Power Management - Wake, sleep, and check battery status
- ๐งญ Heading Control - Reset and control orientation
- ๐ฅ๏ธ Cross-platform - Works on macOS, Windows, and Linux (uses bleak, not bluepy)
Setup
1. Install Dependencies
All platforms:
pip3 install bleak
2. Find Your Sphero Mini's MAC/UUID
macOS/Windows: Use the included scan script:
python3 scripts/scan_sphero.py
Look for a device named like "SM-XXXX" (Sphero Mini).
3. Update MAC Address
Edit the scripts and replace SPHERO_MAC with your device's address.
Quick Start
Scan for Sphero Mini
python3 scripts/scan_sphero.py
Change Color
import asyncio
from sphero_mini_bleak import SpheroMini
async def change_color():
sphero = SpheroMini("YOUR-MAC-ADDRESS")
await sphero.connect()
await sphero.wake()
# Set to red
await sphero.setLEDColor(255, 0, 0)
await asyncio.sleep(2)
await sphero.disconnect()
asyncio.run(change_color())
Roll Forward
import asyncio
from sphero_mini_bleak import SpheroMini
async def roll_forward():
sphero = SpheroMini("YOUR-MAC-ADDRESS")
await sphero.connect()
await sphero.wake()
# Roll forward at speed 100
await sphero.roll(100, 0)
await asyncio.sleep(3)
# Stop
await sphero.roll(0, 0)
await sphero.disconnect()
asyncio.run(roll_forward())
Pre-built Scripts
๐ฑ Cat Play Mode (Random Movement)
python3 scripts/cat_play.py
Makes Sphero move randomly for 1 minute with color changes - perfect for playing with cats!
๐ Draw Shapes
# Draw a square
python3 scripts/draw_square.py
# Draw a star
python3 scripts/draw_star.py
๐จ Color Control
# Set specific color
python3 scripts/set_color.py red
python3 scripts/set_color.py 255 0 128 # Custom RGB
Common Commands
Movement
# Roll (speed: 0-255, heading: 0-359 degrees)
await sphero.roll(speed=100, heading=0) # Forward
await sphero.roll(100, 90) # Right
await sphero.roll(100, 180) # Backward
await sphero.roll(100, 270) # Left
await sphero.roll(0, 0) # Stop
LED Control
# Main LED color (RGB values 0-255)
await sphero.setLEDColor(red=255, green=0, blue=0) # Red
await sphero.setLEDColor(0, 255, 0) # Green
await sphero.setLEDColor(0, 0, 255) # Blue
await sphero.setLEDColor(128, 0, 128) # Purple
# Back LED brightness (0-255)
await sphero.setBackLED(255) # Full brightness
await sphero.setBackLED(0) # Off
Power Management
# Wake from sleep
await sphero.wake()
# Go to sleep (low power, BLE still on)
await sphero.sleep()
# Check battery voltage
voltage = await sphero.getBatteryVoltage()
print(f"Battery: {voltage}V")
Tips
- Wake Sphero: Shake it to wake from deep sleep before connecting
- Connection timeout: If connection fails, shake Sphero and try again
- Finding Sphero: After scripts finish, Sphero is set to white for easy visibility
- Cat safety: Use soft surfaces when playing with cats to avoid damage
Example: Cat Play Mode
The cat play mode script makes Sphero:
- Move in random directions (40-120 speed)
- Change colors randomly (6 vibrant colors)
- Stop unpredictably (30% chance for brief pauses)
- Run for exactly 1 minute
- End with white color so you can find it
Perfect for entertaining cats! ๐ฑ
Troubleshooting
Cannot Connect
- Shake Sphero to wake it up
- Ensure it's not connected to the Sphero Edu app
- Check MAC/UUID address is correct
- Try increasing timeout in
sphero_mini_bleak.py
Sphero Doesn't Move
- Call
await sphero.wake()first - Wait 1-2 seconds after waking
- Check battery level
Colors Don't Change
- Add
await asyncio.sleep(0.5)between color changes - Ensure you called
await sphero.wake()
Library Credits
This skill uses:
- sphero_mini_win by trflorian - Sphero Mini control library using bleak
- bleak - Cross-platform Bluetooth Low Energy library
Note: This library is for Sphero Mini only. For other Sphero models (BB8, SPRK+, Bolt), use pysphero instead.
Advanced Usage
Custom Patterns
Create your own movement patterns:
async def figure_eight():
# Draw a figure-8 pattern
for i in range(2): # Two loops
for heading in range(0, 360, 10):
await sphero.roll(80, heading)
await asyncio.sleep(0.1)
Color Cycling
async def rainbow():
colors = [
(255, 0, 0), (255, 127, 0), (255, 255, 0),
(0, 255, 0), (0, 0, 255), (75, 0, 130), (148, 0, 211)
]
for r, g, b in colors:
await sphero.setLEDColor(r, g, b)
await asyncio.sleep(1)
Documentation
- SKILL.md โ This file
- references/api.md โ Complete API reference
- references/troubleshooting.md โ Common issues and solutions
- scripts/ โ Ready-to-use example scripts
License
MIT