準備編では、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点滅プログラム」のテンプレートが用意されています。
今回はこれを元に若干の改造を加えることにします。
プログラムの修正
# 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;
}
ビルド後イベント の修正
自動生成されたプロジェクトの「プロジェクト プロパティ」の中に、「リモートのビルド後イベント」という項目があります。
[コマンドライン]欄には次の文字列が設定されていますが、これは初期化処理として wiringPiSetupSys メソッドを呼び出していたためで、すでに不要なものです。
「コマンドライン]欄に既定で設定されている文字列:
gpio export 17 out
[コマンドライン] および [説明] 欄の内容は全て削除してください。
プログラムのビルド
[ビルド] - [ソリューションのビルド] を選択すると、次の画面が表示されます。
「ホスト名」、「ユーザ名」、「パスワード」を入力し、[接続]ボタンをクリックするとビルドが開始されます。
無事にビルドが完了すると、「出力」ウィンドウには次のように表示されるはずです。
リモートビルドを行う際、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;」を追加してください。
このように Visual Studio でのリモート開発はとても簡単に始められるため、Python 言語を知らない C/C++ 開発者による製品開発も十分に可能と言えるでしょう。
次回は .NET Core 環境での「Lチカ」プログラムの構築に取り組みます。