Сегодня существует множество встраиваемых платформ с разной производительностью. Многие устройства имеют одинаковые функциональные возможности. Таким образом, разработчика, привыкшего к разноообразию аппаратных платформ, очень сложно удивить чем-то действительно новым.

Чем же может нас удивить новая плата 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 необходимо выполнить следующие действия (убедитесь, что у вас есть подключение к Интернету):

  1. Скачайте установочный скрипт

$ wget https://raw.githubusercontent.com/raspberrypi/pico-setup/master/pico_setup.sh

  1. Добавьте разрешения на выполнение скрипта

$ chmod +x pico_setup.sh

  1. Запустите установочный скрипт

$ ./pico_setup.sh

  1. Перезагрузите вашу операционную систему

$ 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)
GNDGND
GP2SWCLK
GP3SWDIO
GP4/UART1 TXGP1/UART0 RX
GP5/UART1 RXGP0/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

Я использую модуль белого светодиода из набора датчиков Keyestudio KS0068 https://wiki.keyestudio.com/Ks0068_keyestudio_37_in_1_Sensor_Kit_for_Arduino_Starters :

Если у вас такой же модуль, подключите его к Raspberry Pi Pico, как показано в следующей таблице:

Raspberry Pi PicoWhite LED Module
GNDG
3V3V
GP15S

Давайте внесем в наш автоматически созданный проект следующие изменения:

Удерживая кнопку 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:

Я просто переписал скетч 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 PicoADXL345 Module
GNDGND
3V33V3
GP8SDA
GP9SCL

Давайте создадим и загрузим пример:

$ 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 6658 times by 1743 viewers

Last modified: 01/09/2021

Author

Comments

А теперь примерчик такой-же но на FreeRTOSe, с использованием уже ртосовых ресурсов — таймеров?

Write a Reply or Comment