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

в 1:00, , рубрики: Без рубрики

Просто автоматизируй это. Или роботизированный 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.
Просто автоматизируй это. Или роботизированный Excel
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? Это продемонстрирует, что плата действительно может управляться из чего угодно.
Просто автоматизируй это. Или роботизированный 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.

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

3. Послесловие и опрос на развитие.

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

Стандарт USB 2.0 даёт ток не более 500 милиампер. Я планирую поставить самовосстанавливающийся предохранитель на 500 милиампер, что достаточно для работы 2 сервомашинок аналогичных моей и реле. Если вы захотите подключить что то более мощное, и ваш ПК позволяет взять с порта USB больший ток, то предохранитель надо будет закоротить перемычкой, но берегите здоровье USB порта.

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

Автор: alaev

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js