In this article we will have a look a the Arduino vs the Pico Elecrow Starter Kit for STEM education. Both starter kits offer many different sensors (light, sound, distance, …) and some actuators (servo, LED, relay, buzzer, …) that can be programmed via the Arduino IDE.
The main difference is that one Starter Kit uses the Arduino (ATmega328P) as microcontroller, while the other contains the Pico 2 (RP2350) chip instead. There are also some differences in the integrated sensors, actuators and the display, which we will discuss as well.
Required Parts
Below you will find the links to the two Starter Kits. As you can see they come in the shape of little suitcases (195*170*46mm) with the sensors and actuators easily accessible on a front panel:
Starter Kit with Arduino
Starter Kit with Pico 2
In the next two sections we first have a closer look at the Arduino based kit and then discuss the Starter Kit with the Pico 2.
Starter Kit with Arduino
The Arduino based Starter Kit comes with integrated sensors for Light, Temperature, Humidity, Sound, Distance, Acceleration, Motion and IR light, and an additional Moisture sensor that can be connected via a Crowtail interface. There are six of these Crowtail interfaces, which provide two analog IOs, one digital IO, two I2C interfaces and one UART interface.
In addition to the sensors there is an LCD, a Button, a Relay, a Buzzer, a Servo and a linear Potentiometer as actuator. The picture below shows the Front Panel of the Kit with the labelled sensors and actuators.
The kit comes with Demo Code, a Tutorial/User Manual and the Schematics of the Hardware. The following table lists GPIO pins or I2C addresses (source) for the different sensors and actuators:
Sensor | GPIO pin | I2C |
---|---|---|
I2C | A5/SCLA4/SDA | |
UART | D0/RXD1/TX | |
Analog Input | A3 | |
Analog Input | A6 | |
Digital IO | D11 | |
Light Sensor | A5/SCLA4/SDA | 0X5C |
LED | D10 | |
Button | D7 | |
Servo | D9 | |
PIR | A2 | |
MPU-6050 | A5/SCLA4/SDA | 0x68 |
Buzzer | D3 | |
Linear Potentiometer | A0 | |
Relay | D4 | |
Sound Sensor | A1 | |
IR Remote Sensor | D2 | |
Temperature & Humidity | A5/SCLA4/SDA | 0X38 |
Ultrasonic Sensor | D5_US_ECHOD6_US_TRIG | |
LCD | A5/SCLA4/SDA | 0X21 |
Programming the Arduino Starter Kit
Programming the Arduino based Starter Kit works the same as programming an Arduino UNO. First Install the Arduino IDE on your PC as usual. Connect the Kit via USB to your PC. Then open the Board Manager and select the “Arduino Uno” board as shown below.
The board should be recognized as connected to one of the COM ports. In the example above it is COM5 but in your case it may appear on a different port.
If that works then you can start writing and uploading code. Unfortunately the Demo Code and the Tutorial for the Starter Kit contains quite a few error and in my opinion is not easy to understand. I therefore implemented a few code examples myself, which you can find below.
Code Example: Blink LED
The following code is the classic Blink example. It switches the red LED on for one second, then off for one second and repeats this cycle indefinitely:
const int ledPin = 10; void setup() { pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); delay(1000); digitalWrite(ledPin, LOW); delay(1000); }
Code Example: Button & LED
In this next example we use the button to switch the red LED on or off. As long as the button is pressed the LED will be on:
const int buttonPin = 7; const int ledPin = 10; void setup() { pinMode(buttonPin , INPUT); pinMode(ledPin, OUTPUT); } void loop() { if (!digitalRead(buttonPin)) { digitalWrite(ledPin, HIGH); delay(100); digitalWrite(ledPin, LOW); } }
If you want to learn more about buttons have a look at the How To Use A Push Button With Arduino tutorial.
Code Example: Motion Sensor & LED
This code examples shows how to control the LED with the motion sensor. Whenever motion is detected by the PIR sensor, the red LED is switched on for one second.
const int pirPin = A2; const int ledPin = 10; void setup() { pinMode(pirPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { if (digitalRead(pirPin)) { digitalWrite(ledPin, HIGH); delay(1000); } digitalWrite(ledPin, LOW); delay(10); }
I you want to learn more about Passive InfraRed (PiR) sensors for motion detection, have a look at the How to use HC-SR501 PIR Motion Sensor with Arduino tutorial.
Code Example: Sound Sensor & Relay
In the following example we switch on the Relay if the microphone detects any sound with a volume above the defined threshold of 50. You can change the threshold to make the sound detection more or less sensitive.
const int soundPin = A1; const int relayPin = 4; const int threshold = 50; void setup() { pinMode(soundPin, INPUT); pinMode(relayPin, OUTPUT); } void loop() { if (analogRead(soundPin) > threshold) { digitalWrite(relayPin, HIGH); delay(1000); digitalWrite(relayPin, LOW); delay(100); } }
For more information on Relays, have a look at the How To Use A Relay With Arduino tutorial.
Code Example: Ultrasonic Distance Sensor & Buzzer
The example below uses the Ultrasonic Sensor to measure distances and if the distance is smaller than 30 centimeters the buzzer is activated to emit a warning sound:
#include "HCSR04.h" const int triggerPin = 6; const int echoPin = 5; const int buzzerPin = 3; UltraSonicDistanceSensor sensor(triggerPin, echoPin); void setup() { } void loop() { float dist = sensor.measureDistanceCm(); if (dist > 0 && dist < 30) { tone(buzzerPin, 2000); delay(100); noTone(buzzerPin); } }
If you need more information on buzzers have a look at the Use A Piezo Buzzer With Arduino tutorial. And if you want to learn more about the Ultrasonics Distance Sensor, you can read our How to use an HC-SR04 Ultrasonic Distance Sensor with Arduino tutorial.
Code Example: Ultrasonic Distance Sensor & Servo
This next example uses the Ultrasonic Sensor again but now for controlling the Servo. The closer an object gets to the sensor the more the Servo turns.
#include "HCSR04.h" #include "Servo.h" const int triggerPin = 6; const int echoPin = 5; const int servoPin = 9; Servo servo; UltraSonicDistanceSensor sensor(triggerPin, echoPin); void setup() { servo.attach(servoPin, 600, 2520); } void loop() { float dist = sensor.measureDistanceCm(); if (dist > 0 && dist < 30) { int pos = map(dist, 0, 30, 0, 180); servo.write(pos); delay(50); } }
For more information on servos have a look at our How to control servo motors with Arduino tutorial. And if you want to control the Servo via an IR remote using the built in IR sensor, read the How to Control a Servo with an IR Remote tutorial.
Code Example: Temperature & Humidity Sensor & LCD
As a final example, we are measuring Temperature and Humidity with the DHT20 sensor and display the measure values on the LCD:
#include "DHT20.h" #include "Adafruit_LiquidCrystal.h" DHT20 dht(&Wire); Adafruit_LiquidCrystal lcd(0x21); void setup() { lcd.begin(16, 2); Wire.begin(); dht.begin(); } void loop() { dht.read(); lcd.setCursor(2, 0); lcd.print("Tem: "); lcd.print(dht.getTemperature()); lcd.print(" C"); lcd.setCursor(2, 1); lcd.print("Hum: "); lcd.print(dht.getHumidity()); lcd.print(" %"); delay(500); }
If you need more help around LCDs, have a look at the Interfacing 128 x 64 Graphical LCD With Arduino and the How to use a 16×2 character LCD with Arduino tutorials.
Starter Kit with Pico 2
The Starter Kit based on the Raspberry Pico 2 microcontroller comes with sensors for touch, light, magnetic fields, gas, sound, temperature, humidity and an ultrasonics distance sensor.
As for actuators and other output devices, there is a buzzer, a servo motor, a vibration motor, a relay, a potentiometer, several buttons, three LEDs, two stripes of RGB LEDs and a TFT screen. The picture below shows the Front Panel of the Kit with its sensors and actuators.
This kit comes as well with Demo Code, a Tutorial/Manual, a Wiki and the Schematics for the hardware circuits.
Programming the Pico Starter Kit
Before you can program the Pico 2 with the Arduino IDE you need to install the RP2350 core. Go to File -> Preferences in the Arduino IDE and open the Preferences Dialog
In the Preferences Dialog go to the Settings Tab. At the bottom you will see “Additional boards manager URLs:”. Click on the button to the right (marked yellow) to open the URL editor
In the URL editor add the following URL to the list (marked yellow below):
“https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json”
Despite its name, the package_rp2040_index supports the RP2040 and the RP2350 chip, which is used in the Pico Starter Kit.
As you can see, I have also installed the ESP8266 and the ESP32 cores but you need only the RP2350 core for Pico based Starter Kit.
Installation of RP2350 Boards
Next we need to install the RP2350 Boards. Go to Tools -> Board -> Board Manager and search for RP2350 using the search bar. Install the Raspberry Pi Pico/RP2040/RP2350 boards by Earle F. Philhower. After installation it should look like this.
Select Raspberry Pi Pico 2 board
Once the installation of the RP2350 core is completed, connect the Pico Starter Kit to the USB port of your computer. Then go to the Board Manager and select the “Raspberry Pi Pico 2 board” board as shown below:
The board should be recognized by the Arduino IDE and you should see it connected to a COM port via USB (see screenshot above).
Now we are ready to program it. For convenience here a table with some of the GPIO pins and the sensors or actuators they are attached to (source):
GPIO Pin | Function |
---|---|
GP0_LED_BK | LED_BK |
GP1_PSRAM_CS | PSARM chip select |
GP4/I2C0_SDA | TFT screen touch |
GP5/I2C0_SCL | |
GP2/I2C1_SDA | Temperature & Humidity DHT20(0X38) MPU-6050(0x68) LIGHT SENSOR(0x5C) |
GP3/I2C1_SCL | |
GP6_SPI0_CLK_TFT | TFT screen display |
GP7_SPI0_MOSI_TFT | |
GP16_RS_TFT | |
GP17_SPI0_CS_TFT | |
GPIO24_TP_RST | |
GPIO25_TP_INT | |
GP26_A0_GAS | Smoke Sensor |
GP27_A1_KEY | 4*button |
GP28_A2_POT | Slide Potentiometers |
GP29_A3_SOUND | Sound Sensor Module |
QSPI_SD3 | W25Q64 NORFlash & APS6404L PSRAM |
QSPI_SCLK | |
QSPI_SD0 | |
QSPI_SD2 | |
QSPI_SD1 | |
QSPI_SS | |
GPIO8_US_ECHO | Ultrasonic Module |
GPIO9_US_TRIG | |
GPIO10_BUZZER | BUZZER Module |
GPIO11_IR | IR Module |
GPIO12_RELAY | RELAY Module |
GPIO13_SERVO | SERVO Module |
GPIO14_TOUCH | TOUCH Module |
GPIO15_VIB | Vibration Motor Module |
GPIO18_LED_RED | LED |
GPIO19_LED_GREEN | LED |
GPIO20_LED_YELLOW | LED |
GPIO21_HALL | Hall Sensor Modules |
GPIO22_RGB | RGB LED*20 |
GPIO23_RGB_EN |
The Pico Starter Kit comes with some Demo Code and a Tutorial but the code is one big chunk and not very suitable to learn how to use the different sensors of the kit. I therefore implemented a few simple examples that will get you started easily.
Code Example: Blink three LEDs
This first example simply blinks the three LEDs (red, green, yellow) one-by-one:
// red, green, yellow LEDS const int leds[] = { 18, 19, 20 }; void setup() { for (int i = 0; i < 3; i++) { pinMode(leds[i], OUTPUT); } } void loop() { for (int i = 0; i < 3; i++) { digitalWrite(leds[i], HIGH); delay(500); digitalWrite(leds[i], LOW); } }
Code Example: Gas Sensor & Serial Monitor
In next example we read the value from the Gas Sensor and print it to the Serial Monitor:
void setup() { Serial.begin(115200); } void loop() { int sensorValue = analogRead(A0); Serial.print("Gas:"); Serial.println(sensorValue); delay(1000); }
If you want to learn more about the MQ-2 Gas Sensor and how to interpret those values have a look at our How to use the MQ-2 Gas Sensor with Arduino tutorial.
Code Example: Touch Sensor & Buzzer
The following code read the touch sensor and emits a tone on the buzzer, if a touch is detected:
const int touchPin = 14; const int buzzerPin = 10; void setup() { pinMode(buzzerPin, OUTPUT); pinMode(touchPin, INPUT); } void loop() { delay(50); if (digitalRead(touchPin)) { tone(buzzerPin, 2000); } else { noTone(buzzerPin); } }
For more information on buzzers have a look at the Use A Piezo Buzzer With Arduino tutorial.
Code Example: Sound Sensor & LED
The following example uses the microphone to detect sound and if the sound volume exceeds a certain threshold the red LED is switched on.
const int ledPin = 18; const int soundPin = 29; void setup() { pinMode(ledPin, OUTPUT); pinMode(soundPin, INPUT); } void loop() { if (analogRead(soundPin) > 50) { digitalWrite(ledPin, HIGH); delay(100); } else { digitalWrite(ledPin, LOW); } }
Code Example: Servo & Potentiometer
With this example you can use the linear Potentiometer to control the position of the Servo arm:
#include "Servo.h" const int servoPin = 13; Servo servo; void setup() { servo.attach(servoPin, 600, 2520); } void loop() { int pot = analogRead(A2); int pos = map(pot, 0, 1024, 0, 180); servo.write(pos); delay(10); }
For more information on servos have a look at the How to control servo motors with Arduino and the Positional versus Continuous Servos tutorials. If you want to control the Servo via an IR remote using the built in IR sensor of the kit, the How to Control a Servo with an IR Remote tutorial will come in handy.
Code Example: Ultrasonic Distance Sensor & Relay
In the following code example we are switching the Relay (and the red LED) on if the distance measured by the Ultrasonic Sensor becomes smaller than 10 cm:
#include "HCSR04.h" const int triggerPin = 9; const int echoPin = 8; const int relayPin = 12; const int ledPin = 18; UltraSonicDistanceSensor sensor(triggerPin, echoPin); void setup() { pinMode(relayPin, OUTPUT); pinMode(ledPin, OUTPUT); } void loop() { float dist = sensor.measureDistanceCm(); if (dist > 0 && dist < 10) { digitalWrite(relayPin, HIGH); digitalWrite(ledPin, HIGH); delay(1000); } digitalWrite(relayPin, LOW); digitalWrite(ledPin, LOW); }
If you want to learn more about the Ultrasonics Distance Sensor, you can read our How to use an HC-SR04 Ultrasonic Distance Sensor with Arduino tutorial. And for more infos on Relays, have a look at the How To Use A Relay With Arduino tutorial.
Code Example: TFT Screen
The Pico Starter Kit contains a TFT screen and here is simple example on how to use this screen with the Adafruit-ST7735-Library. The code simply write the text “Makerguides” on the display.
#include "Adafruit_GFX.h" #include "Adafruit_ST7789.h" #include "SPI.h" #define TFT_CS 17 #define TFT_RST -1 #define TFT_DC 16 #define TFT_MOSI 7 #define TFT_SCLK 6 Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST); const int tftBacklight = 0; void setup() { pinMode(tftBacklight, OUTPUT); digitalWrite(tftBacklight, HIGH); tft.init(240, 320); tft.fillScreen(ST77XX_BLACK); tft.setRotation(3); tft.setCursor(60, 100); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(3); tft.print("Makerguides"); } void loop() {}
If you want to do more than just writing text, have a look at the Adafruit GFX Graphics Library documentation. In addition to text, you can display all kinds of graphics (lines, rectangles, …) and colors.
Some other relevant information is also available in the Interface TFT ST7789 Display with ESP32 and the Interfacing 1.8-inch TFT Color Display With Arduino tutorials.
Code Example: TFT Screen & Temperature & Humidity Sensor
This final example demonstrates how to read data from the Temperature and Humidity Sensor, and how to display the measured values on the TFT display:
#include "Adafruit_GFX.h" #include "Adafruit_ST7789.h" #include "SPI.h" #include "DHT20.h" const int tftBacklight = 0; // CS, DC, MOSI, SCLK, RST Adafruit_ST7789 tft = Adafruit_ST7789(17, 16, 7, 6, -1); DHT20 dht(&Wire1); void setup() { pinMode(tftBacklight, OUTPUT); digitalWrite(tftBacklight, HIGH); tft.init(240, 320); tft.fillScreen(ST77XX_BLACK); tft.setRotation(3); tft.setTextColor(ST77XX_WHITE); tft.setTextSize(3); Wire1.setSDA(2); Wire1.setSCL(3); Wire1.begin(); dht.begin(); } void loop() { dht.read(); tft.fillScreen(ST77XX_BLACK); tft.setCursor(30, 50); tft.printf("Tmp: %.2f C", dht.getTemperature()); tft.setCursor(30, 100); tft.printf("Hum: %.2f %%", (double)dht.getHumidity()); delay(1000); }
You will note that the display flickers with every update of the displayed values. We need to clear the screen between every update, since text is written with a transparent background and would therefore overwrite itself. You can avoid this by writing to a canvas first and then updating the display. Have a look at the Adafruit GFX Graphics Library documentation, if you want to do this.
Comparison of the Starter Kits
The main difference between the two Starter Kits is the microcontroller. One uses an Arduino (ATmega328P) as microcontroller, while the other uses the Pico 2 (RP2350). The Pico is much more powerful but is newer and therefore has less support with respect to libraries, information and general help.
Also the Pico based Starter Kit comes with a TFT screen that has much higher resolution (and color), compared to the LCD display of the Arduino based Starter kit. However, it is a bit easier to write code for the LCD screen.
The Pico Kit has more LEDs including RGB LEDs, and more sensors such as Gas Sensor, Hall Sensor and a Touch Sensor. There is also a Vibration motor that the Arduino Kit lacks. And the Pico Kit has four buttons, while the Arduino Kit has only one button.
On the other hand, the Pico Kit does not have Crowtail Interfaces or any other exposed GPIO pins that could be used to connect external sensors, such as the Moisture Sensor that comes with the Arduino Kit.
Both Starter Kits have GPIO and I2C addresses for the sensors and actuators labelled on the silk screen (panel), which is very handy when writing the control code.
Apart from the TFT screen of the Pico Kit, you can write very similar code and build many similar projects with both kits, since the sensors are largely the same and can be programed in the same way.
Conclusions
Both kits are great if you want to learn how to write Arduino code to read sensor data and to control actuators. However, the provided tutorial and code examples could be better. Especially the example code for the Pico based Starter Kit comes as one big chunk of code and is not split into individual tutorials for each of the sensors.
The intend of both Starter Kits is clearly on providing an easy hardware platform for STEM education and in that they succeed. They are fantastic if you quickly want to try out and play with different sensors or actuators. The suitcase format is very handy, and you don’t have to worry about loosing cables or sensors.
On the other hand, you will not learn how to build a circuit yourself. The internal circuits of the kits are more complex (more robust) as one would build for educational purposes and therefore not suitable examples for beginners. Though having the Schematics for both kits is very handy.
If you want a hardware platform for STEM education, I would go with the Arduino based kit, since the Arduino (ATmega328P) is better supported than the Pico and the LCD is easier to use.
However, if the focus is more on lighting effects or game development, the Pico based Kit is the better pick due to the RGB LED strips, the TFT screen and the four buttons that can be used for game control. Also, if you prefer MicroPython, the Pico with the higher compute power and memory is what you want.
Happy Tinkering ; )
Stefan is a professional software developer and researcher. He has worked in robotics, bioinformatics, image/audio processing and education at Siemens, IBM and Google. He specializes in AI and machine learning and has a keen interest in DIY projects involving Arduino and 3D printing.