树莓派外设开发基础(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控制函數
| 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控制繼電器
編譯時候記得鏈庫 -lwiringPi
代碼快速對齊
①gg 回首行
②=G 自動對齊
EG2:超聲波的使用
Linux下時間函數:struct timeval結構體
- 結構體原型
- 用法
①定義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库)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视觉SLAM十四讲学习笔记——ch5 相
- 下一篇: 开发一款AirPods或者Beats耳机