# Raspberry Pi, Orange Pi GPIO制御

**URL:** https://forum.ficusonline.com/t/topic/72
**Category:** Orange Pi
**Created:** [2017 年 1 月 17 日午前 5:23 UTC](https://forum.ficusonline.com/t/topic/72 "2017-01-17T05:23:44Z")
**Posts on this page:** 10
**Page:** 1

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2017 年 1 月 17 日午前 5:23 UTC](https://forum.ficusonline.com/t/topic/72/1 "2017-01-17T05:23:44Z")

</div>

Raspbianには[Wiringpi](http://wiringpi.com/)というGPIO制御の専用ライブラリがリリースされていますが、/sys/class/gpioにGPIOを操作するプラットフォームが予め用意されているため、これを操作することでもGPIO制御ができます。

[https://www.kernel.org/doc/Documentation/gpio/sysfs.txt](https://www.kernel.org/doc/Documentation/gpio/sysfs.txt)

 ![](https://forum.ficusonline.com/uploads/default/original/1X/61e7922ab17ab4bd8c7e011e393effbda873d7ee.png)

まず使用するGPIOピンを有効にします（12ピンの場合、物理的なピン番号ではありません）。

> echo 12 \> /sys/class/gpio/export

/sys/class/gpio/gpio12/ というフォルダが作成されます。

 ![](https://forum.ficusonline.com/uploads/default/original/1X/74d8f0df137a97084d1bb735dc4f286ae9599130.png)

このフォルダ内の以下ファイル内容を指定することでGPIOの機能を指定します。

“direction” … 入力 “in” または出力 “out” を指定

> sudo echo in \> /sys/class/gpio/gpio12/direction

“value” … 出力として0 (low) または 1 (high)を指定。

> sudo echo 1 \> /sys/class/gpio/gpio12/value

“edge” … “none”, “rising”, “falling”, or “both”. エッジ波形の読取り

> sudo echo rising \> /sys/class/gpio/gpio12/edge

“active\_low” … 読取り 0 (false) または 1 (true)のどちらかをアクティブに設定

> sudo echo 0 \> /sys/class/gpio/gpio12/active\_low

GPIO制御を解除するには、

> echo 12 \> /sys/class/gpio/unexport

### 赤色LEDと緑色LEDの制御

起動時の設定（SDカードへのアクセス時、赤色LEDを点灯。パワーON時、緑色LED点灯）

`/boot/config.txt`

```auto
dtparam=act_led_trigger=mmc0
                 
dtparam=act_led_activelow=off
# red-led 35              
dtparam=act_led_gpio=35      
                            
dtparam=pwr_led_trigger=none
                             
dtparam=pwr_led_activelow=on
# green-led 47         
dtparam=pwr_led_gpio=47

```

各LEDのステータス確認・変更は、

```auto
# cat /sys/class/leds/led0/brightness
# echo 255 > /sys/class/leds/led0/brightness

# echo none > /sys/class/leds/led0/trigger
# cat /sys/class/leds/led0/trigger
[none] rc-feedback kbd-scrolllock kbd-numlock kbd-capslock kbd-kanalock kbd-shiftlock kbd-altgrlock kbd-ctrllock kbd-altlock kbd-shiftllock kbd-shiftrlock kbd-ctrlllock kbd-ctrlrlock timer oneshot heartbeat backlight gpio cpu cpu0 cpu1 cpu2 cpu3 default-on input panic actpwr mmc0

```

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2017 年 1 月 30 日午前 11:54 UTC](https://forum.ficusonline.com/t/topic/72/2 "2017-01-30T11:54:48Z")

</div>

以下Orange Pi PC GPIOのピン配列です（WiringOPによる出力）。上記の方法でexportする場合は **BCMの番号** を指定します。

```
 +-----+-----+----------+------+---+-Orange Pi+---+---+------+---------+-----+--+
 | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 | | | 3.3v | | | 1 || 2 | | | 5v | | |
 | 12 | 8 | SDA.0 | ALT5 | 0 | 3 || 4 | | | 5V | | |
 | 11 | 9 | SCL.0 | ALT5 | 0 | 5 || 6 | | | 0v | | |
 | 6 | 7 | GPIO.7 | ALT3 | 0 | 7 || 8 | 0 | ALT3 | TxD3 | 15 | 13 |
 | | | 0v | | | 9 || 10 | 0 | ALT3 | RxD3 | 16 | 14 |
 | 1 | 0 | RxD2 | ALT3 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1 | 1 | 110 |
 | 0 | 2 | TxD2 | ALT3 | 1 | 13 || 14 | | | 0v | | |
 | 3 | 3 | CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT3 | GPIO.4 | 4 | 68 |
 | | | 3.3v | | | 17 || 18 | 0 | ALT3 | GPIO.5 | 5 | 71 |
 | 64 | 12 | MOSI | ALT4 | 0 | 19 || 20 | | | 0v | | |
 | 65 | 13 | MISO | ALT4 | 0 | 21 || 22 | 0 | ALT3 | RTS2 | 6 | 2 |
 | 66 | 14 | SCLK | ALT4 | 0 | 23 || 24 | 0 | ALT4 | CE0 | 10 | 67 |
 | | | 0v | | | 25 || 26 | 0 | ALT3 | GPIO.11 | 11 | 21 |
 | 19 | 30 | SDA.1 | ALT4 | 0 | 27 || 28 | 0 | ALT4 | SCL.1 | 31 | 18 |
 | 7 | 21 | GPIO.21 | ALT3 | 0 | 29 || 30 | | | 0v | | |
 | 8 | 22 | GPIO.22 | ALT3 | 0 | 31 || 32 | 0 | ALT3 | RTS1 | 26 | 200 |
 | 9 | 23 | GPIO.23 | OUT | 0 | 33 || 34 | | | 0v | | |
 | 10 | 24 | GPIO.24 | OUT | 0 | 35 || 36 | 0 | ALT3 | CTS1 | 27 | 201 |
 | 20 | 25 | GPIO.25 | OUT | 0 | 37 || 38 | 0 | ALT3 | TxD1 | 28 | 198 |
 | | | 0v | | | 39 || 40 | 0 | ALT3 | RxD1 | 29 | 199 |
 +-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
 | BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
 +-----+-----+----------+------+---+-Orange Pi+---+------+----------+-----+-----+

```

WiringPiに相当するWiringOPというライブラリもリリースされています。これをインストールすることでも同様のGPIO設定・制御ができます。

ピン配列の確認コマンド

> gpio readall

GPIOの入出力設定：出力に設定する場合

> gpio mode **wPiの番号** output

出力の設定：１(High)または0(Low)

> gpio write **wPiの番号** 1

> **[GitHub - zhaolei/WiringOP: This is a GPIO access library for OrangePi. It is...](https://github.com/zhaolei/WiringOP)**
>
> This is a GPIO access library for OrangePi. It is based on the original WiringPi for Raspberry Pi.

**Orange Pi PC参照ページ**  
[http://linux-sunxi.org/Xunlong\_Orange\_Pi\_PC](http://linux-sunxi.org/Xunlong_Orange_Pi_PC)

 ![](https://forum.ficusonline.com/uploads/default/original/1X/d2a2aab5374ff55214b0bd8d2e07e35cc027a412.png)

PAxx, PCxxなどをexportする場合のピン番号(BCM番号)は下記の計算ルールに則り算出されます。

[http://linux-sunxi.org/GPIO](http://linux-sunxi.org/GPIO)

> echo XX \> /sys/class/gpio/export

**(position of letter in alphabet - 1) \* 32 + pin number**

例） PH18 は ( 8 - 1) \* 32 + 18 = 224 + 18 = 242 (Hがアルファベットの8番目).

ボード上のLEDピンは以下の通りです。GPIOピンとは繋がっていないため、これを制御するには配列ピン番号のルールに則った番号を指定します(/sys/class/leds/green\_led, /sys/class/leds/red\_led にアクセスすることでも制御できるようです)。

A red LED, connected to the PA15 pin.  
A green LED, connected to the PL10 pin.

**Ubuntu Bionic with Armbian Linux 4.19.62-sunxi** では

- **/sys/class/leds/orangepi:green:pwr**
- **/sys/class/leds/orangepi:red:status**

に変更になりました。

点灯モードがON/OFFではなく、明るさのレベル指定となっています。

例）

```auto
# echo 255 > /sys/class/leds/orangepi:red:status/brightness

```

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2017 年 2 月 3 日午前 8:35 UTC](https://forum.ficusonline.com/t/topic/72/3 "2017-02-03T08:35:46Z")

</div>

GPIOの設定確認

> ~$ cat /sys/kernel/debug/gpio

```
GPIOs 0-383, platform/sunxi-pinctrl, sunxi-pinctrl:
 gpio-6 (sysfs ) in hi
 gpio-7 (sysfs ) in lo
 gpio-9 (sysfs ) out lo
 gpio-10 (sysfs ) out lo
 gpio-15 (red_led ) out lo
 gpio-16 (? ) out hi
 gpio-20 (sysfs ) out lo
 gpio-354 (? ) out hi
 gpio-362 (green_led ) out hi

```

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2017 年 2 月 4 日午前 12:51 UTC](https://forum.ficusonline.com/t/topic/72/4 "2017-02-04T00:51:09Z")

</div>

> **[GPIO access from user space](https://forum.armbian.com/topic/1886-gpio-access-from-user-space/)**
>
> Hi Can any one tell me how to access the GPIO from user space, I have tried this: sudo echo 203 \> /sys/class/gpio/export But get this result -bash: /sys/class/gpio/export: Permission denied It's of course some thing really simple, but I haven't...

Raspberry Piの場合には/sys/class/gpioへのリードライトアクセス権が、ユーザpiも属しているgpioというグループにも付与されています。このためgpio制御はpiユーザレベルでできるようになっているようです。

Armbianにも同様のアクセス権を付与するため、グループgpioを追加しsudoユーザを所属させます。

> $ sudo su -

> # addgroup gpio

> # usermod -aG gpio ${SUDO\_USER} \<—グループsudoのユーザ /etc/groupを参照して追加

以下ファイルを新規に作成します。80-gpio-noroot.rulesの番号は任意です。

> **[File Permissions for exported GPIO changed in Kernel 4.1.6 - Raspberry Pi Forums](https://forums.raspberrypi.com/viewtopic.php?f=66&t=118879)**

> $ sudo pico /etc/udev/rules.d/80-gpio-noroot.rules

```
# /etc/udev/rules.d/80-gpio-noroot.rules
# need to add group "gpio" for reading and writing access GPIO dir
#
#Group gpio chown
SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chown -R root:gpio /sys/devices/platform/sunxi-pinctrl/gpio'"
#Group gpio chmod
SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chmod -R ug+rw /sys/devices/platform/sunxi-pinctrl/gpio'"

#Group gpio chown
SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chown -R root:gpio /sys/class/gpio'"
#Group gpio chmod
SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chmod -R ug+rw /sys/class/gpio'"

```

設定をリロード、または再起動します。（再起動が望ましい）

> $ sudo udevadm trigger --subsystem-match=gpio

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2017 年 6 月 12 日午後 1:15 UTC](https://forum.ficusonline.com/t/topic/72/6 "2017-06-12T13:15:56Z")

</div>

pimatic-gpioプラグインのgpio.coffeeのコード修正。gpioの定義をonoffモジュールのみで定義します。

[https://www.npmjs.com/package/pimatic-gpio](https://www.npmjs.com/package/pimatic-gpio)

**Gpio = env.Gpio or require(‘onoff’).Gpio**  
**-----\>**  
**Gpio = require(‘onoff’).Gpio**

```
      # * pimatic imports.
      Promise = env.require 'bluebird'
      assert = env.require 'cassert'
      _ = env.require 'lodash'

      Gpio = require('onoff').Gpio ここを修正
      Promise.promisifyAll(Gpio.prototype)

```

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2017 年 6 月 14 日午前 12:13 UTC](https://forum.ficusonline.com/t/topic/72/7 "2017-06-14T00:13:36Z")

</div>

Orange Piの場合、WiringOPを使用するよりもBCMのピン番号を直接指定するsysfsによるGPIO制御法を選択した方が間違いがありません。WiringOPではOrange PiのBCM番号に対応していないようです。（該当するRaspberry PiのBCM番号を指定しなければならないようです）

sysfsによるGPIO制御サンプルコード(Python, Node.js)を以下に列挙します。

**ユーザレベルで /sys/class/gpio ファイルに書込みを行うには、上の投稿で紹介したgpioグループを追加しユーザを所属させて下さい。 sudo pico /etc/udev/rules.d/80-gpio-noroot.rules も作成する必要があります。**

**Pythonサンプルコード**

**スイッチONでLED点灯**

```
#!/usr/bin/env python

import sys
import time
import os

if not os.getegid() == 0:
    sys.exit('Script must be run as root')

print ("Push Button LED ON")
print ("Press CTRL + C to exit")

#def pins_export():
        #try:
                #pin1export = open("/sys/class/gpio/export","w")
                #pin1export.write(str(63))
                #pin1export.close()
        #except IOError:
                #print "INFO: GPIO 63 already Exists, skipping export gpio"

def read_button():
        fp1 = open("/sys/class/gpio/gpio6/value","r")
        value = fp1.read()
        return int(value)
        fp1.close()

def write_led(value):
        fp2 = open("/sys/class/gpio/gpio10/value","w")
        fp2.write(str(value))
        fp2.close()

#pins_export()
try:
    while True:
        button_value = read_button()
        write_led(button_value)
        
except KeyboardInterrupt:
    print ("Goodbye.")

```

**LED点灯制御**

```
#!/usr/bin/env python

import sys
import time
import os

if not os.getegid() == 0:
    sys.exit('Script must be run as root')

print ("Blinking User LED")
print ("Enter CTRL+C to exit")

def ledon():
        value = open("/sys/class/leds/gpio20/value","w")
        value.write(str(1))
        value.close()

def ledoff():
        value = open("/sys/class/leds/gpio20/value","w")
        value.write(str(0))
        value.close()

while True:
        ledon()
        time.sleep(.5)
        ledoff()
        time.sleep(.5)

```

**Node.jsサンプルコード npm onoffモジュールによる操作**

```
"use strict";

var Gpio = require('../onoff').Gpio,
  led = new Gpio(10),
  button = new Gpio(6);

function exit() {
  //led.unexport();
  //button.unexport();
  process.exit();
}

button.watch(function (err, value) {
  if (err) {
    throw err;
  }

  led.writeSync(value);
});

process.on('SIGINT', exit);

```

> **[Orange Pi Zero, Python GPIO Library](https://forum.armbian.com/index.php?%2Ftopic%2F3084-orange-pi-zero-python-gpio-library%2F)**
>
> Hello i'm begginer in programing, but i'm learning slowly. I need use gpio pins in my Orange Pi Zero, but i can't find any library that work with my board. Google is not very usefull for me. I was using RPi.GPIO on my RPi projects, but this library...

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2019 年 3 月 17 日午前 7:33 UTC](https://forum.ficusonline.com/t/topic/72/8 "2019-03-17T07:33:31Z")

</div>

**ARMBIAN 5.73 stable Debian GNU/Linux 9 (stretch) 4.19.17-sunxi**

**ユーザレベルでのGPIO制御設定**

gpioグループの追加、gpioグループへのユーザ登録、udev設定ファイルを作成します。

```auto
$ sudo addgroup gpio

```

```auto
$ sudo usermod -aG gpio <current_user>

```

```auto
$ sudo nano /etc/udev/rules.d/99-gpio.rules

```

内容は上記の80-gpio-noroot.rulesと異なります。  
4.19.17-sunxi\*ではgpio-sunxiモジュールが用意されていないため、/sys/devices/platform/sunxi-pinctrl/gpioの箇所は削除します。

```auto
$ echo XX > /sys/class/gpio/export

```

によってエクポートされたgpioXXフォルダはエイリアスでリンク先が指定されているだけなので、リンク先のアクセス権も変更する必要があります。

```auto
# /etc/udev/rules.d/99-gpio.rules
# need to add group "gpio" for reading and writing access GPIO dir
#
#Group gpio chown
SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chown -R root:gpio /sys/class/gpio'"
#Group gpio chmod
SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chmod -R ug+rw /sys/class/gpio'"
#Group chown
SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chown -R root:gpio /sys/devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio'"
#Group chmod
SUBSYSTEM=="gpio", PROGRAM="/bin/sh -c '/bin/chmod -R ug+rw /sys/devices/platform/soc/1c20800.pinctrl/gpiochip0/gpio'"

```

設定をリロードします。

> sudo udevadm trigger --subsystem-match=gpio

> <https://unix.stackexchange.com/questions/39370/how-to-reload-udev-rules-without-reboot/39371#39371>

または以下のルールを適用しても構いません。

> **[Removed integration](https://www.home-assistant.io/more-info/removed-integration)**
>
> The integration you requested has been removed

```auto
$ sudo pico /etc/udev/rules.d/10-gpio.rules

SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'find -L /sys/class/gpio/ -maxdepth 2 -exec chown root:gpio {} \; -exec chmod 770 {} \; || true'"

```

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2019 年 3 月 19 日午後 12:01 UTC](https://forum.ficusonline.com/t/topic/72/9 "2019-03-19T12:01:35Z")

</div>

### Home Assistant GPIO Component for Orangepi

DockerコンテナとしてHassをインストールした場合、以下ディレクトリにコンポーネントとしてインストールされています。

`/usr/src/homeassistant/homeassistant/components/orangepi_gpio`

**orangepi\_gpio** では入力機能しか備わっていないため、 **rpi\_gpio** をベースに出力機能を追加したものが以下。

> **[GitHub - capitalfuse/opi\_gpio: Home Assistant Custom Component for Orangepi GPIO](https://github.com/capitalfuse/opi_gpio)**
>
> Home Assistant Custom Component for Orangepi GPIO

2021-04-12T15:00:00Z  
**opi\_gpioアップデート**

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2021 年 4 月 12 日午前 12:27 UTC](https://forum.ficusonline.com/t/topic/72/10 "2021-04-12T00:27:47Z")

</div>

### DockerコンテナからホストマシンのGPIO制御

> <https://stackoverflow.com/questions/30059784/docker-access-to-raspberry-pi-gpio-pins>

> **[\[SOLVED\] Can not access to GPIO from OpenHab running in docker container](https://community.openhab.org/t/solved-can-not-access-to-gpio-from-openhab-running-in-docker-container/77758)**
>
> Platform information: Hardware: Orange PI Zero 512MB OS: Armbian 5.90 Orangepizero Debian buster next 4.19.57 Docker version: 18.09.7 Docker image: openhab/openhab:2.4.0-armhf-debian openHAB version: 2.4.0 Issue of the topic: Can not access to...

---

<div class="post-metadata">

### Author: ![tk-fuse](https://forum.ficusonline.com/user_avatar/forum.ficusonline.com/tk-fuse/32/255_2.png) [@tk-fuse](https://forum.ficusonline.com/u/tk-fuse)
#### Post date: [2023 年 9 月 29 日午前 8:34 UTC](https://forum.ficusonline.com/t/topic/72/11 "2023-09-29T08:34:52Z")

</div>

I2Sを利用したスピーカとマイクロホンの接続

> **[Adafruit I2S MEMS Microphone Breakout](https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/overview)**
>
> For many microcontrollers, adding audio input is easy with one of our analog microphone breakouts. But as you get to bigger and better microcontrollers and microcomputers, you'll find that you don't always have an analog input, or maybe you want to...

> **[Adafruit MAX98357 I2S Class-D Mono Amp](https://learn.adafruit.com/adafruit-max98357-i2s-class-d-mono-amp/raspberry-pi-wiring)**
>
> If your microcontroller or microcomputer has digital audio capability, this amp is for you! It takes standard I2S digital audio input and, not only decodes it into analog, but also amplifies it directly into a speaker. Perfect for adding compact...

[https://forums.raspberrypi.com/viewtopic.php?t=183617](https://forums.raspberrypi.com/viewtopic.php?t=183617)
