シリアル通信 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];
}
}
}
