LoginSignup
1
1

More than 5 years have passed since last update.

Raspberry Pi アプリのリモート開発(Lチカ編)

Posted at

準備編では、C/C++ および C# によるアプリケーション開発のプラットフォームを構築しました。
今回は「Lチカ編」として、GPIO へ接続したLEDを点滅させるプログラムを作成します。

回路図・ブレッドボード配線図

下記が、今回使用する Lチカの回路図とブレッドボード配線のイメージです。

Raspberry Pi のGPIOには、「合計で50mAまで」かつ「単独のGPIOピンでは最大16mAまで」という制限があります。
本当ならトランジスタを併用し外部電源でLEDを点灯させるべきですが、本稿の目的はあくまで「Lチカ」の実験です。
ここでは 330Ωの抵抗を使って 約4mA の出力でLEDを点灯させることにします。
なお、LED は BMC GPIO 23 (Pin No.16、WritingPi 4) へ接続しています。

[参考サイト]
Raspberry Pi LED current limit
Raspberry Pi Pinout

新規プロジェクトの作成

Visual Studio を起動してから [ファイル] - [新規作成] - [プロジェクト] を選択します。
本当なら「空のプロジェクト」を指定してプログラムをゼロから作り始めるところですが、最初から「Raspberry用のLED点滅プログラム」のテンプレートが用意されています。
今回はこれを元に若干の改造を加えることにします。

image.png

プログラムの修正

#include <wiringPi.h>

// LED ピン - wiringPi ピン 0 は BCM_GPIO 17 です。
//wiringPiSetupSys で初期化する場合は、BCM 番号付けを使用する必要があります
//別のピン番号を選択する場合は、BCM 番号付けを使用してください。また
//プロパティ ページで、[ビルド イベント]、[リモートのビルド後イベント] の順に選択し、 コマンドを更新してください
//これは、wiringPiSetupSys のセットアップに対して gpio エクスポートを使用します
#define LED 17

int main(void)
{
    wiringPiSetupSys();

    pinMode(LED, OUTPUT);

    while (true)
    {
        digitalWrite(LED, HIGH);  //オン
        delay(500); //ミリ秒
        digitalWrite(LED, LOW);   //オフ
        delay(500);
    }
    return 0;
}

作成された main.cpp について、下記の修正を行います。

1. 初期化メソッドを「wiringPiSetupGpio」に変更する。
自動生成されたソースでは初期化処理として wiringPiSetupSys メソッドを呼び出していますが、本稿の環境では root 権限が必須ではなく、「wiringPiSetup」あるいは「wiringPiSetupGpio」を使用することが可能です。
ここでは Broadcom のピン番号を指定可能な「wiringPiSetupGpio」メソッドを呼び出して初期化します。

2. 操作対象の GPIO を BCM GPIO 23 に切り替える。
BCM GPIO 23を操作するため、定数「LED」の値を『23』に変更します。

3. 無限ループを 10回ループに変更する。
自動生成されたソースには明確な終了判定がなく、終了するにはプログラムを強制終了するしかありません。
しかしタイミングによっては BCM GPIO 23 への出力が HIGH 出力のままとなり、プログラムが終了してもLEDが点灯し続けてしまいます。
また、Linux ではリアルタイムのキー入力を行う便利関数も用意されておらず、「任意のキーが入力されたらループを抜ける」という Windows では当たり前の処理を容易に組み込めない状況です。
よって、ここでは指定回数だけループしたら終了する単純な形に修正することにします。

下記が、修正後のソースファイルです。

#include <wiringPi.h>

// LED ピン - wiringPi ピン 0 は BCM_GPIO 23 です。
//wiringPiSetupSys で初期化する場合は、BCM 番号付けを使用する必要があります
//別のピン番号を選択する場合は、BCM 番号付けを使用してください。
#define LED 23

int main(void)
{
    wiringPiSetupGpio();

    pinMode(LED, OUTPUT);

    for (int lp=0 ; lp < 10 ; lp++)
    {
        digitalWrite(LED, HIGH);  //オン
        delay(500); //ミリ秒
        digitalWrite(LED, LOW);   //オフ
        delay(500);
    }
    return 0;
}

ビルド後イベント の修正

自動生成されたプロジェクトの「プロジェクト プロパティ」の中に、「リモートのビルド後イベント」という項目があります。

image.png

[コマンドライン]欄には次の文字列が設定されていますが、これは初期化処理として wiringPiSetupSys メソッドを呼び出していたためで、すでに不要なものです。

 「コマンドライン]欄に既定で設定されている文字列:
   gpio export 17 out

[コマンドライン] および [説明] 欄の内容は全て削除してください。

プログラムのビルド

[ビルド] - [ソリューションのビルド] を選択すると、次の画面が表示されます。
image.png

「ホスト名」、「ユーザ名」、「パスワード」を入力し、[接続]ボタンをクリックするとビルドが開始されます。
無事にビルドが完了すると、「出力」ウィンドウには次のように表示されるはずです。
image.png

リモートビルドを行う際、Visual Studio は接続ウィンドウへ入力した「ユーザ」のホームディレクトリ下、「projects」フォルダ内にソースファイルをコピーします。
ビルド完了後のフォルダの状態は次の通りです。

デバッグ実行

12行目にブレークポイントを設定してから、[デバッグ] - [デバッグの開始] を選択します。
問題がなければ次のような表示に切り替わるはずです。

このまま実行を続行すると、LED が10回点滅してからプログラムが終了します。

インクルードファイルパスの変更

自動生成されたプログラムの1行目 「#include <wiringPi.h>」ですが、これは VisualStudio のインストールフォルダに格納されているヘッダファイルを参照しています。

【インクルードファイルの既定のフォルダパス】
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Linux\include\wiringPi\2.32

しかし実際のビルドでは Raspberry Pi の「/usr/include」下に格納されている「wiringPi.h」を参照しており、Visual Studio の IntelliSense でもこのファイルを参照すべきです。
(既定のフォルダ下に格納されているヘッダファイルは、少し古いバージョンのようです)

この /usr/include フォルダは、「準備編」にて共有フォルダ化済みです。
Visual Studio 上でプロジェクトプロパティ [構成プロパティ]-[VC++ ディレクトリ] を変更し、共有フォルダのヘッダファイルを参照するようにします。

[インクルード ディレクトリ]欄の先頭に、「¥¥raspberrypi¥usr_include;」を追加してください。
image.png

 
このように Visual Studio でのリモート開発はとても簡単に始められるため、Python 言語を知らない C/C++ 開発者による製品開発も十分に可能と言えるでしょう。

次回は .NET Core 環境での「Lチカ」プログラムの構築に取り組みます。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1