I2C制御の有機ELディスプレイモジュール(制御IC SSD1306)文字表示プログラム例

表示例

有機ELディスプレイ(OLED)を用いたI2C制御の128×64ドット白色グラフィックディスプレイモジュール。モジュールで使われている制御チップはSSD1306(SOLOMON SYSTECH)で多くのライブラリが入手できる。このモジュールを使ったテキスト表示プログラムを紹介する。

Si5351A I2Cクロックジェネレーターを使った周波数波形出力プログラム例

40kHz波形
40kHz出力波形
Si5351Aクロックジェネレーター
Si5351クロックジェネレータモジュール

Silicon Laboratories社製Si5351Aを使用したクロックジェネレーターモジュール(ここではストロベリーリナックス社)を使い、Raspberry Piで電波時計用の40kHz/60kHzの周波数の長波を出すプログラム例を紹介する。

このモジュールは、I2C制御で個別設定できる3chの端子からそれぞれ2.5kHz~200MHzの任意の周波数を出力することができる。原発振は25MHzの水晶で、内部VCOとPLLをI2C制御することで逓倍かつ分周し任意の周波数を発生させる。

9軸センサーMPU9250へのカルマンフィルタ適用プログラム例

ジャイログラフ表示
カルマンフィルタを通して補正した傾斜角をグラフ表示
ジャイロ3D表示
カルマンフィルタを通して補正したセンサの傾斜角を3D表示

MPU-9250 9軸センサモジュールは、3軸加速度、3軸ジャイロ、3軸コンパスセンサが1チップに内蔵され、コンパクトでいろいろなアプリケーションに使われている。このブログの中でもラズドローンの姿勢を測定するのに使った。ジャイロの出力値が角速度であるので、数値積分して姿勢角を算出するが、積分計算を含むためドリフト誤差を持つ。一方、加速度はX、Y、Z軸の加速度の大きさから幾何学的に姿勢角が算出できるがノイズ成分がでてくる。そこで、参考図書「カルマンフィルタの基礎」(足立修一・丸田一郎共著、東京電機大学出版局)のカルマンフィルタの応用としての相補フィルタの適用例を参考にして、姿勢角を精度よく算出できたので、その作成過程を記録に残すことにした。

ラズパイでディープラーニング:交通標識認識プログラム例

標識認識

前回のブログでは、ラズパイが持っているフォント数字を学習させることで、かなり高い精度でパソコンのフォント印字数字を認識する学習プログラムを紹介した。今度は、交通標識を機械学習することを試みた。交通標識は、形状が、円、四角、三角に分けられ、同じ形状でも、色が異なり、数字が記されていることもある。フォント数字の学習方法で使った白黒の二値画像ではなく、RGBのカラー画像で学習する方が、認識率が高まるはず。今回、カラーの交通標識を機械学習して、交通標識を認識するプログラムを作成したので、その手順を記録に残すことにした。
この結果は、ラズマウスが交通標識を認識し、その指示に従って走行するプログラムに応用できる。

ラズパイのフォントで機械学習する文字認識プログラム例

機械学習文字認識
機械学習文字認識

機械学習の教科書ではMNISTの手書き数字のデータベースを使った手書き数字認識プログラムが紹介されている。これを、Raspberry Piで動かす2輪走行のラズマウスの走行指示に応用する。ラズマウスの前にUSB接続のWEBカメラを取付け、これでキャプチャした前方の数字標識を認識し、その数字で指示された次の動作(左右回転、Uターンなど)を実行する。しかし、数字標識をパソコンのフォントで印刷した文字を使うと、手書き文字で学習した認識プログラムでは誤認識が発生しやすい。
今回は、手書き文字ではなく、ラズパイが持っているフォント数字を学習させることで、かなり高い精度でパソコンのフォント印字数字を認識できたので、その学習プログラムを紹介する。

シャープ測距モジュール(GP2Y0E03)のI2C Slave IDの変更プログラム

測距モジュール
測距モジュール
(GP2Y0E03)

この測距モジュール(GP2Y0E03)は、I2Cインターフェイス(アナログ入力もある)を通してデータを取得できる取り扱いやすいセンサーですが、複数のモジュールを使う場合には、それぞれのモジュールのI2CのSlave ID(スレーブ アドレス)を変更する必要があります。変更の手順はモジュールのアプリケーションノートに記載されていますが、変更アドレスを不揮発性メモリに書き込むなど少し面倒な点があるので、実際に、4つのモジュールのスレーブ アドレスを変更した手順とプログラム事例を記録として残しました。

STマイクロ測距モジュール(VL53L0X)のI2Cスレーブ アドレスの変更プログラム

VL53L0X配線
測距モジュール
(VL53L0X)

この測距モジュール(VL53L0X)は、I2Cインターフェイスを通してデータを取得できる取り扱いやすいセンサーです。ただ、複数のモジュールを使う場合には、それぞれのモジュールのI2Cのスレーブ アドレスを変更する必要があり(デフォールト アドレスは0x29)、その変更はプログラムで行います。複数のセンサーを使う手順とプログラムによる変更事例を記録として残しました。

ステッピングモータードライバーL6470の2台同時制御プログラム例

モータードライバー
モータードライバーL6470

STマイクロ製ステップモータードライバーL6470を組み入れたドライブキット(ここでは秋月電子通商製)を使い、2台のステッピングモーター(SM-42BYG011)を同時に制御するプログラムを紹介する。
L6470はSPI通信で制御するが、それぞれのモーターに順番に制御コマンドを送ると、タイムラグが生じ、2台同時に起動させることができない。ここでは、CS信号をほぼ同時(5μsecのタイムラグあり)に送信する方法とし、2台のモーターを別々に起動させたり、同時に起動させたりできるようにした。CLK信号とCS信号のタイミングを合わせるために、spidevモジュールを使わず、RPi.GPIOモジュールを使って作成した。

16チャンネルPWMコントローラーPCA9685キットのサーボモーター制御プログラム例

PWMコントローラ
PWMコントローラー
PCA9685

SXP社のPCA9685を使用した16Chのサーボ&PWM駆動キット(ここでは秋月電子通商製)を使い、Raspberry Piで複数のサーボモーター(DS3218)を同時に制御するプログラム例を紹介する。 PCA9685はI2Cバスを使って16ChのLEDをコントローㇽICなので、プログラムで様々なPWM信号を生成することができる。しかし、サーボモーターの駆動には、PWMの周波数とデユーティ比を決めれば駆動できるので、それに特化したモジュールを作成した。

TCP接続でRasPiをリモート化するiPhoneアプリのプログラム例

iPhone-Remote

aspberry Piで制御する機器をリモートで操作する方法にはいろいろとあるが、iPhoneからTCP接続してリモート化するiPhoneアプリを作成したので、そのプログラム例を紹介する。
昨年(2019年)後半に、iPhoneアプリの開発ツールとしてApple社からswiftUIが提供され、Xcodeを使って非常に簡単にGUIを含んだアプリの開発ができるようになった。またシミュレーションのひとつの方法として実機のiPhoneにインストールすることもでき、自分のアプリとして動かすだけなら無料で行える。(アプリの有効期間は7日間なので再インストールが必要。Apple Developer Program(年間11,800円)に参加すれば、制限なく利用できる)

TCP接続でRasPiをリモート化するiPhoneアプリのプログラム例(改善版)

iPhoneHome

前回紹介したTCP接続してリモート化するiPhoneアプリでは、使用上は問題なく動作するが、『バックグラウンドで変更された状態変数を使うことを許されていない』との警告が出るので、そのような状態変数を使わないプログラムに変更したので紹介する。

●警告内容とその意味
シミュレータで動作させた時にデバッグエリアに出てくる警告は下記。
networkClient[2762:121381] [SwiftUI] Publishing changes from background threads is not allowed; make sure to publish values from the main thread (via operators like receive(on:)) on model updates.

TCP接続のバックグラウンドで変更されるPublished Valuesは正しく反映されないので、メインスレッドで変更せよとの意味らしい。実際には動作に問題が出なかったので、致命的なエラーではないが、すっきりしないので対策を考えることにした。対策としては、NetworkのDispatchQueueに共存させて、DispatchQueue.main.asyncなどを使って、メインスレッドで変更しているように見せる方法もあり、試してみたが、Queueの処理順序が意図したような順でないので、Networkの処理関数からは全てreturnでメインスレッドに返す方法とした。

WebSocket接続でRasPiをリモート化するWebアプリのプログラム例

WebSocketDisp
WebSocketリモート接続のWeb画面

Raspberry Piで制御する機器をリモートで操作する方法にはいろいろとあるが、WebブラウザからWebSocket接続してリモート化するWebアプリを作成したので、そのプログラム例を紹介する。
リモート化する方法でよく使われているのが、HTMLとJavaScriptを使ってウエブからWebIOPiでGPIOを制御する方法。JavaScriptを介してWebIOPiに繋げるワンクッションが必要で制限もありやや面倒である。前回紹介したTCP接続してリモート化するiPhoneアプリは、作成は簡単だが、iPhone/iPadなどapple機器しか使えない。Webブラウザを使えば汎用性があるが、JavaScriptでTCP接続のアプリを作ろうとすると、node.jsをインストールする必要があり、汎用性に欠ける。そこで、もう少し汎用性のあるWebSocket接続を使うことにした。JavaScriptもpythonもWebSocketのAPIが標準で用意されているので、特殊な作業は必要ない。