Идея Проекты

Синтезатор на Si5351 с поворотным энкодером

Концепт для обсуждения и проверки — не готовый проект, продукт или услуга.

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

Суть идеи

Разработать скетч для Arduino Nano и модуля Si5351, который формирует стабильную частоту гетеродина для трансивера с шагом 1 Гц, управляется энкодером и выводит данные на OLED.

Почему интересно: Простой и недорогой способ получить точный синтезатор частоты для радиолюбительских конструкций.

Допущения: У вас есть базовые навыки пайки и программирования Arduino.

Первые шаги к проверке

  1. Собрать схему: Arduino Nano, Si5351, энкодер, OLED по I2C.
  2. Установить библиотеки: Si5351, U8g2, Encoder.
  3. Написать базовый скетч с чтением энкодера и установкой частоты.

Риски идеи

  • Сложность калибровки Si5351 для точности
  • Возможные помехи от энкодера

Развитие идеи

Запрос: экран 1602,энкодер-трещотка,два выхода частоты-vfo и bfo. сишка si5351.2 кнопки .

Можно собрать синтезатор на Arduino Nano + Si5351 + энкодер + LCD 1602 с двумя выходами: VFO и BFO. Управление — энкодером-«трещоткой» (механическим, с тактильным откликом), две кнопки — для смены диапазона/шага и переключения режима. На старте стоит проверить:

  • Схема подключения:

  • Si5351 по I2C (SDA A4, SCL A5), адрес 0x60.

  • LCD 1602 по I2C (тот же I2C, адрес 0x27 или 0x3F).

  • Энкодер: выводы CLK и DT на D2 и D3 (с подтяжкой к VCC), SW — на D4.

  • Кнопки: D5 и D6, подтяжка к GND (INPUT_PULLUP).

  • Библиотеки:

  • Si5351 (Etherkit) для управления сишкой.

    • LiquidCrystal_I2C для дисплея.
    • Encoder (Paul Stoffregen) или собственная обработка энкодера.
  • Алгоритм работы:

  • Энкодер вращается — меняется частота VFO с выбранным шагом (1 Гц, 10 Гц, 100 Гц, 1 кГц).

  • Кнопка 1 (например, D5) — переключение шага.

  • Кнопка 2 (D6) — выбор канала: VFO или BFO (индикация на экране).

  • Частота BFO обычно фиксированная (например, 4.9152 МГц для SSB), её можно задать в коде или менять отдельно.

  • На дисплее выводится текущая частота VFO, шаг, активный канал.

  • Калибровка Si5351:

  • Используйте библиотеку Si5351 с функцией init() и при необходимости скорректируйте correction (в ppm) для точности.

  • Для проверки можно использовать частотомер или сравнить с известной радиостанцией.

  • Помехи от энкодера:

  • Добавьте конденсаторы 0.1 мкФ на выводы энкодера к GND.

  • Используйте программный антидребезг (например, задержку 5 мс после изменения состояния).

  • Примерный скетч-каркас:

#include <Si5351.h>
#include <LiquidCrystal_I2C.h>
#include <Encoder.h>

Si5351 si5351;
LiquidCrystal_I2C lcd(0x27, 16, 2);
Encoder enc(2, 3);

long oldPosition = -999;
unsigned long freqVFO = 7100000; // 7.1 МГц
unsigned long freqBFO = 4915200; // 4.9152 МГц
int step = 100; // шаг 100 Гц
bool activeChannel = 0; // 0
- VFO, 1
- BFO

void setup() {
  lcd.init();
  lcd.backlight();
  Wire.begin();
  si5351.init(SI5351_CRYSTAL_LOAD_8PF, 0, 0);
  si5351.set_freq(freqVFO * 10000ULL, SI5351_CLK0); // VFO
  si5351.set_freq(freqBFO * 10000ULL, SI5351_CLK1); // BFO
  pinMode(4, INPUT_PULLUP); // кнопка энкодера
  pinMode(5, INPUT_PULLUP); // кнопка 1
  pinMode(6, INPUT_PULLUP); // кнопка 2
  updateDisplay();
}

void loop() {
  long newPos = enc.read();
  if (newPos != oldPosition) {
    int delta = (newPos
- oldPosition) > 0 ? 1 : -1;
    oldPosition = newPos;
    if (activeChannel == 0) {
      freqVFO += delta * step;
      si5351.set_freq(freqVFO * 10000ULL, SI5351_CLK0);
    } else {
      freqBFO += delta * step;
      si5351.set_freq(freqBFO * 10000ULL, SI5351_CLK1);
    }
    updateDisplay();
  }
  // обработка кнопок
  if (digitalRead(5) == LOW) {
    // переключение шага
    step = (step == 1) ? 10 : (step == 10) ? 100 : (step == 100) ? 1000 : 1;
    delay(200);
    updateDisplay();
  }
  if (digitalRead(6) == LOW) {
    activeChannel = !activeChannel;
    delay(200);
    updateDisplay();
  }
}

void updateDisplay() {
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("VFO:");
  lcd.print(freqVFO / 1000000.0, 6);
  lcd.setCursor(0, 1);
  lcd.print("BFO:");
  lcd.print(freqBFO / 1000000.0, 6);
}
  • Рекомендации:
  • Используйте стабилизированное питание 5 В, раздельное для цифровой и аналоговой части.
  • Проверьте уровни логики: Si5351 работает от 3.3 В, но модули часто имеют преобразователь, либо используйте делители.
  • Для точности BFO можно задать фиксированное значение в коде и не менять его энкодером.

В целом идея рабочая, реализуется за пару вечеров. Главное — аккуратная калибровка и защита от дребезга энкодера.

Развить идею

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

Другая идея?

Задайте новую тему и получите свежую подборку.

Создать новую идею