Вы просматриваете архивную страницу сайта. Информация на этой странице может быть устаревшей.
# Работа с учебными наборами 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 микросхемы должны быть направлены вниз.
Аккуратно обращайтесь с антенной, она может сломаться.
Не менее важно правильно обращаться с линейками штырьков, соединяющими платы между собой: они тонкие, и их легко погнуть.
У нас должна получиться такая конструкция:
![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** светится постоянно).
#### Примечания
- Собственно зачем выключать и снова включать плату (п. 2 и п. 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)