company_banner

Создаем собственный GPS-Трекер на технологии LoRa

Original author: Yves Debeer
  • Translation
  • Tutorial


В этой статье вы узнаете, как создать собственный GPS-трекер с помощью микроконтроллеров Pycom LoPy, а также научитесь настраивать одноканальный LoRa Nano-Gateway.
Здесь я изложу ключевые этапы со всеми необходимыми ссылками.

Если вас интересуют подробное руководство и пояснения, то можете посмотреть видео запись моего выступления на технологическом подкасте IBM Developer Europe Crowdcast.

Начнем с общей схемы архитектуры, на которой показаны все компоненты, участвующие в процессе настройки трекера.

Узел LoPy служит в качестве GPS-устройства, отправляющего данные на LoRa Nano-Gateway.

Сам шлюз LoRa подключен к ‘TheThingsNetwork’ по WiFi.

В конечном итоге мы получим Node-RED, выполняющийся в IBM Cloud, который будет принимать MQTT сообщения от TheThingsNetwork, сохранять их в базе данных Cloudant и отображать точки GPS-данных на карте.

Оборудование:


  • 1 LoPy в качестве узла LoRa + антенна (868MHz/915MHz) + аккумулятор 3.7V LiPo;
  • Последовательный GPS-модуль 1 uBlox NMEA с антенной;
  • 1 LoPy в качестве LoRa Nano-Gateway + антенна (868MHz/915MHz);
  • 2 платы расширения Pycom.

Ссылки на используемое оборудование здесь: pycom.io/products/hardware

Программная часть:


Для программирования микроконтроллеров LoPy мы будем использовать Pymakr – плагин для редакторов Atom и VS Code.

LoPy от Pycom.io – это мульти-сетевой аппаратный модуль на базе микроконтроллера ESP32. Большинство из используемых в нем функций и библиотек собраны на MicroPython.

1. Настройка LoRaWAN Nano Gateway и подключение к TheThingsNetwork


Исходный код для LoRaWAN Nano-Gateway ждет вас здесь.

Распакуйте скачанный файл, после чего найдите каталог lorawan-nano-gateway в директории examples.

Все подробности по настройке Nano-Gateway изложены в следующей ссылке.

Следуя этому руководству, вы определите шлюз в TheThingsNetwork, настроите параметры конфигурации в соответствии с вашим регионом, загрузите код на плату и убедитесь в ее работоспособности через консоль TheThingsNetwork.

Создайте бесплатный аккаунт в TheThingsNetwork – он послужит вам точкой регистрации для шлюза и точкой получения пакетов данных, которые мы будем отправлять с LoRa-узла нашего GPS-трекера.

2. Настройка LoRa-узла с GPS-трекером


Приступаем к работе с The Things Network:
core-electronics.com.au/tutorials/pycom/getting-started-on-the-things-network-tutorial.html

Следуйте инструкциям TheThingsNetwork для регистрации и активации вашего устройства LoPy.

Есть два способа активации LoPy: либо через OTAA (активация «по воздуху»), либо ABP (активация путем персонализации). Первый вариант считается предпочтительным, если вы используете несколько устройств, но не подойдет для работы с LoRa Nano-Gateway.

Следующий образец кода использует активацию ABP и после установки LoRa-соединения отправляет 10 байт в виде 10 отдельных пакетов.

1 from network import LoRa
2 import binascii
3 import struct
4 lora = LoRa(mode=LoRa.LORAWAN)
5 dev_addr = struct.unpack(">l", binascii.unhexlify('XXXXXXX'))[0]
6 nwk_swkey = binascii.unhexlify('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
7 app_swkey = binascii.unhexlify('XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX')
8 # удаляем все каналы кроме предустановленных
9 for i in range(3, 16):
10       lora.remove_channel(i)
11 # настраиваем 3 предустановленных канала на одну частоту
12 lora.add_channel(0, frequency=config.LORA_FREQUENCY, dr_min=0, dr_max=5)
13 lora.add_channel(1, frequency=config.LORA_FREQUENCY, dr_min=0, dr_max=5)
14 lora.add_channel(2, frequency=config.LORA_FREQUENCY, dr_min=0, dr_max=5)
15 # подключаемся к сети с помощью ABP 
16 lora.join(activation=LoRa.ABP, auth=(dev_addr, nwk_swkey, app_swkey))
17 # создаем сокет LoRa
18 s = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
19 # устанавливаем скорость обмена данными LoRaWAN
20 s.setsockopt(socket.SOL_LORA, socket.SO_DR, config.LORA_NODE_DR)
21 # делаем сокет неблокирующимся
22 s.setblocking(False)
23 for i in range (10):
24    pkt = b'PKT #' + bytes([i])
25    print('Sending:', pkt)
26    s.send(pkt)
27    time.sleep(4)
28    rx, port = s.recvfrom(256)
29    if rx:
30        print('Received: {}, on port: {}'.format(rx, port))
31    time.sleep(6)

Теперь узел LoRa настроен, и мы должны увидеть поступающие пакеты как через консоль Nano-Gateway, так и в консоли TheThingsNetwork.

Далее мы можем добавить код для считывания фиксированных данных о местоположении GPS.
Образец этого кода лежит здесь.

В данном примере мы используем библиотеку ‘adafruit_gps’ и отправляем пакет данных только, когда устанавливаем фиксированное местоположение GPS.

Это, конечно, здорово, но все полученные нами данные в байтах. Как же их перевести в доступный для использования формат? Конечно же декодировать.

Направляйтесь в консоль TheThingsNetwork и выберите ваше приложение, в котором перейдите во вкладку Payload Formats и определите декодер, не забыв также сохранить его.

1 function Decoder(bytes, port) { 
2   console.log(bytes)
3   return {
4       GPSCoordinates: String.fromCharCode.apply(null, bytes)
5   };
6 }

Теперь, когда наш GPS-трекер подключен через LoRaWAN, перейдем к самому интересному, а именно настроим сохранение в БД и начнем показывать данные на карте.

Этот процесс я привык реализовывать в среде IBM Cloud при помощи Node-RED.
Здесь можно быстро и легко зарегистрировать бесплатный Lite-аккаунт.

По умолчанию потоки Node-RED сохраняются в БД Cloudant, поэтому можно без проблем использовать эту же БД для сохранения наших GPS-данных.

Образец потока Node-RED находится здесь.

GPS-данные через MQTT собираются с TheThingsNetwork и сохраняются в Cloudant.

Для получения этих данных вам потребуется создать/сгенерировать новый ключ доступа. Снова направляйтесь в консоль TheThingsNetwork и выберите свое приложение, перейдите во вкладку settings и найдите среди прочих настроек access keys. Сгенерированный ключ будет находиться в нижней части страницы окна просмотра приложения.

Более подробное о взаимодействии MQTT с ‘TheThingsNetwork’ рассказано здесь.

Заключение


Эта статья поможет вам лучше ознакомиться с основами использования Интернета Вещей (IoT) при помощи LoRa-соединения.

Если вам не терпится увидеть все это в действии, то еще раз напомню про свое выступление на технологическом подкасте IBM Developer Europe Crowdcast.

В этом видео я также показываю, как подключить LoRa GPS-трекер к публичному бельгийскому провайдеру этой технологии – Proximus.

А какие еще, на ваш взгляд, есть варианты применения LoRa для Интернета Вещей?



RUVDS.com
VDS/VPS-хостинг. Скидка 10% по коду HABR

Comments 27

    +8
    Увы, статья о том, как не надо. А перевод о том, как дважды не надо.

    Nano-gateway — это даже не LoRaWAN для бедных. Это просто не LoRaWAN, и даже не для нищих. Лет пять назад в этом был хотя бы экономический смысл, поэтому TTN этот вариант и поддержали, скрепя сердце. Но сейчас и экономического смысла нет. Тот комплект, что в статье, обойдется где-то в восемьдесят евро, или чуть больше. Сто долларов. За эти деньги сейчас можно полноценный восьмиканальный наколеночный гейтвей собрать. Ну, может, чуть дороже. За 120. Но полноценный :-) Так что так, как в статье, делать не надо. Вы не с LoRaWAN познакомитесь, а непонятно, с чем.

    Ну и в коде выставляется для всех каналов частота config.LORA_FREQUENCY, а это по умолчанию 868,1 Мгц. В Европе так и должно быть, а вот в России это административка. Не надо так делать. Теоретически, вдумчивый читатель должен это заметить при настройке гейтвея. Если пройдет по ссылке и почитает инструкцию, которая куда объемнее, чем сама статья, и обратит внимание на комментарии в коде. Но это маловероятно, это ж как бы для новичков все. Подправьте, что ли, перевод.

    В общем, при всем уважении, не спасибо вам ни разу. Путаете только людей, будто они сами не справляются.

    P.S. И не кивайте на IBM, где автор работает специалистом по рерайтингу AKA developer advocate :-)
      0
      Еще хочу добавить, что TTN, несмотря на заявления о поддержке RU864, нормально этот частотный план не поддерживает, и частота для RX2 там почему-то берется из EU868 — также чреватая приходом Роскомнадзора, причем не в юмористическом смысле.

      image
      +2

      Местную навигационную систему без GPS кто нибудь здесь разрабатывал на хабре? Ну скажем на квадрате 100 на 100 метров или 1 км на 1 км? И как у него получилось? С какой точностью позицианировалось? 1 см делала сетку?

        +2

        Кто-то делал подводную навигацию ультразвуком, тут.


        А зачем конкретно интересуетесь? Если дружите с электротехникой, гиперболическая навигационная система довольно проста в исполнении (компаратор фаз сделать и готово), хотя до 1 см не уверен что можно дойти, но интуиция подсказывает, что играясь с модуляциями, в целом можно.


        Я делал на БИНС + стереокамера + фильтр Калмана, но уход, ожидаемо, достаточно большой получается. Впрочем, для своей задачи хватило.

          +1

          Прект сельхоз обработки почвы роботом.
          Спасибо за ссылку. Наверное гираскопы нужны будут на колёсную технику. Надо думать, смотреть, обсуждать.

            0

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


            Несмотря на то, что гиперболические НС простые до нельзя (вам нужно три (или больше) излучателя постоянной частоты с сферической направленностью, частотный компаратор и пусть будет ардуинка чтобы их сравнивать + супер примитивное ПО, которое просто будет сравнивать уровень сигнала и решать СЛАУ из трех уравнений), я бы не стал идти таким путем если бы не нашел готовых коммерческих решений потому что можно получить множество веселья от своего велосипеда.


            Но с другой стороны мне очень сложно представить ситуацию в которой комбайну нужно знать свою позицию с СКО в пару сантиметров.


            Еще я должен предупредить о такой штуке как дифференциальный GPS (differential GPS), но, насколько я понимаю, это невероятно дорого.


            А вот реально посоветовать я могу установку из обычного GPS + GLONAS (многоканальный приемник желательно), БИНС с компасом, что-то для точной навигации в гараже и, возможно, камеры.


            GPS должно в целом хватать для поля. БИНС стоит копейки, но может сильно помочь входить в поворот по заданной траектории. Компас нужен для определения курса. Я бы добавил еще камеру с которой определял угол поворота (в довесок к ДУС (часть БИНС)). Все это можно скормить в фильтр Калмана, во время простоя на месте техника может уточнить свои координаты путем накопления показаний GPS до субметровых, заодно "запомнив" модель помех для GPS в данной конкретно точке. В общем было бы желание — можно получить достаточно неплохие результаты.


            Если погрешности в метр по какой-то причине недопустимы, можно привлекать машинное зрение, благо задача в данном случае достаточно простая и опять же, решается на готовых компонентах.


            Для маневрирования рядом с друг другом или в гараже уже можно использовать опять же заводские решения для ближней навигации, да хоть чертовы лидары из айфона достать :) (Хорошо, кинекты развесить на комбайны, если заводские лидары слишком дорогие, но можно и более дешево обойтись ультразвуком).


            Оффтопик: такая интересная область, а я кнопочки на реакте перекрашиваю :(

              0
              Ну, я бы поставил один излучатель ультразвука. На само устройство. И в трех точках принимал сигнал. И с приличным разрешением часы в этих трех точках. И TDOA. Простите за краткость :-)

              Хотя сантиметров тут не будет.
                0

                Я предпологаю что точность позицианирования нужна около 1 см. Можно где-то уточнить это определённо. Камеры и лидары это во весь комплекс должны входить, хотя бы ради безопасности. Узнал образ похожий на человека – остановился, подумал и дальше по алгоритму. Пахать и идти по струнке, в межрядной обработке, точность нужна порядочная, чтоб всё красиво было и надёжно, и быстро, и качественно. Работать то тогда сутками можно будет и хоть тыщу однотипных машин запускай одновременно в эту систему. Только обслуживай их. Но вот навигация… Это самое важное и ответственное, как я понимаю...

                  0
                  > Еще я должен предупредить о такой штуке как дифференциальный GPS (differential GPS), но, насколько я понимаю, это невероятно дорого.

                  DGPS в целом не «невероятно дорогой», поддерживающие его приемники стоят не сильно дороже обычных:

                  www.chipdip.ru/product0/9000465505

                  Вот с софтом можно намучаться, он либо дорогой, либо это опенсорс вроде GpsTk или RTKLIB, для использования которого хорошо бы представлять все эти процессы хотя бы теоретически (а заодно бороться с особенностями конкретных приемников). Внешне все несложно, но есть нюансы: publications.lib.chalmers.se/records/fulltext/218271/218271.pdf
              +1

              Делал, правда пять лет назад. Тогда доступных технологий получить точность 1 см. не было. Из лучшего был Decawave, но они только заявляют 1 см., в реальности если постараться в 10-20 см. с трудом можно уложиться.

                0
                10-20 см — в архитектуре TDoA или TWR?
                  0

                  TWR, TDoA у них негуманно в те времена стоила. Сейчас может что-то и изменилось.

                    +1
                    А, вы имели в виду их софт/библиотеки?
                    Мы написали свой — используя только модули (железки) от них. А модули поддерживают любой из режимов — их только надо правильно сконфигурировать.
                      +1

                      Да. Поначалу мы использовали их софт, потом для TWR сделали свой. Тоже использовали только модули. Потом я сменил место работы, поэтому не знаю как там дальше дело было. Сам не успел глубоко в тему TDoA на decawave погрузиться.


                      Но, приятно осознавать, что у кого-то TDoA получилась на своём софте. У меня в те времена была абсолютная увернность, что это можно сделать.

                        0
                        А какая точность получилась? Если можно об этом говорить, конечно.
                          0
                          30-50 см. Нам нужно было где-то до метра, поэтому фокус был передвинут на оптимизацию установки и пропускной способности системы. Decawave хвастались что у них в пределах 10-15 см.
                  +1
                  Кстати, в чипах LoRa на 2,4 ГГц есть ranging engine. Хотя о сантиметрах там вроде речь не идет, и вообще неочевидно, что это прилично работает.
                    0

                    Как я себе представляю нужна АСУ с наподобие радиолокаторами и активным маячком на транспортном средстве. И запросов-ответов, с определением расстояния, раз 1000 в секунду надо будет делать. (Да, на скорости 25 км/час точность будет 0,7 см, на этой частоте опрашивания) Расстояние по углам наведения определять возможно по радио и лазерному лучу, и по отраженным сигналам.

                    0
                    Мы сделали — на UWB. Точность — где-то 30-50 см, больше не надо было. Зато были ограничения по стоимости, ресурсу батареи и размерам/обьему маячков и приемников.
                    +2

                    давно чешутся руки попробовать лору
                    правда совсем для других целей, в моём кейсе нужно собирать инфу с пачки датчиков подключенных к малине в гараже в километре от дома. хотелось бы конечно иметь ssh доступ но для этого судя по пьессе lora не совсем подходит

                      +1
                      Может и подойти. Только не надо LoRaWAN. P2P поверх LoRa многие делают, если заточить под наши реалии, то с гаражом связаться по ssh может и выйти вполне. Километр, во всяком случае, пробивается легко в прямой видимости и на скорости, достаточной для консоли. Другой вопрос, что за стенки и железки стоят на этом километре.
                        0

                        Видимость прямая, ничего нет что могло бы помешать
                        Хотел повешать пару юбиков локо которые на 2км бьют, но их сопрут быстро с крыши гаража
                        Лора была хорошей альтернативой, но врятли она выдаст хорошую скорость

                          0
                          Хорошую для чего? В консоли по ssh работать? Или видео гонять? Это разная хорошесть :-)

                          Хотя MJPEG с 1 FPS и невысоким качеством тоже потянуть должно. Вы же, пардон, не порно в HD снимать в гараже планируете, если вообще планируете что-то снимать? :-)
                            0

                            ну не прон в 4k
                            скорее чтобы была возможность файлик с инвентаризацией с домашнего компа дёрнуть, погуглить как открутить ту или инную подкапотную хрень..

                            0

                            Так может поискать что-нибудь с внешней антенной, чтобы не стырили?

                              0

                              направленные антены сами по себе стоят не мало..

                                0
                                Ну я бы попробовал известный вариант из консервной банки :-) Или еще какой самопал, из множества бесчисленного… Может и не выйти, но цена вопроса ж копейки.

                      Only users with full accounts can post comments. Log in, please.