私的AI研究会 > ラズパイTips
WiringPi API †
セットアップ機能 †
WiringPiを初期化するには3つの方法がある。Setup Functionsの一つは、プログラムの最初に呼ばなければならない。
もし、GPIOの初期化処理に失敗して戻り値-1が返された場合は、グローバルerrnoを調べて理由を確認する必要がある。
int wiringPiSetup(void) †
- wiringPi systemの初期化で、wiringPiピンナンバーを利用することを前提とする。
実際のBroadcom GPIOピン番号を基礎とした、0~16の仮想ピンをマッピングしたもの。ピンページを確認してwiringPi ピン配置と、Broadcom GPIO の番号を確認すること。
- この関数はroot権限で呼び出す必要がある。
init wiringPiSetupGpio(void) †
- これも上の関数と同じ。しかし、こちらはプログラムがBroadcom GPIOのピン番号(BCM)を直接呼び出すのを許す。
- この関数はroot権限で呼び出す必要がある。
init wiringPiSetupSys(void) †
- wiringPiシステムを初期化するが、/sys/class/gpioインタフェースを使う。
これはrootでなくても呼び出すことができる。このモードのピン番号は、ネイティブのBroadcom GPIO番号である。
Note:このモードでは、/sys/calss/gpioにてエクスポートされたピンだけを利用することができる。
- ピンをプログラムで呼び出す前に、事前にエクスポートすること。
- シェルスクリプトで利用することができる。
- system()関数を使用しても使うことができる。
- 関数のいくつかは、root権限でないと動かない。
一般的な wiring 機能 †
void piMode(int pin,int mode) †
- ピンのINPUT、OUTPUT、PWM_OUTPUTを設定する。
Note: wiringPi pin 1(BCM_GPIO 18)は、PWM出力をサポートしている。ピン番号は、ピンテーブルから取得される値。
この関数は、Sysモードのときは効果がない。
void digitalWrite(int pin, int value) †
- HIGHまたはLOW(1または0)の値を、事前に出力として設定されている必要がある特定のピンに書き込む。。
void digitalWriteByte(int value) †
- 8つのGPIOに、8bitで設定した値を設定する。
これは、8bitすべてを一回で制御するもっとも早い方法である。
void pwmWrite(int pin, int value) †
- PWMレジスタに値を書き込みむ。値は0~1024の間でなければならない。
PWMをサポートしているのは、pin1(BCM_GPIO18)だけである。
- この機能は、Sysモード(上記を参照)の場合は効果がない。
int digitalRead(int pin) †
- 引数で与えられたpinの値を戻り値とし返す。HighまたはLow(1または0)の論理レベルで返す。
void pullUpDnControl(int pin, int pud) †
- 引数のピンのプルアップ、プルダウンを設定する。
- 事前に該当のピンをINPUTに設定しておくこと。BCM2835は、プルアップ、プルダウン内部抵抗を両方持っている。
- パラメータpud は PDU_OFF(プルアップ/ダウンなし)、PUD_DOWN(グランド接地)、PUD_UP(3.3Vにプルアップ)
の値を設定できる。
- この関数は、Sys modeだと効果がない。プルアップ/プルダウンををアクティブにしたい場合は、プログラムを起動させる前に、スクリプトでGPIO設定を行なうこと。
PWM制御 †
Sys mode 時は、PWMコントロールはできない。
pwmSetMode(int mode) †
- PWMは、"balanced"と、"mark:space"の2種類のモードがある。
- "mark:space"は従来のものだが、デフォールトモードは"balanced"。
- "PWM_MODE_BAL"と、"PWM_MODE_MS"を引数として与えることで、モードを切り替えることができる。
pwmSetRange(unsigned int range) †
- PWMジェネレータ内の範囲レジスタを設定する。
- 既定値は1024。
pwmSetClock(int divisor) †
- PWMクロックの除数を設定する。
- PWMシステムの詳細を理解するには、Broadcom ARM周辺機器のマニュアルを読む必要がある。
タイミング機能 †
unsigned int millis(void) †
- wiringPiSetup関数(のどれか)を呼んでからミリ秒を示す数値を返す。
49日毎に、32bit符号なしの値を返す。
void delay(unsigned int howLong) †
- 引数howLongで与えられた数値のミリ秒分、処理をポーズする。
- Linuxのマルチタスクの性質上、指定した値より長くなる可能性がある。
- 最大ディレイは、符号なし32bit整数の最大値から約49日。
void delayMicroseconds(unsigned int howLong) †
- 引数howLongで与えられた数値のマイクロ秒分、処理を停止する。
- Linuxのマルチタスクの性質上、指定した値より長くなる可能性がある。
- 最大ディレイは、符号なし32bit整数の最大値から約71分。
プログラム/スレッドの優先順位 †
int piHiPri(int priority) †
- より優先度の高いプログラムをリアルタイムで動作させられるように、優先度をシフトできる。
- 優先度パラメータは、0(初期値)~99(最大)の間で設定できる。
これは、プログラム自体を早くするものではないが、タイムスライスで割り当てられる時間を多くする。
優先度パラメータは相対的なものなので、他のプログラムの影響を受ける。
- 戻り値が0の時は成功。1はエラー。
エラーナンバーが返されたら、グローバル変数 errno で確認すること。
- root権限にて動作している時だけ優先度を変更できる。rootでないときに、この関数を呼ばれても何も起きない。
割り込み †
GPIO割り込みhandingパッチを当てられたカーネルで、プログラムに割り込み待ち処理が可能になる。
割り込みを待つ間、プロセッサ―の処理を解放する。
GPIOの立ち上がり割り込み、立下りの両方で割り込みを設定することができる。
waitForInterrupt()関数は非推奨となる。より簡単で新しい、wiringPiLSR()関数を使用する必要がある。
int waitForInterrupt(int pin,int timeOut) †
- 関数が呼ばれると、割り込みイベントが起きるまで待ち、プログラムが停止状態になる。
- timeOutパラメータのミリ秒分を設定することができる。また-1を設定することで、永久に割り込みを待つこともできる。
- エラーが起きた場合は、-1を戻す。errnoも適切に設定される。
- タイムアウトの時は0 を返す。割り込み成功した時は1を返す。
- waitForInterruptの関数を呼ぶ前に、GPIOの初期化を行なうこと。
現時点では、これを行う唯一の方法は、スクリプト内で、またはプログラム内からsystem()呼び出しを使用して、gpioプログラムを使用することである。
- GPIO 0 の立下り割り込みを待ちたいのであれば、gpio edge 0 falling と設定する。
int wiringPiISR(int pin,int edgeType,void (*function)(void)) †
- この関数は、指定されたピンで割り込みを受け取る関数を登録する。
- edgeTypeのパラメータは、INT_EDGE_FALLING, INT_EDGE_RISING, INT_EDGE_BOTH, INT_EDGE_SETUP のいずれか。
INT_EDGE_SETUPの場合、ピンの初期化は行われない
既に他の場所で(たとえば、gpioプログラムを使用して)ピンを設定済みであると想定されるが、他のタイプの1つを指定すると、ピンは次のようにエクスポートおよび初期化される
- ピン番号は、現在のモードで提供される nativewiringPi、BCM_GPIO、またはSysモード。
- この関数はどのモードでも機能し、機能するためにroot権限は必要ない。
- この関数は、割り込みがトリガーされると呼び出される。トリガーされると、関数を呼び出す前にディスパッチャーでクリアされるため、ハンドラーを終了する前に後続の割り込みが発生しても、それは見逃されない。(ただし、追跡できる割り込みは1つだけ。1つの処理中に複数の割り込みが発生した場合、それらは無視される)
- この関数は高い優先度で実行され(プログラムがsudoを使用して実行された場合、またはrootとして実行された場合)、メインプログラムと同時に実行される。すべてのグローバル変数、開いているファイルハンドルなどに完全にアクセスできる。
- この機能の使用方法の詳細については、isr.cサンプルプログラムを参照。
Concurrent Processing(multi-threading) †
- PosixスレッドのLinux実装への簡略化されたインターフェースと、ミューテックスにアクセスするための(簡略化された)メカニズムがある(相互排除)。
- これらの関数を使用すると、メインプログラムと同時に実行され、ミューテックスメカニズムを使用して新しいプロセス(メインプログラム内の関数)を作成し、それらの間で変数を安全に渡すことができる。
int piThreadCreate(name) †
piLock (int keyNum) ; †
piUnlock (int keyNum) ; †
- これらにより、メインプログラムからプログラムで実行されているスレッドに変数の更新を同期させることができる。
- keyNumは0〜3の数値で、「キー」を表す。別のプロセスが同じキーをロックしようとすると、最初のプロセスが同じキーをアンロックするまで、そのキーは停止する。
- メインプログラムとスレッドの間でデータを交換するときに有効なデータを確実に取得するために、これらの関数を使用する必要がある場合がある。そうでない場合、データのコピー中にスレッドが途中でウェイクアップしてデータを変更する可能性があるため、終了するデータアップコピーが不完全または無効。例については、examplesディレクトリーの wfi.c プログラムを参照のこと。
その他 関数 †
piBoardRev(void) †
- RaspberryPiのボードリビジョンを返す。1 or 2
- BCM_GPIOピンの一部は、ボードリビジョン1から2に移動したときに番号と機能が変更されたため、BCM_GPIOピン番号を使用している場合は、違いに注意する必要がある。
wpiPinToGpin(int wPiPin) †
- wiringPiから割り当てられているBCM_GPIOピンの番号を返す
ボードのリビジョンも考慮に入っている。
setPadDrive(int group,int value) †
- 特定グループのピンのために、pad driverの強度を設定することができる。
- 3グループのピンと、ドライブ強度を0~7がある。
詳細を知っているのでなければ、これを触らないこと。
参考資料 †