Orange Pi OneでGPIOを扱う方法

 掲題の通り、Orange Pi OneでGPIOを使用するための方法を調べた(そして中途半端に試した)のでメモ。

 

オンボードのLEDを制御

 いきなりGPIOの取り扱いから脱線しますが、デバイスファイルとして取り扱うのがどんな感じか手早く理解できるため記載。
 前提として、Orange Pi OneにはGreenとRedのLEDが1つずつ搭載されています。Armbianで動作させていると、デフォルトではGreen LEDは常時点灯、Red LEDは常時消灯となっているように見えます。
 これらのLEDを制御するには以下のようなコマンドを実行します。

# Red LEDの点灯トリガを無に設定
$ echo none > /sys/class/leds/red_led/trigger

# Red LEDの明るさを1に設定
$ echo 1 > /sys/class/leds/red_led/brightness

 トリガは、文字通りトリガで、何を引き金としてLEDを点灯させるかを設定します。上記の例ではnone、すなわち何かを引き金に点灯することはありません。トリガの選択肢は以下。

none mmc0 mmc1 timer heartbeat backlight default-on

 mmc0を指定すれば、内蔵SDカードスロットへのアクセスに連動してLEDを点灯させることができます。

 明るさの方はbrightnessといいつつもアナログ出力ではないため、消灯時:0/点灯時:1の2値制御となっています(0.5のような値を書き込もうとするとwrite errorになります)。
 
 Green LEDは常時点灯(Power表示)、Red LEDはSDアクセス表示とするには、以下のようなコマンドを叩けば良さそうです。

# Green LEDのトリガをnone(またはdefault-on)に設定
$ echo none > /sys/class/leds/green_led/trigger
# Red LEDのトリガをmmc0に設定
$ echo mmc0 > /sys/class/leds/red_led/trigger

# Green LEDを点灯(default-on時は不要)
$ echo 1 > /sys/class/leds/green_led/brightness
# Red LEDはトリガを設定しているため、明示的にbrightnessを設定しなくても点滅

 こちらを参考にさせていただきました。
 LED SD Card indicator - Armbian - OrangePi - Powered by Discuz!
 

GPIOの制御

カーネルモジュール(gpio-sunxi)使用編

 gpio-sunxiをロードするとGPIOにアクセスできるようになります。

# gpio-sunxiをロード
$ sudo modprobe gpio-sunxi
# 現れるデバイスファイルを確認
$ ls /sys/class/gpio_sw
PA0  PA10  PA14  PA21  PA6  PA8  PC4  PD14  PG7  PG9
PA1  PA13  PA2   PA3   PA7  PA9  PC7  PG6   PG8
# 例としてPA0内を確認
$ ls -l /sys/class/gpio_sw/PA0/
total 0
-rw-rw-r-- 1 root root 4096 Sep  6 22:27 cfg
-rw-rw-r-- 1 root root 4096 Sep  6 22:27 data
lrwxrwxrwx 1 root root    0 Sep  6 22:27 device -> ../../../gpio_sw.5
-rw-rw-r-- 1 root root 4096 Sep  6 22:27 drv
drwxr-xr-x 2 root root    0 Sep  6 22:27 power
-rw-rw-r-- 1 root root 4096 Sep  6 22:27 pull
lrwxrwxrwx 1 root root    0 Sep  6 22:27 subsystem -> ../../../../../class/gpio_sw
-rw-r--r-- 1 root root 4096 Sep  6 22:16 uevent

 という感じになっており、/sys/class/gpio_sw/PA0/dataを読み書きする感じでアクセスできそうです。
 現時点でOrange Pi Oneの40ピンヘッダに繋ぐコネクタを用意していないので、動作検証は別途行います。

 こちらを参考にさせていただきました。
OrangePi-PCを使ってみる
Status of Orange Pi Boards GPIO Support
 

WiringOP使用編

 RaspberryPiでGPIOを扱うライブラリとしてスタンダードなWiringPiを、OrangePi用に移植したWiringOpというライブラリがあるようです。
GitHub - zhaolei/WiringOP: This is a GPIO access library for OrangePi. It is based on the original WiringPi for Raspberry Pi.
 経緯は不明ですが、READMEにはwiringBPと書かれていたりして、RaspberryPi⇒BananaPi⇒OrangePiと移植されてきたのかもしれません。

 以下のように、git cloneした後、ビルドして使用可能になります。

# ブランチh3を指定しているがデフォルトブランチで、他のブランチも現状存在しない
$ git clone https://github.com/zhaolei/WiringOP.git -b h3
$ cd WiringOP
$ chmod +x ./build
$ sudo ./build

 ビルド中に、以下のコンソール出力がありました。

./build: 4: ./build: [[: not found
wiringPi Build script
=====================


WiringPi Library
[UnInstall]
[Compile] wiringPi.c
wiringPi.c: In function ‘digitalRead’:
wiringPi.c:2167:8: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
        read   (sysFds [pin], &c, 1) ;
        ^
wiringPi.c:2201:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
       read   (sysFds [pin], &c, 1) ;
       ^
wiringPi.c: In function ‘digitalWrite’:
wiringPi.c:2267:10: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
          write (sysFds [pin], "0\n", 2) ;
          ^
wiringPi.c:2269:10: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
          write (sysFds [pin], "1\n", 2) ;
          ^
wiringPi.c:2302:4: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
    write (sysFds [pin], "0\n", 2) ;
    ^
wiringPi.c:2304:4: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
    write (sysFds [pin], "1\n", 2) ;
    ^
wiringPi.c: In function ‘waitForInterrupt’:
wiringPi.c:2598:3: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
   (void)read (fd, &c, 1) ;
   ^
wiringPi.c: In function ‘wiringPiISR’:
wiringPi.c:2728:5: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
     read (sysFds [bcmGpioPin], &c, 1) ;
     ^
[Compile] wiringSerial.c
wiringSerial.c: In function ‘serialPutchar’:
wiringSerial.c:146:3: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
   write (fd, &c, 1) ;
   ^
wiringSerial.c: In function ‘serialPuts’:
wiringSerial.c:158:3: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
   write (fd, s, strlen (s)) ;
   ^
[Compile] wiringShift.c
[Compile] piHiPri.c
[Compile] piThread.c
[Compile] wiringPiSPI.c
[Compile] wiringPiI2C.c
[Compile] softPwm.c
[Compile] softTone.c
[Compile] softServo.c
[Compile] mcp23008.c
[Compile] mcp23016.c
[Compile] mcp23017.c
[Compile] mcp23s08.c
[Compile] mcp23s17.c
[Compile] sr595.c
[Compile] pcf8574.c
[Compile] pcf8591.c
pcf8591.c: In function ‘myAnalogWrite’:
pcf8591.c:44:3: warning: ignoring return value of ‘write’, declared with attribute warn_unused_result [-Wunused-result]
   write (node->fd, b, 2) ;
   ^
[Compile] mcp3002.c
[Compile] mcp3004.c
[Compile] mcp4802.c
[Compile] mcp3422.c
mcp3422.c: In function ‘myAnalogRead’:
mcp3422.c:62:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
       read (node->fd, buffer, 4) ;
       ^
mcp3422.c:68:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
       read (node->fd, buffer, 3) ;
       ^
mcp3422.c:74:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
       read (node->fd, buffer, 3) ;
       ^
mcp3422.c:80:7: warning: ignoring return value of ‘read’, declared with attribute warn_unused_result [-Wunused-result]
       read (node->fd, buffer, 3) ;
       ^
[Compile] max31855.c
[Compile] max5322.c
[Compile] sn3218.c
[Compile] drcSerial.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]

WiringPi Devices Library
[UnInstall]
[Compile] ds1302.c
[Compile] maxdetect.c
[Compile] piNes.c
[Compile] gertboard.c
[Compile] piFace.c
[Compile] lcd128x64.c
[Compile] lcd.c
[Compile] piGlow.c
[Link (Dynamic)]
[Install Headers]
[Install Dynamic Lib]

GPIO Utility
[Compile] gpio.c
gpio.c:804:13: warning: ‘doPadDrive’ defined but not used [-Wunused-function]
 static void doPadDrive (int argc, char *argv [])
             ^
gpio.c:892:13: warning: ‘doGbw’ defined but not used [-Wunused-function]
 static void doGbw (int argc, char *argv [])
             ^
gpio.c:934:13: warning: ‘doGbr’ defined but not used [-Wunused-function]
 static void doGbr (int argc, char *argv [])
             ^
gpio.c: In function ‘doLoad’:
gpio.c:228:6: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result]
      system (cmd) ;
      ^
gpio.c:235:6: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result]
      system (cmd) ;
      ^
gpio.c:274:7: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result]
       system (cmd) ;
       ^
gpio.c:280:7: warning: ignoring return value of ‘system’, declared with attribute warn_unused_result [-Wunused-result]
       system (cmd) ;
       ^
[Compile] extensions.c
[Compile] readall.c
[Compile] pins.c
[Link]
[Install]

All Done.

NOTE: To compile programs with wiringBP v2, you need to add:
    -lwiringPi
  to your compile line(s) To use the Gertboard, MaxDetect, etc.
  code (the devLib), you need to also add:
    -lwiringPiDev
  to your compile line(s).

 先頭に現れた、

./build: 4: ./build: [[: not found

 は、ビルドスクリプトの4行目を見る限り、実行ユーザがrootじゃなければsudo付けるための判定のようで、文法間違えてるわけでもないようで何を怒られているのかパッと見判りません。その他、大量にwarningが発生していますが、実行体は生成されているし、ビルドスクリプト中のビルド失敗時検出ロジックでもビルド失敗と認識されていません。

 とりあえずこれらは静観することにして、バージョン確認してみます。

$ gpio -v
gpio version: 2.20
Copyright (c) 2012-2014 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty

Banana Pro Details:
  Type: Banana Pro, Revision: 1.2, Memory: 1024MB, Maker: LeMaker

 またBananaとか出てきます。というか、メモリやメーカーも正しく認識されていないような出力になっています。先のビルド時の警告の件もあり、ちょっと不安なのでソースコードを追いかけてみます。
 上記のバージョン情報を表示しているロジックはgpio.cのmain()関数内の以下のコードのようです。

  if (strcmp (argv [1], "-v") == 0)
  {
    printf ("gpio version: %s\n", VERSION) ;
    printf ("Copyright (c) 2012-2014 Gordon Henderson\n") ;
    printf ("This is free software with ABSOLUTELY NO WARRANTY.\n") ;
    printf ("For details type: %s -warranty\n", argv [0]) ;
    printf ("\n") ;
    piBoardId (&model, &rev, &mem, &maker, &overVolted) ;
    if (model == PI_MODEL_UNKNOWN)
    {
      printf ("Your Raspberry Pi has an unknown model type. Please report this to\n") ;
      printf ("    projects@drogon.net\n") ;
      printf ("with a copy of your /proc/cpuinfo if possible\n") ;
    }
    else
    {
      printf ("Banana Pro Details:\n") ;
      printf ("  Type: %s, Revision: %s, Memory: %dMB, Maker: %s %s\n", 
	  piModelNames [model], piRevisionNames [rev], mem, piMakerNames [maker], overVolted ? "[OV]" : "") ;
    }
    return 0 ;
  }

 OrangePi用のWiringOpなのに、"Banana Pro Details"とかリテラルで記述されています。実害無いので無視するとして、piBoardId()関数でメモリやメーカーなどの情報を取得していることが解ります。
 piBoardId()が実装されているのは、wiringPi.cで、/proc/cpuinfoのRevisionの行からボードを特定する仕組みになっているようです。そして、ボードを特定したら、メモリ容量を実機から取得するのではなく、固定値としてリテラルで設定していることが解りました。モデル、リビジョン、メーカーといった各情報も動的に取得するのではなく、ここで固定値(ヘッダに定義されたコード値)を設定しています。

  /**/ if (strcmp (c, "0002") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_1   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
  else if (strcmp (c, "0003") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_1_1 ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
  else if (strcmp (c, "0004") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_SONY   ; }
  else if (strcmp (c, "0005") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_QISDA  ; }
  else if (strcmp (c, "0006") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
  else if (strcmp (c, "0007") == 0) { *model = PI_MODEL_A  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_EGOMAN ; }
  else if (strcmp (c, "0008") == 0) { *model = PI_MODEL_A  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_SONY ; ; }
  else if (strcmp (c, "0009") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 256 ; *maker = PI_MAKER_QISDA  ; }
  else if (strcmp (c, "000d") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
  else if (strcmp (c, "000e") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
  else if (strcmp (c, "000f") == 0) { *model = PI_MODEL_B  ; *rev = PI_VERSION_2   ; *mem = 512 ; *maker = PI_MAKER_EGOMAN ; }
  else if (strcmp (c, "0010") == 0) { *model = PI_MODEL_BP ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
  else if (strcmp (c, "0011") == 0) { *model = PI_MODEL_CM ; *rev = PI_VERSION_1_2 ; *mem = 512 ; *maker = PI_MAKER_SONY   ; }
//add for BananaPro by LeMaker team
  else if (strcmp (c, "0000") == 0) { *model = PI_MODEL_BPR;  *rev = PI_VERSION_1_2;  *mem = 1024;  *maker = PI_MAKER_LEMAKER;}
//end 2014.09.30
  else                              { *model = 0           ; *rev = 0              ; *mem =   0 ; *maker = 0 ;               }
}

 上記コードでstrcmpしている変数cに/proc/cpuinfoのRevisionの末尾4桁が入ります。で、Orange Pi Oneは"0000"となっています。

$ grep Revision /proc/cpuinfo
Revision        : 0000

 ので、一番最後のelse ifにマッチし、BananaProだと判定されているようです。メモリ1024MB表示はここのリテラル値に由来するもので、システム上異常値が認識されているわけでは無いことが解ります。BananaProとOrangePiはRevision情報が同値となるようで識別できないので、真面目に修正するなら他の情報も参照する必要がありそうです。
 とはいえ、不正値の表示には焦りましたが、実害無いのでこれも無視します。

 続いて、全ピンの状態を読み出してみます。

$ gpio readall
 +-----+-----+----------+------+---+--OrangePiPC--+---+------+---------+-----+--+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 |     |     |     3.3v |      |   |  1 || 2  |   |      | 5v       |     |     |
 |   2 |   8 |    SDA.0 | ALT5 | 0 |  3 || 4  |   |      | 5V       |     |     |
 |   3 |   9 |    SCL.0 | ALT5 | 0 |  5 || 6  |   |      | 0v       |     |     |
 |   4 |   7 |   GPIO.7 | ALT3 | 0 |  7 || 8  | 0 | ALT3 | TxD3     | 15  | 14  |
 |     |     |       0v |      |   |  9 || 10 | 0 | ALT3 | RxD3     | 16  | 15  |
 |  17 |   0 |     RxD2 | ALT3 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1   | 1   | 18  |
 |  27 |   2 |     TxD2 | ALT3 | 0 | 13 || 14 |   |      | 0v       |     |     |
 |  22 |   3 |     CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT3 | GPIO.4   | 4   | 23  |
 |     |     |     3.3v |      |   | 17 || 18 | 0 | ALT3 | GPIO.5   | 5   | 24  |
 |  10 |  12 |     MOSI | ALT4 | 0 | 19 || 20 |   |      | 0v       |     |     |
 |   9 |  13 |     MISO | ALT4 | 0 | 21 || 22 | 0 | ALT3 | RTS2     | 6   | 25  |
 |  11 |  14 |     SCLK | ALT4 | 0 | 23 || 24 | 0 | ALT4 | CE0      | 10  | 8   |
 |     |     |       0v |      |   | 25 || 26 | 0 | ALT3 | GPIO.11  | 11  | 7   |
 |   0 |  30 |    SDA.1 | ALT4 | 0 | 27 || 28 | 0 | ALT4 | SCL.1    | 31  | 1   |
 |   5 |  21 |  GPIO.21 | ALT3 | 0 | 29 || 30 |   |      | 0v       |     |     |
 |   6 |  22 |  GPIO.22 | ALT3 | 0 | 31 || 32 | 0 | ALT3 | RTS1     | 26  | 12  |
 |  13 |  23 |  GPIO.23 | ALT3 | 0 | 33 || 34 |   |      | 0v       |     |     |
 |  19 |  24 |  GPIO.24 | ALT3 | 0 | 35 || 36 | 0 | ALT3 | CTS1     | 27  | 16  |
 |  26 |  25 |  GPIO.25 | ALT3 | 0 | 37 || 38 | 0 | ALT3 | TxD1     | 28  | 20  |
 |     |     |       0v |      |   | 39 || 40 | 0 | ALT3 | RxD1     | 29  | 21  |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+--OrangePIPC--+------+----------+-----+-----+

 40Pinコネクタの情報が表示されています(前述の通りピンヘッダに挿すコネクタが手元にないため、ピン配置等が正しいのかは未確認)。このコマンド結果ではBananaProではなく、OrangePIPCと表示されています。実際はOrangePiOneなのですけど。これも実害無いのかソースを確認してみます。
 readall時のコードの実体は、readall.cのdoReadall()関数のようです。で、この関数内で、

  piBoardId (&model, &rev, &mem, &maker, &overVolted) ;

  /**/ if ((model == PI_MODEL_A) || (model == PI_MODEL_B))
    abReadall (model, rev) ;
  else if (model == PI_MODEL_BP) 
    bPlusReadall () ;
  else if (model == PI_MODEL_CM)
    cmReadall () ;
  else if (model == PI_MODEL_BPR) //add for BananaPro by lemaker team
	 OrangePiReadAll();	//guenter 
  	 // guenter BPReadAll();
  else
    printf ("Oops - unable to determine board type... model: %d\n", model) ;

 といったことをやっています。先に見たのと同じpiBoardId()関数で取得した(正しくない)モデル情報が(正しくないことを分かったうえで)BananaProならOrangePiReadAll()という関数を呼び出す作りになっています。マジか。
 で、OrangePiReadAll()関数内で、

  printf (" +-----+-----+----------+------+---+--OrangePiPC--+---+------+---------+-----+--+\n") ;
  printf (" | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |\n") ;
  printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
  for (pin = 1 ; pin <= 40 ; pin += 2)
    readallPhys (pin) ;
  printf (" +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+\n") ;
  printf (" | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |\n") ;
  printf (" +-----+-----+----------+------+---+--OrangePIPC--+------+----------+-----+-----+\n") ;	

 と、"OrangePIPC"という文字列をリテラルでねじ込んでいるために、誤判定されているBananaProでもなく、実際に正しいOrangePiOneでもなくOrangePIPCと表示されていることが解りました。
 これまた実害無いので無視します(何度目だ…)。

 続いて、WiringOpの認識している0番ピン(コネクタ上の11番ピン)を出力モードに変更してみます。

$ gpio mode 0 out
$ gpio readall
 +-----+-----+----------+------+---+--OrangePiPC--+---+------+---------+-----+--+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 |     |     |     3.3v |      |   |  1 || 2  |   |      | 5v       |     |     |
 |   2 |   8 |    SDA.0 | ALT5 | 0 |  3 || 4  |   |      | 5V       |     |     |
 |   3 |   9 |    SCL.0 | ALT5 | 0 |  5 || 6  |   |      | 0v       |     |     |
 |   4 |   7 |   GPIO.7 | ALT3 | 0 |  7 || 8  | 0 | ALT3 | TxD3     | 15  | 14  |
 |     |     |       0v |      |   |  9 || 10 | 0 | ALT3 | RxD3     | 16  | 15  |
 |  17 |   0 |     RxD2 |  OUT | 0 | 11 || 12 | 0 | ALT3 | GPIO.1   | 1   | 18  |
 |  27 |   2 |     TxD2 | ALT3 | 0 | 13 || 14 |   |      | 0v       |     |     |
 |  22 |   3 |     CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT3 | GPIO.4   | 4   | 23  |
 |     |     |     3.3v |      |   | 17 || 18 | 0 | ALT3 | GPIO.5   | 5   | 24  |
 |  10 |  12 |     MOSI | ALT4 | 0 | 19 || 20 |   |      | 0v       |     |     |
 |   9 |  13 |     MISO | ALT4 | 0 | 21 || 22 | 0 | ALT3 | RTS2     | 6   | 25  |
 |  11 |  14 |     SCLK | ALT4 | 0 | 23 || 24 | 0 | ALT4 | CE0      | 10  | 8   |
 |     |     |       0v |      |   | 25 || 26 | 0 | ALT3 | GPIO.11  | 11  | 7   |
 |   0 |  30 |    SDA.1 | ALT4 | 0 | 27 || 28 | 0 | ALT4 | SCL.1    | 31  | 1   |
 |   5 |  21 |  GPIO.21 | ALT3 | 0 | 29 || 30 |   |      | 0v       |     |     |
 |   6 |  22 |  GPIO.22 | ALT3 | 0 | 31 || 32 | 0 | ALT3 | RTS1     | 26  | 12  |
 |  13 |  23 |  GPIO.23 | ALT3 | 0 | 33 || 34 |   |      | 0v       |     |     |
 |  19 |  24 |  GPIO.24 | ALT3 | 0 | 35 || 36 | 0 | ALT3 | CTS1     | 27  | 16  |
 |  26 |  25 |  GPIO.25 | ALT3 | 0 | 37 || 38 | 0 | ALT3 | TxD1     | 28  | 20  |
 |     |     |       0v |      |   | 39 || 40 | 0 | ALT3 | RxD1     | 29  | 21  |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 | BCM | wPi |   Name   | Mode | V | Physical | V | Mode | Name     | wPi | BCM |
 +-----+-----+----------+------+---+--OrangePIPC--+------+----------+-----+-----+

 0番ピンのモードが"OUT"に変更されていることが確認できます。

 この状態で0番ピンをON/OFFしてみます。

# 0番ピンをON
$ gpio write 0 1
# 1秒待機
$ sleep 1
# 0番ピンをOFF
$ gpio write 0 0

 前述の通りピンヘッダに挿すコネクタが手元にないため、実際にGPIOの状態が変化したかは確認できていませんが、とりあえずコマンドは見かけ上のエラーが発生せず叩けることまでは確認できました。

 WiringOpにはWiringPiの移植版*1であるため、コマンド類の説明はWiringPiのものが参考になります。
The GPIO utility | Wiring Pi
 



 一旦今回はここまでで、コネクタ等を調達した後に続ける予定です。
  



以上。

*1:文中で触れている通り、いろいろアレですが、とりあえず動きそうな状態で公開していただいているのは素直に有り難いことで、開発者の方には感謝しています。