Освоение PSoC 6 Pioneer Board с IoT Add-On Shield: руководство разработчика
Введение
PSoC 6 — последнее дополнение к мощной серии процессоров PSoC от Cypress. PSoC 6 Pioneer IoT Add-On Shield — плата разработки для этой линейки, оснащенная встроенным отладчиком, Arduino-совместимыми заголовками, виджетами CapSense и многим другим, всё связано с процессором PSoC 6. Процессор — двухъядерный: Cortex-M0+ (низкое потребление) и Cortex-M4 (высокая производительность), объединенные через общие периферийные блоки и память.
Это руководство покажет, как начать работу с Pioneer Board, используя Pioneer Add-on Shield для расширения возможностей PSoC 6. Мы продемонстрируем обмен данными с Raspberry Pi через BLE и WiFi (с модулем XBee WiFi), а также взаимодействие между PSoC 4 BLE Pioneer Board и PSoC 6 Pioneer Board по BLE.
Необходимые материалы
Примеры рассчитаны на PSoC 6 Pioneer Kit, приобретаемый напрямую у Cypress или Digi-Key.
Также понадобится Pioneer Add-on Shield. Нужен модуль XBee WiFi. Есть несколько вариантов XBee WiFi в зависимости от конфигурации: Trace, RP-SMA с внешней антенной 2.4 ГГц или Wire. Проще всего взять XBee с проводной антенной.
Также требуется Raspberry Pi 3 Starter Kit. Он станет целью для связи от PSoC 6 Pioneer Board. Можно купить Pi 3 отдельно с макетной платой, перемычками, резисторами и светодиодами, но стартовый комплект — отличная сделка и стоит того.
Обзор железа
Рассмотрим детально особенности Pioneer Kit IoT Add-on Board.
- Слот MicroSD-карты — пины сопоставлены с SPI-периферией на большинстве Arduino-совместимых плат, включая PSoC 6 BLE Pioneer Board.
- Заголовок XBee — рассчитан на стандартный форм-фактор XBee. Совместим со всеми официальными модулями XBee.
- Qwiic-разъем — добавляет поддержку всех модулей SparkFun Qwiic. Питание 3.3 В.
- MicroB USB разъем питания — линии данных не подключены. Дает 5 В на 3.3 В стабилизатор для XBee, перекрывая 5 В от Arduino-заголовка, позволяя высокомощным XBee (сотовые, WiFi, Pro) работать корректно.
- Кнопки D7 и D9 — две пользовательские кнопки, подключенные к пинам D7 и D9 (P0.2 и P13.1 на PSoC 6, или P1.0 и P0.4 на PSoC 4 BLE).
- Стабилизатор 3.3 В — импульсный, способен выдавать до 1.5 А в зависимости от входного питания. Питание от 5 В на Arduino-пинах или MicroB разъеме. Питает только заголовок XBee.
- Уровневый сдвигающий буфер — понижает 5 В сигналы до 3.3 В. Позволяет использовать плату в 3.3 В или 5 В системах.
- Схема сдвига уровня I2C — преобразует I2C сигналы с 3.3 В на 5 В при необходимости.
- Джампер выбора напряжения питания — выбирает уровень, до которого сдвигает I2C схема. По умолчанию 3.3 В. Установите 5 В для 5 В систем. И PSoC 4, и PSoC 6 Pioneer BLE — 3.3 В системы.
- Светодиод XBee DIO5 — DIO5 по умолчанию выполняет полезные функции, особенно на WiFi модуле, где показывает подключение к настроенной WiFi сети.
Пример: WiFi к Raspberry Pi с использованием PSoC 6 Pioneer Kit
Пример демонстрирует отправку сигнала на Raspberry Pi через WiFi. Показывает, как обращаться к XBee WiFi модулю, межпроцессорное взаимодействие двух ядер PSoC 6, а также прием и разбор команд на Raspberry Pi.
Требуется некоторая настройка, давайте пройдемся по ней.
Настройка PSoC 6 Pioneer Kit: Железо
Сторона Pioneer Kit тривиальна: вставьте XBee WiFi модуль в Pioneer IoT Add-on Shield и установите щит в Arduino-заголовок Pioneer Kit Board.
Сторона Raspberry Pi требует больше объяснений. Нужно настроить и железо, и софт на Raspberry Pi.
Настройка PSoC 6 Pioneer Kit: Софт
Примечание: Поддержка PSoC 6 доступна только в Creator 4.2 или новее!
Программный проект для Pioneer Kit доступен на GitHub.
PSOC 6 PIONEER KIT SOFTWARE DOWNLOAD
После скачивания и распаковки откройте пример (XBee_WiFi_Example) в PSoC Creator.
Прежде всего, откройте файл «main_cm4.c» и внесите пару изменений. Найдете секцию кода:
char ssid[] = "your_ssid_here";
char rpi_ip[] = "raspi_ip_here";
char ssid_pw[] = "wifi_pw_here";
int dest_port = 5000;
char encrypt_mode = WPA2;
Очевидно, что нужно поменять эти настройки под свою сеть. encrypt_mode может быть WPA, WEP, WPA2 или (надеемся, нет!) NO_SECURITY. rpi_ip — это IPv4-адрес (например, «10.8.253.193»), который можно получить командой ifconfig в командной строке Raspberry Pi (см. ниже инструкции по открытию терминала) в разделе wlan0.
Для прошивки платы подключите её к ПК через входящий USB-A — USB-C кабель. Нажмите кнопку «Program» на панели инструментов для автоматической сборки и прошивки.
Может появиться окно с выбором целевого устройства для прошивки. Неважно, какой пункт выбрать под «KitProg2», оба прошьют флеш корректно.
Настройка Raspberry Pi: Железо
Сначала посмотрим, как подключено железо:
Как видите, мы подключили светодиод (с резистором 330 Ом) к пинам 3 (GPIO 2) и 6 (земля) Raspberry Pi. Это позволит переключать GPIO2 и видеть результат на светодиоде.
Настройка Raspberry Pi: Софт
Предполагаем, что у вас Raspberry Pi с последним Raspbian (полная установка, не lite), подключенный к клавиатуре, мыши, монитору и локальной WiFi сети. Если нет — настройте это за пару минут. Можно ознакомиться с нашим туториалом по настройке Pi.
Начнем с рабочего стола Raspberry Pi. Должен быть экран примерно такого вида:
Нужно нажать маленький логотип вверху экрана (показан ниже) для открытия командной строки. Дальше предполагаем, что терминал открыт.
Откроется окно командной строки. Это позволяет напрямую выполнять команды на Raspberry Pi.
Начнем с установки Flask. Flask — веб-фреймворк для Python, позволяющий создавать веб-фронтенд, запускающий Python-скрипты на бэкенде. Введите команду и нажмите Enter:
sudo pip install flask
Много текста пробежит, в конце Flask будет установлен.
Следующий шаг — установка нашего софта с GitHub:
git clone https://github.com/sparkfun/Flask_Tutorial
cd Flask_Tutorial
sudo python Flask_Tutorial/Python/app.py
Это запустит приложение и начнет слушать TCP/IP ввод от Pioneer board. Теперь можно включать/выключать светодиод на Raspberry Pi, нажимая кнопки D7 и D9 на IoT Shield. Классно!
Что происходит? Часть 1: Pioneer Kit
Посмотрим на PSoC 6 проект с высоты. В Workspace Explorer слева шесть записей верхнего уровня: схема («TopDesign.sch»), Design Wide Resources («XBee_WiFi_Example.cydwr»), исходники Cortex-M0+ («CM0p (Core 0)»), исходники Cortex-M4 («CM4 (Core 1)»), общие файлы («Shared Files») и сгенерированные IDE файлы («Generated_Source»).
Схема проста: пара светодиодов, пара переключателей и UART для передачи данных к/от XBee WiFi модуля. Светодиоды в текущей реализации не используются.
Пропустим содержимое .cydwr — там назначение пинов, генерация тактовых, константы конфигурации ядер.
Переходим к исходникам Cortex-M0+. Верхний уровень имеет пять записей: «Header Files», «Source Files» и три других файла. Нас интересует только «main_cm0p.c» — точка входа для кода на Cortex-M0+.
Как видно из структуры, есть два отдельных кодовых базиса для двух ядер. «main_cm0p.c» — точка входа для Cortex-M0+, который затем запускает Cortex-M4. Аналогичная структура для Cortex-M4.
В «Shared Files» большинство файлов автогенерированы, кроме «ipc_common.c» и «ipc_common.h» — хелперы для межпроцессорного взаимодействия, разработанные для проекта.
Файл main_cm0p.c
Этот файл обрабатывает всю активность Cortex-M0+: мониторинг двух кнопок и отправку сигнала Cortex-M4 при нажатии.
Однако это не так просто, так как Cortex-M4 должен очищать сигнал после обработки, что означает доступ нескольких процессов к одним данным. При множественных процессах, работающих с одними данными, нужно учитывать коллизии записи. Что если один процесс меняет данные, пока другой тоже их меняет? Для решения используем систему защищенных чтений и записей, настроенную в файлах «ipc_common».
Для понимания нужно знать концепцию IPC-канала. IPC-каналы используют семафоры для записи данных из одного процесса в другой с гарантией отсутствия коллизий между ядрами. В начале выполнения каждого ядра нужно установить конечные точки для IPC-каналов. Рассмотрим две строки:
IPC_STRUCT_Type *D9IpcHandle;
D9IpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(7);
Первая создает указатель на структуру, описывающую характеристики IPC-канала. Вторая устанавливает её на конкретное местоположение в памяти — системный IPC-канал 7. Каналы 0-6 зарезервированы системой.
Далее нужно сообщить другому ядру, какой адрес памяти ассоциирован с этим IPC-каналом:
while(Cy_IPC_Drv_SendMsgPtr(D9IpcHandle, CY_IPC_NO_NOTIFICATION, &D9Button) != CY_IPC_DRV_SUCCESS);
D9Button — переменная, настроенная ранее. Вызов в цикле while, чтобы повторять до подтверждения получения информации другим процессом (кодом на Cortex-M4). Также ждем освобождения блокировки переменной, указывая, что Cortex-M4 закончил чтение указателя.
while(Cy_IPC_Drv_IsLockAcquired(D9IpcHandle));
Затем входим в бесконечный цикл приложения, где кастомные функции ReadSharedVar() и WriteSharedVar() обновляют общие переменные, коммуницирующие статус кнопок с другим ядром. Разберем их позже.
Файл main_cm4.c
В main() Cortex-M4 повторяем те же операции по настройке IPC-канала:
IPC_STRUCT_Type *D9IpcHandle;
D9IpcHandle = Cy_IPC_Drv_GetIpcBaseAddress(7);
После завершения вызываем код для «перехвата» сообщения, отправленного из Cortex-M0+, содержащего адрес общей переменной:
while (Cy_IPC_Drv_ReadMsgPtr(D9IpcHandle, (void *)&D9Button) != CY_IPC_DRV_SUCCESS);
Опять в while для ожидания отправки сообщения от Cortex-M0+. Затем освобождаем блокировку IPC-канала, чтобы Cortex-M0+ знал, что может продолжить и использовать канал в будущем. Не нужно в while, так как вызов однократный — разблокировка происходит сразу.
Cy_IPC_Drv_LockRelease(D9IpcHandle, CY_IPC_NO_NOTIFICATION);
После настраиваем XBee WiFi shield для доступа к локальной сети. Код не дублируем, он хорошо задокументирован в примере.
В бесконечном цикле приложения снова вызываем ReadSharedVar() и WriteSharedVar() для доступа к переменным статуса кнопок, общим с Cortex-M0+. Посмотрим, что делают эти функции.
Read More Info……
Using the PSoC 6 Pioneer Board with the Pioneer IoT Add-on Shield
Производственный процесс
- Интеграция метеостанции с CWOP: практическое руководство
- Интеграция импульсного радара Acconeer A111 с Raspberry Pi: практическое руководство
- Начало работы с IoT и MQTT: урок без кода для ESP8266
- Создание умного робота с Bridge Shield — интеграция Raspberry Pi и Arduino
- Расширение GoPiGo v2 на Windows 10 IoT Core для Raspberry Pi 3
- Раскрытие силы визуальных данных в IoT-экосистеме
- IoT революционизирует полевой сервис: предиктивное обслуживание и выше ROI
- Как умные города используют IoT, микросервисы и дашборды для эффективного управления активами
- IoT World: внутри Big-Data решения Vertica для IoT-аналитики
- Платформа Lumada ИоТ Hitachi: объединение промышленных инсайтов для умного производства