Рассмотрим радионабор 433МГц состоящий из модуля передатчика FS1000A и приемника XY-MK-5V. Описание работы и устройства этих модулей можно найти по этой ссылке.

Задача

имеется:

  • FS1000A
  • XY-MK-5V
  • джойстик KY-023
  • микроконтроллеры attiny13a и attiny45
  • 2 сервопривода в держателе для камеры для Raspberry PI

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

Передатчик

Для передатчика используем FS1000A, джойстик KY-023, attiny13a. Запитаем его от кроны через стабилизатор LM317 с понижением до 5В(он выступает как фильтр питающей линии).

В качестве библиотеки передачи данных по воздуху использовались исходники. Я только упростил исходный код, убрал лишний для других контроллеров, оставил только для attyny13/45.

С передатчиком проблем не возникло, скорость передачи выбрал достаточно низкую - MAN_1200 - это примерно 100 бит в секунду.

Микроконтроллер опрашивает через АЦП Rx и Ry ножки джойстка, т.к джойстик - это два потенциометра и определяет позицию потенциометра. А так же детектирует нажатие кнопки джойстика. Считанные данные 2 раза в секунду помещаются в такой массив:

#define MAGIC_NUMBER 0xFFEE
#define SEND_SIZE 4

#define Rx_coord sendData[SEND_SIZE-3]
#define Ry_coord sendData[SEND_SIZE-2]
#define TransmitKey sendData[SEND_SIZE-1]

unsigned int sendData[SEND_SIZE] = { MAGIC_NUMBER, 0, 0, 0 };

Массив - это 4 слова:

  • 1 - число ключ для проверки приемником, что пришли правильные данные, а не мусор
  • 2 - координата X, считанная с джойстика
  • 3 - координата Y, считанная с джойстика
  • 4 - была ли нажата кнопка

Массив по манчестерскому протоколу передается на передатчик. Один кадр передачи - это преамбула и сами данные. Преамбула - это 15 бит: 14 нулей и единица. преамбула нужна, чтоб приемник настроился на прием кадра и искючился мусор и шум.

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

Вся программа опроса датчиков и передачи уместилась в микросхеме attiny13a.

F_CPU=9600000

KiCad проект

Вот схема пульта:

Приемник

А вот с приемником дела обстояли хуже.

Применик должен быть запитан 5Вольтовым напряжением. Т.к. сервоприводы тоже требуют 5 вольт, то я их объединил на одну шину питания, после стабилизатора L7805.

Входной источник питания - батарея крона 9В или адаптер 10В. При работе сервоприводов на шину питания возникала нагрузка до 300 милли ампер, в эти моменты просаживалось напряжение до 4.5 Вольт на выходе L7805, в сети питания были постояные помехи, даже добавление фильтрующей емкости не помогало.

Микросхема XY-MK-5V выдавала нестабильные результаты:

  1. входной сигнал был инвертирован, по отношению передаваемого
  2. появились задержки на спадающий фронт сигнала в 450 микросекнуд, что сильно снижало скорость передачи

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

Красным квадратом выделен один из участков с задержкой. На 60 мс сигнал на передатчике переходит от 1 к 0, на приемнике лишь на 61 мс происходит реакция - смена 0 в 1. Пришлось играться с исходным кодом ManchesterRF.c подбирая таймауты для определения 0 и 1, а так же подстроить под инвертированный сигнал.

Но потом пришла идея разделить питание микроконтроллера и сервоприводов и микросхемы XY-MK-5V. Сама микросхема XY-MK-5V была перенесена на питание от L7805CV, а микроконтроллер и серводвигатели перенесены на вывход LM317 и все заработало, пропала инферсия сигнала и задержки. Т.е приемник оказался очень чувствительным к помехам в сети питания.

Вот каким стал сигнал после разделения питания:

Пропала задержка и на 4-й и 5-й дорожке можно видеть ШИМ сигнал для сервоприводов.

Исходный код для программы микроконтроллера attiny45 можно найти здесь, F_CPU=8000000

В программе используется алгоритм поиска в буфере магического числа #define MAGIC_NUMBER 0xFFEE, даже если это число не в начале буфера, а например в конце, в этом случае прочитается еще один кадр и данные объединятся(можно было не усложнять и сделать просто проверку первых байт на MAGIC_NUMBER при возникновении события ManchesterRF_available())

Ниже приведена схема из файлов для KiCad

Работа модели:

Пример приема одного байта по Манчестерскому коду

В программе при изменении уровня сигнала формируется прерывание. LS - это значение уровня старое, до прерывания, RS - это значение уровня новое, после прерывания. L - длинный период(значит или 0 менялся на 1 или 1 на 0 в передаваемом бите), S - короткий период (значит идет последовательность повторяющихся бит)

Для примера передается последовательность бит: 00101100

Выглядеть это будет по Манчестерскому коду так:

черным выделены биты и сам сигнал, красным - моменты возникновения смены сигнала, зеленым - периоды

LS & RS период 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 слово
1 LS=1 RS=0 S 0 0
2 LS=0 RS=1 S 0 1 1
3 LS=1 RS=0 S 0 1 0 2
4 LS=0 RS=1 L 0 1 0 0 4
0 1 0 0 1 9
5 LS=1 RS=0 L 0 1 0 0 1 1 13
0 1 0 0 1 1 0 26
6 LS=0 RS=1 L 0 1 0 0 1 1 0 0 4C
0 1 0 0 1 1 0 0 1 99
7 LS=1 RS=0 S 0 1 0 0 1 1 0 0 1 0 132
8 LS=0 RS=1 S 0 1 0 0 1 1 0 0 1 0 1 265
9 LS=1 RS=0 L 0 1 0 0 1 1 0 0 1 0 1 1 4CB
0 1 0 0 1 1 0 0 1 0 1 1 0 996
10 LS=0 RS=1 S 0 1 0 0 1 1 0 0 1 0 1 1 0 1 132D
11 LS=1 RS=0 S 0 1 0 0 1 1 0 0 1 0 1 1 0 1 0 265A

итого имеем 0010011001011010. Разобьем по парам 00.10.01.10.01.01.10.10 и из каждой пары возьмем младьший бит - 00101100, т.е то число, которое закодировали в самом начале на картинке.

Что еще нужно сделать

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

Добавить комментарий

Следующая запись Предыдущая запись