Сегодня существует множество встраиваемых платформ с разной производительностью. Многие устройства имеют одинаковые функциональные возможности. Таким образом, разработчика, привыкшего к разноообразию аппаратных платформ, очень сложно удивить чем-то действительно новым.
Чем же может нас удивить новая плата Raspberry Pi Pico на базе собственного чипа RP2040?
Raspberry Pi Pico — это не такая высокопроизводительная платформа, как другие платы Raspberry Pi, но намного дешевле их. Производительность Pico можно сравнить с Arduino Due или ESP32.
Это действительно очень интересное устройство, основанное на двух ядрах Cortex M0 + с уникальным модулем PIO, который работает как контакты FPGA и может быть запрограммирован на языке Assembler (я бы сказал упрощенный Assembler).
Поддержка Raspberry Pi Pico впечатляет. Можно использовать разные языки программирования, такие как Assembler, C, C ++ и Python, для программирования Raspberry Pi Pico.
Raspberry Pi Pico также можно запрограммировать в среде Arduino IDE.
Чип RP2040 и плата Raspberry Pi Pico хорошо документированы, документация содержит дейташиты для микроконтроллера и платы, руководство по разработке своего железа на основе RP2040, руководство для быстрого начала работы с платой Raspberry Pi Pico.
Raspberry Pi Foundation предоставляет два SDK для разработки приложений на Python и C / C ++.
Начнем с основных характеристик платы:
- Микроконтроллер RP2040, разработанный Raspberry Pi в Великобритании
- Двухъядерный процессор Arm Cortex M0 + с тактовой частотой до 133 МГц
- 264 КБ SRAM и 2 МБ встроенной флэш-памяти
- Благодаря контактам по периметру модуля Pico его можно запаять на несущую плату
- USB 1.1 с поддержкой профилей устройства и хоста
- Режимы сна и ожидания с низким энергопотреблением
- Программирование методом копирования файла прошивки на внешнее запоминающее устройство через USB
- 26 × многофункциональных контактов GPIO
- 2 × SPI, 2 × I2C, 2 × UART, 3 × 12-битных АЦП, 16 × управляемых каналов ШИМ
- Точные часы и таймер на кристалле
- Датчик температуры
- Библиотеки для выполнения операций с плавающей запятой
- 8 конечных автоматов программируемого ввода-вывода (PIO) для поддержки настраиваемых периферийных устройств
Техническая спецификация Raspberry Pi Pico доступна по ссылке https://datasheets.raspberrypi.org/pico/pico-datasheet.pdf
Она также содержит электрическую принципиальную схему Raspberry Pi Pico.
Если взглянуть на распиновку, то можно увидеть на плате SWD-разъем для отладки, пользовательский светодиод, разъем micro-USB, кнопку BOOTSEL и 2х20 контактов расширения.
Прежде всего необходимо прочитать «Getting started with Raspberry Pi Pico» https://datasheets.raspberrypi.org/pico/getting-started-with-pico.pdf , следуя указанным там инструкциям.
Если вы собираетесь использовать плату RPi 4B или RPi 400 для разработки приложений для RPi Pico, развернуть среду разработки там очень просто.
На Raspberry Pi 4B / 400 необходимо выполнить следующие действия (убедитесь, что у вас есть подключение к Интернету):
- Скачайте установочный скрипт
$ wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh
- Добавьте разрешения на выполнение скрипта
$ chmod +x pico_setup.sh
- Запустите установочный скрипт
$ ./pico_setup.sh
- Перезагрузите вашу операционную систему
$ sudo reboot
В противном случае процесс установки зависит от операционной системы, установленной на вашем компьютере. Я использую Ubuntu 20.04 LTS, поэтому мне пришлось прочитать «Chapter 2. SDK».
Пользователи Windows и OSX должны прочитать «Chapter 9. Building on other platforms» из руководства «Getting started with RPi Pico».
Автор документации предпочитает, чтобы мы использовали Visual Studio Code. Если вы не привыкли разрабатывать в Visual Studio Code, то можете выбрать что-нибудь другое, например Eclipse или Clion.
После установки необходимых инструментов пора помигать светодиодом на плате Raspberry Pi Pico. Выполните в терминале следующие команды:
$ cd ~/pico/pico-examples
$ mkdir build && cd build
$ export PICO_SDK_PATH=../../pico-sdk
$ cmake ..
$ cd blink
$ make -j $(nproc)
Вот и все. Теперь мы можем загрузить прошивку в плату Raspberry Pi Pico.
Обновление и отладка прошивки
Если вы, как и я, используете десктопную версию Ubuntu 20.04 LTS, Raspberry Pi Pico должен автоматически примонтироваться к файловой системе как запоминающее устройство USB. Вы можете просто перетащить blink.uf2 на запоминающее устройство. RP2040 перезагрузится, размонтируется как запоминающее устройство и начнет запускать прошитый код. В следующий раз, когда вы захотите обновить прошивку, вам нужно будет нажать кнопку BOOT перед включением Raspberry Pi Pico, чтобы войти в режим обновления.
Если ваше приложение не работает или вы хотите понять, как оно работает, вы можете использовать внутрисхемную отладку через разъем SWD, но для этого необходимо иметь какой-то аппаратный адаптер JTAG / SWD, например J-Link, DAP-Link или плату Raspberry Pi с разъемом расширения контактов.
Использование Picoprobe
Из документации «Getting started with RPi Pico» я узнал, что можно использовать вторую плату Raspberry Pi Pico в качестве адаптера SWD (см. «Appendix A. Using Picoprobe»).
Это очень интересная возможность, учитывая невысокую стоимость платы. Давайте попробуем.
Если я не ошибаюсь, picoprobe — это прошивка DAP-Link, основанная на открытом стандарте CMSIS-DAP для микроконтроллеров Cortex-M, которая обеспечивает два преобразователя: USB-UART и USB-SWD.
Все, что нам нужно сделать, это загрузить специальную прошивку (picoprobe) во вторую плату Pico. После этого мы получим полноценный отладчик SWD по цене Pico.
Кстати, вы можете использовать его и для отладки других микроконтроллеров Cortex-M.
Вы должны прочитать «Appendix A. Using Picoprobe», чтобы узнать, что вам нужно сделать для начала использования picoprobe.
Это дублирующее документацию описание действий под Linux, поскольку я использую Ubuntu 20.04 LTS.
Для работы picoprobe необходимо собрать openocd с включенным драйвером picoprobe:
Пора собрать и прошить picoprobe:
$ cd ~/pico && git clone https://github.com/raspberrypi/picoprobe.git
$ cd picoprobe
$ mkdir build && cd build
$ cmake .. && make -j$(nproc)
Включите плату Raspberry Pi Pico, которую вы собираетесь использовать в качестве отладчика, с нажатой кнопкой BOOTSEL и перетащите файл picoprobe.uf2.
В итоге мы получили отладчик с двумя интерфейсами, один из которых — SWD, другой — UART для работы в качестве адаптера USB-UART независимо от первого.
Подключение между двумя платами Pico показано в следующей таблице:
Pico A (picoprobe) | Pico B (dev board) |
GND | GND |
GP2 | SWCLK |
GP3 | SWDIO |
GP4/UART1 TX | GP1/UART0 RX |
GP5/UART1 RX | GP0/UART0 TX |
На ярко-оранжевом фоне это выглядит так:
Чтобы использовать UART picoprobe, вы можете задействовать любую терминальную утилиту, например minicom.
Сначала добавьте себя в группу пользователей dialout и перезагрузитесь:
$ sudo usermod -a -G dialout $USER
$ sudo reboot
После этого проверьте, находитесь ли вы в группе dialout, выполнив следующую команду:
$ groups
Если да, запустим minicom:
$ minicom -D /dev/ttyACM0 -b 115200
Использование OpenOCD и GDB
Чтобы использовать отладку через SWD, вам необходимо запустить openocd как сервер и gdb как клиент:
$ openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl
Open On-Chip Debugger 0.10.0+dev-g18b4c35-dirty (2021-08-12-18:55)
Licensed under GNU GPL v2
For bug reports, read
http://openocd.org/doc/doxygen/bugs.html
Info : only one transport option; autoselect 'swd'
Warn : Transport "swd" was already selected
adapter speed: 5000 kHz
Info : Hardware thread awareness created
Info : Hardware thread awareness created
Info : RP2040 Flash Bank Command
Info : Listening on port 6666 for tcl connections
Info : Listening on port 4444 for telnet connections
Info : clock speed 5000 kHz
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x00000001
Info : SWD DPIDR 0x0bc12477
Info : SWD DLPIDR 0x10000001
Info : rp2040.core0: hardware has 4 breakpoints, 2 watchpoints
Info : rp2040.core1: hardware has 4 breakpoints, 2 watchpoints
Info : starting gdb server for rp2040.core0 on 3333
Info : Listening on port 3333 for gdb connections
Установите gdb:
$ sudo apt install gdb-multiarch -y
Запустите gdb:
$ cd ~/pico/pico-examples/build/blink
$ gdb-multiarch blink.elf
(gdb) target remote loacalhost:3333
(gdb) load
(gdb) b main
(gdb) c
Конечно же вы можете отлаживать свое приложение в своей любимой IDE, в этом случае IDE работает как клиент.
Автоматическая генерация проекта
Для автоматического создания нового проекта вы можете использовать скрипт Python, который может работать как в режиме графического интерфейса пользователя, так и в режиме командной строки.
Чтобы воспользоваться этим, вам нужно будет клонировать скрипт создания проекта из Git репозитория :
$ cd ~/pico && git clone https://github.com/raspberrypi/pico-project-generator.git
Не забудьте установить библиотеку TKInter для использования GUI:
$ sudo apt-get install python3-tk
Затем его можно запустить в графическом режиме:
$ cd pico-project-generator
$ ./pico_project.py --gui
Добавление Pico в Arduino IDE
Также можно запрограммировать Raspberry Pi Pico в Arduino IDE. Была выпущена даже новая версия Arduino Nano на базе чипа RP 2040.
Если вы решите работать с Raspberry Pi Pico в Arduino IDE, вам сначала нужно будет добавить поддержку платы. Для этого выберите в Arduino IDE пункт меню File-> Preferences, затем заполните «Additional Board Manager URLs» ссылкой https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json
После этого выберите пункт меню «Board:« Arduino Uno »-> Board Manager …», введите «raspberry pi pico» и установите пакет «Raspberry Pi Pico / RP2040», который уже установлен на моей картинке.
Когда пакет установлен, нам нужно выбрать плату в пункте меню «Tools->Boards: «Arduino Uno»->Raspberry Pi RP2040 Boards(1.9.4)->Raspberry Pi Pico». Информация о плате появится в меню «Tools».
Процесс разработки в C/C ++ SDK
В этом разделе я покажу вам, что программирование Raspberry Pi Pico с использованием C/C++ SDK не сложнее, чем в Arduino IDE. Даже в том случае, если вы используете командную оболочку Linux.
Добавьте путь к pico-project-generator в ваш файл конфигурации .bashrc :
$ gedit ~/.bashrc
export PATH=$PATH:~/pico/pico-project-generator
Потом перезагрузите систему:
$ sudo reboot
После этого вы можете запускать pico_project.py из любого каталога.
Давайте создадим новый каталог для наших экспериментов:
$ cd ~/pico && mkdir pico-workspace && cd pico-workspace
$ pico_project.py --gui
Выберите имя и расположение проекта, затем нажмите кнопку ОК.
Мигание светодиодом
Теперь мы можем открыть автоматически сгенерированный C файл, отредактировать его:
$ cd blink
$ gedit blink.c
1 2 3 4 5 6 7 8 9 10 11 12 |
#include <stdio.h> #include "pico/stdlib.h" int main() { stdio_init_all(); puts("Hello, world!"); return 0; } |
Я использую модуль белого светодиода из набора датчиков Keyestudio KS0068 https://wiki.keyestudio.com/Ks0068_keyestudio_37_in_1_Sensor_Kit_for_Arduino_Starters :
Если у вас такой же модуль, подключите его к Raspberry Pi Pico, как показано в следующей таблице:
Raspberry Pi Pico | White LED Module |
GND | G |
3V3 | V |
GP15 | S |
Давайте внесем в наш автоматически созданный проект следующие изменения:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#include <stdio.h> #include "pico/stdlib.h" int main() { const uint LED_PIN = 15;//GP15 gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); while (true) { gpio_put(LED_PIN, 1); sleep_ms(1000); gpio_put(LED_PIN, 0); sleep_ms(1000); } } |
Удерживая кнопку BOOTSEL, подключите Raspberry Pi Pico к компьютеру с помощью кабеля micro USB, отпустите кнопку. Должно появиться новое запоминающее устройство.
Соберите проект и загрузите прошивку, скопировав файл blink.uf2 на устройство:
$ cd build
$ cmake .. && make -j$(nproc)
$ cp blink.uf2 /media/$USER/RPI-RP2
Если вы все сделали правильно, белый светодиод должен мигать с частотой 0,5 Гц (каждые две секунды).
Как видите, я только что изменил номер вывода GPIO и задержку в проекте blink из pico-examples. Заработало без отладки! Все очень просто!
Этот пример находится здесь https://github.com/PetroShevchenko/cxemotexnika/tree/master/Examples/Raspberry-Pi-Pico/blink
Вы можете скачать все примеры из моего репозитория GitHub по ссылке https://github.com/PetroShevchenko/cxemotexnika.
Автоматизация с использованием pico.sh
Чтобы не вводить все эти команды вручную, я создал сценарий оболочки под названием pico.sh https://github.com/PetroShevchenko/cxemotexnika/blob/master/Examples/Raspberry-Pi-Pico/ADXL345/pico.sh
Запустите этот скрипт без каких-либо параметров, чтобы увидеть справочное сообщение:
$ ./pico.sh
[./pico.sh] : use "./pico.sh create" to launch pico_project.py in GUI mode
[./pico.sh] : use "./pico.sh build" to compile the project
[./pico.sh] : use "./pico.sh clean" to remove temporary files
[./pico.sh] : use "./pico.sh upgrade" to copy the firmware to the device
[./pico.sh] : use "./pico.sh debug" to launch openocd
[./pico.sh] : use "./pico.sh monitor" to launch minicom
[./pico.sh] : use "./pico.sh show" to show a tree of current directory
Чтение с сенсора ADXL345
Вы можете сказать: «На любой плате помигать светодиодом очень просто». Поскольку я взялся доказать, что программирование Raspberry Pi Pico в C/C++ SDK такое же простое, как и в Arduino, давайте попробуем подключить плату Pico к более сложному модулю из набора датчиков KS0068.
На мой взгляд, модуль ADXL345 достаточно сложен для демонстрации. Это 3-осевой акселерометр MEMS с высоким разрешением (13 бит) измерениями до + -16 g. Данные цифрового вывода форматируются как 16-битное дополнение к двум и доступны через цифровой интерфейс SPI (3- или 4-проводный) или I2C.
Я просто попробую переделать пример для Arduino, используя API С/С++ SDK.
Давайте посмотрим, что мы можем использовать из API для связи через I2C.
Для этого откроем pico-examples/i2c. Там есть три функции для работы с I2C:
1 2 3 4 5 6 |
uint i2c_init(i2c_inst_t *i2c, uint baudrate); int i2c_write_blocking(i2c_inst_t *i2c, uint8_t addr, const uint8_t *src, size_t len, bool nostop); int i2c_read_blocking(i2c_inst_t *i2c, uint8_t addr, uint8_t *dst, size_t len, bool nostop); |
Я просто переписал скетч Arduino, и он сразу заработал. Вот оригинальный скетч для Arduino https://wiki.keyestudio.com/Ks0068_keyestudio_37_in_1_Sensor_Kit_for_Arduino_Starters#Project_29:_ADXL345_Three_Axis_Acceleration.
Но была одна проблема. Целочисленный тип (int) в скетче Arduino подразумевает 16-битную переменную со знаком, а Pico — 32-битный микроконтроллер с 32-битным целочисленным типом. В итоге вместо типа int я использовал тип int16_t.
Этот пример находится здесь https://github.com/PetroShevchenko/cxemotexnika/tree/master/Examples/Raspberry-Pi-Pico/ADXL345
Если у вас есть модуль ADXL345 из набора датчиков KS0068, подключите его к Raspberry Pi Pico, как показано в следующей таблице:
Raspberry Pi Pico | ADXL345 Module |
GND | GND |
3V3 | 3V3 |
GP8 | SDA |
GP9 | SCL |
Давайте создадим и загрузим пример:
$ cd && git clone https://github.com/PetroShevchenko/cxemotexnika.git
$ cp -r ~/cxemotexnika/Examples/Raspberry-Pi-Pico/ADXL345/ ~/pico/pico-workspace/
$ cd ~/pico/pico-workspace/ADXL345
$ ./pico.sh build
$ ./pico.sh upgrade
Теперь мы можем подключить USB-UART в составе picoprobe и запустить minicom:
$ ./pico.sh monitor
[ 3934.052504] cdc_acm 1-2:1.0: ttyACM0: USB ACM device
Welcome to minicom 2.7.1
OPTIONS: I18n
Compiled on Dec 23 2019, 02:06:26.
Port /dev/ttyACM0, 22:26:58
Press CTRL-A Z for help on special keys
RAW: -29 11 -243
ACCEL: -0.113100 0.042900 -0.947700
RAW: -23 14 -238
ACCEL: -0.089700 0.054600 -0.928200
RAW: -23 12 -242
ACCEL: -0.089700 0.046800 -0.943800
RAW: -25 19 -238
ACCEL: -0.097500 0.074100 -0.928200
RAW: -20 19 -230
ACCEL: -0.078000 0.074100 -0.897000
RAW: -28 10 -240
ACCEL: -0.109200 0.039000 -0.936000
RAW: -27 10 -232
ACCEL: -0.105300 0.039000 -0.904800
Акселерометр ADXL345 работает!
Заключение: мы можем использовать другие примеры Arduino, чтобы немного изменить их и использовать вместе с Raspberry Pi Pico C/C++ SDK.
На данный момент это все. Желаю вам только хороших впечатлений от Raspberry Pi Pico!
Viewed 197252 times by 45468 viewers
Comments
А теперь примерчик такой-же но на FreeRTOSe, с использованием уже ртосовых ресурсов — таймеров?
https://github.com/PetroShevchenko/cxemotexnika/tree/master/Examples/Raspberry-Pi-Pico/FreeRTOS_Demo