Обзор ProMicro NRF52840 (совместима с Nice! Nano v2.0)

время 5 МИН
звезда звезда звезда СРЕДНЕ
nrf52
nrf52840
embeded

Привет, друзья!

Сегодня хочу рассказать про макетную плату ProMicro на базе чипа nRF52840 от Nordic.

Об nRF52840 ProMicro

Эта малышка имеет габариты всего 33 x 17.8 мм (что, сопоставимо с одной из самых маленьких ардуинок ProMini) и может работать как от USB (Type-C) так и от литиевой батарей на 3.7В. Кушает такая плата, как настоящая Дюймовочка, - в режиме ожидания около 1мА, что делает ее незаменимой в «спящих» устройствах, которые в основном находятся в режиме ожидания – всякие датчики, пульты и прочие подделки для умного (и не очень) дома.

Начинка у этой конфетки по истине превосходит все ожидания. Тут и ARM Cortex-M4F с частотой 64МГц и 1МБ флеш-памяти и аж целых 256Кб оперативки, и вишенкой на торте встроенный радио модуль с Bluetooth (BLE) вот уж точно можно развернуться!

А что по периферии? Из популярного завезли: ADC, PWM, SPI, I2C, UART, USB и GPIO, да еще и отвесили плюшек по безопасности в виде AES-шифрования, SHA-256 хешей и True Random Generator’а (использующий внутренний термометр для большей трушности). Ну, как Вам?

Вообще периферии гораздо больше (вот официальная документация на чип). Надо отметить, разработчики заморочились на низкое энергопотребление, так что большая часть периферии может общаться напрямую друг с другом и памятью, минуя относительно более прожорливый процессор. С чипом nRF52840 можно ознакомиться: Datasheet(pdf)

Как писать приложения?

Для начала втыкаем в комп, сразу после этого девайс у меня дружественно замигал светодиодами красненьким (раз в секунду) и синеньким (три раза в секунду), видимо, сообщая, что все хорошо и что он работает.

На борту уже установлен UF2 Bootloader, позволяющий обновлять прошивку просто копируя файл на устройство как на флешку, для этого жмакаем быстро 2 раза кнопку Reset (а кстати, где она? А ее нет, а есть 3 и 4 пины GND и RST соответственно, вот их то и замыкаем быстренько 2 раза кто чем может, маникюрные ножницы тоже норм), если все сделали правильно, на ПК появится новый диск, на нем три файла, самый интересный - INFO_UF2.TXT выглядит так:

UF2Bootloader 0.6.0 lib/nrfx v2.0.0, lib/tinyusb (0.10.1-41-...), lib/uf2 ...)
Model: nice!nano
Board-ID: nRG52840-nicenano
SoftDevice: S140 version 6.1.1
Date June 19 2021

Не смотря на то, что на плате выбито слово ProMicro, тут ничего такого нет. Зато есть nicenano, чтож, раз плату позиционируют как альтернативу nicenano наверное, это норм. «SoftDevice: S140 version 6.1.1» видимо, отсылает к документации

Тут надо сделать лирическое отступление про то, что находится на FLASH-памяти. А есть там, как правило, четыре вещи: MBR, BootLoader, SoftDevice и появится Ваше приложение, которое Вы напишите, хотя бы тут же мигалку светодиодом. Но для начала приложение нужно собрать. Когда собираете приложение, ему важно знать, кроме всего прочего, 2 вещи: куда записывать его во FLASH и по какому адресу приложение будет запущено в ОЗУ. По умолчанию часто в примерах настроено записывать программу во FLASH с адреса 0, что неминуемо перетрет записанный там SoftDevice (что не смертельно и не превращает устройство в кирпич, прошить его можно по новой все так же через USB как и Ваше приложение, только другой утилитой).

Резюмируя: во FLASH есть много разных штук, и Ваше приложение - одна из них, заливка приложения должна происходить в определенное место на FLASH, при этом остальные штуки перезаписывать не требуется, для обновления BootLoader и SoftDevice есть специальная утилита тоже работающая через USB, приложение можно установить просто скопировав файл на устройство как на флешку.

Легкая прогулка с Go

Проще всего начать писать приложения для NiceNano на Go, во многом благодаря тому, что есть замечательная утилита TinyGo. Она хорошо документирована и позволяет делать полный цикл от компиляции до прошивки на устройство и отладки. Причем не надо каждый раз вручную сбрасывать устройство, замыкая контакты, TinyGo умеет переводить устройство в режим загрузки приложения автоматически пред заливкой, а еще TinyGo позволяет забирать логи все так же через USB, что не заменимо при отладке. Собранные программы получаются весьма компактными, что важно при столь ограниченых по сравнению с ПК ресурсах.

С TinyGo уже через 10 минут с момента начала установки устройство довольно мигало лампочкой – прошитое примером в стиле хеллоу ворлд, что может быть приятнее? Нет слов.

В следующие полчаса уже были собраны и запущены примеры: сканирующие поблизости Bluetooth BLE устройства и печатающие их MAC и имя в терминале. Так же удалось напечатать и настоящие рандомные числа из трушного генератора и получить температуру чипа (оказалась 33С), все интереснее, чем мигать лампочками.

Попробуем что-нибуть запустить, мигалка пойдет, устанавливаем TinyGo на Linux

wget https://github.com/tinygo-org/tinygo/releases/download/v0.31.2/tinygo_0.31.2_amd64.deb
sudo dpkg -i tinygo_0.31.2_amd64.deb
tinygo version
tinygo version 0.31.2 linux/amd64 (using go version go1.22.0 and LLVM version 17.0.1)
sudo chmod a+rw /dev/ttyACM0

пример мигалки

go mod init blinky
nano main.go
package main

import (
    "machine"
    "time"
)

func main() {
    led := machine.LED
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})
    for {
        led.Low()
        time.Sleep(time.Millisecond * 1500)

        led.High()
        time.Sleep(time.Millisecond * 500)
    }
}
tinygo flash -target=nicenano

Путь самурая (используем софт от Nordic)

Начало пути на странице Nordic с официальной докуметнацией. И выглядит путь примерно так: сначала устанавливаете nfrcconnect, в нем выбираете установку Toolchain Manager, внутри которого выбираете установку нужной версии SDK, та тащит тонну софта включая Zephyr OS, далее установить если еще не установлен VS Code и плагинов к нему. И да, с UF2 Bootloader это не работает, надо ставить один из двух бутлоадеров на выбор от самих Nordic.

На MacBook Pro 2014mid квест так пройти и не смог, может, от того, что iOS 11 уже не поддерживается, процесс упал на выкачивании репозиториев Zephyr OS и еще каких то.

На Ununtu 22.04 все немного лучше, но nfrcconnect заявил, что если хочу самого свежего установить го в мануальный режим, и отправил по ссылке читать документацию, там тоже куча шагов с отсылками в другие документации.

Я этот путь дошел до момента установки бутлоадера, а дальше зассал.

А как же Rust?

На Rust так же можно писать приложения для nicenano, но с несколько большим уровнем хардкора. Этот путь примерно посередине между предидущими двумя. Я недавно полюбил Rust за то что он экономичен к ресурсам, низкоуровневый как C и при этом с бесплатной сборкой мусора, да и уровень хардкора как раз по мне, так что я выбрал идти этим путем.

Тут прежде всего стоит обратить внимание на nrf-hal там есть и примеры. Пришлось обновить nrf-hal/nrf52840-hal/memory.x как в TinyGo чтоб не затирал SoftDevice. Из минусов перестала работать удаленное включение UF2 чтоб деплоить удаленно, приходится сбраывать вручную замыкая контакты. Так же логи по USB не забирает да и вообще не умеет работать с USB, пришлось подключать nrf-usbd но и он из коробки не собрался, применил напильник, в итоге заработало и смог писать в виртуальнй последовательный порт (через USB) и читать из него лолально логи. Размер выходных файлов примерно как у TinyGo, но прошивать чуть сложнее: Rust выплевывает elf файл, его надо преврать двумя шагами в UF2 формат и уже этот файл заливать на устройтво как на флешку. Примерно так:

cd nrf-usbd/example
cargo build --release --target thumbv7em-none-eabihf
arm-none-eabi-objcopy -O ihex \
../target/thumbv7em-none-eabihf/release/nrf-usbd-example \
demo.hex
uf2conv.py -c -f 0xADA52840 -o demo.uf2 demo.hex
cp demo.uf2 /media/ev/NICENANO

А что дальше?

Но это все лишь проба пера перед чем то поистине интересным. Далее хочу собрать IR-пульт управления для всей технологической братии, все еще работающей на IR, и подключить его к HomeAssistant, пусть управляет и пылесосом и кондеем. Да-да, велосипед, ну почти, похожее устройство у меня уже есть на ESP8266, но работает от сети (ох уж эти провода!), ну а чего, WiFI прожорливый, батареек не напасешься. У меня же идея сделать на аккумуляторе в идеале с солнечной батареей и никаких проводов. Недавно выяснилось что похожие устройство уже существует в природе, правда вместо BLE там ZigBee, что тоже очень круто и работает на двух батарейках, но без солнечной батареи (прощай провода и экология), а хочется чтоб все зелененько да и заколхозить очень хочется, чего уж там.

На этом пока все, если увижу что тема зашла, буду писать про устройство дальше, ну и про то что выйдет с затеей с пультом.

Всем всего хорошего и пока!

Спасибо, что заглянули,
добавляйтесь в Telegram канал и будьте в курсе новинок.
Если Вам было интересно, можете поддержать автора

Что еще почитать?

Что такое Jenkins-пайплайны?

2023, 19 АВГУСТА
время 5 МИН
звезда звезда звезда СРЕДНЕ
Jenkins
CI/CD
Автоматизация
Рассказываю, как правильно готовить Jenkins. В этой статье разберем, как именно делать автоматизацию сборок в Jenkins, поделюсь лучшими практиками

Как пишут программы?

2023, 19 АВГУСТА
время 4 МИН
звезда звезда звезда ЛЕГКО
Основы
Расскажу о проессе разработке программного обеспечения
на главную