Skip to main content

sphero_unsw

status python version pypi license last commit Downloads

An unofficial Python library for Sphero toys.

Sphero BOLT+

sphero_unsw is a fork of the spherov2 Python library, extended to support the Sphero BOLT+ robot.

About Us

This extension was developed by:

From the School of Systems and Computing, UNSW Canberra, to support the Sphero BOLT+ robot.

This extension has been developed for educational use as part of the course ZEIT1102: Introduction to Programming at the University of New South Wales, Canberra (UNSW Canberra). It is specifically designed to support students in learning programming fundamentals and introductory robotics concepts through hands-on activities using Sphero BOLT+ robots.

Installation

pip install sphero_unsw

Features

  • All features from the original spherov2 library.
  • Extended functionality for Sphero BOLT+.
  • Compatible with Python 3.7 through 3.12.x (inclusive)

Current Progress

The library is still under active development. Some features are implemented but not yet fully functional or reliable. Current work includes:

✅ Fully working

  • Core robot connectivity and Bluetooth scanning
  • Movement commands: roll(), spin(), stop_roll()
  • Main LED and back LED control
  • Sensor readings (light, orientation, velocity, gyroscope, acceleration, distance, heading)
  • Event handling (e.g. collision, landing, freefall)

⚠️ Under development (not working yet)

  • IR Communication: Not yet fully functional or reliable
  • Matrix Display: Showing images on the BOLT+ matrix not working

We are actively working on identifying and resolving these compatibility issues.

Usage

Usage Example: Sphero BOLT+ Demo with sphero_unsw

This script demonstrates a full-range test of Sphero BOLT+ capabilities using the sphero_unsw library. It includes:

  • Connecting to a robot via Bluetooth
  • Registering and handling multiple real-time events (e.g. collision, landing, freefall, charging)
  • Testing main LED, back LED, and 8×8 matrix display
  • Displaying static characters and scrolling messages
  • Performing simple movements (roll, spin, stop)
  • Reading real-time sensor data including light, orientation, velocity, gyroscope, and more
# Import required libraries
import time
from sphero_unsw.toys_scanner import toys_scanner
from sphero_unsw.sphero_edu import SpheroEduAPI, EventType
from sphero_unsw.types import Color

# ---------------------------
# Define event handler functions
# ---------------------------

def on_collision(api):
    print("💥 Collision detected!")
    api.set_main_led(Color(255, 0, 0))  # Flash red
    time.sleep(0.3)
    api.set_main_led(Color(0, 0, 255))  # Return to blue

def on_freefall(api):
    print("🪂 Freefall detected")
    api.set_main_led(Color(255, 0, 0))  # Red

def on_landing(api):
    print("🟢 Landed")
    api.set_main_led(Color(0, 255, 0))  # Green

def on_gyro_max(api):
    print("🚀 Gyro max")
    api.set_main_led(Color(255, 0, 255))  # Magenta

def on_charging(api):
    print("⚡ Charging")
    api.set_main_led(Color(6, 0, 255))  # Indigo

def on_not_charging(api):
    print("🔋 Not charging")
    api.set_main_led(Color(255, 0, 47))  # Pinkish red

# ---------------------------
# Scan for nearby Sphero robots and connect to one
# ---------------------------

scanner = toys_scanner()
selected_toy = scanner.scan_and_select_toy()

# ---------------------------
# Open connection to the selected robot
# ---------------------------

with SpheroEduAPI(selected_toy) as api:
    print(f"Connected to {selected_toy.name}!")

    # Register events and handlers
    api.register_event(EventType.on_collision, on_collision)
    api.register_event(EventType.on_freefall, on_freefall)
    api.register_event(EventType.on_landing, on_landing)
    api.register_event(EventType.on_gyro_max, on_gyro_max)
    api.register_event(EventType.on_charging, on_charging)
    api.register_event(EventType.on_not_charging, on_not_charging)
    print("Event handlers registered.\n")


    # ---------------------------
    #  Fill the LED matrix using set_matrix_fill
    # ---------------------------
    api.set_matrix_fill(0,0,7,7,Color(255, 255, 255))        # Fill the LED matrix with white color using form pixel (0,0) to (7,7)

    # ---------------------------
    # Fill Main LED (RGB color)
    # ---------------------------
    api.set_main_led(Color(255, 0, 0))  # Red
    time.sleep(0.5)
    api.set_main_led(Color(0, 255, 0))  # Green
    time.sleep(0.5)
    api.set_main_led(Color(0, 0, 255))  # Blue
    time.sleep(0.5)

    # ---------------------------
    # Test Back LED and Front LED
    # ---------------------------
    api.set_back_led(255)                   # Full brightness
    time.sleep(1)
    api.set_back_led(0)                     # Turn off
    time.sleep(1)
    api.set_back_led(255)                   # Set back LED to full brightness
    time.sleep(1)
    api.set_front_led(Color(255, 0, 0))     # Set front LED to red
    time.sleep(1)

    # ---------------------------
    # Light up the LED matrix pixel by pixel
    # ---------------------------
    for x in range(8):
        for y in range(8):
            r = 255 // (x + 1)
            g = 255 // (y + 1)
            api.set_matrix_pixel(x, y, Color(r, g, 0))  # Gradient color
    time.sleep(1)

    # ---------------------------
    # Display a character on the matrix
    # ---------------------------
    api.set_matrix_character("A", Color(255, 255, 0))  # Yellow A
    time.sleep(1)

    # ---------------------------
    # Scroll a message across the matrix
    # ---------------------------
    api.scroll_matrix_text("UNSW", Color(255, 0, 0), fps=5, wait=True)
    time.sleep(8)

    # ---------------------------
    # Movement Tests
    # ---------------------------
    api.roll(0, 100, 2)   # Roll forward at heading 0° for 2 seconds
    time.sleep(2)

    api.spin(720, 3)      # Spin 720° over 3 seconds
    time.sleep(3)

    api.stop_roll()       # Stop movement

    # ---------------------------
    # Change the heading direction
    # ---------------------------
    api.set_heading(0)    # Set heading to 0°
    time.sleep(1)
    api.set_heading(90)   # Set heading to 90°
    time.sleep(1)

    # ---------------------------
    # Read sensor data
    # ---------------------------
    print("Ambient Light:", api.get_luminosity())
    print("Orientation:", api.get_orientation())
    print("Velocity:", api.get_velocity())
    print("Location:", api.get_location())
    print("Gyroscope:", api.get_gyroscope())
    print("Acceleration:", api.get_acceleration())
    print("Travel Distance:", api.get_distance())
    print("Heading:", api.get_heading())

    print("\nDemo complete.")

Acknowledgments

We gratefully acknowledge the original authors of the spherov2 library:

This library spherov2 was originally created for educational use in CIS 521: Artificial Intelligence at the University of Pennsylvania, where Sphero robots are used to help teach the foundations of AI.

License

MIT License. See the LICENSE file.

This library is based on the original spherov2 library developed by the University of Pennsylvania.

Metadata

Release files for sphero-unsw 0.1.11

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for sphero-unsw 0.1.11
File Size Uploaded
sphero_unsw-0.1.11.tar.gz 66.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for sphero-unsw 0.1.11
File Interpreter ABI Platform
sphero_unsw-0.1.11-py3-none-any.whl Python 3 none any Details

Total release size: 180.6 kB

Release files / sphero_unsw-0.1.11.tar.gz

Download URL sphero_unsw-0.1.11.tar.gz
Size 66.2 kB
Tags Source
SHA-256 checksum
How to use checksums
1d9f21c938a704bcb3a74e097a48aad9b891b2c5529dbb35fd1e4b19634f5862
BLAKE2b-256 checksum
How to use checksums
80640319c16059b691fa536a59fc2d00ac8598380b3e8ae9408525471f17d781
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.23

Release files / sphero_unsw-0.1.11-py3-none-any.whl

Download URL sphero_unsw-0.1.11-py3-none-any.whl
Size 114.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
64df07bd370a5d2f918d380ff6739fe99876f683d0bc8475dd80b3b5dea88fe4
BLAKE2b-256 checksum
How to use checksums
eab52990499d62ef0386b7780ed56ad27c1e38fa8ef4b20f55071514a9f4784a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.9.23

Release history Release notifications | RSS feed

This release

0.1.11 This release

2 release files

0.1.8

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page