Управление ардуино через интернет. Скетч

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

Для начала давайте рассмотрим характеристики платы. Для примера возьмем Arduino Nano:

Микроконтроллер Atmel ATmega168 или ATmega328
Рабочее напряжение (логическая уровень) 5 В
Входное напряжение (рекомендуемое) 7-12 В
Входное напряжение (предельное) 6-20 В
Цифровые Входы/Выходы 14 (6 из которых могут использоваться как выходы ШИМ)
Аналоговые входы 8
Постоянный ток через вход/выход 40 мА
Флеш-память 16 Кб (ATmega168) или 32 Кб (ATmega328) при этом 2 Кб используются для загрузчика
ОЗУ 1 Кб (ATmega168) или 2 Кб (ATmega328)
EEPROM 512 байт (ATmega168) или 1 Кб (ATmega328)
Тактовая частота 16 МГц
Размеры 1.85 см x 4.2 см

Питание контроллера осуществляется через mini-USB или от нерегулируемого источника 6-20В (вход Vin соединенный со табилизатором напряжения).

Некоторые входы Arduino дуплексированны, тоесть могут выполнять несколько функций, например Pin 3, 5, 6, 9, 10, и 11 помимо возможности дискретных входов и выходов (задается программно) может выполнять функцию ШИМ с разрешением 8 бит и это пригодится нам чуть позже. максимальные выходные характеристики выходов контроллера 5В при токе 40мА

Вернемся к теме данной статьи, первым и самым простым методом управления нагрузкой как постоянного, так и переменного тока является реле . Суть работы которого заключается в управлении контактной группой на выходе (11, 12, 14), подачей напряжения на катушку на входе (А1, А2), которая по средствам магнитной силы двигает свой сердечник в свою очередь механически связанный с контактной группой. У реле есть один большой плюс – это гальваническая развязка между силовой цепью которую оно коммутирует и цепью управления, которая чаще всего низковольтная, в нашем случае катушка реле управляется 5V постоянного тока (DC) напрямую с любого выхода Arduino. Выходная контактная группа обычно состоит из 3 контактов: общий контакт, нормально закрытый NC, и нормально открытый NO. Общая схема реле выглядит следующим образом.


Сборка из 4 реле.


Таким образов с помощью реле можно коммутировать нагрузку до 10 А (согласно спецификации самого реле). Для программной реализации используется функция: digitalWrite(pin, value) . Где value принимает значение HIGH или LOW. Практическая схема, а также программа для управления лампой 250W 220V приведена в статье .

Если же необходимо плавное управление нагрузкой, подходящим инструментом бедет ШИМ регулирование . Как известно выходы ардуино не могут выдавать аналоговых значений в диапазоне 0…5 В, но возможно менять скважность сигнала тем самым получая эффект плавно рагулировки яркости светодиода или скорости электромоторчика. В программе используется функция: analogWrite(pin, value) , в которой value принимает значение от 0…255 (переод работы цикла). Частота же ШИМ сигнала приблизительно 490 Hz.

Для плавной регулировки яркости более мощной нагрузки (постоянного тока), чем обычный светодиод нам понадобится транзисто . Есть как готовые сборки (драйверы) с транзиторами для Arduino. Пример использования транзистора в статье , но также довольно просты в использовании простые транзисторы, цена их будет значительно ниже. В примере будет рассмотрен полевой транзистор STP16NF06 . Это N канальный транзистор, что значит без напряжения на затворе транзистор будет закрыт. Суть прибора заключается в управлении проводимостью канала сток – исток с помощью небольшого напряжения на затворе. Ниже фото устройства собранного мной для управления светододными лентами.


Сток ( drain ) – подача высокого напряжения
Затвор ( gate ) – управляющее напряжения с вых Arduino
Исток ( source ) – протекает ток со стока, когда транзистор открыт

Для наглядности привожу одну из своих схем по управлению светодиодными лентами.


Datasheet на транзистор также прикладываю к этой статье. Наиболее интересующие нас пареметры:

Vgs.th – должно быть в нашем случае не выше 5В. Vgs должно быть не меньше напряжения управляющего сигнала. Чтобы убедиться пропустит ли транзистор достаточный ток при подаче 5В от ардуино достаточно посмотреть на характеристику Id(Vgs).


Также обратите внимание что рассеивающая способность зависит от типа корпуса, для корпуса TO-220 она выше.

Существуют более специфичные схемы управления нагрузкой, например для управления мощными светодиодами, которые приобретают все большую поплярность. Пример такого управления я приводил в статье посвещенной фитолампам (). Особенность этих светодиодов заключается в отсутсвии токоограничивающих резисторов в цепи светодиода, значит постоянное значение тока 300mA для 1W светодиодов и до 700mA для 3W светододов должен поддерживать драйвер . При этом драйвер должен изменять значение своего выходного напряжения в зависимости от количества подключаемых светодиодов, так как светодиоды подключаются последовательно величина напряжения будет равна сумме падений напряжения на каждом светододе для 3W светодиодов это порядка 3V, значит для 5 светодиодов нам понадобится 15V на выходе драйвера и 700mA соответсвенно. Для уравления такими светодиодами я использую драйвер . Есть модификации как для установки на плату так и для наружной установки.


Устройсво имеет сравнительно невысокую стоимость и высокое качество сборки. Часто блоки питания и драйверы Mean well используются в промышленной автоматике.

Интересующие нас параметры:

Входное напряжение DC 9…56 В
Выходное напрядение 2…52 Вт
Постоянный выходной ток ток 600 мА
Вход диммирования 0.8…6 В

Устройство имеет вход для диммирования состояние выкл при V 2.5V DC. Таким образом драйвер можно напрямую подключать к платам ардуино с выходом ШИМ 5V.

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

Драйвера мощных светодиодов meanwell LDD-700H datasheet приобрести можно на Aliexpress
Транзистор N канальный STP16NF06 MOSFET


Всем добрый день.
Около года назад я написал небольшую , с помощью сервера NinjaBlocks. Это было довольно хорошее и удобное решение и оно отлично работало, пока в один прекрасный момент не начались проблемы с соединением. Попытки уговорить разработчиков через форум решить проблемы были напрасны - они просто игнорировали мои просьбы и не удосужились даже ответить, что было очень печально.

С того момента был просканирован весь интернет в поисках замены - и было найдено много очень интересных проектов, но они либо были слишком сложными в реализации и требовали значительных знаний в области программирования, либо были попросту неудобны. И вот тут и пришла мысль почему бы не сделать все самому.

Конечно очень хотелось использовать современные протоколы передачи данных websockets или mqtt, которые позволили бы контролировать все процессы в реальном времени, но если с клиентом для arduino дела обстояли хорошо - наличие неплохих библиотек радовало, то вот с серверной стороной дела обстояли хуже - нужны были серверы с поддержкой нужных протоколов, которых у обычного хостера не было. А заводить свой сервер ради зажигания светодиода не хотелось. И выбор пал на старый и добрый http.

1. Как это всё работает.

У нас имеется:
- сервер на php расположенный на хостинге который привязаный к доменному имени
- клиент в виде arduino
- панель управления

Arduino подключается к серверу и отправляет GET запрос, где содержатся значения датчиков температуры.

Сервер принимает запрос, и записывает значения температур в текстовые файлы. При этом читает из текстового файла значение установленного выхода для arduino и отправляет в ответ на запрос контроллера.

Arduino принимает ответ от сервера и согласно ему устанавливает состояние своего выхода

Панель управления, используя Ajax, считывает значение температуры из текстовых файлов и обновляет показания датчиков. А также считывает их текстового файла состояние выхода и обновляет его на странице. С помощью того же Ajax через форму в текстовый файл записывается значение выхода контроллера, откуда потом будет брать значение сервер и отправлять контроллеру.

2. Клиент на Arduino

Скетч довольно простой всё что он делает это собирает значение датчиков и отправляет их на сервер, получает ответ, влючает или отключает выход.

#include
#include
#include
#include

#define ONE_WIRE_BUS 2
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

byte mac = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };

EthernetClient client;
char server = "*************"; // имя вашего сервера
int buff=0;
const int led=5;

void setup()
{
Ethernet.begin(mac);
sensors.begin();
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
}

void loop()
{

Sensors.requestTemperatures();

If (client.connect(server, 80))
{

client.print(«GET /add_data.php?»);
client.print(«temperature=»);
client.print(sensors.getTempCByIndex(0));
client.print("&");
client.print("&");
client.print(«temperature1=»);
client.print(sensors.getTempCByIndex(1));
client.println(" HTTP/1.1");
client.print(«Host: »);
client.println(server);
client.println(«Connection: close»);
client.println();
client.println();

While (client.available())
{
char c = client.read();
if (c=="1")
{
buff=1;
}
if (c=="0")
{
buff=0;
}
}
client.stop();
client.flush();
delay(100);
}
else
{
client.stop();
delay(1000);
client.connect(server, 80);
}

if (buff==1)
{
digitalWrite (led1, HIGH);
}
else
{
digitalWrite(led1, LOW);
}
delay(500);
}

3. Сервер и панель управления

Сервер состоит всего из нескольких файлов:


index.php - панель управления
add_data.php - файл обрабатывающий запросы с контроллера и отсылающий ответ обратно на arduino
style.css - определяет внешний вид панели
Папка transfer - содержит файлы с помощью котрых происходит считывание и запись значений из текстовых файлов.
led.php - записывает состояние выхода в файл out-1.txt, отправленное через форму в панели управления
ledstate.php - считывает состояние из текстового файла out-1.txt и выводит на пенели в виде «ON» или «OFF»
temp-1.php и temp-2.php - считывают значения температуры из файлов in-1.txt и in-2.txt и отправляют на панель управления.
Папка txt - своего рода база данных для хранения информации.

Сервер на самом деле очень простой и его сможет установить себе любой человек с минимальными познаниями, например, как я. До работы над этим проектом у меня был опыт работы только с arduino поэтому php, ajax, html и css пришлось изучать, буквально с нуля.

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

Уверен, что матерые программисты будут пинать меня и тыкать носом в те места где можно было бы написать код более лаконично и правильно. Я это только приветствую!!!
Если вы увидели, что некоторые вещи можно сделать проще и быстрее, то сообщите мне.

Что в итоге мы имеем?

Плюсы:
- все просто и понятно
- можно настроить под свои нужды и задачи
- хорошая стабильность
- сервер можно развернуть на любом бесплатном хостинге

Минусы:
- большое количество запросов на сервер (некоторым хостерам это может не понравиться, в этом случае нужно увеличить паузу между запросами в скетче)
- кушает много трафика со стороны клиента (при 1 запросе в секунду выходит около 300 Мб в сутки)
- существует небольшая задержка на включение выходов (может быть критично для некоторых случаев)

Планы на будущее:
- добавить кнопку на контролере для влючения и выключения реле с изменением состояния на сервер
- добавить авторизацию
- добавить идентификационные ключи в запросах
- организовать работу нескольких плат одновременно с одной панелью управления
- добавить подтверждения от контроллера о включении выхода
- очень хотелось бы использовать протоколо websockets или mqtt, но всё же склоняюсь к использованию websockets c использованием socket.io

Возможно, если будет интересно, напишу статью об управлении через интернет wifi модулем esp8266. Его я уже успел успешно опробовать и убедился что все работает, правда там есть свои нюансы в работе.

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

Все желающие могут сами посетить страницу моего сервера и проверить в действии
!!! Для изменения выхода контроллера поставьте маркер на нужное значение и нажмите «ОТПРАВИТЬ» !!!

Смотрим видео

Как управлять Ардуино с компьютера через USB. Расскажем, как произвести включение светодиода и управлять сервомотором на Arduino с компьютерной клавиатуры через функцию Serial.available() и Serial.read() . Данные функции проверяют, поступают ли какие-то команды на микроконтроллер по последовательному порту, а затем считывают поступающие команды, вводимые в Serial monitor с компьютера.

Управление Ардуино через компьютер

Функция Serial.available() получает количество байт доступных для чтения из последовательного порта. Это те байты которые отправлены с компьютера и записаны в буфер последовательного порта. Буфер Serial monitor Arduino может хранить максимум до 64 байт. Функция используется также при подключении Bluetooth модуля к Ардуино и полезна при отладке устройства на проектирования.

При тестировании и настройке различных устройств, управляемых через Bluetooth, например, роботом или Лодкой на Ардуино вам пригодится знание, как управлять светодиодом и сервомотором через компьютер. Поэтому рассмотрим сейчас простое управление сервоприводом через компьютер по USB кабелю. При этом через монитор можно отправлять не только цифры, но и буквы латинского алфавита.

Как управлять Ардуино с клавиатуры

Для занятия нам понадобятся следующие детали:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • макетная плата;
  • 1 светодиод и резистор 220 Ом;
  • 1 сервопривод;
  • провода «папа-папа» и «папа-мама».

Остальные исполнительные устройства для Arduino UNO вы можете взять на свое усмотрение и самостоятельно попробовать управлять ими через компьютер с помощью USB кабеля. Соберите на макетной плате схему с одним светодиодом из первого занятия Что такое Ардуино и как им пользоваться, а после сборки схемы со светодиодом загрузите следующий скетч в микроконтроллер.

Скетч. Управление Ардуино с компьютера

int val; pinMode (13, OUTPUT ); // объявляем пин 13 как выход } void loop () { if (val == "1") {digitalWrite (13, HIGH );} // при 1 включаем светодиод if (val == "0") {digitalWrite (13, LOW );} // при 0 выключаем светодиод } }

Пояснения к коду:

  1. функция Serial.available() проверяет поступление команд с компьютера;
  2. функция Serial.read() читает данные, поступившие в Serial monitor.
  3. в условном операторе if (val == "1") стоит знак двойное равенство «соответствие», а в скобках необходимо использовать одинарные кавычки.

После сборки схемы загрузите следующий скетч в плату

Скетч. Управление сервоприводом с компьютера

#include // подключаем библиотеку для сервопривода Servo servo; // объявляем переменную servo типа "servo" int val; // освобождаем память в контроллере для переменой void setup () { Serial .begin (9600); // подключаем последовательный порт servo.attach (11); // привязываем сервопривод к выходу 11 } void loop () { // проверяем, поступают ли какие-то команды if (Serial .available ()) { val = Serial .read (); // переменная val равна полученной команде if (val == "1") { servo.write (10); } // при 1 поворачиваем серво на 10 if (val == "2") { servo.write (45); } // при 2 поворачиваем серво на 45 if (val == "3") { servo.write (90); } // при 3 поворачиваем серво на 90 } }

Пояснения к коду:

  1. в некоторых примерах программ можно встретить такой вариант проверки появления данных в Serial monitor if (Serial.available()>0) .
  2. в качестве команд можно использовать не только цифры, но и буквы. При этом имеет значение какая буква — прописная или строчная.

В данном уроке мы научимся делать простую систему, которая будет отпирать замок по электронному ключу (Метке).

В дальнейшем Вы можете доработать и расширить функционал. Например, добавить функцию "добавление новых ключей и удаления их из памяти". В базовом случае рассмотрим простой пример, когда уникальный идентификатор ключа предварительно задается в коде программы.

В этом уроке нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

2) Теперь нужно подключить Зуммер, который будет подавать сигнал, если ключ сработал и замок открывается, а второй сигнал, когда замок закрывается.

Зуммер подключаем в следующей последовательности:

Arduino Зуммер
5V VCC
GND GND
pin 5 IO

3) В роли отпирающего механизма будет использоваться сервопривод. Сервопривод может быть выбран любой, в зависимости от требуемых вам размеров и усилий, который создает сервопривод. У сервопривода имеется 3 контакта:

Более наглядно Вы можете посмотреть, как мы подключили все модули на картинке ниже:

Теперь, если все подключено, то можно переходить к программированию.

Скетч:

#include #include #include // библиотека "RFID". #define SS_PIN 10 #define RST_PIN 9 MFRC522 mfrc522(SS_PIN, RST_PIN); unsigned long uidDec, uidDecTemp; // для храниения номера метки в десятичном формате Servo servo; void setup() { Serial.begin(9600); Serial.println("Waiting for card..."); SPI.begin(); // инициализация SPI / Init SPI bus. mfrc522.PCD_Init(); // инициализация MFRC522 / Init MFRC522 card. servo.attach(6); servo.write(0); // устанавливаем серву в закрытое сосотояние } void loop() { // Поиск новой метки if (! mfrc522.PICC_IsNewCardPresent()) { return; } // Выбор метки if (! mfrc522.PICC_ReadCardSerial()) { return; } uidDec = 0; // Выдача серийного номера метки. for (byte i = 0; i < mfrc522.uid.size; i++) { uidDecTemp = mfrc522.uid.uidByte[i]; uidDec = uidDec * 256 + uidDecTemp; } Serial.println("Card UID: "); Serial.println(uidDec); // Выводим UID метки в консоль. if (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданому то серва открывает. { tone(5, 200, 500); // Делаем звуковой сигнал, Открытие servo.write(90); // Поворациваем серву на угол 90 градусов(Отпираем какой либо механизм: задвижку, поворациваем ключ и т.д.) delay(3000); // пауза 3 сек и механизм запирается. tone(5, 500, 500); // Делаем звуковой сигнал, Закрытие } servo.write(0); // устанавливаем серву в закрытое сосотояние }

Разберем скетч более детально:

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

Полученный UID необходимо ввести в следующую строчку:

If (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданному то сервопривод открывает задвижку.

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

Видео: