#author("2020-04-09T08:15:37+00:00","default:mizutu","mizutu")
[[私的AI研究会]] > ラズパイTips~

* WiringPi API [#n63f0f0a]
 以下はサイト「http://nanicananica.blog.fc2.com/blog-entry-10.html」の再編集です。

#contents
#br

** Setup Function [#daaba94c]
*** int wiringPiSetup(void) [#a394055b]
*** int wiringPiSetupGpio(void) [#fd4fd713]
*** int wiringPiSetupSys(void) [#l0b952c9]
- Setup Functionsの一つは、プログラムの最初に呼ばなければならない。~
もし、GPIOの初期化処理に失敗して戻り値-1が返された場合は、エラーナンバーより調査する。

*** int wiringPiSetup(void) [#o0e68f47]
- wiringPi systemの初期化で、wiringPiピンナンバーを利用することを前提とする。~
実際のBroadcom GPIOピン番号を基礎とした、0~16の仮想ピンをマッピングしたもの。ピンページを確認してwiringPiピン配置と、Broadcom GPIOの物理位置を確認すること。

*** wiringPiSetupGpio(void) [#s6a4b0e3]
- これも上の関数と同じ。しかし、こちらはプログラムがBroadcom GPIOのピン番号を直接呼び出すのを許す。

*** wiringPiSetupSys(void) [#we42f07d]
- wiringPiシステムを初期化するが、/sys/class/gpioインタフェースを使う。~
これはrootでなくてもCallすることができる。このモードのピン番号は、native Broadcom GPIO番号である。~
Note:このモードでは、/sys/calss/gpioにてエクスポートされたピンだけを利用することができる。~
-- ピンをプログラムで呼び出す前に、事前にエクスポートすること。~
-- シェルスクリプトで利用することができる。~
-- system()関数を使用しても使うことができる。
-- 関数のいくつかは、root権限でないと動かない。

** General wiring functions [#m42057db]
*** void piMode(int pin,int mode) [#p8a81b13]
- ピンのINPUT、OUTPUT、PWM_OUTPUTを設定する。~
Note: wiringPi pin 1(BCM_GPIO 18)は、PWM出力をサポートしている。ピン番号は、ピンテーブルから取得される値。

*** void digitalWrite(int pin, int value) [#rd9a6138]
- 引数pinのピンにHIGHかLOW(1か0)を設定する。

*** void digitalWriteByte(int value) [#h92fe4e0]
- 8つのGPIOに、8bitで設定した値を設定する。~
これは、8bitすべてを一回で制御するもっとも早い方法である。

*** void pwmWrite(int pin, int value) [#i8001c2c]
- PWMレジスタに値を書き込みむ。0~1024の間をとりる。~
PWMをサポートしているのは、pin1(BCM_GPIO18)だけである。

*** int digitalRead(int pin) [#b50f5b4e]
- 引数で与えられたpinの値を戻り値とし返す。HighまたはLowのロジックレベルで戻す。

*** void pullUpDnControl(int pin, int pud) [#g6fba400]
- 引数のピンのプルアップ、プルダウンを設定する。~
- 事前に該当のピンをINPUTに設定しておくこと。BCM2835は、プルアップ、プルダウン内部抵抗を両方持っている。~
- パラメータPDU_OFF(プルアップ/ダウンなし)、PUD_DOWN(グランド接地)、PUD_UP(3.3Vに釣る)
の値を設定できる。~
- この関数は、Sys modeだと効果がない。プルアップ/プルダウンををアクティブにしたい場合は、プログラムを起動させる前に、スクリプトなどでGPIO設定を行なうこと。

** PWM Control [#x36e72a8]
> Sys mode 時は、PWMコントロールはできない。

*** pwmSetMode(int mode) [#jfda0d07]
- PWMは、"balanced"と、"mark:space"の2種類のモードがある。
- "mark:space"の既定値は"balanced"。
- "PWM_MODE_BAL"と、"PWM_MODE_MS"を引数として与えることで、切り替えることができる。

*** pwmSetRange(unsigned int range) [#q0e484dd]
- PWMジェネレータ内の範囲レジスタを設定する。
- 既定値は1024。

*** pwmSetClock(int divisor) [#h4422a35]
- PWMクロックの除数を設定する。

** Timing functions [#y6b6ef78]
*** unsigned int millis(void) [#kf567087]
- wiringPiSetup関数(のどれか)を呼んでからミリ秒を示す数値を返す。~
49日毎に、32bit符号なしの値を返す。

*** void delay(unsigned int howLong) [#a8a888b6]
- 引数howLongで与えられた数値のミリ秒分、処理をポーズする。~
- Linuxのマルチタスクの性質上、指定した値より長くなる可能性がある。
- 最大ディレイは、符号なし32bit整数の最大値から約49日。

*** void delayMicroseconds(unsigned int howLong) [#d0a73b15]
- 引数howLongで与えられた数値のマイクロ秒分、処理をポーズする。
- Linuxのマルチタスクの性質上、指定した値より長くなる可能性がある。
- 最大ディレイは、符号なし32bit整数の最大値から約71分。

** Program/Thread Priority [#l8158691]
*** int piHiPri(int priority) [#cb7abf34]
- より優先度の高いプログラムをリアルタイムで動作させられるように、優先度をシフトできる。
- 優先度パラメータは、0(初期値)~99(最大)の間で設定できる。~
これは、プログラム自体を早くするものではないが、タイムスライスで割り当てられる時間を多くする。~
優先度パラメータは相対的なものなので、他のプログラムの影響を受ける。
- 戻り値が0の時は成功。1はエラー。~
エラーナンバーが返されたら、グローバル変数 errno で確認すること。~
- root権限にて動作している時だけ優先度を変更できる。rootでないときに、この関数を呼ばれても何も起きない。

** Interrupt [#q3ba42c9]
> GPIO割り込みhandingパッチを当てられたカーネルで、プログラムに割り込み待ち処理が可能になる。~
割り込みを待つ間、プロセッサ―の処理を解放する。~
GPIOの立ち上がり割り込み、立下りの両方で割り込みを設定することができる。

> waitForInterrupt()関数は廃止となる。より簡単で新しい、wiringPiLSR()関数を使用すること。

*** int waitForInterrupt(int pin,int timeOut) [#j66ac549]
- 関数が呼ばれると、割り込みイベントが起きるまで待ち、プログラムが停止状態になる。~
- timeOutパラメータのミリ秒分を設定することができる。また-1を設定することで、永久に割り込みを待つこともできる。~
- エラーが起きた場合は、-1を戻す。errnoも適切に設定される。~
- タイムアウトの時は0 を返す。割り込み成功した時は1を返す。
- waitForInterruptの関数を呼ぶ前に、GPIOの初期化を行なうこと。
- GPIO 0 の立下り割り込みを待ちたいのであれば、gpio edge 0 falling と設定する。

*** int wiringPiISR(int pin,int edgeType,void (*function)(void)) [#q65a78c3]
- この関数は、指定されたピンの割り込みを待つ。~
- edgeTypeのパラメータは、INT_EDGE_FALLING, INT_EDGE_RISING, INT_EDGE_BOTH, INT_EDGE_SETUP~
- ピンの番号は、共通モード(native wiringPi , BCM_GPIO, Sys)で供給される。
- 割り込みが入ると、この関数が呼ばれる。この関数は、高い優先度で動作し、メインプログラムと同時に実行される。~
グローバル変数や、オープンファイルハンドルのフルアクセスを持ってる。詳細な使い方は、isr.c の例を参照のこと。

** Concurrent Processing(multi-threading) [#j9a9d5e0]
- wiringPiは、Linux implementtation of Posix threadsへの簡単なインタフェースだけでなくmutex へのアクセスも実装している。~
- これらの機能は、メインプログラム内の一つの処理として作成することができ、これらの機能を使用して、安全に変数へ渡すことができる。

*** int piThreadCreate(name) [#b9afbefa]
  :~
  :~

** Misc.Functions [#i6e2af22]
*** piBoardRev(void) [#rcad9ac1]
- RaspberryPiのボードリビジョンを返す。1 or 2

*** wpiPinToGpin(int wPiPin) [#sdb33026]
- wiringPiから割り当てられているBCM_GPIOピンの番号を戻す~
ボードのリビジョンも考慮に入っている。

*** setPadDrive(int group,int value) [#t281668d]
- 特定グループのピンのために、pad driverの強度を設定することができる。~
- 3グループのピンと、ドライブ強度を0~7がある。~
詳細を知っているのでなければ、これを触らないこと。

* 参考資料 [#xd60ce1d]
- [[wiringPi API>+http://nanicananica.blog.fc2.com/blog-entry-10.html]]~
- [[原文:Gordons Projects>+https://projects.drogon.net/raspberry-pi/wiringpi/functions/]]~
#br