ARDUINO34.RU Форум ARDUINO34.RU Форум
 Поиск    Участники
Сегодня: 19.08.2018 - 17:04:32
   ARDUINO34.RU Форум -> "Умный ДОМ" -> Управление arduino через web
Страницы:  1  
АвторСообщение

ЮриКа

участник форума



Статистика:
Тем создано: 3
Сообщений: 22
Репутация: 35 ±
Здесь будет описано как из 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 ("<b>hello world</b>")

Обратите внимание что первой строкой мы показываем где у нас лежит интерпретатор языка. У меня, например, он лежит по адресу C:/Python33/python.exe. Думаю, разберетесь. Назовите его как хотите и зайдите на него через браузер, например, так: localhost/my_first_test_phyton_file.py. Если увидите «hello world», то все хорошо.


Сообщение # 1 12.11.2013 в 15:56:15

ЮриКа

участник форума



Статистика:
Тем создано: 3
Сообщений: 22
Репутация: 35 ±
Код основного управляющего скрипта на 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». Дешево и сердито.
Для тех, кто хочет не только отдавать, но и принимать, напишем больше кода
Теперь давайте рассмотрим скетч для arduino, который все это принимает и обрабатывает:

PHP код:

#include <Servo.h>

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 где:
[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).
Теперь посмотрим как это работает.
Сначала надо указать на каком порту у вас устройство и сколько пинов имеет. Потом выбрать на каком пине у вас что находится, и вперед к управлению.

скопипастено с хабрахабр (с)
Прикреплён файл: arduino_web_controll-master2.zip (3.78 Кб.)
Сообщение # 2 12.11.2013 в 16:00:37

ЮриКа

участник форума



Статистика:
Тем создано: 3
Сообщений: 22
Репутация: 35 ±
для автовыключения 3д принтера думаю пойдёт)
Сообщение # 3 12.11.2013 в 16:02:34

ЮриКа

участник форума



Статистика:
Тем создано: 3
Сообщений: 22
Репутация: 35 ±
для автовыключения 3д принтера думаю пойдёт)

ps
это не PHP код, хоть его так форум и обозвал
Сообщение # 4 12.11.2013 в 16:04:08
Страницы:  1  
Администратор запретил отвечать гостям на сообщения! Для регистрации пройдите по ссылке: зарегистрироваться


Powered by WR-Forum Professional © 1.9.9