Итак, в прошлой статье мы рассмотрели подключение устройств через юсб интерфейс. Недостатков данного способа подключения много, а самый главный заключается в небольшом расстоянии, на которое можно удалить устройство от компьютера. В этой статье будет описан способ подключения контроллера к 1С посредством локальной сети или даже интернета.
Начнём, как обычно, с ардуины, нам понадобится:
1. Контроллер ардуино уно (мега, нано или другая), которую можно приобрести на ебее рублей за 500 или нелицензионный китайский аналог за 130 рублей, как у меня.
2. Сетевой шилд.
3. Периферия, в статье рассмотрим реле.
4. Среда разработки http://arduino.ru/Arduino_environment.
Для работы с сетью нам понадобится специальная библиотека. Не все библиотеки подходят ко всем шилдам, я подобрал самую универсальную, но с довольно скудным функционалом, нам его в принципе хватит (файл приложен к статье)
После распаковки, подключаем обе библиотеки (etherShield, ETHER_28J60) к нашей студии. У меня в версии 1.0.5 это делается через меню "Скетч". Способов связи по сети много, мы выберем самый простой, отправка запроса для загрузки сетевого ресурса. IP ардуины: 192.168.1.17 , запрос будет следующим: 192.168.1.17/1 - 1 это ресурс, который мы хотим загрузить, ардуина будет воспринимать его как команду (1- выключить, 2 - включить). В ответ на такой запрос сервер отправляет хтмль код страницы, код нашей страницы будет состоять из одной цифры (0,1 или 2) - 1С будет воспринимать его как ответ о выполнении.
После подключения библиотек прошиваем контроллер следующим скетчем:
#include "etherShield.h" // подключаем библиотеки
#include "ETHER_28J60.h"
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x25}; // мак адрес устройства
static uint8_t ip[4] = {192, 168, 1, 17}; // айпи адрес
static uint16_t port = 80; //порт на котором ардуина ожидает наше подключение
ETHER_28J60 ethernet; // создаём обект сервера
void setup()
{
ethernet.setup(mac, ip, port); // инициализируем наш сервер
pinMode(7, OUTPUT); // к 7 пину подключено реле, назначаем его для вывода
}
void loop()
{
char* params; // переменная для хранения полученного запроса
if (params = ethernet.serviceRequest()) //Если чтото пришло, то считываем и выполняем код
{
if(params[0] == '1'){ // Если пришла команда 1 то ...
digitalWrite(7, LOW); // выключаем реле
ethernet.print("1"); // отправляем ответ "1"
}
else if(params[0] == '2'){ // иначе если пришла команда 2 то...
digitalWrite(7, HIGH); // включаем реле
ethernet.print("2"); // отправляем ответ "2"
}
else{ // если пришло чтото другое то...
ethernet.print("0"); // отправляем ответ "0"
}
ethernet.respond(); // отправляем
}
}
Реле подключаем как видно на фото (Vcc - 5v, Gnd - gnd, ctr -7 пин), да чуть не забыл, пины 4, 10, 11, 12, 13 используются контроллером для связи с сетевым шилдом, так, что ничего к ним не цепляем.
Наша ардуина готова, в браузере можно открыть пустую страницу, и набрать в адресной строке 192.168.1.17/2 - реле должно включиться и вернуть ответ "2", 192.168.1.17/1 - выключиться и вернуть ответ "1".
Приступаем к 1С. Если на ардуине работа с сетью сложнее, чем с ком портом, то со стороны 1С наоборот - проще. Для связи будем использовать HTTPСоединение.
Синтаксис:
Новый HTTPСоединение(<Сервер>, <Порт>, <Пользователь>, <Пароль>, <Прокси>, <Таймаут>, <ЗащищенноеСоединение>)
Из всех возможностей нам понадобится только Сервер и Таймаут, Сервер - наш айпи адрес и порт (192.168.1.17:80), Таймаут - время ожидания ответа (в секундах), проще говоря, сколько секунд будет висеть 1С, если с сетью что-то случится и ответа не будет.
Код функции 1С:
АП = "192.168.1.17:80"; // Наш IP адрес и порт, если порт 80 то можно не указывать
Команда = 1 // команда 1 - выключить, 2 - включить
Соединение = Новый HTTPСоединение(АП,,,,,3); // Цифра 3 - таймаут
Заголовки = Новый Соответствие();
Заголовки.Вставить("Content-Type", "application/x-www-form-urlencoded; charset=Windows-1251");
Запрос = Новый HTTPЗапрос("/" + Команда , Заголовки);
ОтветСервера = Соединение.Получить(Запрос); // Ответ от контроллера
Ответ = ОтветСервера.ПолучитьТелоКакСтроку(); // переводим в строку и получаем код странички
Вот и всё, теперь мы можем управлять устройствами, находящимися где угодно.
Ооо, под рукой у меня оказался ещё ультразвуковой датчик расстояния... ну что ж, дополним наш скетч работой с ним. На стороне 1С ничего не изменится, только появится новая команда "3" - для измерения расстояния.
УЗ подключаем так: vcc - 5 пин(Либо к 5 вольтам), Gnd - Gnd, Trig - 2 пин, Echo - 3 Пин.
Всё, что я добавил в скетч, пометил // !!!!!!!!!!!!!!!!!!!!!!!!!. Теперь он может работать и с реле, и с УЗ датчиком расстояния
#include "etherShield.h" // подключаем библиотеки
#include "ETHER_28J60.h"
const int Trig = 2; // !!!!!!!!!!!!!!!!
const int Echo = 3; // !!!!!!!!!!!!!!!!!
unsigned int time_us=0; // !!!!!!!!!!!!!!!!!
unsigned int distance_sm=0; // !!!!!!!!!!!!!!!!!
static uint8_t mac[6] = {0x54, 0x55, 0x58, 0x10, 0x00, 0x25}; // мак адрес устройства
static uint8_t ip[4] = {192, 168, 1, 17}; // айпи адрес
static uint16_t port = 80; //порт, на котором ардуина ожидает наше подключение
ETHER_28J60 ethernet; // создаём объект сервера
void setup()
{
ethernet.setup(mac, ip, port); // инициализируем наш сервер
pinMode(7, OUTPUT); // к 7 пину подключено реле, назначаем его для вывода
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
pinMode(5, OUTPUT); // так как на уно 5 вольтовый пин один и он занят реле, а УЗ потребляет мало
digitalWrite(5, HIGH);// назначаем 5 пин для постоянной подачи 5 вольт
pinMode(Trig, OUTPUT);
pinMode(Echo, INPUT);
//!!!!!!!!!!!!!!!!!!!!!!!!!!!
}
void loop()
{
char* params; // переменная для хранения полученного запроса
if (params = ethernet.serviceRequest()) //Если чтото пришло, то считываем и выполняем код
{
if(params[0] == '1'){ // Если пришла команда 1 то ...
digitalWrite(7, LOW); // выключаем реле
ethernet.print("1"); // отправляем ответ "1"
}
else if(params[0] == '2'){ // иначе если пришла команда 2 то...
digitalWrite(7, HIGH); // включаем реле
ethernet.print("2"); // отправляем ответ "2"
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
else if(params[0] == '3'){ // Если получили команду "3" то ....
digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера
delayMicroseconds(10); // Удерживаем 10 микросекунд
digitalWrite(Trig, LOW); // Затем убираем
time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса
distance_sm=time_us/58; // Пересчитываем в сантиметры
ethernet.print(distance_sm); // возвращаем расстояние в сантиметрах
}
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
else{ // если пришло чтото другое то...
ethernet.print("0"); // отправляем ответ "0"
}
ethernet.respond(); // отправляем
}
}
Готово, отправив команду 3, получим расстояние в сантиметрах. Команду также можно отправить из браузера (192.168.1.17/3).
К статье прикладываю библиотеки, внешнюю обработку и драйвер (CH341SER) для дешёвых китайских контроллеров как у меня, для официальной ардуины он установится вместе со студией. К сожалению, дать бесплатный доступ для скачивания файлов сайт не позволяет, поэтому кто не имеет премиум акк - гуглит на хабре в интернете по ключевым словам для поиска этой статьи в другом месте :).
ПС: Часть материалов взята с просторов интернета.