Самоделки на raspberry pi pico
Наверное это уже традиция - запускать программу мигания встроенным светодиодом в первую очередь. Не будем от неё уклоняться и запустим тоже:
Но вот если вы еще ничего ардуиновского на своей 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 x многофункциональных контактов GPIO
- 2 x SPI, 2 x I2C, 2 x UART, 3 x 12-битных АЦП, 16 x управляемых каналов ШИМ
- Точные часы и таймер на кристалле
- Датчик температуры
- Библиотеки для выполнения операций с плавающей запятой
- 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) |
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
После этого проверьте, находитесь ли вы в группе 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-дюймовый (320x480) ЖК-экран HVGA TFT (ILI9488);
-Макетная плата;
-Соединительные провода;
-Компьютер;
-Кабель Micro USB;
О Raspberry и ЖК-дисплеи
Raspberry Pi Pico — это маленькая, быстрая и универсальная плата, построенная с использованием RP2040, оснащенная двухъядерным процессором Arm Cortex-M0 + с внутренней оперативной памятью 264 КБ и поддержкой до 16 МБ внешней флэш-памяти. Она предоставляет широкий спектр вариантов ввода / вывода, включая I2C, SPI и выводы с уникальным программируемым вводом / выводом (GPIO).
В настоящее время красивые ЖК-экраны TFT становятся все дешевле, а использование их во встроенном дизайне делает их более удобными для пользователя. В этом руководстве объясняется, как подключить 3,5-дюймовый TFT ЖК-дисплей 320x480 с драйвером 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 320x480 (ILI9488) поддерживает RGB565, а объем флэш-памяти ограничен, необходимо преобразовать файлы BMP в RG565 (16-битный формат) и изменить размер изображения до 480 по ширине, 320 по высоте или меньше.
Приблизительный размер файла BMP при изображении 480x320 — 300 КБ. (480x320x2 = 307200 байт + размер заголовка)
RPi Pico предоставляет 2 МБ дискового пространства. MicroPython использует около 600 КБ. Для хранения файлов растровых изображений доступно 1,4 МБ флэш-памяти.
Для преобразования файла можно использовать программу GIMP.
Код с комментариями можно скачать ниже.
Показать / Скрыть текст'''
Demonstrates the use of 320x480 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 + блютуз
или я что-то не понял?
Александр Гуриш
Нафига там вообще микроконтроллер? Запулил мотор с редуктором и готово.
Павел Морев
Читайте также: