PowerAnt - Могучий Муравей: Научи Свой компьютер Управлять Реальным Миром
PowerAnt это программное управление через RS-232 порт 14 и больше внешними устройствами с помощью компьютера. Открытый, текстовый, хорошо задокументированный протокол управления. Управление электроприборами с потребяемой мощностью до 200Вт. Хотите управлять Реальным Миром даже из MS Excel?.
 Применение
Компьютерный клуб
Компьютерная сеть
Домовая сеть
Умный дом
Прочее
 PowerAnt
Описание
Применение
Тех. характеристики
Документация
Фотографии
 Базовая станция
Описание
Применение
Тех. характеристики
Документация
 Типы PowerAnt
SwSe
SwSw
SeSe
 Скорость работы
MS-DOS
Linux
MS Windows 98
MS Windows 98, Perl
 Программирование
Примеры на Perl
C/C++ - c чего начать
C/C++ - примеры
MS Access 2000
MS Excel 2000
 Заказ
Комплектность
Цены
 ЧаВо
 Новости сайта RSS
 Статьи
 Контакты
 Рейтинги

ChipBox √ Дешевая коробочка с чипом

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


Простейшее устройство для управления чем угодно при помощи компьютера. В пределах одной среды передачи данных (помещения) может находиться до 100h устройств и 100h базовых станций. Базовая станция реализует интеллект для ChipBox. Само по себе устройство ChipBox является выносным блоком сенсоров и выключателей передающее показания сенсоров на базовую станцию, и изменяющее показания переключателей по требованию базовой станции.

Базовая станция ChipBox всегда является инициатором передачи в среде передачи данных (что решает проблему коллизий). Передача данных с ChipBox в базовую станцию практически всегда производится как ответ на выполнение команды базовой станции.

Для аварийных случаев (срабатывание определенных сенсоров) требующих моментальной реакции, устройство ChipBox может замыкать или размыкать заданную заранее группу переключателей (реализация шаговых двигателей на основе обычных двигателей).

Возможна работа устройств вне прямой видимости базовой станции, если в качестве ретранслятора можно использовать другое устройство ChipBox. Количество ретрансляторов ограничено только памятью контроллера и здравым смыслом (+ скоростью передачи данных).

ChipBox бывают трех типов:

Тип SwSe:═════ N переключателей + N сенсоров

Тип SwSw:════ N + N переключателей

Тип SeSe:═════ N + N сенсоров


Порядок взаимодействия

Среда передачи данных

В качестве среды передачи данных можно использовать ИК лучи, свет оптического диапазона или/и 2 провода. Возможно использование радиоволн (только зачем такие сложности?).

Порядок подключения устройств к сети:

1.                  Базовая станция помнит перечень своих ChipBox

2.                  В случае если, требуется подключить более чем одно устройство, к сети, выполняется автоматическое сканирование всего диапазона адресов ChipBox при помощи команды CMD_PING или CMD_CHBASE. Если устройство в пределах досягаемости оно отзывается.

3.                  Переход устройства от одной Базовой станции к другой производится по договоренности базовых станций между собой с информированием об этом передаваемого устройства при помощи команды CMD_CHBASE.

Стандартный порядок

Исключения составляют команды RETRY, ECHO

1.                  Базовая станция передает пакет с командой,

2.                  ChipBox принимает команду,

3.                  ChipBox выполняет команду,

4.                  ChipBox увеличивает PID на 1,

5.                  ChipBox посылает CMD_ECHO ответ на Базовую станцию (BASE, PID, SID=ID)

6.                  Базовая станция получает ответ, увеличивает PID


Прокси взаимодействие

Номер базовой станции записан у каждого ChipBox в памяти (BASE). Все CMD_ECHO ответы уходят на ChipBox с идентификатором BASE. Его изменение возможно при помощи специальной команды CMD_CHBASE.

  1. Базовая станция передает пакет ChipBox (1) команду CMD_PROXY. Данные в теле пакета являются пакетом, который следует ретранслировать. Уровень вложенности пакетов не ограничен (точнее ограничен только здравым смыслом).
  2. ChipBox (1) ретранслирует пакет при помощи своего передатчика,
  3. ChipBox (2) принимает пакет от ChipBox (1).
  4. ChipBox (2) отсылает ECHO ответ на базовую станцию, которой для него является ChipBox (1).(или кто-то другой, что вполне возможно при смене BASE)
  5. ChipBox (1?) Принимает ECHO ответ от ChipBox (2).
  6. ChipBox (1) ретранслирует ECHO ответ на BASE.

Форматы пакетов

Основной пакет

Byte ID═══════════ ChipBox уникальный идентификатор коробочки (получатель)

Byte SID════════ ChipBox уникальный идентификатор коробочки (отправитель)

Byte PID════════ Идентификатор пакета (номер пакета в последовательности)

Byte CMD_SIZE═══════ N Команды (& 0xF0)+ размер пакета (& 0x0F)

Byte DATA[3 + 5*SIZE]═══════ Данные к команде

Byte CRC═══════ Контрольная сумма

Итого: 8 байт, 13, 18, 23, 28,┘

Уникальный идентификатор ChipBox

00 ══════ ═Не используется

FF ═════ ═Широковещательный пакет (для всех), обязателен к исполнению всеми. Может быть использован для массового самоуничтожения устройств. Применяется при повторной передачи битых пакетов (CRC ERROR).

01-7F═ Уникальный для каждого ChipBox идентификатор

80-FE═ Базовая станция, default 80h.


Идентификатор пакета PID

00 √ FF ═════════ ═Номер пакета в последовательности. Увеличивается на 1 при каждой передаче. Увеличение производится совместно на стороне ChipBox и в базовой станции.


Команды

CHBASE √ изменение номера базовой станции (используется для взаимодействия через PROXY). Изменяет переменную BASE, 1 третий байт 0.

BASE[0] = IN_PKT_DATA[0];

BASE[1] = IN_PKT_DATA[1];

Ответ ECHO:


VER √ Запрос версии и типа.

Ответ CMD_ECHO, но:

═══════════ DATA[0] √ версия firmware

═══════════ DATA[1] √ число Switch (& 0xF0), число Sensors (& 0x0F)


PING √ Запрос состояния, данные все 0.

Ответ ECHO:


ECHO √ Ответ на выполнение команды, в данных содержит состояние в виде битовой маски (состояние выключателей + сенсоров). В случае аварийного срабатывания по сенсору 3й байт содержит в виде битовой маски номера сработавших сенсоров.

Тип устройства SwSe:

OUT_PKT_ID=BASE;

OUT_PKT_SID=ID;

OUT_PKT_PID=++PID;

OUT_PKT_CMD=CMD_ECHO;

OUT_PKT_SZ=PKT_TYPE1;

OUT_PKT.DATA[0]=SWITHES;

OUT_PKT.DATA[1]=SENSORS;

OUT_PKT.DATA[2]=SETFAST;

SETFAST=0;


Тип устройства SwSw:

OUT_PKT_ID=BASE;

OUT_PKT_SID=ID;

OUT_PKT_PID=++PID;

OUT_PKT_CMD=CMD_ECHO;

OUT_PKT_SZ=PKT_TYPE1;

OUT_PKT.DATA[0]=SWITHES;

OUT_PKT.DATA[1]=0;

OUT_PKT.DATA[2]=SWITHES2;

SETFAST=0;


Тип устройства SeSe:

OUT_PKT_ID=BASE;

OUT_PKT_SID=ID;

OUT_PKT_PID=++PID;

OUT_PKT_CMD=CMD_ECHO;

OUT_PKT_SZ=PKT_TYPE1;

OUT_PKT.DATA[0]=0;

OUT_PKT.DATA[1]=SENSORS;

OUT_PKT.DATA[2]=SENSORS2;

SETFAST=0;


SET √ Установка значений переключателей (Switch), содержит положения переключателей в виде битовой маски.

Тип устройства SwSe:

SWITHES=IN_PKT.DATA[0];

Тип устройства SwSw:

SWITHES=IN_PKT.DATA[0];

SWITHES2=IN_PKT.DATA[2];

Тип устройства SeSe:

Не применяется

Ответ ECHO:


RETRY √ пакет не принят, передачу следует повторить. PID не меняется. Передается пакет, содержащийся в буфере передачи (OUT_PKT).


SETFAST √ Установка реакции на внезапное изменение показаний сенсоров. Первый байт √ номера сенсоров в виде битовой маски. Второй байт √ включить переключатели, третий байт √ выключить переключатели. Переключатели полученные по правилу (!(Байт1 || Байт2)) состояния не изменяют. Первым выполняется размыкание ключей. Вторым замыкание ключей.

Тип устройства SwSe:

Byte x = 1;

For( I = 7; I >=0 ; I--){

If(IN_PKT_DATA[1] & x){

SETFAST_ON[I] = IN_PKT_DATA[1];

SETFAST_OFF[I] = IN_PKT_DATA[2];

};

x = x << 1;

};


Тип устройства SwSw:

Не применяется

Тип устройства SeSe:

Не применяется


Ответ ECHO:


PROXY √ принять пакет.

Действие

Передать пакет, вложенный в качестве данных.

Ретранслировать CMD_ECHO ответ (если таковой придет).


Микропрограмма

Ячейки памяти в ChipBox

Word ID √ уникальный идентификатор ChipBox (2 байта), default задается при прошивании контроллера.

Byte BASE √ ID Базовой станции, к которой приписан ChipBox (2 байта), default 80h

Byte PID √ идентификатор пакета default 0, значение изменяется по команда CHBASE

Byte SETFAST_OFF[8]════════ Быстрая реакция по сенсору 1-8 √ выключить, default 0

Byte SETFAST_ON[8] ════════ Быстрая реакция по сенсору 1-8 - включить, default 0

Byte SWITCHES ══════ ═Положение переключателей, default 0

Byte SENSORS ════════ ═Предыдущие показания сенсоров, default ?

Byte OLDSENSORS ═Предыдущие показания сенсоров, default ?

Byte SWITCHES2 ════ ═Положение переключателей, default 0

Byte SENSORS2 ══════ ═Предыдущие показания сенсоров, default ?

Byte OLDSENSORS2 ══════════ ═Предыдущие показания сенсоров, default ?

//Временные переменные

Byte CRC ══════ ═Контрольная сумма

Byte SETFAST ═════════ ═Маска сенсоров по срабатыванию которых были предприняты активные действия.

Byte I;

// 27 байт

Пакет высылаемый, если была CRC_ERROR:

Byte OUT_PKT_R_SZ ═════════ ═Размер пакета = 8

Byte OUT_PKT_R[8] ═══════════ ═Буфер передаваемого пакета

OUT_PKT_R_ID

OUT_PKT_R_SID

OUT_PKT_R_PID

OUT_PKT_R_CMD = CMD_RETRY

OUT_PKT_R_DATA[3]

OUT_PKT_R_CRC

// Итого размер: 36 байт


Принимаемый пакет:

Byte IN_PKTSZ ═══════ ═Размер пакета в байтах

Byte IN_PKT[??] ══════ ═Буфер принимаемого пакета

IN_PKT_ID

IN_PKT_SID

IN_PKT_PID

IN_PKT_CMD

IN_PKT_DATA[3]

IN_PKT_CRC


Передаваемый пакет:

Byte OUT_PKTSZ ═══ ═Размер пакета

Byte OUT_PKT[??] ══ ═Буфер передаваемого пакета в байтах

OUT_PKT_ID

OUT_PKT_SID

OUT_PKT_PID

OUT_PKT_CMD

OUT_PKT_DATA[3]

OUT_PKT_CRC

// Размер: = (5*N + 8)*2

// N = 3 : 46 байт.


Схема программы

Основной цикл:

While(1){

═══════════ SENSORS = in(port1); // считать данные из порта 1

═══════════ If( OLDSENSORS != SENSORS ){ // Оперативная реакция на срабатывание сенсора

═══════════════════════ X1 = 1;

═══════════════════════ For( I1 = 7, I1 >= 0; I1--){

══════════════════════════════════ If(((OLDSENSORS & X1)==0) & (SENSORS & X1)){

══════════════════════════════════════════════ SWITHES &= (! SETFAST_OFF[I]);

══════════════════════════════════════════════ SWITHES |= SETFAST_ON[I];

══════════════════════════════════════════════ SETFAST |= X1;

══════════════════════════════════ };

══════════════════════════════════ X1 <<= 1;

═══════════════════════ };

═══════════ };

═══════════ OLDSENSORS = SENSORS;

═══════════ Out(port0, SWITHES);

};


void pkt_send(){

═══════════ ?????

};


//Реакция на пришлый пакет, у которого сошлась CRC

void pkt_recv(){ // пакет принят, что делать ?

switch( IN_PKT_CMD ){

═══════════ CMD_RETRY: {

══════════════════════════════════ // Проверяю, не я ли отсылал кем-то не принятый пакет

══════════════════════════════════ // Так как такие запросы приходят только с широковещ.

══════════════════════════════════ // Адресом получателя.

══════════════════════════════════ If(!((OUT_PKT_ID == IN_PKT_SID)

&&

(OUT_PKT_PID == IN_PKT_PID))

═){

══════════════════════════════════════════════ return;

══════════════════════════════════ };

══════════════════════════════════ // Все же этот пакет отсылали

// мы и нам его следует повторно передать

break;

};

CMD_ECHO: {

for( I = PKT_TYPE1; I >= 0 ; I--){

OUT_PKT[I] = IN_PKT[I];

};

OUT_PKT_ID=BASE;

break;

};

CMD_PROXY: {

// копирование данных из IN_PKT в OUT_PKT

break;

};

═══════════ CMD_PING: {

echo();

break;

};

═══════════ CMD_CHBASE: {

BASE[0] = IN_PKT_DATA[0];

BASE[1] = IN_PKT_DATA[1];

echo();

break;

};

═══════════════════════ CMD_SET: {

SWITHES=IN_PKT.DATA[0];

Out(port0, SWITHES);

echo();

break;

};

═══════════ CMD_SETFAST: {

X = 1;

For( I = 7; I >=0 ; I--){

If(IN_PKT_DATA[1] & x){

SETFAST_ON[I] = IN_PKT_DATA[1];

SETFAST_OFF[I] = IN_PKT_DATA[2];

};

x = x << 1;

};

echo();

break;

};

};

pkt_send(OUT_PKT);

};


void echo(){ // Собственный ответ ECHO

OUT_PKT_ID=BASE;

OUT_PKT_SID=ID;

OUT_PKT_PID=++PID;

OUT_PKT_CMD=CMD_ECHO;

OUT_PKT_SZ=PKT_TYPE1;

OUT_PKT.DATA[0]=SWITHES;

OUT_PKT.DATA[1]=SENSORS;

OUT_PKT.DATA[2]=SETFAST;

SETFAST=0;

};


void retry(){ // ошибка контрольной суммы принятого пакета

OUT_PKT_R_ID=0xFFFF; // Широковещательный пакет

OUT_PKT_R_SID=ID;

OUT_PKT_R_PID=PID; // Какой по номеру пакет мы должны переспросить (+1 ?)

OUT_PKT_R_CMD=CMD_RETRY;

OUT_PKT_R_SZ=PKT_TYPE1;

OUT_PKT_R.DATA[0]=0;

OUT_PKT_R.DATA[1]=0;

OUT_PKT_R.DATA[2]=0;

pkt_send(OUT_PKT_R);

};


//Прием/передача данных:

//Vars:

Byte bit;

Byte cnt1; // число измерений распознанных как 1

Byte cnt0; // число измерений распознанных как 0

Byte inbyte; // принимаемый байт

Byte outbyte; // передаваемый байт

Byte cntbit; // число бит (принято/передано)

Byte I; // счетчик

Byte P; // Указатель на область данных которую надо передать

Byte BitInt = 7; // Число прерываний, которое требуется для передачи 1 бита данных

// Итого: 9 байт


void ontimer_send(){

═══════════ setbit(1, outbyte & 0x01);

═══════════ cnt0++;

═══════════ if( cnt0 == BitInt ){

═══════════════════════ outbyte >>= 1;

═══════════════════════ cntbit++;

═══════════════════════ cnt0 = 0;

═══════════════════════ if( cntbit == 8 ){

══════════════════════════════════ cntbit = 0;

══════════════════════════════════ outbyte = P[I]; // берем следующий байт

══════════════════════════════════ I++;

═══════════════════════ };

}; // Приблизительно 12 команд


void ontimer_recv(){

═══════════ bit = in(port0);

═══════════ if( bit & 1){

═══════════════════════ cnt1++;

═══════════ } else {

═══════════════════════ cnt0++;

═══════════ };

═══════════ if( (cnt0 + cnt1) == BitInt ){

═══════════════════════ inbyte <<= 1;

═══════════════════════ if(cnt1 > cnt0){

══════════════════════════════════ inbyte |= 1;

═══════════════════════ };

═══════════════════════ cntbt++;

═══════════════════════ cnt1 = cnt0 = 0;

═══════════════════════ if( cntbt == 8 ){

══════════════════════════════════ cntbt = 0;

══════════════════════════════════ P[I] = inbyte; // Байт принят

══════════════════════════════════ I++;

═══════════════════════ };

═══════════ };

}; // Приблизительно 16 команд


Прочее

Скорость передачи данных, скорость работы контроллера


Поиск потерявшихся устройств

Базовая станция передает устройствам ChipBox, которые предполагается, что находятся рядом с потерявшимся устройством, команду CMD_PROXY, с вложенной в него командой CMD_CHBASE. Причем в качестве базовой станции задается ID ChipBox, который занимается поиском потерянного устройства. Если потерянное устройство видит выбранный, для проведения поисковой операции ChipBox, то оно меняет BASE и через него передает ответ CMD_ECHO (на базовую станцию).

Проблема═ √ CMD_RETRY в мертвом цикле.

Для типов SwSw и SeSe как организовать прием/передачу (то есть возможно ли программирование каждой ножки контроллера в отдельности на прием/передачу).

Применение

Дискотека √ управление осветительным оборудованием по 2м проводам при помощи компьютера. Итого осветители подключаются при помощи 4х проводов (2 провода: питание электродвигателей + лампочек) + 2 провода √ управляющие ChipBox (тип SwSe + SwSw).

Электровеник/пылесос √ управление по ИК. Автономное устройство, которое способно кататься по квартире (и выполнять полезную нагрузку, например, подметать в комнатах) (тип SwSe).

CD-библиотека √ выбор компакт диска в стойке, извлечение диска, доставка диска к приводу CD-ROM, установка диска в привод CD-ROM (тип SwSe + SwSw).

Управление елочной гирляндой - (тип SwSw).

Управление электропитанием устройств с компьютера √ блок розеток для подключения чего-либо к сети 200В. Число управляемых устройств от 7(SwSe) до 1400 (SwSw + 100 штук в кластере).

ДАС √ Дистанционный Аварийный Сигнализатор выявление перегрева и автоматическое включение вентиляторов. Затопление, задымление, возможность нажимать кнопочку RESET (7 сенсоров + 7 выключателей √ самое то).

Управляемая игрушечная подводная лодка (для чистой воды).


PowerAnt это программное управление через RS-232 порт 14 и больше внешними устройствами с помощью компьютера. Открытый, текстовый, хорошо задокументированный протокол управления. Управление электроприборами с потребяемой мощностью до 200Вт. Хотите управлять Реальным Миром даже из MS Excel?.
  © 2004-2022 by  www.anthillsolutions.com