Кирпич — оранжевый карманный коммуникатор с механической клавиатурой

Codename: Кирпич

Коммуникатор на базе Meshtastic

Кратко об этом кирпиче

Это самодостаточный девайс, позволяющий обмениваться сообщениями через LoRa радио используя Meshtastic как основу для транспорта. Можно отправлять текст, короткие голосовухи и картинки. У девайса есть ясный UI, упрощающий первичную настройку и оберегающий юзверя от технических премудростей Meshtastic. Сборка простая, по максимуму из готовых, дешёвых и доступных к покупке компонентов, паять нужно будет только разъёмы, диоды и свичи/хотсвапы на несущую плату.

Hard (чё по железу)

Heltec WiFi LoRa 32 V4

Heltec WiFi LoRa 32 V4

$22 × 1

ESP32-S3R2

Xtensa 32-bit LX7 dual-core processor (up to 240 MHz)
2 MB PSRAM, 16 MB ext. Flash, 512 KB SRAM, 384 KB ROM
Wi-Fi 802.11 b/g/n (up to 150 Mbps) and Bluetooth 5 (LE)

Semtech SX1262

863–928 MHz, 28 ±1 dBm

Здесь работает основная логика ПО. Обслуживается Meshtastic, выполняются аппликухи, рендерится UI, [де]кодируется аудио, обслуживается микрофон, пищалка, динамик и энкодеры.

Raspberry Pi Pico H

Raspberry Pi Pico H

$5 × 1

RP2040

Dual-core Arm Cortex-M0+ (up to 133 MHz)
264 KB on-chip SRAM and 2 MB on-board QSPI Flash

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

OV7670 camera module

OV7670 camera module

$5 × 1

640x480, 30 FPS
YUV / YCbCr 4:2:2, RGB565 / RGB555 / RGB444, GRB 4:2:2, Raw RGB Data

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

2.42 дюйма OLED дисплей

2,42″ OLED

$11 × 1

SSD1309
128×64, 1-bit
SPI

Дисплей... Хороший, монохромный. Бывает разных цветов. Разгонял его как-то раз кадров до 160/с, вроде. Как опцию можно будет рассмотреть обычный LCD экран вместо этого.

MAX98357A

MAX98357A

$4

I2S DAC + amp

I2S ЦАП + усилитель, чтобы нормально раскачать динамик от E398.

Динамик Motorola E398

5089626N01

$1

Motorola E398 Speaker

Динамик от E398. С усилителем должно играть нормально.

INMP441

INMP441

$3

I2S MEMS microphone

I2S микрофон, сразу со встроенным АЦП.

Энкодер KY-040

KY-040

$1.5 × 2

Rotary encoder

Навигация, громкость, яркость, скорость голосовух и т. д.

MX-совместимый свич

MX

$0.2 × 16

Cheap compatible switch

Ну хоть клавиатура нормальная. Печатать будем на T9, деды печатали.

Пищалка

Buzzer

$0.4

Passive, PWM

Для оповещений и эффектов UI, чтобы не пробуждать усилитель

Кейкапы

Keycaps

$3
Ручки энкодеров

Knobs

$3

LiPo cell

$6

+ JST-PH

Дня на три должно хватить

Passives

$5

Розетки
Диоды 1N4148

Дня на три должно хватить

PCB

$2

Верится с трудом

Но Резонит обещает

Корпус

$?

3D Печать

Максим поможет

Итого < $100

Soft (чё по софту)

Rust + Embassy

Разработка на Rust для ESP32 достигла очень комфортного уровня, возьмём Embassy и будем юзать async. Сделаем:

  • UI, который никогда не тормозит и всегда даёт понять, что сейчас происходит (прогресс бары, визуальный отклик о совершении действий и выполнении операций)
  • UX, который позволяет быстро менюдайвить при помощи энкодеров

Meshtastic Protobuf

Возьмём за основу базовую базу от Meshtastic и будем использовать его для транспортировки своих сообщений.

То, что поддерживается в существующих portnums и полезно нам – заюзаем, а то, чего нам не хватает, реализуем на приватных портах.

Можно будет использовать существующие Meshtastic сети для доставки наших посылок.

API для мини-приложух

Сделаем казуальный API упростив работу с ресурсами девайса (память, графика, аудио, коммуникации, interop), чтобы можно было писать свои мини-приложухи без необходимости пересборки среды.

Аудио кодек

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

Встречайте, всратый аудио кодек

В целом, кодек уже позволяет жать голос до одурения и написан на чистом Rust, что довольно приятно, где-то он даже не хуже, чем Codec 2, хотя был сделан за сутки. По перфу и #[no_std] на ESP32 ещё смотрел, но он сработает. Можно посмотреть & покрутить, исходники на GitHub. Пример ниже показывает работу при битрейте ~1 kbps.

Оригинал, без сжатия, 329 KB

Зашакалено, наш кодек, 0.5 KB

GitHub

А зачем вообще и что потом с этим делать?

Ответ на этот вопрос, скорее всего, будет для каждого разным и появится в процессе, когда к разработке подключатся все, кому будет интересно что-то делать вместе или кому реально будет интересна концепция самого девайса. Возможно, девайс – не цель? Для фана? Делаем коммуникатор, чаще общаемся, профит. Но если без философии, то лично мне девайс интересен по следующим причинам:

Кирпич крупным планом: экран, клавиатура и два энкодера

Other Dreamz

Meshtastic Store & Forward

Мы можем заюзать модуль Store & Forward из Meshtastic для того, чтобы запрашивать сообщения, которые клиент пропустил, пока был не в сети. Это немного снизит тряску из-за опасений проворонить чьи-то сообщения и позволит воспринимать мессенджер как что-то более надёжное.

Менеджер контактов и чатов

В Meshtastic клиентах вечно какие-то дико неудобные подходы к конфигурированию чат-комнат и работе с адресной книжкой. Надо сделать это нормально и привычно.

Crazy Video Codec

Раз у нас уже есть голосовой кодек и точно будет кодек для картинок, то тут не далеко и до видео кодека с интересными способами компрессии картинок низкой глубины. Видео-связь на реалистичных дальнобойных LoRa режимах вряд ли получится сделать, но смешные GIFки – вполне.

25 оттенков серого

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

Игры

Несколько классических игр уж точно нужно будет сделать. Тетрис, змейка, Stack Attack и подобное. У нас есть долгоживующая клавиатура на взрослых свичах, значит можно играть не беспокоясь о том, что она сдохнет, а ещё у нас есть два энкодера, можно управлять как на Playdate.

Фича X?

Добавляйте свои идеи в GitHub, мы их добавим сюда в кучу.