

ABX00087 UNO R4 WiFi開発ボード
Arduino UNO R4 WiFi + ADXL345 + Edgeを使用したクリケットのショット認識
インパルス
このドキュメントでは、Arduino UNO R4 WiFi、ADXL345加速度センサー、Edge Impulse Studioを使用してクリケットのショット認識システムを構築するための完全なワークフローを紹介します。このプロジェクトでは、加速度センサーデータの収集、機械学習モデルのトレーニング、そしてトレーニング済みモデルをArduinoにデプロイしてリアルタイムのショット分類を行います。
このプロジェクトで検討されるクリケットショット:
– カバードライブ
– ストレートドライブ
– プルショット
ステップ1: ハードウェア要件
– Arduino UNO R4 WiFi
– ADXL345 加速度計 (I2C)
– ジャンパー線
– ブレッドボード(オプション)
–USBType-Cケーブル
ステップ 2: ソフトウェア要件
– Arduino IDE(最新版)
– Edge Impulse Studioアカウント(無料)
– Edge Impulse CLI ツール (Node.js が必要)
– Adafruit ADXL345 ライブラリ
ステップ3:ADXL345の配線
次のように、ADXL345 センサーを Arduino UNO R4 WiFi に接続します。
VCC → 3.3V
GND → GND
SDA → SDA(A4)
SCL → SCL(A5)
CS → 3.3V(オプション、I2Cモード用)
SDO → フローティングまたはGND
ステップ4: IDEセンサーを準備する
Arduino IDE にセンサーライブラリをインストールするにはどうすればいいですか?
Arduino IDEを開く
ツール→ライブラリの管理…を開いて、Adafruit ADXL345 Unified Adafruit Unified Sensorをインストールします。
(代わりに LSM6DSO または MPU6050 をお持ちの場合は、それに応じて SparkFun LSM6DSO、Adafruit LSM6DS、または MPU6050 をインストールしてください。)
ステップ5:データ収集のためのArduinoスケッチ
このスケッチをArduino UNO R4 WiFiにアップロードしてください。Edge Impulse用に、加速度計データ(x,y,z)をCSV形式(約18Hz)でストリーミングします。
#含む
#含む
Adafruit_ADXL345_統合アクセル =
Adafruit_ADXL345_Unified(12345);
void セットアップ() {
シリアル.begin(115200);
アクセルの開始()を実行すると、
Serial.println(“ADXL345が検出されませんでした”);
一方(1);
}
accel.setRange(ADXL345_RANGE_4_G);
}
void loop() {
センサーイベント;
accel.getEvent(&e);
シリアル.print(e.acceleration.x);
シリアル.print(“,”);
Serial.print(e.acceleration.y);
シリアル.print(“,”);
Serial.println(e.acceleration.z);delay(55); // ~18 Hz
}
Edge Impulse を設定する

ステップ6: Edge Impulseへの接続
- Arduino シリアルモニターを閉じます。
- コマンドを実行します: edge-impulse-data-forwarder –freqenc 18
- 軸名を入力してください: accX、accY、accZ
- デバイスに名前を付けます: Arduino-Cricket-Board
- Edge Impulse Studio の「デバイス」で接続を確認します。


ステップ7: データ収集
Edge Impulse Studio で → データ取得:
– デバイス: Arduino-Cricket-Board
– センサー: 加速度計(3軸)
– Samp長さ: 2000 ミリ秒 (2 秒)
– 周波数: 18 Hz
少なくとも40秒記録するampクラスあたりの金額:
– カバードライブ
– ストレートドライブ
– プルショット
データ収集例ampレ
カバードライブ
デバイス: Arduino-Cricket-Board
レーベル: カバードライブ
センサー: 3軸センサー (accX、accY、accZ)
Samp長さ: 10000ms
周波数: 18 Hz
Examp生データ:
accX -0.32
accY 9.61
accZ -0.12
ストレートドライブ
デバイス: Arduino-Cricket-Board
レーベル: ストレートドライブ
センサー: 3軸センサー (accX、accY、accZ)
Samp長さ: 10000ms
周波数: 18 Hz
Examp生データ:
accX 1.24
accY 8.93
accZ -0.42
プルショット
デバイス: Arduino-Cricket-Board
レーベル: プルショット
センサー: 3軸センサー (accX、accY、accZ)
Samp長さ:10000ミリ秒
周波数: 18 Hz
Examp生データ:
accX 2.01
accY 7.84
accZ -0.63 
ステップ8:インパルスデザイン
開く Create impulse:
入力ブロック: 時系列データ (3 軸)。
ウィンドウ サイズ: 1000 ミリ秒、ウィンドウの増加 (ストライド): 200 ミリ秒、有効化: 軸、大きさ (オプション)、周波数 18。
処理ブロック:スペクトル分析(別名、動きのスペクトル特徴)。ウィンドウサイズ:1000ミリ秒、ウィンドウの増加(ストライド):200ミリ秒、有効化:軸、振幅(オプション)、最初はすべてデフォルトのままにしておきます。
学習ブロック: 分類 (Keras)。
「インパルスを保存」をクリックします。 
特徴を生成する:
「スペクトル分析」に移動し、「パラメータの保存」をクリックして、トレーニング セットの特徴を生成します。

小さなモデルをトレーニングする
Classifier (Keras) に移動し、次のようなコンパクト設定を使用します。
ニューラルネットワーク: 1~2 層の密な層 (例: 60 → 30)、ReLU
時代: 40~60
学習率: 0.001~0.005
バッチサイズ: 32
データ分割: 80/20 (トレーニング/テスト)
データを保存してトレーニングする
ホールドアウト セットを使用してモデル テストを評価および確認します。
混同行列を検査し、円と上が重なる場合は、より多様なデータを収集するか、微調整する
スペクトルパラメータ(ウィンドウサイズ/ノイズフロア)。
ステップ9: Arduinoへの展開
デプロイメントへ移動:
Arduino ライブラリを選択します (C++ ライブラリも動作します)。
EON コンパイラ (使用可能な場合) を有効にして、モデル サイズを縮小します。
.zipをダウンロードし、Arduino IDEで「スケッチ」→「ライブラリを含める」→「.ZIPライブラリを追加」を選択します。これにより、amp静的バッファや連続的な File →例ampレ →
プロジェクト名 – Edge Impulse。Arduino UNO EK R4 WiFi + ADXL345用の推論スケッチ。
ステップ10:Arduino推論スケッチ
#含む
#含む
#含む// Edge Impulseヘッダーに置き換える
Adafruit_ADXL345_統合アクセル =
Adafruit_ADXL345_Unified(12345);
静的ブールdebug_nn = false;
void セットアップ() {
シリアル.begin(115200);
while (!Serial) {}
アクセルの開始()を実行すると、
Serial.println(“エラー: ADXL345が検出されません”);
一方(1);
}
accel.setRange(ADXL345_RANGE_4_G);
}
void loop() {
浮動小数点バッファ[EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE] = {0};
(size_t ix = 0; ix < EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE; ix +=
3) {
uint64_t next_tick = micros() + (EI_CLASSIFIER_INTERVAL_MS *
1000);
センサーイベント;
accel.getEvent(&e);
バッファ[ix + 0] = e.acceleration.x;
バッファ[ix + 1] = e.acceleration.y;
バッファ[ix + 2] = e.acceleration.z;
int32_t 待機 = (int32_t)(next_tick – micros());
if (wait > 0) delayMicroseconds(wait);
}
signal_t シグナル;
int err = numpy::signal_from_buffer(バッファ,
EI_CLASSIFIER_DSP_INPUT_FRAME_SIZE、&signal);
(err != 0) の場合、戻り値:
ei_impulse_result_t 結果 = {0};
EI_IMPULSE_ERROR res = run_classifier(&signal, &result,
デバッグ_nn);
(res != EI_IMPULSE_OK) の場合、戻り値:
(size_t ix = 0; ix < EI_CLASSIFIER_LABEL_COUNT; ix++) の場合 {
ei_printf(“%s: %.3f “, result.classification[ix].label,
結果.分類[ix].値);
}
#EI_CLASSIFIER_HAS_ANOMALY == 1 の場合
ei_printf(“異常: %.3f”, result.anomaly);
#終了
ei_printf(“\n”);
}
出力例amp上:
ヒント:
EI_CLASSIFIER_INTERVAL_MS をデータフォワーダーの周波数(例:100 Hz → 10 ms)と同期させてください。Edge Impulse ライブラリは、この定数を Impulse から自動的に設定します。
連続検出(スライディングウィンドウ)が必要な場合は、連続exから開始します。ampEI ライブラリに含まれるファイルを使用し、ADXL345 の読み取りと交換します。
近々ビデオチュートリアルも追加予定ですので、お楽しみに。 https://www.youtube.com/@RobuInlabs
まだ疑問が残る場合は、Edged Impulse の次のビデオをご覧ください。 https://www.youtube.com/watch?v=FseGCn-oBA0&t=468s

ドキュメント / リソース
![]() |
Arduino ABX00087 UNO R4 WiFi開発ボード [pdf] ユーザーガイド R4 WiFi、ADXL345、ABX00087 UNO R4 WiFi開発ボード、ABX00087、UNO R4 WiFi開発ボード、WiFi開発ボード、開発ボード、ボード |
