シリアル通信 II

OpenMV シリアルポートデバッグ拡張ボード

OpenMV シリアルポートデバッグ拡張ボードは、cp2104 チップを介して OpenMV のシリアルポート UART3 をコンピュータに接続し、USB 経由でシリアルポートデバッグ拡張ボードに接続します。これにより、OpenMV のシリアルポート UART3 で送信されたデータを確認できます。

https://singtown.com/product/49906

OpenMV とシリアルポートデバッグ拡張ボードは、2 本の USB ケーブルでコンピュータに接続します。

TTL-USB モジュールを使用する

OpenMV シリアルポートデバッグ拡張ボードをお持ちでない場合は、TTL-USB モジュールを使用することもできます。 これは OpenMV シリアルポートデバッグ拡張ボードと同じ機能を持っています。

まず理解しておくべきこととして、Arduino、OpenMV、esp8266、stm32、51 など、さまざまなマイクロコントローラで 使用されるシリアルポートは、いずれも TTL シリアルポート です。RS485 でも RS232 でもありません!

TTL シリアルポートの電圧は 3.3V または 5V、RS232 の電圧は ±15V、RS485 の電圧は 5V ですが、2 本のデータ線は 異なるプロトコルの差動線であるため、これらを相互に流用することはできません。

ここで使用するモジュールは TTL-USB 変換モジュールです(cp2104 モジュールがおすすめです。やや高価ですが 品質が良好です):

接続図(共通グラウンドと RX/TX のクロス接続に注意してください):

OpenMV FTDI
P4(TX) RX
P5(RX) TX
GND GND

TTL モジュールの USB 側をコンピュータに接続すると、シリアルポートが表示されます。

Singtown シリアルポートアシスタント

まず SingTown シリアルポートアシスタントをダウンロードしてください:\ https://singtown.com/singtownserialport/

SingTown シリアルポートアシスタントは、Windows、macOS、Linux に対応した、シンプルで使いやすいオープン ソースのシリアルポートアシスタントです。

プログラムを実行する

一部のソフトウェアでは HEX(16進数)か ASC(ASCII)を選択できることに注意してください。文字列を表示するには ASC を選択する必要があります。

OpenMV 上で uart.write("hello world!") を実行するプログラムです(前のセクションを参照)。

シリアルポートアシスタントには "Hello world!" と表示されます。

次のプログラムを実行すると:

import csi, image, time
import json
csi0 = csi.CSI()

from machine import UART
#from pyb import UART
# カラートラッキングを本当にうまく機能させるには、照明が一定に保たれる、非常に、非常に、
# 非常に管理された環境にあるのが理想的です...
yellow_threshold   = ( 46,  100,  -68,   72,   58,   92)
# 緑色のものをトラッキングする場合は、上記の設定を調整する必要があるかもしれません...
# フレームバッファ内の領域を選択して色設定をコピーしてください。

csi0.reset() # カメラセンサーを初期化します。
csi0.pixformat(csi.RGB565) # RGB565を使用します。
csi0.framesize(csi.QQVGA) # 速度を優先してQQVGAを使用します。
csi0.snapshot(frames=10) # 新しい設定を反映させます。
csi0.auto_whitebal(False) # これをオフにします。
clock = time.clock() # FPSを記録します。

# OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7, OpenMV2 M4 の UART(3) は P4-TX P5-RX
uart = UART(3, 115200)   #OpenMV RT ではこの行をコメントアウトし、次の行の UART(1) を使用してください
#uart = UART(1, 115200)  #OpenMV RT ではこの UART(1) の行を使用し、上の UART(3) の行をコメントアウトしてください
# OpenMV RT にはシリアルポート UART(1) しかなく、これは P4-TX P5-RX に対応します。OpenMV4 H7 Plus, OpenMV4 H7, OpenMV3 M7 の UART(1) は P0-RX P1-TX です

while(True):
    clock.tick() # snapshot() 呼び出し間の経過ミリ秒を記録します。
    img = csi0.snapshot() # 画像を撮影して返します。

    blobs = img.find_blobs([yellow_threshold])
    if blobs:
        #print('sum : %d'% len(blobs))
        data=[]
        for b in blobs:
            # ブロブの周囲に矩形を描画します。
            img.draw_rectangle(b.rect) # rect
            img.draw_cross((b.cx, b.cy)) # cx, cy
            data.append((b.cx,b.cy))

        #{(1,22),(-3,33),(22222,0),(9999,12),(0,0)}
        data_out = json.dumps(set(data))
        uart.write(data_out +'\n')
        print('you send:',data_out)
    else:
        print("not found!")

すべてのカラーブロックの中心座標が送信されます。

SingTown シリアルポートアシスタントに受信データが表示されます:

Arduino 解析プログラム

Arduino Uno にはシリアルポートが1つしかなく、受信専用として使われるため、コンピュータへ送信して表示することが できません。そこで、ソフトウェアでシリアルポートをシミュレートし、シリアルポート転送プログラムを実行します。

OpenMV Arduino
P4(TX) 10(RX)
P5(RX) 11(TX)
GND GND

転送のロジックは次のとおりです。OpenMV からのデータは Arduino Uno のソフトシリアルポートに送信され、 Arduino のシリアルポートがコンピュータに接続されて結果を表示します。

したがって、Arduino Mega 側のロジックは、softSerial からデータ(json)を読み取り、それを配列に解析して Serial(コンピュータ)へ送信する、というものです。

コード

#include <SoftwareSerial.h>

SoftwareSerial softSerial(10, 11); // RX, TX
typedef struct
{
  int data[50][2] = {{0,0}};
  int len = 0;
}List;
List list;

void setup() {
  // 初期化コードをここに記述します(一度だけ実行されます):
  softSerial.begin(115200);
  Serial.begin(115200);
}

void loop() {
  if(softSerial.available())
  {
    getList();
    for (int i=0; i<list.len; i++)
    {
      Serial.print(list.data[i][0]);
      Serial.print('\t');
      Serial.println(list.data[i][1]);
    }
    Serial.println("============");
    clearList();
  }

}


String detectString()
{
  while(softSerial.read() != '{');
  return(softSerial.readStringUntil('}'));
}
void clearList()
{
  memset(list.data, sizeof(list.data),0);
  list.len = 0;
}
void getList()
{
  String s = detectString();
  String numStr = "";
  for(int i = 0; i<s.length(); i++)
  {
    if(s[i]=='('){
      numStr = "";
    }
    else if(s[i] == ','){
      list.data[list.len][0] = numStr.toInt();
      numStr = "";
    }
    else if(s[i]==')'){
      list.data[list.len][1] = numStr.toInt();
      numStr = "";
      list.len++;
    }
    else{
      numStr += s[i];
    }
  }
}

results matching ""

    No results matching ""