*

QtでRaspberryPi/GUI開発(12)-gpioの状態をGUIに反映する

公開日: : pigpio, Qt, RaspberryPi, 開発

どもです。
今回は、gpioピンの状態(HIGH/LOW)の変化を画面上に即座に反映する方法について書きます。

1.何をした

これまで、RaspberryPi/Qt/pigpioでGPIOピンの状態変化を画面上に表示してきました。
しかし、それらのエントリで提示したサンプルは、コマンドラインツールでした。
そこで今回は、コレを一歩進めて、
「GPIOピンの状態変化をGUI画面上に表示する」
ということをやってみました。

2.作業環境

今回の作業環境は、下記の通りです。

H/W:RaspberryPi3
MDK001(ADT7310搭載)
OS:Raspbian 9.4(stretch)
GPIO Library:pigpio

3.実現方法

「GPIOピンの状態変化をGUI画面上に表示する」ためには、方法がいくつかあるかと思います。
「個人的に思いつく方法」、「これが一般的だろうな」と思う方法についてそれぞれ書いていきます。

3.1. 個人的に思いつく方法
(状態のポーリング)

一番最初に思いついた方法です。
即ち、
「常にgpioピンの状態を常に監視し続けて、その状態を常に画面表示に反映し続ける」
という方法です。
しかし、この方法では無限ループで常にピンの状態を確認し続けなければならず、アプリケーションの拡張性を考えた場合、決して最適解とは言えません。
(しょーじき、オススメしません。)

3.2. これが一般的だろうな
(フレームワークで提唱された方法)

GUIアプリは基本的に、
「システムがアプリの処理を呼び出す」
という考え方です。
(あくまで個人的な理解です。間違っていたら指摘をお願いします。)
今回使用しているフレームワークのQtでは、下記のようなView-Modelアーキテクチャが採用されています。
詳細は、こちらの公式サイトに記載されていますので、必要に応じて参照して下さい。
modelview-overview
このアーキテクチャに従って、Dataの変化をModelに通知、さらにその状態の変化の結果をViewに反映する、という方法です。

4.やってみよう

今回やりたいことについて、下記のようにView-Modelアーキテクチャにクラスを当てはめてみました。
modelview-overview_painted
ココで、QtではModelは「QAbstractItemModel」を、Viewは「QAbstractItemView」をそれぞれ継承したクラスになります。
Data/Model/Viewのそれぞれのクラスの実装を、それぞれ見てみます。

なおテーマとしては、
「GPIOピンの割込みの立ち上がり/立ち下りによる割込み結果を、画面に表示する」
という内容を設定してみました。

4.1. Data部分

アーキテクチャで「Data」に該当する部分の実装です。
Data部分では、pigpioの割込み処理を利用してgpioピンの状態変化を検知します。
割込みが発生した際には、その際のgpioピンのレベルをModel側に通知します。
具体的な実装(一部抜粋)は、下記の通りです。

4.2. Model部分

次に、Dataからデータを受け取るModel部分になります。

CGpioModel::setGpioData()では、gpioのピン番号とデータのレベルを受け取り、それをQtのView-Modelアーキテクチャでのデータ管理方法(QModelndex、QVariant)に変換します。
そしてCGpioModel::setData()では、データ更新イベント[dataChanged()]を発行します。

4.3. View部分

最後は、データを実際に表示する「View」部分です。
受け取ったデータに対応する文字列を表示しています。
では、実装です。

注意点としては、この[dataChanged()]メソッドの宣言です。
このメソッドはヘッダーファイル/クラスでは、[slots]として宣言する必要があります。

4.4. コード全体

全コードは、GitHubにて公開しています。
このエントリ以外の部分については、こちらを参照して下さい。

5.まとめ

今回は、RaspberryPi3+Qtの環境で、gpioの状態(状態変化)を画面表示に反映する方法について記載しました。
Qt+pigpioでGUIアプリを作成している方たちの、何かしらの助けになれば幸いです。

ではっ!

関連記事

toppers

C言語でEV3開発(24)-APIの実行時間を測定してみた。

どもです。 今回、以前から気になっていた、開発環境/プラットフォームであるTOPPERS HRP2

記事を読む

c_sharp_eye_catch

Windowsでのカバレッジ測定-OpenCoverageを使ってみた

どもです。 以前、OpenCppCoverageを使用してWindows上でカバレッジ測定する方法

記事を読む

toppers

C言語でEV3開発(18)-モードの遷移の設計-コマンド通信処理の準備

 どもです。  今回は、前回紹介したEv3とBluetoothで通信する機能を

記事を読む

GitHub

Windowsでのカバレッジ測定-OpenCppCoverageを使ってみた(2)

どもです。 前回のエントリーで、OpenCppCoverageというカバレッジを測定する、フリーの

記事を読む

iot_raspberrypi_gateway_001_eye_catch

IoT開発(6)
RaspberryPiをIoTゲートウェイにする(I)
VM上に開発環境を構築

どもです。前回までの記事で、ESP-WROOM-02/ESP32を電池で駆動して、センサーのデータを

記事を読む

no image

C言語でEV3開発(14)-opOUTPUT_TIME_SPEEDコマンド

どもです。 今回のエントリーは、モーターを動かすコマンドである「opOUTPUT_TIME_SPE

記事を読む

Qt_logo_2016

QtでRaspberryPi/GUI開発(2):ためしに時計を作ってみた(其の弐)

どもです。 前回のエントリーでは、ラジオボタンのグループ化と、選択されたボタンの特定方法まで記載し

記事を読む

raspberry-pi

RaspberryPi3を購入しました

どもです。 突然ですが、「Raspberry Pi3 model B」を購入しました。 今回のエ

記事を読む

cygwin_my_image

Windows10/cygwinの音を消す

どもです。 最近、Windows10/cygwinで作業をする場面がありました。 このcyg

記事を読む

iot_raspberrypi_gateway_001_eye_catch

IoT開発(7)
RaspberryPiをIoTゲートウェイにする(II)
VM上の開発環境にWEBサーバーをインストール

どもです。 このエントリは、前回の続きです。 今回は、前回のエントリで作成したVM上のRaspb

記事を読む

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

iot_raspberrypi_gateway_001_eye_catch
IoT開発(12)
RaspberryPiをIoTゲートウェイにする(V)
nginxとuWSGIの連携

どもです。このエントリは、以下のエントリの続きです。 IoT開発(6

iot_at_home_eye_catch
IoT開発(11)
ESP-WROOM-02を長時間駆動させた

どもです。この記事は、下記の記事の続き、「測定可能な期間」の結果発表で

iot_raspberrypi_gateway_001_eye_catch
IoT開発(10)
RaspberryPiをIoTゲートウェイにする(IV)
Appサーバーのセットアップ

この記事は、下記の記事の続きです。 IoT開発(6) Raspb

iot_raspberrypi_gateway_001_eye_catch
IoT開発(9)
RaspberryPiをIoTゲートウェイにする(III)
MariaDBのセットアップ

どもです。今回のエントリは、以下のエントリの続きです。 IoT開発(

iot_raspberrypi_gateway_001_eye_catch
IoT開発(8)
RaspberryPiをIoTゲートウェイにする(II)-ex
MariaDBにPHPからアクセス

どもです。 このエントリは、前回のエントリの追加項目です。 前

→もっと見る

PAGE TOP ↑