image

Это статья для тех, кто прочитал предыдущие части — "Онлайн-конструктор умного дома" и "Онлайн конструктор веб-интерфейса для управления Raspberry Pi", и хотел бы управлять GPIO Raspberry Pi и подключённой к ней Arduino из одного интерфейса.

Суть заключается в том, что если у Вас есть Raspberry Pi и Arduino, тогда собрав интерфейсы для управления по сети из этой статьи и этой, Вы можете подключив Ардуину к Raspberry (по usb), объединить эти интерфейсы в один.

Проще говоря, Raspberry Pi будет подключена к интернету, и помимо выполнения штатных действий вы сможете управлять её GPIO (и давать другие команды) через web-интерфейс, и через тот же web-интерфейс можно будет управлять подключённой к ней Ардуиной.

Схема:

image
Ардуина подключена по usb к Raspberry Pi, та в свою очередь подключена к интернету через роутер, а клиенты подключаются по LAN и WIFI. Если будете заходить извне, то на роутере нужно пробросить порты.

Итак, Вы проделали всё что написано в предыдущих частях и создали два web-интерфейса (в первой части вам нужно скачать программу homestd для RaspberryPi). Выполнили все действия с файлами и у вас получились две папки mydom и mydomrp, которые Вы поместили на Raspberry в корень диска (/mydom и /mydomrp)…

Теперь давайте сделаем кнопку, которая будет переключать интерфейс c режима работы с Raspberry на работу с ардуиной (условно она будет главной). Откройте файл index.html из папки mydomrp, и где-то в районе 25-ой строки, после…

$(document).ready(function(){ 

function sendtoardu(){ slmode = 0; $.ajax({ type: "POST", url: comanda + cod_comand }); }
...

Пишем:

$('.knp0').click(function(){ var url = "http://192.168.5.146:82/"; $(location).attr('href',url); });

То есть получится вот так:

$(document).ready(function(){ 

function sendtoardu(){ slmode = 0; $.ajax({ type: "POST", url: comanda + cod_comand }); }

$('.knp0').click(function(){ var url = "http://192.168.5.146:82/"; $(location).attr('href',url); });
...

Где адрес (192.168.5.146) — это адрес Raspberry.
82 — это порт, который вы будете вписывать в параметрах программы homestd. (sudo /mydom/homestd /dev/ttyUSB0 57600 82 /mydom/ 0)


Ближе к концу файла, сразу после тега body, нужно вписать строчку:

<div class='knpvid knp0'  title='1' >Raspberry ? Arduino</div><br >

Должно получится так:

...
</script>
</head>

<body>

<div class='knpvid knp0'  title='1' >Raspberry ? Arduino</div><br >
...

Мы сделали кнопку переключающую интерфейс на работу с ардуиной.

Теперь наоборот, сделаем кнопку, которая будет переключать интерфейс c режима работы с Arduino на работу с Raspberry.

Откройте файл index.html из папки mydom, и там же, в районе 25-ой строки, после:

$(document).ready(function(){ 

function sendtoardu(){ slmode = 0; $.ajax({ type: "POST", url: comanda + cod_comand }); }
...

Пишем:

$('.knp0').click(function(){ var url = "http://192.168.5.146/"; $(location).attr('href',url); });

То есть получится вот так:

$(document).ready(function(){ 

function sendtoardu(){ slmode = 0; $.ajax({ type: "POST", url: comanda + cod_comand }); }

$('.knp0').click(function(){ var url = "http://192.168.5.146/"; $(location).attr('href',url); });
...

Адрес указываем тот же, а порт писать не надо, программа homestdrp, будет работать на стандартном (80) порту. Если он конечно не занят чем-либо.

В параметрах программы homestdrp, будете вписывать 80-ый порт. (sudo /mydomrp/homestdrp 80 /mydomrp/ 6)

И так же, ближе к концу файла, сразу после тега body, нужно вписать строчку:

<div class='knpvid knp0'  title='1' >Arduino ? Raspberry</div><br >

Должно получится так:

...
</script>
</head>

<body>

<div class='knpvid knp0'  title='1' >Arduino ? Raspberry</div><br >
...

Теперь мы сделали кнопку переключающая интерфейс на работу с Raspberry.

И последнее, запускаем сервера для Rasberry и Ардуины. На всякий случай делаем исполняемыми программы и скрипт:

sudo chmod +x /mydom/homestd
sudo chmod +x /mydomrp/homestdrp
sudo chmod +x /mydomrp/init.sh

Запускаем homestdrp

sudo /mydomrp/homestdrp 80  /mydomrp/ 6

Открываем ещё один терминал и запускаем homestd

sudo /mydom/homestd /dev/ttyUSB0 57600 82 /mydom/ 0

Для автоматизации, добавьте запуск программ в rc.local

nano /etc/rc.local

В конец файла, перед exit 0 впишите пару строк:

...
(/mydomrp/homestdrp 80  /mydomrp/ 6)&
(/mydom/homestd /dev/ttyUSB0 57600 82 /mydom/ 0)&

exit 0

Очерёдность запуска программ не имеет значения.

Осталось открыть в браузере адрес Raspberry…

image

Нажатие на верхнюю кнопку переведёт на Ардуину…

image
После внесения изменений в index.html обязательно обновите страничку в браузере.

Ну и под «занавес» небольшое видео о том, это как работает.

Поделиться с друзьями
-->

Комментарии (29)


  1. abstracto
    06.11.2016 13:18
    +5

    троллейбус из буханки
    бывали такие идеи, только понятно, что проще просто всё прилепить pi без ардуино
    или если какой-то ардуиновский код трудно перенести на pi, то просто всё заменить на esp8266 (arduino клон на esp8266 за 3 бакса). увы, но время актуальности вашего решения давным давно ушло.


    1. stDistarik
      07.11.2016 00:05

      только понятно, что проще просто всё прилепить pi без ардуино

      Во-первых Вы не уточнили, кому проще? Если речь идёт о людях знакомых с питоном, то да, а не знакомым?
      Во-вторых, — допустим Вам нужно четыре-пять внешних прерываний, организуйте их на RPi.

      esp8266 — вещь капризная и доверия к ней нет.

      но время актуальности вашего решения давным давно ушло

      Отнюдь, интерес у людей только возрастает.


      1. alexpp
        07.11.2016 10:58

        esp8266 — вещь капризная и доверия к ней нет.

        А что с ней не так? Может вы просто не умеете её готовить?


        1. stDistarik
          07.11.2016 14:06
          +1

          Может быть. Я ковырялся с ней года полтора назад, и тогда было много нареканий в адрес прошивок. В частности у меня еспешка (со стоковой прошивкой) время от времени (скажем раз в 2-3 дня, иногда реже, иногда чаще) зависала или перегружалась сама, а иногда просто сервер отваливался, и всё это происходило без каких-либо видимых причин.

          Порекомендуйте прошивку, чтоб работала абсолютно надёжно и чтоб был UDP-сервер. И что можете сказать по поводу ESP32?


    1. Tirarex
      07.11.2016 00:05

      При этом весь веб интерфейс спокойно помещается прямо на esp8266, при желании можно даже web socets использовать для обновления состояния индикаторов на странице.


  1. Plone
    06.11.2016 13:45

    По моему опыту USB — крайне ненадежное подключение (я про весь программно-аппаратный комплекс, входящий в понятие «USB-подключение»).
    Когда оно «отвалится» — вопрос только времени.
    Завтра проснетесь, а /dev/ttyUSB0 в системе нет (или он уже /dev/ttyUSB1).

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

    Хотя, возможно, Ваш опыт будет более позитивным.


    1. kAIST
      06.11.2016 17:48

      У raspberry вполне себе стабильный USB, как по железу, так и по софту. По опыту, оно нормально работает сутками, например, с USB жестким диском + wi-fi донгл, да еще и с ethernet (который тоже через USB работает).
      Ну еще можно тот же МК подключить через UART, что проще и требует меньше ресурсов.


    1. stDistarik
      06.11.2016 23:02

      По моему опыту USB — крайне ненадежное подключение

      Скорее всего, Ваши трудности связаны с недостаточным питанием USB-устройств.


  1. odoveiz
    06.11.2016 22:51

    Возможно комментарий не по теме, но все же.
    Я на Raspberry Pi поднял бы сервер на Node.js и по протоколу Firmata общался с Arduino а управление в веб-интерфейсе сделал через WebSocket или EventSource.

    Я так себе давно делал, только вместо Raspberry Pi был нетбук а между WebSocket и EventSource выбрал первое.


    1. stDistarik
      06.11.2016 22:57

      Я так себе давно делал, только вместо Raspberry Pi был нетбук

      Изначально всё делалось для работы на роутере без доп. флешки, поэтому Node.js, PHP и т.д. отказать.


    1. stDistarik
      07.11.2016 01:23

      Нет ли у Вас опыта работы с WebSocket на СИ, а то я что-то буксую с этим.


      1. odoveiz
        07.11.2016 13:08

        Я не си программист)) Но не давно реализовал на esp8266 асинхронный сервер (Отдача статики и WebSocket), могу скинуть скетч ))


        1. stDistarik
          07.11.2016 13:44

          На чём он написан?


          1. odoveiz
            07.11.2016 13:58

            си


            1. stDistarik
              07.11.2016 14:08

              Покажите пожалуйста.


              1. odoveiz
                07.11.2016 14:12

                1. stDistarik
                  07.11.2016 14:22

                  Ну это сугубо для ESP. А в какой среде это в всё пишется, в ардуиновской?


                  1. odoveiz
                    07.11.2016 14:26

                    да


                    1. stDistarik
                      07.11.2016 14:37

                      А что можете сказать про безотказность, просто у меня плохое впечатление осталось после знакомства с ЕСП8266.


                      1. odoveiz
                        07.11.2016 14:38

                        У меня модель ESP-12E, работает месяц, сбоев не было.


                        1. stDistarik
                          07.11.2016 14:46

                          Я пользовал ESP-01 с «заводской» прошивкой, может в этом дело. А ардуиновская среда нужна специальная?


                          1. odoveiz
                            07.11.2016 14:49

                            Обычная Arduino IDE, по другому не пробовал.


  1. xut
    07.11.2016 01:32

    Зачем в этой схеме ардуина?


    1. stDistarik
      07.11.2016 14:16

      На тот случай если не хватает ног или прерывания нужны, да мало ли для чего. Например RPi в доме, а ардуина в гараже (подключена по RS-422).


  1. Vergileey
    07.11.2016 16:32

    Не очень понял необходимость использовать разные порты для работы с ардуино и RPI. Если веб-сервер и так развернут на распберри, то почему нельзя просто использовать один порт, а для определения «получателя» использовать разные метки? Тот же JSON отлично для этого подойдет.


    1. stDistarik
      07.11.2016 16:32

      Два сервера.


      1. Vergileey
        08.11.2016 13:47

        Я понимаю что серверов два, по одному для каждого порта.
        Если мы передаем сигналы на ардуино через USB соединение от RPI зачем нужна сложность с настройкой 2 серверов?
        Почему бы не использовать 1 веб-сервер и разделять меткой какому устройству должен уйти сигнал?


        1. stDistarik
          09.11.2016 15:48

          Почему бы не использовать 1 веб-сервер и разделять меткой какому устройству должен уйти сигнал

          Дело не в сервере, а в том, что тогда бы пришлось писать третий конструктор.


  1. Ungla
    11.11.2016 14:45

    Предлагаю ознакомиться с homeassistant.io