18video性欧美19sex,欧美高清videosddfsexhd,性少妇videosexfreexxx片中国,激情五月激情综合五月看花,亚洲人成网77777色在线播放

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內(nèi)不再提示

技能+1!如何在樹莓派上使用C++控制GPIO?

上海晶珩電子科技有限公司 ? 2025-08-06 15:33 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

在使用樹莓派時,你會發(fā)現(xiàn)Python和Scratch是許多任務(包括GPIO編程)中最常用的編程語言。但你知道嗎,你也可以使用C++進行GPIO編程,而且這樣做還有不少好處。

借助WiringPi和PiGPIO等庫,C++可用于編程控制樹莓派的GPIO引腳。它提供了更好的性能和控制能力,非常適合對速度和精度要求較高的硬件項目。

在樹莓派社區(qū)中,關于“Python與C++哪個更適合樹莓派”的討論十分熱烈。Python因其簡單易用和龐大的生態(tài)系統(tǒng)而備受青睞,而C++則在性能和精確的硬件控制方面表現(xiàn)出色。這一特性使C++成為某些項目的可靠選擇。


目錄

先決條件

了解C/C++的不同GPIO庫

搭建開發(fā)環(huán)境

搭建電路

編寫GPIO程序以使LED閃爍

常見問題解答(FAQ)


先決條件

以下是使用C++進行GPIO編程所需的一些條件:

樹莓派開發(fā)板:你可以使用任何符合項目資源需求的樹莓派型號。本教程中,我將使用配備2GB內(nèi)存的樹莓派4B。

操作系統(tǒng)要求:任何受樹莓派支持的操作系統(tǒng)均可。但如果你是初學者,我建議先使用樹莓派操作系統(tǒng)(Raspberry Pi OS)。等你熟練掌握了在樹莓派上使用C++編程后,再切換其他系統(tǒng)也不遲。

C++編譯器(g++):這是C++的命令行編譯器,預裝在樹莓派操作系統(tǒng)中。

所需庫(WiringPi、PiGPIO):這些C++庫用于與樹莓派的GPIO引腳進行交互。

一個LED燈:本教程至少需要一個LED燈。


了解C/C++的不同GPIO庫

在深入探討各種可用庫之前,我們先來了解一下為什么在使用GPIO引腳時需要庫。

主要原因在于簡化操作。庫讓我們無需處理復雜的底層硬件控制,就能輕松與GPIO引腳進行交互,既節(jié)省時間又降低了難度。

例如,如果我想打開/關閉一個GPIO引腳,只需使用以下這行代碼:

digitalWrite(pin,HIGH);// Turn on an LED

但如果沒有庫,我就得直接操作內(nèi)存寄存器,這要復雜得多。

WiringPi

WiringPi是樹莓派上與GPIO引腳交互最受歡迎的庫之一。我曾用它完成過搭建循線機器人等復雜項目,從未遇到過任何問題。

不過,在使用WiringPi之前,你應該知道它的引腳編號系統(tǒng)可能會讓人困惑。

WiringPi并不遵循標準的BCM(GPIO)編號或樹莓派的物理引腳布局。當?shù)谝豢顦漭砂l(fā)布時,它只有少數(shù)幾個可用的GPIO引腳,WiringPi以自己的方式將這些引腳編號為0到7。隨著新款樹莓派型號引入了更多GPIO引腳,WiringPi為了保持向后兼容性,保留了原有的編號方式。

這意味著WiringPi的引腳編號并不總是與實際的GPIO編號或電路板上的物理引腳位置相對應。不過別擔心!你可以參考下表,查看每個樹莓派引腳在WiringPi中的映射關系。

9939a342-7297-11f0-9080-92fbcf53809c.jpg

pigpio是另一個用于控制樹莓派GPIO引腳的C++庫。在撰寫本文時,我雖未廣泛使用過它,但從有限的幾次使用經(jīng)驗來看,我發(fā)現(xiàn)它比WiringPi更強大,但我強烈建議僅將其用于高級任務。

與WiringPi不同,pigpio作為后臺服務(守護進程)運行,非常適合精確的GPIO控制。如果你正在進行一個需要平穩(wěn)精確控制電機或伺服器的項目,那么pigpio值得考慮。

然而,這一關鍵特性也是它的最大缺點。由于pigpio依賴于其守護進程,在資源(CPU和內(nèi)存)有限的老款樹莓派型號上,它可能無法很好地工作,尤其是在運行繁重的GPIO操作時。此外,你不能將其與WiringPi等其他庫同時使用,因為它們可能會產(chǎn)生沖突。

注意:在本教程中,我將使用WiringPi,因為我只編寫一個點亮LED的小程序。WiringPi對初學者友好,是開始在樹莓派上進行GPIO編程的最簡單方法之一。


搭建開發(fā)環(huán)境

現(xiàn)在,你已經(jīng)掌握了使用C++控制GPIO引腳所需的所有信息。接下來,讓我們深入探討設置過程。

安裝必要的開發(fā)包

如果你使用的是樹莓派操作系統(tǒng)完整版,它已經(jīng)預裝了許多開發(fā)包。但如果你使用的是樹莓派操作系統(tǒng)精簡版(Lite)或其他基于Debian的發(fā)行版,則需要手動安裝C++編譯器和其他依賴項。

你可以通過運行以下命令來完成安裝:

sudoapt updatesudo apt install g++ build-essential

994785ca-7297-11f0-9080-92fbcf53809c.jpg

安裝并設置WiringPi

你必須在樹莓派上安裝WiringPi才能將其用于GPIO項目。首先,通過運行以下命令更新系統(tǒng):

sudoapt update

以前,你可以輕松地使用apt命令從樹莓派軟件源中安裝WiringPi。然而,由于WiringPi已停止支持,你需要從WiringPi的GitHub倉庫克隆它:

gitclonehttps://github.com/WiringPi/WiringPi.gitcdWiringPi./build debiancddebian-templatesudo apt install ./wiringpi_3.14_arm64.deb

文件名可能有所不同,請根據(jù)設備生成的文件調(diào)整最后一條命令。

997b1c96-7297-11f0-9080-92fbcf53809c.jpg

完成后,你可以通過運行以下命令驗證安裝是否成功:

gpio-v

99877b3a-7297-11f0-9080-92fbcf53809c.jpg

現(xiàn)在,我們已經(jīng)準備好了軟件需求,接下來進入設置電路的步驟。


搭建電路

下一步是搭建電路。這一步需要你親自動手,將LED燈連接到樹莓派的GPIO引腳上。

了解樹莓派GPIO布局

在繼續(xù)之前,你需要明白不能將LED燈連接到樹莓派的任意引腳上。每個引腳都有特定的功能,且只能用于該功能。有些引腳用于輸入/輸出,有些用于供電(3.3V或5V),還有些用于接地。

如果你之前沒有做過涉及GPIO引腳的項目,我建議你快速瀏覽一下我們關于樹莓派GPIO引腳入門的全面文章。它將幫助你更好地理解本教程的內(nèi)容。

將LED燈連接到樹莓派

現(xiàn)在,我將直接連接LED燈到樹莓派,不使用電阻。我知道這不是理想的方法,但我之前這樣做過,沒有出現(xiàn)過任何問題。而且,我知道我的LED燈額定電壓為3V,處于安全范圍,不會損壞樹莓派。

我將使用一個擴展板,因為它更整潔、更方便,但你也可以直接將LED燈連接到樹莓派的引腳上,如果你覺得這樣更方便的話。我將把LED燈連接到GPIO 26和接地(GND)引腳上。

999cb360-7297-11f0-9080-92fbcf53809c.jpg


編寫GPIO程序以使LED閃爍

設置好電路后,我們就可以編寫代碼了。你可以使用許多編輯器在樹莓派上編寫程序。你可以選擇基于命令行的編輯器(如Nano)或基于圖形界面的編輯器(如Geany)。在本教程中,我將使用nano編輯器。

首先,打開終端,使用以下命令導航到“文檔”目錄并創(chuàng)建一個程序文件:

cdDocumentsmkdirBlinkLEDProgramtouchblink_led.cpp

99ab9682-7297-11f0-9080-92fbcf53809c.jpg

創(chuàng)建文件后,我們可以使用nano編輯器打開它:

nanoblink_led.cpp

編寫代碼

這將打開一個空文本編輯器,你可以在其中開始編寫代碼。我將把這段代碼分成幾個部分,以便你更好地理解。

#include#include#include#include

#include :這行代碼包含了WiringPi庫,使你能夠控制樹莓派的GPIO引腳。這是與LED等硬件交互所必需的。

#include :這用于輸入輸出操作。在本例中,我們將使用它來向終端打印文本。

#include :這提供了時間工具。在我們的程序中,我們將使用毫秒等工具來控制延遲。

#include :我們將使用它來暫停程序執(zhí)行指定的時間。它與Python中的sleep()函數(shù)類似。

constexprintLED_PIN =25;

在這里,我們定義了一個常量LED引腳,它將與樹莓派上的引腳進行交互。你會注意到,我將其設置為25,但在搭建電路時,我明確表示將把LED燈連接到GPIO 26。

這是因為WiringPi使用了不同的GPIO編號方式。如果你參考上面的表格,你會發(fā)現(xiàn)樹莓派上的GPIO 26在WiringPi庫中被映射為引腳25。

usingnamespacestd;usingnamespacestd::chrono;usingnamespacestd::this_thread;

using namespace std;:這意味著我們可以使用標準的C++特性(如cout、cerr、endl等),而無需總是使用std::前綴。

std::

using namespace std::chrono;using namespace std::this_thread;:這些使我們能夠直接使用時間相關函數(shù)(如milliseconds和sleep_for),而無需每次都寫出std::millisecondsstd::sleep_for。

intmain(intargc,char* argv[])

這是程序的入口點,程序從這里開始執(zhí)行。

if(wiringPiSetup() == -1){ cerr<

wiringPiSetup():這個函數(shù)初始化WiringPi庫。如果它返回-1,說明出現(xiàn)了問題,庫無法初始化。

cerr << "Failed to initialize wiringPi" << endl;:如果WiringPi設置失敗,這將在終端打印一條錯誤信息。

return 1;:如果設置失敗,這將結束程序。1表示發(fā)生了錯誤。

pinMode(LED_PIN, OUTPUT); //Setthe LED pinasoutput

pinMode(LED_PIN, OUTPUT);:這告訴樹莓派,GPIO引腳25(連接LED燈的引腳)將用于輸出。這很重要,因為引腳可以設置為輸入(讀取數(shù)據(jù))或輸出(發(fā)送數(shù)據(jù))。

cout <

cout:這將在終端打印一條信息,告訴你程序正在運行,并且正在GPIO引腳25上使LED燈閃爍。這就像是對用戶的一個快速狀態(tài)更新。

while(true){ digitalWrite(LED_PIN,HIGH); sleep_for(milliseconds(500)); digitalWrite(LED_PIN,LOW); //Correctedfrom'Low'to'LOW' sleep_for(milliseconds(500));}

while (true):這開始一個無限循環(huán)。循環(huán)內(nèi)的代碼將一直運行,直到你手動停止程序。這用于使LED燈持續(xù)閃爍。

digitalWrite(LED_PIN, HIGH);:這通過向GPIO引腳25發(fā)送高電平信號來打開LED燈。HIGH是一個常量,表示“開”。

sleep_for(milliseconds(500));:這暫停程序執(zhí)行500毫秒(0.5秒),因此LED燈將保持亮起半秒鐘。

digitalWrite(LED_PIN, LOW);:這通過向GPIO引腳25發(fā)送低電平信號來關閉LED燈。LOW表示“關”。

sleep_for(milliseconds(500));:這再次暫停程序執(zhí)行500毫秒,因此LED燈將保持熄滅半秒鐘。

這個循環(huán)使LED燈每半秒閃爍一次。

return0;

這行代碼標志著程序的結束,并返回0表示一切運行正常。然而,由于我們有一個無限的while (true)循環(huán),除非你手動通過鍵盤按下Ctrl + C停止程序,否則這行代碼永遠不會被執(zhí)行。

最終的代碼看起來與下圖類似。

99b72f2e-7297-11f0-9080-92fbcf53809c.jpg

完成后,使用Ctrl + S保存代碼并退出(Ctrl + X)。

編譯并運行代碼

要編譯這個程序,請執(zhí)行以下命令:

g++ -std=c++17-o blink_led blink_led.cpp -lwiringPi

g++:這是GNU C++編譯器。

-std=c++17:指定代碼應使用C++17標準進行編譯。

-o blink_led:這告訴編譯器創(chuàng)建一個名為blink_led的輸出文件(可執(zhí)行文件)。

blink_led.cpp:這是我們編寫代碼的源文件。

-lwiringPi:鏈接WiringPi庫,這是控制樹莓派GPIO引腳所必需的。

成功執(zhí)行后,你可以使用以下命令運行程序:

./blink_led

99c3a29a-7297-11f0-9080-92fbcf53809c.jpg

下面的視頻展示了我這邊的輸出結果。一切都很順利,我的LED燈按預期閃爍。


排查錯誤

代碼中的大多數(shù)錯誤將在編譯過程中被捕獲并顯示在屏幕上。然而,還有其他一些問題可能會導致程序無法運行或LED燈無法閃爍。

如果你嘗試運行程序時遇到類似以下錯誤:

wiringPiSetup:commandnot found

這意味著WiringPi沒有正確安裝。你可以按照上面“安裝并設置WiringPi”部分中的說明重新安裝它。

另一種排查問題的先進方法是使用gpio readall命令:

gpioreadall

它顯示一個表格,展示所有GPIO引腳的當前引腳狀態(tài)、模式和編號。你可以使用這些信息來解決LED燈不閃爍的多個問題。

檢查引腳編號:由于不同的庫(BCM、WiringPi和物理編號)使用不同的編號方式,gpio readall幫助你確認程序應該使用哪種編號方式。

驗證引腳模式:你可以檢查引腳是設置為輸入、輸出還是ALT模式。

檢查引腳狀態(tài):該命令顯示引腳當前是高電平(1)還是低電平(0)。因此,如果你的LED燈應該亮起但引腳仍然是低電平(0),那么你可能存在接線或軟件問題。

檢測沖突:你還可以使用這些信息來檢查引腳是否被另一個進程或庫使用。

就這樣!你現(xiàn)在應該已經(jīng)了解了如何在樹莓派上使用C++控制GPIO引腳。在本教程中,我只使用了WiringPi庫使LED燈閃爍的一個小例子。你可以通過使用更多組件和參與更復雜的項目來進一步探索。


FAQ

能否不使用任何庫來編程GPIO?

是的,但難度要大得多。你將需要直接與內(nèi)存寄存器或系統(tǒng)文件(如/sys/class/gpio/)進行交互。像WiringPi和PiGPIO這樣的庫使這一過程變得簡單得多。

在C++中控制GPIO是否需要root權限?

這取決于你使用的庫。WiringPi需要root權限(sudo)來訪問GPIO引腳,因為它直接與硬件交互。PiGPIO作為后臺服務(守護進程)運行,因此并不總是需要sudo,但這取決于守護進程的設置方式。

原文地址:

https://raspberrytips.com/control-gpio-with-c-on-raspberry-pi/

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 操作系統(tǒng)

    關注

    37

    文章

    7263

    瀏覽量

    128058
  • GPIO
    +關注

    關注

    16

    文章

    1301

    瀏覽量

    55380
  • 樹莓派
    +關注

    關注

    122

    文章

    2067

    瀏覽量

    109059
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    如何使用Telegram控制樹莓派上GPIO引腳

    現(xiàn)在,我們將繼續(xù)下一步,學習如何使用 Telegram 控制樹莓引腳上的 GPIO 引腳,以便我們?yōu)闄C器人提供一些硬件支持。在本教程中,我們將四個 LED 連接到 Raspberry Pi G
    的頭像 發(fā)表于 11-30 17:22 ?1881次閱讀
    如何使用Telegram<b class='flag-5'>控制</b><b class='flag-5'>樹莓</b><b class='flag-5'>派上</b>的<b class='flag-5'>GPIO</b>引腳

    何在樹莓派上安裝并運行 Arduino 集成開發(fā)環(huán)境!

    ,我們將介紹如何在樹莓派上安裝并運行ArduinoIDE。所需物品要在樹莓派上運行ArduinoIDE,你需要以下組件:配備適當電源的
    的頭像 發(fā)表于 07-01 17:41 ?1688次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>樹莓</b><b class='flag-5'>派上</b>安裝并運行 Arduino 集成開發(fā)環(huán)境!

    何在樹莓派上安裝Ubuntu MATE ?

    ,而非GNOME。在本文中,我將介紹如何輕松地在樹莓派上安裝它。UbuntuMATE官方支持樹莓派,因此每發(fā)布一個新版本,都會為樹莓派發(fā)布一個鏡像。該鏡像可刷入S
    的頭像 發(fā)表于 08-12 18:56 ?2585次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>樹莓</b><b class='flag-5'>派上</b>安裝Ubuntu MATE ?

    何在樹莓派上安裝系統(tǒng)

    何在樹莓派上安裝系統(tǒng)
    發(fā)表于 11-17 16:17

    樹莓派MCC118

    操作系統(tǒng)? Linux/Raspbian可編程 API? C, C++, Python樹莓派界面MCC 118 接頭可直接安裝于樹莓派內(nèi)置40針通用輸入輸出(
    發(fā)表于 01-21 09:22

    何在樹莓派上安裝鴻蒙系統(tǒng)?

    何在樹莓派上安裝鴻蒙系統(tǒng)?
    發(fā)表于 09-29 11:07

    何在樹莓派上裝一個codesys的runtime

    codesys用樹莓派驅動單個電機本次內(nèi)容講如何在樹莓派上裝一個codesys的runtime,從而將樹莓派變成一個滿足工業(yè)要求的
    發(fā)表于 09-03 07:46

    如何快速使用C/C++開發(fā)樹莓派的GPIO功能

    1.前言借助Bcm2835庫可以快速使用C/C++開發(fā)樹莓派的GPIO功能,像玩單片機一樣玩樹莓
    發(fā)表于 02-08 07:15

    何在樹莓派上運行Fedora

    樹莓派基金會這幾年來生產(chǎn)了很多型號。本文的安裝過程已經(jīng)在第三代樹莓派上進行了測試:3B v1.2 和 B+(較舊的 樹莓派 2 和新的 樹莓
    的頭像 發(fā)表于 09-08 14:12 ?4307次閱讀

    樹莓派使用C/C++基于Bcm2835操作GPIO學習記錄

    1.前言借助Bcm2835庫可以快速使用C/C++開發(fā)樹莓派的GPIO功能,像玩單片機一樣玩樹莓
    發(fā)表于 12-04 18:51 ?8次下載
    <b class='flag-5'>樹莓</b>派使用<b class='flag-5'>C</b>/<b class='flag-5'>C++</b>基于Bcm2835操作<b class='flag-5'>GPIO</b>學習記錄

    樹莓派上的Kubernetes

    電子發(fā)燒友網(wǎng)站提供《樹莓派上的Kubernetes.zip》資料免費下載
    發(fā)表于 11-17 11:19 ?0次下載
    <b class='flag-5'>樹莓</b><b class='flag-5'>派上</b>的Kubernetes

    何在樹莓派上面安裝Windows

    早期,想要在樹莓派上面安裝Windows一直是個比較麻煩的事情,下載系統(tǒng)鏡像,燒錄、還有一系列復雜的配置。
    的頭像 發(fā)表于 09-12 09:54 ?3795次閱讀
    如<b class='flag-5'>何在</b><b class='flag-5'>樹莓</b><b class='flag-5'>派上</b>面安裝Windows

    GPIO樹莓派中的應用

    直接控制和讀取外部硬件設備的狀態(tài)。 1. GPIO簡介 GPIO樹莓派上用于與外部世界交互的一
    的頭像 發(fā)表于 01-09 09:41 ?1133次閱讀

    人臉識別指南:如何在樹莓派上安裝和設置 Dlib

    學習如何在樹莓派上安裝Dlib并配置人臉識別功能,為您的AI項目奠定基礎。在樹莓派上安裝Dlib的詳細步驟要為
    的頭像 發(fā)表于 03-24 17:31 ?1093次閱讀
    人臉識別指南:如<b class='flag-5'>何在</b><b class='flag-5'>樹莓</b><b class='flag-5'>派上</b>安裝和設置 Dlib

    C++ 與 Python:樹莓派上哪種語言更優(yōu)?

    Python是樹莓派上的首選編程語言,我們的大部分教程都使用它。然而,C++在物聯(lián)網(wǎng)項目中同樣廣受歡迎且功能強大。那么,在樹莓派項目中選擇哪種語言更合適呢?Python因其簡潔性、豐富
    的頭像 發(fā)表于 07-24 15:32 ?504次閱讀
    <b class='flag-5'>C++</b> 與 Python:<b class='flag-5'>樹莓</b><b class='flag-5'>派上</b>哪種語言更優(yōu)?