Seeed Xiao RP2040
After milling the PCB board, it was time to solder on the components and test it out.
Materials
Component | Amount |
Seeed Xiao RP2040 Chip | 1 |
PCB | 1 |
Conn Header SMD 10POS 1.27mm | 1 |
Conn Header SMD R/A 6POS 2.54mm | 1 |
Tactile Switch SPST-NO Top Actuated Surface Mount | 1 |
Blue LED | 3 |
1K Ohm Resistor | 4 |
499 Ohm Resistor | 1 |
Soldering
While soldering, I used the following references produced by Adrián Torres and David Taylor respectively.
Before starting the soldering, I put a piece of kapton tape on the back of the chip so that the circuit would not short itself when it is plugged in.
I first aligned and soldered on the RP2040 chip. As the biggest component, I wanted to solder this on before any other parts.
Next, I soldered on the first blue LED at the top left, coming out of pin 26.
I then soldered on the 1k Ohm resistor for that LED.
I soldered on the button, along with 2 other resistors and an LED.
Next, I soldered on the Conn Header SMD 10POS 1.27mm, along with the final LED.
I then soldered on the remaining 2 resistors.
Finally, I soldered on the Conn Header SMD R/A 6POS 2.54mm.
Software
Board Selection
To download the required library for the Seeed Xiao 2040 chip, I had to add additional board URLs. I added the following URLs under the Additional Board URLs Manager in the Arduino IDE under File -> Preferences -> Additional Boards Manager. Each line represents a different URL. In other words, the URLs are seperated by a newline space.
https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_dev_index.json
I was then able to select the correct board in the IDE.
Port Selection Disabled
As I was trying out pushing more advanced programs onto the board, I encountered an issue where the "Port" selection button was grayed out and would not let me click into it.
I searched for a solution online and found that I needed to reinstall/update a driver for the chip. However, under my Windows 11 Device Manager panel, the device was unrecognized by my computer and I had to manually find a zip file online to use as a driver. After spending about an hour going down this rabbit hole, I eventually realized that I could have simply reset the board. I did this by holding down the bootload button (indicated with a capital B) and clicking the reset button (indicated by a capital R).
After resetting the board, the Port selection started working again and recognized the RP2040's UF2 bootloader.
I then selected the UF2 bootloader option. At this point, the chip will accept uploaded code. As such, I sent the blinking program (any program would suffice) and the code worked on the chip. After the code was compiled and uploaded, the Port selection fixed itself and returned to the usual COM port selection.
Programming
LED Blinking
To test the circuit board, I wrote a simple program to blink all 3 LEDs that I sent to my fellow classmates. The LEDs are connected to pin 0, 1, and 26 respectively.
void setup() {
pinMode(1, OUTPUT); //bottom right LED
pinMode(26, OUTPUT); //top left LED
pinMode(0, OUTPUT); //bottom left LED
}
void loop() {
digitalWrite(1, HIGH); //turns bottom right LED on
digitalWrite(26, HIGH); //turns top left LED on
digitalWrite(0, HIGH); //turns bottom left LED on
delay(1000); //waits for 1 second
digitalWrite(1, LOW); //turns bottom right LED off
digitalWrite(26, LOW); //turns top left LED off
digitalWrite(0, LOW); //turns bottom left LED off
delay(1000); //waits for 1 second
}
After uploading it, all of my LEDs worked without any issues!
Button-Controlled LEDs
I then created a program that would turn on the LEDs when a button is pressed. The button is connected to pin 27.
void setup() {
// Initialize LED pins as outputs
pinMode(1, OUTPUT); // Bottom right LED
pinMode(26, OUTPUT); // Top left LED
pinMode(0, OUTPUT); // Bottom left LED
// Initialize the button pin as an input
pinMode(27, INPUT_PULLUP); // Button tactile switch on pin 27
}
void loop() {
// Read the state of the button
int buttonState = digitalRead(27);
// If the button is not pressed, turn off the LEDs
if (buttonState == LOW) { // The button is not pressed
digitalWrite(1, LOW); // Turn off bottom right LED
digitalWrite(26, LOW); // Turn off top left LED
digitalWrite(0, LOW); // Turn off bottom left LED
}
// The button is pressed
else {
digitalWrite(1, HIGH); // Turn on bottom right LED
digitalWrite(26, HIGH); // Turn on top left LED
digitalWrite(0, HIGH); // Turn on bottom left LED
}
}
This video demonstrates the code in action.
Button Toggling LEDs
I wanted to create a program that would allow the button to act as a toggle for the LEDs. The LEDs would begin in the off state, then turn on when the button is pressed and vice versa. This program was slightly more difficult to write than the others, but also far more interesting.
// Define LED and Button pins as global variables
int ledPins[] = {0, 1, 26};
int buttonPin = 27;
// Variable to store the LED state
bool ledState = false;
// Variable to store the last button state
int lastButtonState = LOW;
void setup() {
// Initialize LED pins as outputs
for (int i = 0; i < 3; i++) {
pinMode(ledPins[i], OUTPUT);
}
// Initialize the button pin as an input
pinMode(buttonPin, INPUT_PULLUP);
}
void loop() {
// Read the state of the button
int buttonState = digitalRead(buttonPin);
// Check if the button is pressed. The second part of the conditional ensures that the button only triggers the toggle once per actual press down.
if (buttonState == LOW && lastButtonState == HIGH) {
ledState = !ledState;
// Toggle the LEDs
for (int i = 0; i < 3; i++) {
digitalWrite(ledPins[i], ledState ? HIGH : LOW);
}
// Debounce delay
delay(50);
}
// Update the last button state
lastButtonState = buttonState;
}
Here is the program running on the board: