ICOM PCR-1000. Внешнее управление

Лет 10 назад, до тех времен когда получили широкое распостранение USB донглы rtl-sdr, единственной возможностью слушать желаемые частоты в эфире, была покупка сканирующего радиоприемника. А еще хотелось, чтобы им можно было управлять с компа, ибо крутить валкодер своего Degen DE1103 весело, но утомительно.

И вот я, долго выбирая, остановился на брутальном кирпиче ICOM PCR-1000. Диапазон от 100 кГц до 1.3 ГГц. Управление с компа. Сказка!

Поигрался я им, поигрался, и потребность иметь компьютер для управления приемником начинала раздражать. Иногда хотелость что-то послушать вдали от цивилизации, а цивилизацию в виде ноутбука приходилось тащить с собой. И как-то он оказался запихнут в дальний ящик. Я конечно его извлекал, делал ему модификацию с выводм ПЧ наружу, для ее оцифровки и добавления панорамного SDR. Но все же потребность в куче проводов, и каки-то болтающихся проводов идущих к компу, утомляет.

В прошлом году, я захватил из дома в Вильнюс этот приемник, дабы дореализовать одну интересную идею. А именно — независимый модуль управления PCR-1000.

Требования я сформулировал следующие:

  • Подключение к компьютеру по USB
  • Возможность управлять приемником с панели управления
  • Возможность переключаться между режимами управления с панели и управлением с компьютера.
  • Возможность батарейного питания.
  • Возможность подключения внешних динамиков, ибо громкость встроенного зачастую недостаточна.
  • (опиционально) вывод звука на компьютер через USB, c с представлением в системе как звукового источника

Ранее я года два назад я пытался сделать что-то подобное, но в качесте протокола управления, я взял протокол какого-то трансивера ICOM. Потом застрял с передачей данных по USB, глюках энкодера, и забил.

И вот в феврале этого года я допилил беспроблемную работу сквозь STM32F4. На удивление все пошло достаточно легко.

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

Снял небольшое видео, о том как оно все работает.

Из неприятного — наблюдатся глюки с отображением значнений ширины фильтра. Подебажив это дело, я обнаружил, что PythonPCR какого-то черта в отсылает команду установки параметров мало того что обрезаную (нет установки фильтра), так еще и без финальных «\r\n» символов.

Это дерьмо сбивало парсинг, и на экране я получал мусор. Сейчас я решил обрабатывать лишь корректные полные команды. Но это вызывает иногда неотрисовку значений фильтра и модуляции. Буду думать.

А пока, вполне оптимистично!

Текущий статус

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

А пока в связи с вынужденным простоем решил взять себя за жопу, и мощным усилием воли допилить такую важную штуку как библиотека работы с переферией и различными устройствами использующая libopencm32. На текущий момент запил/портировал иницализацию i2c, spi, oled экрана на ssd1306, ad9850.

В процессе работы — самое сладкое: использование USB CDC, ибо вся суть перехода на STM32 была в возможности создавать беспроблемное подключение микроконтроллера к компьютеру.

Нехватка магии в волшебной палочке

Выходные пролетели, а SPI в stm32f103 под libopencm3 все так и не заводится.

Ну ладно, я первый раз не заметил что в конфигах секции данных для mapple и bluepill отличаются.

Но чего потом, оно не заводится даже с примерами из гитхаба — не ясно.

Причем у меня есть мой код использующий spl, и он рабочий. Я тупо переписал инициализацию, а логический анализатор даже поднятие CS не показывает.

STM32F411 «Black Pill» USB & Libopencm3 bug

Небольшая заметка по результатм исследования бага с неработающей инициализацией USB с библиотекой LibOpenCm3 для китайской платки WeAct «Black Pill» v2.0.
Если не у вас не работают примеры для USB, и система даже не проводит энумерацию подключенного устройства, то вам надо:

  1. Заинклюдить otg_fs.h
    #include <libopencm3/usb/dwc/otg_fs.h>
  2. После вызова функции usbd_init отключить VBUS sensing
    OTG_FS_GCCFG |= OTG_GCCFG_NOVBUSSENS | OTG_GCCFG_PWRDWN;
    OTG_FS_GCCFG &= ~(OTG_GCCFG_VBUSBSEN | OTG_GCCFG_VBUSASEN);

Фикс-реквест все еще с 2020 года ждет мержа.
https://github.com/libopencm3/libopencm3/pull/1256