树莓派外设开发(快速上手)
樹(shù)莓派外設(shè)開(kāi)發(fā)
- wiringPi庫(kù)的使用
- 例子---接收指令讓繼電器工作
- HC-SR04超聲波測(cè)距模塊簡(jiǎn)單應(yīng)用
- 跨平臺(tái)文件傳輸
- FileZilla軟件
- linux環(huán)境自帶的scp指令
- 串口交互
- 修改cmdline.txt文件內(nèi)容
- 接線
- C字符串相關(guān)API處理串口數(shù)據(jù)
wiringPi庫(kù)的使用
頭文件:include <wiringPi.h>
查看樹(shù)莓派引腳情況:在顯示終端輸入命令gpio readall
宏定義引腳:例如#define JDQ 3
wiringPi庫(kù)初始化:wiringPiSetup()返回值等于-1 初始化失敗
設(shè)置引腳為輸出引腳:pinMode(JDQ, OUTPUT);
設(shè)置引腳為輸入引腳:pinMode(JDQ, INPUT);
設(shè)置引腳為高電平:digitalWrite(JDQ, HIGH);
設(shè)置引腳為低電平:digitalWrite(JDQ, LOW);
讀取引腳值:digitalRead(JDQ);
編譯鏈庫(kù):-lwiringPi
例子—接收指令讓繼電器工作
#include <stdio.h> #include <wiringPi.h>#define JDQ 3int handleCmd(int cmd) {switch(cmd){case 0:digitalWrite(JDQ, LOW);break;case 1:digitalWrite(JDQ, HIGH);break;case 3:printf("quit\n");break;}return cmd; }int main() {int cmd;if(wiringPiSetup() == -1){printf("wiringPi init failure\n");return -1;}pinMode(JDQ, OUTPUT);digitalWrite(JDQ, HIGH);while(1){printf("input num(0-light,1-dark,3-quit):");scanf("%d", &cmd);if(handleCmd(cmd) == 3){break;}}return 0; }編譯鏈接wiringPi庫(kù):
gcc JDQ_demo.c -lwiringPi -o JDQ_demoHC-SR04超聲波測(cè)距模塊簡(jiǎn)單應(yīng)用
HC-SR04超聲波測(cè)距模塊基本信息:
工作電壓:5v
echo:回收聲波,設(shè)置成輸入引腳
trig:發(fā)射聲波,設(shè)置成輸出引腳
測(cè)距范圍:最遠(yuǎn)4米左右
測(cè)距原理:當(dāng)樹(shù)莓派(trig引腳)持續(xù)10us的高電平,聲波模塊的trig端發(fā)送8個(gè)40Hz的方波,echo引腳從高電平到低電平的時(shí)間就是聲波發(fā)出后遇到障礙物后反射回來(lái)的時(shí)間
獲取系統(tǒng)函數(shù)原型:
int gettimeofday(struct timeval *tv, struct timezone *tz); struct timeval {time_t tv_sec; /* seconds */suseconds_t tv_usec; /* microseconds */}; struct timezone {int tz_minuteswest; /* minutes west of Greenwich */int tz_dsttime; /* type of DST correction */};場(chǎng)景:通過(guò)判斷聲波模塊到障礙物體的距離,可以做一個(gè)近距離感應(yīng)提示燈
#include <stdio.h> #include <sys/time.h> #include <wiringPi.h>#define TRIG 1 #define ECHO 2 #define JDQ 3void devInit() { pinMode(TRIG, OUTPUT);pinMode(ECHO, INPUT);pinMode(JDQ, OUTPUT);digitalWrite(JDQ, HIGH); }float getDis() {long start;long stop;float dis;struct timeval t1;struct timeval t2;digitalWrite(TRIG, LOW); //為了讓數(shù)據(jù)更精準(zhǔn)delayMicroseconds(2);digitalWrite(TRIG, HIGH);delayMicroseconds(10);digitalWrite(TRIG, LOW);while(digitalRead(ECHO) != HIGH);gettimeofday(&t1, NULL);while(digitalRead(ECHO) != LOW);gettimeofday(&t2, NULL);start = t1.tv_sec * 1000000 + t1.tv_usec; //s化us,10的6次方stop = t2.tv_sec * 1000000 + t2.tv_usec;dis = (float)(stop-start) / 1000000 * 34000 / 2; //空氣中聲音的傳播速度340m/sreturn dis; }int main() {float dis;if(wiringPiSetup() == -1){return -1;}devInit();while(1){delay(2000);dis = getDis();printf("%.2fcm\n", dis);if(dis <= 15){digitalWrite(JDQ, LOW);delay(3000);digitalWrite(JDQ, HIGH);}}return 0; }跨平臺(tái)文件傳輸
在同一網(wǎng)段下傳
FileZilla軟件
官網(wǎng)開(kāi)源下載:https://www.filezilla.cn/
使用:
linux環(huán)境自帶的scp指令
使用:scp 文件名 目標(biāo)主機(jī)名@目標(biāo)主機(jī)ip地址:目錄
例如:scp test.c hhz@172.20.10.6:/home/hhz/
如果目標(biāo)主機(jī)在線,會(huì)提示輸入目標(biāo)主機(jī)密碼
串口交互
串口通信屬于全雙工,即兩個(gè)人對(duì)罵,同時(shí)兩個(gè)人是能聽(tīng)得見(jiàn)
半雙工:一個(gè)人被另一個(gè)人罵地啞口無(wú)言,只能聽(tīng)
樹(shù)莓派串口數(shù)據(jù)一次接收數(shù)據(jù)的量是8個(gè)字符,如果要使用串口通信完成某些任務(wù)時(shí),可以先將要傳的數(shù)據(jù)弄成容易區(qū)分和標(biāo)記的,然后用字符串相關(guān)API處理。
修改cmdline.txt文件內(nèi)容
vi /boot/cmdlinet.txt編輯文件
方式一
備份好原內(nèi)容
刪除字符串:console=serial0,115200
方式二
備份好原內(nèi)容或者注釋掉,將原內(nèi)容替換為:
修改后sudo reboot重啟,如果重啟不了,就重新上電
重啟后查看是否有映射成功:ls -l /dev|grep serial
接線
接線跟第一次用串口登錄一樣
C字符串相關(guān)API處理串口數(shù)據(jù)
頭文件:#include <wiringSerial.h>
樹(shù)莓打開(kāi)串口:int serialOpen(char *device, int baud)
樹(shù)莓發(fā)數(shù)據(jù):void serialPutchar(int fd, unsigned char c)
樹(shù)莓發(fā)數(shù)據(jù):void serialPuts(int fd, char *s)
樹(shù)莓接收數(shù)據(jù):int serialDataAvail(int fd)
樹(shù)莓接收數(shù)據(jù):int serialGetchar(int fd)
樹(shù)莓關(guān)閉串口:void serialClose(int fd)
還有vfs虛擬文件系統(tǒng)的API接口,下面的通用性強(qiáng)
vfs提供一個(gè)通用的接口,不僅適用于文件讀寫、網(wǎng)絡(luò)信息收發(fā)、串口讀寫等等
開(kāi)關(guān)燈:
#include <stdio.h> #include <stdlib.h> #include <wiringPi.h> #include <wiringSerial.h> #include <string.h> #include <unistd.h>#define JDQ 3void handleCmd(char *pBuf) {if(!strcmp(pBuf, "opendeng")) //字符串一樣返回值為0{digitalWrite(JDQ, LOW);}else if(strstr("closelight", pBuf) != NULL) //搜索子串{digitalWrite(JDQ, HIGH);}else{printf("command error\n");} }int main() {int fd;char buf[16];if(wiringPiSetup() == -1){perror("why"); //打印錯(cuò)誤信息exit(0); //進(jìn)程退出函數(shù)}pinMode(JDQ, OUTPUT);digitalWrite(JDQ, HIGH);fd = serialOpen("/dev/ttyAMA0", 9600); //第二個(gè)參數(shù)為波特率,返回值=-1打開(kāi)串口失敗if(fd == -1){printf("serialOpen failure\n");exit(1);}while(1){memset(buf, 0, sizeof(buf)); //memset初始化申請(qǐng)的內(nèi)存,sizeof()計(jì)算數(shù)組、結(jié)構(gòu)體等大小read(fd, buf, sizeof(buf)); //fd:文件描述符,buf:將要寫入的緩存區(qū)if(strlen(buf)!= 0) //字符串長(zhǎng)度{printf("receive:%s\n", buf);handleCmd(buf);}}return 0; }總結(jié)
以上是生活随笔為你收集整理的树莓派外设开发(快速上手)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 教人怎样读书的书——《如何阅读一本书》
- 下一篇: 简易散点图