ArduinoスケッチをRaspberry Piに移植するHow-To(仮) by @azarashi55

注)Raspberry PiのGPIOポートはCPUであるARMプロセッサーに直結されています。
また、GPIOポートで許容される電圧は3.3Vまでで、5Vには耐えられません(過電
圧保護回路はついていません)。
 また、CPUに直結されているために、端子間のショート、静電気等でRaspberry
Pi本体が壊れる可能性もあります。
 GPIOポートを使用する際には、十分に注意の上、あくまで自己責任で使用して
下さい。
Intro.
 Raspberry Piはそのまま超小型Linuxマシンとしても使えますが・・・せっか
くならArduinoみたいにいろいろ遊んでみたいですよね。
 というわけで、この文書は、ArduinoからRaspberry Piへ自作スケッチを移植
する方向けにWiringPiライブラリーを利用する方法を説明するHow-Toです。

 前提としている環境は、
・すでにRaspberry PiでRaspbianが稼働している環境
・移植元のスケッチでアナログポートを使っていない
(あらかじめhttps://projects.drogon.net/raspberry-pi/wiringpi/functions/
に目を通して移植できるスケッチか確認したほうがいいでしょう)
・jedあたりの軽いエディターも入れておくと便利です
 です。
1.WiringPiの導入
 https://projects.drogon.net/raspberry-pi/wiringpi/download-and-install/
 のとおりに進めていきます。

$ cd /tmp
(tar玉の保存・解凍場所は皆さんそれぞれポリシーがあるでしょうから、お好
きな場所でどうぞ)
$ wget http://project-downloads.drogon.net/files/wiringPi.tgz
$ tar zxvf wiringPi.tgz
$ cd wiringPi/wiringPi
$ make
$ sudo make install
$ cd ../gpio
$ make
$ sudo make install
$ cd ../examples
$ make

 これで、インクルードファイルは/usr/local/include配下に、ライブラリーは
/usr/local/lib配下にインストールされます。

2.ArduinoスケッチをWiringPiライブラリーを使ったC(++)言語に移植
 https://projects.drogon.net/raspberry-pi/wiringpi/functions/
 こちらに関数一覧があります。
 後述しますが、Arduinoでのpinナンバーができるだけそのまま使えるように実
装されていますので、とりあえずArduinoスケッチのpinナンバーはそのままにし
ておいてもいいでしょう(最終的に調整すればOKという意味です)。

 ここで、言語仕様の違いによりスケッチからC(++)言語に移植するために、若
干のロジック変更が必要です。
 Arduinoスケッチの場合
void setup(){

}

void loop(){

}
 ですが、wiringPiを使う場合にはC(++)言語なので、ざっくりと書くと、

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>

/* プロトタイプ宣言 */
void loop(void);

int main()
{
 int wiringPiSetup();

 loop();

 exit(0);
 /* もしくはwhile(1);など */
}

void loop(){

}

 といった形に変更する必要があります。もっとも、loop()関数にこだわる必要
がないので、スケッチより柔軟にプログラミングできます。

 また、wiringPiでは、Setupに使う関数が3つ用意されていて、それぞれで実
行にroot権限が必要かどうか、GPIOポートをArduinoに近い形にマッピングする
かどうかで3種類のSetup用関数が用意されていますので、目的に合わせて使い
分ける必要があります。
https://projects.drogon.net/raspberry-pi/wiringpi/functions/

ピンアサイン表
https://projects.drogon.net/raspberry-pi/wiringpi/pins/
3.実際の移植
 割と単純に置換できるものとしては、
Serial.print()

printf()

boolean型変数

#include <stdbool.h>
した上で、Bool型に置換

その他の変数型も一部を除いてそのまま使えます。

そのまま使える関数(くれぐれもGPIOポートのピンアサインは間違えないように!)
デジタルピン系
pinMode()
digitalWrite()
digitalRead()

タイマー系
millis()
delay()
delayMicroseconds()(実際に試しましたが、μsec単位のdelayはあてになりま
せん)

wiringPiで追加されている関数
int piHiPri (int priority)
 実行するプログラムの優先度(nice)を上下できます。

その他、GPIOポートでの割り込み関数、マルチスレッド関数などがあります。

4.コンパイル
例)
$ gcc example.c -o example -I/usr/local/include -L/usr/local/lib -lwiringPi

 で、OKです。

 くどいようですが、GPIOポートのピンアサインと許容電圧には気をつけて下さ
いね。