注)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ポートのピンアサインと許容電圧には気をつけて下さ
いね。