Добрый день, уважаемые хабрачитатели.
Продолжаю статью о плате, позволяющей управлять внешним оборудованием, из языков высокого уровня. Предыдущая часть вызвала довольно противоречивые отзывы, поэтому я решился на вторую часть.
Сегодня на повестке дня:
1. Уточнение характеристик платы.
2. Написание программы на CodeGear C++ Builder, использующей возможности платы. Видео макета, работающего с программой
3. Послесловие и опрос на развитие.
Интересно? Продолжим под катом.
1. Уточнение характеристик платы.
Очень противоречивые мнения были в комментариях, относительно самой необходимости такой платы, но увы, никто не ответил сколько реле нужно лично вам для домашней автоматизации. Исходя из данного факта я возьму на себя смелость решить что 1 реле вполне достаточно, при необходимости в управлении двумя и более устройствами, никто не мешает подключить нужное количество моих плат. Впрочем у нас демократия, поэтому сделаю опрос.
Вообще, удивительно, но несмотря на 179 голосов «За», в комментариях вообще мало кто желал расширения функционала. Спрашивали, где на плате 1-wire, как коммутировать 100 ампер, добавить WiFi, ethernet, и вообще превратить плату в ардуино или devboard.
Однако, расширение функционала в разумных пределах мне кажется очень привлекательной мыслью, поэтому я решил кое что добавить.
Возможности платы:
1. Управление 1 реле, с напряжением коммутации 220В, 5А.
2. Наличие 4 входов для подключения датчиков работающих на замыкание/размыкание линии.
3. Управление 2 стандартными сервомашинками!
Данный объём функционала позволяет делать много интересных вещей, например управляемую Web камеру, с физическим отключением от ПК когда не используется (тссс, большой брат следит).
Роботизированную руку.
Управление любыми механизмами где надо крутить ручки, и т.д.
Для тех кто не знает что такое сервомашинка.
Это мотор с редуктором и потенциометром, благодаря которому, электроника может отслеживать и корректировать положение вала. Сервомашинка по управляющему каналу получает импульс, который чётко определяет, в какое положение она должна повернуть вал.
Сервомашинки не умеют делать полный круг или несколько оборотов. Их основные характеристики — усилие на валу, и угол в пределах которого они могут поворачиваться. Сервомашинки можно купить в любом магазине авиамоделистов.
Я покажу работу с сервомашинкой на примере HXT900.
2. Написание программы на CodeGear C++ Builder, использующей возможности платы.
Почему выбрана именно эта среда? Эта среда мутант С++ синтаксиса с Delphi, что позволит легко перенести пример на любой С++ и на Delphi по аналогии.
Для облегчения работы создана ForHid.dll.
В ней описаны 2 функции Send и Get.
Для того чтобы было удобнее работать, я создал тип данных
struct sData
{
unsigned char comand;
unsigned char data1;
unsigned char data2;
};
первый байт это команда, а 2 следующих — параметр который зависит от команды.
Для начала нам надо загрузить dll, я сделаю это при создании формы.
{
dllMod=LoadLibraryW(L«ForHid.dll»); //загрузим dll
if (dllMod==NULL) {
unsigned long error=GetLastError();
AnsiString err=SysErrorMessage(error);
Application->MessageBox(«dll не загружена», «Ошибка», MB_OK);
return;
}
SendData=(unsigned char __stdcall (*)(sData &)) GetProcAddress(dllMod, «Send»);
GetData=(unsigned char __stdcall (*)(sData &)) GetProcAddress(dllMod, «Get»);
if (SendData==NULL) {//если не нашли функцию то ДЛЛ явно не наша
FreeLibrary(dllMod);
return;
}
}
На старте мы или загрузим dll или получим сообщение об ошибке.
Теперь поместим на форму элементы управления. Я взял CheckBox для реле и TrackBar для сервопривода.
{
if (CheckBox1->Checked==true) {
sData a;
a.comand=RELAY;
a.data1=1;
SendData(a);
}
else
{
sData a;
a.comand=RELAY;
a.data1=0;
SendData(a);
}
}
RELAY это просто константа которая равна 1
{
sData a;
a.comand=SERVO_1;
a.data1=TrackBar1->Position;
SendData(a);
}
Не правда ли, это элементарно.
Компилируем иии вуаля, мы управляем реле и сервоприводом из своей программы.
Хмм а можно управлять реле и сервоприводом с чего нибудь совсем для этого не подходящего, например с Excel? Это продемонстрирует, что плата действительно может управляться из чего угодно.
Я немного модифицировал функцию Send специально для VBA, потому что он совсем не понимает указатели.
extern «C» __declspec(dllexport) int __stdcall SendVBA(int comand,int data1,int data2)
Как видите разница небольшая. Просто разделил параметры и сделал их стандартного для VBA типа.
Включаем в excel панель с элементами управления, кидаем на лист ToggleButton и ScrollBar, и кликнув по ним, начинаем творить.
Dim tmp As Long
Dim buff As String
Private Sub ScrollBar1_Change()
tmp = SendVBA(2, ScrollBar1.Value, 0)
End Sub
Private Sub ToggleButton1_Click()
If ToggleButton1.Value = True Then
tmp = SendVBA(1, 0, 0)
Else
tmp = SendVBA(1, 32, 0)
End If
End Sub
Возвращаемся к листу, выключаем режим редактирования и пробуем скроллить или нажимать на кнопку.
Получится что то вроде этого
Теперь по аналогии с RPG игрой в рабочей книге Excel, можно сделать робота в рабочей книге Excel.
3. Послесловие и опрос на развитие.
Что хочется сказать в послесловии. Я понимаю ваше огромное желание добавить на плату всё что только можно, но увы, реалии жизни упираются в 2 больших печали — ограничение по току порта USB и неизбежное удорожание при увеличении количества наворотов. Поэтому прошу с холодным разумом подойти к вопросу что ещё добавить на плату.
Стандарт USB 2.0 даёт ток не более 500 милиампер. Я планирую поставить самовосстанавливающийся предохранитель на 500 милиампер, что достаточно для работы 2 сервомашинок аналогичных моей и реле. Если вы захотите подключить что то более мощное, и ваш ПК позволяет взять с порта USB больший ток, то предохранитель надо будет закоротить перемычкой, но берегите здоровье USB порта.
Внимательный читатель спросит «Позвольте, а где же демонстрация работы входов под датчики». Я на это отвечу, третья и заключительная статья, будет состоять из описания работы с датчиками (там задумана небольшая модернизация), чертежам платы в PCAD, и общим организационным вопросам. Ну а сейчас небольшой опрос.
Автор: alaev