Просте керування вашим Arduino через web
Для роботи нам знадобляться: - 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 можна створити тестовий файл і покласти його в домашню папку.
Єдине, що тут треба міняти, як ви здогадалися, це порт, на якому у вас підключений arduino. Його завжди можна подивитися у windows, використовуючи Диспетчер пристроїв. Ми його передаватимемо в наш python скрипт щоб той знав на який serial port відправляти отримані дані. Тепер, якщо ми зробимо виклик нашої функції, наприклад: Arduino(123), то скрипт створить ajax запит виду с.py?c=123&p=COM5 і надішле його на наш python скрипт c.py. Розглянемо, що він являє собою:
Фактично він просто набуває значення параметра "с", передає його в serial port "p" і пише "ok". Дешево й сердито.
Дещо вдосконалимо нашу клієнтську частину.
Тепер, оскільки ми перетворили Arduino на клас, то найпростіший виклик буде приблизно таким:
Ну і, звичайно, треба трохизмінити серверну частину:
Тут майже нічого не змінилося, крім того, що коли сервер у запиті отримує параметр r=1, то він очікує від Arduino відповідь. І ми додали перевірку на те, чи зміг наш скрипт відкрити serial port. Якщо ні, поверне ключове слово «error»
Тепер давайте розглянемо скетч для arduino, який все це приймає та обробляє:
По serial port ми передаватимемо команди виду: 1234567 де: [1] - номер команди [23] - номер піна [4567] - дані для піна, якщо треба. Наприклад: 113 - встановить пін 13 на висновок і передасть по ньому стан HIGH (тобто включить). 013 - встановить пін 13 на висновок і передасть по ньому стан LOW (тобто вимкне). 209100 - встановить пін 9 як керуючий сервоприводом і передасть йому значення 100 через ШІМ модуляцію. 310 - встановить пін 10 на введення і рахує з нього дані HIGH / LOW і поверне як 1 або 0 відповідно. Ви запросто можете дописувати і свої команди у switch case блок. Тепер додамо трохи краси в нашу frontend частину і отримаємо, наприклад, таке
Далі я додав трохи магії користувача-інтерфейсу. Але його я не описуватиму, всі, хто цікавиться, можуть взяти його з архіву з проектом. Для web-частини використовував Bootstrap (виключно через зручність та його «гумові») та jQuery (для ajax). Тепер подивимося як це працює. Спершу треба вказати на якому порту у вас пристрій і скільки пінів має. Потім вибрати на якому піні у вас, що знаходиться, і вперед до управління.
Архів з проектом Для запуску на iPad на повний екран я використав безкоштовну програму oneUrl
UPD: На прохання трудящих я потестив цей метод на MacOS. Особливих проблем не виникло. На маку зазвичай вже стоїть за замовчуванням python, єдине, що требазробити, це подружити його з apache. Перший рядок в c.py буде #!/usr/bin/python Так само, можливо у вас не буде встановлено розширення для пітону pyserial, воно встановлюється простою командою в консолі: easy_install -U pyserial Далі слід звернути увагу, що зазвичай встановлена версія python досить стара і може не працювати рядок
Я замінив її на
Все запрацювало. Не забудьте подивитися на якому порту у вас підключиться девайс. Це зручно дивитися, наприклад, через саму програму Arduino. Меню Сервіс->Послідовний порт. У мене наприклад він мав такий вигляд: /dev/cu.usbmodemfd141 Бажаю всім вдалих дослідів.
А у нас тут можна отримати грант на тестовий період Яндекс.Хмари. Варто лише у полі «секретний пароль» запровадити «Хабр»