ラズベリーパイのフォームアプリケーションで「wiringPi」を使う

2020年1月3日

ラズベリーパイ(Raspberry Pi)のフォームアプリケーション作成にも、GPIOの制御や接続デバイス用に「wiringPi」ライブラリを使おうと思います。その方が、ターミナル起動のアプリケーションとコードの共通化が図れるからです。

しかし、フォームアプリケーションでも「wiringPi」ライブラリが使えるのでしょうか。やってみました。

1.前準備

Qt Creator」で作った簡単なフォームアプリケーションをベースにテストします。その投稿は下のリンクです。

ボタンを押すとポップアップウインドウが表示されるプログラムを、ボタンを押すとLEDが点いたり消えたりするプログラムに変更します。

2.wiringPiをプロジェクトに組み込む

wiringPi」ライブラリをプロジェクトに読み込みます。プロジェクトファイル(xxxxxxx.pro)に、上記の記述を追加します。

3.ヘッダファイルに変数を用意する

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_clicked();

private:
    Ui::MainWindow *ui;

private:
    bool onoff ;

};

#endif // MAINWINDOW_H

LEDon/offを判断する変数を用意します。ontrueで、offfalseになります。

4.ソースファイルに初期設定を記述する

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QMessageBox>
#include <QPixmap>
#include <QString>

#include <wiringPi.h>

#define GPIO_PIN	26

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    onoff = false ;

    if (wiringPiSetupGpio() == -1) {
        // nop
    } else {

        pinMode(GPIO_PIN, OUTPUT) ;
        digitalWrite(GPIO_PIN, false);
    }
}

MainWindow::~MainWindow()
{
    delete ui;
}

フォームソースファイルに、include、defineを定義します。+信号は、GPIOの26番を使用します。includeの記述はターミナル用プログラムと同様です。

フォームアプリケーションは、C++で記述します。そのため、初期処理はコンストラクタに記述します。GPIOをセットアップして、GPIOの26番の属性を設定して最初は消灯の状態にします。

5.ボタンが押された時の処理を記述する

void MainWindow::on_pushButton_clicked()
{
    if (!onoff) {
        digitalWrite(GPIO_PIN, true);
        onoff = true;
    } else {
        digitalWrite(GPIO_PIN, false);
        onoff = false ;
    }
}

ボタンを押した時に呼ばれる「on_pushButton_Clicked」メソッドで、LEDの点灯と消灯を行います。

一番最初にボタンが押された時はonofffalseなので、digitalWrite(GPIO_PIN, true)を行います。GPIO26番ONになって3.3Vが出力されてLEDが光ります。

その次にボタンが押された時は、onofftrueなので、digitalWrite(GPIO_PIN, false)を行います。GPIO26番OFFになり、0VになるためLEDが消えます。

そして押すたびに、LEDが交互に光ります。

6.ビルドして実行する

Raspberry Pi 4 model Bに配線します。モーターテストの空いた部分を使っているのでごちゃごちゃしていますが、今回の部分はLED抵抗だけです。+-をそれぞれGPIO26GNDに接続します。

ビルドして実行します。ボタンを押すごとに、点灯と消灯を繰り返します。特に問題ありませんね。

7.フォームアプリケーションでもwiringPiは有効

フォームアプリケーションでも問題なくwiringPiライブラリが使用できました。これにより、今までは状態表示にLCDを使っていましたが、フォームアプリケーションをデスクトップに表示することで、HDMIモニターやVNC画面で状態を確認することができます。

これからは、Raspberry Pi 4 model Bでフォームアプリケーションを作成して、Raspberry Pi Zeroに転送してアプリケーションを動かすというパターンも出てきます。特に、ラジコンの制御で便利ではと期待しています。

追記:緯度・経度、速度を表示するフォームアプリケーションを作ってみた

GPS受信デバイスを使って、緯度・経度、速度を表示するフォームアプリケーションを作ってみました。作成はRaspberry Pi 4 model Bを使い、実行をRaspberry Pi Zeroで行っています。(仮プログラムなので公開はなし)

フォームアプリケーションでは、文字の大きさを自由に変えられるので、視認性の良いアプリケーションが作れます。今回は速度の表示を大きくしてみました。

それでも、LCDの表示が良い場合もあります。LCD表示装置は小さいので、設置場所に自由が利きます。今後は、作るものによって、LCDHDMIディスプレイ、スマートフォンのいずれかを選択したいと思います。

VNC接続したスマートフォンからラズパイのフォームアプリケーションを動かす価値はある?

実際に、車で上記のGPSアプリケーションを動かしてみました。アプリケーションの起動やフォーム画面の表示は、VNC接続したスマートフォンで行います。

運用してみて、速度は良く見えて使えました。緯度・経度は小さすぎて見えないので大きくします(と言っても、緯度経度が分かったところで何もできない)。

しかし、スマートフォンを使う位なら、スマートフォンのアプリケーションを作った方が手っ取り早いのも事実です。わざわざラズベリーパイで動かす必要があるのでしょうか。

私はあると思います。スマートフォンでGPSアプリケーションを動かすと、バッテリー消費が激しいです。そしてダッシュボード上で使うと、熱くなりすぎてスマートフォンの警告が出てしまいます(実際に良く出て困る)。下手すれば、暴走も考えられます。そこで、GPSの処理はラズパイに任せて、表示だけスマートフォンというのもありでしょう。テザリングもバッテリーを消費しますが、GPSよりはマシな感じです。

ラズベリーパイ本体は、直射日光の当たらない涼しい場所に設置します。GPS受信デバイスだけ窓際に置けば、熱問題を解決できます。HDMIディスプレイを使うと配線の問題が出ますから、スマートフォンに表示させる方が線もなくすっきりします。

このように、ラズベリーパイをVNC接続したスマートフォンから操作するということもありでしょう。(ターミナルで動くラズパイアプリケーションは、VNC接続したスマートフォンから起動しています)