Управление движением через браузер, что применить?
- Войдите на сайт для отправки комментариев
Всем привет!
Пожалуйста подскажите, каким образом можно управлять Ардуиной через браузер, с учетом непрерывного действия?
То есть, чтобы при нажатой кнопке "Вперед" непрерывно шла отправка нужного символа на последовательный порт.
Поясню, как я сейчас делаю:
1. Есть php-скрипт, пишущий через fwrite на COM3-порт символ "w", получая который, Ардуино включает нужный пин (драйвер мотора).
2. Скрипт вызывается через AJAX с HTML-страницы, таким образом:
<script type="text/javascript" language="javascript"> function makeRequest(url) { var http_request = false; if (window.XMLHttpRequest) { // Mozilla, Safari, ... http_request = new XMLHttpRequest(); if (http_request.overrideMimeType) { http_request.overrideMimeType('text/xml'); // Читайте ниже об этой строке } } else if (window.ActiveXObject) { // IE try { http_request = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) { try { http_request = new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {} } } http_request.onreadystatechange = function() { alertContents(http_request); }; http_request.open('GET', url, true); http_request.send(null); } </script> <!-- ================= --> <!-- ТУТ КНОПКА ВПЕРЕД --> <div style="width:250px;" align="center"> <img src="img/forward.png" title="Вперед" value="VPERED" onclick="makeRequest('send.php?symbol=VPERED')"> <!-- ТУТ КНОПКА ВПЕРЕД --> <!-- ================= --> </div>
До этого тестил с обычной <form></form>, где после нажатия кнопки браузер перекидывал на скрипт.
Но текущий AJAX-скрипт также не может решить задачу непрерывного управления, то есть, нажав кнопку (картинку), страница отправляет один раз "w" на COM3 и все, ждет, пока кнопку\картинку вновь не нажмут.
Аналогичная ситуация при использовании событий onMouseDown и onMouseOver - также, одинарное срабатывание. Если зажать кнопку\картинку, то событие идет один раз.
Скажите, возможно ли через браузер сделать что-то вроде события onPressed, чтобы браузер циклично, непрерывно исполнял код, пока нажата кнопка\картинка?
Если я правильно понимаю, чисто средствами JS это не сделать, т.к. JS очень изолирован от железа компьютера, поэтому стоит задача непрерывно вызывать php-скрипт, можно как-то это сделать?
Заранее большое спасибо!
навскидку такая идея:
непосредственно в функции makeRequest вызов php-скрипта поместить в бесконечный цикл, который выполнять в зависимости от флага, а флаг устанавливать в true по событию onMouseDown и в false по onMouseUp
Я не могу понять: когда вы посылаете w контроллеру, что происходит? Пойдет питание контроллеру? На сколько оно подастся? Установится ли флаг или что? Просто даже если у вас нету проблем и браузер посылает состояние нажатой кнопки, посмотрите как будет работать ваше "устройство" если просто запустить цикл на php например
Я почти уверен, что ваше устройство будет дергаться.
Попробуйте сделать так:
Посылайте в МК вашу заветную "w" скриптом php выше, а в нем уже отлавливая w начинайте движение.
В МК нужно проверять если в течении 201 милисекунды не пришло команд, то останавливаемся.
201 утрированно, я бы скорей взял 300. Вобщем поэкспериментируйте с цифрами, добиваясь плавного движения.
Насчет дальнейшей реализации, я бы взглянул на WEB Sockets.
навскидку такая идея:
непосредственно в функции makeRequest вызов php-скрипта поместить в бесконечный цикл, который выполнять в зависимости от флага, а флаг устанавливать в true по событию onMouseDown и в false по onMouseUp
Что произойдет, если флаг остановиться не придет?
так это на совести ТС, что у него там происходит.
в техзадании просто сказано, что обязательно непрерывное действие, а уж он роботом по кухне ездит или у него реально экскаватор траншеи копает - хз. сие мне неведомо и последствия выходят за рамки вопроса
может у него наоборот, если все остановится - рванет чего-нибудь? :)
com, m0rjjj, большое спасибо за ответы!
C циклом в makeRequest попробую, интересная идея, спасибо!
morjjj, php-скрипт просто пишет в порт chr() символа, fwrite($fp, chr($symbol)). Ардуино в loop'е читает порт и если есть символ, то включает заданный пин, у меня самый простой вариант.
А js на HTML-странице интерфейса вызывает php-скрипт для управления через AJAX.
Но, как я уже писал в первом сообщении, у меня не получается делать "непрерывное нажатие", т.е. непрерывно вызывать php-скрипт через события JavaScript, пока кнопка нажата.
Возможно, есть какие-то типовые, применяемые ардуинщиками решения для управления через браузер, а я тут Америку пытаюсь открыть.
Большое спасибо!
Код HTML-страницы:
Код php-скрипта:
Код скетча Ардуино:
отпишитесь потом, получилось или нет, мне самому интересно стало
У вас в скетче delay, а это паразит. Объясню почему в вашем случае. Допустим вы зажали кнопку в браузере, и с интервалом в 500мс аяксом будет вызываться php скрипт, который пошлет в ком МК какой-то символ, на первый раз все сработает, а вот со вторым символом если он придет раньше чем ~500 мс в МК то эти 500мс МК будет простаивать, а если позже, то возможно реле дернется на 1~5мс.
В вашем случае я порекомендую попробывать такой алгорит. Если вы уже знакомы, как поменять deleay на millis то проблем у вас не возникнет. Делаем так:
1. заводим отдельный счетчик для каждой команды: например millisFront, millisBack, millisLeft и т.д.
2. Когда приходит символ с ком порта то вы как бы инкрементируете millisFront на 500 мс, а уже ниже проверяете если millisFront больше текущих millis то включаем реле, тем самым зная, что ему еще работать те самые 500мс, иначе - отключаем, т.к. он свое время просрочил.
Плюс возможно в том, что можно слать с браузера сразу несколько зажатых кнопок, и тем самым сразу ехать прямо и в лево. Но думаю это проблематично, лучше не стоит.
com, на Амперке посоветовали делать не непрерывно, а в два запроса - первый, на событие onMouseDown, непрерывная работа (переводим пин в HIGH), второй, на событие onMouseUp, сброс пина в LOW.
Получился такой рабочий вариант:
Интерфейс:
PHP-скрипт:
Скетч:
m0rjjj, Вы правы про delay().
В варианте с непрерывной работой по onMouseDown (мое сообщение выше) это решается и одновременно могут работать несколько кнопок (хоть все).
Теперь осталась только такая проблема - если вдруг потеряется связь, а сигнала на LOW не поступит, то робот будет выполнять действие, пока не потратит всю батарейку.
Можно сделать через:
, но если кнопка будет нажата более, чем минуту, то Ардуино переведет пин в LOW и нужно будет вновь нажимать кнопку.
com, на Амперке посоветовали делать не непрерывно, а в два запроса - первый, на событие onMouseDown, непрерывная работа (переводим пин в HIGH), второй, на событие onMouseUp, сброс пина в LOW.
Я вам указал про возможную проблему, в отсутствии сигнала от mouseUp. Решать все-равно вам, оба варианта рабочие, отпишитесь потом что получилось.
m0rjjj, с двумя запросами на onMouseDown, onMouseUp работает, его взял для робота :)
Теперь с блютусом буду пробовать беспроводное управление.