Orange pi GPIO輸出控制,裸機點燈大法(二)!

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的狀態

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章