Можно собрать синтезатор на 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 можно задать фиксированное значение в коде и не менять его энкодером.
В целом идея рабочая, реализуется за пару вечеров. Главное — аккуратная калибровка и защита от дребезга энкодера.