树莓派外设开发基础(wiringPi库)
參考:樹莓派外設(shè)開發(fā)基礎(chǔ)篇
作者:丶PURSUING
發(fā)布時(shí)間:2021-02-05 18:20:53
網(wǎng)址:https://blog.csdn.net/weixin_44742824/article/details/113673019?spm=1001.2014.3001.5501
目錄
- 外設(shè)開發(fā)綜述及wiringPi庫
- 是什么
- 如何獲取
- 如何使用
- EG1:控制繼電器
- EG2:超聲波的使用
- Linux下時(shí)間函數(shù):struct timeval結(jié)構(gòu)體
- 超聲波原理簡述
- 代碼詳解
- 其他
- 1.配置ssh時(shí)出現(xiàn)的亂碼問題
- 2. .swp文件的處理
外設(shè)開發(fā)綜述及wiringPi庫
是什么
樹莓派中一個(gè)集成了很多API(特定平臺(tái),特定接口)的庫,使得開發(fā)像printf一樣簡單。
初學(xué)只需會(huì)調(diào)庫,之后再深入到自己寫wiringPi庫,IO的上層以及底層的驅(qū)動(dòng)代碼。
如何獲取
樹莓派的鏡像固件中可能不會(huì)帶有wiringPi庫
使用以下命令查看
gpio -v-
已經(jīng)安裝
- 未安裝
由于我的樹莓派自帶了WiringPi庫,沒有親自安裝過,參考
安裝教程博文中補(bǔ)充失效的下載連接
如何使用
EG1:控制繼電器
查看io口詳情
gpio readall注意了IO口編號(hào)可不是中間排針的序號(hào)!!
繼電器驅(qū)動(dòng)電壓3.3v
選擇pin7作為信號(hào)引腳
下面是連接實(shí)物圖,因?yàn)檫B接了WIFI,沒有用到串口線。
樹莓派的接口函數(shù)詳解:https://www.cnblogs.com/lulipro/p/5992172.html
包含頭文件#incldue <wiringPi.h>
①硬件初始化函數(shù)
| int wiringPiSetup (void) | -1表示失敗 | 使用wiringPi 引腳編號(hào)表,編號(hào)為 0~16。root |
| int wiringPiSetupGpio (void) | -1表示失敗 | 使用BCM GPIO引腳編號(hào)表。root |
②通用GPIO控制函數(shù)
| void pinMode (int pin, int mode) | value INPUT、OUTPUT、PWM_OUTPUT,GPIO_CLOCK | 只有wiringPi 引腳編號(hào)下的1腳(BCM下的18腳) 支持PWM輸出;只有wiringPi編號(hào)下的7(BCM下的4號(hào))支持GPIO_CLOCK輸出 |
| void digitalWrite (int pin, int value) | HIGH,LOW | 輸出高低電平 |
| int digitalRead (int pin) | 返回引腳上的電平 | |
| void analogWrite(int pin, int value) | value:輸出的模擬量 | 樹莓派的引腳本身是不支持AD轉(zhuǎn)換的,也就是不能使用模擬量的API,需要增加另外的模塊 |
| int analogRead (int pin) | 返回引腳上讀取的模擬量 | 樹莓派的引腳本身是不支持AD轉(zhuǎn)換的,也就是不能使用模擬量的API,需要增加另外的模塊 |
| void pwmWrite (int pin, int value) | value:寫入到PWM寄存器的值,范圍在0~1024之間。 | pin只能是wiringPi 引腳編號(hào)下的1腳(BCM下的18腳) |
EG:從鍵盤輸入0,1控制繼電器
編譯時(shí)候記得鏈庫 -lwiringPi
代碼快速對(duì)齊
①gg 回首行
②=G 自動(dòng)對(duì)齊
EG2:超聲波的使用
Linux下時(shí)間函數(shù):struct timeval結(jié)構(gòu)體
- 結(jié)構(gòu)體原型
- 用法
①定義2個(gè)結(jié)構(gòu)體變量
struct timeval tv1; struct timeval tv2;②獲取某個(gè)事件的開始,結(jié)束信息
gettimeofday(&tv1, NULL); //....事件 gettimeofday(&tv2, NULL);int gettimeofday(struct timeval *tv, struct timezone *tz);
timezone structure 已經(jīng)過時(shí)了
tz 通常設(shè)置為 NULL.
③計(jì)算開始,結(jié)束的時(shí)間
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為單位超聲波原理簡述
觸發(fā)信號(hào)為10us的TTL,接收信號(hào)檢測高電平持續(xù)的時(shí)間,再由公式計(jì)算即可。
TTL電平信號(hào)被利用的最多是因?yàn)橥ǔ?shù)據(jù)表示采用二進(jìn)制規(guī)定,+5V等價(jià)于邏輯"1",0V等價(jià)于邏輯"0",這被稱做TTL信號(hào)系統(tǒng)
代碼詳解
#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//統(tǒng)計(jì)高電平持續(xù)的時(shí)間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 已經(jīng)過時(shí)了;* tz 通常設(shè)置為 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; }-----------------------------------------------------------------時(shí)間控制函數(shù)-----------------------------------------------------------
void delay (unsigned int howLong)
毫秒級(jí),最大延時(shí)49天
void delayMicroseconds (unsigned int howLong)
微妙級(jí),最大延時(shí)71分鐘
其他
1.配置ssh時(shí)出現(xiàn)的亂碼問題
輸入命令 sudo raspi-config 后如下圖所示。底層邏輯無問題,可操作,僅為顯示亂碼
將字符編碼由default更改為UTF-8即可
2. .swp文件的處理
2. .swp文件的處理
當(dāng)兩個(gè)窗口同時(shí)對(duì)同一個(gè)目標(biāo)文件進(jìn)行編輯時(shí),就會(huì)提示生成隱藏文件目標(biāo).swp,警告修改編輯的可能不是最新的文件。若.swp文件存在,則每次打開目標(biāo)文件都會(huì)ATTENTION
解決方法
用ls -a可以看到生成的.swp隱藏文件,再用rm指令刪除即可。
總結(jié)
以上是生活随笔為你收集整理的树莓派外设开发基础(wiringPi库)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 视觉SLAM十四讲学习笔记——ch5 相
- 下一篇: 开发一款AirPods或者Beats耳机