Skip to main content

Vision AI V2データのRS485送信

note

この文書は AI によって翻訳されています。内容に不正確な点や改善すべき点がございましたら、文書下部のコメント欄または以下の Issue ページにてご報告ください。
https://github.com/Seeed-Studio/wiki-documents/issues

ハードウェア準備

Seeed Studio XIAO ESP32S3Grove Vision AI V2OV5647-62 FOV カメラモジュール
Raspberry Pi 3B+4B用
Seeed Studio XIAO RS485-拡張ボード

接続方法

まず、2つの拡張ボード、2つのXIAOシリーズ開発ボード、および1つのVision AI V2を準備し、図に従って対応するピンを接続します。このルーチンではXIAO ESP32C3をデモとして使用します。

ステップ1. 2つのRS485拡張ボードと2つのXIAOシリーズ開発ボードを準備し、以下の図に従ってピンを接続します

ステップ2. Vision AI V2を準備し、2つのRS485拡張ボードのうち1つの裏側に送信機として取り付けます

tip

RS485拡張ボードを初めて使用する場合で配線方法がわからない場合は、このリンクをクリックしてください(https://wiki.seeedstudio.com/ja/XIAO-RS485-Expansion-Board/)

モデルの書き込み方法やモデル出力コードの追加方法がわからない場合は、このリンクをクリックしてください(https://wiki.seeedstudio.com/ja/grove_vision_ai_v2_software_support/)。各ステップを詳細に説明しています。

後の使用をスムーズにするために、これら2つのステップをスキップしないでください!

ソフトウェア準備

送信側コード

#include <Seeed_Arduino_SSCMA.h>

#ifdef ESP32
#include <HardwareSerial.h>

HardwareSerial Serial3(1);

// 2つの内部UARTにマッピングされた2つのシリアルデバイスを定義
HardwareSerial atSerial(0);

#else
#define atSerial Serial1
#endif

#define enable_pin D2 // 有効化ピンをD2として定義

SSCMA AI;

void setup()
{
Serial3.begin(115200, SERIAL_8N1, 7, 6); // 115200ボーレート、8データビット、パリティなし、1ストップビットでSerial3を初期化
Serial.begin(9600); // デバッグ出力用にSerialを初期化
AI.begin(&atSerial); // ATシリアルでAIモジュールを初期化

pinMode(enable_pin, OUTPUT); // 有効化ピンを出力として設定
digitalWrite(enable_pin, HIGH); // 有効化ピンをHIGHに設定してAIモジュールを有効化
}

void loop()
{
if (!AI.invoke(1, false, true)) { // AIを呼び出して処理を開始

Serial.println("invoke success"); // 成功メッセージを出力

// パフォーマンス指標を出力
Serial.print("perf: prepocess=");
Serial.print(AI.perf().prepocess);
Serial.print(", inference=");
Serial.print(AI.perf().inference);
Serial.print(", postpocess=");
Serial.println(AI.perf().postprocess);

// 検出されたボックスをループ処理
for (int i = 0; i < AI.boxes().size(); i++) {
Serial.print("Box[");
Serial.print(i);
Serial.print("] target=");
Serial.print(AI.boxes()[i].target);
Serial.print(", score=");
Serial.print(AI.boxes()[i].score);
Serial.print(", x=");
Serial.print(AI.boxes()[i].x);
Serial.print(", y=");
Serial.print(AI.boxes()[i].y);
Serial.print(", w=");
Serial.print(AI.boxes()[i].w);
Serial.print(", h=");
Serial.println(AI.boxes()[i].h);
}

// 検出されたクラスをループ処理
for (int i = 0; i < AI.classes().size(); i++) {
Serial.print("Class[");
Serial.print(i);
Serial.print("] target=");
Serial.println(AI.classes()[i].target);

// ターゲットクラスを確認し、対応するステータスを送信
if (AI.classes()[i].target == 0) {
String status_a = "no people detected"; // 人が検出されなかった場合のステータスを定義
Serial3.println(status_a); // ステータスをSerial3に送信
Serial.println(status_a); // ステータスをシリアルモニタに出力
} else if (AI.classes()[i].target == 1) {
String status_b = "people detected"; // 人が検出された場合のステータスを定義
Serial3.println(status_b); // ステータスをSerial3に送信
Serial.println(status_b); // ステータスをシリアルモニタに出力
}
}
delay(1000); // 次のループまで1秒待機
}
}

コードの詳細な機能

  • ライブラリのインクルード

    • HardwareSerialライブラリをインクルードしてハードウェアシリアル機能を使用。
    • Seeed_Arduino_SSCMAライブラリをインクルードしてAIモジュールを制御。
  • シリアルオブジェクトの作成

    HardwareSerial Serial3(1); 
    HardwareSerial atSerial(0);

    シリアル通信用にSerial3とatSerialオブジェクトを作成。

  • AIオブジェクトの作成

    SSCMA AI;

    AI処理用にSSCMAクラスのインスタンスを作成。

  • パフォーマンス指標

    Serial.print("perf: prepocess=");
    Serial.print(AI.perf().prepocess);
    Serial.print(", inference=");
    Serial.print(AI.perf().inference);
    Serial.print(", postpocess=");
    Serial.println(AI.perf().postprocess);

    AI処理の各段階(前処理、推論、後処理)のパフォーマンス指標を出力。

  • 検出されたボックスのループ処理

    for (int i = 0; i < AI.boxes().size(); i++) {
    Serial.print("Box[");
    Serial.print(i);
    Serial.print("] target=");
    Serial.print(AI.boxes()[i].target);
    Serial.print(", score=");
    Serial.print(AI.boxes()[i].score);
    Serial.print(", x=");
    Serial.print(AI.boxes()[i].x);
    Serial.print(", y=");
    Serial.print(AI.boxes()[i].y);
    Serial.print(", w=");
    Serial.print(AI.boxes()[i].w);
    Serial.print(", h=");
    Serial.println(AI.boxes()[i].h);
    }

    検出されたボックスをループ処理し、ターゲット、スコア、バウンディングボックスの座標を出力。

  • 検出されたクラスのループ処理

    for (int i = 0; i < AI.classes().size(); i++) {
    Serial.print("Class[");
    Serial.print(i);
    Serial.print("] target=");
    Serial.println(AI.classes()[i].target);

    検出されたクラスをループ処理し、ターゲットを出力。

  • マクロ定義

    pinMode(enable_pin, OUTPUT); // 有効化ピンを出力として設定
    digitalWrite(enable_pin, LOW);

    有効化ピンをD2として定義。

  • メッセージ送信

    // ターゲットクラスを確認し、対応するステータスを送信
    if (AI.classes()[i].target == 0) {
    String status_a = "no people detected"; // 人が検出されなかった場合のステータスを定義
    Serial3.println(status_a); // ステータスをSerial3に送信
    Serial.println(status_a); // ステータスをシリアルモニタに出力
    } else if (AI.classes()[i].target == 1) {
    String status_b = "people detected"; // 人が検出された場合のステータスを定義
    Serial3.println(status_b); // ステータスをSerial3に送信
    Serial.println(status_b); // ステータスをシリアルモニタに出力
    }

    人が検出された場合は「PEOPLE DETECTED」を受信側に送信し、検出されなかった場合は「NO PEOPLE DETECTED」を送信。

受信側コード

#include <HardwareSerial.h>

HardwareSerial Serial3(1); // UART2を使用
#define enable_pin D2 // 有効化ピンをD2として定義

void setup() {
Serial.begin(115200); // ハードウェアシリアルを115200ボーレートで初期化
Serial3.begin(115200, SERIAL_8N1, 7, 6); // 115200ボーレート、8データビット、パリティなし、1ストップビットでSerial3を初期化 (RX=D4(GPIO4), TX=D5(GPIO5))

// ハードウェアシリアルが準備完了するまで待機
while(!Serial3);
while(!Serial); // この行は通常不要。Serial.begin()は即座に準備完了するため

pinMode(enable_pin, OUTPUT); // 有効化ピンを出力として設定
digitalWrite(enable_pin, LOW); // 有効化ピンをLOWに設定してデバイスを有効化
}

void loop() {
delay(100); // 100ミリ秒待機
// ハードウェアシリアルからデータが利用可能か確認
if (Serial3.available()) {
String receivedData = Serial3.readStringUntil('\n'); // 改行文字までの文字列を読み取る
Serial.print("Received data: "); // 受信データのラベルを出力
Serial.println(receivedData); // 受信データを直接出力
}
}

コードの詳細な機能

  • ライブラリのインクルード

    • ハードウェアシリアル機能を使用するために HardwareSerial ライブラリをインクルードします。
  • シリアルオブジェクトの作成

    • UART2 を使用して Serial3 オブジェクトを作成します。
  • マクロ定義

    pinMode(enable_pin, OUTPUT); // enable ピンを出力として設定
    digitalWrite(enable_pin, LOW);

    enable ピンを D2 として定義します。

  • セットアップ関数

    Serial3.begin(115200, SERIAL_8N1, 7, 6);

    メインシリアルと Serial3 を初期化し、ボーレート、データビットなどを設定します。これは Vision AI V2 と通信してデータを転送するためのシリアルポートです。

    while(!Serial3);
    while(!Serial);

    すべてのシリアルポートが準備完了になるまで待機し、enable ピンを出力として設定し、デバイスを有効にするために LOW に設定します。

  • ループ関数

    • if (Serial3.available());: Serial3 にデータが利用可能かどうかを 100 ミリ秒ごとに確認します。
    • String receivedData = Serial3.readStringUntil('\n');: データが利用可能な場合、改行文字まで読み取り、受信したデータをメインシリアルに出力します。
  • 結果の出力

    Serial.print("Received data: "); 
    Serial.println(receivedData);

    送信者のメッセージを出力します。

結果チャート

カメラは人を認識すると 「people detected」 を送信し、人を認識しない場合は 「no people detected」 を送信します。受信側は送信者の認識結果をシリアルポートに表示します。

技術サポートと製品ディスカッション

弊社製品をお選びいただきありがとうございます!製品をスムーズにご利用いただけるよう、さまざまなサポートを提供しています。お客様のご希望やニーズに応じた複数のコミュニケーションチャネルをご用意しています。

Loading Comments...