# Работа с учебными наборами IoT от Unwired Devices ## Предисловие Вузы-участники программы [IT Академия Samsung](https://myitacademy.ru) в 2017 - 2018 гг. для изучения технологий интернета вещей комплектовались учебными наборами отечественного производства. Выпускала их компании ["ООО "Беспроводные технологии"](https://www.unwireddevices.com/) ([Unwired Devices](https://www.unwireddevices.com/)). Эти наборы обладают рядом плюсов: - низкая стоимость; - интегрированный модуль: микроконтроллер + модуль связи LoRa; - есть готовый стек LoRaWAN и драйверы для внешних устройств. К сожалению, они больше не выпускаются, и вузы-участники программы IT Академия Samsung постепенно переходят на новые учебные комплекты, работа с которыми и описывается в системе обучения [myitacademy.ru/edu](https://myitacademy.ru/edu/). И так как это достаточно длительный процесс, связанный с финансированием, организацией тендера на закупку и прочими организационными вопросами, мы в этом учебном году вынуждены адаптировать курс "Интернет вещей" для использования с имеющимся в нашем распоряжении оборудованием. ## Unwired Devices Kit Учебные наборы от [Unwired Devices](https://www.unwireddevices.com/) содержат достаточно большой набор компонентов, но нас в первую очередь будут интересовать два: * радиомодуль Unwired Range (UNWR); ![unwr](/assets/images/iot-academy/unwr.png) * плата-адаптер (UMDK-RF). ![umdk-rf107](/assets/images/iot-academy/umdk-rf107.png) Радиомодуль Unwired Range (подписан на плате как UNWR) содержит в себе микроконтроллер STM32 и приемопередатчик LoRa, и, таким образом, сам по себе является минимальным конечным устройством "Интернета вещей". К плате-адаптеру UMDK-RF можно подключать различные радиомодули (например, тот же UNWR). Разъём для них расположен снизу. А также различные датчики и исполнительные устройства (разъемы сверху). Помимо этого, на этой плате находятся: * зеленый светодиоды **D4** * красный светодиоды **D5** * кнопка **BOOT/POWER** * кнопка **RESET** * кнопка **SAFE** Для включения модуля UMDK-RF (v1.07) достаточно подать на него питание через расположенный на плате разъем micro-USB. Если после подключения кабеля USB загорается зелёный светодиод **D4**, модуль работает в штатном режиме. Управление модулем: * короткое нажатие на кнопку **BOOT/POWER** — включение/выключение питания; * длинное нажатие (более 2 секунд) — ввод радио-модуля в режим программирования по UART; * кнопка **SAFE** подключена к порту `PB_1`, и может использоваться в программах аналогично `USER_BUTTON`. Световая индикация: * медленное мигание зелёного светодиода — радио-модуль в режиме программирования по UART; * быстрое мигание зеленого светодиода — короткое замыкание на выходе 5 В; * мигание красного — активность модуля. Кроме того, на плате радиомодуля UNWR расположен красный светодиод, подключенный к порту `PB_0`, который можно использовать аналогично `LED1`. Мы не планируем сейчас использовать модуль связи LoRa - нам нужен на первых порах только микроконтроллер серии STM32. Тем не менее, посмотрите [документацию](https://unwireddevices.com/docs/) на этот набор оборудования, возможно, некоторые задачи в этом учебном году мы заменим аналогичными прошлых лет. Итак, соедините радиомодуль UNWR и плату-адаптер UMDK-RF. Обратите внимание, что у платы UNWR микросхемы должны быть направлены вниз. <div class="danger"> Аккуратно обращайтесь с антенной, она может сломаться.<br /> Не менее важно правильно обращаться с линейками штырьков, соединяющими платы между собой: они тонкие, и их легко погнуть. </div> У нас должна получиться такая конструкция: ![ud-min](/assets/images/iot-academy/ud-min.png) Теперь аппаратная часть у нас готова для начала работы! ## Компиляция и загрузка программы Современная редакция программы "Интернет вещей" IT Академии Samsung ориентирована на использование встраиваемой операционной системы [Mbed](https://mbed.com/). Надеюсь, вы уже ознакомились с описанием лабораторного практикума на сайте [myitacademy.ru](https://myitacademy.ru/edu/mod/book/view.php?id=72), но скорее-всего у вас ничего не получилось - плат Unwired Devices в списке поддерживаемого оборудования нет. Всё дело в том, что платы Unwired Devices - это весьма ограниченная серия, и разработчики [Mbed](https://mbed.com/) совершенно ничего о них не знают. Однако, внутреннее устройство [Mbed](https://mbed.com/) позволяет использовать "похожую" плату, но некоторые "фишки" работы с Mbed, увы, будут недоступны. Итак, основу платы Unwired Range составляет микроконтроллер [stm32l151cc](https://www.st.com/en/microcontrollers-microprocessors/stm32l151cc.html). С точно таким же микроконтроллером есть поддерживаемая Mbed плата - [MultiTech xDot](https://os.mbed.com/platforms/MTS-xDot-L151CC/). ![xDot](/assets/images/iot-academy/xDot.png) Поддержка этой платы появилась, начиная с версии **5.9** Mbed. Конечно, [MultiTech xDot](https://os.mbed.com/platforms/MTS-xDot-L151CC/) отличается от нашего набора оборудования, но так как микроконтроллер в ней установлен такой же, то на первых порах мы будем писать программы как бы для платы [MultiTech xDot](https://os.mbed.com/platforms/MTS-xDot-L151CC/), но запускать на [Unwired Range](https://www.unwireddevices.com/docs/). ### Компиляция программы на сайте Mbed для Unwired Devices Работа с Mbed достаточно подробно расписана в основной ветке [курса](https://myitacademy.ru/edu/mod/book/view.php?id=72&chapterid=91). Мы должны: * Зарегистрироваться (или войти) на [mbed.com](https://mbed.com/) * Выбрать пункт [**Compiler**](https://os.mbed.com/ide/) * Создать новую программу Программу сделаем также изначально пустой (как это рекомендовано в [основной ветке курса](https://myitacademy.ru/edu/mod/book/view.php?id=72&chapterid=91)), но вот содержимое будет несколько отличаться: ```cpp #include "mbed.h" DigitalOut led(PB_0); int main() { Serial pc(PA_9, PA_10); int i = 0; pc.printf("Hello World !\n"); while(1) { wait_ms(1000); // 1 second led = !led; // Toggle LED pc.printf("This program runs since %d seconds.\n", i++); } } ``` В чём здесь отличия?! Во-первых, светодиод на плате Unwired Range подключен на порт `PB_0` микроконтроллера. Во-вторых, мы используем объект `pc` типа `Serial`, и вызываем функции ввода-вывода применительно к этому объекту, а не глобальные функции, то есть `pc.printf(...)` вместо `printf(...)`. Микроконтроллер не имеет дисплея, и весь вывод по последовательному каналу связи отправляется теперь в указанный порт, к которому мы сможем подключиться с компьютера и наблюдать передаваемые данные. В платах Unwired Range за такой вывод отвечают порты `PA_9` (сигнал Tx) и `PA_10` (сигнал Rx). Ну а дальше прямо цитата из нашего курса: > Остается скомпилировать программу и скачать готовую прошивку. Но прежде нужно выбрать правильный тип платы. Делаем аналогично, только выбираем плату [MultiTech xDot](https://os.mbed.com/platforms/MTS-xDot-L151CC/)! Конечно, сейчас программа не скомпилируется, даже если мы нажмем на кнопку **Compile**, - нам нужна библиотека. **Только библиотека нам нужна не та, что указана в курсе!** Помните, что поддержка платы [MultiTech xDot](https://os.mbed.com/platforms/MTS-xDot-L151CC/) появилась лишь в версии 5.9 операционной системы? Так вот просто библиотека `mbed` нам не подходит - это версия 2.x, так что нам нужна `mbed-os`, причем версии не менее чем 5.9. Поэтому нужно нажать правой кнопкой мыши на проекте и выбрать пункт **Import Library**, далее **From URL** (полагаться на "волшебника" мы не будем - мы и сами многое можем!) ![mbed_import_lib](/assets/images/iot-academy/mbed_import_lib.png) Далее укажем официальный адрес библиотеки [https://github.com/ARMmbed/mbed-os/](https://github.com/ARMmbed/mbed-os/). ![mbed_import_lib_mbed-os](/assets/images/iot-academy/mbed_import_lib_mbed-os.png) Результат должен быть такой же, как и написано в курсе - библиотека добавлена в проект и отображается шестеренкой. ![hello_mbed-os](/assets/images/iot-academy/hello_mbed-os.png) После чего можно уже скомпилировать и скачать программу (она окажется у вас в папке `Загрузки`). Как вы увидите в дальнейшем, не все примеры нам удастся скомпилировать с использованием библиотеки Mbed 6-й версии - она ещё очень нова, и содержит ряд багов. Поэтому иногда придется собирать прошивки с использованием более стабильной версии 5.x. Чтобы изменить версию (ревизию) какой-либо части программы необходимо выбрать соответствующий элемент в дереве проекта (в нашем случае - библиотеку `mbed-os`), и нажать на кнопку **Revison**: ![lib_revision](/assets/images/iot-academy/lib_revision.png) Выбираем по тегам нужную версию (например, 5.15.4), и в контекстном меню, вызываемом по нажатию правой кнопки мыши, выбираем пункт **Switch working copy to this revision**. ![mbed_switch_revision](/assets/images/iot-academy/mbed_switch_revision.png) После чего заново компилируем нашу программу. Полный список версий библиотеки `mbed-os` доступен в репозитории [https://github.com/ARMmbed/mbed-os/releases/](https://github.com/ARMmbed/mbed-os/releases/). ### Загрузка программы в плату Unwired Range Платы [STM32Nucleo](https://www.st.com/en/evaluation-tools/stm32-nucleo-boards.html), на основе которых в курсе рекомендуется выполнять лабораторные работы, в своем составе содержат программатор ST-Link/v2-1. Его назначение - загрузить программу в память микроконтроллера, и фактически в готовом изделии наличие аппаратного программатора - пустая трата денег на ненужные детали. Поэтому очень часто аппаратные программаторы для микроконтроллеров выпускаются отдельно. Например, тот же ST-Link/v2-1 может выглядеть так: ![st-link-v2-1](/assets/images/iot-academy/st-link-v2-1.png) Вообще можно использовать любой программатор, лишь бы он справлялся со своей задачей. Но в зависимости от аппаратных решений может применяться различная программная составляющая - чтобы использовать программатор, ему нужно как-то указать, что нужно сделать. В платах [STM32Nucleo](https://www.st.com/en/evaluation-tools/stm32-nucleo-boards.html) это делается достаточно легко - нужно всего лишь перетащить мышкой файл прошивки на виртуальный съемный диск, которым "прикидывается" программатор ST-Link/v2-1. В отладочной плате (или учебном наборе) без программатора не обойтись. Платы [MultiTech xDot](https://os.mbed.com/platforms/MTS-xDot-L151CC/) также в совем составе имеет программатор. И платы Unwired Devices имеют программатор. Собственно плата-адаптер UMDK-RF - это и есть прежде всего программатор. Вот только работать с таким программатором нужно совершенно иначе, чем с платой [STM32Nucleo](https://www.st.com/en/evaluation-tools/stm32-nucleo-boards.html). В нашей лаборатории скорее всего необходимые программы уже установлены, однако если вы работаете самостоятельно или на каком-то новом рабочем месте, то вам потребуется несколько утилит, которые нужно установить на ПК под управлением операционной системы Linux (мы используем Ubuntu 18.04). Запустите терминал (можно просто нажать сочетание клавиш **Ctr+Alt+T**) и введите: ```bash sudo apt update ``` Тем самым вы обновите списки доступных для установки пакетов и установите самые актуальные их версии. Собственно установим необходимое нам программное обеспечение (предполагается что все последующие действия вы делаете в **том же самом терминале**): ```bash sudo apt install python3 python3-pip git mercurial libusb-1.0-0-dev cmake ``` Для прошивки микроконтроллеров STM32 в Linux используется утилита `stm32flash`. Она, конечно, доступна в репозитории, и может быть установлена при помощи `apt install`, однако стандартная версия не поддерживает работу с микроконтроллером [stm32l151cc](https://www.st.com/en/microcontrollers-microprocessors/stm32l151cc.html), поэтому `stm32flash` необходимо собрать из исходников, в которые внесены соответствующие правки. Перейдем в терминале в домашний каталог: ```bash cd ~ ``` и скачаем исходники: ```bash git clone https://github.com/unwireddevices/stm32flash ``` Переходим в скачанную папку: ```bash cd stm32flash ``` Запускаем процесс сборки: ```bash make ``` И устанавливаем получившуюся программу: ```bash sudo make install ``` Сразу обновим кэш информации о доступных версиях разделяемых библиотек, чтобы наша утилита работала корректно: ```bash sudo ldconfig ``` Исходники утилиты `stm32flash` более не нужны, и их можно удалить, чтобы они не занимали место: ```bash cd ~ rm -rf stm32flash ``` Теперь у нас все готово для прошивки нашего контроллера, и эти действия более повторять не придётся, в отличии от следующих - компилировать программы и загружать прошивки мы будем достаточно часто. Подключите плату-адаптер UMDK-RF с подключенным радиомодулем UNWR к компьютеру, используя micro-USB кабель. В современных Linux поддержка преобразователя USB-UART для этой платы встроена на уровне ядра, так что ничего дополнительно устанавливать не нужно - драйвера установятся автоматически. Но при первом подключении к компьютеру, светодиоды **D4** и **D5**, установленные на плате-адаптере UMDK-RF, возможно, будут часто мигать в процессе инициализации платы и установки драйверов. Как только плата "промигается", она готова к работе. Приведём последовательность действий, необходимых для загрузки прошивки из командной строки (терминала): 1. Подключить плату к компьютеру. 2. Если плата включена, коротким нажатием (мене 2 секунд) на кнопку **BOOT/POWER** выключить её. 3. Включить плату коротким нажатием (мене 2 секунд) на кнопку **BOOT/POWER**. 4. Как можно скорее длинным нажатием (более 2 секунд) на кнопку **BOOT/POWER** перевести плату в режим программирования (зеленый светодиод **D4** начнет мигать с равными интервалами). 5. Запустить в терминале команду: ```bash stm32flash -w ИМЯ_ФАЙЛА.bin /dev/ttyACM0 ``` Ключ `-w` указывает на то, что необходимо записать указанный файл с именем `ИМЯ_ФАЙЛА.bin`, а `/dev/ttyACM0` - это имя порта, под которым наша плата видится в Linux. 6. Длинным нажатием (более 2 секунд) на кнопку **BOOT/POWER** перевести плату в обычный режим работы (зеленый светодиод **D4** светится постоянно). #### Примечания - Собственно зачем выключать и снова включать плату (п.&nbsp;2 и п.&nbsp;3)? Скорее всего в нашем случае в этом нет необходимости. Однако, оригинальная прошивка для плат Unwired Range использует порты, через которые осуществляется её переключение в режим программирования, в своей работе. Поэтому перевести плату с такой прошивкой в режим программирования возможно только до того, как она полностью проинициализировалась. Если установлена какая-то другая прошивка, то лишний раз плату можно и не выключать, достаочно длинным нажатием на **BOOT/POWER** перевести плату в режим программирования. - При выполнении команды `stm32flash` вы можете столкнуться с сообщением **Отказано в доступе** (**Permission denied**). Тут либо добавьте `sudo` перед `stm32flash`, либо добавьте пользователя, от имени которого вы работаете, в группу `dialout` и разрешите всем пользователям этой группы читать и писать в порт (`/dev/ttyACM0`). - К `ИМЯ_ФАЙЛА.bin`, конечно же, можно добавить полный или относительный путь. Если он при этом будет содержать русские буквы или пробелы, то его нужно записывать в одинарных кавычках - апострофах. Пример успешной прошивки платы показан на рисунках: ![term-stm32flash_hello](/assets/images/iot-academy/term-stm32flash_hello.png) ![term-stm32flash_hello2](/assets/images/iot-academy/term-stm32flash_hello2.png) ## Что дальше? Таким образом, мы фактически выполнили [лабораторную работу 1.1](https://myitacademy.ru/edu/mod/book/view.php?id=72) на доступном для нас оборудовании. Соответственно, задача сведена к известной, и можно приступать к выполнению очередных частей практикума, модифицируя предлагаемые примеры самостоятельно. [**^ К оглавлению**](iot/samsung/archive/2020) <link rel="stylesheet" href="assets/css/danger.css" />