Простое управление вашим Arduino через web

Простое управление вашим Arduino через web

07.06.2019
  • Tutorial
  • Recovery Mode

Эта статья предназначена для новичков. Здесь будет описано как из 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»


Теперь давайте рассмотрим скетч для arduino, который все это принимает и обрабатывает:
#include Servo myservo; void setup() { Serial.begin(9600); } String getParam(){ String re; while (Serial.available()) { re.concat(Serial.read()-48); } return re; } int getPin(String p){ return p.substring(0,2).toInt(); } int getVal(String p){ return p.substring(2,6).toInt(); } // Главный цикл void loop() { while (Serial.available()) { char command = (char)Serial.read(); String param = getParam(); int pin = getPin(param); int p; switch (command) { case "0": //Digital write pinMode(pin,OUTPUT); digitalWrite(pin, LOW); break; case "1": //Digital write pinMode(pin,OUTPUT); digitalWrite(pin, HIGH); break; case "2": //Servo myservo.attach(pin); p = getVal(param); myservo.write(p); break; case "3": //Digital read pinMode(pin,INPUT); Serial.print(digitalRead(pin)); break; case "4": { //Analog read int aPin = A0; switch (pin) { case 1: aPin = A1; break; case 2: aPin = A2; break; case 3: aPin = A3; break; case 4: aPin = A4; break; case 5: aPin = A5; break; } Serial.print(analogRead(aPin)); } break; case "5": //Analog write pinMode(pin,OUTPUT); p = getVal(param); analogWrite(pin, p); break; } } }
По serial port мы будем передавать команды вида: 1234567 где:
- номер команды
- номер пина
- данные для пина, если надо.
Например:
113 - установит пин 13 на вывод и передаст по нему состояние HIGH (то-есть включит).
013 - установит пин 13 на вывод и передаст по нему состояние LOW (то-есть выключит).
209100 - установит пин 9 как управляющий сервоприводом и передаст ему значение 100 через ШИМ модуляцию.
310 - установит пин 10 на ввод и считает с него данные HIGH / LOW и вернет как 1 или 0 соответственно.
Вы запросто можете дописывать и свои команды в switch case блок.
Теперь добавим немного красоты в нашу frontend часть и получим, например, такое

Далее я добавил немного магии юзер-интерфейса. Но его я не буду описывать, все интересующиеся могут взять его из архива с проектом .
Для 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
  • python
  • diy или сделай сам
  • умный дом
Добавить метки

В статье рассмотрено как передавать команды Arduino для удаленного управления периферийными устройствами.

Рассмотрен простейший пример: управление двигателем постоянного тока. Уверен, многим этот пример будет интересен, так это основа автоматизации вашего умного дома. Использовать приведенный ниже материал можно для управления жалюзи или ролетами, в которых тоже используются двигатели постоянного тока, но большей мощности. Для реализации проекта вам понадобятся Arduino и некоторые навыки работы с Node.js и JavaScript.

Оборудование и софт, которые вам понадобятся

Кроме Arduino Uno и монтажной платы, вам понадобятся:

  • двигатель постоянного тока, с номинальным напряжением около 5 Вольт, чтобы запитать его непосредственно от Arduino. Могут подойти даже двигатели от игрушек: детских машинок и т.п.
  • в этом проекте мы будем вращать вал двигателя в двух направлениях. Если мы используем транзистор, вращение будет только в одну сторону. Для реализации вращения в двух направлениях, задействуем драйвер двигателя .

Полный список необходимых компонентов для проекта:

  • плата Arduino Uno R3;
  • драйвер двигателя L293D;
  • двигатель постоянного тока 5 В;
  • монтажная плата и коннекторы.

Кроме того, вам понадобится 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. За основу взят миинималистичный проект с простенькими задачами - удаленное изменение скорости и направления вращения ротора двигателя постоянного тока через веб-сервер. Рекомендуем детально ознакомиться со всеми раскрытыми в статье пояснениями. Это станет для вас хорошей базой для дальнейших более сложных проектов. Допиливайте код, обогащайте его. Например, можно добавить выбор задержки между сменой направления вращения ротора двигателя и т.п. Ограничение - лишь ваш кругозор и энтузиазм.

Оставляйте Ваши комментарии, вопросы и делитесь личным опытом ниже. В дискуссии часто рождаются новые идеи и проекты!

Ардуино идеально подходит для управления любыми устройствами. Микропроцессор ATmega с помощью программы-скетча манипулирует большим количеством дискретных выводов, аналогово-цифровых входов/выводов и ШИМ-контроллерами.

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

Принцип управления нагрузкой через Ардуино

Плата Ардуино имеет два типа портов вывода: цифровой и аналоговый (ШИМ-контроллер). У цифрового порта возможно два состояния – логический ноль и логическая единица. Если подключить к нему светодиод он либо будет светиться, либо не будет.

Аналоговый выход представляет собой ШИМ-контроллер, на который подаётся сигнал частотой около 500Гц с регулируемой скважностью. Что такое ШИМ-контроллер и принцип его работы можно найти в интернете. Через аналоговый порт возможно не только включать и выключать нагрузку, а и изменять напряжение (ток) на ней.

Синтаксис команд

Цифровой вывод:

pinMode(12, OUTPUT); — задаём порт 12 портом вывода данных;
digitalWrite(12, HIGH); — подаём на дискретный выход 12 логическую единицу, зажигая светодиод.

Аналоговый вывод:

analogOutPin = 3; – задаём порт 3 для вывода аналогового значения;
analogWrite(3, значение); – формируем на выходе сигнал с напряжением от 0 до 5В. Значение – скважность сигнала от 0 до 255. При значении 255 максимальное напряжение.

Способы управления светодиодами через Ардуино

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

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

Виды транзисторных ключей

  • Биполярный;
  • Полевой;
  • Составной (сборка Дарлингтона).
Способы подключения нагрузки
Через биполярный транзистор Через полевой транзистор Через коммутатор напряжения

При подаче высокого логического уровня (digitalWrite(12, HIGH);) через порт вывода на базу транзистора через цепочку коллектор-эмиттер потечет опорное напряжение на нагрузку. Таким образом можно включать и отключать светодиод.

Аналогичным образом работает и полевой транзистор, но поскольку у него вместо «базы» сток, который управляется не током, а напряжением, ограничительный резистор в этой схеме необязателен.

Биполярный вид не позволяет регулировать мощные нагрузки. Ток через него ограничен на уровне 0,1-0,3А.

Полевые транзисторы работают с более мощными нагрузками с током до 2А. Для ещё более мощной нагрузки используют полевые транзисторы Mosfet с током до 9А и напряжением до 60В.

Вместо полевых можно использовать сборку Дарлингтона из биполярных транзисторов на микросхемах ULN2003, ULN2803.

Микросхема ULN2003 и принципиальная схема электронного коммутатора напряжения:

Принцип работы транзистора для плавного управления светодиодной лентой

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

Подключив транзистор к аналоговому порту Ардуино, присваиваем ему значение от 0 до 255, изменяем напряжение, подаваемое на коллектор либо сток от 0 до 5В. Через цепочку коллектор-эмиттер будет проходить от 0 до 100% опорного напряжения нагрузки.

Для управления светодиодной лентой arduino необходимо подобрать транзистор подходящей мощности. Рабочий ток для питания метра светодиодов 300-500мА, для этих целей подойдет силовой биполярный транзистор. Для большей длины потребуется полевой транзистор.

Схема подключения LED ленты к ардуино:

Управление RGB лентой с помощью Andurino

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

Схема подключения к Arduino RGB светодиода:

Аналогично построено и управление RGB лентой Arduino:

Аrduino RGB контроллер лучше собирать на полевых транзисторах.

Для плавного управления яркостью можно использовать две кнопки. Одна будет увеличивать яркость свечения, другая уменьшать.

Скетч управления яркостью светодиодной ленты Arduino

int led = 120; устанавливаем средний уровень яркости

void setup() {
pinMode(4, OUTPUT); устанавливаем 4й аналоговый порт на вывод
pinMode(2, INPUT);

pinMode(4, INPUT); устанавливаем 2й и 4й цифровой порт на ввод для опроса кнопок
}
void loop(){

button1 = digitalRead(2);

button2 = digitalRead(4);
if (button1 == HIGH) нажатие на первую кнопку увеличит яркость
{
led = led + 5;

analogWrite(4, led);
}
if (button2 == HIGH) нажатие на вторую кнопку уменьшит яркость
{
led = led — 5;

analogWrite(4, led);
}

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

Модули управления Ардуино

Для создания полноценного драйвера управления светодиодной лентой можно использовать модули-датчики.

ИК-управление

Модуль позволяет запрограммировать до 20 команд.

Радиус сигнала около 8м.

Цена комплекта 6 у.е.

По радиоканалу

Четырёхканальный блок с радиусом действия до 100м

Цена комплекта 8 у.е.

Позволяет включать освещение еще при приближении к квартире.

Бесконтактное

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

Радиус действия до 5м.

Цена модуля 0,3 у.е.

Инфракрасный пульт дистанционного управления — один из самых простых способов взаимодействия с электронными приборами. Так, практически в каждом доме есть несколько таких устройств: телевизор, музыкальный центр, видеоплеер, кондиционер. Но самое интересное применение инфракрасного пульта — дистанционное правление роботом. Собственно, на этом уроке мы попытаемся реализовать такой способ управления с помощью популярного контроллера Ардуино Уно.

1. ИК-пульт

Что нужно для того, чтобы научить робота слушаться инфракрасного (ИК) пульта? Во-первых, нам потребуется сам пульт. Можно использовать обычный пульт от телевизора, а можно приобрести миниатюрный пульт от автомагнитолы. Именно такие пульты часто используются для управления роботами.

На таком пульте есть 10 цифровых кнопок и 11 кнопок для манипуляции с музыкой: громкость, перемотка, play, stop, и т.д. Для наших целей более чем достаточно.

2. ИК-датчик

Во-вторых, для приема сигнала с пульта нам потребуется специальный ИК-датчик. Вообще, мы можем детектировать инфракрасное излучение обычным фотодиодом/фототранзистором, но в отличие от него, наш ИК-датчик воспринимает инфракрасный сигнал только на частоте 38 кГц (иногда 40кГц). Именно такое свойство позволяет датчику игнорировать много посторонних световых шумов от ламп освещения и солнца.

Для этого урока воспользуемся популярным ИК-датчиком VS1838B , который обладает следующими характеристиками:

  • несущая частота: 38 кГц;
  • напряжение питания: 2,7 — 5,5 В;
  • потребляемый ток: 50 мкА.

Можно использовать и другие датчики, например: TSOP4838, TSOP1736, SFH506.

3. Подключение

Датчик имеет три вывода (три ноги). Если посмотреть на датчик со стороны приёмника ИК сигнала, как показано на рисунке,

  • то слева будет - выход на контроллер,
  • по центру - отрицательный контакт питания (земля),
  • и справа - положительный контакт питания (2.7 — 5.5В).

Принципиальная схема подключения

Внешний вид макета

4. Программа

Подключив ИК-датчик будем писать программу для Ардуино Уно. Для этого воспользуемся стандартной библиотекой IRremote , которая предназначена как раз для упрощения работы с приёмом и передачей ИК сигналов. С помощью этой библиотеки будем принимать команды с пульта, и для начала, просто выводить их в окно монитора последовательного порта. Эта программа нам пригодится для того, чтобы понять какой код дает каждая кнопка.

#include "IRremote.h" IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() { Serial.begin(9600); // выставляем скорость COM порта irrecv.enableIRIn(); // запускаем прием } void loop() { if (irrecv.decode(&results)) { // если данные пришли Serial.println(results.value, HEX); // печатаем данные irrecv.resume(); // принимаем следующую команду } }

Загружаем программу на Ардуино. После этого, пробуем получать команды с пульта. Открываем монитор последовательного порта (Ctrl+Shift+M), берём в руки пульт, и направляем его на датчик. Нажимая разные кнопочки, наблюдаем в окне монитора соответствующие этим кнопкам коды.

Проблема с загрузкой программы

В некоторых случаях, при попытке загрузить программу в контроллер, может появиться ошибка:

TDK2 was not declared In his scope

Чтобы ее исправить, достаточно удалить два файла из папки библиотеки. Заходим в проводник. Переходим в папку, где установлено приложение Arduino IDE (скорее всего это «C:\Program Files (x86)\Arduino»). Затем в папку с библиотекой:

…\Arduino\libraries\RobotIRremote

И удаляем файлы: IRremoteTools.cpp и IRremoteTools.h. Затем, перезапускаем Arduino IDE, и снова пробуем загрузить программу на контроллер.

5. Управляем светодиодом с помощью ИК-пульта

Теперь, когда мы знаем, какие коды соответствуют кнопкам пульта, пробуем запрограммировать контроллер на зажигание и гашение светодиода при нажатии на кнопки громкости. Для этого нам потребуется коды (могут отличаться, в зависимости от пульта):

  • FFA857 — увеличение громкости;
  • FFE01F — уменьшение громкости.

В качестве светодиода, используем встроенный светодиод на выводе №13, так что схема подключения останется прежней. Итак, программа:

#include "IRremote.h" IRrecv irrecv(2); // указываем вывод, к которому подключен приемник decode_results results; void setup() { irrecv.enableIRIn(); // запускаем прием } void loop() { if (irrecv.decode(&results)) { // если данные пришли switch (results.value) { case 0xFFA857: digitalWrite(13, HIGH); break; case 0xFFE01F: digitalWrite(13, LOW); break; } irrecv.resume(); // принимаем следующую команду } }

Загружаем на Ардуино и тестируем. Жмем vol+ — светодиод зажигается. Жмем vol- — гаснет. Теперь, зная как это все работает, можно вместо светодиода управлять двигателями робота, или другими самодельными микроэлектронными устройствами!

Эта статья посвещенна в основном тем экпериментаторам, которые уже попробовали моргать светодиодыми с помощью 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

© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows