WEBマガジン詳細

Webマガジン Vol.53- Feb., 2022

Column:Motion Gestures社 認識したジェスチャーを無償評価用のSDKを用いてシリアル通信する方法

目次

・はじめに
・準備
・受信側シリアル通信プログラム
・送信側シリアル通信プログラム

はじめに

2021年9月に「Column:Motion Gestures社 認識したジェスチャーを無償評価用のSDKを用いてSocket通信する方法」として、無償評価用のSDKを用いて認識したジェスチャーをSocket通信する方法をご紹介しました。

その後、お客様から「Socket通信ではなく、シリアル通信する方法を知りたい」と言うご要望を頂戴しました。よって今回はシリアル通信する方法をご紹介します。

シリアル通信でのシステム構成を以下に示します。

改変版SDKサンプルプログラム、送信側シリアル通信プログラム、受信側シリアル通信プログラムのプログラムから構成されています。改変版SDKサンプルプログラムについては、前回から変更はないため、前回のWebマガジンの記事の「改変版SDKサンプルプログラム」の箇所を参照ください。

なお、前回ご紹介したSocket通信時には、クライアント側Socket通信プログラムおよびサーバー側Socket通信プログラムはC++で作成し、Visual Studioでbiuildを行い、exeファイルとしていました。今回のシリアル通信時では、送信側シリアル通信プログラムおよび受信側シリアル通信プログラムはPythonで作成しています。変更した理由ですが、C++でのシリアル通信プログラムの記述量と比較してPythonの方が少ない、いろいろなOSで使用したいとの要望があり共通コードとしたかった、などによるものです。

また今回ご紹介する記述はWindows10で動作確認済みです。
※Linux、Raspberry Piでも動作するとは思いますが、未確認です。

記載内容もWindows10での使用を想定しています。

準備

シリアル通信を行うにあたり、以下の準備が必要になります。

・Windows10 PCにPythonがインストールされていなければ、インストールして下さい。
※インストールに関してはPython.jpの「Windows版Pythonのインストール」を参照願います。

・コマンドプロンプトまたはPowerShellにて、以下のコマンド実行し、pyserialパッケージををインストールして下さい。
pip install pyserial

・Windows10 PC上での動作を想定しているため、USB-シリアル(RS232C)変換ケーブルを2本用意して下さい。

・上記USB-シリアル変換ケーブルをクロス接続するケーブル or コネクタを用意して下さい。
※下記の図のようにRXDとTXDをクロス接続、GNDを直結していれば動作します。

・下記写真のように接続してください。
※写真ではノートPCのUSBポートが不足しているため、USBハブを使用しています。
※写真では送信側・受信側を同じPCとしています。送信側・受信側を別PCに分けても問題ありません。

・USB-シリアル変換ケーブルを接続した後、割り当てられたCOMポートを調べます。調べたCOMポートは送信側・受信側のシリアル通信プログラム起動時の引数で使用します。
※デバイスマネージャ→ポート(COMとLPT)の箇所を参照します。

受信側シリアル通信プログラム

受信側通信プログラムのPythonコードを以下に記載します。
プログラムの処理内容に関しては、Pythonコード中のコメントを参照下さい。

import sys
import serial

if len(sys.argv) < 3: # 引数が3未満ならばUsage表示して終了
    print(‘serial_rceive.py COMPORT BAUDRATE’)
    print(‘COPMPORT : COMx (e.x. COM5, COM6, COM7, …) ‘)
    print(‘BAUDRATE : 9600, 19200, 28400, 57600, 115200, …’)
    exit()
else:
    com_port = sys.argv[1] # COMポート設定取得
    baud_rate = int(sys.argv[2]) # ボーレート設定取得
    print(‘com_port = {0}, baud_rate = {1}’.format(com_port, baud_rate)) # 念のため設定内容表示

try: # シリアルポートオープン
    ser = serial.Serial(com_port, baud_rate, timeout=1) # serとしてオープン、タイムアウトは1sec
    print(ser.name) # シリアルポート名表示
except (OSError, serial.SerialException): # シリアルポートオープン失敗時
    print(‘Serial port {0} open error!’.format(com_port)) # Errorメッセージ表示
    exit() # 終了

while True: # 以下繰り返し
    try: # 通常処理
        recv_buf = ser.readline() # シリアル受信待ち
        if len(recv_buf) != 0: # タイムアウト発生していなければここに来る
            print(‘Received Gesture:{0}’.format(recv_buf.decode())) # 受信したGesture名を表示
            send_buf = ‘Receive OK\r\n’ # 応答用の返信データ

            # 受信後のデータを使って何か処理する場合はここに追加

            ser.write(send_buf.encode()) # 応答用の返信データをシリアル送信

    except KeyboardInterrupt: # Ctrl+Cが押された時の処理
        print(“Ctrl+Cで停止しました”)
        break

ser.close() # Ctrl+C入力後の処理、シリアルポートをクローズ

 

上記Pythonコードを「serial_receive.py」として保存します。

serial_receive.pyを用いた受信側シリアル通信プログラムの起動手順を以下に記載します。
※送信側よりも先に起動して下さい。

(1)serial_reseive.pyをWindows上の任意のフォルダに保存します。

(2)コマンドプロンプトまたはPowerShellにて、上記保存先のフォルダまで移動します。

(3)以下のコマンドで受信側シリアル通信プログラムを起動します。
python serial_receive.py COMポート ボーレート
※例:COMポートはCOM8、ボーレートは9600として
python serial_receive.py COM8 9600
※ボーレートは送信側と同じ値にすること。

(4)送信側のデータを受信し、標準出力します。

(5)Ctrl+Cで終了します。

送信側シリアル通信プログラム

送信側通信プログラムのPythonコードを以下に記載します。
プログラムの処理内容に関しては、Pythonコード中のコメントを参照下さい。

import serial
import sys

if len(sys.argv) < 3: # 引数が3未満ならばUsage表示して終了
    print(‘serial_send.py COMPORT BAUDRATE’)
    print(‘COPMPORT : COMx (e.x. COM5, COM6, COM7, …) ‘)
    print(‘BAUDRATE : 9600, 19200, 28400, 57600, 115200, …’)
    exit()
else:
    com_port = sys.argv[1] # COMポート設定取得
    baud_rate = int(sys.argv[2]) # ボーレート設定取得
    print(‘com_port = {0}, baud_rate = {1}’.format(com_port, baud_rate)) # 念のため設定内容表示

try: # シリアルポートオープン
    ser = serial.Serial(com_port, baud_rate, timeout=1) # serとしてオープン、タイムアウトは1sec
    print(ser.name) # シリアルポート名表示

except (OSError, serial.SerialException): # シリアルポートオープン失敗時
    print(‘Serial port {0} open error!’.format(com_port)) # Errorメッセージ表示
    exit() # 終了

while True: # 以下、標準入力から’MG_DEMOSW_END’を受け取るまで繰り返し
    print(‘Gesture Waiting…’) # 標準入力待ちの表示
    send_buf = input() # 標準入力待ち-> send_bufに標準入力をセット

    if ‘MG_DEMOSW_END’ in send_buf: # 標準入力中に’MG_DEMOSW_END’があれば
        print(‘Gesture送信終了’) # Geature送信終了であることを表示
        break # whileを抜ける

    if ‘SOCKET_COMM:’ in send_buf: # 標準入力中に’SOCKET_COMM’があれば(Gestureであれば)
        str = send_buf + ‘\r\n’
        ser.write(str.encode()) # 標準入力の内容をシリアル送信
        print(‘Sent Gesture:{0}’.format(send_buf)) # 送信した内容を表示
        recv_buf = ser.readline() # シリアル受信待ち、受信したデータは不要

    else: # Gesture以外時の処理
        print(send_buf) # 単に標準入力の内容を表示

ser.close() # While文抜けた後でシリアルポートをクローズ

 

上記Pythonコードを「serial_send.py」として保存します。

serial_send.pyを用いた改変版SDKサンプルプログラムおよび送信側シリアル通信プログラムの起動手順を以下に記載します。

(1)serial_send.pyを改変版SDKサンプルプログラムと同じフォルダ上に保存します。

(2)コマンドプロンプトまたはPowerShellにて、上記保存先のフォルダまで移動します。

(3)以下のコマンドで改造版SDKサンプルプログラムと送信側シリアル通信プログラムを起動します。
.\改変版SDKサンプルプログラムexeファイル名 各種コマンドオプション | python serial_receive.py COMポート ボーレート
※”|”は、パイプです。
※”|”(パイプ)以降の例:COMポートはCOM9、ボーレートは9600として
python serial_receive.py COM9 9600
※ボーレートは受信側と同じ値にすること。

(4)MotionGesturesのサンプルプログラムで標準出力した内容に”SOCKET_COMM:”が含まれていれば、受信側に送ります。

(5)改変版SDKサンプルプログラムを選択した状態で、Qキー入力を入力すると、終了します。

 

今回はMotion Gestures社ハンドジェスチャー認識ソフトウェアの無償評価用SDKのサンプルプログラムを用いて、認識したジェスチャーをシリアル通信する方法をご紹介しました。

本コラムに関するご質問やご要望等ございましたら、ページ下部のWEBマガジンお問い合わせフォームより、お気軽にお問い合わせください。

ページトップへ戻る