Linux-КПК на базе NanoPi Neo Air: необычный DIY-проект, разработанный с нуля
Наладонные компьютеры в своё время были очень популярны. Честно говоря, мне до сих пор их не хватает. Возможно, не столько самого гаджета, сколько ощущения, которое он давал, ведь в руках у тебя hi-tech-девайс небольшого размера, который может столь многое!
Того же ощущения, видимо, не хватает и любителям DIY-проектов. Один из них построил с нуля Linux-КПК, в основе которого NanoPi Neo Air. Подробности создания и возможности устройства — под катом.
Характеристики устройства
Понятно, что этот девайс не для игр, он не может выполнять слишком уж производительные задачи. Всё остальное он в состоянии делать, также у наладонника есть и беспроводной модуль связи с Wi-Fi. Работать он может в качестве обычного Linux-компьютера или UART-терминала.
Вот что он из себя представляет:
NanoPi Neo Air и терминал могут быть отключены или включены независимо друг от друга
NanoPi Neo Air реализован в качестве съёмного элемента
800 × 480 TFT-дисплей, 100 × 30 символов
Wi-Fi
71 клавиша
можно использовать сразу, без настройки
10 000 mAh LiPo-батарея, 15 часов автономной работы
зарядка через Micro-USB
встроенный RTC
ASCII и Unicode, 256 цветов
2 USB 2.0-порта
16 GPIO NanoPi Neo Air, SWD и UART Pi Pico доступны для подключения аксессуаров
Из недостатков можно отметить то, что USB-порты расположены слишком близко друг к другу, места для их одновременного использования недостаточно. Кроме того, терминал вполне удобен в использовании, но он не особенно быстр. Собственно, удивляться здесь не приходится при текущих характеристиках. Главное, что можно использовать.
Кстати, что касается процессора и ОЗУ, то эти характеристики обусловлены базой, т. е. одноплатным ПК NanoPi Neo Air. Соответственно, это четырёхъядерный 1.2 GHz ARM Cortex-A7 процессор и 512 Мб ОЗУ.
Вот характеристики одноплатника, чтобы понимать, на что он способен:
размер: 25,6 × 25,6 × 3,0 мм
CPU: MT7628, 580 МГц, ядро MIPS 24K
RAM: 128 Мб, DDR2, 166 МГц
хранилище: 16M NOR на плате, поддержка SDXC до 2 Тб
Wi-Fi: 802.11n, 2T2R, до 300 Мбит/с
антенна: встроенная на плате и внешняя U.FL
Ethernet: 1 порт/5 портов, до 100 Мбит/с
USB: USB 2.0 (только хост), до 480 Мбит/с
GPIO: около 40 (pinmux)
UART: x3 (UART2 для отладочной консоли)
PWM: x4
PCIe (опция): x1 (опция)
температура: от 0 °C ~ 40 °C (полная нагрузка) или от −10 °C до 70 °C
питание: 3,6 V ~ 5,5 V, 500 mA
энергопотребление: 74 mA Wi-Fi режим ожидания, 230 mA Wi-Fi полная скорость, 5 V
логический уровень: все логические контакты 3,3 V, ток 4 mA/8 mA
Как появился этот проект?
Его автор начал разработку после того, как решил изучить возможности Raspberry Pi и одновременно Python. У него уже были знания по разработке, но одноплатник пришлось немало исследовать, поскольку возможностей у девайса много, и хотелось создать нечто интересное. Ну, а поскольку автор давно уже скучал по наладонникам, то и выбор был предопределён. Правда, Raspberry Pi 4, с которым изначально работал автор, он решил заменить на NanoPi Neo Air.
Соответственно, возможности подключения девайса к внешнему экрану нет. Зато есть многие другие функции, о которых сказано выше. Примечательно, что на разработку — от идеи до реализации — ушло всего 5 месяцев. Не много и не мало, учитывая, что опыт автора в плане разработки электроники, скорее, начального уровня. Но постепенно работая с этой системой, он получал всё больше и больше знаний и практических навыков.
Самой трудоёмкой частью оказалось программирование, поскольку автору пришлось изучать всё с самого начала. Он начал с одного из маленьких экранов SPI TFT 320 × 240 и программирования на Python. Девайс, который получился в итоге, был медленным, но зато дал бесценный опыт. Позже автор узнал о плате Adafruit RA8875, которая обменивается данными через SPI, может использоваться до разрешения 800 × 480, имеет встроенный шрифт ASCII, курсор, перенос строк и прокрутку. Он может даже рисовать символы намного быстрее, чем их отправляет UART.
Сложности возникли с выводом символов на экран. В какой-то момент автору даже пришла в голову мысль отказаться от проекта, поскольку он не мог понять, как реализовать изменение размера области прокрутки (спойлер — \x1B[#;#r). Но затем всё получилось сделать путём механизма блочной передачи, а после — оптимизировать этот метод с буферизацией и многопоточностью.
Также порядочно времени занял процесс разработки кастомной платы для своего проекта. Так, автору пришлось научиться работать ещё и с KiCad. Рассчитана плата (прототип) была на обычные, а не SMD-компоненты, которые автор просто не знал, как паять.
Ещё одной сложностью стал вывод на экран символов, отличных от ASCII. К счастью, в RA8875 есть CGRAM для хранения пользовательских растровых изображений, поэтому автор решил создать растровые изображения для небольшого дополнительного охвата Unicode. Брайль был прямолинейным, я мог генерировать растровые изображения с помощью скрипта Python. В итоге я нарисовал остальные в текстовом документе и преобразовал их в массив C с помощью Python. После этого в течение пары месяцев автор оптимизировал код, чтобы сделать его лаконичнее и понятнее.
Но в итоге всё получилось, так что нареканий у разработчика ни на что нет. Ну, а вот так девайс работает:
Выглядит неплохо. В ближайшем будущем планируется оптимизировать устройство, изменить кастомную плату и добавить несколько новых возможностей. Что касается платы, это единственный кастомный элемент. Всё остальное собрано из элементов, которые можно приобрести, хотя некоторые и немного дорабатывались.
Файлы и ПО автор выложил в сеть — для желающих разработать нечто подобное. Доступны эти ресурсы вот здесь.