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

Задумка алгоритма

Устройство должно состоять из двух частей: 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

Т.к текстолит был двухслойным, то с одной строны рисунок был нанесен с помощью чернил лазерного принтера, а с другой стороны дорожки(зеленого цвета на плате) нарисованы лаком. И не учтено в этой зеленой дорожке:

что она подходит к посадочному месту микросхемы. А микросхему я посадил на пенльку, которая с верхней стороны платы не имеет подвода к ножке и нарисованную сверху дорожку не удалось подключить сверху к ножке. Если бы была просто припаянная микросхема, то этой ошибки бы не было. Пришлось решить ее навесным монтажем.

НУЖНО УЧИТЫВАТЬ ПРИ ПОДВЕДЕНИИ ДОРОЖЕК С ВЕРХНЕЙ СТОРОНЫ ПЛАТЫ, ЧТО БУДЕТ ДОСТУП К НОЖКЕ.

При отладке программ и проектировании схем использовались методики:

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

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