Самоделки на raspberry pi pico

Добавил пользователь Alex
Обновлено: 04.10.2024

Наверное это уже традиция - запускать программу мигания встроенным светодиодом в первую очередь. Не будем от неё уклоняться и запустим тоже:

Но вот если вы еще ничего ардуиновского на своей pico не запускали - запустить скетч у вас не выйдет. При первой загрузке нужно зажать кнопку BOOTSEL и подключить кабель. Моя плата установлена на макетку вниз этой кнопкой и при попытке её зажать пинцетом, кнопка просто распалась. Поэтому я очень аккуратно замкнул контакт TP6, отвечающий за то же, что и кнопка BOOTSEL на GND.

Контроллер должен начать мигать встроенным светодиодом на 25 пине.

Надеюсь вы не подумали, что ядро не умеет посылать строки в компьютер для отладки, ведь оно может посылать те самые строки сразу в три стороны!

Как определить где какой UART? Используйте распиновку Raspberry Pi pico из начала статьи, а если у вас другая плата на RP2040 - найдите её распиновку в интернете! Кстати Для UART0 могут быть использованы только пины отмеченные UART0 на распиновке, а для UART1, только пины UART1.

Обратите внимание, что usb интерфейс здесь эмулируется программно и не работает, как в Arduino, где один и тот-же канал идет и к компьютеру и к UART портам. То есть вы не можете отправлять данные и на блютуз (например) и на компьютер одной командой " Serial.print() ". Еще обратите внимание на то, что при использовании UART1 и UART0 у Raspberry Pi pico, вы должны указывать конкретные пины для подключения - RX и TX, иначе UART1 работать не будет, а UART0 будет активирован на GPIO 0 и 1.

Без интерфейса I2C - никуда. Ведь через него общаются половина дисплеев и датчиков. Поэтому ядро умеет с ним работать! Смотрите как:


Дополню про Serial: Как вы можете заметить по коду и скришоту - у меня установлены разные скорости передачи данных в программе и мониторе, но все работает.

И снова про I2C: Перед инициализацией ведомого устройства, необходимо указать на каких ножках оно установлено. И снова необходимо убедиться, что эти пины относятся к выбранной шине - I2C0 или I2C1. Кстати если вы хотите использовать устройство на шине I2C1, в параметрах его инициализации необходимо будет указать его Wire1. Где это нужно писать смотрите в описании своей библиотеки. Как вы уже могли понять: Wire соответствует шине I2C0, Wire1 - I2C1. Так же, как и с Serial, если не указать пины, на которые подключено устройство, I2C будет развернут на default-пинах (см. распиновку), а I2C1 работать не будет.

Иногда нужно узнать на каком адресе расположено устройство. Можно использовать любой сканер из интернета, конечно же указав выбранные GPIO перед " Wire.begin(); ".

И куда же без моего любимого oled на контроллере ssd1306. Использовать его будем с библиотекой от Adafruit, которая мне тоже очень нравится, но весит непозволительно много для arduino, но просто ничего для Raspberry Pi pico!


Как видите, я подключил дисплей к контактам GPIO4 для SDA и GPIO5 для SCL. Это и есть те самые стандартные контакты.

Помимо огромного количества памяти, у Raspberry Pi pico еще есть и целых 2 ядра! И в то время, как micropython без особенных " Костылей " не позволяет работать со вторым ядром, творение Эрла Филховера может!

Знаете Почему в компьютерах всегда есть звуковая карта? При выполнении тысяч операций, процессор может просто не попадать в ноты, ведь иногда он зависает на долю секунды и не успевает изменить частоту в нужный момент, в результате чего мелодия рушится. Очевидным выходом было добавить дополнительный процессор только для обработки звука, который не будет выполнять сложных вычислений, а значит и тормозить. И мы могли бы добавить к нашему Raspberry Pi attiny13 и радоваться звуку без помех, но у нас ведь есть второе ядро! Вот сейчас мы его и используем в качестве звуковой карты.

Смысл данного скетча прост: Raspberry играет мелодию, а когда пользователь нажмет кнопку, музыка тут же остановится.

В коде следует помнить, что функции " rp2040.idleOtherCore() " и " rp2040.resumeOtherCore() " действуют на противоположное ядро. То есть если вызвать их на 1 ядре, заснет или проснется второе и наоборот.

Как вы видите, я могу поставить ядро, а вместе с ним и музыку на паузу нажатием кнопки. Здесь я хотел показать, что во время того, как одно ядро выполняет сложные вычисления, обрабатывает графику, второе может на легке распевать музыку или моргать светодиодом. Ну или более интересный вариант: пока первое ядро декодирует потоковое видео, второе выводит его на дисплей. Применений у этой технологии очень много.

Написать ядро для микроконтроллера - очень сложная задача. И американский программист с ней справился на отлично. А для пользователей оставил полезную документацию. В этой статье я описал далеко не все возможности как ядра, так и raspberry pi pico, но этого должно хватить, чтобы заинтересовать вас новой темой - микроконтроллерами на arm. Безусловно за ними будущее всей электроники, а raspberry pi - мостик к знаниям, у которого сейчас есть большие шансы на развитие diy проектов. Как бы я не любил AVR, но их время уходит и пора изучать новое.

Благодарности за создание классного ядра для RP2040 для Earle F. Philhower, III.

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

Чем же может нас удивить новая плата 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.

Если взглянуть на распиновку, то можно увидеть на плате SWD-разъем для отладки, пользовательский светодиод, разъем micro-USB, кнопку BOOTSEL и 2х20 контактов расширения.


Если вы собираетесь использовать плату RPi 4B или RPi 400 для разработки приложений для RPi Pico, развернуть среду разработки там очень просто.

На Raspberry Pi 4B / 400 необходимо выполнить следующие действия (убедитесь, что у вас есть подключение к Интернету):

$ chmod +x pico_setup.sh

Автор документации предпочитает, чтобы мы использовали Visual Studio Code. Если вы не привыкли разрабатывать в Visual Studio Code, то можете выбрать что-нибудь другое, например Eclipse или Clion.

После установки необходимых инструментов пора помигать светодиодом на плате Raspberry Pi Pico. Выполните в терминале следующие команды:

$ mkdir build && cd build

Вот и все. Теперь мы можем загрузить прошивку в плату 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

Это очень интересная возможность, учитывая невысокую стоимость платы. Давайте попробуем.

Если я не ошибаюсь, picoprobe — это прошивка DAP-Link, основанная на открытом стандарте CMSIS-DAP для микроконтроллеров Cortex-M, которая обеспечивает два преобразователя: USB-UART и USB-SWD.

Все, что нам нужно сделать, это загрузить специальную прошивку (picoprobe) во вторую плату Pico. После этого мы получим полноценный отладчик SWD по цене Pico.

Кстати, вы можете использовать его и для отладки других микроконтроллеров Cortex-M.

Это дублирующее документацию описание действий под Linux, поскольку я использую Ubuntu 20.04 LTS.

Для работы picoprobe необходимо собрать openocd с включенным драйвером picoprobe:

Пора собрать и прошить 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

После этого проверьте, находитесь ли вы в группе dialout, выполнив следующую команду:

Если да, запустим minicom:

$ minicom -D /dev/ttyACM0 -b 115200

Использование OpenOCD и GDB

Чтобы использовать отладку через SWD, вам необходимо запустить openocd как сервер и gdb как клиент:

$ openocd -f interface/picoprobe.cfg -f target/rp2040.cfg -s tcl

Licensed under GNU GPL v2

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

$ sudo apt install gdb-multiarch -y

(gdb) target remote loacalhost:3333

Конечно же вы можете отлаживать свое приложение в своей любимой IDE, в этом случае IDE работает как клиент.

Автоматическая генерация проекта

Для автоматического создания нового проекта вы можете использовать скрипт Python, который может работать как в режиме графического интерфейса пользователя, так и в режиме командной строки.

Чтобы воспользоваться этим, вам нужно будет клонировать скрипт создания проекта из Git репозитория :

Не забудьте установить библиотеку TKInter для использования GUI:

$ sudo apt-get install python3-tk

Затем его можно запустить в графическом режиме:


Добавление Pico в Arduino IDE

Также можно запрограммировать Raspberry Pi Pico в Arduino IDE. Была выпущена даже новая версия Arduino Nano на базе чипа RP 2040.



В этом разделе я покажу вам, что программирование Raspberry Pi Pico с использованием C/C++ SDK не сложнее, чем в Arduino IDE. Даже в том случае, если вы используете командную оболочку Linux.

Добавьте путь к pico-project-generator в ваш файл конфигурации .bashrc :

Потом перезагрузите систему:

После этого вы можете запускать pico_project.py из любого каталога.

Давайте создадим новый каталог для наших экспериментов:

$ cd ~/pico && mkdir pico-workspace && cd pico-workspace


Выберите имя и расположение проекта, затем нажмите кнопку ОК.


Мигание светодиодом

Теперь мы можем открыть автоматически сгенерированный C файл, отредактировать его:


Из этой небольшой стать мы узнаем, как сделать фоторамку, используя ЖК-дисплей Raspberry Pi. Изображения, хранящиеся во внутренней памяти Raspberry Pi, отображаются на ЖК-экране. Raspberry Pi использует программу Python для реализации функций чтения файлов и обработки растровых изображений.

Для изготовления фоторамки необходимы следующие материалы:
-Raspberry Pi Pico;
-3,5-дюймовый (320×480) ЖК-экран HVGA TFT (ILI9488);
-Макетная плата;
-Соединительные провода;
-Компьютер;
-Кабель Micro USB;


О Raspberry и ЖК-дисплеи
Raspberry Pi Pico — это маленькая, быстрая и универсальная плата, построенная с использованием RP2040, оснащенная двухъядерным процессором Arm Cortex-M0 + с внутренней оперативной памятью 264 КБ и поддержкой до 16 МБ внешней флэш-памяти. Она предоставляет широкий спектр вариантов ввода / вывода, включая I2C, SPI и выводы с уникальным программируемым вводом / выводом (GPIO).
В настоящее время красивые ЖК-экраны TFT становятся все дешевле, а использование их во встроенном дизайне делает их более удобными для пользователя. В этом руководстве объясняется, как подключить 3,5-дюймовый TFT ЖК-дисплей 320×480 с драйвером ILI9488 и интерфейсом SPI к Raspberry Pi Pico.

Схема подключения
ЖК-дисплей легко подключается к шине RPi Pico SPI, и для него требуется минимум четыре линии цифрового ввода-вывода.
ЖК-контроллер ILI9488 представляет собой однокристальный драйвер SoC 16,7 Мбайт для жидкокристаллических дисплеев на основе Si-TFT с разрешением 320 (RGB) x 480 точек.

ILI9488 состоит из 960-канального драйвера источника, 480-канального драйвера затвора, 345 600 байт встроенной памяти GRAM для графических данных размером 320 (RGB) (H) x 480 (V) x 18 точек.
ЖК-дисплей работает при логическом напряжении 3,3 В.


Следующие 4 байта (от 0x02 до 0x05) BMP-файла, указывают размер файла. Следующие 4 байта (от 0x05 до 0x09) BMP-файла зарезервированы.

4 байта (от 0x0A до 0x0D) BMP-файл, содержат смещение, то есть начальный адрес байта, в котором могут быть найдены данные растрового изображения (массив пикселей).4 байта (от 0x0E до 0x11) BMP-файла предоставляют размер заголовка.
Следующие 2 байта (от 0x12 до 0x13) BMP-файла содержат ширину изображения BMP в пикселях. 2 байта (от 0x14 до 0x15) обеспечивают высоту изображения BMP в пикселях.

2 байта (от 0x16 до 0x17)файла содержат количество цветовых плоскостей.
Следующие 2 байта (от 0x18 до 0x19) BMP-файла содержат количество бит на пиксель. Поскольку TFT 320×480 (ILI9488) поддерживает RGB565, а объем флэш-памяти ограничен, необходимо преобразовать файлы BMP в RG565 (16-битный формат) и изменить размер изображения до 480 по ширине, 320 по высоте или меньше.

Приблизительный размер файла BMP при изображении 480×320 — 300 КБ. (480x320x2 = 307200 байт + размер заголовка)
RPi Pico предоставляет 2 МБ дискового пространства. MicroPython использует около 600 КБ. Для хранения файлов растровых изображений доступно 1,4 МБ флэш-памяти.

Для преобразования файла можно использовать программу GIMP.


Код с комментариями можно скачать ниже.


Показать / Скрыть текст'''
Demonstrates the use of 320×480 HVGA TFT (ILI9488) TFT, initialization and internal flash photo frame application
Draw Bitmap files (BMP) on screen

if((width*height*2)>MEM_SIZE):
no_of_read_buffer,balance_memory_size = (width*height*2)/MEM_SIZE, (width*height*2)%MEM_SIZE
else:
no_of_read_buffer = 0
balance_memory_size = (width*height*2)
x = int(x)
y = int(y)
no_of_read_buffer = int(no_of_read_buffer)
balance_memory_size = int(balance_memory_size)
if(no_of_read_buffer == 0):
display.WriteBlock(x,y,x+width — 1, y+height — 1,None)
dummy = f.seek(offset)
buf = f.read(width*height*2)
reverse(buf,width*height*2)
display.WriteDataToDevice(buf)
time.sleep(5)
else:
if(width%2 == 0x00):
display.WriteBlock(x,y,x+width-1, y+height — 1,None)
else:
display.WriteBlock(x,y,x+width, y+height — 1,None)

for i in range(no_of_read_buffer):
p = offset + (i*MEM_SIZE)
dummy = f.seek(p)
buf = f.read(MEM_SIZE)
reverse(buf,MEM_SIZE)
display.WriteDataToDevice(buf)
p = offset + (no_of_read_buffer*MEM_SIZE)
dummy = f.seek(p)
buf = f.read(balance_memory_size)
reverse(buf,balance_memory_size)
display.WriteDataToDevice(buf)
time.sleep(3)



Сергей Уланов

а в чём плюшки этой Пико. ESP32 вроде с теми-же характеристиками НО + Wi-fi + блютуз
или я что-то не понял?

Александр Гуриш


Александр Гуриш

Нафига там вообще микроконтроллер? Запулил мотор с редуктором и готово.

Павел Морев


Павел Морев

Читайте также: