7セグメント LED表示
今回は、Strawberry Linux社の 7セグメントLED表示器にシリアル通信で表示内容(アスキーコード)を送信し、連続的に表示を切り替える処理を確認します。
この表示器選定理由は、数字認識の最終目的である表示器とサイズ・桁数等が近いこと。コネクタ,LED等を除き、おおよそはんだ付けが完了していることなどです。
ラズパイはGPIOピン経由でシリアル通信出来るのだと思いますが、今回は同じく Strawberry Linux社 の 「FT232RX」 USBシリアル変換モジュールを使用して、USBポートを介して通信を行っています。これは、Windows PC からも使用できる様にするためです。
次の写真が表示器(右)とシリアル変換モジュール(左)です。シリアル変換モジュールのUSBポートから、ラズパイ、もしくはパソコンにUSBケーブルで接続します。表示器と変換モジュール間接続は、手持ちピンソケット(2X5)を使いました。配線は表示器説明書に記載されているので省略します。

ラズパイとUSB接続
Windowと接続する時は、ドライバーを別途ダウンロードし、インストールする必要がありましたが、Rasbian では不要の様です。接続前後に “ lsusb ” コマンドで接続状況を確認すると、接続後に赤枠部が追加されていることを確認しました。

“/dev/ttyUSB0” も追加されています。これを、python でシリアルポートを開く時のポート番号として使用します。

“ sudo apt-get install python-serial ” コマンドでシリアル通信ライブラリをインストールします。既に入っているとのことです。いつインストールしたのか記憶にありませんが・・・?

プログラム(python)
次の python プログラムは表示器を全点灯/全消灯を数回繰り返した後、表示内容変更を数回行うものです。数字,ドット,一部のアルファベットが表示可能です。
先ほど確認したポート番号 “/dev/ttyUSB0” を指定し、 シリアル通信ポートを開いています。(行番5)
import serial
import time
# シリアルポートを開く
ser = serial.Serial("/dev/ttyUSB0",9600)
# 点滅表示
num = 0
while num < 11 :
if num % 2 == 1 :
ser.write(b"8.8.8.8.8.8.8.8.\r")
else :
ser.write(b"\r")
num += 1
time.sleep(0.5)
# 数字変更処理
num = 0
while num < 11 :
chr_cnt = 0
while chr_cnt < 8 :
dsp_n = (chr_cnt + num) % 10
ser.write(bytes(str(dsp_n),'UTF-8'))
chr_cnt += 1
ser.write(b"\r")
num += 1
time.sleep(0.5)
# シリアルポート閉じる
ser.close
print("Program END")
表示状況(動画)です。
Windows FT232RX ドライバー
Windowsパソコンで「FT232RX」を使う場合、ドライバーがなく、利用できないことがありました。記憶に基づいて、その場合の設定方法を記載します。
下記より、私の場合Win64ドライバーをダウンロードします。
https://www.ftdichip.com/Drivers/VCP.htm

対象デバイスを右クリック。「ドライバー更新」選択。

コンピューターを参照しドライバー検索を選択します。
フォルダー選択ダイアログが表示されるので、ドライバーダウンロード先のフォルダーを選択し、インストールします。

Windows の python で動かす
Windowsのpython で動かす方法を確認しています。
既にWindowsパソコンに python はインストール済みなので、シリアル通信用ライブラリをインストールします。Windows コマンドプロンプトから、次の様に打込みインストールします。
“python -m pip install pyserial”

プログラムは同じですが、シリアルポートを開く際の指定ポート番号は異なります。下記は私の環境の場合です。
# シリアルポートを開く ※ポート番号は利用環境による
ser = serial.Serial("COM5",9600)
私が参考させて頂いたサイトによるのですが、ラズパイでは apt-get を使い、Windows では pip を使ったので、少し違いを確認しました。 pipは、pythonモジュールリポジトリのPyPIから直接ダウンロード・インストールされるとのこと。一方、apt-getは、Ubuntuリポジトリからダウンロード・インストールされるとのことです。とりあえず、今回の利用目的に対してはどちらでも問題なさそうです。
尚、ポート番号はデバイスマネージャーを開き、下記の通り確認することが出来ます。

Windows の C# で動かす
Windows Visual Studio C# でもプログラム作成しています。
素人プログラマーで基礎が無いので、“アスキーコードをバイト型でシリアル通信する”といってもよく判りません。ということで、下記にプログラムを記載しておきます。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace SerComTest
{
public partial class Form1 : Form
{
int flick_cnt;
int flk_T_cnt;
public Form1()
{
InitializeComponent();
serialPort1.PortName = "COM5" ; // COMポート指定
serialPort1.BaudRate = 9600 ; // 通信速度 9600 bps
serialPort1.Parity = System.IO.Ports.Parity.None ; // パリィティ無
serialPort1.DataBits = 8 ; // データ長 8ビット
serialPort1.StopBits = System.IO.Ports.StopBits.One ; // ストップビット1ビット
serialPort1.NewLine = "\r"; // ReadLine,WriteLine末尾判定
serialPort1.ReadTimeout = 1000 ; // 受信制限時間(msec)
serialPort1.WriteTimeout = 1000 ; // 送信制限時間(msec)
}
private void Form1_Load(object sender, EventArgs e)
{
flick_cnt = 0;
flk_T_cnt = 0;
timer1.Interval = 500;
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
if (flk_T_cnt < 21)
{ // 点滅表示
if (flk_T_cnt % 2 == 0) {
string res = disp_string("");
}
else {
string res = disp_string("8.8.8.8.8.8.8.8.");
}
flk_T_cnt += 1 ;
}
else
{ // 切換表示
string dsp_chr = "" ;
for (int i = 0; i < 8; i++ ) {
int dsp_flk = (i + flick_cnt) % 10 ;
dsp_chr = dsp_chr + dsp_flk.ToString() ;
}
string res = disp_string(dsp_chr);
flick_cnt += 1 ;
// プログラム終了
if (flick_cnt > 10) {
timer1.Enabled = false;
this.Close();
Application.Exit();
}
}
}
private string disp_string(string g_str) {
string dsp_str = g_str;
byte[] snd_data = new byte[ dsp_str.Length + 2 ];
snd_data[0] = 0x15 ; // [NAK,NegativeAcknowledge(否定応答)]
snd_data[ dsp_str.Length + 1 ] = 0x0d ; // [CR,Carriage Return(復帰)]
for (int i = 0; i < dsp_str.Length; i++)
{
string str_tmp = dsp_str.Substring(i, 1);
char chr_tmp = Convert.ToChar(str_tmp);
snd_data[i+1] = (byte)chr_tmp;
}
serialPort1.Open();
serialPort1.Write(snd_data, 0 , snd_data.Length);
serialPort1.Close();
return g_str;
}
}
}
まとめ
シリアルコマンドによる7セグメント表示について、ラズパイ4(python),Win10(python),Win10(C#) と3方式について確認しました。