Raspberry Pi アプリのリモート開発（Lチカ編）

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

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/90456/77323e46-6487-de13-e5fc-4ac1e7de2244.png" width=70% height=70% />

<img src="https://qiita-image-store.s3.amazonaws.com/0/90456/96d9ef63-e94e-e50d-db6e-df42bb13f3f0.png" width=50% height=50% />

<img src="https://pinout.xyz/resources/raspberry-pi-pinout.png" />

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](https://raspberrypi.stackexchange.com/questions/11763/raspberry-pi-led-current-limit)
[Raspberry Pi Pinout](https://pinout.xyz/)

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

![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/02d11083-d185-9416-979e-ec3a1628a18a.png)

# プログラムの修正

```C++
#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 では当たり前の処理を容易に組み込めない状況です。
よって、ここでは指定回数だけループしたら終了する単純な形に修正することにします。

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

```C++
#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](https://qiita-image-store.s3.amazonaws.com/0/90456/cee465eb-39c1-1d58-fe8f-edd33ec96a54.png)

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

　「コマンドライン]欄に既定で設定されている文字列：
　　　<font color="red"><i>gpio export 17 out</i></font>

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

# プログラムのビルド
[ビルド] - [ソリューションのビルド] を選択すると、次の画面が表示されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/3816bb32-ea87-6357-27eb-0d328c6a1e0d.png)

「ホスト名」、「ユーザ名」、「パスワード」を入力し、[接続]ボタンをクリックするとビルドが開始されます。
無事にビルドが完了すると、「出力」ウィンドウには次のように表示されるはずです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/984d6ad1-af1c-b52c-1e12-db1e870c70fa.png)

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/90456/766a03a9-9e30-050a-d7bf-2aff293cf57f.png" width=50% height=50% />

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

<img src="https://qiita-image-store.s3.amazonaws.com/0/90456/a7548f7f-4db5-d67d-cd70-826c1d566a9b.png" width=70% height=70% />

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

# インクルードファイルパスの変更
自動生成されたプログラムの１行目 「`#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 フォルダは、「[準備編](https://qiita.com/b-wind/items/06a9cce8fc9d1ab47047#%E5%85%B1%E6%9C%89%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%81%AE%E4%BD%9C%E6%88%90)」にて共有フォルダ化済みです。
Visual Studio 上でプロジェクトプロパティ [構成プロパティ]-[VC++ ディレクトリ] を変更し、共有フォルダのヘッダファイルを参照するようにします。

[インクルード ディレクトリ]欄の先頭に、「¥¥raspberrypi¥usr_include;」を追加してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/90456/052c1e9c-24ba-e856-0dd4-aeef99797b40.png)

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

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