Найти в Дзене
Паяльник и код

Raspberry PI RP2040-Zero плата для DIY проектов. Обзор. Прошивка. Примеры

RP2040-Zero - это миниатюрная версия платы Raspberry PI Pico, построенная на базе микроконтроллера RP2040. Несмотря на небольшие размеры, эта плата обладает большими возможностями. Контроллер поддерживает 2 языка программирования – Pico C/C++ и MicroPython - Микроконтроллер RP2040 Raspberry Pi
- Двухъядерный процессор Arm Cortex M0+ с тактовой частотой до 133 МГц
- 264 КБ SRAM памяти
- 2 МБ флэш памяти на микросхеме W25Q16JVUXIQ (NOR-Flash)
- DMA контроллер
- Разъем USB Type-C
- USB 1.1 с поддержкой хоста
- Поддержка спящих режимов и пониженной частоты для снижения потребления
- 20 выводов GPIO разведены на плате под штыревой разъем
- 9 выводов GPIO разведены на плате в виде контактных площадок
- 2 × SPI, 2 × I2C, 2 × UART, 4 × 12-битный АЦП, 16 × управляемых каналов ШИМ
- Встроенные часы и таймер
- Встроенный датчик температуры
- Встроенные библиотеки для ускоренного вычисления чисел с плавающей точки
- 8 программируемых пинов ввода/вывода (PIO) с машинами состояний для
реализации по
Оглавление

RP2040-Zero - это миниатюрная версия платы Raspberry PI Pico, построенная на базе микроконтроллера RP2040. Несмотря на небольшие размеры, эта плата обладает большими возможностями. Контроллер поддерживает 2 языка программирования – Pico C/C++ и MicroPython

Размер

-2

Характеристики

- Микроконтроллер RP2040 Raspberry Pi
- Двухъядерный процессор Arm Cortex M0+ с тактовой частотой до 133 МГц
- 264 КБ SRAM памяти
- 2 МБ флэш памяти на микросхеме W25Q16JVUXIQ (NOR-Flash)
- DMA контроллер
- Разъем USB Type-C
- USB 1.1 с поддержкой хоста
- Поддержка спящих режимов и пониженной частоты для снижения потребления
- 20 выводов GPIO разведены на плате под штыревой разъем
- 9 выводов GPIO разведены на плате в виде контактных площадок
- 2 × SPI, 2 × I2C, 2 × UART, 4 × 12-битный АЦП, 16 × управляемых каналов ШИМ
- Встроенные часы и таймер
- Встроенный датчик температуры
- Встроенные библиотеки для ускоренного вычисления чисел с плавающей точки
- 8 программируемых пинов ввода/вывода (PIO) с машинами состояний для
реализации пользовательских аппаратных интерфейсов

-3

1. USB Type-C
2. W25Q16JVUXIQ - 2 МБ флэш память
3. кнопка BOOT
4. кнопка RESET
5. светодиод ws2812
6. ME621 регулятор напряжения, 800мА
7. двухъядерный процессор Arm Cortex M0+ с тактовой частотой до 133 МГц
8. дополнительные выводы GPIO

Прошивка

Прошивать будем в Arduino IDE

Сначала нужно добавить ссылку для менеджера плат

Файл -> Параметры -> Дополнительные ссылки для Менеджера плат

Добавить https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json

-4

Дальше переходим в менеджер плат

Инструменты -> Плата -> Менеджер плат…

-5

В поиске набираем pico

Находим Raspberry Pi Pico/RP2040/RP2350

Устанавливаем или обновляем библиотеку до последней версии

-6

Теперь можно выбрать плату: Raspberry Pi Pico

-7

Всё готово для первой прошивки

На плате расположен RGB светодиод. Моргать им веселее чем обычным

#include <Adafruit_NeoPixel.h>
#define PIN 16
#define NUMPIXELS 1
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
enum {NONE, RED, GREEN, BLUE};
int ledColor = NONE;
void setup(){
pixels.begin();
}
void loop(){
switch (ledColor) {
case NONE:
pixels.setPixelColor(0, pixels.Color(0, 0, 0));
pixels.show();
break;
case RED:
pixels.setPixelColor(0, pixels.Color(20, 0, 0));
pixels.show();
break;
case GREEN:
pixels.setPixelColor(0, pixels.Color(0, 20, 0));
pixels.show();
break;
case BLUE:
pixels.setPixelColor(0, pixels.Color(0, 0, 20));
pixels.show();
break;
default:
break;
}
ledColor++;
if (ledColor == 4) {
ledColor = NONE;
}
delay(1000);
}

Результат

-8

Пример датчик температуры

void setup() {
Serial.begin(115200);
while (!Serial) {
yield();
}
}
void loop() {
Serial.printf("Core temperature: %2.1fC\n", analogReadTemp());
delay(1000);
}

Результат

-9

Теперь на процессор положим радиатор

-10

Он прям под размер

-11

Результат

-12

Температура упала. Можно использовать для замера температуры на процессоре и включения охлаждения

Пример установки времени на внутренних часах

#include <time.h>
#include <sys/time.h>
void setup() {
Serial.begin(115200);
while (!Serial) {
yield();
}
struct tm mytime;
struct timeval tv;
mytime.tm_sec = 0; // Seconds
mytime.tm_min = 2; // Minutes
mytime.tm_hour = 16; // Hours
mytime.tm_mday = 7; // Day of Month
mytime.tm_mon = 11-1; // Month
mytime.tm_year = 2024-1900; // Year
time_t new_time;
new_time = mktime(&mytime);
tv.tv_sec = new_time;
tv.tv_usec = 0;
settimeofday(&tv, nullptr);
}
float s=0.0;
void loop() {
time_t now;
char buff[80];
time(&now);
strftime(buff, sizeof(buff), "%c", localtime(&now));
struct timeval tv;
gettimeofday(&tv, nullptr);
s=0;
for(int i = 1; i<1000;i++){
//s+=100.5;
//s = s/3.1;
delay(1);
}
struct timeval tv2;
gettimeofday(&tv2, nullptr);
Serial.println(buff);
Serial.println(((tv2.tv_sec-tv.tv_sec)*1000) + ((tv2.tv_usec-tv.tv_usec)/1000));
Serial.println();
delay(1000);
}

Пример показывает, как установить время. Получить его. И сравнить пройденное время между операциями

Результат

Первый результат получаем разницу во времени в 1000 операций с задержкой в 1мс

-13

Теперь раскавычить операции внутри цикла

s+=100.5;
s = s/3.1;

-14

Теперь разница во времени в 2 мс. Это показывает, что время не зависит от работы программы. Точность, конечно, можно определить через месяц непрерывной работы

Пример прерывания таймера

#include <stdio.h>
#include "pico/stdlib.h"
uint64_t t1, t2;
bool repeating_timer_callback(struct repeating_timer *t) {
t2 = time_us_64();
Serial.print("interrupt ");
Serial.println(t2-t1);
t1 = time_us_64();
return true;
}
struct repeating_timer timer;
void setup() {
Serial.begin(9600);
delay(1000);
t1 = time_us_64();
add_repeating_timer_ms(500, repeating_timer_callback, NULL, &timer);
delay(3000);
}
void loop() {
Serial.println("Hello Timer!");
delay(1000);
}

Результат

-15

Через 3 сек стартует основная программа. Таймер уже каждые 500мс выводит сообщение, разницу во времени между запусками таймера в макро секундах. Hello Timer! выводит основной поток каждую 1 сек

Таймеры, как и внешние прерывания, работают независимо от основной программы. Вместо выполнения циклов или повторяющегося вызова задержки millis() вы можете назначить таймеру делать свою работу, в то время как ваш код делает другие вещи

Вывод

Удобная плата для DIY проектов. Цена небольшая. На Алиэкспресс в пределах 150 рублей

Ссылки

RP2040-Zero - https://aliexpress.ru/item/1005007817487780.html