天天看點

樹莓派GPIO控制樹莓派GPIO控制

樹莓派GPIO控制

陳拓 [email protected] 2018.06.09/2018.06.10

0.  概述

本文介紹樹莓派 Zero W的GPIO控制,并用LED看效果。也适宜于樹莓派3B+。

0.1 樹莓派GPIO編号方式

  • 功能實體引腳

從左到右,從上到下:左邊奇數,右邊偶數:1-40

樹莓派GPIO控制樹莓派GPIO控制
  • BCM

編号側重CPU寄存器,根據BCM2835的GPIO寄存器編号。

  • wiringPi

編号側重實作邏輯,把擴充GPIO端口從0開始編号,這種編号友善程式設計。如圖 WiringPi一欄。

樹莓派GPIO控制樹莓派GPIO控制

操作GPIO時一定先要清楚使用那一套編号。

1.  準備

1.1 硬體

  • 樹莓派Pi Zero W
  • LED(3mm或5mm)
  • 1KΩ電阻
  • 杜邦線3根
  • 電腦(我用Windows 7)

1.2 GPIO接口

樹莓派GPIO控制樹莓派GPIO控制

1.3 接線

首先我們把LED和樹莓派連接配接。LED的正極串聯一個1KΩ電阻接樹莓派的GPIO18(pin12),負極接地。

樹莓派GPIO控制樹莓派GPIO控制

這個圖是用Fritzing畫的。

2.  測試

2.1 連接配接電腦和樹莓派

用putty連接配接電腦和樹莓派3B+(或者Pi Zero W),看本文最後的參考文檔。Host Name填raspberrypi.local,端口22,使用者名pi,密碼raspberry。

注意:boot分區有一個名為ssh的空文本檔案,這個ssh檔案容易丢失,如果ssh不能登入了,先檢查ssh是否丢失。

2.2 用Shell指令直接控制GPIO

  • 使GPIO18從核心空間暴露到使用者空間中

[email protected]:~ $ sudo echo 18 >/sys/class/gpio/export

> 是IO重定向符号,IO重定向是指改變linux标準輸入和輸出的預設裝置,指向一個使用者定義的裝置。echo 18 > export就是把18寫入到export檔案中。

執行該操作之後,/sys/class/gpio目錄下會增加一個gpio18檔案夾。

  • 檢視GPIO18引腳(在Liunx中裝置都以檔案的形式,引腳也是裝置)

[email protected]:~ $ cd/sys/class/gpio/gpio18

[email protected]:/sys/class/gpio/gpio18 $ ls

樹莓派GPIO控制樹莓派GPIO控制
  • 設定GPIO18為輸出模式

[email protected]:/sys/class/gpio/gpio18 $sudo echo out > direction

  • 向value檔案中輸入1,GPIO輸出高電平,LED點亮

[email protected]:/sys/class/gpio/gpio18 $sudo echo 1 > value

  • 向value檔案中輸入0,GPIO輸出低電平,LED熄滅

[email protected]:/sys/class/gpio/gpio18 $sudo echo 0 > value

  • 傳回家目錄

[email protected]:/sys/class/gpio $ cd ~

  • 登出GPIO18接口

[email protected]:~ $ sudo echo 18 > /sys/class/gpio/unexport

2.3 用Shell腳本控制GPIO

  • 建立一個名為ledonoff.sh的腳本。

[email protected]:~ $sudo nano ledonoff.sh

腳本寫下面的内容:

echo $1 > /sys/class/gpio/export

echo out > /sys/class/gpio/gpio$1/direction

echo 1 > /sys/class/gpio/gpio$1/value

sleep 5   #延時5秒

echo 0 > /sys/class/gpio/gpio$1/value

echo $1 > /sys/class/gpio/unexport

說明:shell腳本可傳入參數,例如$1代表第1個參數,$2代表第2個參數,以此類推。

  • 為ledonoff.sh添加可執行權限

[email protected]:~ $ sudo chmod +xledonoff.sh

  • 運作腳本

[email protected]:~ $ sudo ./ledonoff.sh 18

運作結果:LED點亮,持續5秒鐘關閉。

2.4 用Python通過PRI.GPIO指令控制GPIO

用Python控制GPIO,最便捷的方法就是使用python類庫,比如樹莓派系統本身內建的RPi.GPIO。

在putty的ssh終端輸入指令:

  • 進入python互動界面

[email protected]:~ $ python

>>> 這是python的提示符。

  • 導入python類庫RPi.GPIO,命名為别名為GPIO

>>> import RPi.GPIO as GPIO

引入之後,就可以使用 GPIO 子產品的函數了。

  • 設定BOARD編碼方式,基于BCM

樹莓派3 GPIO有三種編碼方式:實體引腳BOARD編碼,BCM編碼,以及 wiringPi 編碼。

>>> GPIO.setmode(GPIO.BCM)

  • 輸出模式

>>> GPIO.setup(18,GPIO.OUT)

  • GPIO18輸出高電平,LED點亮

>>> GPIO.output(18,GPIO.HIGH)

  • GPIO18輸出低電平,LED熄滅

>>> GPIO.output(18,GPIO.LOW)

  • 用完後進行清理

>>> GPIO.cleanup()

  • 退出python互動界面

>>> Ctrl+D

2.5 用Python腳本控制GPIO

  • 建立一個名為blinky.py的腳本。

[email protected]:~ $sudo nano blinky.py

腳本寫下面的内容:

import RPi.GPIO as GPIO

import time

GPIO.setmode(GPIO.BCM)

GPIO.setup(18,GPIO.OUT)

while True:

   GPIO.output(18,GPIO.HIGH)

   time.sleep(1)

   GPIO.output(18,GPIO.LOW)

   time.sleep(1)

GPIO.cleanup()

說明:while True下面的循環體要縮進,用空格或Tab(但不能混用)鍵縮進就行。

  • 為blinky.py添加可執行權限

[email protected]:~ $ sudo chmod +x blinky.py

  • 運作Python腳本

[email protected]:~ $ sudo python blinky.py

LED閃爍。

  • 停止運作

用 Ctrl+C 來中斷循環。

3.  借助wiringPi GPIO用C語言控制GPIO

樹莓派核心中已經編譯自帶了gpio的驅動,我們常通過一些第三方寫好的庫函數來完成具體的操作,比較常見的操作庫函數有:

  • Python GPIO

Python GPIO已經內建到了樹莓派核心,為樹莓派官方資料中推薦且容易上手。python GPIO是一個小型的python庫,可以幫助使用者完成raspberry相關IO口操作,但是python GPIO庫還沒有支援SPI、I2C或者1-wire等總線接口。

常見C語言庫有:

  • wiringPi (http://wiringpi.com/)

wiringPi适合那些具有C語言基礎,在接觸樹莓派之前已經接觸過單片機或者嵌入式開發的人群。wiringPi的API函數和arduino非常相似,這也使得它廣受歡迎。作者給出了大量的說明和示例代碼,這些示例代碼也包括UART裝置,I2C裝置和SPI裝置等。

  • BCM2835 C Library (http://www.airspayce.com/mikem/bcm2835/)

BCM2835 C Library可以了解為使用C語言實作的相關底層驅動,BCM2835C Library的驅動庫包括GPIO. SPI和UART等,可以通過學習BCM2835 C Library熟悉BCM2835相關的寄存器操作。如果有機會開發樹莓派上的linux驅動,或自主開發python或PHP擴充驅動,可以從BCM2835 C Library找到不少的“靈感”。

3.1 WiringPi GPIO安裝

WiringPi是應用于樹莓派平台的GPIO控制庫函數,WiringPi遵守GUN Lv3。wiringPi使用C或者C++開發并且可以被其他語言包轉,例如python、ruby或者PHP等。

wiringPi包括一套gpio控制指令,使用gpio指令可以控制樹莓派GPIO管腳。使用者可以利用gpio指令通過shell腳本控制或查詢GPIO管腳。

  • wiringPi安裝

更新清單:

[email protected]:~ $sudo apt-get update

更新軟體:

[email protected]:~ $sudo apt-get upgrade

安裝:

[email protected]:~ $sudo apt-get install wiringpi

  • 測試

wiringPi包括一套gpio指令,使用gpio指令可以控制樹莓派上的各種接口,通過以下指令可以測試wiringPi是否安裝成功。

[email protected]:~ $ gpio -v

樹莓派GPIO控制樹莓派GPIO控制
  • 檢視GPIO圖

[email protected]:~ $ gpio readall

樹莓派GPIO控制樹莓派GPIO控制

3.2 編寫代碼

  • 建立一個名為led_blink.c的源程式

[email protected]:~ $sudo nano led_blink.c

  • 内容如下

#include <wiringPi.h>

int main(void) {

   wiringPiSetup();

   pinMode (1, OUTPUT);

   for(;;) {

       digitalWrite(1, HIGH);delay (500);

       digitalWrite(1, LOW);delay (500) ;

    }

}

說明:看看上一小節的圖,BCM編号的GPIO18引腳在wiringPi編号中是1。

3.3 編譯運作

  • 編譯

[email protected]:~ $ gcc led_blink.c -oled_blink -l wiringPi

-l wiringPi表示動态加載wiringPi共享庫。

  • 運作

[email protected]:~ $ sudo ./led_blink

用 Ctrl+C 來中斷循環。

4.  借助BCM2835 C Library用C語言控制GPIO

4.1 下載下傳安裝

先看看最新版本:http://www.airspayce.com/mikem/bcm2835

樹莓派GPIO控制樹莓派GPIO控制
  • 下載下傳bcm2835-1.56.tar.gz

[email protected]:~ $ wgethttp://www.airspayce.com/mikem/bcm2835/bcm2835-1.56.tar.gz

  • 解壓縮

[email protected]:~ $ tar xvzfbcm2835-1.56.tar.gz

  • 配置編譯

進入壓縮之後的目錄:

[email protected]:~ $ cd bcm2835-1.56

執行配置指令:

[email protected]:~/bcm2835-1.56 $ ./configure

[email protected]:~/bcm2835-1.56 $ make

  • 執行檢查

[email protected]:~/bcm2835-1.56 $ sudo makecheck

  • 安裝bcm2835庫:

[email protected]:~/bcm2835-1.56 $ sudo makeinstall

4.2 編寫代碼

  • 建立一個名為blink_led.c的源程式

[email protected]:~/bcm2835-1.56$ cd ~

[email protected]:~ $sudo nano blink_led.c

  • 内容如下

#include <bcm2835.h>

#define PIN RPI_GPIO_P1_12

int main(int argc, char **argv) {

   if (!bcm2835_init())

       return 1;

   bcm2835_gpio_fsel(PIN, BCM2835_GPIO_FSEL_OUTP);

   while (1) {

       bcm2835_gpio_write(PIN, HIGH);

       bcm2835_delay(500);

       bcm2835_gpio_write(PIN, LOW);

       bcm2835_delay(500);

    }

   bcm2835_close();

   return 0;

}

說明:GPIO的編号方式不同,采用PCB闆的實體接口編号,led連在樹莓派Zero W闆子的12引腳上。

4.3 編譯運作

  • 編譯

[email protected]:~ $ gcc blink_led.c -oblink_led -l bcm2835

-l bcm2835表示動态加載bcm2835共享庫

  • 運作

sudo ./blink_led

用 Ctrl+C 來中斷循環。

5. 用Node.js控制GPIO

見《樹莓派連接配接阿裡雲物聯網平台-屬性(nodejs)》

https://blog.csdn.net/chentuo2000/article/details/103705694

6. 引腳複用

通過設定改變引腳的功能,見參考文檔“樹莓派Zero W添加音頻輸出”。

參考文檔

1. 樹莓派介紹 https://blog.csdn.net/chentuo2000/article/details/81051241

2. 電腦連接配接樹莓派Zero W https://blog.csdn.net/chentuo2000/article/details/81051308

3. 電腦連接配接樹莓派3B+ https://blog.csdn.net/chentuo2000/article/details/103332186

4. 樹莓派Zero W+溫度傳感器DS18B20 https://blog.csdn.net/chentuo2000/article/details/81051701

5. 樹莓派Zero W添加音頻輸出 https://blog.csdn.net/chentuo2000/article/details/103432788

6. 樹莓派GPIO控制--C語言篇https://blog.csdn.net/hu7850/article/details/51785560

7. 遠端控制通訊——基于樹莓派 Python gpiozero 遠端控制LED燈并傳回控制結果https://blog.csdn.net/NCTU_to_prove_safety/article/details/65446454

8. RPi Low-level peripherals

https://elinux.org/RPi_Low-level_peripherals

9. 樹莓派+溫度感測器實現室內溫度監控:http://shumeipai.nxez.com/2013/10/03/raspberry-pi-temperature-sensor-monitors.html

10. Raspberry Pi Temperature Sensor

http://www.cl.cam.ac.uk/projects/raspberrypi/tutorials/temperature/

繼續閱讀