Найти тему
etrivia

Страсти по "Карату".

Один мой знакомый радиолюбитель (настоящий радиолюбитель с лицензией), вдохновившись просмотром ютуб канала Алексея Игонина решил исследовать дальность связи между древними советскими радиостанциями "Карат 2".

Карат.
Карат.

Соответственно попросил меня сделать, чтобы одна из радиостанции могла работать где то в лесу в автоматическом режиме, а он мог принимать её сигнал на расстоянии. В этой радиостанции есть режим настройки / передачи вызова, когда она при нажатии кнопки переходит в режим передачи и излучает тональный сигнал. Идея была не вмешиваясь в схему радиостанции получить питание для микроконтроллера с разъёма тангенты и этим микроконтроллером просто включать выключать передачу. Отказать этому знакомому я не могу, да и задача не совсем стандартная и довольно интересная. Будем делать!

Документацию на эту радиостанцию оказалось найти не сложно https://www.qrz.ru/schemes/detail/karat-2n-manual-schematic_1081 (отдельное огромное спасибо людям выкладывающим такое в интернет). И после изучения схемы, как всегда оказалось, что суровая реальность отличается от того, что ожидалось. Питания на разъёме нет. А сама тангента представляет из себя просто динамик и два микропереключателя нажимаемые одной клавишей.

Тангента.
Тангента.

Один микропереключатель подключает динамик либо к выходу унч приёмника, либо превращая его в микрофон к входу передатчика. Другой микропереключатель управляет хитрым поляризованным реле, по сути элементом памяти запоминающим в каком режиме находится радиостанция, приём или передача. Такое решение применено для экономии емкости батарей радиостанции. Не требуется ток для удержания реле в нужном положении. Само это реле достойно отдельного обзора http://www.155la3.ru/rps20.htm

По итогу, микроконтроллеру необходимо автономное питание и не один, а два управляющих выхода, один для включения передачи, другой для выключения.

На макетной плате была собрана вот такая схема.

Схема.
Схема.
Макетная плата.
Макетная плата.
Макет.
Макет.

К выбору комплектующих строго относится не стоит, собиралось из того, что было под рукой прямо здесь и сейчас. В основу конструкции лёг микроконтроллер pic12f629, его напряжение питания от 2 до 5.5 вольт, в этот диапазон укладывается напряжение и заряженного и разряженного элемента 16850. Стабилизатор ненужен. В качестве ключей разумнее использовать просто транзисторы, но сборка uln2803 лежала на виду и сама просилась на макетку. Зелёный светодиод служит для индикации питания, красный мигает в такт передаче. Для питания конструкции был использован предельно дешёвый китайский повербанк. Купленный давным давно и ожидавший своей участи в коробке со всяким хламом. Даже сейчас он стоит всего 80 рублей. https://aliexpress.ru/item/1005001732054063.html

Повербанк.
Повербанк.
Повербанк.
Повербанк.

Очень удобно, можно зарядить аккумулятор. Правда поскольку основными потребителями энергии в этом устройстве будут два индикаторных светодиода, то ёмкости элемента 18650 хватит примерно навсегда. Плата с микроконтроллером подключается напрямую к контактам аккумулятора.

Разъём для подключения к радиостанции предоставил заказчик. Контакт J1 подключается к контакту 2 этого разъёма, J2 к контакту три, J3 к контакту 1.

Разъём.
Разъём.

Часть разъёма установленная на радиостанции. Картинка из инструкции.

Поскольку применён микроконтроллер, то просто передавать писк не интересно. Сделаем чтобы передавался осмысленный текст азбукой Морзе. Текст который нужно передавать будем хранить в EEPROM памяти контроллера. Её имеется 128 байт.

-9

Единичка это точка, три единички это тире, ноль соответственно пауза длительностью в одну точку. В примере передаются буквы "abcdef". Потом пауза и опять по кругу.

Вся программа с подробными комментариями ниже. К сожалению дзен совершенно не приспособлен для печати исходников :( Поэтому уж как получилось вставить. Этот исходник и готовый hex файл можно взять тут
http://www.romram.ru/dzen/karat2.zip . Сборка производилась на linux mint, ide mplab.x версии 6.15, компилятор xc8 2.45 бесплатная версия без оптимизации.

/*
* File: karat2.c
* Author: etrivia
*
* Created on 3 сентября 2023 г., 15:40
*/

#include <xc.h>
#include <stdint.h>

#define LEN_MSG 8*128 // Количество бит данных которые надо обработать.
#define SPEED 500 // Скорость передачи.
// Определяем какие ножки микроконтроллера и для чего будем использовать.
#define BIT_CONTROL 5 // GPIO5 Контрольный светодиод.
#define BIT_PTT_RX 4 // GPIO4 Ножка приём.
#define BIT_PTT_TX 2 // GPIO2 Ножка передача.
#define PTT_TX ((1 << BIT_CONTROL)|(1 << BIT_PTT_TX))
#define PTT_RX ((1 << BIT_PTT_RX))

// Устанавливаем биты конфигурации микроконтроллера.
#pragma config FOSC = INTRCIO // Тактирование от встроенного генератора.
#pragma config WDTE = ON // Включаем ватчдог.
#pragma config PWRTE = ON // Задержка при подаче питания включена.
#pragma config MCLRE = OFF // Вывод MCLR отдаём под GPIO.
#pragma config BOREN = ON // Контроль напряжения питания включен.
#pragma config CP = OFF // Защита памяти программ отключена.
#pragma config CPD = OFF // Защита EEPROM отключена.

//Точка задаётся как 1, тире 111, пауза 0.
//Длительность точки задана в SPEED.
//Пауза между элементами одного знака — одна точка,
//между знаками в слове — 3 точки, между словами — 7 точек.
__EEPROM_DATA(0b10111000,0b11101010,0b10001110,0b10111010,0b00111010,0b10001000,0b10101110,0b10000000);// 8 abcdef
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);// 16
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);// 32
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);// 64
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);
__EEPROM_DATA(0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000,0b00000000);//128

uint16_t Speed=0; // Задаёт скорость передачи.
uint16_t NumBitPTT=0; // Номер бита определяющего нажата передача или нет.

void main(void)
{
TRISIO = 0x00; // Все ножки на вывод.
GPIO = 0x00; // Все ножки в ноль.
OPTION_REG = 0b10001111; // Делитель включен перед WDT.
INTCON = 0b11100000; // Прерывания разрешены.
// В цикле просто сбрасываем ватчдог.
// Вся работа в прерывании.
while(1)
{
CLRWDT();
}
}

/***************************************************
* Обработчик прерывания.
****************************************************/
void __interrupt() timer0()
{
uint8_t NumBit = 0; // Номер бита в байте из которого надо считать данные.
uint8_t NumByte = 0; // Номер байта который надо считать из EEPROM.
uint8_t DataByte = 0;// Байт считанный из EEPROM.

if(++Speed >= SPEED)
{
// Проходим по каждому биту массива и управляем PTT.
NumBit = 7 - (uint8_t)(NumBitPTT%8);// Вычисляем номер бита.
NumByte = (uint8_t)NumBitPTT/8; // Вычисляем номер байта.
DataByte = eeprom_read(NumByte); // Забираем нужный байт из EEPROM.
// Получаем значение нужного бита.И управляем PTT.
GPIO = (DataByte & (1 << NumBit)) ? PTT_TX : PTT_RX;
// Наращиваем счётчик для перемещения по массиву с данными.
// Если достигли конца массива с данными то обнуляем счётчик.
if(++NumBitPTT >= LEN_MSG)
{
NumBitPTT = 0;
}
Speed = 0; // Сбрасываем счётчик задержки.
};
T0IF = 0; // Сбрасываем флаг срабатывания прерывания.
}

По итогу звук получился довольно мерзкий и весьма отдалёно напоминающий трель морзянки, но тут без серьёзного вмешательства в схему "Карата" ничего не сделать, он совсем не предназначен для такого. Но для использования в качестве маяка вполне пойдёт.

Всё что описано в статье можно обсудить в комментариях и телеграм канале etrivia.

#Карат #pic12f629 #маяк