...

понедельник, 12 августа 2013 г.

Просто автоматизируй это. Или роботизированный Excel

Добрый день, уважаемые хабрачитатели.

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

Сегодня на повестке дня:

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, я сделаю это при создании формы. Код с минимумом проверок, для компактности.


Код загрузки dll.
void __fastcall TForm1::FormCreate(TObject *Sender)

{

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 для сервопривода.


Пишем обработку onChange для CheckBox

void __fastcall TForm1::CheckBox1Click(TObject *Sender)

{

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


Пишем обработку TrackBar1Change

void __fastcall TForm1::TrackBar1Change(TObject *Sender)

{

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, и кликнув по ним, начинаем творить.


Немного VBA
Private Declare Function SendVBA Lib «c:\dllForHid.dll» (ByVal comand As Long, ByVal data1 As Long, ByVal data2 As Long) As Long

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 сервомашинок, аналогичных HXT900, используемых мною и реле. Если вы захотите подключить что-то более мощное, и ваш ПК позволяет взять с порта USB больший ток, то предохранитель надо будет закоротить перемычкой, но берегите здоровье USB порта.


Внимательный читатель спросит «Позвольте, а где же демонстрация работы входов под датчики». Я на это отвечу, третья и заключительная статья, будет состоять из описания работы с датчиками (там задумана небольшая модернизация), чертежам платы в PCAD, и общим организационным вопросам. Ну а сейчас небольшой опрос.


This entry passed through the Full-Text RSS service — if this is your content and you're reading it on someone else's site, please read the FAQ at fivefilters.org/content-only/faq.php#publishers. Five Filters recommends: 'You Say What You Like, Because They Like What You Say' - http://www.medialens.org/index.php/alerts/alert-archive/alerts-2013/731-you-say-what-you-like-because-they-like-what-you-say.html


Комментариев нет:

Отправить комментарий