Skip to Content

Arduino vs Pico Elecrow Starter Kit

Arduino vs Pico Elecrow Starter Kit

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.

Front Panel of Arduino Starter Kit
Front Panel of Arduino Starter Kit (source)

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:

SensorGPIO pinI2C
I2CA5/SCLA4/SDA
UARTD0/RXD1/TX
Analog InputA3
Analog InputA6
Digital IOD11
Light SensorA5/SCLA4/SDA0X5C
LEDD10
ButtonD7
ServoD9
PIRA2
MPU-6050A5/SCLA4/SDA0x68
BuzzerD3
Linear PotentiometerA0
RelayD4
Sound SensorA1
IR Remote SensorD2
Temperature & HumidityA5/SCLA4/SDA0X38
Ultrasonic SensorD5_US_ECHOD6_US_TRIG
LCDA5/SCLA4/SDA0X21

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.

Select Arduino Uno in Board Manager
Select Arduino Uno in Board Manager

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.

Front Panel of Pico Starter Kit
Front Panel of Pico Starter Kit (source)

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

File -> Preferences Menu
File -> Preferences Menu

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

Settings Tab in Preferences Dialog
Settings Tab in Preferences Dialog

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”

Add package_rp2040_index URL to board manager
Add package_rp2040_index URL to board manager

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.

Install Raspberry Pi Pico/RP2040/RP2350 board
Install Raspberry Pi Pico/RP2040/RP2350 board

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:

Raspberry Pi Pico 2 in Bord Manager
Raspberry Pi Pico 2 in Bord Manager

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 PinFunction
GP0_LED_BKLED_BK
GP1_PSRAM_CSPSARM chip select
GP4/I2C0_SDATFT screen touch
GP5/I2C0_SCL
GP2/I2C1_SDATemperature & Humidity DHT20(0X38) MPU-6050(0x68) LIGHT SENSOR(0x5C)
GP3/I2C1_SCL
GP6_SPI0_CLK_TFTTFT screen display
GP7_SPI0_MOSI_TFT
GP16_RS_TFT
GP17_SPI0_CS_TFT
GPIO24_TP_RST
GPIO25_TP_INT
GP26_A0_GASSmoke Sensor
GP27_A1_KEY4*button
GP28_A2_POTSlide Potentiometers
GP29_A3_SOUNDSound Sensor Module
QSPI_SD3W25Q64 NORFlash & APS6404L PSRAM
QSPI_SCLK
QSPI_SD0
QSPI_SD2
QSPI_SD1
QSPI_SS
GPIO8_US_ECHOUltrasonic Module
GPIO9_US_TRIG
GPIO10_BUZZERBUZZER Module
GPIO11_IRIR Module
GPIO12_RELAYRELAY Module
GPIO13_SERVOSERVO Module
GPIO14_TOUCHTOUCH Module
GPIO15_VIBVibration Motor Module
GPIO18_LED_REDLED
GPIO19_LED_GREENLED
GPIO20_LED_YELLOWLED
GPIO21_HALLHall Sensor Modules
GPIO22_RGBRGB 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 ; )