日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树莓派外设开发基础(wiringPi库)

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树莓派外设开发基础(wiringPi库) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考:樹莓派外設開發基礎篇
作者:丶PURSUING
發布時間:2021-02-05 18:20:53
網址:https://blog.csdn.net/weixin_44742824/article/details/113673019?spm=1001.2014.3001.5501

目錄

  • 外設開發綜述及wiringPi庫
    • 是什么
    • 如何獲取
    • 如何使用
      • EG1:控制繼電器
      • EG2:超聲波的使用
        • Linux下時間函數:struct timeval結構體
        • 超聲波原理簡述
        • 代碼詳解
  • 其他
    • 1.配置ssh時出現的亂碼問題
    • 2. .swp文件的處理

外設開發綜述及wiringPi庫

是什么

樹莓派中一個集成了很多API(特定平臺,特定接口)的庫,使得開發像printf一樣簡單。
初學只需會調庫,之后再深入到自己寫wiringPi庫,IO的上層以及底層的驅動代碼。

如何獲取

樹莓派的鏡像固件中可能不會帶有wiringPi庫

使用以下命令查看

gpio -v
  • 已經安裝

  • 未安裝

由于我的樹莓派自帶了WiringPi庫,沒有親自安裝過,參考

安裝教程博文中補充失效的下載連接

如何使用

EG1:控制繼電器

  • 硬件連接
  • 查看io口詳情

    gpio readall

    注意了IO口編號可不是中間排針的序號!!

    繼電器驅動電壓3.3v
    選擇pin7作為信號引腳

    下面是連接實物圖,因為連接了WIFI,沒有用到串口線。

  • 編程
  • 樹莓派的接口函數詳解:https://www.cnblogs.com/lulipro/p/5992172.html

    包含頭文件#incldue <wiringPi.h>

    ①硬件初始化函數

    函數返回值說明
    int wiringPiSetup (void)-1表示失敗使用wiringPi 引腳編號表,編號為 0~16。root
    int wiringPiSetupGpio (void)-1表示失敗使用BCM GPIO引腳編號表。root

    ②通用GPIO控制函數

    函數可取值(pin👉0,1,2…)說明
    void pinMode (int pin, int mode)value INPUT、OUTPUT、PWM_OUTPUT,GPIO_CLOCK只有wiringPi 引腳編號下的1腳(BCM下的18腳) 支持PWM輸出;只有wiringPi編號下的7(BCM下的4號)支持GPIO_CLOCK輸出
    void digitalWrite (int pin, int value)HIGH,LOW輸出高低電平
    函數參數說明說明
    int digitalRead (int pin)返回引腳上的電平
    void analogWrite(int pin, int value)value:輸出的模擬量樹莓派的引腳本身是不支持AD轉換的,也就是不能使用模擬量的API,需要增加另外的模塊
    int analogRead (int pin)返回引腳上讀取的模擬量樹莓派的引腳本身是不支持AD轉換的,也就是不能使用模擬量的API,需要增加另外的模塊
    void pwmWrite (int pin, int value)value:寫入到PWM寄存器的值,范圍在0~1024之間。pin只能是wiringPi 引腳編號下的1腳(BCM下的18腳)

    EG:從鍵盤輸入0,1控制繼電器

  • 編寫程序
  • #include <wiringPi.h> #include <stdio.h>#define SWITCHER 7int main() {int cmd;if(wiringPiSetup() == -1){printf("硬件初始化失敗\n");return -1;}pinMode(SWITCHER,OUTPUT);digitalWrite(SWITCHER,HIGH);while(1){printf("輸入0-接通;1-斷開并回車\n");scanf("%d",&cmd);//getchar();if(cmd == 0){digitalWrite(SWITCHER,LOW);}else if(cmd == 1){digitalWrite(SWITCHER,HIGH);}else{printf("input error\n");}}return 0; }

    編譯時候記得鏈庫 -lwiringPi

    代碼快速對齊
    ①gg 回首行
    ②=G 自動對齊

  • 編譯,運行
  • gcc relay.c -lwiringPi ./a.out

    EG2:超聲波的使用

    Linux下時間函數:struct timeval結構體

    • 結構體原型
    #include "sys/time.h"struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ };
    • 用法

    ①定義2個結構體變量

    struct timeval tv1; struct timeval tv2;

    ②獲取某個事件的開始,結束信息

    gettimeofday(&tv1, NULL); //....事件 gettimeofday(&tv2, NULL);

    int gettimeofday(struct timeval *tv, struct timezone *tz);
    timezone structure 已經過時了
    tz 通常設置為 NULL.

    ③計算開始,結束的時間

    long start, stop; start = tv1.tv_sec * 1000000 + tv1.tv_usec; //單位為us stop = tv2.tv_sec * 1000000 + tv2.tv_usec;

    或者

    unsigned long long timeSum = 0; timeSum = tv1.tv_sec-tv2.tv_sec +(tv1.tv_usev-tv2.tv_usec)/1000000;//以s為單位

    超聲波原理簡述

    觸發信號為10us的TTL,接收信號檢測高電平持續的時間,再由公式計算即可。

    TTL電平信號被利用的最多是因為通常數據表示采用二進制規定,+5V等價于邏輯"1",0V等價于邏輯"0",這被稱做TTL信號系統

    代碼詳解

    #include <wiringPi.h> #include <stdio.h> #include <sys/time.h> #define Trig 4 #define Echo 5void ultraInit(void) {pinMode(Echo, INPUT);pinMode(Trig, OUTPUT); }float disMeasure(void) {struct timeval tv1;struct timeval tv2;/** struct timeval* {* time_t tv_sec; //Seconds.* suseconds_t tv_usec; //Microseconds.* };*/long start, stop;float dis;digitalWrite(Trig, LOW);delayMicroseconds(2);digitalWrite(Trig, HIGH);delayMicroseconds(10);digitalWrite(Trig, LOW);//10us的TTL//統計高電平持續的時間while(!(digitalRead(Echo) == 1));gettimeofday(&tv1, NULL);while(!(digitalRead(Echo) == 0));gettimeofday(&tv2, NULL);/** int gettimeofday(struct timeval *tv, struct timezone *tz);* The functions gettimeofday() and settimeofday() can get and set the time as well as a timezone.* timezone structure 已經過時了;* tz 通常設置為 NULL.*/start = tv1.tv_sec * 1000000 + tv1.tv_usec; //單位為usstop = tv2.tv_sec * 1000000 + tv2.tv_usec;dis = (float)(stop - start) / 1000000 * 34000 / 2;//s×cm/s=cmreturn dis; }int main(void) {float dis;if(wiringPiSetup() == -1){printf("setup wiringPi failed !");return 1;}ultraInit();while(1){dis = disMeasure();printf("distance = %0.2f cm\n",dis);delay(1000);}return 0; }

    -----------------------------------------------------------------時間控制函數-----------------------------------------------------------
    void delay (unsigned int howLong)
    毫秒級,最大延時49天

    void delayMicroseconds (unsigned int howLong)
    微妙級,最大延時71分鐘

    其他

    1.配置ssh時出現的亂碼問題

    輸入命令 sudo raspi-config 后如下圖所示。底層邏輯無問題,可操作,僅為顯示亂碼

    將字符編碼由default更改為UTF-8即可

    2. .swp文件的處理

    2. .swp文件的處理

    當兩個窗口同時對同一個目標文件進行編輯時,就會提示生成隱藏文件目標.swp,警告修改編輯的可能不是最新的文件。若.swp文件存在,則每次打開目標文件都會ATTENTION

    解決方法
    用ls -a可以看到生成的.swp隱藏文件,再用rm指令刪除即可。

    總結

    以上是生活随笔為你收集整理的树莓派外设开发基础(wiringPi库)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。