Text
                    ТЕХНОЛОГИЯ В ДЕЙСТВИИ

Проекты IoT с
Arduino Nano 33
BLE Sense
Пошаговые проекты
для начинающих
Агус Курниаван
Агус Курниаван


Проекты Интернета вещей с Arduino Nano 33 BLE Sense Пошаговые проекты для начинающих Агус Курниаван
 Оглавление  Об авторе ��������������������������������������������������������������������������������.....vii   Глава 1: Настройка среды разработки ��������������������������1  Введение.���������������������������������������������������������������������������������������������������������2  Обзор платы Arduino Nano 33 BLE Sens������������������������������������������������......3  Установка среды разработки����������������������������������������������������������������.........4  Привет, Arduino: мигающий светодиод��������������������������������������������������������9  Использование веб-редактора Arduino������������������������������������������������������14  Создание аккаунта Arduino ��������������������������������������������������������������������.15  Установка подключаемого модуля Arduino �����������������������������������������16  Создание программы Arduino�����������������������������������������������������������������18 Резюме�������������������������������������������������������������������������������������������������������������.19   Глава 2: Разработка платы Arduino Nano 33 BLE Sense������21  Введение���������������������������������������������������������������������������������������������������������.22  Базовое программирование скетчей�������������������������������������������������������22  Основная программа ������������������������������������������������������������������������������22  Объявление переменных������������������������������������������������������������������������23  Операторы��������������������������������������������������������������������������������������������������29  Условное утверждение �����������������������������������������������������������������������������29  Зацикливание���������������������������������������������������������������������������������������������35  Прервать и продолжить ����������������������������������������������������������������������������39  Цифровой I/O �����������������������������������������������������������������������������������������������������42 iii
ОГЛАВЛЕНИЕ Аналоговый I/O�������������������������������������������������������������������������������������������������45  Построение графика аналогового датчика�����������������������������������������������48  Последовательная связь�������������������������������������������������������������������������������52  Широтно-импульсная модуляция��..............................................................53  Последовательный периферийный интерфейс ���������������������������������������58  Inter-Integrated Circuit (I2C) ������������������������������������������������������������������������62  Сканирование адреса I2C�����������������������������������������������������������������������65  Считывание адресов I2C на основе датчиков ������������������������������������69 Резюме�������������������������������������������������������������������������������������������������������������.74   Глава 3: Программирование датчиков �������������������������75  Введение���������������������������������������������������������������������������������������������������������76  Температура и относительная влажность������������������������������������������������78  Построение графика данных датчика �������������������������������������������������������81  Отображение данных датчика с помощью OLED-дисплея I2C �������������83  Подключение OLED-дисплея I2C ������������������������������������������������������������84  Проверка адреса I2C на OLED-дисплее I2C ���������������������������������������85  Установка библиотеки дисплея OLED I2C �������������������������������������������86  Тестирование OLED-дисплея I2C������������������������������������������������������������87  Отображение датчика температуры и влажности������������������������������89  IMU датчик��������������������������������������������������������������������������������������������������������94  Датчик давления���������������������������������������������������������������������������������������������97  Цифровой микрофон�����������������������������������������������������������������������������������100  Цифровой датчик приближения, окружающего света, RGB и жестов102  Датчик приближения �������������������������������������������������������������������������������103  Датчик цвета ����������������������������������������������������������������������������������������������105  Датчик жестов ��������������������������������������������������������������������������������������������107 Резюме�����������������������������������������������������������������������������������������������������������110 iv
ОГЛАВЛЕНИЕ   Глава 4: Bluetooth с низким энергопотреблением. �111  Введение�������������������������������������������������������������������������������������������������������111  Настройка Bluetooth с низким энергопотреблением�������������������������112  Демонстрация 1: Hello Arduino BLE���������������������������������������������������������113  Написание программы Sketch �����������������������������������������������������������113  Тестирование программы�������������������������������������������������������������������115  Демонстрация 2: Управление светодиодом с помощью BLE ������������120  Написание программы �������������������������������������������������������������������������120  Тестирование программы ��������������������������������������������������������������������124  Демонстрация 3: Мониторинг датчика в реальном времени ������������128  Написание программы �������������������������������������������������������������������������129  Тестирование �������������������������������������������������������������������������������������������132 Резюме�����������������������������������������������������������������������������������������������������������136   Глава 5: Встроенный искусственный интеллект 137  Введение�������������������������������������������������������������������������������������������������������137  Установка TensorFlow Lite �������������������������������������������������������������������������138  Демонстрация: встроенный искусственный интеллект ����������������������138  Классификация жестов �������������������������������������������������������������������������������141  Сбор набора данных������������������������������������������������������������������������������143 Построение модели���������������������������������������������������������������������������������147  Разработка классификатора ����������������������������������������������������������������154  Тестирование �������������������������������������������������������������������������������������������155   Резюме�����������������������������������������������������������������������������������������������������������156 v
Об авторе Агус Курниаван - лектор, консультант по информационным технологиям и автор. Он имеет 20-летний опыт работы в различных проектах по разработке программного и аппаратного обеспечения, в предоставлении материалов для тренингов и семинаров, а также в написании технических статей. 16 лет подряд он удостаивался награды Microsoft Most Valuable Professional (MVP).Агус - преподаватель и исследователь в области сетевых технологий и систем безопасности на факультете компьютерных наук Университета Индонезии, Индонезия. В настоящее время он защищает докторскую степень в области компьютерных наук в Свободном университете Берлина, Германия. С ним можно связаться в Twitter по адресу @ agusk2010. vii
ГЛАВА 1 Настройка среды разработки Arduino Nano 33 BLE Sense - решение для Интернета вещей (IoT) выполнять обнаружение и воздействие на физическую среду. Плата Arduino Nano 33 BLE Sense поставляется с модулем Bluetooth с низким энергопотреблением (BLE) и некоторыми встроенными датчиками, которые позволяют нам создавать сеть BLE на основе приложений IoT. В этой главе рассказывается, как настроить плату Arduino Nano 33 BLE Sense для разработки. В этой главе рассматриваются следующие темы: • Обзор платы Arduino Nano 33 BLE Sense • Настройка среды разработки • Создание программы для мигающих светодиодов • Использование веб-редактора Arduino 1
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ  Вступление Arduino Nano 33 BLE Sense - одна из платформ Интернета вещей от Arduino. На этой плате используется модуль nRF52840 с некоторыми встроенными датчиками. Модуль nRF52840 предоставляет сетевой стек BLE, который используется для связи с другими устройствами. Bluetooth - это компонент беспроводной персональной сети (WPAN), который позволяет устройствам обмениваться данными с другими устройствами на небольшом расстоянии. Плата Arduino Nano 33 BLE Sense предназначена для недорогих устройств IoT для решения ваших проблем с IoT. Arduino Nano 33 BLE Sense имеет компактные размеры 45 × 18 мм (длина × ширина), как вы можете видеть на рис. 1-1. Рис.1-1. Плата Arduino Nano 33 BLE Sense 2
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ  Обзор платы Arduino Nano 33 BLE Sense Arduino Nano 33 BLE Sense построен на базе nRF52840. На плате также есть радиомодуль на базе BLE. Этот модуль предназначен для передачи данных по Bluetooth. Подробные характеристики Arduino Nano 33 BLE Sense показаны в Таблице 1-1. Таб.1-1. Технические характеристики Arduino Nano 33 BLE Feature Notes M nrF52840 M M ateCC608a 3.3v 21v Ток на вывод I/O (предел) 15 мА 15 ma Тактовая частота 64 МГц 64 mhz Флэш-память процессора 1 mB (brF52840) Sram 256 KB N eeprom Digital i/o 14 pWm pins 1 Все цифровые выводы uart Spi I 1 1 8 (Пример 12-битного АЦП 200k) (продолжение) 3
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Таб. 1-1. (продолжение ) O Примечания A Функция Поскольку Arduino Nano 33 BLE Sense имеет некоторый цифровой и аналоговый ввод / вывод (I / O), мы расширяем возможности платы, подключая другие датчики или исполнительные механизмы. Мы также используем протоколы UART, последовательного периферийного интерфейса (SPI) и I2C для связи с другими устройствами. Из Таблицы 1-1 видно, что Arduino Nano 33 BLE Sense имеет некоторые внутренние сенсорные устройства, которые вы можете использовать для своих решений IoT. Мы исследуем эти сенсорные устройства далее в главе 3.Затем мы настраиваем Arduino Nano 33 BLE Sense на вашем компьютере, чтобы вы могли создавать программы для платы Arduino.  Настройка среды разработки Arduino предоставляет программу для создания программ для всех моделей плат Arduino. Это программа доступна для Windows, Linux и macOS, и его можно загрузить с https://www.arduino.cc/en/Main/Software. 4
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Процесс установки прост, следуя инструкциям по установке.из настройки Arduino. После завершения установки вы увидите меню приложения Arduino в главном меню вашей платформы ОС. Когда вы откроете приложение Arduino, вы увидите приложение экран, показанный на Рисунке 1-2. Скелетный код включен в диалоговое окно приложения. Ниже приведен шаблон кода. void setup() {    // поместите сюда свой установочный код, чтобы запустить его один раз: } void loop() {    // поместите сюда свой основной код, чтобы запускать его повторно: } Рис.1-2. Arduino software for Windows 5
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Программа Arduino принимает диалекты программных языков C / C ++. Мы можем поместить всю инициализацию данных в функцию setup (). Программа будет постоянно выполнять коды внутри цикла (). Для работы с платой Arduino Nano 33 BLE Sense нам необходимо настроить программу Arduino. Во-первых, добавьте платы Arduino nRF528x, чтобы программа Arduino распознало плату Arduino Nano 33 BLE Sense. В строке меню. Arduino щелкните Инструменты➤Плата➤Менеджер плат Откроется диалоговое окно Boards Manager, показанное на Рисунке 1-3. В раскрывающемся списке Тип выберите Все. Введите Arduino & Nano & 33 & BLE в соответствующее текстовое поле. Вы увидите в списке платы Arduino nRF528x. Нажмите «Установить», чтобы установить этот пакет, после того как вы проверите, подключен ли ваш компьютер к Интернету. Рис.1-3. Добавление поддерживаемых плат для Arduino Nano 33 BLE Sense 6
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Эта установка занимает несколько минут. После установки вы увидите плату Arduino Nano 33 BLE Sense на целевой плате. Вы можете проверить это, выбрав Tools ➤ Board ➤ Boards Manager в программе Arduino, чтобы просмотреть список ваших плат. На рисунке 1-4 показана плата Arduino Nano 33 BLE Sense в программе Arduino. Рис. 1-4. Список целевых плат для Arduino Затем подключите плату Arduino Nano 33 BLE Sense к компьютеру с помощью кабеля micro USB. После того, как он будет подключен, вы можете проверить свою плату с помощью Диспетчера устройств для Windows. На рисунке 1-5 показан мой Arduino Nano 33 BLE Sense в Windows 10. 7
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Рис.1-5. Обнаружена плата Arduino Nano 33 BLE Sense в диспетчере устройств в Windows 10 Если вы работаете в Linux, вы можете проверить Arduino Nano 33 BLE Sense с помощью этой команды терминала: $ ls /dev/ttyUSB* Вы увидите список подключенных устройств через USB. Arduino Nano 33 BLE Sense обычно определяется как / dev / ttyUSB0 или / dev / ttyUSB1. Для macOS вы можете ввести эту команду, чтобы проверить Arduino Nano 33 BLE Sense: $ ls /dev/cu* Вы должны увидеть USB-устройство на своем терминале. 8
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ  Hello Arduino: мигающий светодиод Теперь, когда вы подключили Arduino Nano 33 BLE Sense к компьютеру, вы можете начать писать программы для Arduino. Плата Arduino Nano 33 BLE Sense имеет встроенный светодиод, который прикреплен к цифровому выводу 13. В этом разделе мы создаем простой код мигающего LED. Сначала откройте программу Arduino и создайте программу из шаблона проекта. Щелкните Файл ➤ Примеры ➤ 01.Basics ➤ Blink. Это отобразит образцы программных кодов, показанные на рисунке 1-6. Рис.1-6. Код Blink программы Arduino 9
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Программный код записывается следующим образом. // инициализируем цифровой вывод LED_BUILTIN как выход. pinMode(LED_BUILTIN, OUTPUT);       void setup() { } // включаем светодиод (HIGH - уровень напряжения)     digitalWrite(LED_BUILTIN, HIGH);                              ждем секунду delay(1000); digitalWrite(LED_BUILTIN, LOW); выключаем светодиод (LOW - уровень напряжения)          // функция цикла запускается снова и снова навсегда loop() { // ждем секунду                            delay(1000); } Сохраните эту программу. Следующим шагом является компиляция и загрузка программы Arduino в Arduino Nano 33 BLE Sense. Щелкните значок Проверить, чтобы скомпилировать программу Arduino. Чтобы загрузить программу Arduino на плату, щелкните значок «Загрузить». Оба этих значка выделены на рисунке 1-7. 10
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Рис.1-7. Компиляция и прошивка программы Перед загрузкой программы вы можете выбрать Arduino Nano 33 BLE Sense. Выберите Tools ➤ Board ➤ Arduino nRF528x Boards (Mbed OS) ➤ Arduino Nano 33 BLE, как показано на рисунке 1-8. Также необходимо выбрать порт Arduino. Для этого выберите Инструменты ➤ Порт, а затем выберите свой COM-порт. Например, мой порт BLE Sense для Arduino Nano 33 - это COM4, как показано на рисунке 1-9. 11
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Рис. 1-8. Выбор платы Arduino Nano 33 BLE Sense Рис. 1-9. Выбор порта для платы Arduino 12
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ После загрузки этой программы Arduino в Arduino Nano 33 BLE Sense мы увидим мигающий светодиод на плате Arduino Nano 33 BLE Sense, как показано на рисунке 1-10. Рис.1-10. Мигающий светодиод на плате Arduino Nano 33 BLE Sense Как это работает? Плата Arduino Nano 33 BLE Sense имеет одинвстроенный светодиод на цифровом выводе 13. В нашей программе мы устанавливаем цифровой вывод 13 как цифровой выход с помощью pinMode (). Мы инициализируем эти данные в функции setup ().    void setup() { // инициализируем цифровой вывод LED_BUILTIN как выход. pinMode(LED_BUILTIN, OUTPUT);    } Программа Arduino определяет LED_BUILTIN для общего встроенного вывода светодиода. Мы можем установить пин в качестве режима вывода, задав значение OUTPUT. 13
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Теперь наша программа будет работать непрерывно с функцией loop (),периодически включая и выключая светодиод. Мы можем использовать digitalWrite ()для выполнения включения и выключения светодиода. Установите значение HIGH для включения светодиода. В противном случае мы можем выключить светодиод, отправив значение LOW в функцию digitalWrite (). Мы также установили задержку в 1000 мс с помощью функции delay ().                                 delay(1000);                               delay(1000); digitalWrite(LED_BUILTIN, LOW);  // turn the LED on (HIGH is the voltage level) // wait for a second // turn the LED off by making the voltage LOW // wait for a second     digitalWrite(LED_BUILTIN, HIGH);     void loop() { } Вы можете поэкспериментировать с этими настройками программы мигающего светодиода.  Использование веб-редактора Arduino Arduino предоставляет онлайн-редактор для создания программ Arduino. Преимущество этого онлайн-редактора в том, что вам не нужно готовить слишком много сред выполнения и инструментов. Вам нужен только браузер и подключение к Интернету. Вы можете получить доступ к веб-редактору Arduino в любом браузере, перейдя по адресу https://create.arduino.cc/editor. На рисунке 1-11 показана модель веб-редактора Arduino. Чтобы использовать веб-редактор Arduino, мы должны зарегистрироваться на портале Arduino для создания программ Arduino. 14
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Рис.1-11. Веб-редактор Arduino В этом разделе мы сосредоточимся на том, чтобы начать работу с веб-редактором Arduino, подготовив браузер и доступ в Интернет. Мы выполним эти задачи, чтобы завершить разработку Arduino с помощью онлайн-редактора: • Создайте аккаунт • Установите подключаемый модуль Arduino. • Создайте приложение мигания для Arduino Nano 33 BLE Sense. Создание аккаунта Arduino Чтобы использовать и создавать программы Arduino с помощью веб-редактора Arduino, мы должны создать аккаунт Arduino. Этот аккаунт аналогичен учетной записи, которая используется для покупки платы Arduino в магазине Arduino. 15
Вы можете начать регистрацию нового аккаунта Arduino, щелкнув значок меню в правом верхнем углу. Затем вы можете заполнить соответствующую информацию на этом портале. После завершения регистрации аккаунта мы можем создавать программы Arduino с помощью веб-редактора Arduino.  Установка подключаемого модуля Arduino Чтобы наш Arduino Nano 33 BLE Sense мог подключаться к веб-редактору Arduino, нам необходимо установить подключаемый модуль Arduino. Это обязательная задача для Windows. Плагин Arduino будет действовать как мост между местной платой Arduino Nano 33 BLE Sense и веб-редактором Arduino. ­ Сначала откройте браузер и перейдите кhttps://create.arduino.cc/getting- start / plugin / welcome. В результате появится экран, показанный на Рисунке 1-12. Рис.1-12. Установка плагина Arduino 16 ­ ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Щелкните "Пуск". После этого вы увидите экран, показанный на Рисунке 1-13. Нажмите кнопку «Загрузить», чтобы загрузить приложение подключаемого модуля Arduino. Рис.1-13. Скачивание плагина Arduino для Windows После загрузки плагина Arduino вы можете установить это приложение. Следуйте инструкциям по установке из установочного файла. Если установка подключаемого модуля Arduino завершена правильно, браузер обнаружит подключаемый модуль Arduino. Ваш веб-редактор, вероятно, на этом этапе не обнаруживает вашу Arduino Nano 33 BLE Sense. Вы можете игнорировать это и продолжать создавать программы Arduino с помощью веб-редактора Arduino. Далее мы создаем приложение Blink Arduino. 17
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ  Создание программы Arduino ­ ­ Веб-редактор Arduino имеет те же функции, что и настольная версия программного обеспечения Arduino. В веб-редакторе Arduino есть образцы проектов, и мы также можем добавить в проект библиотеки Arduino. В этом разделе мы создаем приложение Blink Arduino, как в предыдущем проекте. Начните с открытия браузера и перехода на https://create.arduino.cc/editor. Выберите «Примеры» в левом меню, затем щелкните вкладку «ВСТРОЕННЫЙ» и в разделе «01.BASICS» (6) выберите «Blink». Это показано на Рисунке 1-14. После того, как мы выберем образец проекта Blink, у нас будет программа мигания, показанная на Рисунке 1-15. Теперь мы можем скомпилировать и загрузить программу в Arduino Nano 33 BLE Sense. Выберите свою плату Arduino Nano 33 BLE Sense в раскрывающемся списке устройств. Щелкните значок «Подтвердить», а затем значок «Загрузить» слева от раскрывающегося списка. Он скомпилирует и загрузит программу Arduino на целевую плату. Рис.1-14. Создание нового проекта 18
ГЛАВА 1 СОЗДАНИЕ СРЕДЫ РАЗРАБОТКИ Рис.1-15. Загрузка программы в Arduino Nano 33 BLE Sensese Вы можете попробовать создать другой проект Arduino с помощью веб-редактора Arduino с примерами проектов из этого инструментария.  Резюме Вы научились настраивать среду разработки Arduino. Вы также установили программу Arduino в среду рабочего стола и создали простую программу Arduino, blink. Кроме того, вы рассмотрели использование веб-редактора Arduino для создания программ Arduino. Далее вы узнаете, как получить доступ к I/O Arduino Nano 33 BLE Sense. Мы также используем другие протоколы связи. 19
ГЛАВА 2 Плата разработки Nano 33 BLE Sense Arduino В этой главе рассказывается, как создавать программы Arduino Nano 33 BLE Sense с помощью Arduino Sketch. Это программа доступна для Windows, macOS и Linux. Мы также исследуем, как получить доступ к периферийным устройствам ввода-вывода на плате Arduino Nano 33 BLE Sense с помощью программ Arduino. В этой главе вы узнаете о следующих темах: • Как писать программы Arduino с помощью Sketch. • Как получить доступ к цифровому вводу / выводу (I/O). • Как получить доступ к аналоговому вводу / выводу (I/O). • Как построить график аналогового датчика. • Как построить последовательную связь. • Как получить доступ к широтно-импульсной модуляции (ШИМ). • Как получить доступ к последовательному периферийному интерфейсу (SPI). • Как сканировать I2C адрес. • Как читать датчики на базе I2C. 21
A ГЛАВА 2 В  ступление Мы можем сказать, что Arduino - это платформа, потому что компания Arduino предоставляет оборудование и программы. Для создания программ для плат Arduino Nano 33 BLE Sense мы можем использовать Arduino Sketch. Эта программа использует диалекты языка C / C ++. В этой главе рассказывается, как создавать программы для Arduino Nano 33 BLE Sense. Плата Arduino Nano 33 BLE Sense использует модуль Bluetooth для подключения к сети. Bluetooth - это часть WPAN, которая позволяет устройствам обмениваться данными с другими устройствами на небольшом расстоянии. Мы используем программн Arduino для создания программ Arduino. Этот инструмент использует программу Sketch. Она использует диалекты C ++. Обратимся к программированию в Sketch.  Основы программирования скетчей В этом разделе мы узнаем о языке программирования Sketch. Технически Sketch использует диалекты C ++, поэтому, если у вас есть опыт использования C ++, вы можете пропустить этот раздел.  Основная программа В программе Arduino есть основная программа для непрерывного выполнения задач. Когда мы создаем программу с использованием программы Arduino, у нас есть скелетные коды с двумя функциями: setup () и loop (). Подробный код показан здесь. void setup() {   // поместите сюда свой установочный код, чтобы запустить его один раз: } 22
ГЛАВА 2 ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO void loop() {    / /поместите сюда свой основной код, чтобы запускать его повторно: } В этом коде вы можете увидеть две функции: setup () и loop (). ВФункция setup () вызывается один раз при включении платы Arduino.Если мы поместим коды в функцию setup (), это означает, что наши коды будут выполняться один раз. В противном случае у нас есть функция loop (), которая вызывается непрерывно.Это базовая структура основной программы от Arduino.В этом разделе вы узнаете о программировании в Sketch по следующим темам. • Объявление переменных. • Создание условных утверждений. • Создание циклов • Работа с break и continue.  Объявление переменных Мы можем объявить переменную, используя следующий оператор. <data type> <variable name>; <тип данных> - это ключевое слово, которое Sketch заимствует из C ++. <тип данных> представляет, как определить наш тип данных для переменной. <имя переменной> - это имя переменной, которое мы будем вызывать и использовать в нашей программе. В таблице 2-1 представлен список значений <тип данных>, используемых в Sketch. 23
A ГЛАВА 2 Таб. 2-1. Типы данных в Sketch array float Void Bool int String() Boolean long unsigned char Byte short unsigned int Char size_t unsigned long Double string word Мы объявляем переменные с типами данных int и char следующим образом. int a; int b = 10; char c; char d = 'A'; Мы можем установить начальное значение при объявлении переменной. Например, мы устанавливаем int b = 10. Для этой демонстрации мы создаем проект для Arduino Nano 33 BLE Sense. Сначала откройте программу Arduino и перепишите эти коды. void setup() { int a = 10;   int b = 5;   // инициализируем последовательную связь Serial.begin(115200);      while (!Serial) { ;    }        int c = a + b; int d = a * b;       24
A // print Serial.print("C= "); Serial.println(c); Serial.print("d= "); Serial.println(d);                ГЛАВА 2 } void loop() { } На рисунке 2-1 показан этот код. Для печати сообщений используйте функцииSerial.print () и Serial.println (). Мы можем печатать сообщения с помощью Serial.print () без возврата каретки ("\ r \ n"). В противном случае мы можем печатать сообщения с возвратом каретки, используя Serial.println (). Рис.2-1. Объявление переменных 25
A ГЛАВА 2 Все напечатанные сообщения с последовательной библиотекой будут отображаться в последовательном канале связи. Затем сохраните эту программу, затем скомпилируйте и загрузите его на плату Arduino Nano 33 BLE Sense. Чтобы увидеть вывод программы по последовательному каналу связи, используйте инструмент Serial Monitor от Arduino. Чтобы получить к нему доступ, выберите Tools ➤ Serial Monitor, как показано на Рисунке 2-2. Рис. 2-2. Открытие инструмента Serial Monitor После запуска Serial Monitor вы можете увидеть вывод своей программы, как показано на Рис. 2-3. Выберите скорость передачи 115200 в нижней части консоли Serial Monitor. 26
A ГЛАВА 2 Рис. 2-3. Программный вывод на последовательный монитор ­ Если вы не видите выходное сообщение в консоли Serial Monitor, вы можете нажать кнопку сброса на плате Arduino Nano 33 BLE Sense. Вы можете найти эту кнопку рядом с разъемом micro USB, как показано на Рисунке 2-4. Рис. 2-4. Положение кнопки сброса на плате Arduino Nano 33 BLE Sense 27
A ГЛАВА 2 Как это работает? Эта программа работает только с функцией setup (). Мы объявляем две переменные, a и b. Затем мы присваиваем их значения. void setup() {   int a = 10; int b = 5;    Затем активируйте объект Serial, чтобы выполнить последовательную связь. Установите скорость передачи 115200. Используйте while для цикла, чтобы дождаться успешного создания объекта Serial. // инициализируем последовательную связь Serial.begin(115200);   while (!Serial) {    ;      }    Мы выполняем простые математические операции, такие как сложение и умножение. Результат операций сохраняется в переменных c и d. int c = a + b;   int d = a * b;   Распечатайте результат на последовательном терминале, используя объект Serial. // Распечатать Serial.print("C= ");    Serial.println(c);      Serial.print("d= "); Serial.println(d);    Для функции loop () ничего не делайте. Весь код работает с функцией setup ().    Вот почему вы, вероятно, не видите вывода программы; мы увидим это позже. void loop() { } 28
A ГЛАВА 2  Операторы Sketch использует операторы C ++. Объявлены арифметические операторы для выполнения математических операций. Мы можем использовать следующие арифметические операторы: • % (остаток) • * (умножение) • + (сложение) • - (вычитание) • / (деление) • = (оператор присваивания)  Для логических операторов мы реализуем && для логических и, || для логического ИЛИ, И! для логического not (нет). Оператор условий Мы можем выполнять условные предложения на основе действий. Например, вы можете захотеть включить лампу, если датчик освещенности получает низкое значение интенсивности. В Sketch вы можете реализовать операторы условий, используя синтаксис if и switch. Условный оператор с if можно объявить следующим образом. if(<conditional>) { // сделай что-нибудь } else { // сделай что-нибудь } Мы можем помещать условные значения в <conditional>, например, применять логические и арифметические операторы. Для этой демонстрации мы можем создать программу Sketch на Arduino Nano 33 BLE Sense. Вы можете переписать эту подробную программу. 29
A ГЛАВА 2 long num_a; long num_b;                void setup() { // инициализируем последовательную связь Serial.begin(115200); while (!Serial) { ; }    } // print Serial.print("num_a: "); Serial.print(num_a); Serial.print(", num_b: "); Serial.println(num_b); if(num_a > num_b) { Serial.println("num_a > num_b"); }else { Serial.println("num_a <= num_b"); }                                          void loop() { num_a = random(100); num_b = random(100); delay(2000);    } Сохраните эту программу как условную. Теперь вы можете скомпилировать и загрузить эту программу на плату Arduino Nano 33 BLE Sense. Откройте Serial Monitor, чтобы просмотреть выходные данные программы, как показано на рисунке 2-5. 30
A ГЛАВА 2 Рис. 2-5. Program output for conditional if program Как это работает? Эта программа генерирует случайные значения для переменных num_a и num_b в функции loop (). void loop() { num_a = random(100);    num_b = random(100);    Затем распечатайте эти случайные значения на последовательном терминале, используя объект Serial. Мы можем вызвать функции Serial.print () и Serial.println (). // Распечатать   Serial.print("num_a: ");   Serial.print(num_a);   Serial.print(", num_b: ");   Serial.println(num_b);    31
A ГЛАВА 2 Наконец, мы оцениваем значение num_a и num_b с помощью оператора условия if. Мы проверяем, больше ли значение num_a чем num_b или нет. Затем мы печатаем результат на последовательном терминале.   if(num_a > num_b) {      Serial.println("num_a > num_b"); }else {    Serial.println("num_a <= num_b");      }    Следующая демонстрация - реализация оператора условия с помощью оператора switch. В общем, мы можем объявить оператор switch следующим образом: switch(value) { case val1: <code>        break;                   case val2: <code> break;        case val3: <code>                   break;        }                  В этом примере создайте программу для оценки значения num_a с помощью оператора switch. Установите случайное значение максимум 5. Откройте программу Arduino и перепишите эту подробную программу. long num_a; void setup() { // инициализируем последовательную связь Serial.begin(115200);     while (!Serial) {    ;   } }        32
A ГЛАВА 2 // Распечатать Serial.print("num_a: "); Serial.println(num_a); switch(num_a) { case 0: Serial.println("num_a break; case 1: Serial.println("num_a break; case 2: Serial.println("num_a break; case 3: Serial.println("num_a break; case 4: Serial.println("num_a break; value is 0"); value is 1"); value is 2"); value is 3"); value is 4");                                                                                                                                                                                 void loop() { num_a = random(5); } delay(2000); } Сохраните эту программу как ConditionalSwitch. Вы можете скомпилировать и загрузить эту программу на плату Arduino Nano 33 BLE Sense. Чтобы увидеть вывод программы, вы можете открыть Serial Monitor, как показано на Рисунке 2-6. 33
A ГЛАВА 2 Рис. 2-6. Программный вывод для программы Switch Как это работает? Эта программа начинает генерировать случайные значения в функции loop (). Результат сохраняется в переменной num_a. Затем вы можете распечатать это значение на последовательном терминале. void loop() { num_a = random(5);    // / Распечатать    Serial.print("num_a: ");    Serial.println(num_a);    Затем оцените переменную num_a с помощью оператора switch. Мы проверяем num_a на наличие значений 0, 1, 2, 3 и 4. Мы печатаем сообщение для каждого оператора switch-case. switch(num_a) { case 0: Serial.println("num_a value is 0");                  break;              34
A ГЛАВА 2     case 1:             Serial.println("num_a             break;     case 2:             Serial.println("num_a             break;     case 3:             Serial.println("num_a             break;     case 4:             Serial.println("num_a             break;   } value is 1"); value is 2"); value is 3"); value is 4"); Теперь вы выучили условные операторы с if и switch. Вы можете использовать оператор switch, если количество идентификаторов меньше пяти; в противном случае вы можете использовать оператор if с операторами. Зацикливание  Циклическая задача полезна, когда вы выполняете одну и ту же задачу непрерывно. В Sketch вы можете реализовать задачи цикла, используя операторы for, while и do.. while. Объявите оператор for следующим образом. for(start;conditional;increment/decrement) {       <codes> } На некоторое время вы можете реализовать его следующим образом. while(selection) { <codes>        } 35
A ГЛАВА 2 Вы также можете использовать do..time для зацикливания. Вы можете запустить первый шаг кода, а затем выбрать оператор while. do {       <codes> } while(selection); Теперь вы можете создать программу Sketch для реализации цикла с помощью операторов for, while и do.. while. Перепишите эту подробную программу с помощью программы Arduino. void setup() { // инициализируем последовательную связь    Serial.begin(115200);   while (!Serial) {    ;      } }   void loop() { long val = random(15);   int i;   // Распечатать   Serial.print("val: "); Serial.println(val);      // цикл Serial.println("Looping: for");    for(i=0;i<val;i++){    Serial.print(i);    Serial.print(" ");      }      Serial.println();       36
A Serial.println("Looping: while"); int start = 0; while(start < val) { Serial.print(start); Serial.print(" ");                    ГЛАВА 2 } Serial.println(); Serial.println("Looping: do..while"); start = 0; do { Serial.print(start); Serial.print(" ");                                          start++; start++; }while(start < val); Serial.println(); delay(3000);    } Вы можете сохранить эту программу как Looping, затем скомпилировать и загрузить ее на плату Arduino Nano 33 BLE Sense. Затем вы можете открыть Serial Monitor, чтобы увидеть вывод программы, как показано на рисунке 2-7. 37
A ГЛАВА 2 Рис. 2-7. Программный вывод для зацикливания Для цикла с оператором for выполните цикл, начиная с i = 0 до значения val. void loop() {   long val = random(15); int i;    Затем распечатайте это случайное значение на последовательном терминале. // print   Serial.print("val: ");   Serial.println(val);    Для цикла с оператором for выполните цикл, начиная с i = 0 до значения val. Serial.println("Looping: for");   for(i=0;i<val;i++){    Serial.print(i);     Serial.print(" "); }        Serial.println();    38
ГЛАВА 2 ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO Для оператора while выполните задачу, аналогичную задаче для оператора for. Установите start = 0 для инициализации.   int start = 0;   while(start < val) {     Serial.print(start); Serial.print(" ");      start++;      }    Serial.println();    Наконец, реализуйте оператор do..time. Снова установите start = 0, а затем выполните задачу цикла. start = 0; do {    Serial.print(start);     Serial.print(" ");      start++; }while(start < val);        Serial.println();    Break и Continue  При выполнении цикла вы, вероятно, захотите выйти из цикла или пропустить определенный шаг из цикла. В Sketch вы можете использовать операторы break и continue. В этом примере мы создаем программу Sketch для выполнения цикла от 0 до случайного значения. Когда итерация цикла достигает 5, мы пропускаем этот шаг, используя оператор continue. Затем мы выходим из цикла, когда достигаем значения итерации больше 10, используя оператор break. 39
ГЛАВА 2 ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO Сначала откройте программу Arduino. Перепишите эту программу для break и continue. void setup() {   // инициализируем последовательную связь   Serial.begin(115200); while (!Serial) {    ;      }    } void loop() { long val = random(6, 15);   int i;    // Распечатать   Serial.print("val: ");   Serial.println(val);    // цикл   Serial.println("Looping: for");   for(i=0;i<val;i++){    if(i==5) continue;             if(i>10) break;      Serial.print(i);        Serial.print(" ");      }      Serial.println();    delay(3000);    }    40
A ГЛАВА 2 Сохраните эту программу как BreakContinue, затем скомпилируйте и загрузите эту программу на плату Arduino Nano 33 BLE Sense. После загрузки программы вы можете просмотреть вывод программы с помощью Serial Monitor, как показано на Рисунке 2-8. Рис. 2-8. Применение break и continue в Sketch Как это работает? Установите случайное значение в функции loop (). Распечатайте это случайное значение на последовательном терминале, используя объект Serial. // Распечатать Serial.print("val: "); Serial.println(val);                void loop() { long val = random(6, 15); int i; 41
A ГЛАВА 2 Выполните цикл от 0 до случайного значения val. Если у вас есть итерация = 5, пропустите эту итерацию с помощью оператора continue. Затем, когда у вас есть итерация> 10, выйдите из цикла, вызвав оператор break.                   // looping Serial.println("Looping: for"); for(i=0;i<val;i++){ if(i==5) continue;             if(i>10) break;                 Serial.print(i); Serial.print(" "); } Serial.println(); Это конец нашей базовой программы Sketch. Далее мы пишем программу Arduino сразличными переменными cases. Цифровой ввод / вывод (I/O)  Arduino Nano 33 BLE Sense имеет 14-контактный цифровой вход / выход. Вы можете подсоединить датчики и исполнительные механизмы к цифровым контактам ввода / вывода. Расположение выводов Arduino Nano 33 BLE Sense отображается на задней стороне платы, как показано на рисунке 2-9. Пины цифрового ввода / вывода определяются как Dx, где x - цифровое число; например, D1 - это цифровой ввод / вывод на выводе 1. 42
A ГЛАВА 2 Рис. 2-9. Распиновка платы Arduino Nano 33 BLE Sense Вы можете проверить детали распиновки Arduino Nano 33 BLE Плата Sense на официальном сайте Arduino по адресу ­ https://content.arduino. cc / assets / Pinout- NANOsense_latest.pdf. Чтобы реализовать демонстрацию цифрового ввода-вывода на Arduino Nano 33 BLE Sense, нам понадобится светодиод и кнопка. Для этих примеров используйте внутренний светодиод (встроенный светодиод) на цифровом контакте 13. Нам также понадобится кнопка, подключенная к цифровому контакту 7. На рис. 2-10 показано подключение для этого проекта. Рис. 2-10. Конфигурация соединений для проекта кнопки 43
A ГЛАВА 2 Теперь вы можете создать программу Arduino. Эта программа включает светодиод, когда пользователь нажимает кнопку. Алгоритм программы заключается в считывании состояния кнопки с помощью функции digitalRead (). Чтобы включить светодиод, мы можем использовать digitalWrite () и установить значение HIGH.Откройте программу Arduino и перепишите эту программу. int led = 13; int pushButton = 7; int state = 0; void setup() {    pinMode(led, OUTPUT);   pinMode(pushButton, INPUT); } void loop() {   state = digitalRead(pushButton);   digitalWrite(led,state);   delay(300); } Сохраните эту программу как ButtonLed, затем скомпилируйте и загрузите эту программу на плату Arduino Nano 33 BLE Sense. После загрузки вы можете протестировать его, нажав кнопку. Вы должны увидеть, как загорится светодиод на Arduino Nano 33 BLE Sense. Как это работает? Эта программа начинается с инициализации значений для выводов светодиода и кнопок. int led = 13; int pushButton = 7; int state = 0; void setup() {   pinMode(led, OUTPUT);   pinMode(pushButton, INPUT); } 44
A ГЛАВА 2 Затем в функции loop () мы считываем состояние кнопки с помощью функции digitalRead (). Значение состояния будет передано в функцию digitalWrite () для включения и выключения светодиода.          void loop() { state = digitalRead(pushButton); digitalWrite(led,state); delay(300); } Теперь, когда вы узнали о цифровом I/O, теперь мы рассмотрим аналоговый ввод-вывод. Аналоговый ввод / вывод (I/O) ­  Arduino Nano 33 BLE Sense обеспечивает аналоговый ввод-вывод, чтобы мы могли взаимодействовать с сенсорными и исполнительными устройствами. Аналоговые выводы ввода / вывода помечены как Ax, где x - номер аналогового вывода. Вы можете увидеть эти ярлыки на задней панели платы Arduino Nano 33 BLE Sense, как показано на Рисунке 2-9. Arduino Nano 33 BLE Sense имеет восемь аналоговых входов (АЦП). К сожалению, Arduino Nano 33 BLE Sense не поддерживает аналоговый выход (ЦАП), но мы можем использовать ШИМ как аналоговый выход. Для моделирования АЦП Arduino Nano 33 BLE Sense обеспечивает разрешение АЦП с 12 битами. В этой демонстрации используется аналоговый датчик температуры TMP36. Вы также можете использовать модуль TMP36 как тепловой модуль от Linksprite (см. Https://www.linksprite.com/wiki/index.php? title=Thermal_Module). Вы можете выполнить подключение, показанное на Рис. 2-11, следующим образом: • Модуль VCC TMP36 подключен к Arduino 3.3.V. • Земля модуля TMP36 подключена к земле Arduino. • Модуль TMP36 SIG подключен к аналогу A0 Arduino. 45
A ГЛАВА 2 Рис. 2-11. Разводка аналогового датчика и Arduino Nano 33 BLE Теперь вы можете написать программу Arduino для аналогового датчика из модуля TMP36. Он считывает данные датчика и затем отображает их на последовательном терминале. Начните с открытия программы Arduino и написания этой подробной программы. void setup() { Serial.begin(115200); while (!Serial) { ;    }    }         46
A ГЛАВА 2 float voltage = reading * 3.3; voltage /= 1024.0;          void loop() { int reading = analogRead(A0);    Serial.print(voltage); Serial.println(" volts");          float tempC = (voltage - 0.5) * 100 ; Serial.print(tempC); Serial.println(" degrees C"); delay(3000);    } Сохраните эту программу как AnalogSensor. Затем скомпилируйте и загрузите эту программу в Arduino Nano 33 BLE Sense. Откройте Serial Monitor, чтобы просмотреть выходные данные программы, как показано на рисунке 2-12. Рис. 2-12. Программный вывод для чтения температуры Как это работает? Сначала считайте данные датчика на аналоговом выводе A0. 47
A ГЛАВА 2 Затем рассчитайте напряжение и покажите его на последовательном терминале. Поскольку мы используем опорное напряжение 3,3 В, мы можем рассчитать по этойформуле. float voltage = reading * 3.3; voltage /= 1024.0;          void loop() { int reading = analogRead(A0);    Serial.print(voltage); Serial.println(" volts"); Затем вычислите температуру, используя следующую таблицу данных на основе формул из модуля TMP36. Serial.print(tempC); Serial.println(" degrees C");          float tempC = (voltage - 0.5) * 100 ; Результат будет распечатан на последовательном терминале. Построение графика данных датчика  Вы также можете использовать данные аналогового входа для построения графика, доступные в программе Arduino. В этом примере используется электретный микрофон SparkFun с разъемом как аналоговый источник. Вы можете найти этот модуль по адресу https://www.sparkfun.com/products/12758. Подключите выход электретного микрофона SparkFun к плате Arduino Nano 33 BLE Sense, используя следующее соединение. Полученная конфигурация показана на рисунке 2-13. • Модуль коммутации электретного микрофона SparkFun VCC подключен к Arduino 3.3.V. 48
A ГЛАВА 2 • GND модуля электретного микрофона SparkFun подключается к GND Arduino. • Модуль коммутации электретного микрофона SparkFun SIGподключен к Arduino A0. Рис. 2-13. Подключение Arduino к электретному микрофону SparkFun Затем вы можете написать программу Arduino для построения графика данных датчика. Откройте программу Arduino и перепишите эту программу. void setup() { Serial.begin(115200);   while (!Serial) { ;    }      }    49
A ГЛАВА 2          void loop() { int val = analogRead(A0); Serial.println(val); delay(300); } Сохраните эту программу как AnalogPlotting, затем скомпилируйте и загрузите эту программу в Arduino Nano 33 BLE Sense. Чтобы открыть инструмент «Последовательный плоттер» в программе Arduino, в меню «Инструменты» выберите «Последовательный плоттер», как показано на рисунке 2-14. Рис. 2-14. Открытие инструмента "Последовательный плоттер" После того, как вы выберете «Последовательный плоттер», вы увидите диалоговоеокно, показанное на Рис. 2-15. Сделайте шум в электретном микрофоне SparkFun, чтобы получить различные сигналына плоттере. Поскольку мы используем задержку (300), плоттер обновляет свои графики каждые 300 мс. 50
A ГЛАВА 2 Рис. 2-15. Построение данных о звуке датчика Как это работает? Все очень просто. Сначала считайте данные аналогового датчика, вызвав analogRead (). void loop() { int val = analogRead(A0);    Затем распечатайте график на последовательном терминале, используя println () из объекта Serial. Serial.println(val);   delay(300);    Он предложит последовательному плоттеру отобразить график. 51
A ГЛАВА 2  Последовательная связь Последовательная связь - это процесс посылки данных по одному биту за раз, последовательно, по каналу связи. В Arduino Nano 33 BLE Sense мы можем реализовать последовательную связь с помощью объекта Serial. Мы уже использовали этот объект Serial в предыдущих проектах для отображения вывода программы с помощью Serial Monitor. Вы можете записывать данные в последовательную связь, вызывая print () и println () из объекта Serial. Для получения дополнительной информации об объекте Serial посетите https://www.arduino.cc/reference/en/language/functions/communication/serial/. Эта демонстрация строит программу мигания. Состояние каждого светодиода записывается в последовательный терминал. Используйте настройку скорости передачи 115200 бод. Вы можете открыть программу Arduino и переписать эту подробную программу. int led = 13;       void setup() { Serial.begin(115200);pinMode (led, OUTPUT); }                   void loop() { Serial.println("LED: HIGH"); digitalWrite(led, HIGH); delay(1000); Serial.println("LED: LOW"); digitalWrite(led, LOW);delay (1000); } Сохраните эту программу как SerialDemo, затем скомпилируйте и загрузите эту программу в Arduino Nano 33 BLE Sense. Откройте Serial Monitor, чтобы просмотреть вывод программы, как показано на Рисунке 2-16. 52
A ГЛАВА 2 Рис. 2-16. Программный вывод для SerialDemo  Широтно-импульсная модуляция ШИМ - это метод управления аналоговым выходом. Технически это не настоящий аналоговый выход. Блок микроконтроллера (MCU) может управлять рабочим циклом для генерации импульсов. Arduino Nano 33 BLE Sense имеет контакты PWM на всех цифровых пинах. Вы можете увидеть знак ~ на цифровых выводах, которые являются выводами ШИМ. См. Рисунок 2-9, на котором показаны цифровые выводы, такие как D2 ~. В общем, Arduino Nano 33 BLE Sense имеет 14 контактов PWM на цифровых контактах: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13. Для этой демонстрации мы используем светодиод RGB. У этого светодиода четыре контакта. Три контакта - относятся к красному,зеленому и синему светодиодам. Четвертый вывод может быть GND или VCC, в зависимости от RGB с ОК или с ОА. Для этого примера вы можете реализовать следующую схему подключения, показанную на Рисунке 2-17. • "Красный" вывод RGB подключен к цифровому выводу 12 Arduino. • "Зеленый" вывод RGB подключен к цифровому выводу 11 Arduino. • "Синий" вывод RGB подключен к цифровому выводу 10 Arduino. • Вывод RGB GND подключается к цифровому выводу GND Arduino. 53
A ГЛАВА 2 Рис. 2-17. Wiring for Arduino and RGB LED Теперь вы можете создать программу Arduino для генерации некоторых цветов с помощью светодиода RGB: красный, зеленый, синий, желтый, фиолетовый и голубой. Откройте программу Arduino и перепишите эту подробную программу. int redPin = 12; int greenPin = 11; int bluePin = 10; void setup() { pinMode(redPin, OUTPUT);     pinMode(greenPin, OUTPUT);     pinMode(bluePin, OUTPUT);     Serial.begin(115200); }     void loop() { setColor(255, 0, 0); // красный   Serial.println("red");      54
   A delay(1000);             setColor(0, 255, 0); // зеленый Serial.println("green"); delay(1000); setColor(0, 0, 255); // синий Serial.println("blue"); delay(1000); setColor(255, 255, 0); // желтый Serial.println("yellow"); delay(1000); setColor(80, 0, 80); // фиолетовый Serial.println("purple"); delay(1000); setColor(0, 255, 255); // голубой Serial.println("aqua"); delay(1000);                                              ГЛАВА 2    }          void setColor(int red, int green, int blue) { analogWrite(redPin, red); analogWrite(greenPin, green); analogWrite(bluePin, blue); } Сохраните эту программу как test_rgb_arduino, затем скомпилируйте и загрузите эту программу в Arduino Nano 33 BLE Sense. Вы должны увидеть несколько цветов на светодиоде RGB. Вы также можете открыть Serial Monitor, чтобы увидеть вывод программы, который также показан на Рисунке 2-18. 55
A ГЛАВА 2 Рис. 2-18. Программный вывод для приложения RGB Как это работает? Инициализируйте цифровые выводы для выводов PWM. Вызовите pinMode () в режиме OUTPUT. Вы также сконфигурируйте объект Serial со значением скорости передачи 115200 бод. int redPin = 12; int greenPin = 11; int bluePin = 10; void setup() { pinMode(redPin, OUTPUT);     pinMode(greenPin, OUTPUT);     pinMode(bluePin, OUTPUT);     Serial.begin(115200); }     Затем определите функцию setColor () для генерации цвета из комбинации значений красного, зеленого и синего цветов. Вызовите analogWrite (), чтобы записать данные для данных ШИМ. 56
A ГЛАВА 2 void setColor(int red, int green, int blue) {   analogWrite(redPin, red);   analogWrite(greenPin, green);   analogWrite(bluePin, blue); } Затем сгенерируйте несколько цветов в функции loop (). Например, мы хотим установить красный = 255, зеленый = 0 и синий = 0. Эти образцы генерируют цвет для красного, зеленого и синего цветов. void loop() { setColor(255, 0, 0); // красный   Serial.println("red");     delay(1000);   setColor(0, 255, 0); // зеленый   Serial.println("green");      delay(1000);   setColor(0, 0, 255); // синий   Serial.println("blue");   delay(1000);       Вы также можете сгенерировать цвета для желтого, фиолетового и бирюзового цветов, вставив значения для красного, зеленого и синего. setColor(255, 255, 0); // желтый Serial.println("yellow");   delay(1000);      setColor(80, 0, 80); // фиолетовый   Serial.println("purple");   delay(1000);    setColor(0, 255, 255); // голубой      Serial.println("aqua");   delay(1000);          57
A ГЛАВА 2 Вы можете попрактиковаться в создании новых цветов, комбинируя разные значения для красного, зеленого и синего. Значения можно установить от 0 до 255.  Serial Peripheral Interface - SPI Последовательная связь работает в асинхронном режиме, поэтому контроль последовательной связи отсутствует. Это означает, что мы не можем гарантировать, что отправленные данные будут получены предполагаемым получателем. SPI - это спецификация интерфейса синхронной последовательной связи, но SPI имеет четыре провода для управления данными, такими как MOSI, MISO, SCLK и SS. Arduino Nano 33 BLE Sense имеет один интерфейс SPI со следующими контактами SPI. • MOSI на цифровом выводе 11. • MISO на цифровом выводе 12. • SCLK на цифровом выводе 13. К плате Arduino Nano 33 BLE Sense можно подключить любой датчик или интерфейс SPI на основе привода. В этом примере мы подключаем вывод MISO к выводу MOSI только с помощью соединительного кабеля. Вы можете подключить цифровой контакт 12 к цифровому контакту 11. На рис. 2-19 показано подключение для этой демонстрации SPI. 58
A ГЛАВА 2 Рис. 2-19. Подключение выводов MISO и MOSI от Arduino SPI Чтобы получить доступ к интерфейсу SPI на Arduino Nano 33 BLE Sense, вы можете использовать библиотеку SPI. Подробная информация об этой библиотеке доступна на сайте https://www.arduino.cc/en/Reference/SPI. Теперь мы можем создать программу Arduino. Эта программа будет отправлять данные и получать данные от SPI. Для начала откройте программное обеспечение Arduino, а затем перепишите эту подробную программу. #include <SPI.h>    byte sendData,recvData; void setup() { SPI.begin(); 59
      A ГЛАВА 2 Serial.begin(9600); randomSeed(80);                   } void loop() { sendData = random(50, 100); recvData = SPI.transfer(sendData); Serial.print("Send="); Serial.println(sendData,DEC); Serial.print("Recv="); Serial.println(recvData,DEC); delay(800);    } Сохраните эту программу как SPIDemo, затем скомпилируйте и загрузите эту программу в Arduino Nano 33 BLE Sense. Вы можете открыть Serial Monitor, чтобы увидеть вывод программы, который также показан на Рис. 2-20. Рис. 2-20. Программный вывод для SPI 60
ГЛАВА 2 ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO Как это работает? Сначала инициализируйте SPI и последовательный интерфейс в функции setup (). #include <SPI.h> byte sendData,recvData; void setup() { SPI.begin();    Serial.begin(9600);    randomSeed(80);    } Чтобы отправлять и получать данные через SPI, вы можете использовать функцию SPI.transfer (). Вы можете отправлять данные со случайными значениями в функции loop (). void loop() { sendData = random(50, 100);   recvData = SPI.transfer(sendData);   Затем распечатайте отправленные и полученные данные на последовательном терминале. Serial.print("Send=");   Serial.println(sendData,DEC);   Serial.print("Recv=");   Serial.println(recvData,DEC);    На этом демонстрация SPI завершена. Вы можете попрактиковаться дальше, применив датчики и исполнительные устройства. 61
A ГЛАВА 2  Inter-Integrated Circuit (I2C) - это протокол, позволяющий нескольким «подчиненным» модулям или устройствам (микросхемам) связываться с одной или несколькими «ведущими» микросхемами. Этот протокол работает в асинхронном режиме. Для связи с другими устройствами или модулями протокол I2C определяет адреса I2C для всех подчиненных устройств. Интерфейс I2C имеет два контакта: SDA и SCL. Для передачи данных интерфейс I2C использует вывод SDA. Вывод SCL используется для синхронизации. Плата Arduino Nano 33 BLE Sense имеет контакты I2C на A4 как SDA и A5 как SCL. В этом примере мы используем интерфейс I2C на основе датчиков. Интерфейс I2C использует адрес устройства, поэтому плата Arduino Nano 33 BLE Sense может получить доступ к данным, открыв соединение с адресом I2C. Каждый аналоговый датчик I2C на основе модуля датчиков будет привязан к адресу I2C. ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ ­ Для тестирования в этом примере используется модуль преобразователя PCF8591 AЦП / ЦAП с датчиками и исполнительными устройствами, как показано на рис. 2-21. В модуле AЦП / ЦAП PCF8591 используется микросхема PCF8591, которая состоит из четырех аналоговых входов и аналого-цифрового преобразователя. Микросхема PCF8591 также имеет аналоговый выход с ЦАП. Для получения дополнительной информации о микросхеме PCF8591 см. Https: //www.nxp.com/products/interfaces/ic- spiserial- interface-устройства / ic-dacs-and-adcs / 8-bit-a-d-and-d-a-converter: PCF8591. Этот тип модуля можно приобрести в Интернете или в местном магазине. 62
A ГЛАВА 2 Figure 2-21. PCF8591 ADC DAC AD/DA module На основе документации к модулю преобразователя АЦП/ЦАП / DA PCF8591 использует адрес I2C на 0x48. Он также состоит из трех датчиков. • Термистор - используется канал 0. • Фоторезистор - используется канал 1. • Потенциометр - используется канал 3. Теперь присоединяем модуль преобразователя PCF8591 AD / DA к плате Arduino Nano 33 BLE Sense следующим образом. • SDA подключается к выводу Arduino A4. • SCL подключен к выводу Arduino A5. • VCC подключен к Arduino 3.3V. • GND подключен к контакту Arduino GND. 63
A ГЛАВА 2 На рис. 2-22 показана схема подключения модуля AD / DA преобразователя PCF8591 и платы Arduino Nano 33 BLE Sense. Вы должны увидеть светящийся светодиод, когда вы подключите к модулю 3,3 В. Рис. 2-22. Подключение модуля PCF8591 ADC / DAC АЦП к Arduino Nano 33 BLE Sense Теперь, когда мы закончили разводку для этой демонстрации, мы можем реализовать два демонстрационных проекта: сканирование I2C и датчика I2C. Во-первых, давайте создадим программу для сканирования адресов I2C на плате Arduino Nano 33 BLE Sense. 64
ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO A ГЛАВА 2  Сканирование I2C-адреса Каждое устройство или набор I2C на основе модуля имеет свой собственный адрес I2C на MCU. В этом разделе мы хотим просканировать все устройства, подключенные к Arduino Nano 33 BLE Sense. У нас также есть некоторые внутренние датчики на основе I2C внутри Arduino Nano 33 BLE Sense. Для доступа к I2C на плате Arduino вы можете использовать библиотеку Wire. Мы можем включить нашу программу, вставив библиотеку wire.h. Для получения дополнительной информации о библиотеке Wire посетите официальный сайт Arduino по адресу https://www.arduino.cc/en/Reference/Wire. В этой демонстрации используется демонстрационная схема подключения модуля АЦП / ЦАП преобразователя PCF8591, показанная ранее на рис. 2-22. Эта программа была изменена с https://playground.arduino.cc/Main/I2cScanner/. Откройте программу Arduino и перепишите эту подробную программу. #include <Wire.h>          void setup() { Serial.begin(115200); Wire.begin(); Serial.println("\nI2C Scanner"); }       void loop() { byte error, address; int nDevices; nDevices = 0; for(address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission();                    Serial.println("Scanning..."); 65
A ГЛАВА 2                                    if (error == 0) { Serial.print("I2C device found at address 0x"); if (address < 16) Serial.print("0"); Serial.println(address, HEX);        nDevices++;                         } else if (error == 4) { Serial.print("Unknown error at address 0x"); if (address < 16)                 Serial.print("0"); Serial.println(address, HEX); } if (nDevices == 0) Serial.println("No I2C devices found"); else Serial.println("done");                         } delay(5000);    } Сохраните эту программу как i2c_scanner. Затем вы можете скомпилировать и загрузить эту программу в Arduino Nano 33 BLE Sense. Вы можете просмотреть вывод программы с помощью последовательного монитора, как показано на рисунке 2-23. Вы можете видеть, что существует три адреса I2C. 0x48 - это наш модуль преобразователя AD / DA PCF8591, а два адреса I2C, 0x51 и 0x55, принадлежат внутренними датчиками I2C внутри Arduino Nano 33 BLE Sense. 66
ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO A ГЛАВА 2 Рис. 2-23. Программный вывод для чтения адреса I2C Как это работает? Сначала инициализируется I2C и последовательные интерфейсы в функции setup (). Установливаем значение скорости передачи115200. #include <Wire.h> void setup() { Serial.begin(115200);    Wire.begin();    Serial.println("\nI2C Scanner");    } В функции loop () мы выполняем сканирование адреса I2C путем зондирования данных I2C. Установите initialize nDevices = 0 для количества устройств I2C, которые нужно найти. Выполните задачу зацикливания от адреса 0 до 127. Затем откройте интерфейс I2C с помощью Wire.beginTransmission (), затем закройте передачу, вызвав wire.endTransmission (). 67
A ГЛАВА 2 nDevices = 0;   for(address = 1; address < 127; address++) {     Wire.beginTransmission(address);     error = Wire.endTransmission(); Проверьте значение ошибки. Если ошибки нет, это означает, что у вас есть устройство I2C по текущему адресу. Распечатайте адрес I2C на последовательный терминал, используя Serial.println () в режиме HEX. if (error == 0) {            Serial.print("I2C device found at address 0x");       if (address < 16)         Serial.print("0");       Serial.println(address, HEX);       nDevices++;     } В противном случае проверьте код ошибки. Если error = 4, мы печатаем ошибки по этому адресу для неизвестных ошибок по текущему адресу. else if (error == 4) {            Serial.print("Unknown error at address 0x");       if (address < 16)         Serial.print("0");       Serial.println(address, HEX);     } Наконец, распечатайте результаты по интерфейсу I2C на последовательном терминале.   if (nDevices == 0) Serial.println("No I2C devices found");      else    Serial.println("done");      68
ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO A ГЛАВА 2 Эта программа полезна для проверки списка устройств I2C, подключенных к плате Arduino Nano 33 BLE Sense.  Чтение адресов I2C на основе датчиков В этом разделе мы читаем данные датчиков с устройства I2C. Подключения между модулями показанны на Рис. 2-22. Модуль преобразователя АЦП / ЦАП PCF8591 имеет три датчика: термистор, фотоэлемент и потенциометр. Каждый датчик имеет адрес канала 0x00, 0x01 и 0x03 соответственно. Давайте приступим к созданию программы Arduino для доступа к датчикам через интерфейс I2C. Откройте программу Arduino и перепишите эту программу. #include "Wire.h" #define PCF8591 0x48 // адрес шины I2C #define PCF8591_ADC_CH0 0x00 // термистор #define PCF8591_ADC_CH1 0x01 // фотоэлемент #define PCF8591_ADC_CH2 0x02 #define PCF8591_ADC_CH3 0x03 // потенциометр byte ADC1, ADC2, ADC3; // считываем термистор Wire.beginTransmission(PCF8591); Wire.write((byte)PCF8591_ADC_CH0); Wire.endTransmission(); delay(100); Wire.requestFrom(PCF8591, 2);                         void setup() { Wire.begin(); Serial.begin(9600); } void loop() { 69
A ГЛАВА 2   delay(100);   ADC1=Wire.read();   ADC1=Wire.read();   Serial.print("Thermistor=");   Serial.println(ADC1);   // считываем фотоэлемент Wire.beginTransmission(PCF8591);    Wire.write(PCF8591_ADC_CH1);    Wire.endTransmission();    delay(100);   Wire.requestFrom(PCF8591, 2);   delay(100);   ADC2=Wire.read();   ADC2=Wire.read();    Serial.print("Photo-voltaic cell=");   Serial.println(ADC2);    // потенциометр   Wire.beginTransmission(PCF8591);   Wire.write(PCF8591_ADC_CH3);   Wire.endTransmission();   delay(100); Wire.requestFrom(PCF8591, 2);    delay(100);    ADC3=Wire.read();   ADC3=Wire.read();      Serial.print("potentiometer="); Serial.println(ADC3);      delay(500); }    70
ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO A ГЛАВА 2 Сохраните эту программу как I2CSensor. Затем вы можете скомпилировать и загрузить эту программу в Arduino Nano 33 BLE Sense. Откройте Serial Monitor в программе Arduino, чтобы просмотреть данные датчика по протоколу I2C, как показано на рисунке 2-24. Рис. 2-24. Программный вывод для чтения датчиков по I2C Как это работает? Сначала инициализируйте модуль преобразователя I2C, Serial и PCF8591 АЦП / ЦАП. Определите адресный канал I2C в функции setup (). #include "Wire.h" #define PCF8591 0x48 // адрес шины I2C #define PCF8591_ADC_CH0 0x00 // термистор #define PCF8591_ADC_CH1 0x01 // фотоэлемент #define PCF8591_ADC_CH2 0x02 #define PCF8591_ADC_CH3 0x03 // потенциометр byte ADC1, ADC2, ADC3; 71
A ГЛАВА 2 void setup() {   Wire.begin();   Serial.begin(9600); } Вы можете прочитать данные датчика в функции loop (). Чтобы прочитать данные термистора, откройте I2C с помощью Wire.beginTransmission () с передачей PCF8591.Затем выберите канал для термистора со значением PCF8591_ADC_CH0 с использованием Wire.write (). Закройте передачу, вызвав Wire.endTransmission (). Считайте данные датчика с 2 байтами с помощью функции Wire.requestFrom (). void loop() { // считываем термистор Wire.beginTransmission(PCF8591);   Wire.write((byte)PCF8591_ADC_CH0);   Wire.endTransmission();   delay(100);   Wire.requestFrom(PCF8591, 2);   delay(100); ADC1=Wire.read();    ADC1=Wire.read();       Установите задержку (100), чтобы ждать, пока модуль завершит ваш запрос. Вы можете читать данные по байтам, используя функцию    Wire.read (). Затем распечатайте данные термистора на последовательном терминале. Serial.print("Thermistor="); Serial.println(ADC1);       72
ПЛАТА РАЗРАБОТКИ NANO 33 BLE SENSE ARDUINO A ГЛАВА 2 Таким же способом вы можете считать фотоэлемент, изменив значение канала на PCF8591_ADC_CH1. После этого считайте данные датчика и распечатайте результаты на последовательном терминале.   // считываем фотоэлемент   Wire.beginTransmission(PCF8591);   Wire.write(PCF8591_ADC_CH1); Wire.endTransmission();    delay(100);    Wire.requestFrom(PCF8591, 2);   delay(100);   ADC2=Wire.read();   ADC2=Wire.read();    Serial.print("Photo-voltaic cell=");   Serial.println(ADC2);    Вы также можете прочитать значение потенциометра в модуле преобразователя PCF8591 AЦП. Откройте интерфейс I2C и выберите канал для PCF8591_ADC_CH3. Затем вы можете прочитать данные датчика и распечатать их на последовательном терминале. // потенциометр   Wire.beginTransmission(PCF8591); Wire.write(PCF8591_ADC_CH3);    Wire.endTransmission();    delay(100);    Wire.requestFrom(PCF8591, 2);   delay(100);   ADC3=Wire.read();   ADC3=Wire.read();    Serial.print("potentiometer=");    Serial.println(ADC3);       73
A ГЛАВА 2 Вы можете продолжить практику на Arduino Nano 33 BLE Sense с некоторыми протоколами, которые мы уже изучили.  Резюме В этой главе было рассмотрено базовое программирование Arduino с использованием Sketch. Вы узнали, как получить доступ к цифровому и аналоговому вводу / выводу на плате Arduino Nano 33 BLE Sense. Мы также изучили, как реализовать ШИМ на Arduino Nano 33 BLE Sense и построить график данных датчика. Кроме того, вы научились использовать интерфейсы SPI и I2C для связи с внешними устройствами. Далее мы исследуем, как получить доступ к внутренним датчикам на Arduino Nano 33 BLE Sense. 74
ГЛАВА 3 Программирование датчиков В этой главе рассматривается, как получить доступ к внутренним датчикам Arduino Nano 33 BLE Sense. Она имеет несколько внутренних датчиков, таких как инерциальный измерительный блок - гироскоп (IMU), датчик давления, цифровой микрофон, датчик влажности и температуры и датчик жестов. В этой главе вы узнаете о следующих темах: • Доступ к датчику температуры и относительной влажности. • Построение графиков данных датчиков. • Отображение данных датчика с помощью OLED-дисплея I2C. • Доступ к датчику IMU. • Доступ к датчику давления. • Работа с цифровым микрофоном. • Работа с датчиком жестов. 75
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ  Вступление Плата Arduino Nano 33 BLE Sense имеет несколько внутренних датчиков, таких как IMU, датчик давления, цифровой микрофон, датчик влажности и температуры и датчик жестов,которые подключены к интерфейсам протокола I2C. Эти датчики показаны на Рис. 3-1. Рис. 3-1. Некоторые сенсорные чипы на плате Arduino Nano 33 BLE Sense В главе 2 мы узнали об интерфейсе I2C. Мы также выполнили сканирование адреса I2C. Мы можем изменить программу i2c_scanner из главы 2, чтобы перечислить все адреса I2C в Arduino Nano 33 BLE Sense. Вы можете переписать эти подробные скрипты (сценарии). #include <Wire.h>          void setup() { Serial.begin(115200); Wire.begin(); Serial.println("\nI2C Scanner"); } 76
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ int nDevices; nDevices = 0; for(address = 1; address < 127; address++) { Wire.beginTransmission(address); error = Wire.endTransmission();                       void loop() { byte error, address;      if (error == 0) {               Serial.print("I2C device found at address 0x"); if (address < 16)                 Serial.print("0"); Serial.println(address, HEX);        nDevices++;         } } delay(5000);    } Сохраните эту программу как i2c_internalsensor. Затем скомпилируйте и загрузите эту программу в Arduino Nano 33 BLE Sense. Обязательно измените положение платы, встряхните плату или переместите плату, чтобы получить результат измерения на последовательном терминале. На рисунке 3-2 показан вывод программы для i2c_internalsensor. программа, список адресов I2C в Arduino Nano 33 BLE Sense. 77
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-2. Список адресов I2C в Arduino Nano 33 BLE Sense  Температура и относительная влажность Плата Arduino Nano 33 BLE Sense имеет встроенный датчик температуры и относительной влажности, использующий HTS221. Для работы с этим сенсором используйте библиотеку Arduino_HTS221. Вы можете найти документацию по этому датчику на https://www.arduino.cc/en/Reference/ArduinoHTS221. Вы можете установить библиотеку Arduino_HTS221 через Диспетчер библиотек. Введите Arduino_HTS221 в текстовое поле поиска, чтобы увидеть библиотеку Arduino_HTS221, как показано на рис. 3-3. 78
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-3.Установка библиотеки Arduino_HTS221 Нажмите «Install», чтобы установить библиотеку Arduino_HTS221. Убедитесь, что на вашем компьютере есть доступ в Интернет. После этого вы можете получить доступ к датчику HTS221. Для этой демонстрации мы считываем показания датчика температуры и относительной влажности. Вы можете использовать функцию readTemperature () из объекта HTS для чтения температуры. Вы также можете вызвать функцию readHumidity () для чтения влажности. Перед вызовом этих функций инициализируйте датчик, вызвав функцию HTS.begin (). Наконец, вы можете распечатать данные датчика на последовательном терминале. Откройте программу Arduino и напишите эти скрипты (ценарии) для чтения датчиков температуры и влажности. #include <Arduino_HTS221.h> void setup() { Serial.begin(115200);   while (!Serial);    79
ПРОГРАММИРОВАНИЕ ДАТЧИКОВ if (!HTS.begin()) { Serial.println("Failed to initialize humidity temperature sensor!"); while (1); }                 ГЛАВА 3 }      Serial.print("Temperature = "); Serial.print(temperature); Serial.println(" °C"); = ");      Serial.print("Humidity Serial.print(humidity); Serial.println(" %"); Serial.println(); delay(1000);                            void loop() { float temperature = HTS.readTemperature(); float humidity = HTS.readHumidity();    } Сохраните эту программу как TempHumidity. Затем вы можете скомпилировать и загрузить эту программу в Arduino Nano 33 BLE Sense. Мы можем увидеть вывод программы с помощью Serial Monitor, как показано на Рисунке 3-4. 80
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-4. Программный вывод для TempHumidity Построение графика данных датчика  Вы только что видели, что мы можем считывать температуру и влажность со встроенных датчиков на Arduino Nano 33 BLE Sense. В этом разделе мы строим данные наших датчиков с помощью инструмента Serial Plotter от Arduino. Для тестирования используйте предыдущий проект, который считывает датчики температуры и влажности. Первый шаг - создать новую программу Sketch. Откройте программу Arduino и включите в программу библиотеку HTS221. Затем инициализируйте датчик HTS221 и последовательную связь в функции setup (). Установите для скорости последовательной передачи значение 115200 и инициализируйте HTS221, вызвав функцию HTS.begin (). #include <Arduino_HTS221.h> void setup() { Serial.begin(115200); while (!Serial);       81
ПРОГРАММИРОВАНИЕ ДАТЧИКОВ if (!HTS.begin()) { Serial.println("Failed to initialize humidity temperature sensor!"); while (1); }                 ГЛАВА 3 } В функции loop () мы считываем датчик температуры с помощью HTS. readTemperature (). Также считываем показания датчика влажности с помощью функции HTS.readHumidity ().            void loop() { float temperature = HTS.readTemperature(); float humidity = HTS.readHumidity();                   Чтобы отобразить датчики температуры и влажности на последовательном плоттере, вы можете распечатать значения датчиков с разделителем. Чтобы установить имя ярлыка на последовательном плоттере, вы можете использовать «sensor_name: - имя_сенсора:». Например, вы можете распечатать переменные датчика температуры и влажности следующим образом: Serial.print(" Temperature:");Serial.print (temperature);Serial.print (", "); Serial.print("Humidity:"); Serial.println(humidity); delay(500); } Теперь сохраните эту программу как Plot_TempHumidity. Затем вы можете скомпилировать и загрузить программу в Arduino Nano 33 BLE Sense. После загрузки программы откройте Serial Plotter из меню Tools в программном обеспечении Arduino. Вы также должны увидеть выходы датчиков на последовательном плоттере. На рис. 3-5 показан результат работы программы Plot_TempHumidity. Вы также должны увидеть названия датчиков, такие как Temperature and Humidity - Температура и Влажность. 82
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-5.Построение графика данных датчика влажности Plot_TempHumidity в последовательном интерфейсе  Отображение данных датчика с помощью OLED-дисплея I2C В этом разделе мы расскажем, как отображать данные датчиков на OLED-дисплее. На OLED-дисплее представлены две модели интерфейса: SPI и I2C. В этой демонстрации используется OLED-дисплей I2C, который можно купить в любом местном магазине электроники или в Интернете. Для этой демонстрации я использовал OLED-дисплей I2C с разрешением 0,96 дюйма или 128 × 64 пикселей, полученный онлайн и показанный на рис. 3-6. Технически вы можете использовать любой размер дисплея для дисплея OLE I2C. Следующим шагом является подключение дисплея OLED I2C к плате Arduino Nano 33 BLE Sense. 83
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-6. OLED 0.96” I2C дисплей  Подключение OLED-дисплея I2C Мы используем OLED-дисплей с интерфейсом I2C, поэтому мы можем подключить дисплей к Arduino Nano 33 BLE Sense через контакты I2C. Выполнить эту разводку можно следующим образом. • SDA подключается к выводу Arduino A4. • SCL подключается к выводу Arduino A5. • VCC подключен к Arduino 3.3V. • 84 GND подключается к контакту GND Arduino.
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-7. Wiring the OLED I2C display on the Arduino Nano 33 BLE Sense Затем вы можете создать программу Arduino для дисплея OLED I2C. Проверка адреса I2C OLED-дисплея  Теперь, когда соединение между Arduino Nano 33 BLE Sense и OLED-дисплеем I2C завершено, вы можете использовать программу i2c_scanner из главы 2 для проверки адресов I2C с устройств. Это даст вам адрес I2C с дисплея OLED I2C. Загрузите программу i2c_scanner в программу Arduino, затем скомпилируйте и загрузите эту программу в Arduino Nano 33 BLE Sense. После этого откройте Serial Monitor. Вы должны увидеть три адреса I2C. Два из них представлены на рис. 3-7. Подключение OLED-дисплея I2C к встроенным датчикам Arduino Nano 33 I2C на Arduino Nano 33 BLE Sense. Третий - это OLED-дисплей I2C. Результат программы показан на рисунке 3-8. Вы можете увидеть OLED-дисплей I2C, работающий по адресу 0x3C I2C. 85
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ I2C built-in sensors on the Arduino Nano 33 BLE Sense. The third one is the OLED I2C display. The program output is shown in Рис. 3-8. You can see the OLED I2C display running on the 0x3C I2C address. Рис. 3-8. Обнаружение адреса I2C для дисплея OLED I2C Следующим шагом является настройка библиотек для создания программ для дисплея OLED I2C на Arduino Nano 33 BLE Sense.  Установка библиотеки дисплеев OLED I2C Для работы с OLED-дисплеем I2C на Arduino необходимо установить две библиотеки от Adafruit. • Adafruit GFX Library: https://github.com/adafruit/ Adafruit-GFX-Library 86 ­ Adafruit_SSD1306: https://github.com/adafruit/ Adafruit_SSD1306 ­ •
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Мы можем установить эти библиотеки через диспетчер библиотек в программе Arduino. Введите Adafruit_SSD1306 и Adafruit GFX Library, чтобы найти и установить эти библиотеки. На рис. 3-9 показана библиотека Adafruit_SSD1306. Добавление библиотек для дисплея OLED I2C Установите обе библиотеки. Вас могут попросить установить дополнительные библиотеки (например, Adafruit BusIO) для работы с библиотеками Adafruit_SSD1306 и Adafruit GFX.  Тестирование дисплея OLED I2C After the Adafruit_SSD1306 library is installed, you can test your OLED I2C display using program samples from the Adafruit_SSD1306 library. From the File menu, select Examples ➤ Adafruit_SSD1306 ➤ ssd1306_128x64_ i2c. Once you make this selection, you should see the codes shown in Figure 3-10. 87
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-10. Пример программы для дисплея OLED I2C Затем измените эту программу, указав адрес I2C с вашего OLED I2C. отображать. В предыдущем разделе мы нашли адрес 0x3C для дисплея OLED I2C. Замените адрес I2C в display.begin () на 0x3C, как показано на рисунке 3-10. Теперь вы можете скомпилировать и загрузить эту программу в Arduino Nano 33 BLE Sense. Вы должны увидеть несколько форм на OLED-дисплее I2C. На рис. 3-11 показан программный вывод ssd1306_128x64_i2c на OLED-дисплее I2C с 128 × 64 пикселями. 88
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-11. Запуск программы ssd1306_128x64_i2c OLED Если вы видите вывод на дисплей ssd1306_128x64_i2cпрограмма, это означает, что ваш OLED-дисплей I2C работает. Мы будем использовать этот OLED для отображения данных датчика в следующих демонстрациях. Если вы не видите вывод на дисплей, сначала проверьте адрес I2C OLED-дисплея I2C. Затем убедитесь, что ваш OLED-дисплей I2C имеет размер 128 × 64 пикселей. Отображение датчика температуры и влажности  В этом разделе мы создаем программу Arduino для отображения выходных данных датчиков температуры и влажности на OLED-дисплее I2C. Вы можете использовать программу из предыдущего раздела для считывания показаний датчика температуры и влажности. 89
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Откройте программу Arduino и создайте новую программу Sketch. Начните с импорта всех необходимых библиотек для библиотеки I2C, дисплея OLED I2C и датчика HTS221: #include #include #include #include #include <SPI.h> <Wire.h> <Adafruit_GFX.h> <Adafruit_SSD1306.h> <Arduino_HTS221.h> Затем вам нужно определить размер дисплея OLED I2C. Для этой демонстрации я использовал дисплей на 128 × 64 пикселей. Вы можете изменить размер в зависимости от вашего OLED-модуля. #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 64 Затем настройте Adafruit_SSD1306 с адресом I2C модуля OLED и размером дисплея. #define OLED_RESET       4 // Reset pin Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); В функции setup () инициализируйте последовательную связь и библиотеку Adafruit_SSD1306. Вызовите display.begin () с некоторыми параметрами для инициализации вашего OLED-дисплея. void setup() { Serial.begin(115200);    if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {    Serial.println(F("SSD1306 allocation failed"));     for(;;); // Don't proceed, loop forever      }    90
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ После этого проверьте OLED-дисплей I2C, вызвав display () в течение 2 секунд. Затем очистите экран OLED-дисплея:   display.display();   delay(2000); // Пауза на 2 секунды   // Очищаем буфер   display.clearDisplay(); Наконец, инициализируйте датчик HTS221, вызвав функцию HTS.begin (). if (!HTS.begin()) {    Serial.println("Failed to initialize humidity temperature     sensor!"); while (1);      }    Затем вам нужно определить размер дисплея OLED I2C. Для этой демонстрациия использовал дисплей на 128 × 64 пикселей. Вы можете изменить размер взависимости от вашего OLED-модуля. void loop() { float temperature = HTS.readTemperature(); float humidity = HTS.readHumidity();    данные датчика на OLED-дисплее I2C с    Затем отобразите      помощью функции print (). Используйте setTextSize (), чтобы установить размер шрифта для отображаемого текста. display.clearDisplay(); display.setTextSize(1);   display.setTextColor(SSD1306_WHITE);   display.setCursor(0,0);   display.print("Temperature");       91
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ                display.setTextSize(2); display.setCursor(0,12); String temp = String(temperature); temp = temp + " *C"; display.print(temp); Наконец, отобразите данные датчика на последовательном терминале с помощьюфункций Serial.print () и Serial.println (). Serial.print("Temperature = "); Serial.print(temperature); Serial.println(" °C"); = ");      Serial.print("Humidity Serial.print(humidity); Serial.println(" %");                                        display.setTextSize(1); display.setCursor(0,30); display.print("Humidity"); display.setTextSize(2); display.setCursor(0,48); display.print(String(humidity)); display.display(); Serial.println(); delay(1000);       } Сохраните программу как OledSensor, затем скомпилируйте и загрузите программу в Arduino Nano 33 BLE Sense. Вы должны увидеть данные датчика на OLED-дисплее I2C, как показано на Рисунке 3-12. На рис. 3-13 показан вывод программы на Serial Monitor. 92
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-12. Отображение данных датчика на OLED-дисплее I2C Рис. 3-13. Вывод программы из OledSensor 93
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ  Датчик IMU Плата Arduino Nano 33 BLE Sense имеет датчик IMU с микросхемой LSM9DS3. Этот чип содержит датчики IMU, такие как акселерометр, гироскоп и магнитометр. Мы можем использовать библиотеку Arduino_LSM9DS3 для доступа к датчику IMU на Arduino Nano 33 BLE Sense. Вы можете найти эту библиотеку по адресу https://www.arduino.cc/en/Reference/ArduinoLSM9DS1. Чтобы установить библиотеку Arduino_LSM9DS3, используйте Диспетчер библиотек и введите Arduino_LSM9DS3 в текстовое поле поиска. Вы должны увидеть эту библиотеку, как показано на рисунке 3-14. Установите эту библиотеку, нажав Install - Установить. . Рис. 3-14. Установка библиотеки Arduino_LSM9DS1 Следующим шагом является создание программы Sketch для считывания показаний датчиков акселерометра, гироскопа и магнитометра на Arduino Nano 33 BLE Sense. Вам нужно открыть программу Arduino и создать новую программу. Сначала инициализируйте последовательную связь и библиотеки Arduino_LSM9DS1 в функции setup (). 94
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ #include <Arduino_LSM9DS1.h> void setup() {   Serial.begin(115200);   while (!Serial); Serial.println("Started");    if (!IMU.begin()) {    Serial.println("Failed to initialize IMU!");      while (1);      }    } В функции loop () мы читаем датчик ускорения. Проверьте, доступны ли данные датчика, используя IMU.accelerationAvailable (). Затем мы можем прочитать данные датчика, вызвав IMU.readAcceleration (). После этого мы печатаем данные датчика на последовательный терминал. void loop() { float x, y, z;   if (IMU.accelerationAvailable()) {    IMU.readAcceleration(x, y, z);     Serial.print("Accelerometer: "); Serial.print(x);      Serial.print('\t');      Serial.print(y);      Serial.print('\t');      Serial.println(z);      }      Затем считайте показания датчика гироскопа, вызвав IMU.readGyroscope ()    после вызова функции IMU.gyroscopeAvailable (). 95
Serial.print("Gyroscop: "); Serial.print(x); Serial.print('\t'); Serial.print(y); Serial.print('\t'); Serial.println(z);                     }         ПРОГРАММИРОВАНИЕ ДАТЧИКОВ if (IMU.gyroscopeAvailable()) { IMU.readGyroscope(x, y, z);              ГЛАВА 3 if (IMU.magneticFieldAvailable()) { IMU.readMagneticField(x, y, z); Serial.print("Magnetic Field: "); Serial.print(x); Serial.print('\t'); Serial.print(y); Serial.print('\t'); Serial.println(z); }                                          Наконец, мы считываем показания датчика магнитного поля на Arduino Nano 33 BLE Sense, вызывая функцию IMU.readMintageField (), а затем выводим результат на последовательный терминал. Обязательно позвоните в IMU.gyroscopeAvailable () перед чтением данных датчика. delay(300);    } Сохраните эту программу как IMUSensor, затем скомпилируйте и загрузите ее в Arduino Nano 33 BLE Sense. Вы можете увидеть вывод программы на Serial Monitor, как показано на Рисунке 3-15. 96
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-15. Программный вывод из программы IMUSensor  Датчик давления Arduino Nano 33 BLE Sense имеет датчик давления с чипом LPS22HIB. Эта микросхема обеспечивает считывание давления со значениями от 260 до 1260 гПа. В этом разделе мы получаем доступ к датчику давления на Arduino Nano 33 BLE Sense. Мы можем использовать библиотеку Arduino_LPS22HB для доступа к датчику давления на плате Arduino Nano 33 BLE Sense. Вы можете найти эту библиотеку на https://www.arduino.cc/en/Reference/ArduinoLPS22HB. Чтобы получить доступ к датчику давления, установите библиотеку Arduino_LPS22HB в диспетчере библиотек. Вы можете ввести Arduino_LPS22HB в текстовое поле поиска, чтобы отобразить библиотеку, как показано на рисунке 3-16. Щелкните Install Установить, чтобы установить библиотеку. 97
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-16. Installing the Arduino_LPS22HB library Следующим шагом является написание программы Sketch для чтения данных давления на Arduino Nano 33 BLE Sense. Откройте программу Arduino. Мы можем получить доступ к датчику давления с помощью библиотеки Arduino_LPS22HB. Сначала инициализируйте микросхему LPS22HB в функции setup (), вызвав функцию BARO.begin (). #include <Arduino_LPS22HB.h> void setup() { Serial.begin(115200);   while (!Serial);    if (!BARO.begin()) {    Serial.println("Failed to initialize pressure sensor!");while     (1); }      }   98
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ В функции loop () считайте данные датчика давления, вызвавФункция BARO.readPressure (). Затем вы можете распечатать данные датчика на последовательном терминале. Serial.print("Pressure: "); Serial.print(pressure); Serial.println(" kPa");             void loop() { float pressure = BARO.readPressure(); delay(1000);    } Сохраните эту программу как PressureSensor, затем скомпилируйте и загрузите ее в Arduino Nano 33 BLE Sense. Вы можете увидеть вывод программы в Serial Monitor, как показано на Рисунке 3-17. Рис. 3-17. Программный вывод с датчика давления 99
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ  Цифровой микрофон Плата Arduino Nano 33 BLE Sense оснащена цифровым микрофоном. Вернитесь к Рис. 3-1, чтобы увидеть положение микрофона. Этот цифровой микрофон построен на базе MP34DT06JTR. Для работы с цифровым микрофоном на Arduino Nano 33 BLE Sense используйте библиотеку PDM. Эта библиотека устанавливается при установке платы Arduino Nano 33 BLE Sense с программой Arduino. Документ библиотеки PDM можно прочитать по адресуhttps://www.arduino.cc/en/Reference/PDM. Для этой демонстрации мы наносим на график значение амплитуды цифрового микрофона с помощью последовательного плоттера. Вы можете открыть программу Arduino, чтобы начать писать программу. Во-первых, подключите библиотеку PDM. Затем объявите переменную sampleBuffer и функцию samplesRead. #include <PDM.h> short sampleBuffer[256]; // number of samples read volatile int samplesRead; В функции setup () инициализируйте последовательную связь. Передайте функцию onPDMdata () в PDM.onReceive (). Затем вызовите PDM.begin () для инициализации библиотеки PDM. // настраиваем обратный вызов приема данных PDM.onReceive(onPDMdata); // один канал (моно режим) частота дискретизации 16 кГц if (!PDM.begin(1, 16000)) {                   void setup() { Serial.begin(9600); while (!Serial); 100
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ     Serial.println("Failed to start PDM!");     while (1);   } } В функции loop () проверьте значение samplesRead. Если значение samplesRead больше 1, мы читаем данные датчика из sampleBuffer []. Затем распечатайте данные на последовательном терминале. void loop() { if (samplesRead) {    for (int i = 0; i < samplesRead; i++) {      Serial.println(sampleBuffer[i]);        }      // очищаем счетчик чтения     samplesRead = 0; }      }    Реализуйте функцию onPDMdata () для чтения данных с цифрового микрофона. Проверяем, доступны ли данные, с помощью функции PDM.available (). Затем читаем данные датчика, вызвав функцию PDM.read (). Эта функция используется путем передачи ее в функцию PDM.onReceive (). Мы уже вызывали это в функции setup (). void onPDMdata() { // запрашиваем количество доступных байтов int bytesAvailable = PDM.available();      // считываем в буфер сэмпла PDM.read(sampleBuffer, bytesAvailable);      // 16 бит, 2 байта на выборку samplesRead = bytesAvailable / 2; }       101
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Сохраните эту программу как PDMSerialPlotter. Затем вы можете скомпилировать и загрузить программу в Arduino Nano 33 BLE Sense. Вы можете увидеть вывод программы на последовательном плоттере. Если вы говорите в цифровой микрофон на Arduino Nano 33 BLE Sense, вы должны увидеть график сигнала на последовательном плоттере, как показано на рисунке 3-18. Рис. 3-18. Построение значений амплитуды с цифрового микрофона  Цифровой датчик приближения, окружающего света, RGB и жестов Arduino Nano 33 BLE Sense имеет специальный встроенный датчик цифрового приближения, внешнего освещения, цвета RGB и датчиков жестов. Эти датчики используют микросхему APDS9960, поэтому мы можем включить эти датчики в нашу программу Sketch. В этом разделе мы исследуем все датчики внутри микросхемы APDS9960. Для работы с сенсорным чипом APDS9960 мы можем установить библиотеку Arduino_APDS9960 через Диспетчер библиотек. Введите Arduino_APDS9960 в текстовое поле поиска. Вы должны увидеть эту библиотеку, как показано на рисунке 3-19. Щелкните install, чтобы установить библиотеку. 102
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Рис. 3-19. Установка библиотеки Arduino_APDS9960 После установки библиотеки Arduino_APDS9960 вы можете создавать различные программы Sketch, используя датчики микросхемы APDS9960. Подробную информацию о библиотеке Arduino_APDS9960 можно найти на https://www.arduino.cc/en/Reference/ArduinoAPDS9960. Сначала мы создаем программы Sketch с датчиком приближения.  Датчик приближения Датчик приближения можно использовать для проверки наличия объекта. Когда мы поместим наш объект рядом с микросхемой APDS9960, мы получим значение близости. Это значение может находиться в диапазоне от 0 до 255. Для этой демонстрации мы создали программу для включения светодиода, когда значение близости находится между 0 и 50. Откройте программу Arduino, чтобы создать новую программу. Сначала инициализируйте последовательную связь в функции setup (), цифровой режим для вывода и Arduino_APDS9960, вызвав функцию APDS.begin (). #include <Arduino_APDS9960.h> 103
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ void setup() {   Serial.begin(115200);   while (!Serial);   pinMode(LED_BUILTIN, OUTPUT);   if (!APDS.begin()) { Serial.println("Error initializing APDS9960 sensor!");      }    } В функции loop () проверьте, доступно ли значение близости, используя функцию APDS.proximityAvailable (). Затем считайте данные датчика, вызвав функцию APDS.readProximity (). void loop() { if (APDS.proximityAvailable()) {    int proximity = APDS.readProximity();      if(proximity<50){      digitalWrite(LED_BUILTIN, HIGH); }else {             digitalWrite(LED_BUILTIN, LOW); }            // выводим значение в Serial Monitor Serial.println(proximity);      }        // немного подождем перед повторным чтением delay(100); }      104
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Сохраните эту программу как ProximitySensor, затем скомпилируйте и загрузите ее в Arduino Nano 33 BLE Sense. Вы можете попробовать приложить руку к микросхеме APDS9960, а затем посмотреть значение близости в Serial Monitor. Вы можете увидеть результат работы программы на Рис. 3-20. Рис. 3-20. Программный вывод из программы ProximitySensor  Датчик цвета Микросхема APDS9960 имеет датчик цвета. Мы получим значение RGB, которое состоит из красного, зеленого и синего цветов. В этом примере мы считываем цвет с объекта рядом с микросхемой APDS9960. Начните с открытия программы Arduino и создания новой программы. Инициализируйте последовательную связь и микросхему APDS9960, вызвав функцию APDS.begin (). #include <Arduino_APDS9960.h>       void setup() { Serial.begin(9600); while (!Serial); 105
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ   if (!APDS.begin()) {     Serial.println("Error initializing APDS9960 sensor.");   } } В функции loop () проверьте, доступны ли данные датчика цвета с помощью функции APDS.colorAvailable (). Затем мы читаем датчик с помощью APDS.readColor (). Вы получите три значения - красный, зеленый и синий - и распечатаете их на последовательном терминале. void loop() { // проверяем, доступно ли чтение цвета    while (! APDS.colorAvailable()) {    delay(5);      }   int r, g, b;    // читаем цвет   APDS.readColor(r, g, b);    // выводим значения   Serial.print("r = ");   Serial.println(r);   Serial.print("g = "); Serial.println(g);    Serial.print("b = ");    Serial.println(b);    Serial.println();      // немного подождем перед повторным чтением delay(1000); }      106
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Сохраните эту программу как ColorSensor, затем скомпилируйте и загрузите ее в Arduino Nano 33 BLE Sense. Вы можете попробовать поставить любой цвет рядом с микросхемой APDS9960, а затем просмотреть значение датчика цвета в последовательном мониторе. Результат программы на рис. 3-21 был получен для белого объекта. Возможно, вам стоит использовать дополнительный свет, если вы находитесь в плохо освещенной комнате.  Рис. 3-21. Программный вывод ColorSensor Датчик жестов Последний датчик из микросхемы APDS9960 - датчик жестов. На этом чипе мы можем выполнять четыре жеста в следующих направлениях: • UP -ВВЕРХ: от разъема USB к антенне. • DOWN - ВНИЗ: от антенны к разъему USB. • LEFT - СЛЕВА: со стороны аналоговых пинов к цифровым пинам. • RIGHT - ВПРАВО: со стороны цифровых пинов к стороне аналоговых пинов. 107
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ В этом демонстрационном сценарии мы разрабатываем программу Sketch для включения светодиода, когда пользователь выполняет жест в направлениях UP ВВЕРХ и RIGHT - ВПРАВО. В противном случае светодиод погаснет. Начните с открытия программы Arduino и создания новой программы. Инициализируйте последовательную связь и микросхему APDS9960, вызвав функцию APDS.begin (). #include <Arduino_APDS9960.h> void setup() { Serial.begin(115200);   while (!Serial);    pinMode(LED_BUILTIN, OUTPUT);    if (!APDS.begin()) {    Serial.println("Error initializing APDS9960 sensor!");      }    Serial.println("Detecting gestures ..."); }   В функции loop () проверьте, доступны ли данные датчика жестов, используя функцию APDS.gestureAvailable (). Затем прочитайте датчик с помощью APDS.readGesture (). Вы получите четыре значения: GESTURE_UP, GESTURE_DOWN, GESTURE_LEFT и GESTURE_RIGHT. Когда у вас есть значения датчиков для GESTURE_UP и GESTURE_RIGHT, светодиод включается. В противном случае светодиод погаснет. void loop() { if (APDS.gestureAvailable()) { // жест был обнаружен, считываем и распечатываем на серийный монитор    gesture = APDS.readGesture();           108
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ     switch (gesture) {       case GESTURE_UP:         Serial.println("Detected UP gesture");         digitalWrite(LED_BUILTIN, HIGH);         break; case GESTURE_DOWN:        Serial.println("Detected DOWN gesture");          digitalWrite(LED_BUILTIN, LOW);          break;          case GESTURE_LEFT:        Serial.println("Detected LEFT gesture");         digitalWrite(LED_BUILTIN, LOW);         break;          case GESTURE_RIGHT:        Serial.println("Detected RIGHT gesture");digitalWrite         (LED_BUILTIN, HIGH);         break;          default:        // ignore break;          }          }      }    Сохраните эту программу как GestureSensor, скомпилируйте и загрузите ее в Arduino Nano 33 BLE Sense. Вы можете увидеть вывод программы в Serial Monitor. 109
ГЛАВА 3 ПРОГРАММИРОВАНИЕ ДАТЧИКОВ Вы можете переместить руку или предмет от USB-разъема к антенне (направление (UP - ВВЕРХ) или со стороны цифровых контактов в сторону аналоговых контактов (RIGHT - ВПРАВО). В результате вы должны увидеть горящий светодиод на Arduino Nano 33 BLE Sense. Вы также можете выполнить жест DOWN - ВНИЗ или LEFT - ВЛЕВО, чтобы выключить светодиод. Пример вывода на рис. 3-22 является результатом некоторых жестов. Рис. 3-22. Программный вывод из программы GestureSensor Вы можете продолжать практиковаться в разработке программ Sketch, применяя встроенные датчики в плате Arduino Nano 33 BLE Sense.  Резюме В этой главе рассказывалось, как получить доступ к внутренним датчикам на плате Arduino Nano 33 BLE Sense. Мы создали программы Sketch для доступа к IMU, датчику давления, цифровому микрофону, датчику влажности и температуры и датчику жестов. Мы также построили данные датчиков, используя инструмент Serial Plotter и OLED I2C-дисплей. Далее мы переходим к работе с BLE на плате Arduino Nano 33 BLE Sense. 110
ГЛАВА 4 Bluetooth с низким энергопотреблением Плата Arduino Nano 33 BLE Sense построена на базе процессора nRF52840 от Nordic. Этот процессор имеет радиомодуль Bluetooth и BLE. В этой главе мы узнаем, как начать работу с BLE на Arduino Nano 33 BLE Sense. Мы будем создавать программы для использования этого модуля BLE. В этой главе вы узнаете о следующих темах: • Настройка библиотеки BLE на Arduino Nano 33 BLE Sense. • Создание простого BLE-приложения. • Разработка программы управления светодиодами через BLE. • Предоставление данных датчика через службу BLE.  Вступление Плата Arduino Nano 33 BLE Sense - это платформа IoT от Arduino. Эта плата использует модуль Bluetooth для подключения к интернету. Arduino Nano 33 BLE Sense включает поддержку радио BLE. Технология BLE позволяет пользователям рекламировать услуги и обеспечивает взаимодействие между устройствами BLE, такими как мобильные устройства. 111
ГЛАВА 4 BLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ Каждое радио BLE может работать как доска объявлений или как считыватель. Когда оно служит доской объявлений, мы можем предоставить некоторые данные для всех радиомодулей BLE, которые являются читателями BLE. Спецификация BLE также предоставляет механизм уведомления для оповещения читателей об изменении данных. В этой главе мы исследуем, как работать с BLE на Arduino Nano 33 BLE Sense. Затем мы настроили библиотеку BLE для работы с радио BLE на Arduino Nano 33 BLE Sense.  Настройка Bluetooth с низким энергопотреблением Для работы с BLE на Arduino Nano 33 BLE Sense вам понадобится библиотека Arduino BLE. Здесь вы можете выполнять операции BLE, такие как создание и реклама услуг BLE. Подробную информацию о библиотеке ArduinoBLE можно найти по адресу https://www.arduino.cc/en/Reference/ArduinoBLE. Вы можете открыть диспетчер библиотек из меню эскиза, выбрав Включить библиотеку ➤ Управление библиотеками. После выбора этих параметров вы увидите экран, показанный на рисунке 4-1. Рис. 4-1. Добавление библиотеки ArduinoBLE 112
ГЛАВА 4 Введите ArduinoBLE в текстовое поле поиска и нажмите Enter. В появившейся форме вы должны увидеть библиотеку ArduinoBLE. Выберите эту библиотеку и нажмите «Установить». После завершения установки вы можете создать программу Arduino для применения радио BLE.  Демонстрация 1: Hello Arduino BLE В первой демонстрации мы создадим приложение Hello World для радио BLE. Мы рекламируем наш BLE под конкретным именем BLE. Если подключен BLE-ридер, мы настроим его на включение светодиода. Когда BLE-ридер отключен, мы настроим его на выключение светодиода. Следующим шагом будет написание кода программой Arduino.  Использование программы Sketch Мы разработаем программу Arduino для рекламы службы BLE и включения светодиода после подключения считывателя BLE. Начните с открытия программы Arduino. Создайте новую программу. Далее, пошагово напишите коды. Сначала импортируйте библиотеку ArduinoBLE в программу, добавив этот код. #include <ArduinoBLE.h> В функции setup () инициализируйте последовательную связь, светодиод и радиомодуль BLE. Вызовите Serial.begin (), чтобы инициализировать последовательную связь со значением скорости передачи 115200 бод. Установите вывод светодиода на LED_BUILTIN как режим OUTPUT. Чтобы активировать радио BLE на Arduino Nano 33 BLE Sense, мы вызываем функцию BLE.begin (). void setup() {   Serial.begin(115200);   while (!Serial);   pinMode(LED_BUILTIN, OUTPUT); 113
BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ // начинаем инициализацию if (!BLE.begin()) { Serial.println("starting BLE failed!"); while (1); }                    ГЛАВА 4 ­ BLE.setLocalName("HelloBLE"); BLE.setAdvertisedServiceUuid("19B10000-E8F2-537E-4F6CD104768A1214"); // запускаем рекламу BLE.advertise(); Serial.println("Bluetooth device active, waiting for connections...");             ­ Затем установите имя вашего BLE-радио, вызвав BLE.setLocalName (). Это имя будет обнаружено в считывателе BLE. Установите BLE UUID, вызвав функцию BLE.setAdvertisedServiceUuid (). BLE UUID представляет вычисленное 128-битное значение. Вы можете сгенерировать UUID с помощью онлайн-инструмента, доступного по адресу https://www.guidgenerator.com/online-guid-generator.aspx.    } ­ ­ Убедитесь, что ваш BLE UUID соответствует стандарту BLE SIG. Некоторые BLE UUID зарезервированы их службами. Вы можете проверить эти услуги по адресу https://www.bluetooth.com/specifications/assigned- numbers / servicediscovery /. Затем мы ждем входящего BLE-ридера в функции loop (). Мы можем вызвать BLE.contral (), чтобы дождаться считывателей BLE. void loop() {       // ждем централизованного BLE BLEDevice central = BLE.central(); 114
ГЛАВА 4 После того, как BLE-ридер подключен к вашему BLE-радио на Arduino Nano 33 BLE Sense, мы можем получить объект BLEDevice. Затем включите светодиод, вызвав digitalWrite () с передаваемым значением HIGH. Затем мы выполняем бесконечный цикл, проверяя состояние подключения.    if (central) {      Serial.print("Connected to central: ");     Serial.println(central.address());     digitalWrite(LED_BUILTIN, HIGH);     while (central.connected()) {       // ничего не делать     } Если считыватель BLE отключен, вы получите ложное значение от central.connected (). После этого выключите светодиод, вызвав digitalWrite () с передаваемым значением LOW.     digitalWrite(LED_BUILTIN, LOW); Serial.print("Disconnected from central: ");      Serial.println(central.address());      }    } Ваша программа сделана. Вы можете сохранить эту программу как HelloBLE. Тестирование программы Теперь вашу программу Arduino HelloBLE можно скомпилировать и загрузить в Arduino Nano 33 BLE Sense. Для тестирования программы вам понадобится мобильный телефон с платформой Android или iOS. В этой демонстрации используется телефон Android. 115
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ Сначала откройте Serial Monitor, чтобы просмотреть вывод программы HelloBLE. Затем загрузите приложение nRF Connect for Mobile из магазина Google Play, как показано на рис. 4-2, или из магазина Apple Store. Рис. 4-2. Приложение nRF Connect for Mobile в Google PlayМагазин Загрузите и установите приложение nRF Connect for Mobile для своей мобильной платформы. После установки вы можете запускать эту программу. Вы можете увидеть первоначальный результат запуска этого приложения на Android на рисунке 4-3. Следующим шагом будет подключение к Arduino Nano 33 BLE Sense. 116
ГЛАВА 4 Рис. 4-3. Форма приложения nRF Connect for Mobile Нажмите «SCAN - СКАНИРОВАТЬ» на устройстве, чтобы получить список устройств BLE. Вы должны увидеть службу HelloBLE, как показано на рисунке 4-4. Если вы его не видите, попробуйте снова нажать « SCAN - СКАНИРОВАТЬ». 117
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ Рис. 4-4. Отображается служба HelloBLE Затем нажмите CONNECT - ПОДКЛЮЧИТЬ для HelloBLE, выделенного на рисунке 4-4. После этого вы подключаетесь к плате Arduino Nano 33 BLE Sense через радиомодуль BLE. На рис. 4-5 показано, что этот телефон Android подключен к службе HelloBLE через Arduino Nano 33 BLE Sense. 118
ГЛАВА 4 Рис. 4-5. Подключено к службе HelloBLE Чтобы отключиться от службы HelloBLE, вы можете нажать DISCONNECT - ОТКЛЮЧИТЬ. Это заставляет мобильное устройство закрывать радиосвязь BLE. Если вы уже открыли Serial Monitor, вы увидите все сообщения о событиях в этом инструменте. Вы можете просмотреть вывод программы в Serial Monitor на Рис. 4-6. 119
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ Рис. 4-6. Вывод программы в Serial Monitor из HelloBLE Демонстрация 2: Управление LED с  помощью BLE В этой демонстрации мы создадим контроллер светодиодов через радиомодуль BLE, используя службу BLE, чтобы открыть службу светодиодов. Мы можем включать и выключать светодиод с помощью мобильного приложения. Для реализации используем образец программы от Arduino, LED. Далее мы развернем программу Sketch.  Написание программы Мы разработаем программу Arduino для управления светодиодом через радио BLE. Начнем с открытия программы Arduino, чтобы создать новую программу. Далее мы пишем код поэтапно. Сначала импортируем библиотеку ArduinoBLE в свою программу и инициализируем службу BLE с характеристиками BLERead и BLEWrite. Определяем ledPin для LED_BUILTIN. Напишем следующий код: #include <ArduinoBLE.h> 120
ГЛАВА 4 BLEService ledService("19B10000-E8F2-537E-4F6C-D104768A1214"); BLEByteCharacteristic switchCharacteristic("19B10001-E8F2-537E4F6C-D104768A1214", BLERead | BLEWrite); ­ const int ledPin = LED_BUILTIN; Затем инициализируйте режим последовательной связи и цифрового OUTPUT в функции setup (). Кроме того, инициализируйте радиомодуль BLE на Arduino Nano 33 BLE Sense с помощью функции BLE.begin (). void setup() { Serial.begin(9600);   while (!Serial);    // устанавливаем пин светодиода в режим вывода   pinMode(ledPin, OUTPUT);    // начинаем инициализацию   if (!BLE.begin()) {    Serial.println("starting BLE failed!");      while (1); }         Затем установите службу и характеристики BLE с помощью функции addCharacteristic () и инициализируйте значения характеристик, вызвав функцию writeValue (). // установить объявленное локальное имя и UUID службы: BLE.setLocalName("LED");    BLE.setAdvertisedService(ledService);      // добавляем характеристику к сервису ledService.addCharacteristic(switchCharacteristic);      // добавляем услугу    121
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ   BLE.addService(ledService);   // устанавливаем начальное значение характеристики:   switchCharacteristic.writeValue(0); После того, как вы определили свою службу BLE, вы можете начать размещать рекламу с помощью функции BLE.advertise (). Распечатайте сообщение, чтобы узнать, что наш BLE готов для входящих читателей BLE. // запускаем рекламу    BLE.advertise();    Serial.println("BLE LED Peripheral");    } В функции loop () ждем читателей BLE. Используйте BLE.central (). Если считыватель BLE подключен к Arduino Nano 33 BLE Sense, вы получите объект BLEDevice. void loop() { BLEDevice central = BLE.central();    После подключения считывателя BLE к Arduino Nano 33 BLE Sense распечатайте адрес управления доступом к среде (MAC) из считывателя BLE. Затем мы выполняем цикл и ждем входных данных от BLE-ридера с помощью функции value () …………………………………………………………………………………………… ………………………………………………………………………………………………… ………………………………………………………………………………………………… ……………………………………………………………………………………….0000000 0000000000000000000000000000000000000000000 из служебной характеристики BLE. Если пользователь отправляет данные со значением больше 0, загорится светодиод; в противном случае он будет выключен. 122
ГЛАВА 4   if (central) {     Serial.print("Connected to central: ");     // print the central's MAC address:     Serial.println(central.address());     // пока центральный все еще подключен к периферийному:     (central.connected()) { // если удаленное устройство записало в характеристику,        // используем значение для управления светодиодом:        if (switchCharacteristic.written()) {        int val = switchCharacteristic.value();         Serial.println(val);         if (val>0) { // любое значение кроме 0          Serial.println("LED     on");            digitalWrite(ledPin, HIGH); //включит светодиод                       } else { // значение 0 Serial.println(F("LED off"));                                         digitalWrite(ledPin, LOW); //погасит светодиод                       }             }          }        Наконец, распечатайте сообщение на последовательном терминале,      если устройство чтения BLE отключается. Serial.print(F("Disconnected from central: ")); Serial.println(central.address());      }      }    Наша программа сделана. Вы можете сохранить эту программу как LED. 123
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ  Программа тестирования Теперь ваша программа Arduino, LED, может быть скомпилирована и загружена в Arduino Nano 33 BLE Sense. Для тестирования этой программы вам понадобится мобильный телефон на платформе Android или iOS. В этой демонстрации используется телефон Android. Сначала откройте Serial Monitor, чтобы увидеть вывод светодиодной программы. Теперь вы можете открыть приложение nRF Connect for Mobile со своей платформы. В этом приложении вы должны увидеть службу BLE, как показано на рисунке 4-7. Нажмите CONNECT ПОДКЛЮЧИТЬ, чтобы подключиться к Arduino Nano 33 BLE Sense. Рис. 4-7. Светодиодные сервисы отображаются в приложении nRF Connect for Mobile 124
ГЛАВА 4 После подключения вы увидите форму, показанную на рисунке 4-8. Вы можете расширить характеристики услуги BLE. Есть два свойства: READ и WRITE. Рис. 4-8. Дисплей, показывающий характеристики службы BLE Коснитесь WRITE - ЗАПИСАТЬ. Затем установите значение 15, чтобы включить светодиод, как показано на рисунке 4-9. Нажмите SEND ОТПРАВИТЬ, чтобы отправить это значение. Вы должны увидеть, как загорится светодиод на Arduino Nano 33 BLE Sense. Вы также можете отправить значение 00, чтобы выключить светодиод на свойстве WRITE, как показано на рисунке 4-10. 125
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ Рис. 4-9. Записываем значение 15 для включения светодиода 126
ГЛАВА 4 Рис. 4-10. Запись значения 00 для выключения светодиода Если вы уже открыли Serial Monitor, вы увидите информацию о выходных событиях программы, как показано на рисунке 4-11. 127
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ Рис. 4-11. Программный вывод светодиода Демонстрация 3: Мониторинг  датчика в реальном времени В этом разделе мы реализуем мониторинг системы датчика в реальном времени по радио BLE. Мы создадим службу BLE, которая будет предоставлять данные датчика температуры и влажности считывателю BLE. Вы можете изменить свой предыдущий проект TempHumidity. Считыватель BLE получит уведомление об изменении данных датчика. Мы будем предоставлять данные датчика с чипа HTS221 через службу BLE, чтобы считыватель BLE мог прочитать эти данные датчика после подключения к Arduino Nano 33 BLE Sense. Следующим шагом является создание программы Sketch для реализации демонстрации. В этом примере используется мобильный телефон Android. 128
ГЛАВА 4  Написание программы Нам нужно создать новую программу Arduino для создания службы BLE, а затем транслировать данные датчика температуры и влажности на считыватели BLE. Мы создадим сервис BLE с тремя характеристиками, каждая из которых будет выставлять датчики температуры и влажности. Для начала откройте программу Arduino. Сначала вызовите необходимые библиотеки. #include <ArduinoBLE.h> #include <Arduino_HTS221.h> Затем определите службу BLE и три характеристики BLE. Для применения этих функций вам понадобится другой UUID. Вы также должны определить три переменные для хранения данных датчика. BLEService sensorService("16150f38-e7a9-4fe1-ae0848464baf25b2"); BLEStringCharacteristic temperatureSensorLevel("ff99948c-18ff4ed8-942e-512b9b24b6da",    BLERead | BLENotify,15); BLEStringCharacteristic humiditySensorLevel("8084aa6b-6cae     461f-9540-e1a5768de49d",   ­ BLERead | BLENotify,15); ­ ­ // последние данные датчика      float oldTemperature = 0; float oldHumidity = 0; В функции setup () инициализируйте последовательную связь со значением скорости передачи 115200 с датчиком микросхемы HTS, выводом светодиода и модулем BLE. void setup() { Serial.begin(115200); while (!Serial);       129
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ   if (!HTS.begin()) { Serial.println("Failed to initialize humidity temperature      sensor!");     while (1); }    pinMode(LED_BUILTIN, OUTPUT);    if (!BLE.begin()) {    Serial.println("starting BLE failed!");      while (1);      }    Затем определите имя службы BLE и добавьте его к рекламируемой службе. Затем добавьте все характеристики BLE в службу BLE. BLE.setLocalName("TempHumidity");   BLE.setAdvertisedService(sensorService);    sensorService.addCharacteristic(temperatureSensorLevel); sensorService.addCharacteristic(humiditySensorLevel);   BLE.addService(sensorService);    Установите исходные данные по умолчанию для всех характеристик BLE спомощью функции writeValue (). temperatureSensorLevel.writeValue( String(oldTemperature)); humiditySensorLevel.writeValue(String(oldHumidity));      Теперь мы можем начать рекламировать службу BLE, вызвав функцию BLE.advertise (). Читатели BLE узнают этот сервер BLE. BLE.advertise(); Serial.println("Bluetooth device active, waiting for   connections..."); }   130
ГЛАВА 4 В функции loop () мы ждем входящего читателя BLE. После подключения считывателя BLE распечатайте MAC-адрес считывателя BLE. Затем включите светодиод. void loop() { BLEDevice central = BLE.central();   if (central) {    Serial.print("Connected to central: ");     Serial.println(central.address());     digitalWrite(LED_BUILTIN, HIGH);      Если подключен BLE-ридер, будет объект BLEDevice. Выполните цикл, пока не будет отключен считыватель BLE. Внутри цикла вызовите функцию updateTempHumidityLevel (), чтобы обновить данные датчика для службы BLE. while (central.connected()) { //long currentMillis = millis();      updateTempHumidityLevel ();       delay(300);        }        Выключите светодиод после отключения считывателя BLE.      digitalWrite(LED_BUILTIN, LOW); Serial.print("Disconnected from central: ");     Serial.println(central.address()); }      }         Для реализации функции updateTempHumidityLevel () считайте показания датчика температуры с помощью HTS.readTemperature (). Считайте данные датчика влажности с помощью функции HTS.readHumidity (). void updateTempHumidityLevel() { 131
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ   float temp, hum;   temp = HTS.readTemperature();   hum = HTS.readHumidity(); Отправьте данные датчика температуры и влажности в службу BLE с помощью функции writeValue () и выполните эту задачу для всех характеристик BLE. if (temp != oldTemperature) { temperatureSensorLevel.writeValue(String(temp));    oldTemperature = temp;       }       if (hum != oldHumidity) {    humiditySensorLevel.writeValue(String(hum));oldHumidity =    hum;       }       Serial.print(temp);    Serial.print('\t');   Serial.println(hum);       } Сохраните эту программу как TempHumidityBLEService. Тестирование Скомпилируйте и загрузите программу TempHumidityBLEService на плату Arduino Nano 33 BLE Sense. Затем используйте приложение nRF Connect for Mobile. Нажмите «SCAN - СКАНИРОВАТЬ», чтобы отобразить список служб BLE в вашей среде.  132
ГЛАВА 4 На рис. 4-12 показана служба TempHumidity BLE, обнаруженная в приложении nRF Connect for Mobile. Нажмите CONNECT ПОДКЛЮЧИТЬ, чтобы подключить службу TempHumidity BLE. Рис. 4-12. Обнаружение службы TempHumidity BLE После подключения вы увидите свойства и характеристики службы TempHumidity BLE, как показано на рисунке 4-13. 133
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ Рис. 4-13. Подключено к службе TempHumidity BLE Вы можете развернуть Unknown Service - Неизвестная служба, чтобы увидеть характеристики BLE. После его раскрытия вы увидите три характеристики BLE, которые представляют данные датчика TempHumidity, показанные на Рис. 4-14. 134
ГЛАВА 4 Рис. 4-14. Открытие характеристик BLE от TempHumidityBLE сервис ­ Коснитесь значка массива стрелок, выделенного на Рисунке 4-14. Это покажет вам данные датчика от датчика температуры и влажности. На рис. 4-15 показаны данные датчиков температуры и влажности от Arduino Nano 33 BLE Sense. Данные датчика обозначены кружками на рис. 4-15. 135
ГЛАВА 4 BBLUETOOTH С НИЗКИМ ЭНЕРГОПОТРЕБЛЕНИЕМ Рис. 4-15. Отображение датчиков температуры и влажности в сервисе TempHumidity BLE Вы можете продолжать практиковаться, создавая различные службы BLE. Вы также можете создать собственное мобильное приложение для использования сервисов BLE. Резюме В этой главе было рассмотрено, как настроить радиомодуль BLE на плате Arduino Nano 33 BLE Sense. Вы также создавали программы Arduino, применяя радио BLE, начиная с разработки приложения hello world. Вы также управляли светодиодом через радио BLE. Наконец, вы открыли считывателю BLE датчики температуры и влажности. В следующей главе рассказывается, как реализовать встроенный искусственный интеллект в Arduino Nano 33 BLE Sense. 136
ГЛАВА 5 Встроенный искусственный интеллект Arduino Nano 33 BLE Sense с микроконтроллером nRF8240 позволяет нам выполнять приложения искусственного интеллекта (AI). Вы можете использовать библиотеку TensorFlow Lite для реализации граничных вычислений. В этой главе рассказывается, как начать работу с TensorFlow Lite на Arduino Nano 33 BLE Sense. В этой главе вы узнаете о следующих темах: • Установка библиотеки TensorFlow Lite. • Разработка встроенных приложений AI. • Построение классификации жестов.  Вступление Arduino Nano 33 BLE Sense поддерживает встроенный искусственный интеллект с использованием TensorFlow. В этой главе мы узнаем, как начать работу с библиотекой TensorFlow Lite на Arduino Nano 33 BLE Sense. Все демонстрации запускаются на ПК с Windows 10. 137
E ГЛАВА 5  Установка TensorFlow Lite Для работы с TensorFlow Lite вам необходимо установить его с помощью Менеджера библиотек. Введите arduino_tensorflowlite в текстовое поле поиска. Вы должны найти эту библиотеку, как показано на рисунке 5-1. Щелкните Install - Установить, чтобы установить библиотеку TensorFlow Lite. Рис. 5-1. Установка библиотеки TensorFlow Lite Затем вы можете создавать приложения TensorFlow Lite на плате Arduino Nano 33 BLE Sense. Демонстрация: встроенный искусственный интеллект  TensorFlow - это фреймворк машинного обучения. Эта библиотека использует алгоритм глубокого обучения для реализации. Глубокое обучение - это форма обучения с учителем, расширенная от нейронных сетей. Машинное обучение и глубокое обучение выходят за рамки этой книги, но вы можете изучить их, если вам интересно. 138
ГЛАВА 5 TensorFlow Lite - это облегченная версия фреймворка TensorFlow. TensorFlow Lite разработан для небольших библиотек и оптимизирован для встраиваемых плат. Для простой демонстрации воспользуемся примером программы. Вы можете найти примеры программ в меню «Файл», выбрав «Примеры» ➤ arduino_tensorflowlite. Вы должны увидеть hello_world. Щелкните этот образец программы, чтобы получить код программы, показанный на рисунке 5-2. Рис. 5-2. Программа от hello world и TensorFlow Lite 139
E ГЛАВА 5 Сохраните эту программу как hello_world_tensorflowlite. После сохранения программы вы можете проверить папку с программой. Вы должны увидеть несколько файлов в папке с программой. На рисунке 5-3 показаны некоторые файлы из программы TensorFlow Lite. Эта программа выполняет прогнозирование синусоидальных форм. Рис.5-3. Список файлов в программе hello world TensorFlow Lite Теперь вы можете скомпилировать и загрузить эту программу в Arduino Nano 33 BLE Sense. Процесс компиляции может занять несколько минут, потому что эта программа выполнит обучение, а затем загрузит программу в Arduino Nano 33 BLE Sense.После загрузки программы вы можете открыть Serial Plotter, где вы должны увидеть график синусоид. На рис. 5-4 показан вывод программы hello_world_tensorflowlite. 140
ГЛАВА 5 Рис.5-4. Вывод программы с помощью Serial Plotter из программы hello world TensorFlow Lite  Классификация жестов В этом разделе мы создадим программу искуственного интеллекта (ИИ) с нуля, используя TensorFlow Lite на Arduino Nano 33 BLE Sense. Этот проект изменен с https://github.com/arduino/ArduinoTensorFlowLiteTutorials. Наш сценарий заключается в обнаружении жеста. Для этой демонстрации мы хотим обнаружить движение жеста круга и линии, как показано на рисунке 5-5. 141
E ГЛАВА 5 Линейный жест Рис.5-5. Формы модели жестов для круга и линии Круговые и линейные жесты - это формы движения в вертикальном режиме, как показано на рисунке 5-5. Этот набор данных создается с помощью Arduino Nano BLE Sense с датчиком IMU. В процессе обучения мы используем Python для выполнения вычислений машинного обучения с помощью TensorFlow. Вы должны установить Python и некоторые необходимые библиотеки на свой компьютер для выполнения набора обучающих данных с TensorFlow. Для реализации этого проекта необходимо выполнить следующие действия. 142 • Сбор набора данных. • Построение модели. • Разработка классификатора. • Тестирование.
ГЛАВА 5 Сбор набора данных  Мы используем Arduino Nano 33 BLE Sense для создания набора данных. Используйте датчик IMU, чтобы зафиксировать ускорение и гироскоп от вашего жеста. В этом проекте мы используем примерный набор из примерно 119 значений данных. Откройте программное обеспечение Arduino и создайте новое приложение. Сначала подключите библиотеку Arduino_LSM9DS1. Определите размер данных выборки как 119 и определите порог ускорения около 2,5. #include <Arduino_LSM9DS1.h> const float accelerationThreshold = 2.5; // порог const int numSamples = 119; int samplesRead = numSamples; В функции setup () инициализируйте последовательную связь и датчик IMU, вызвав функцию IMU.begin (). Распечатайте заголовок данных на последовательном терминале. void setup() { Serial.begin(9600);   while (!Serial);    if (!IMU.begin()) {    Serial.println("Failed to initialize IMU!");      while (1);      }    // выводим заголовок      Serial.println("aX,aY,aZ,gX,gY,gZ"); } 143
E ГЛАВА 5 В функции loop () проверьте длину данных для samplesRead и numSamples. Если они имеют одинаковый размер, мы вычисляем сумму данных датчика по ускорению, включая установку абсолютного значения. Считайте данные датчика ускорения с помощью функции IMU.readAcceleration (). void loop() { float aX, aY, aZ, gX, gY, gZ;    // ждем значительного движения      while (samplesRead == numSamples) {     if (IMU.accelerationAvailable()) {       // читаем данные ускорения IMU.readAcceleration(aX, aY, aZ);              //подводим итоги       float aSum = fabs(aX) + fabs(aY) + fabs(aZ);       // проверяем, не выше ли оно порога       if (aSum >= accelerationThreshold) {         // сбрасываем счетчик чтения выборки         samplesRead = 0;         break;       }      }    } Если размер samplesRead меньше 119, переходите к считыванию данных с датчика IMU. Затем распечатайте их на последовательном терминале.    while (samplesRead < numSamples) {          //проверяем, доступны ли как новые данные об ускорении, // так и данные гироскопа      if (IMU.accelerationAvailable() && IMU.gyroscopeAvailable()) {       // считываем данные об ускорении и гироскопе 144
ГЛАВА 5       IMU.readAcceleration(aX, aY, aZ);       IMU.readGyroscope(gX, gY, gZ);       samplesRead++;       // выводим данные в формате CSV       Serial.print(aX, 3); Serial.print(',');        Serial.print(aY, 3);        Serial.print(',');        Serial.print(aZ, 3);        Serial.print(',');       Serial.print(gX, 3);       Serial.print(',');       Serial.print(gY, 3);       Serial.print(',');       Serial.print(gZ, 3);       Serial.println();        if (samplesRead == numSamples) {        // добавляем пустую строку, если это последний образец         Serial.println(); }          }        }      }    Сохраните эту программу как IMU_GetData, затем скомпилируйте и загрузите ее в Arduino Nano 33 BLE Sense. Чтобы протестировать нашу программу для создания набора данных, выполните следующие задачи. • Нажмите кнопку сброса на плате Arduino Nano 33 BLE Sense. • Откройте Serial Monitor. 145
E ГЛАВА 5 • Держите доску рукой • Сделайте движение, подобное вертикальному кругу, показанному на Рис.5-5. • Сгенерируйте эти данные как минимум для 10 образцов. • Каждый образец данных (119 точек данных) разделен символами возврата каретки и перевода строки (CRLF). На рис. 5-6 показан результат сгенерированного набора данных после выполнения жеста вертикального круга. Скопируйте и вставьте эти данные в текстовый редактор, например Блокнот в Windows. Рис.5-6. Данные датчика после выполнения кругового жеста Для набора данных на рис. 5-7 была сгенерирована 31 выборка данных. Сохраните эти данные как circle.csv. Выполните аналогичную задачу для жеста вертикальной линии (см. Рисунок 5-5). Скопируйте и вставьте результат создания линейного жеста в текстовый редактор. Сохраните файл как line.csv.Теперь у вас есть два набора данных: circle.csv и line.csv. Вы будете использовать эти файлы для обучения вычислениям глубокого обучения с помощью TensorFlow. 146
ГЛАВА 5 Рис.5-7. Сохранение набора данных датчика в файл CSV  Построение модели В этом разделе мы строим модель на компьютере. Выполнение сложной задачи машинного обучения на встроенной плате затруднено из-за ограниченности аппаратных ресурсов. Поэтому мы реализуем вычисления с глубоким обучением на компьютере. Во-первых, на вашем компьютере должен быть установлен Python. В этой демонстрации используется \ Python версии 3.8.x. Вы можете загрузить и установить Python для своей платформы со страницы https://www.python.org/downloads/. Для Windows убедитесь, что он установлен в PATH, чтобы командная строка Windows могла распознавать команды Python. Для Linux вы должны установить Python pip с собственной платформой. Например, вы можете установить pip в Ubuntu с помощью этой команды. $ sudo apt install python3-pip После установки Python вы можете открыть командную строку терминала или Windows и ввести эту команду. 147
E ГЛАВА 5 $ python --version $ pip --version Вы должны увидеть Python и версию pip на своем терминале. Затем установите библиотеки Python, такие как Pandas и Numpy. Вам также следует установить Jupyter Notebook для редактора Python. Чтобы узнать больше о Jupyter Notebook, посетите официальный сайт https://jupyter.org/. Вы можете установить все необходимые библиотеки с помощью команды pip. Введите эти команды. $ pip install pandas numpy matplotlib $ pip install notebook Вам также следует установить TensorFlow для Python на свой компьютер. Для этого вы можете ввести эту команду. $ pip install tensorflow Этот процесс установки занимает несколько минут. Если у вас есть ошибки относительно компилятора C ++, вам следует установить GCC в Linux / macOS или Visual C ++ в Windows.Теперь вы можете перейти в любую рабочую папку, в которой находятся файлы circle.csv и line.csv. Затем запустите Jupyter Notebook, набрав эту команду. $ jupyter notebook После этого вы должны увидеть открытый браузер. Затем вы можете создать новое приложение и программу Python внутри этой записной книжки. Полную программу можно найти в исходных кодах этой книги. Найдите файл Gesture Training.ipynb. Поместите этот файл в свою рабочую папку. После его открытия у вас должна быть форма, подобная показанной на рисунке 5-8. 148
ГЛАВА 5 Рис. 5-8. Jupyter Notebook запускает программу Python Теперь давайте объясним эту программу. Сначала загрузите все необходимые библиотеки в Python. import matplotlib %matplotlib inline import matplotlib.pyplot as plt import numpy as np import pandas as pd import tensorflow as tf print(f"TensorFlow version = {tf.__version__}\n") Затем постройте набор данных. Например, откройте файл circle.csv и используйте библиотеку Matplotlib для визуализации данных. Вам следует прочитать документацию Matplotlib по адресу https://matplotlib.org/3.3.1/contents.html. 149
E ГЛАВА 5 filename = "circle.csv" df = pd.read_csv(filename,header=0) index = range(1, len(df['aX']) + 1) #plt.rcParams["Рис. .figsize"] = (20,10) plt.plot(index, df['aX'], 'g.', label='x', linestyle='solid',marker=',') plt.plot(index, df['aY'], 'b.', label='y', linestyle='solid',marker=',') plt.plot(index, df['aZ'], 'r.', label='z', linestyle='solid',marker=',') plt.title("Acceleration") plt.xlabel("Sample #") plt.ylabel("Acceleration (G)") plt.legend() plt.show() plt.plot(index, df['gX'], 'g.', label='x', linestyle='solid',marker=',') plt.plot(index, df['gY'], 'b.', label='y', linestyle='solid',marker=',') plt.plot(index, df['gZ'], 'r.', label='z', linestyle='solid',marker=',') plt.title("Gyroscope") plt.xlabel("Sample #") plt.ylabel("Gyroscope (deg/sec)") plt.legend() plt.show() После запуска этих скриптов в Jupyter Notebook вы должны увидеть график файла circle.csv, как показано на рисунке 5-9. Если вы измените значение имени файла на line.csv, вы увидите график line.csv, как показано на рисунке 5-10. 150
ГЛАВА 5 Рис.5-9. Построение набора данных для линейного жеста Рис.5-10. Построение набора данных для жеста круга После этого прочтите все данные из файлов circle.csv и line.csv. Затем разделите набор данных для обучения и тестирования. Для построения модели используйте TensorFlow и Keras (https://keras.io/). Вы можете увидеть следующую архитектуру тензор для вашего проекта. # build the model and train it model = tf.keras.Sequential() model.add(tf.keras.layers.Dense(50, activation='relu')) # reluis used for performance model.add(tf.keras.layers.Dense(15, activation='relu')) model.add(tf.keras.layers.Dense(NUM_GESTURES, activation='softmax')) # softmax is used, because we onlyexpect one gesture to occur per input 151
E ГЛАВА 5 model.compile(optimizer='rmsprop', loss='mse', metrics=['mae'])history = model.fit(inputs_train, outputs_train, epochs=600,batch_size=1, validation_data=(inputs_validate, outputs_validate)) Для завершения этапа обучения этим сценариям требуется несколько минут. Установите значение эпох на 600. Далее вам нужно сохранить вашу модель в файл. Сохраните модель в форме TensorFlow Lite. converter = tf.lite.TFLiteConverter.from_keras_model(model)tflite_model = converter.convert() # Save the model to disk open("gesture_model.tflite", "wb").write(tflite_model) import os basic_model_size = os.path.getsize("gesture_model.tflite")print("Model is %d bytes" % basic_model_size) Эти сценарии создают файл модели с именем gesture_model.tflite. Вы можете проверить это в рабочей папке. Затем преобразуйте содержимое gesture_model.tflite в файл model.h. Технически вы преобразуете двоичный файл в шестнадцатеричную строку. Для Linux / macOS вы можете запускать эти скрипты (сценарии). # linux / mac !echo "const unsigned char model[] = {" > model.h !cat gesture_model.tflite | xxd -i      >> model.h !echo "};"                              >> model.h import os model_h_size = os.path.getsize("model.h") print(f"Header file, model.h, is {model_h_size:,} bytes.") print("\nOpen the side panel (refresh if needed). Double click model.h to download the file.") 152
ГЛАВА 5 Если у вас возникли проблемы с xxd, вам следует установить его. Для Debian / Ubuntu вы можете установить его с помощью этих команд. $ sudo apt update $ sudo apt install xxd Поскольку в Windows нет приложения xxd, мы можем использовать xxd из приложения Vim. Загрузите и установите Vim для Windows с https://www.vim.org/download.php. После его установки вы можете скопировать xxd.exe в рабочую папку. Вам также следует изменить команду cat на команду type в Windows. Вы можете запускать эти сценарии. # windows !echo const unsigned char model[] = { > model.h                                       !type gesture_model.tflite | xxd.exe -i >> model.h !echo }; >> model.h import os model_h_size = os.path.getsize("model.h") print(f"Header file, model.h, is {model_h_size:,} bytes.")print("\nOpen the side panel (refresh if needed). Double clickmodel.h to download the file.") Теперь у вас есть файл model.h, который вы можете использовать для программы Arduino Sketch. На рис. 5-11 показано содержимое файла model.h. 153
E ГЛАВА 5 Рис.5-11. Содержимое файла model.h  Разработка классификатора В этом разделе мы создадим программу Arduino Sketch для обнаружения круговых и линейных жестов. Вы можете создать новую программу с помощью Arduino. Сохраните эту программу как IMU_Classifier. Затем поместите model.h из нашей модели в эту программную папку. Для этой демонстрации мы модифицируем программу кодов IMU_Classifier по адресу https://github.com/arduino/ArduinoTensorFlowLiteTutorials. Установите модели жестов для круга и линии. // массив для сопоставления индекса жеста с именем const char* GESTURES[] = {    "circle", "line"    }; ... 154
ГЛАВА 5 Сохраните эту программу. Убедитесь, что ваша модель, файл model.h, уже находится в этой программной папке. Скомпилируйте и загрузите программу в Arduino Nano 33 BLE Sense. На выполнение этой задачи уйдет несколько минут.  Тестирование После того, как вы загрузили программу, вы можете ее протестировать. Откройте Serial Monitor и сделайте жест вертикального круга. На рис. 5-12 видно, что значение достоверности для круга выше, чем уровень достоверности для линейного жеста. Рис.5-12. Вывод программы после выполнения кругового жеста Затем вы можете попробовать сделать жест вертикальной линии. Из рисунка 5-13 видно, что уровень достоверности линии выше, чем уровень достоверности кругового жеста. 155
E ГЛАВА 5 Рис.5-13. Вывод программы после выполнения линейного жеста Если вы делаете случайные жесты, проверьте, каковы значения уровня достоверности для кругов и линий. Вы можете продолжить свою практику, разработав несколько программ искусственного интеллекта с помощью TensorFlow Lite и Arduino Nano 33 BLE Sense. Резюме В этой главе рассказывается, как изучить TensorFlow Lite на Arduino Nano 33 BLE Sense. Мы запустили образец программы для hello world, а затем создали нашу собственную классификацию жестов с помощью библиотеки TensorFlow Lite на Arduino Nano 33 BLE Sense и с Python TensorFlow на компьютере. 156