Raspberry Pi simulator for GPIO, in Python with gpiozero
The Raspberry Pi 4 Model B, the Raspberry Pi 5 and the Raspberry Pi Zero 2 W, from their 40-pin header. Your main.py runs in a Python engine in the page, and gpiozero and RPi.GPIO drive the header as they do on a real Pi, on the simulated clock. There is no Linux here, and this page says plainly what that leaves out.
- 9peripheral areas modeled
- 9projects ready to run
- Real timeon your own machine
What is modeled
Taken from the board's own contract document and put in plain words, with what is missing beside it.
Modeled
- The header
- All 40 pins in their real order, named by BCM number, with BOARD numbering mapped to them
- Power
- 3V3 on pins 1 and 17, 5V on pins 2 and 4, and the eight grounds
- GPIO
- GPIO 0 to 27 at 3.3 V logic, as inputs with their 50 k pulls or as outputs, with the SoC’s power-on pulls and the 1.8 k pull-ups on GPIO 2 and 3
- gpiozero 2.0.1
- LED, PWMLED, RGBLED, Button, Buzzer, Servo, AngularServo, DistanceSensor, MotionSensor, LineSensor and more, on the lgpio pin factory
- RPi.GPIO 0.7.1
- BCM and BOARD, setup, output, input, PWM, add_event_detect, wait_for_edge and cleanup, with the library’s own warnings and errors
- Time
- time.sleep(1) is one simulated second; edge callbacks run at the time of the edge
- The Pi 5
- RPi.GPIO fails there with the error a real Pi 5 gives, and gpiozero works
- I2C and SPI
- /dev/i2c-1 and /dev/spidev0.0 and 0.1, with smbus, smbus2, spidev and gpiozero’s MCP3008, at the speed of the bus and with the errors a Pi gives
- The Serial Monitor
- print() and tracebacks, input(), and Ctrl-C as KeyboardInterrupt
Not modeled
- Linux. There is no kernel, no desktop, no terminal, no sudo and no file system beyond the project’s files.
- pip and apt. Only the modules that come with the board can be imported.
- Networking: no Wi-Fi, Ethernet or Bluetooth, and no socket or requests.
- The camera, the display, HDMI and audio.
- The I2C bus’s speed setting and clock stretching: I2C runs at Raspberry Pi OS’s default 100 kHz.
- Threads. gpiozero’s callbacks, blink() and PWM run without them.
- CPython itself: the engine is MicroPython, so a few details of the language differ (isinstance(True, int) is False). Programs that drive the pins run unchanged.
Open one and press Run
Each of these opens in the editor exactly as it is drawn here.
Every built-in project on the Raspberry Pi
Each has its own page with the circuit running, the code and a parts list.
Tutorials that use this board
Each one ends in a running circuit, on this same board.
Questions
Is it free?
Yes. Every board and every part is on the free plan, with no account needed.
Is this a Raspberry Pi emulator?
No. There is no Arm core and no Linux. Your Python runs in a Python engine in the page, and its gpiozero and RPi.GPIO drive the header. Everything a circuit can see of a Pi is here; the operating system is not.
Why does RPi.GPIO fail on the Pi 5?
Because it fails on a real Pi 5: the pins are on the RP1 chip, which RPi.GPIO 0.7.1 cannot find, and GPIO.setup raises "Cannot determine SOC peripheral base address". Use gpiozero, which works on all three boards.
Can I pip install a library?
No. Add a library’s .py file as a tab of its own and import it from main.py, which works for libraries written in plain Python.
Will my program run on a real Pi?
Yes, with gpiozero or RPi.GPIO as they ship with Raspberry Pi OS. Timing on a real Pi is looser: software PWM jitters there and does not here.
The other boards
Every one of these runs today, and every one is free.
Looking for the shorter introduction? See the Raspberry Pi simulator page.
A RISC-V chip at 160 MHz, on the real memory map.
The classic Arduino, with an ATmega328P running at 16 MHz.
The Uno’s chip on a small board that fits a breadboard.
The big Arduino, with 54 digital pins and four serial ports.
An Uno-shaped board whose chip does its own USB serial.
A second RISC-V board, with 31 pins and simulated WiFi.
The classic ESP32 at 240 MHz, with simulated WiFi.
The ESP32-S3 at 240 MHz, with USB serial and an RGB LED.
Try it with your own Python
Write main.py with gpiozero or RPi.GPIO and press Run. Nothing to install and no account needed.