树莓派外设开发(快速上手)
樹莓派外設開發
- wiringPi庫的使用
- 例子---接收指令讓繼電器工作
- HC-SR04超聲波測距模塊簡單應用
- 跨平臺文件傳輸
- FileZilla軟件
- linux環境自帶的scp指令
- 串口交互
- 修改cmdline.txt文件內容
- 接線
- C字符串相關API處理串口數據
wiringPi庫的使用
頭文件:include <wiringPi.h>
查看樹莓派引腳情況:在顯示終端輸入命令gpio readall
宏定義引腳:例如#define JDQ 3
wiringPi庫初始化:wiringPiSetup()返回值等于-1 初始化失敗
設置引腳為輸出引腳:pinMode(JDQ, OUTPUT);
設置引腳為輸入引腳:pinMode(JDQ, INPUT);
設置引腳為高電平:digitalWrite(JDQ, HIGH);
設置引腳為低電平:digitalWrite(JDQ, LOW);
讀取引腳值:digitalRead(JDQ);
編譯鏈庫:-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庫:
gcc JDQ_demo.c -lwiringPi -o JDQ_demoHC-SR04超聲波測距模塊簡單應用
HC-SR04超聲波測距模塊基本信息:
工作電壓:5v
echo:回收聲波,設置成輸入引腳
trig:發射聲波,設置成輸出引腳
測距范圍:最遠4米左右
測距原理:當樹莓派(trig引腳)持續10us的高電平,聲波模塊的trig端發送8個40Hz的方波,echo引腳從高電平到低電平的時間就是聲波發出后遇到障礙物后反射回來的時間
獲取系統函數原型:
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 */};場景:通過判斷聲波模塊到障礙物體的距離,可以做一個近距離感應提示燈
#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); //為了讓數據更精準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; }跨平臺文件傳輸
在同一網段下傳
FileZilla軟件
官網開源下載:https://www.filezilla.cn/
使用:
linux環境自帶的scp指令
使用:scp 文件名 目標主機名@目標主機ip地址:目錄
例如:scp test.c hhz@172.20.10.6:/home/hhz/
如果目標主機在線,會提示輸入目標主機密碼
串口交互
串口通信屬于全雙工,即兩個人對罵,同時兩個人是能聽得見
半雙工:一個人被另一個人罵地啞口無言,只能聽
樹莓派串口數據一次接收數據的量是8個字符,如果要使用串口通信完成某些任務時,可以先將要傳的數據弄成容易區分和標記的,然后用字符串相關API處理。
修改cmdline.txt文件內容
vi /boot/cmdlinet.txt編輯文件
方式一
備份好原內容
刪除字符串:console=serial0,115200
方式二
備份好原內容或者注釋掉,將原內容替換為:
修改后sudo reboot重啟,如果重啟不了,就重新上電
重啟后查看是否有映射成功:ls -l /dev|grep serial
接線
接線跟第一次用串口登錄一樣
C字符串相關API處理串口數據
頭文件:#include <wiringSerial.h>
樹莓打開串口:int serialOpen(char *device, int baud)
樹莓發數據:void serialPutchar(int fd, unsigned char c)
樹莓發數據:void serialPuts(int fd, char *s)
樹莓接收數據:int serialDataAvail(int fd)
樹莓接收數據:int serialGetchar(int fd)
樹莓關閉串口:void serialClose(int fd)
還有vfs虛擬文件系統的API接口,下面的通用性強
vfs提供一個通用的接口,不僅適用于文件讀寫、網絡信息收發、串口讀寫等等
開關燈:
#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"); //打印錯誤信息exit(0); //進程退出函數}pinMode(JDQ, OUTPUT);digitalWrite(JDQ, HIGH);fd = serialOpen("/dev/ttyAMA0", 9600); //第二個參數為波特率,返回值=-1打開串口失敗if(fd == -1){printf("serialOpen failure\n");exit(1);}while(1){memset(buf, 0, sizeof(buf)); //memset初始化申請的內存,sizeof()計算數組、結構體等大小read(fd, buf, sizeof(buf)); //fd:文件描述符,buf:將要寫入的緩存區if(strlen(buf)!= 0) //字符串長度{printf("receive:%s\n", buf);handleCmd(buf);}}return 0; }總結
以上是生活随笔為你收集整理的树莓派外设开发(快速上手)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 教人怎样读书的书——《如何阅读一本书》
- 下一篇: 简易散点图