Эта статья предназначена для новичков. Здесь будет описано как из web приложения при помощи ajax запросов посылать команды phyton скрипту, который будет передавать их через serial port непосредственно на наш arduino.
Вы приобрели себе Arduino, попробовали несколько примеров, поигрались со скетчами. Но вам этого мало, вы хотите управлять, управлять всем этим добром через интернет. Самый простой способ - это приобрести шилдик с Ethernet-портом и подключить его к Arduino (или приобрести платку с уже встроенным Ethernet). Но она и стоит дороже и в управлении надо поднатаскаться.
Для работы нам понадобятся:
- HTTP сервер
- интерпретатор python
- Arduino
Тут я опишу где взять первое и второе, и как их подружить
Теперь по порядку. Как HTTP сервер я использую Apache. Установить его не составит труда. Если вы совсем новичок и используете windows, то можете взять пакет Denwer с официального сайта, в его составе есть Apache.
Python (я использовал версию 3.3) можете взять так же с официального сайта и установить. Теперь нам надо подружить наш Apache и python. Самый простой способ - это запускать python как cgi. Для этого открываем файл httpd.conf в папке conf в том месте где вы поставили свой apache (если вы поставили denwer то путь будет примерно следующим: [буква виртуального диска]:\usr\local\bin\apache)
Ищем строчку
AddHandler cgi-script .cgi
Добавляем в конце через пробел.py и смотрим, чтоб в начале строки не было знака #. Сохраняем, перезапускам сервер.
Теперь для проверки тесной дружбы pythone и apache можно создать тестовый файлик и положить его в домашнюю папку.
#!/Python33/python.exe
print ("STATUS: 200 OK\n\n")
print ("hello world")
Обратите внимание что первой строкой мы показываем где у нас лежит интерпретатор языка. У меня, например, он лежит по адресу C:/Python33/python.exe. Думаю, разберетесь. Назовите его как хотите и зайдите на него через браузер, например, так: localhost/my_first_test_phyton_file.py. Если увидите «hello world», то все хорошо.
Код основного управляющего скрипта на JavaScript предельно прост:
//Порт к которому подключен Arduino
var serialPort = "COM5";
//непосредственно управляющая функция
var Arduino = function(command, callback){
$.get("c.py",{
c:command,
p:serialPort
}, callback);
}
Единственное что тут надо менять, как вы догадались, это порт, на котором у вас подключен arduino. Его всегда можно посмотреть в windows используя Диспетчер устройств. Мы его будем передавать в наш python скрипт чтоб тот знал на какой serial port отправлять полученные данные.
Теперь, если мы сделаем вызов нашей функции, например: Arduino(123), то скрипт создаст ajax запрос вида с.py?c=123&p=COM5 и пошлет его на наш python скрипт c.py. Рассмотрим, что он из себя представляет:
#!/Python33/python.exe
import serial
import cgi
print ("STATUS: 200 OK\n")
req = cgi.FieldStorage();
ser = serial.Serial(req["p"].value, 9600, timeout=1)
ser.write(bytes(req["c"].value,"latin"))
ser.close()
print ("ok")
Фактически он просто принимает значение параметра «с», передает его в serial port «p» и пишет «ok». Дешево и сердито.
Для тех, кто хочет не только отдавать, но и принимать, напишем больше кода
Немного усовершенствуем нашу клиентскую часть.
//непосредственно управляющая функция
var Arduino = function(sp, errorCallback) {
this.serialPort = sp;
this.errorCallback = errorCallback || function(){
console.log("Error");
}
this.send = function(data, callback){
var callback = callback;
var self = this;
data["p"] = this.serialPort;
data["s"] = Math.round(Math.random()*1000); //на всякий случай, чтобы браузер не кешировал
$.ajax({
url:"c.py",
data:data,
success:function(data){
if($.trim(data) == "error"){
self.errorCallback();
} else {
if(typeof callback == "function") callback(data);
}
}
});
}
//передаем
this.set = function(command, callback){
this.send({
c:command,
r:0
}, callback);
}
//передаем и ожидаем ответ
this.get = function(command, callback){
this.send({
c:command,
r:1 //флаг отвечающий за режим "ожидаем ответа"
}, callback);
}
}
Теперь, поскольку мы превратили Arduino в класс, то простейший вызов будет примерно таким:
var myArduino = new Arduino("COM5");
myArduino.set(113); //зажигаем светодиод на пине 13
myArduino.get(36,function(data){console.log(data)}); //смотрим состояние пина 6. и выводим его в консоль
Ну и, конечно, надо немного изменить серверную часть:
#!/Python33/python.exe
import serial
import cgi
print ("STATUS: 200 OK\n")
req = cgi.FieldStorage();
try:
ser = serial.Serial(req["p"].value, 9600, timeout=1)
except:
print("error")
exit()
ser.write(bytes(req["c"].value,"latin"))
if int(req["r"].value) == 1:
res = "";
while not res:
res = ser.readline()
print(res.decode("UTF-8"))
else:
print ("ok")
ser.close()
Тут почти ничего не поменялось, кроме того, что когда сервер в запросе получает параметр r=1 то он ожидает от Arduino ответ.
И мы добавили проверку на то, смог ли наш скрипт открыть serial port. Если нет, то вернет ключевое слово «error»
Далее я добавил немного магии юзер-интерфейса. Но его я не буду описывать, все интересующиеся могут взять его из архива с проектом .
Для web-части использовал Bootstrap (исключительно из-за удобства и его «резиновости») и jQuery (для ajax).
Теперь посмотрим как это работает.
Сначала надо указать на каком порту у вас устройство и сколько пинов имеет. Потом выбрать на каком пине у вас что находится, и вперед к управлению.
Из недостатков такого подхода можно отметить относительно медленную скорость обмена данных. Чтоб узнать состояние, например, кнопки надо посылать запросы, но слишком часто это делать нельзя, так как можем упереться в занятый serial port. На веб-сокетах работало бы быстрее, но это уже чуть более продвинутая тема, которую я, если захотите, освещу позже.
Проверялось все под Windows 8 х64. Наверно, есть какие-то особенности реализации всего этого под другие системы, буду рад услышать об этом в комментариях.
Теперь о том, где все это может пригодится: например можно сделать демонстрационный стенд; управлять положением камеры; подключить датчик температуры и прочие приборы и удаленно наблюдать за каким нибудь процессом и т.д.
Архив с проектом
Для запуска на iPad в полный экран я использовал бесплатную программу oneUrl
В тематические хабы не вставил только лишь из за отсутствия кармы.
Это первая моя статья. Буду рад ответить на вопросы.
UPD: По просьбам трудящихся я потестил так же этот метод на MacOS. Особых проблем не возникло. На маке обычно уже стоит по умолчинию python, единственное что надо сделать, это подружить его с apache. Первая строка в c.py будет
#!/usr/bin/python
Так же, возможно у вас не будет установленно расширение для питона pyserial, оно устанавливается простой командой в консоли:
easy_install -U pyserial
Далее следует обратить внимание, что обычно предустановленная версия python достаточно старая и может не работать строка
ser.write(bytes(req["c"].value,"latin"))
Я её заменил на
ser.write(bytes(req["c"].value.decode("latin")))
Все заработало.
Не забудьте посмотреть на каком порту у вас подключится девайс. Это удобно смотреть например через саму программу Arduino. Меню Сервис->Последовательный порт. У меня например он имел такой вот вид: /dev/cu.usbmodemfd141
Желаю всем удачных опытов.
Теги:
В статье рассмотрено как передавать команды Arduino для удаленного управления периферийными устройствами.
Рассмотрен простейший пример: управление двигателем постоянного тока. Уверен, многим этот пример будет интересен, так это основа автоматизации вашего умного дома. Использовать приведенный ниже материал можно для управления жалюзи или ролетами, в которых тоже используются двигатели постоянного тока, но большей мощности. Для реализации проекта вам понадобятся Arduino и некоторые навыки работы с Node.js и JavaScript.
Кроме Arduino Uno и монтажной платы, вам понадобятся:
Полный список необходимых компонентов для проекта:
Кроме того, вам понадобится Node.js. В нем мы реализуем пользовательский интерфейс. Скачать Node.js
Нам необходимо правильно подключить двигатель и драйвер. Сначала установите на монтажную плату драйвер L293D. Рекомендуем устанавливать драйвер по центру монтажной платы, как это показано на рисунке ниже. Драйвер начинается с дорожки 3 и заканчивается на дорожке 10. Теперь подключите дорожки 8 и 9 к 5 В Arduino . Контакт 5 - к контакту GND на Arduino. Осталось 3 контакта, которые работают на вход и 2 - на выход.
Цепь, которая работает на выход, простая: два контакта output подключаем к контактам двигателя постоянного тока. Контакты output - это 3 и 6. Первый контакт для подключения - это пин 1. Так называемый Enable контакт. Это контакт, который мы используем для включения/выключения двигателя и изменения его скорости вращения. Подключите этот контакт к 6 пину на Arduino. В конце концов, мы хотим подключить контакты 2 и 7 от L293D к пинам 4 и 5 на Arduino. Эти контакты будут использоваться для изменения направления движения ротора двигателя постоянного тока. Полная схема подключения приведена на рисунке ниже:
Перед реализацией удаленного управления, надо убедиться, что электросхема с драйвером L293D составлена и подключена корректно. Для проверки реализуем простенький скетч, благодаря которому двигатель разгонится и будет вращаться без остановки. Для этого используем следующий скетч:
// Инициализируем контакты мотора
int motorPinPlus = 4;
int motorPinMinus = 5;
int motorPinEnable = 6;
Serial.begin(9600);
// Объявляем переменную для хранения значений скорости
int motor_speed;
setMotor(true, motor_speed);
// функция для управления двигателем
void setMotor(boolean forward, int motor_speed)
Основа данного скетча - функция setMotor. Эту же функцию мы будем использовать в остальной части нашего проекта. Давайте разберем ее более детально:
// Функция для управления мотором
void setMotor(boolean forward, int motor_speed){
digitalWrite(motorPinPlus, forward);
digitalWrite(motorPinMinus, !forward);
analogWrite(motorPinEnable, motor_speed);
Задействовано два входа: направление и скорость. Первый шаг заключается в том, чтобы реализовать две операции digitalWrite() для установки направления вращения ротора двигателя. Один контакт на микросхеме L293D получает сигнал 5В, а второй - 0 вольт. После этого мы используем команду analogWrite(), чтобы изменять скорость вращения ротора мотора с использованием широтно-импульсной (ШИМ) модуляции. С помощью этой функции можно изменять направление вращения двигателя. Например, для ускорения мы используем:
// Вращаем ротор двигателя в заданном направлении
for (motor_speed = 0; motor_speed
setMotor(true, motor_speed);
Загрузите приведенный скетч на Arduino и мотор должен начать разгоняться до максимального значения. После этого скорость упадет до нуля и разгон начнется заново. Если все отработало как указано выше, можно переходить к следующей части нашего проекта.
На данном этапе мы уже реализовали управление двигателем постоянного тока через Arduino. Теперь давайте соберем все вместе и разработаем веб-интерфейс для нашего проекта.
Во-первых, нам надо изменить скетч Arduino, чтобы он мог он мог получать данные с хоста. После этого мы используем Node.js, чтобы обеспечить красивый интерфейс пользовательский интерфейс. Если вы никогда не занимались веб-приложениями, не волнуйтесь, в гайде детально рассмотрен каждый шаг.
Давайте начнем со скетча Arduino. Это скетч, который мы используем в этой части:
// библиотеки
#include
// создаем aREST
aREST rest = aREST();
// Инициализируем пины мотора
int motorPinPlus = 4;
int motorPinMinus = 5;
int motorPinEnable = 6;
void setup(void)
// запускаем обмен данных по серийному протоколу связи и объявляем пины мотора
pinMode(motorPinPlus, OUTPUT);
pinMode(motorPinMinus, OUTPUT);
pinMode(motorPinEnable, OUTPUT);
Serial.begin(115200);
// даем имя и ID нашему устройству
rest.set_id("001");
rest.set_name("motor_control");
// Handle REST calls
rest.handle(Serial);
При изучении скетча вы увидите, что он отличается от предыдущего. В нем тот же блок для инициализации контактов двигателя, но есть еще aREST для получения команд. Например, чтобы установить заданную скорость мотора, мы реализуем запрос с компьютера вида:
Похожие запросы мы будем делать с нашего ПУ для управления другими пинами. Например, пинами, которые отвечают за направление.
Последний блок состоит в разработке веб-интерфейса для удаленного управления скоростью мотора. Для этого мы будем использовать Node.js, который позволяет разрабатывать приложения, работающие на стороне сервера в Javascript. Этот туториал не про Node.js или Javascript, но основные моменты надо рассмотреть. Конечно же, все файлы прилагаются на GitHub .
Нам надо создать три файла: главный файл Node.js, сам интерфейс и кусок Javascript для обработки кликов в нашем пользовательском интерфейсе. Давайте начнем с файла Node.js. Код начинается с подгружения и настройки модуля Express, который представляет из себя фреймворк для простого создания сервера с Node.js:
var express = require("express");
var app = express();
// Объявляем порт
var port = 3000;
// Отображаем движок
app.set("view engine", "jade");
// Настраиваем общедоступную папку
app.use(express.static(__dirname + "/public"));
// Интерфейс
app.get("/", function(req, res){
res.render("dashboard");
После этого мы импортируем модуль Node-aREST, который обеспечивает связь между нашим сервером и платой Arduino:
var rest = require("arest")(app);
В этом файле мы также должны определить, к какому серийному порту подключена плата Arduino:
rest.addDevice("serial","/dev/tty.usbmodem1a12121",115200);
Конечно же, вам надо изменить это значение в соответствии с вашим серийным портом. Найти ваш серийный порт можно в Arduino IDE в меню Tools>Port.
Давайте заглянем в файл интерфейса, который расположен в dashboard.jade. Jade - язык, который по сути упрощает написание HTML - разметки. В Jade содержится описание интерфейса, который потом обрабатывается с помощью Node.js & Express. Ниже приведен Jade файл для нашего проекта. В нем создаются две кнопки (для направлений) и один слайдер (для изменения скорости двигателя):
h1 Motor Control
button.btn.btn-block.btn-lg.btn-primary#1 Forward
button.btn.btn-block.btn-lg.btn-danger#2 Reverse
input(type="range",min="0",max="255",value="0",id="motorspeed")
В конце мы должны добавить Javascript для обработки кликов пользователя по кнопкам и слайдеру. Это код для кнопки ‘Forward’ ("Вперед"):
$("#1").click(function() {
$.get("/motor_control/digital/4/1", function() {
$.get("/motor_control/digital/5/0");
Как мы видим, пин 4 установлен в HIGH, а пин 5 в LOW. Другие кнопки отрабатывают с точностью до наоборот. То есть, при их нажатии, мотор будет двигаться в противоположном направлении.
Для того, чтобы установить скорость мотора, мы определяем, когда пользователь отпустил слайдер. Реализуется это с помощью mouseup():
$("#motorspeed").mouseup(function(){
// Получаем значение скорости
speed = $("#motorspeed").val();
// Отсылаем команду
$.get("/motor_control/analog/6/" + speed);
Теперь можем перейти к тестированию проекта удаленного управления двигателем через веб-сайт. Не забывайте, что все исходники кода для программ, вы можете найти на GitHub . Сначала загрузите скетч remote_motor на Arduino. После этого убедитесь, что вы загрузили все файлы интерфейса и настроили ваш серийный порт в главном файле app.js.
Перейдите в эту папку через терминал и пропишите следующее:
sudo npm install express jade arest
После этого запустите приложение с помощью:
После этого вы можете перейти в ваш браузер и набрать в строке адреса следующее:
http://localhost:3000
В результате отобразится следующий интерфейс:
Дальше можно тестить и играться. Например, устанавливая направление вращения или используя слайдер для изменения скорости вращения. Мотор должен реагировать на ваши нажатия. Можно использовать ваш смартфон или планшет. Для этого достаточно использовать IP вашего компьютера и благополучно менять скорость двигателя с вашего мобильного устройства.
Приведенный выше туториал очень важен для понимания основ удаленного управления вашими устройствами с помощью Arduino. За основу взят миинималистичный проект с простенькими задачами - удаленное изменение скорости и направления вращения ротора двигателя постоянного тока через веб-сервер. Рекомендуем детально ознакомиться со всеми раскрытыми в статье пояснениями. Это станет для вас хорошей базой для дальнейших более сложных проектов. Допиливайте код, обогащайте его. Например, можно добавить выбор задержки между сменой направления вращения ротора двигателя и т.п. Ограничение - лишь ваш кругозор и энтузиазм.
Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!
В данном уроке мы научимся делать простую систему, которая будет отпирать замок по электронному ключу (Метке).
В дальнейшем Вы можете доработать и расширить функционал. Например, добавить функцию "добавление новых ключей и удаления их из памяти". В базовом случае рассмотрим простой пример, когда уникальный идентификатор ключа предварительно задается в коде программы.
В этом уроке нам понадобится:
Для реализации проекта нам необходимо установить библиотеки:
2) Теперь нужно подключить Зуммер, который будет подавать сигнал, если ключ сработал и замок открывается, а второй сигнал, когда замок закрывается.
Зуммер подключаем в следующей последовательности:
Arduino | Зуммер |
---|---|
5V | VCC |
GND | GND |
pin 5 | IO |
3) В роли отпирающего механизма будет использоваться сервопривод. Сервопривод может быть выбран любой, в зависимости от требуемых вам размеров и усилий, который создает сервопривод. У сервопривода имеется 3 контакта:
Более наглядно Вы можете посмотреть, как мы подключили все модули на картинке ниже:
Теперь, если все подключено, то можно переходить к программированию.
Скетч:
#include
Разберем скетч более детально:
Для того, что бы узнать UID карточки(Метки), необходимо записать данный скетч в arduino, собрать схему, изложенную выше, и открыть Консоль (Мониторинг последовательного порта). Когда вы поднесете метку к RFID, в консоли выведется номер
Полученный UID необходимо ввести в следующую строчку:
If (uidDec == 3763966293) // Сравниваем Uid метки, если он равен заданному то сервопривод открывает задвижку.
У каждой карточки данный идентификатор уникальный и не повторяется. Таком образом, когда вы поднесете карточку, идентификатор которой вы задали в программе, система откроет доступ с помощью сервопривода.
Видео:
Когда-нибудь задумывались о том, чтобы управлять любыми электронными устройствами с помощью смартфона? Согласитесь, управлять роботом или любыми другими устройствами с вашего смартфона было бы очень круто. Предлагаем простой урок для начинающих и чайников о том как с помощью Arduino через Bluetooth управлять смартфоном. Если вам после этого урока захочется познакомиться с Arduino поближе - вы можете найти книги о нём .
Устройства
Модуль - Bluetooth Module HC 05/06
Плата - Arduino
Светодиод (LED)
Резистор - 220Ω
Android-устройство
Программное обеспечение
Arduino IDE
Android Studio (на самом деле не нужно, т.к. приложение для Андроида вы найдете ниже)
Обычно мы делаем этот шаг в конце, но, чтобы вы понимали к чему мы должны прийти - посмотрите на результат на этом промежуточном шаге. Также ниже мы опубликовали видео урока по шагам.
Цепь в нашем уроке настолько проста и мала, что нам нужно сделать всего несколько соединений:
Arduino Pins___________Bluetooth Module Pins
RX (Pin 0)___________________TX
TX (Pin 1)___________________RX
5V_________________________VCC
GND_______________________GND
Подключите минус светодиода к GND на Arduino, а плюс к контакту 13 через сопротивление 220 Ом - 1 кОм. В целом, на нашем рисунке ниже всё довольно наглядно.
Не подключайте RX к RX и TX к TX выходы Bluetooth к выходам Arduino, вы не получите никаких данных, здесь TX означает "передача", RX означает "прием".
Теперь нам нужно написать программу и загрузить её в наш Arduino. Если вы этого пока еще не умеете делать - скачайте книги . Код ниже именно то, что нам нужно загрузить в Ардуино.
/* Bluetooh Basic: LED ON OFF * Coder - Mayoogh Girish * Website - http://bit.do/Avishkar * Download the App: https://github.com/Mayoogh/Arduino-Bluetooth-Basic * This program lets you to control a LED on pin 13 of arduino using a bluetooth module */ char data = 0; //Variable for storing received data void setup() { Serial.begin(9600); //Sets the baud for serial data transmission pinMode(13, OUTPUT); //Sets digital pin 13 as output pin } void loop() { if(Serial.available() > 0) // Send data only when you receive data: { data = Serial.read(); //Read the incoming data and store it into variable data Serial.print(data); //Print Value inside data in Serial monitor Serial.print("\n"); //New line if(data == "1") // Checks whether value of data is equal to 1 digitalWrite(13, HIGH); //If value is 1 then LED turns ON else if(data == "0") // Checks whether value of data is equal to 0 digitalWrite(13, LOW); //If value is 0 then LED turns OFF } }
Модуль HC 05/06 работает по последовательному каналу связи. Андроид-приложение последовательно отправляет данные на модуль Bluetooth, когда вы нажимаете определенную клавишу. Bluetooth на другом конце получает данные и отправить на Arduino через TX-соединение модуля Bluetooth (RX-соединение Arduino) .
Код загруженный в Arduino проверяет полученные данные и сравнивает их. Если получена "1" - светодиод включается и выключается при получении "0". Откройте монитор последовательного порта и наблюдайте полученные данные.
В этом уроке мы не будем касаться создания приложений для устройств на основе Андроида. Вы можете скачать приложение на GitHub.
Как использовать приложение?
После того как мы подключились через Bluetooth - нам нужно скачать и установить приложение, которое при помощи смартфона 🙂 будет управлять нашим светодиодом на расстоянии. Скачать приложение вы можете бесплатно на сайте Амазон.ком. Подсоединяем смартфон к модулю Bluetooth HC 05/06:
После этого мы устанавливаем приложение на наш смартфон. Открываем его. Выбираем устройство - выбираем модуль Bluetooth из списка (HC 05/06). После успешного подключения нажмите кнопку ON для включения светодиода и кнопку OFF, чтобы выключить светодиод. Потом уже можно нажать кнопку "Отключить", чтобы отключиться от модуля Bluetooth.
Это было руководство для чайников и начинающих по подключению модуля Bluetooth с Arduino. Этот проект можно улучшить и поднять на более высокий уровень для, например, автоматизация дома через управление смартфоном, управляемый робот и многое другое.
К настоящему времени системы типа «умный дом» из удивительной экзотики, доступной только самым состоятельным лицам, превратились в обыденность, к которой может приобщиться любой желающий. Выбирать есть из чего: выпуск подобных аппаратно-программных комплексов освоили очень многие разработчики. К числу наиболее известных принадлежит компания Arduino, с продукцией которой мы сейчас и познакомимся.
У этого термина есть более понятный аналог - «домашняя автоматизация». Суть подобных решений состоит в том, чтобы обеспечить автоматическое выполнение различных процессов, происходящих в жилище, офисе или на специализированных объектах. Простейший пример - автоматическое включение освещения в тот момент, когда кто-то из жильцов входит в комнату.
В любой системе «умный дом» можно выделить следующие составляющие:
Современные системы «умный дом» делятся на несколько разновидностей:
Система может не только активировать тот или иной прибор, но и проинформировать пользователя о происшедшем событии путём отправки сообщения на телефон или каким-то иным способом. Таким образом, на неё можно возложить функции сигнализации, в том числе и противопожарной.
Сценарии могут быть гораздо более сложными, чем мы описали в примерах. Например, можно научить систему включать бойлер и переводить снабжение горячей водой на него при отключении централизованной подачи, если при этом обнаруживается присутствие кого-то из жильцов в доме (помогают инфракрасные, ультразвуковые датчики, а также датчики движения).
Arduino - итальянская компания, занимающаяся разработкой и производством компонентов и программного обеспечения для простых систем «умный дом», предназначенных для неспециалистов. Примечательным является то, что этот разработчик сделал архитектуру созданных им систем полностью открытой, что дало возможность сторонним производителям разрабатывать новые и копировать уже существующие Arduino-совместимые устройства, а также выпускать ПО для них.
Набор Arduino Uno содержит необходимые компоненты для реализации устройств, описанных в прилагаемой книгеТакой подход обеспечил высокую популярность системам итальянской компании, но у него есть и недостаток: из-за того что за производство компонентов для Arduino-систем берутся, так сказать, все кому не лень, не всегда удаётся с первого раза приобрести качественное изделие. Зачастую приходится сталкиваться и с проблемой совместимости компонентов от разных производителей.
Потенциальному пользователю следует знать, что с 2008 года существуют две компании, выпускающие продукцию под торговой маркой Arduino. У первой, которая начинала это направление, официальный сайт размещён по адресу www.arduino.cc ; у второй, новообразовавшейся - по адресу www.arduino.org . То, что было разработано до раскола, на обоих сайтах представлено одинаково, а вот ассортимент новой продукции уже отличается.
ПО для систем «умный дом» Arduino имеет вид программной оболочки (называется IDE), в которой можно писать и компилировать программы. Распространяется бесплатно. Программы пишутся на языке C++.
Версии программы Arduino IDE, представленные на указанных сайтах, тоже сильно отличаются, хотя имеют одинаковые не только название, но и номера версий. Из-за этого в них довольно легко запутаться. Отличие состоит в том, что каждое ПО поддерживает свои библиотеки и платы.
«Железо» системы состоит из платы с микроконтроллером (процессорная плата) и установленных на ней плат расширения, которые в обиходе называют шилдами. Подключение шилд к процессорной плате позволяет добавлять к «умному дому» новые компоненты. Собранная система может быть как полностью автономной, так и работающей в связке с компьютером через стандартный проводной или беспроводной интерфейс.
Этот аппаратно-программный комплекс привлекает пользователя такими достоинствами:
Если загрузчик Bootloader стал работать со сбоями, либо в приобретённом микроконтроллере его не оказалось, пользователь имеет возможность прошить его самостоятельно. В программной оболочке IDE для этой цели предусмотрена поддержка ряда наиболее доступных и популярных программаторов. Кроме того, почти все процессорные платы Arduino имеют штыревой разъём, позволяющий осуществлять внутрисхемное программирование.
В программе Arduino IDE, представленной на сайте arduino.cc, заложена возможность создания пользовательских аппаратно-программных платформ, в то время как в версии программы на arduino.org такая функция отсутствует.
Поскольку производством Arduino-совместимых датчиков и приборов занимается множество компаний, ассортимент этой продукции довольно широк. Вот что применяется чаще всего:
Некоторые из этих устройств включены в состав базового набора Arduino Start, который у ряда производителей имеет название StarterKit.
Исполнительная часть содержит огромный набор устройств, например:
Если вы планируете подключить через реле Arduino освещение, то правильнее использовать в качестве светильников светодиодные лампы. Лампы накаливания при подключении через такие реле быстро горят.
Процесс создания и настройки «умного дома» Arduino покажем на примере системы, в которую будут заложены следующие функции:
Систему настроим таким образом, чтобы данные можно было просматривать посредством специального приложения, а также веб-браузера, то есть пользователь сможет сделать это из любого места, где есть доступ в интернет.
Используемые сокращения:
Для системы «умного дома» Arduino потребуется следующее:
Стоимость всех компонентов составляет примерно 90 долларов.
Вот в какой последовательности необходимо действовать.
Подключаем все компоненты согласно схеме.
Пользователь пишет всю программу целиком в оболочке Arduino IDE, для чего последняя оснащена текстовым редактором, менеджером проектов, компилятором, препроцессором и средствами для заливки программного кода в микропроцессор платы Arduino. Разработаны версии IDE для операционных систем Mac OS X, Windows и Linux. Язык программирования - С++ с некоторыми упрощениями. Пользовательские программы для Arduino принято называть скетчами (sketch) или набросками, программа IDE сохраняет их в файлы с расширением «.ino».
Функцию main(), которая в С++ является обязательной, оболочка IDE создаёт автоматически, прописывая в ней ряд стандартных действий. Пользователь должен написать функции setup() (выполняется единоразово во время старта) и loop() (выполняется в бесконечном цикле). Обе эти функции для Arduino являются обязательными.
Заголовочные файлы стандартных библиотек вставлять в программу не нужно - IDE делает это автоматически. К пользовательским библиотекам это не относится - они должны быть указаны.
Добавление библиотек в «Менеджер проекта» IDE осуществляется несколько необычным способом. В виде исходных текстов, написанных на С++, они добавляются в особую папку в рабочем каталоге оболочки IDE. После этого названия этих библиотек появятся в соответствующем меню IDE. Те, что отметит пользователь, будут внесены в список компиляции.
В IDE предусмотрен минимум настроек, а возможность настройки компилятора отсутствует вовсе. Таким образом, начинающий программист застрахован от ошибок.
Вот пример самой простой программы, заставляющей каждые 2 секунды мигать подключённый к 13-му выводу платы светодиод:
void setup () { pinMode (13, OUTPUT); // Назначение 13 вывода Arduino выходом}
void loop () { digitalWrite (13, HIGH); // Включение 13 вывода, параметр вызова функции digitalWrite HIGH - признак высокого логического уровня
delay (1000); // Цикл задержки на 1000 мс - 1 секунду
digitalWrite (13, LOW); // Выключение 13 вывода, параметр вызова LOW - признак низкого логического уровня
delay (1000); // Цикл задержки на 1 секунду}
Однако в настоящий момент перед пользователем далеко не всегда встаёт необходимость лично писать программу: в сети выложено множество готовых библиотек и скетчей (загляните сюда: http://arduino.ru/Reference). Имеется готовая программа и для системы, рассматриваемой в этом примере. Её нужно загрузить, распаковать и импортировать в IDE. Текст программы снабжён комментариями, поясняющими принцип её работы.
Когда пользователь нажимает в браузере или установленном на смартфоне приложении кнопку «Refresh» (Обновление), микроконтроллер Arduino осуществляет отсылку данных этому клиенту. С каждой из страниц, обозначенных как «/tempin», «/tempout», «/rain», «/window», «/alarm», поступает программный код, который и отображается на экране.
Для получения данных от системы «умный дом» в сети можно скачать готовое приложение.
Вот что необходимо сделать владельцу гаджета:
С помощью этого приложения можно не только получать информацию от системы «умный дом», но и управлять ею - включать и отключать сигнализацию. Если она включена, то при срабатывании датчика движения приложению будет отправлено уведомление. Опрос системы Arduino на предмет срабатывания датчика движения приложение выполняет с периодичностью раз в минуту.
Активировав иконку «Настройки», можно отредактировать свой IP-адрес.
В адресной строке браузера следует ввести XXX.XXX.XXX.XXX/all, где «XXX.XXX.XXX.XXX» - ваш IP-адрес. После этого появится возможность получать данные от системы и осуществлять управление ею.
Представленный здесь программный код позволяет через браузер включать и выключать свет, тогда как в приложении для Android-смартфона такая функция не реализована.
Этот этап не является обязательным, но он необходим, если вы хотите присвоить адресу доменное имя. Для этого надо зарегистрироваться на сайте https://www.noip.com/ , перейти в раздел «Add host» и ввести IP-адрес системы.
Создание проекта завершено, можно проверять работоспособность системы.
Ввиду того что Arduino-совместимые компоненты выпускаются множеством сторонних компаний, качество продукции которых сама компания Arduino никак не контролирует, пользователь с большой вероятностью может приобрести компонент, работающий не совсем корректно.
Похожая ситуация сложилась в сфере разработки персональных компьютеров. В своё время компания IBM сделала архитектуру своих компьютеров открытой, вследствие чего IBM-совместимые компьютеры и отдельные компоненты стали выпускать многие компании. В итоге «персоналки» этого типа широко распространились по всему миру, однако, качество комплектующих и степень их совместимости во многих случаях оказывались не на самом высоком уровне. Противоположной тактики придерживалась компания Apple. Она ограничила круг разработчиков, имеющих доступ к архитектуре, и такую же политику провела в сфере разработки ПО. В итоге компьютеры Apple оказались менее распространёнными и более дорогими, но зато по качеству они на порядок превосходят IBM-совместимые устройства, работающие под Windows.
В отношении некоторых комплектующих для систем Arduino пользователи заметили следующее:
Чтобы избежать покупки низкокачественных комплектующих, бывалые пользователи рекомендуют предварительно изучать отзывы о них, опубликованные в Сети. Недорогие датчики можно покупать в нескольких вариантах, чтобы лично проверить, какой из них работает лучше.
Возможно, система «умный дом» от компании Arduino является не самой качественной, но зато широчайший выбор компонентов и их доступная стоимость точно сделали её одной из самых популярных. Воспользовавшись нашими советами, вы быстро научитесь создавать проекты Arduino, автоматизируя различные домашние процессы.