テクシオ・テクノロジーによるおじさんのためのIOT講座


(1) Pythonによるシリアル通信プログラミング



Pythonはプログラミングのための参考資料やサンプルが豊富にありますが、人口知能やWebアプリケーション、統計処理についてが多く、通信を使って計測機器などを制御する例はそれほど多くありません。

本ページではGUIの作成とボタン処理を行うGUIライブラリ(Tkinter)、通信を行うPySerialライブラリ 、一定周期で処理を行うインターバル動作、変数の共用を行うグローバル指定を説明いたします。
制御対象は弊社のマルチメーター となっていますが、文字列を変更することでシリアル通信で接続する電源やオシロスコープの他にセンサ類にも対応が可能です。

環境の準備などの手順はここでは扱いません、Python本体の他に様々な開発ツールがありますのでインターネットで検索してpython3 の実行環境をそろえてください。また、ファイル処理やグラフ出力などはインターネットに豊富にサンプルがありますので必要に応じて追加してみてください。



今回作成するPython/Tkinter でのGUI表示


Pythonでの画面の構成としてはボタン:9個、ドロップダウンリスト、テキストボックス:
2個、ラベル:2個
で、通信のOPEN/CLOSE、アプリ終了、測定モードの切替えと1秒ごと
の読取の開始と終了を割当ています。 処理としてはボタンのほかに1秒のインターバルでの動作も盛り込んであります。




1.初めに必要なライブラリとグローバル変数を登録します。
  
   ライブラリ登録はimportで行います、記述の違いはまだ理解できていません。
   Pythonの変数は何も指定しないとローカル変数になるようなので、計測器用
   の変数instrを宣言します。複数の機器を制御する場合は、instr1、instr2など
   の変数を増やすことで対応します。

2.画面のパーツを登録します。
  
   画面パーツはgridで配置を行っています。画面の解像度や分解能、OSの種類によって
   サイズが変わってしまう症状があります。
   複数の環境で利用する場合はかなり余裕を持った配置が必要になります。
   細かいサイズ・位置を指定したい場合はplace などを使用してください。

   ボタンやコンボボックスなどのイベントは必要に応じてここで登録しますが、
   種類によって登録方法が異なります。サンプルでは測定モードの切替えを追加して
   います。

3.イベントの処理を登録します。
  
   ボタンの有効・無効は['state']で切替えます。

   テキストの取得はget()、削除はdelete()、追加はinsert ()を使用します。

   指定時間後にイベントを発生させる場合はafter ()を使用します、ここでは1000ms
   後に自分自身を指定しているので1秒ごとに処理が行われます。

   デバイスを指定するinstrは、それぞれの処理でグローバル宣言をしておかないと、
   ローカル変数が割り当てられ正しく動作しなくなりますので注意してください。

   扱う文字列は計測器がASCIIですが、pythonはutf-8が標準になるため、送受信時に
   変換を行います。

   通信設定はポート指定、ボーレート設定とタイムアウト設定を行います。ポート名は
   WindowsではCOMのみですが、Windows以外ではdmesgコマンドでポート名を
   確認し、読み書きの属性変更が必要なことがありますので注意して下さい。

4.まとめ
  実用アプリケーションには至っていませんが、アプリの最低限の内容を取り上げました。
   ・Python3に対応しています、Python2で使用する場合は多少の修正が必要です。
   ・GUIは標準のTkinterを使用し、画面配置は単純なgridを利用しました。
   ・GUIのボタンやテキストなどの最低限の扱いを記述しました。
   ・簡単なインターバル処理の方法を記述しました。
   ・通信はPySerialを使用しました。
   ・最低限のエラー処理を記述しました。
   ・グローバル変数の利用方法を記述しました。
   ・機器を増やす場合は機器のグローバル変数を追加して対応します。

  後は使う方が必要なものを追加してご利用ください。

5.おまけ(Linuxでの認識について)
  ラスベリーパイ等のLinuxでシリアル通信を行う場合に、多くの製品はUSB-CDCクラス
  のため問題なくCOMポートとして認識されますが、USB-COM変換チップを使った製品
  のうち、チップに登録されたベンダIDプロダクトIDをオリジナルから変更した製品
  はLinuxが正しく認識できず、dmesgコマンドでもttyUSBまたはttyACMのエントリー
  が表示されません。

  このままで正しく認識させるにはデバイスドライバの対応が必要です。
  dmesgコマンドで変換チップのメーカーを確認し、チップメーカーが提供している
  デバイスドライバのソースファイルを入手し、対応するベンダID、プロダクトIDを
  追加してドライバのビルドと適用をすることでttyUSBまたはttyACMで認識される
  ようになります。詳細な方法はチップメーカーで配布しているドキュメントを参照
  してください。また、簡易的な対応として、チップメーカーが配布しているID書換え
  ツール
を使用しオリジナルのIDに戻す方法もありますが、こちらはメーカーとして
  は推奨しておりません、テスト的にご利用ください。

  現在当社の製品で使用しているUSB変換チップはFTDI製、Silab製、WCH製の3種類
  を利用しています。機種ごとのUSB接続の方式一覧はこちら のWin10対応表をご覧
  ください。

目次に戻る




ソースコードのダウンロード  本資料のダウンロード  電源向けサンプルコード

©Copyright 2020 TEXIO TECHNOLOGY All Rights Reserved.