588 lines
15 KiB
Markdown
588 lines
15 KiB
Markdown
---
|
|
name: badger-quickstart
|
|
description: Complete getting started guide for Universe 2025 (Tufty) Badge from zero to first app. Use when helping absolute beginners, providing step-by-step first-time setup, or when users ask "how do I get started", "where do I begin", or "first steps with the badge".
|
|
---
|
|
|
|
# Universe 2025 (Tufty) Badge Quickstart Guide
|
|
|
|
Complete step-by-step guide to go from zero to creating your first app for **MonaOS** on the Universe 2025 (Tufty) Badge. Perfect for absolute beginners!
|
|
|
|
## About the Badge
|
|
|
|
The Universe 2025 Badge is a custom version of the Pimoroni Tufty 2350, created for GitHub Universe 2025. It comes pre-loaded with **MonaOS**, a MicroPython-based operating system with an app launcher.
|
|
|
|
### Hardware Specifications
|
|
- **RP2350** Dual-core ARM Cortex-M33 @ 200MHz
|
|
- **512kB SRAM** and **16MB QSPI XiP flash**
|
|
- **320x240 full colour IPS display** (framebuffer pixel doubled from 160x120)
|
|
- **2.4GHz WiFi and Bluetooth 5**
|
|
- **1000mAh rechargeable battery** (up to 8 hours runtime)
|
|
- **IR receiver and transmitter** for beacon hunting
|
|
- **Five front-facing buttons** (A, B, C, UP, DOWN)
|
|
- **4-zone LED backlight**
|
|
- **USB-C** for charging and programming
|
|
|
|
## About MonaOS
|
|
|
|
Your badge runs **MonaOS**, which provides:
|
|
- An app launcher that auto-discovers apps in `/system/apps/`
|
|
- Each app is a directory containing `__init__.py`, `icon.png` (24x24), and optional `assets/`
|
|
- Apps implement `update()` function called every frame
|
|
- Navigate apps using physical buttons
|
|
|
|
## What You'll Need
|
|
|
|
### Hardware
|
|
- ✓ Universe 2025 (Tufty) Badge
|
|
- ✓ USB-C cable (data capable, not just charging)
|
|
- ✓ Computer (macOS, Linux, or Windows)
|
|
|
|
### Software (we'll install together)
|
|
- Python 3.8 or newer
|
|
- Development tools (mpremote)
|
|
- Text editor or IDE
|
|
|
|
### Time Required
|
|
- First-time setup: 30-45 minutes
|
|
- Your first app: 20-30 minutes
|
|
|
|
## Step-by-Step Setup
|
|
|
|
### Step 1: Install Python on Your Computer
|
|
|
|
**Why**: You need Python on your computer to run the tools that communicate with your badge.
|
|
|
|
**macOS:**
|
|
```bash
|
|
# Install using Homebrew
|
|
brew install python3
|
|
|
|
# Verify
|
|
python3 --version # Should show 3.8 or higher
|
|
```
|
|
|
|
**Linux (Ubuntu/Debian):**
|
|
```bash
|
|
sudo apt update
|
|
sudo apt install python3 python3-pip python3-venv
|
|
python3 --version
|
|
```
|
|
|
|
**Windows:**
|
|
1. Download from https://www.python.org/downloads/
|
|
2. Run installer
|
|
3. ✓ CHECK "Add Python to PATH"
|
|
4. Complete installation
|
|
5. Open PowerShell and verify: `python --version`
|
|
|
|
✅ **Checkpoint**: Run `python3 --version` (or `python --version` on Windows). You should see version 3.8 or higher.
|
|
|
|
> **Need help?** See the `python-setup` skill for detailed installation guides.
|
|
|
|
### Step 2: Create Your First Project
|
|
|
|
**Why**: Keeping projects organized and using virtual environments prevents conflicts.
|
|
|
|
```bash
|
|
# Create a directory for your project
|
|
mkdir ~/badger-projects
|
|
cd ~/badger-projects
|
|
mkdir hello-badge
|
|
cd hello-badge
|
|
|
|
# Create a virtual environment
|
|
python3 -m venv venv
|
|
|
|
# Activate it
|
|
# macOS/Linux:
|
|
source venv/bin/activate
|
|
|
|
# Windows (PowerShell):
|
|
venv\Scripts\Activate.ps1
|
|
|
|
# Windows (Command Prompt):
|
|
venv\Scripts\activate.bat
|
|
```
|
|
|
|
✅ **Checkpoint**: Your terminal prompt should now show `(venv)` at the beginning.
|
|
|
|
### Step 3: Install Badge Tools
|
|
|
|
**Why**: These tools let you communicate with your badge, upload files, and run code.
|
|
|
|
```bash
|
|
# Make sure venv is activated (you should see "(venv)" in prompt)
|
|
|
|
# Install essential tool
|
|
pip install mpremote
|
|
|
|
# Verify installation
|
|
mpremote --version
|
|
```
|
|
|
|
✅ **Checkpoint**: Command should show version number without errors.
|
|
|
|
### Step 4: Connect Your Badge
|
|
|
|
**Why**: Let's make sure your computer can talk to your badge.
|
|
|
|
1. **Connect badge to computer** using USB-C cable
|
|
2. **Find the device**:
|
|
|
|
**macOS/Linux:**
|
|
```bash
|
|
ls /dev/tty.usb*
|
|
# Should see something like: /dev/tty.usbmodem14201
|
|
```
|
|
|
|
**Windows:**
|
|
```powershell
|
|
# In PowerShell
|
|
[System.IO.Ports.SerialPort]::getportnames()
|
|
# Should see something like: COM3
|
|
```
|
|
|
|
3. **Test connection**:
|
|
|
|
**macOS/Linux:**
|
|
```bash
|
|
mpremote connect /dev/tty.usbmodem* exec "print('Hello from Badge!')"
|
|
```
|
|
|
|
**Windows:**
|
|
```powershell
|
|
mpremote connect COM3 exec "print('Hello from Badge!')"
|
|
```
|
|
|
|
✅ **Checkpoint**: You should see "Hello from Badge!" printed in your terminal.
|
|
|
|
> **Troubleshooting**:
|
|
> - Badge not found? Try different USB ports
|
|
> - Permission denied? See Step 4a below
|
|
> - Still stuck? See the `badger-diagnostics` skill
|
|
|
|
### Step 4a: Fix Permissions (Linux only)
|
|
|
|
If you get "Permission denied" on Linux:
|
|
|
|
```bash
|
|
# Add yourself to dialout group
|
|
sudo usermod -a -G dialout $USER
|
|
|
|
# Log out and log back in for changes to take effect
|
|
# Or restart your computer
|
|
```
|
|
|
|
### Step 5: Verify Badge is Ready (CRITICAL)
|
|
|
|
**Why**: We must verify everything is working before writing code.
|
|
|
|
```bash
|
|
# macOS/Linux:
|
|
mpremote connect /dev/tty.usbmodem* exec "
|
|
import sys
|
|
print('✓ MicroPython:', sys.version)
|
|
|
|
# Test badgeware module
|
|
from badgeware import screen, brushes, shapes
|
|
print('✓ badgeware module: loaded')
|
|
print('✓ Display size: 160x120')
|
|
print('✓ ALL CHECKS PASSED!')
|
|
"
|
|
|
|
# Windows:
|
|
mpremote connect COM3 exec "import sys; from badgeware import screen, brushes, shapes; print('✓ MicroPython:', sys.version); print('✓ badgeware loaded'); print('✓ ALL CHECKS PASSED!')"
|
|
```
|
|
|
|
✅ **Checkpoint - ALL must pass**:
|
|
- ✓ MicroPython version shown
|
|
- ✓ badgeware module loads
|
|
- ✓ No error messages
|
|
|
|
**DO NOT PROCEED until all checks pass.**
|
|
|
|
### Step 6: Understand MonaOS App Structure
|
|
|
|
MonaOS apps must follow this structure:
|
|
|
|
```
|
|
my_app/
|
|
├── icon.png # 24x24 PNG icon for launcher
|
|
├── __init__.py # Entry point with update() function
|
|
└── assets/ # Optional: app assets (auto-added to path)
|
|
└── ...
|
|
```
|
|
|
|
Your `__init__.py` must implement:
|
|
- **`init()`** - Optional, called once when app launches
|
|
- **`update()`** - Required, called every frame by MonaOS
|
|
- **`on_exit()`** - Optional, called when returning to menu
|
|
|
|
### Step 7: Create Your First App
|
|
|
|
Create the app directory structure:
|
|
|
|
```bash
|
|
mkdir hello_app
|
|
cd hello_app
|
|
```
|
|
|
|
Create `hello_app/__init__.py`:
|
|
|
|
```python
|
|
# hello_app/__init__.py - Your first MonaOS app!
|
|
from badgeware import screen, brushes, shapes, io, PixelFont
|
|
import math
|
|
|
|
# Optional: called once when app launches
|
|
def init():
|
|
screen.font = PixelFont.load("nope.ppf")
|
|
print("Hello app initialized!")
|
|
|
|
# Required: called every frame by MonaOS
|
|
def update():
|
|
# Clear the framebuffer
|
|
screen.brush = brushes.color(20, 40, 60)
|
|
screen.clear()
|
|
|
|
# Draw animated sine wave
|
|
y = (math.sin(io.ticks / 100) * 20) + 60
|
|
screen.brush = brushes.color(0, 255, 0)
|
|
for x in range(160):
|
|
screen.draw(shapes.rectangle(x, int(y), 1, 1))
|
|
|
|
# Draw text
|
|
screen.brush = brushes.color(255, 255, 255)
|
|
screen.text("Hello, Badge!", 10, 10)
|
|
screen.text("Press HOME to exit", 10, 100)
|
|
|
|
# Handle button presses
|
|
if io.BUTTON_A in io.pressed:
|
|
print("Button A pressed!")
|
|
if io.BUTTON_HOME in io.pressed:
|
|
# HOME button exits to MonaOS menu automatically
|
|
pass
|
|
|
|
# Optional: called before returning to menu
|
|
def on_exit():
|
|
print("App exiting!")
|
|
```
|
|
|
|
Create `hello_app/icon.png`:
|
|
- 24x24 pixel PNG image
|
|
- Use any image editor to create a simple icon
|
|
- Or download a free icon and resize it
|
|
|
|
✅ **Checkpoint**: Files created:
|
|
- `hello_app/__init__.py`
|
|
- `hello_app/icon.png` (24x24 PNG)
|
|
|
|
### Step 8: Test Your App Locally
|
|
|
|
```bash
|
|
# From your project directory (not inside hello_app/)
|
|
cd ~/badger-projects/hello-badge
|
|
|
|
# Run the app temporarily (doesn't save to badge)
|
|
# macOS/Linux:
|
|
mpremote connect /dev/tty.usbmodem* run hello_app/__init__.py
|
|
|
|
# Windows:
|
|
mpremote connect COM3 run hello_app/__init__.py
|
|
```
|
|
|
|
✅ **Checkpoint**: Your badge display should show "Hello, Badge!" with an animated wave. Press HOME to exit.
|
|
|
|
### Step 9: Install Your App to MonaOS
|
|
|
|
**Why**: Install it permanently so it appears in the MonaOS launcher menu!
|
|
|
|
**⚠️ IMPORTANT**: The `/system/apps/` directory is READ-ONLY via mpremote. You MUST use USB Mass Storage Mode.
|
|
|
|
#### Enter USB Mass Storage Mode
|
|
|
|
1. **Connect badge** via USB-C (if not already connected)
|
|
2. **Press RESET button TWICE** quickly (double-click the RESET button on the back)
|
|
3. **Wait 2-3 seconds** - Badge will appear as **"BADGER"** drive
|
|
4. **Verify**: Drive should appear in Finder (macOS), File Explorer (Windows), or file manager (Linux)
|
|
|
|
#### Install Your App
|
|
|
|
**macOS/Linux:**
|
|
```bash
|
|
# Copy your entire app directory to the badge
|
|
cp -r hello_app /Volumes/BADGER/apps/
|
|
|
|
# OR manually via Finder:
|
|
# 1. Open BADGER drive in Finder
|
|
# 2. Navigate to apps/ folder
|
|
# 3. Drag hello_app folder into apps/
|
|
```
|
|
|
|
**Windows:**
|
|
```powershell
|
|
# Copy your entire app directory
|
|
# (Replace D: with your actual BADGER drive letter)
|
|
xcopy hello_app D:\apps\hello_app\ /E /I
|
|
|
|
# OR manually via File Explorer:
|
|
# 1. Open BADGER drive
|
|
# 2. Navigate to apps\ folder
|
|
# 3. Drag hello_app folder into apps\
|
|
```
|
|
|
|
#### Exit Mass Storage Mode
|
|
|
|
**macOS:**
|
|
```bash
|
|
# Eject the drive
|
|
diskutil eject /Volumes/BADGER
|
|
|
|
# Or right-click BADGER in Finder → Eject
|
|
```
|
|
|
|
**Windows:**
|
|
- Right-click BADGER drive → "Eject"
|
|
- Or use "Safely Remove Hardware" in system tray
|
|
|
|
**Linux:**
|
|
```bash
|
|
# Eject the drive
|
|
sudo umount /media/$USER/BADGER
|
|
```
|
|
|
|
**All Platforms:**
|
|
- Press **RESET button once** on the badge
|
|
- Badge reboots into MonaOS with your app installed!
|
|
|
|
✅ **Checkpoint**:
|
|
- BADGER drive was successfully ejected
|
|
- Badge reboots normally (you see MonaOS menu)
|
|
|
|
### Step 10: Launch Your App from the Badge
|
|
|
|
1. **On your badge**: Press HOME if needed to return to MonaOS launcher
|
|
2. **Navigate**: Use UP/DOWN buttons to find your app
|
|
3. **Launch**: Press the select button to run your app!
|
|
|
|
**Note**: The default MonaOS menu shows 6 apps. You may need to expand pagination (see https://badger.github.io/hack/menu-pagination/)
|
|
|
|
🎉 **Congratulations!** Your first MonaOS app is installed and running!
|
|
|
|
## 🎉 Congratulations!
|
|
|
|
You just:
|
|
- ✓ Set up your Python development environment
|
|
- ✓ Installed badge communication tools
|
|
- ✓ Connected to your badge
|
|
- ✓ Created your first MonaOS app with proper structure
|
|
- ✓ Installed your app into MonaOS launcher
|
|
- ✓ Launched your custom app from the badge!
|
|
|
|
## Quick Reference Card
|
|
|
|
Save these commands - you'll use them a lot:
|
|
|
|
```bash
|
|
# Activate your virtual environment
|
|
source venv/bin/activate # macOS/Linux
|
|
venv\Scripts\Activate.ps1 # Windows
|
|
|
|
# Test app temporarily (doesn't save)
|
|
mpremote run my_app/__init__.py
|
|
|
|
# Install app to MonaOS launcher (USB Mass Storage Mode REQUIRED)
|
|
# 1. Press RESET button twice on badge (enters Mass Storage Mode)
|
|
# 2. Copy app to badge:
|
|
cp -r my_app /Volumes/BADGER/apps/ # macOS/Linux
|
|
xcopy my_app D:\apps\my_app\ /E /I # Windows
|
|
# 3. Eject BADGER drive safely
|
|
# 4. Press RESET once to reboot
|
|
|
|
# List files (read-only view)
|
|
mpremote ls /system/apps
|
|
|
|
# Connect to REPL (interactive mode)
|
|
mpremote
|
|
# (Ctrl+C to interrupt, Ctrl+D to soft reset, Ctrl+X to exit)
|
|
```
|
|
|
|
**⚠️ Remember**: You CANNOT use `mpremote` to install apps to `/system/apps/` - it's read-only! Always use USB Mass Storage Mode.
|
|
|
|
## Your First Improvements
|
|
|
|
### 1. Add Button Interactions
|
|
|
|
```python
|
|
def update():
|
|
screen.brush = brushes.color(20, 40, 60)
|
|
screen.clear()
|
|
|
|
screen.brush = brushes.color(255, 255, 255)
|
|
|
|
if io.BUTTON_A in io.held:
|
|
screen.text("Button A held!", 10, 50)
|
|
elif io.BUTTON_B in io.pressed:
|
|
screen.text("Button B pressed!", 10, 50)
|
|
elif io.BUTTON_C in io.released:
|
|
screen.text("Button C released!", 10, 50)
|
|
```
|
|
|
|
### 2. Draw Shapes
|
|
|
|
```python
|
|
def update():
|
|
screen.brush = brushes.color(20, 40, 60)
|
|
screen.clear()
|
|
|
|
# Draw a circle
|
|
screen.brush = brushes.color(255, 0, 0)
|
|
screen.draw(shapes.circle(80, 60, 30))
|
|
|
|
# Draw a rectangle
|
|
screen.brush = brushes.color(0, 255, 0)
|
|
screen.draw(shapes.rectangle(10, 10, 50, 30))
|
|
|
|
# Draw a line
|
|
screen.brush = brushes.color(255, 255, 255)
|
|
screen.draw(shapes.line(0, 0, 160, 120))
|
|
```
|
|
|
|
### 3. Create a Counter
|
|
|
|
```python
|
|
# Add at top level
|
|
counter = 0
|
|
|
|
def update():
|
|
global counter
|
|
|
|
screen.brush = brushes.color(0, 0, 0)
|
|
screen.clear()
|
|
|
|
screen.brush = brushes.color(255, 255, 255)
|
|
screen.text(f"Count: {counter}", 30, 50)
|
|
|
|
if io.BUTTON_A in io.pressed:
|
|
counter += 1
|
|
if io.BUTTON_B in io.pressed:
|
|
counter = 0
|
|
```
|
|
|
|
## Common Beginner Questions
|
|
|
|
### Q: Do I need to activate venv every time?
|
|
|
|
**Yes**, activate it each time you open a new terminal.
|
|
|
|
### Q: What if I make a mistake in my code?
|
|
|
|
Edit locally, test with mpremote, then reinstall via Mass Storage Mode:
|
|
```bash
|
|
# 1. Edit your code locally
|
|
# 2. Test it temporarily
|
|
mpremote run my_app/__init__.py
|
|
|
|
# 3. Reinstall via Mass Storage Mode
|
|
# - Press RESET twice (enters Mass Storage Mode)
|
|
# - Replace files in /Volumes/BADGER/apps/my_app/
|
|
# - Eject and press RESET once
|
|
```
|
|
|
|
### Q: Can I edit code directly on the badge?
|
|
|
|
Yes! Enter USB Mass Storage Mode (press RESET twice). Badge appears as "BADGER" disk. Edit files in `/Volumes/BADGER/apps/` using any text editor.
|
|
|
|
### Q: What if my badge freezes?
|
|
|
|
Press the RESET button on the back of the badge.
|
|
|
|
### Q: How do I see errors?
|
|
|
|
Connect to REPL:
|
|
```bash
|
|
mpremote
|
|
```
|
|
Then test importing: `import my_app`. Errors will show in terminal.
|
|
|
|
### Q: How do I remove an app?
|
|
|
|
```bash
|
|
mpremote rm -rf :/system/apps/my_app
|
|
```
|
|
|
|
### Q: My app doesn't appear in the menu?
|
|
|
|
The default menu shows 6 apps. Expand pagination: https://badger.github.io/hack/menu-pagination/
|
|
|
|
## Troubleshooting Common Issues
|
|
|
|
### Badge not detected
|
|
|
|
1. Check USB cable (must be data cable, not just charging)
|
|
2. Try different USB port
|
|
3. Restart badge (press RESET)
|
|
4. Check connection:
|
|
- **macOS/Linux**: `ls /dev/tty.usb*`
|
|
- **Windows**: Check Device Manager
|
|
|
|
### "Permission denied" error
|
|
|
|
**Linux**: Add yourself to dialout group (see Step 4a)
|
|
**Windows**: Run PowerShell as Administrator
|
|
|
|
### "Module not found" error
|
|
|
|
Activate your virtual environment:
|
|
```bash
|
|
source venv/bin/activate # macOS/Linux
|
|
venv\Scripts\Activate.ps1 # Windows
|
|
```
|
|
|
|
### App doesn't appear in MonaOS menu
|
|
|
|
1. Verify upload: `mpremote ls /system/apps/my_app`
|
|
2. Check files exist: `__init__.py` and `icon.png`
|
|
3. Icon must be 24x24 PNG
|
|
4. May need to expand menu pagination
|
|
|
|
## Next Steps
|
|
|
|
### Learn More About App Development
|
|
→ See `badger-app-creator` skill
|
|
- Advanced button handling
|
|
- Working with sprites and images
|
|
- WiFi integration
|
|
- State management and persistence
|
|
|
|
### Connect Hardware
|
|
→ See `badger-hardware` skill
|
|
- GPIO pins and sensors
|
|
- I2C/SPI devices
|
|
- IR transmitter/receiver
|
|
- LED backlight control
|
|
|
|
### Use the REPL
|
|
→ See `micropython-repl` skill
|
|
- Interactive development
|
|
- Quick testing
|
|
- Install packages
|
|
|
|
### Improve Your Workflow
|
|
→ See `badger-deploy` skill
|
|
- Automated deployment scripts
|
|
- Project organization
|
|
- Multi-file apps
|
|
|
|
## Official Resources
|
|
|
|
- **Getting Started**: https://badger.github.io/get-started/
|
|
- **Hacks & Tutorials**: https://badger.github.io/hacks/
|
|
- **Official Apps**: https://badger.github.io/apps/
|
|
- **Source Code**: https://github.com/badger/home/tree/main/badgerware
|
|
- **API Docs**: https://github.com/badger/home/blob/main/badgerware/
|
|
|
|
## You're Ready!
|
|
|
|
You now have everything you need to create amazing projects with your Universe 2025 Badge. Happy coding! 🦡
|