Creating Interactive Art with MakeCode Arcade + microbit: A Complete Guide to the Motion Painting Ball

Chapter 1: Where Hardware Meets Creativity – Why This Project?

1.1 The Convergence of Maker Education
• Sensor technology (e.g., accelerometers) is revolutionizing human-computer interaction
• The combination of visual programming (MakeCode) and game engines (Arcade) dramatically lowers creation barriers
• Project value: Learn physics, graphics programming, and interaction design through one project


1.2 Project Preview
• Real-time response: Tilt micro:bit to control on-screen ball movement
• Dynamic trails: Colorful traces create abstract paintings
• Basic interaction: Button-controlled color switching
• Educational extension: Teach coordinate systems, acceleration principles, and color theory



Chapter 2: Hardware and Tools Setup

2.1 Materials List

Equipment/Tool Description
micro:bit V2 Main controller with accelerometer
USB cable For power and data transfer
Computer/Tablet Chrome/Firefox browser required

 

2.2 Development Environment Setup

  1. Visit Microsoft MakeCode for micro:bit

  2. New Project → Click Extensions → Add mashup extension (enables micro:bit support)

  3. Connect hardware: Plug micro:bit into computer via USB



Chapter 3: Building the Painting Ball from Scratch (Full Code + Line-by-Line Analysis)

3.1 Initialization

// ----- Global Variables -----
let ballX = 80;       // Initial X position (screen center)
let ballY = 60;       // Initial Y position
let colorIndex = 2;   // Default color: palette index 2 (red)
let trailAlpha = 6;   // Trail transparency (0-15, lower = more transparent)

// ----- Ball Bitmap Definition -----
let ball = bmp`
    . . . . . . . .
    . . 2 2 2 2 . .
    . 2 2 2 2 2 2 .
    . 2 2 2 2 2 2 .
    . 2 2 2 2 2 2 .
    . 2 2 2 2 2 2 .
    . . 2 2 2 2 . .
    . . . . . . . .
`;

Key Analysis

  • bmp creates an 8x8 bitmap; . = transparent, 2 = red in default palette

  • trailAlpha uses 4-bit high values (hex color format: 0xRGBA) 

3.2 Button Events: Color Switching & Clear Screen

// ---- A Button: Cycle Colors ----
controller.A.onEvent(ControllerButtonEvent.Pressed, () => {
    colorIndex = (colorIndex % 15) + 1; // Cycle through colors 1-15
    ball.replace(2, colorIndex);       // Replace all '2' pixels with new color
    music.playTone(262, 100);         // Audible feedback: C4 tone, 100ms
});

// ---- Menu Button: Clear Canvas ----
controller.menu.onEvent(ControllerButtonEvent.Pressed, ()=>{
    screen.fill(0);                   // Fill screen with transparent black
    ballX = 80; ballY = 60;          // Reset ball position
});

Interaction Design:
replace() dynamically swaps colors in bitmap

• Position reset ensures clean restart after clearing

3.3 Core Logic: Accelerometer Control & Rendering

// ---- Main Update Loop (60 FPS) ----
game.onUpdate(() => {
    // Accelerometer mapping: X/Y axis (-2000~2000) → Normalized (-10~10)
    ballX += input.acceleration(Dimension.X) / 200; 
    ballY += input.acceleration(Dimension.Y) / 200;

    // Boundary constraints
    ballX = Math.constrain(ballX, 0, 152); // 160-8=152 (ball width)
    ballY = Math.constrain(ballY, 0, 112); // 120-8=112

    // Draw semi-transparent trail
    screen.fillRect(ballX, ballY, 8, 8, colorIndex + (trailAlpha << 4));
    
    // Draw ball
    screen.drawTransparentBitmap(ball, ballX, ballY);
});

Physics & Graphics:
• Normalization formula: Δposition = acceleration / sensitivity

constrain() keeps coordinates within [min, max] range

• Hex color encoding: 0xRRGGBBAAtrailAlpha << 4 shifts transparency value



Chapter 4: Technical Deep Dive – Key Mechanisms

4.1 Accelerometer Data Processing

• Dual-axis input: X (left-right), Y (front-back) 

• Noise reduction: Moving average filter

// Example: Smooth accelerometer data
let smoothX = (input.acceleration(Dimension.X) * 0.2) + (smoothX * 0.8);

4.2 Color System & Palette

• 16-color default palette (modifiable via code)

// Custom palette example
palette.setColors(1, 0xFF0000); // Set index 1 to red

4.3 Advanced Bitmap Operations
• Runtime pixel manipulation:

// Set pixel color at (3,3)
ball.setPixel(3, 3, 5); // Yellow (index 5)


Chapter 5: Project Expansion – More Ideas & Educational Applications

5.1 Creative Extensions

Extension Implementation
Dual-Player Mode Two micro:bits controlling competing balls
Environmental Interaction Use temperature sensor to adjust colors


5.2 Educational Use Cases

• Physics class: Analyze acceleration-velocity relationships via trails 

• Art class: Explore color theory (RGB mixing, complementary colors)

• Programming concepts: Event-driven logic, loops, debugging



Chapter 6: FAQs & Debugging

6.1 Common Issues

• Symptom: Code fails to upload 

Solution:

  1. Check USB connection

  2. Restart MakeCode editor

6.2 Performance Optimization

• Render optimization: 

// Only update changed areas
screen.fillRect(ballX, ballY, 8, 8, 0); // Erase previous position


Chapter 7: Resources & Community

7.1 Learning Materials

• Official docs: MakeCode Arcade API Reference

• Video tutorials: YouTube channel MakeCode Minute

7.2 Open Source Projects

• GitHub: microsoft/makecode-arcade-games

• Community Gallery: MakeCode Arcade Gallery



Conclusion: From Toy to Tool

• Future possibilities: Integrate more sensors (light, temperature) 

• Educational impact: Develop "physical-digital" thinking skills

• Call to action: Start creating – turn ideas into interactive art!