概要
昨今のロボコンでは、WiFiの混線が多くみられる為、いかにそれらを回避するかが重要です。主な手としてロボコンで主流の2.4 GHzから5 GHzにするというものがありますが、マイコンで5 GHz WiFi対応のものはほぼ存在しておらず、ROS等でスマホ・パソコンを使うしか方法はありませんでした。
しかし、知名度は非常に低いものの、5 GHz対応のマイコンを発見したのでこれをロボコンに使えないかと考えました。2025年度の高専ロボコン岐阜高専Bチームで実際に使用し問題なく使えました。やったね
もちろん知名度が低いので日本語の情報なんてある訳ないです。そこで、ここの記事に一般的な使い方を記しておこうと思います。たぶん日本語の情報はこの記事しかないです。
BW16
introduction
BW16はRealtek RTL8720DNを搭載した2.4 GHz/5 GHz WiFi・Bluetooth5.0をサポートするMCUです。Realtekといえばあのカニコンチップで有名なところです。
フレームワークもArduinoに対応していて、WiFiのプログラムもESP32のWiFi.hとほぼ同じなのでかなり使いやすいと思います。
performance
BW16の性能は以下の通りです。
- 内蔵チップ: RTL8720DN
- CPU: ARM-Cortex-M4・ARM-Cortex-M0 (デュアルコア)
- クロック周波数: 最大200 MHz(M4)
- アーキテクチャビット数: 32 bit
- 内蔵RAM: 4 MB(SRAM)
- 内蔵ROM: 2 MB(Flash)
- 電源電圧: 3.3 V
- インターフェイス: UART, I2C, SPI, SWO
- インターフェイス(無線): 2.4GHz/5GHz WiFi, Bluetooth 5.0
- 技適番号: 210-140552 技適番号確認
Pin Mapping
| GPIO Number | ADC | PWM | UART | SPI | I2C | IR | SWD |
|---|---|---|---|---|---|---|---|
| PA7 | Log_TX | ||||||
| PA8 | Log_RX | ||||||
| PA27 | SWD_DIO | ||||||
| PA30 | ○ | ||||||
| PB1 | Serial_TX | ||||||
| PB2 | Serial_RX | ||||||
| PB3 | A2 | SWD_CLK | |||||
| PA25 | ○ | I2C_SCL | IR_TX | ||||
| PA26 | ○ | I2C_SDA | IR_RX | ||||
| PA15 | SPI_SS | ||||||
| PA14 | SPI_SCLK | ||||||
| PA13 | SPI_MISO | ||||||
| PA12 | SPI_MOSI |
UARTについて
UARTにはLog_UARTとSerial_UARTがあります。Log_UARTはプログラムの書き込み、デバッグ用に使用します。Serial_UARTは他マイコンとの通信に使用します。
setup
1. OS環境
BW16はWindows OS、mac OS、Linux OS(Ubuntuのみ)をサポートしていますが、不具合の発生具合を鑑みるとWindowsで開発した方が良さそうだと感じました。
ちなみに、Arduinoフレームワークの場合は現時点でArduino IDEしか使うことが出来ません。
platformIOではまだボードに対応していませんが、今後対応する可能性もあるように見えます。
GitHub.com - platfromIO issues: "Add support for Realtek MCUs"
2. Arduino IDEでのセットアップ
Arduino IDEはバージョン1.6.5以降をサポートしています。
Arduino IDEの「ファイル」→「基本設定」に移動して「追加のボードマネージャのURL」欄に以下のURLを貼り付けます。
https://github.com/ambiot/ambd_arduino/raw/master/Arduino_package/package_realtek_amebad_index.json
その後、ボードマネージャーを開いて"Realtek"と検索すると「Realtek Ameba Boards (32-bits ARM Cortex-M33 @200MHz)」というものが出てくるのでそれをインストールしてください。
これでArduino IDEにボード追加ができたはずです。
インストール後、「ツール」→「ボード」→「Realtek Ameba Boards (32-bits ARM Cortex-M33 @200MHz」→「BW16(RTL8720DN)」で、現在接続されているボードとしてAmebaDを選択してください。
3. プログラムの書き込み
次に、プログラムを書き込んでいきます。BW16を接続し、ボードとシリアルポートを指定した状態から説明します。
BW16に書き込むのが初めての場合、デフォルトの B&T ファームウェアが書き込まれている場合があります。この場合別にLチカのプログラムを書き込んだとしても、BW16のプログラムは書き換えられず、デフォルトのB&T ファームウェアのままになってしまいます。
なので先にファームウェアを抹消する必要があります。「ツール」→「Erase All Flash Memory」→「Erase only」を選択し、書き込みボタンを押します。そうすることでファームウェアを消去することが出来ました。以降はこの操作が無くても書き込みできるようになります。
ファームウェア消去後は「Erase All Flash Memory」を「Disable」に戻しておくことを忘れないようにしましょう。
[important]
書き込みモードですが、手動で書き込みするか自動で書き込みするかで少し方法が変わってきます
- 手動:ESP32と同じように「Burn」ボタンを押したまま、「RST」ボタンを押して離し、「Burn」ボタンを離す
- 自動:「ツール」→「Auto Flash Mode」→「Enable」を選択する。自動書き込み回路が内蔵されているボードのみ自動書き込みを使用できます
以下のコードはBW16におけるLチカのサンプルコードです。
#define LED1 PA12
void setup() {
pinMode(LED1, OUTPUT);
}
void loop() {
digitalWrite(LED1, !digitalRead(LED1));
delay(500);
}
書き込みが完了するとLEDが点滅してくれます。お疲れさまでした。
それでは実際に5 GHz WiFiを使ってみましょう。こんな感じです。サンプルコードもあるのでそっちを参考にした方が良いと思います((((((
#include "Arduino.h"
#include "WiFi.h"
#include "WiFiUdp.h"
#include <stdio.h>
#include <stdlib.h>
#define LED1 PA12
#define LED2 PA13
char SSID[] = "WiFiのSSID";
char PASSWORD[] = "WiFiのパスワード";
const char* host = "送信先デバイスのIPアドレス";
int port = 8000;
char message[] = "Hello BW16!";
WiFiUDP Udp;
extern "C" void NVIC_SystemReset(void);
void setup() {
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
Serial.begin(115200);
Serial.println("[info] UART initialized");
Serial.println("[info] WiFi initializing");
WiFi.begin(SSID, PASSWORD);
Serial.println("[info] WiFi initialized");
int retryCount = 0;
while (WiFi.status() != WL_CONNECTED && retryCount < 5) {
delay(500);
digitalWrite(LED1, HIGH);
delay(300);
digitalWrite(LED1, LOW);
retryCount++;
Serial.print("[warn] WiFi connecting... Retry ");
Serial.println(retryCount);
}
if (WiFi.status() != WL_CONNECTED) {
Serial.println("[error] WiFi failed 5 times. Restarting...");
delay(1000);
NVIC_SystemReset(); // 再起動
}
Serial.println("[info] Connected");
Udp.begin(port);
digitalWrite(LED1, HIGH);
}
void loop() {
Udp.beginPacket(host, port);
Udp.write(message);
Udp.endPacket();
digitalWrite(LED1, !digitalRead(LED1));
delay(1000);
}
最後に
2.4 GHz帯がダメだった時の保険的な意味で使用していました。当日は会場のWiFiが2.4 GHz帯を含め空いており混線は起こらなかったのでよかったです。
2024年度でも先輩達のAチームが5 GHz WiFiを使用していましたが、海外旅行者向けのWiFiサービスが5 GHzの全チャンネルを独占しており非常に治安が悪く、結果通信が上手くいかなかったようなのでロボコンにおける無線通信は本当に会場に左右されると思います。5 GHzのみではなく2.4 GHzと合わせて使うというやり方が一番いいと思います。
次回はBW16を自作基板で使用するための回路図を紹介します。よいロボコンライフを~