# Embedded programming with Arduino on the Raspberry Pi Pico

## In this learning path

- [Introduction](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/)
- [About Embedded Programming](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/background/)
- [Application Programming](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/app_stack/)
- [Embedded Programming](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/embedded_stack/)
- [Embedded Programming on Arm](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/arm_embedded/)
- [Build a smart device prototype](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/raspberrypi_pico/)
- [Program your smart device prototype](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/arduino_sketch/)
- [Learn about interrupts](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/int-background/)
- [Add the interrupt code](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/int-setup/)
- [Refactor the application](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/refactoring/)
- [Next Steps](https://learn.arm.com/learning-paths/embedded-and-microcontrollers/arduino-pico/_next-steps/)

## About this Learning Path

| Skill level:         | Introductory           |
|----------------------|------------------------|
| Reading time:        | 1 hr                   |
| Last updated:        | 08 Jul 2026            |

| Author:              | Michael Hall, Arm      |
|----------------------|------------------------|
| Arm IP:              | [Cortex-M](https://support.arm.com/?tab=compute-ip&Product%20Type=Microcontrollers) |
| Tags:                | RTOS Fundamentals, Baremetal, Arduino |

### Who is this for?
This is an introductory topic for software developers interested in embedded programming.

### What will you learn?
Upon completion of this Learning Path, you will be able to:
- Understand the basics of embedded programming
- Know the differences between embedded and application development
- Write a simple embedded application
- Run your embedded application on a Raspberry Pi Pico
- Understand how hardware interrupts are used in embedded systems to respond to external changes
- Add interrupt handlers to an embedded application

### Prerequisites
Before starting, you will need the following:
- The [Arduino IDE with the RP2040 board support package](https://www.arm.com/install-guides/arduino-pico/) installed on your computer
- A [Raspberry Pi Pico](https://www.raspberrypi.com/products/raspberry-pi-pico/) board
- A [PIR sensor](https://www.amazon.com/HiLetgo-HC-SR501-Infrared-Sensor-Arduino/dp/B07KZW86YR/ref=sr_1_3?keywords=pir+sensor&qid=1698432931&sr=8-3) for detecting motion
- A [peizo-electric buzzer](https://www.amazon.com/mxuteuk-Electronic-Computers-Printers-Components/dp/B07VK1GJ9X/ref=sr_1_4?crid=2FAXYI17HZKDB&keywords=piezo+buzzer&qid=1698432968&sprefix=peizo%2Caps%2C148&sr=8-4) for signaling motion

### Summary
You’ll learn about embedded programming and build a motion detector with a Raspberry Pi Pico (RP2040, Cortex-M0+). First, you’ll compare application and embedded software stacks, then apply those differences by wiring a passive infrared (PIR) sensor and a piezo buzzer to the Pico. Using the Arduino IDE, you’ll write a simple sketch that configures GPIO, registers an interrupt handler, and reacts to external changes without polling. Finally, you’ll deploy to bare metal on the Pico and validate that motion events trigger the buzzer immediately, demonstrating how hardware interrupts drive responsive behavior on a small Arm microcontroller.

### Frequently asked questions

<details>
<summary>Which board and port should I select in the Arduino IDE before uploading?</summary>
Select an RP2040-based board from the installed package and choose the USB/serial port associated with the Raspberry Pi Pico. If the upload fails, recheck both the board and port selections.
</details>

<details>
<summary>How should I wire the PIR sensor and buzzer to match the sketch?</summary>
Connect the PIR output to a digital input pin and the buzzer to a digital output pin with a common ground. Make sure the pin numbers in your wiring match the pin definitions used in the sketch.
</details>

<details>
<summary>How do I know the interrupt is working instead of polling?</summary>
When motion occurs, the buzzer responds immediately without waiting for a timed loop. If you see an instant reaction when the PIR output changes, the interrupt handler is being invoked.
</details>

<details>
<summary>What should I check if the buzzer never reacts to motion?</summary>
Verify power and common ground, confirm the selected GPIO pins match the sketch, and ensure the input is configured for the PIR signal and the output drives the buzzer. Also recheck that the correct RP2040 board and port are selected and that the upload completed successfully.
</details>

<details>
<summary>Does this project use an RTOS?</summary>
No. The example runs on bare metal using Arduino tooling on the RP2040. Any RTOS stack references are for context about typical Arm embedded architectures, not for this build.
</details>
