Теперь Wi-Fi и Bluetooth LE можно использовать одновременно на платах Arduino с модулем NINA-W102 (ESP32)

Стало известно, что Wi-Fi и Bluetooth LE ранее нельзя было использовать одновременно на платах Arduino, оснащённых беспроводным модулем u-blox NINA-W102 на базе ESP32. Это затрагивало платы Arduino Nano RP2040 Connect , Arduino MKR WiFi 1010 и Arduino Nano 33 IoT .

Эта долгосрочная проблема существовала с момента появления первой платы Arduino с NINA-W10 в 2018 году и означала, что можно было использовать либо Wi-Fi, либо Bluetooth LE, но не оба интерфейса одновременно. Хорошая новость заключается в том, что проблема наконец решена благодаря новой прошивке для модуля и новым библиотекам для Wi-Fi и BLE.

Arduino Nano RP2040 Connect WiFi and Bluetooth Если конкретнее, потребуются следующие библиотеки и прошивка:

  • Библиотека WiFiNINA версии 2.0.0 или новее
  • Библиотека ArduinoBLE версии 2.0.0 или новее
  • Прошивка NINA-W102 версии 3.0.1 или новее

Библиотеки можно легко обновить через Менеджер библиотек в Arduino IDE, а прошивку необходимо обновить с помощью Инструмента обновления прошивки в меню Инструменты > WiFi101 / WiFiNINA Firmware Updater.

Все три платы, упомянутые во вступлении, получают преимущества от этого обновления. Однако плата Arduino UNO WiFi Rev2 не может этого сделать из-за ограниченной памяти, несмотря на то, что также оснащена модулем NINA-W102. Вот пример кода, в котором одновременно используются и Wi-Fi, и Bluetooth:

#include <WiFiNINA.h>
#include <ArduinoBLE.h>

char ssid[] = "yourSSID";       // your network SSID (name)
char pass[] = "yourPassword";   // your network password (use for WPA, or use as key for WEP)

int status = WL_IDLE_STATUS;

void setup() {
 Serial.begin(9600);
 while (!Serial);

 String fv = WiFi.firmwareVersion();
 if (fv < "3.0.0") {
   Serial.println("Please upgrade the firmware, you can't run both WiFi and BLE with this version");
 }

 // attempt to connect to WiFi network:
 while (status != WL_CONNECTED) {
   Serial.print("Attempting to connect to SSID: ");
   Serial.println(ssid);
   // Connect to WPA/WPA2 network.
   status = WiFi.begin(ssid, pass);
   // wait 10 seconds for connection:
   delay(10000);
 }
 Serial.println("Connected to WiFi");

 // Initialize BLE
 if (!BLE.begin()) {
   Serial.println("Failed to initialize BLE!");
   while (true);
 }

 // Set BLE device name and local name
 BLE.setLocalName("ArduinoCNXSoftPeripheral");

 // Create and add a dummy BLE service
 BLEService dummyService("180A"); // UUID for the Device Information service
 BLE.addService(dummyService);

 // Start BLE advertising
 BLE.advertise();
 Serial.println("BLE advertising started...");
}

void loop() {
 // Add logic here to handle BLE connections or WiFi tasks if needed
}

Это всё хорошо, но почему именно ранее нельзя было использовать Wi-Fi и Bluetooth LE одновременно? Причина в том, что Wi-Fi был подключён через SPI, а Bluetooth — через UART, при этом SPI и UART использовали некоторые общие контакты, чтобы сохранить больше GPIO для пользователя, что создавало конфликты при одновременной работе обоих интерфейсов. Решением стало использование SPI как для Wi-Fi, так и для Bluetooth. Однако это не объясняет, почему это заняло так много времени.

Arduino NINA-W102 WiFi SPI +  BLE UART vs WiFI +  BLE SPI
Сравнение: SPI для Wi-Fi + UART для BLE (старый метод) и SPI для Wi-Fi и BLE (новый метод)

Выражаем свою благодарность источнику, с которого взята и переведена статья, сайту cnx-software.com.

Оригинал статьи вы можете прочитать здесь.

0 0 votes
Article Rating
Подписаться
Уведомление о
guest

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

0 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments