Как стать автором
Обновить

Настольный пульт управления на JavaScript/Node.js для робота на Ардуине

Время на прочтение9 мин
Количество просмотров16K
Всего голосов 18: ↑16 и ↓2+14
Комментарии14

Комментарии 14

Почему всё так заморочено? Я вот тоже сначала для своего ESP8266-робота решил через http-сервер команды слать, но понял, что парсить строки на таких медленных процессорах это не есть хорошо и решил попробовать отправлять и обрабатывать UDP-датаграммы. И как ни странно, это оказалось проще чем сначала сериализовать в строку, а потом десериализовать, и сам код стал проще, и работать стало быстрее (примерно в 17 раз). Вот проще же не куда, если твоя команда состоит из определенного количества байтов и каждый байт (ну или пару байтов) означает сигнал на определенный пин. В вашем случае тоже можно обрабатывать просто массива байтов, мне кажется все эти библиотеки они просто лишние.

В первом же посте я писал о том, что приведенное решение не для микроконтроллеров, потому как места часто недостаточно. Больше смахивает на just-for-fun концепт.


Имхо, достаточно реализовать ответы на ping и небольшую обертку поверх js-библиотеки serialport чтобы получить более высокоуровневый итерфейс подписки на события connect, disconnect, data.


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

В первом же посте я писал о том, что приведенное решение не для микроконтроллеров, потому как места часто недостаточно. Больше смахивает на just-for-fun концепт.


Только что ответил в тот тред. Базовый вариант прошивки без JSON не так уж сильно требователен к месту. Вариант с JSON жручий, да (думаю посмотреть еще другие варианты парсеров), но в мои контроллеры умещается и работает. В любом случае, я думаю, что ради единообразия кодовой базы и удобства разработки иногда можно пожертвовать местом на контроллере. Если требования проекта не позволяют, то, да, стоит подыскать другое решение.

Имхо, достаточно реализовать ответы на ping и небольшую обертку поверх js-библиотеки serialport чтобы получить более высокоуровневый итерфейс подписки на события connect, disconnect, data.


Ну, у меня, собственно, так и сделано

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


Да, для примера с лампочкой следует добавить еще одну команду ledstatus.

Помимо всего прочего уже придумано множество протоколов, в частности можно обратить внимание на безпроводной MQTT, который горантирует доставку пакетов, и Firmata, который как раз создан чтобы связываться с девайсом по Serial (есть поддержка кучи языков, включая JavaScript).

Фирмата зеркалирует внутренний API ардуины во внешний мир (яваскрипт). По крайней мере, судя по их документации, это основная задача библиотеки. Мне этот подход не очень нравится, т.к. в этом случае бизнес-логика и алгоритмы должны полностью выполняться на клиенте, а платка только дает транзитный доступ к подключенным к ней железякам. Мне больше нравится вариант, когда робот живет относительно автономно, сам внутри себя выполняет алгоритмы, может быть, принимает какие-то решения, а внешний клиент по мере необходимости только присылает ему обобщенные задачи («иди туда», «делай то-то») и опрашивает статус («уже пришел?», «еще не сделал?»).
Поставил, запускаю ./babbler-serial.sh, а там никаких кнопок, пустое окно. ЧЯДНТ?

image
попробуйте открыть панель разработки View > Toggle Developer Tools, там будет вкладка Console и скорее всего сообщение о какой-нибудь ошибке
Да, действительно, module.js:440 Uncaught Error: Cannot find module 'react/lib/EventPluginHub'
Буду разбираться…
у меня этот файл на месте, скорее всего по какой-то причине не докачались модули во время npm install (разрыв соединения или закончилось место?). Я бы попробовал проверить доступное место на диске, удалить папку node_modules и выполнить npm install еще раз.
Не понимаю я этого электрона. И вроде бы завязан на веб разработке, но когда стояла задача сделать небольшое приложение для работы с com портом и передачей данных через websocket, для меня проще оказалось открыть visual studio и написать его на c# и winforms, и это учитывая что опыта не было вообще, разве что немного в visual basic.
Не работает.

Warning: Accessing PropTypes via the main React package is deprecated.

module.js:440 Uncaught Error: Cannot find module 'babbler-js-material-ui/lib/BabblerConnectionStatusIcon'
Проверил в чистой папочке

git clone https://github.com/1i7/babbler-js-demo.git
cd babbler-js-demo/babbler-serial-react
npm install
./babbler-serial.sh


Всё установилось, запустилось, подключилось.

В консольке View->Developer tools->Console появился красный ворнинг

/home/xxx/babbler-js-demo/babbler-serial-react/node_modules/fbjs/lib/warning.js:36 Warning: BabblerConnectionStatusIcon: React.createClass is deprecated and will be removed in version 16. Use plain JavaScript classes instead. If you're not yet ready to migrate, create-react-class is available on npm as a drop-in replacement.


Но он пока работе не мешает.

module.js:440 Uncaught Error: Cannot find module 'babbler-js-material-ui/lib/BabblerConnectionStatusIcon'


Это виджет с иконкой статуса и прогресса подключения, он находится внутри пакета babbler-js-material-ui:

npm install babbler-js-material-ui


но он в зависимостях демо-проекта прописан, должен был установиться вместе с первым «npm install»

Сам файл вот — на месте:
https://github.com/1i7/babbler-js-material-ui/blob/master/src/BabblerConnectionStatusIcon.js
Да, ворнинг Accessing PropTypes тоже имеется

/home/xxx/babbler-js-demo/babbler-serial-react/node_modules/fbjs/lib/warning.js:36 Warning: Accessing PropTypes via the main React package is deprecated. Use the prop-types package from npm instead.


не успеваю я за прогрессом этих библиотек, но работать он все равно не мешает.
И да, чтобы два раза не вставать, добавил в очередную версию API для удобного опроса (поллинга) выбранных свойств — «приклеенные свойства»:

https://github.com/1i7/babbler-js/releases/tag/v0.6.0

будет запрошено один раз при подключении

    babbler.stickProp("name", "name", []);
    babbler.stickProp("manufacturer", "manufacturer", []);


будут постоянно опрашиваться 2 раза в секунду (каждые 500 миллисекунд)

    babbler.stickProp("name", "name", [], 500);
    babbler.stickProp("manufacturer", "manufacturer", [], 500);


Получить значение «приклеенного» свойства:

    babbler.getStickedProp("name").val


если при последнем запросе свойства произошла ошибка:
    babbler.getStickedProp("name").err


Глобальное событие при изменении значения свойства:

babbler.on('manufacturer', function(prop_name, err, val) {
    //...
}


В случае с лампочкой нужно в прошивку добавить команду ledstatus, а потом «приклеить» ее в виде свойства. В таком случае смайлик на главном экране будет обновляться не только при нажатии кнопок, но и при ручном вызове команд ledon/ledoff из экрана отладки (уже реализовано в последней версии демо-проекта — мастер и ветка 0.6.0).
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории