文章目錄
Orange pi GPIO輸出控制方式
前言
上一篇博客講了裸機點燈,這一章將會分享一個更全面的orangepi的GPIO控制
本章主要包含三種方式,分別是:
1、OPi.GPIO(樹莓派是RPi.GPIO),適用於python環境編程
2、WiringOP-Zero-Python(樹莓派是Wiringpi),適用於python環境編程
3、WiringOP-Zero(樹莓派是Wiringpi),適用於C環境編程
實際使用根據需要任選其一安裝即可,也可全部安裝
1、OPi.GPIO安裝及使用
官方文檔飛機票:OPi.GPIO
廢話不多說直接開始:
我的armbian系統預裝python3,那就直接用python3好了
#明顯看出來是python3.6
root@orangepi:~# whereis python
python: /usr/bin/python3.6 /usr/bin/python3.6m /usr/lib/python3.7 /usr/lib/python3.6 /usr/lib/python2.7 /etc/python3.6 /usr/local/lib/python3.6
#先安裝python3.6對應的pip3
root@orangepi:~# sudo apt-get install python3-pip
#根據官方文檔安裝:
root@orangepi:~# sudo pip3 install --upgrade OPi.GPIO
這樣就安裝好了,進入python,導入模塊沒有報錯就說明安裝成功
root@orangepi:~# python3
Python 3.6.8 (default, Jan 14 2019, 11:02:34)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import OPi.GPIO as GPIO
寫了一個python腳本來驗證,如下:(需要在相應的io引腳接上led或者輸出設備才能看到io引腳的變化)
#!/usr/bin/python
# -*- coding:utf-8 -*-
import OPi.GPIO as GPIO
import time
IO_set_list = []
Unavailable_IO_num = [1,2,4,6,9,14,17,20,25]
def Io_init():
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD) #板載編碼
#GPIO.setmode(GPIO.BCM) #BCM編碼
#GPIO.setmode(GPIO.SUNXI) #WPI編碼
def Get_user_input():
pinnum = int(input("Used BOARD mode,please input pinnum(0-26):"))
while pinnum < 0 or pinnum > 26 or pinnum in Unavailable_IO_num:
print('Incorrect input or Unavailable IO,try again')
pinnum = int(input("Used BOARD mode,please input pinnum(0-26):"))
IO_set_list.append(pinnum)
pinval = int(input("please input pin value(1/0):"))
while pinval not in [0,1]:
print('Incorrect input,try again')
pinval = int(input("please input pin value(1/0):"))
IO_set_list.append(pinval)
return IO_set_list
def IO_out():
print("welcom")
Io_init()
Get_user_input()
GPIO.setup(IO_set_list[0], GPIO.OUT)
GPIO.output(IO_set_list[0],IO_set_list[1])
def main():
#os.system(`gpio-readall`)
IO_out()
GPIO.cleanup()
if __name__ == '__main__':
try:
main()
#except KeyboardInterrupt:
except:
GPIO.cleanup()
finally:
GPIO.cleanup()
2、引腳編號
在OPi.GPIO中,有兩種方法可以對Orange Pi上的IO引腳進行編號。第一種是使用BOARD編號系統。這是指Orange Pi板上P1接頭上的引腳號。使用這種編號系統的優點是,無論樹莓派的電路板版本如何,您的硬件都能正常工作。你不需要重新連接你的連接器或更改你的代碼。
第二個編號系統是BCM號碼。這是一種較低級別的工作方式 - 它指的是Broadcom SOC上的通道號碼。您必須始終使用那個通道編號所對應的樹莓派板上哪個引腳的圖表。您的腳本程序可能會在Orange Pi板的硬件修訂後而不能使用。
香橙派引腳有BOARD和BCM兩種編號方式( 使用C的WiringOP庫還有一種wringPi編號方式 ), BOARD具有很好的適用性( 不用看接口圖,數引腳1~40就可以接線 ), 不論香橙派1 2 3, 都不用修改代碼, 吼啊! BCM編號方式換個版本再接線時數引腳是不行的, 需要看下下面的接口圖
下面給出一張香橙派 zero的硬件接口圖,香橙派zero和香橙派R1通用
+-----+-----+----------+------+--Orange Pi Zero--+---+------+---------+-----+--+
| H2+ | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | H2+ |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| | | 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 | ALT5 | TxD3 | 15 | 198 |
| | | 0v | | | 9 || 10 | 0 | ALT5 | RxD3 | 16 | 199 |
| 1 | 0 | RxD2 | ALT5 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1 | 1 | 7 |
| 0 | 2 | TxD2 | ALT5 | 0 | 13 || 14 | | | 0v | | |
| 3 | 3 | CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT4 | GPIO.4 | 4 | 19 |
| | | 3.3v | | | 17 || 18 | 0 | ALT4 | GPIO.5 | 5 | 18 |
| 15 | 12 | MOSI | ALT5 | 0 | 19 || 20 | | | 0v | | |
| 16 | 13 | MISO | ALT5 | 0 | 21 || 22 | 0 | ALT3 | RTS2 | 6 | 2 |
| 14 | 14 | SCLK | ALT5 | 0 | 23 || 24 | 0 | ALT5 | CE0 | 10 | 13 |
| | | 0v | | | 25 || 26 | 0 | ALT3 | GPIO.11 | 11 | 10 |
+-----+-----+----------+------+---+---LEDs---+---+------+----------+-----+-----+
| 17 | 30 | STAT-LED | OUT | 0 | 27 || 28 | | | PWR-LED | | |
+-----+-----+----------+------+---+-----+----+---+------+----------+-----+-----+
| H2+ | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | H2+ |
+-----+-----+----------+------+--Orange Pi Zero--+---+------+---------+-----+--+
40Pin的OrangePi PC2表格兼容26Pin的香橙派zero,香橙派zero爲26Pin,其引腳對應於上表的前26Pin,但是BCM編碼不同
由此可見用BOARD還是比較通用的
+-----+-----+----------+------+---+-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 | ALT5 | TxD3 | 15 | 13 |
| | | 0v | | | 9 || 10 | 0 | ALT5 | RxD3 | 16 | 14 |
| 1 | 0 | RxD2 | ALT5 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1 | 1 | 110 |
| 0 | 2 | TxD2 | ALT5 | 0 | 13 || 14 | | | 0v | | |
| 3 | 3 | CTS2 | ALT5 | 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 | ALT0 | 0 | 21 || 22 | 0 | ALT5 | 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 | ALT5 | RTS1 | 26 | 200 |
| 9 | 23 | GPIO.23 | ALT3 | 0 | 33 || 34 | | | 0v | | |
| 10 | 24 | GPIO.24 | ALT3 | 0 | 35 || 36 | 0 | ALT5 | CTS1 | 27 | 201 |
| 20 | 25 | GPIO.25 | OUT | 1 | 37 || 38 | 0 | ALT5 | TxD1 | 28 | 198 |
| | | 0v | | | 39 || 40 | 0 | ALT5 | RxD1 | 29 | 199 |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| BCM | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | BCM |
+-----+-----+----------+------+---+-Orange Pi+---+------+----------+-----+-----+
3、WiringOP-Zero-Python安裝及使用
github飛機票:WiringOP-Zero-Python
一樣廢話不多說直接開始:
git clone --recursive https://github.com/xpertsavenue/WiringOP-Zero-Python
cd WiringOP-Zero-Python
解決依賴 python-dev, python-setuptools 和 swig
sudo apt-get install python3-dev python3-setuptools swig
swig3.0 -python wiringpi.i
sudo python3 setup.py install
sudo python3 tests/test.py
食用方法:
import wiringpi
wiringpi.wiringPiSetup() # For sequential pin numbering, one of these MUST be called before using IO functions
# OR
wiringpi.wiringPiSetupSys() # For /sys/class/gpio with GPIO pin numbering
# OR
wiringpi.wiringPiSetupGpio() # For GPIO pin numbering
wiringpi.pinMode(6,1) # Set pin 6 to 1 ( OUTPUT )
wiringpi.digitalWrite(6,1) # Write 1 ( HIGH ) to pin 6
wiringpi.digitalRead(6) # Read pin 6
挺簡單吧,還是來一個簡單的python腳本控制io,代碼如下
vim wiring_python_io_set.py
#!/usr/bin/python
# -*- coding:utf-8 -*-
import wiringpi
def main():
#os.system(`gpio-readall`)
wiringpi.wiringPiSetup() #設置GPIO編號爲wPi方式,當使用這個函數初始化樹莓派引腳時,程序使用的是wiringPi 引腳編號表。引腳的編號爲 0~16
#wiringpi.wiringPiSetupSys() #設置GPIO編號爲
#wiringpi.wiringPiSetupPhys() #設置GPIO編號爲
#wiringpi.wiringPiSetupGpio() #設置GPIO編號爲BCM方式 ,當使用這個函數初始化樹莓派引腳時,程序中使用的是BCM GPIO 引腳編號表。
pinnum = int(input("Used wPi mode,please input pinnum:"))
pinval = int(input("please input pin value(1/0):"))
wiringpi.pinMode(pinnum,1)
wiringpi.digitalWrite(pinnum,pinval)
if __name__ == '__main__':
try:
main()
#except KeyboardInterrupt:
except:
print("set failed ,please chek you input and try again!")
finally:
pass
運行一下控制板載 status led
root@orangepi:~# python3 wiring_python_io_set.py
Used wPi mode,please input pinnum(0-16):30
please input pin value(1/0):1
可以看到板上的紅色led亮起來了,在運行
root@orangepi:~# python3 wiring_python_io_set.py
Used wPi mode,please input pinnum(0-16):30
please input pin value(1/0):0
可以看到板上的紅色led滅了。完美運行
4、WiringOP-Zero 安裝及使用(C語言)
github飛機票:WiringOP-Zero
一樣廢話不多說直接開始:
git clone https://github.com/xpertsavenue/WiringOP-Zero.git
cd WiringOP-Zero
chmod +x ./build
sudo ./build
出現All Done.
就安裝完成了
檢測是否安裝成功
root@orangepi:~/WiringOP-Zero# 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
Board details:
Type: Orange Pi Zero, Revision: Unknown, Memory: 512MB, Maker: Unknown
root@orangepi:~/WiringOP-Zero# gpio readall
+-----+-----+----------+------+--Orange Pi Zero--+------+----------+-----+-----+
| H2+ | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | H2+ |
+-----+-----+----------+------+---+----++----+---+------+----------+-----+-----+
| | | 3.3v | | | 1 || 2 | | | 5v | | |
| 12 | 8 | SDA.0 | OUT | 0 | 3 || 4 | | | 5V | | |
| 11 | 9 | SCL.0 | OUT | 0 | 5 || 6 | | | 0v | | |
| 6 | 7 | GPIO.7 | ALT3 | 0 | 7 || 8 | 0 | ALT3 | TxD3 | 15 | 198 |
| | | 0v | | | 9 || 10 | 0 | ALT3 | RxD3 | 16 | 199 |
| 1 | 0 | RxD2 | ALT3 | 0 | 11 || 12 | 0 | ALT3 | GPIO.1 | 1 | 7 |
| 0 | 2 | TxD2 | ALT3 | 0 | 13 || 14 | | | 0v | | |
| 3 | 3 | CTS2 | ALT3 | 0 | 15 || 16 | 0 | ALT3 | GPIO.4 | 4 | 19 |
| | | 3.3v | | | 17 || 18 | 0 | ALT3 | GPIO.5 | 5 | 18 |
| 15 | 12 | MOSI | ALT3 | 0 | 19 || 20 | | | 0v | | |
| 16 | 13 | MISO | ALT3 | 0 | 21 || 22 | 0 | ALT3 | RTS2 | 6 | 2 |
| 14 | 14 | SCLK | ALT3 | 0 | 23 || 24 | 0 | ALT3 | CE0 | 10 | 13 |
| | | 0v | | | 25 || 26 | 0 | ALT3 | GPIO.11 | 11 | 10 |
+-----+-----+----------+------+---+---LEDs---+---+------+----------+-----+-----+
| 17 | 30 | STAT-LED | OUT | 0 | 27 || 28 | | | PWR-LED | | |
+-----+-----+----------+------+---+-----+----+---+------+----------+-----+-----+
| H2+ | wPi | Name | Mode | V | Physical | V | Mode | Name | wPi | H2+ |
+-----+-----+----------+------+--Orange Pi Zero--+---+------+---------+-----+--+
最後祖傳的規矩,寫一個腳本鎮樓:
vim wiring_c_io_set.c
#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
/*
運行:sudo ./wiring_c_io_set [引腳 值]
編譯:gcc wiring_c_io_set.c -o wiring_c_io_set -L lib -l wiringPi -l pthread (需已安裝wiringPi)
by:Fang
*/
#define Set_io_pin 30 //定義需要控制哪個引腳
int pin,value,count=5;
int main(int args, char *argv[])
{
if((argv[1])&&(argv[2])){
wiringPiSetup();
pin=atoi(argv[1]);
value=atoi(argv[2]);
pinMode(pin,OUTPUT);
digitalWrite(pin,value);
}
else{
int i=0;
wiringPiSetup(); //選擇WPI編碼方式
pinMode(Set_io_pin, OUTPUT); //設置爲輸出模式
for (i=0;i<count;i++){
digitalWrite(Set_io_pin,1); //控制引腳高電平
delay(500);
digitalWrite(Set_io_pin,0); //控制引腳低電平
delay(500);
}
}
}
編譯並運行
#編譯
gcc wiring_c_io_set.c -o wiring_c_io_set -L lib -l wiringPi -l pthread
#不傳參數運行,可以看到板載status led 閃爍5下
./wiring_c_io_set
#傳參數運行,可以看到板載status led 亮起
./wiring_c_io_set 30 1
#傳參數運行,可以看到板載status led 熄滅
./wiring_c_io_set 30 0
通過 watch -n 1 gpio readall
可以監控IO的狀態