RP2040 / RP2350 Boards
Arduino IDE Setup
madflight for RP2350/RP2040 requires arduino-pico v4.x.x or later (Note: for fast SDIO SDCARD arduino-pico v5.x.x is required.)
Start the Arduino IDE and select menu Tools->Board Manager to install this software.
Install the madflight library: use menu Tools->Manage Libraries, then search for madflight
Open a madflight example: use menu File->Examples->Examples for custom libraries->madflight->00.HelloWorld.ino
To compile an example use the following settings:
- Set menu Tools->Operating System to "FreeRTOS SMP"
- Set menu Tools->USB Stack to "Pico SDK"
PlatformIO Setup
-
Clone or download a madflight release to your harddisk
-
Start PlatformIO and open the madflight root folder
-
Open file platformio.ini and adapt the settings
-
Compile env:RP2040, env:RP2350A, or env:RP2350B
Note: RP2040/RP2350 is not merged into mainline PlatformIO, see here. On Windows you need to enable long path names, see previous link for instructions.
To enable uploading on Windows you need to use Zadig - Connect a RP2 device whilst holding the boot button, then in Zadig select "RP2 Boot (Interface 1) and install the WinUSB driver. See here
Pinout Raspberry Pi Pico / Pico2
This is the default pinout for RP2040 and RP2350. It is optimized for Raspberry Pi Pico / Pico2 (40 pin) boards. This pinout is definedbrd/default_RP2040.h, but can be modified with madflight_config configuration settings in your program.
| Module <-> HW_PIN_xxx | GPIO | Board | GPIO | HW_PIN_xxx <-> Module |
|---|---|---|---|---|
| pin_ser0_tx (connect to radio rx) | 0 | USB connector | VBUS | not connected |
| pin_ser0_rx (connect to radio tx) | 1 | VSYS | 5V input via diode (*) | |
| GND | GND | GND | GND | |
| pin_out0 (connect to motor/servo1) | 2 | EN | not connected | |
| pin_out1 (connect to motor/servo2) | 3 | 3.3V out | 3V3 | |
| pin_out2 (connect to motor/servo3) | 4 | VREF | not connected | |
| pin_out3 (connect to motor/servo4) | 5 | (A2) 28 | pin_bat_v (connect to battery voltage divider) | |
| GND | GND | GND | GND | |
| pin_out4 (connect to motor/servo5) | 6 | (A1) 27 | pin_bat_i (connect to battery current sensor) | |
| pin_out5 (connect to motor/servo6) | 7 | (A0) 26 | free for future use | |
| pin_ser1_tx (connect to gps rx) | 8 | RUN | reset button to GND | |
| pin_ser1_rx (connect to gps tx) | 9 | 22 | pin_imu_int (connect to SPI/I2C gyro interrupt out) | |
| GND | GND | GND | GND | |
| pin_i2c1_sda (connect to I2C gyro sda) | 10 | 21 | pin_i2c0_scl (connect to scl pins of barometer, magnetometer, etc.) | |
| pin_i2c1_scl (connect to I2C gyro scl) | 11 | 20 | pin_i2c0_sda (connect to sda pins of barometer, magnetometer, etc.) | |
| pin_spi1_miso (connect to sdcard miso) | 12 | 19 | pin_spi0_mosi (connect to SPI gyro mosi) | |
| _pin_bbx_cs _ (connect to sdcard cs) | 13 | 18 | pin_spi0_sclk (connect to SPI gyro sclk) | |
| GND | GND | GND | GND | |
| pin_spi1_sclk (connect to sdcard sclk) | 14 | 17 | pin_imu_cs (connect to SPI gyro cs) | |
| pin_spi1_mosi (connect to sdcard mosi) | 15 | JTAG pins | 16 | pin_spi0_miso (connect to SPI gyro miso) |
Internally connected: pin_led GPIO25
(*) 5V input via diode from BEC or DC-DC converter. Without a diode take care not connect USB and the battery at the same time!
RP2040/RP2350 Hardware
RP2350 (Raspberry Pi Pico2) is newer and a lot more powerful than RP2040 (Raspberry Pi Pico).
RP2350 has dual core processor, plus dual single precision FPUs.
RP2040 has dual core processor, but no FPUs.
madflight uses float and is much happier with RP2350 than with RP2040 !
madflight uses a custom Serial library, because the default Arduino Serial transmitter blocks after sending a couple bytes. Something we don't want.
madflight uses FreeRTOS and executes the 1000Hz IMU loop on the second core. The first core is used for the other sensors.
madflight Limitiations
- OUT: Consecutive even/odd PWM pins (e.g. pins 2,3 or 10,11) share the same timer and have the same frequency.

