Что этот девайс, из себя представлят - это устройство, которое выклчает питание по таймеру и дает возможностьуправлять розеткой с расстояния. Можно сказать, что уже есть умные розетки, котороми можно управлять даже с телефона, но я не ищу легких путей. Нужно все испытать.
Задумка алгоритма
Устройство должно состоять из двух частей: 1-передатчик и 2-приемник. Данные по радиоканалу должны передаваться зашифрованными и если были записанными, то не могли быть многократно воспроизведены.
Передатчик
Состоит из двух тактовых кнопок и одного выклюателя, питается от 3-х батареек АА. Имеет один семисегментный индикатор, который показывает какую команду нужно передать. 1ая кнопка переключает последовательно доступные команды, 2ая кнопка осуществляет передачу. Расшифровка значения показания индикатора:
Символ | Команда |
---|---|
включить питание на приемнике немедленно | |
сбросить таймер в 0 у текущего режима | |
включить питание и установить таймер на 10 минут(отключить питание по достижении значения) | |
включить питание и установить таймер на 20 минут(отключить питание по достижении значения) | |
включить питание и установить таймер на 30 минут(отключить питание по достижении значения) | |
включить питание и установить таймер на 40 минут(отключить питание по достижении значения) | |
включить питание и установить таймер на 50 минут(отключить питание по достижении значения) | |
включить питание и установить таймер на 60 минут(отключить питание по достижении значения) | |
включить питание и установить таймер на 70 минут(отключить питание по достижении значения) | |
включить питание и установить таймер на 80 минут(отключить питание по достижении значения) | |
включить питание и установить таймер на 90 минут(отключить питание по достижении значения) | |
отключить питание немедленно |
При нажатии на творую кнопку, команда шифруется и отправляется на приемник.
Приемник
Устройство, принимающее команду, расшифровывающее ее. Выполняет команду и немедленно ее выполняет, тюе разрывает сеть 220 Вольт или наоборот коммутирует, или включает таймер и разрывает питание по таймеру. Приемник запитывается от сети 220 Вольт.
Алгоритм передатчика
Для передачи данных по воздуху используются FS1000A и XY-MK-5V, набор 433 МГц про который упоминается в предыдущей статье. А так же используется аналогичная библиотека ManchesterRF.c, но с изменениями для ATMega8, интервалы длинного и коротких периодов.
Как распознается принятая информация на основе короткого и длинного периода описывалось здесь
Вот код передатчика: исходный код
За один сеанс передаи передается 12 байт. Стурктура массива следующая:
- 0-й байт - открытый ключ A(Alise) по алгоритму Диффи-Хелмана.
- 1-й байт - индекс, с котрого в массиве наинаются полезные данные(их 4 байт)
- ...
- N-й полезный байт - секртеный идентификатор устройства
- N+1й полезный байт - команда
- N+2й полезный байт - младший байт счетчика сессии
- N+3й полезный байт - старший байт счетчика сессии
- ...
Публичный ключ от Боба (B) забит прямо в код передатчика, т.к. передающее устройство работает только в одну сторону
void sendMode(uint8_t command){
ClearMessage(message, MESSAGE_LEN);
SipherArray(message, MESSAGE_LEN, command);
ManchesterRF_transmitArray(MESSAGE_LEN, message);
if (!sesIdent) {
ClearMessage(message, MESSAGE_LEN);
SipherArray(message, MESSAGE_LEN, RESET_SESSION);
ManchesterRF_transmitArray(MESSAGE_LEN, message);
}
}
Если идентификатор сессии равен 0, то приемнику посылается команда RESET_SESSION
, что заставлеят приемник сброситься, подать питание. При включении передатчика посылается команда RESET_SESSION
, поэтому, если приемник не реагирует, то можно просто включить и выключить передатчик.
Схема передатчика получилась весьма простая и в проекте находится в папке KiCad.
С передатчиком все достаточно просто получилось.
Алгоритм приемника
А вот с приемником получились проблемы... Которые нужно учитывать в дальнейшем при проектировании.
Изначально в качестве отключателя на нагрузке планировал использовать реле, управляемое 5 в входом + понижающий блок питания(NRP05-A-05D + AME3-15SBAZ), т.к у AME3-15SBAZ выходное напряжение 15 В, а мне нужно было понизить его до 5, то на стабилизаторе будет падать 10 Вольт. Это может быть проблемой. Об этом ниже.
Приемник снабжен:
- блок приема информации
- командный блок
- коммутатор
- блок питания
- блок индикации
Блок приема информации - это микросхема XY-MK-5V, которая питается от 5 вольт и чувствительна к внешним помехам, к помехам питания, поэтому она отдельно от всей схемы посажена на свой собственный стабилизатор LM317.
Командный блок - это микроконтроллер, он соединен со всеми остальными блоками
Коммутатор - это блок, если он получает логическую единицу от микроконтроллера - он коммутирует цепь 220 Вольт, если получает логический 0, то разъединеят сеть.
Блок питания - это блок питающийся от сети 220 вольт, независимый от коммутируемой линии, не выключается при разрыве линии коммутатором, т.е имеет стационарное питаение и преобразует напряжение 220 V AC в 5 V DC, на выходе имеет две отдельные стабилизированные линии по 5 В. Состоит из одной схемы AME3-15SBAZ и двух LM317 с резисторами и одной фильтрующей емкостью 220 микроФарад. Одна линия запитывает микроконтроллер и коммутатор и блок индикации, а вторая радиоприемник.
Блок индикации - это светодиодная панель из 10 светодиодов, для индикации текущего режима применика.
Первая проблема возникла с блоком коммутации. На рисунке ниже приведены две схемы коммутатора, левая - на реле NRP05-A-05D
изначально планировалась именно эта схема, но в ней при коммутированной линии, т.е когда реле скоммутировано - командный блок + блок индикации + коммутатор потребляют ток около 220 мА, итого на LM317 рассеивается 10 В * 0.22А = 2.2 Вата, при долгой работе этот стабилизатор сильно нагревается. Попытки уменьшить потребляемый ток методом введнеия емкости и сопротивления перед реле к уменьшению тока не привели. Поэтому был сделан отказ от схемы и использована схема на MOC3063 + BT139. Вот это оказлсь экономная схема, потребляемый ток уменьшился до 60 мА. И вот что получилось:
Программа приемника: исходный код
Опять же библиотека ManchesterRF.c
Рабочий цикл:
int main(void)
{
DDRB = 0xFF;
PORTB = 0;
DDRC = 0xFF;
PORTC = 0;
DDRD |= _BV(PD4);
PORTD &= _BV(PD4);
uint8_t index = 0;
TCCR0 = _BV(CS02);
TCNT0 = 5;
TIMSK |= _BV(TOIE0);
TIFR = _BV(TOV0);
ManchesterRF(MAN_4800);
ManchesterRF_RXInit(2, _BV(PD3));
ManchesterRF_beginReceive();
PowerChanger(0);
sei();
flashLight(9, 1);
#ifdef DEBUG_S
// ddelay_ms(10);
#else
_delay_ms(10);
#endif // DEBUG_S
while (1)
{
int av = ManchesterRF_available();
if(av){
if(ManchesterRF_receiveArray((uint8_t *)&rxSize, (uint8_t **)&tmpBuffer)){
if (rxSize>0){
for(index=0; index<MESSAGE_LEN; index++){
message[index] = tmpBuffer[index];
}
uint8_t com = DecodeArray(message, MESSAGE_LEN, &recvIdent);
if (com!=NO_COMMAND){
if ((com!=RESET_SESSION) && sesIdent>=recvIdent){
com = NO_COMMAND;
} else {
gotoState(com);
sesIdent=recvIdent;
}
}
}
}
}
#ifdef DEBUG_S
// ddelay_ms(1);
#else
_delay_ms(1);
#endif // DEBUG_S
}
}
При включении коммутируемая цепь разъединяется, далее ожидается команда от передатчика, расшифровывается и достаются полезные данные.
Блок индикации отображает текущий режим, зажигая соответствующий номеру полученной команды светодиод. Так же в программе реализован таймер, который отсчитывает время до отключения сети 220 Вольт. А так же на индикаторе отображается полоса мигающих диодов, которая показывает сколько времени осталось до отключения(в виде полосы Progress bar)
Схему сделал на двухстороннем текстолите, вот по какой маске:
И допустил две ошибки.
Ошибка 1
В наличии имелись два LM317 в корпусе D2pack, т.е. SMD. Под него была сделана площадка:
И не учлось, что площадка на обратной стороне платы и она ДОЛЖНА БЫТЬ ОТЗЕРКАЛИРОВАНА ПРИ ПЕЧАТИ. Этого сделано не было и элемент лег неправильно, пришлось его припаивать навесным монтажем, что получилось не очень красиво.
Ошибка 2
Т.к текстолит был двухслойным, то с одной строны рисунок был нанесен с помощью чернил лазерного принтера, а с другой стороны дорожки(зеленого цвета на плате) нарисованы лаком. И не учтено в этой зеленой дорожке:
что она подходит к посадочному месту микросхемы. А микросхему я посадил на пенльку, которая с верхней стороны платы не имеет подвода к ножке и нарисованную сверху дорожку не удалось подключить сверху к ножке. Если бы была просто припаянная микросхема, то этой ошибки бы не было. Пришлось решить ее навесным монтажем.
НУЖНО УЧИТЫВАТЬ ПРИ ПОДВЕДЕНИИ ДОРОЖЕК С ВЕРХНЕЙ СТОРОНЫ ПЛАТЫ, ЧТО БУДЕТ ДОСТУП К НОЖКЕ.
При отладке программ и проектировании схем использовались методики: