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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

树莓派外设开发(快速上手)

發布時間:2024/1/18 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树莓派外设开发(快速上手) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

樹莓派外設開發

  • 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_demo

HC-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
方式二
備份好原內容或者注釋掉,將原內容替換為:

dwc_otg.lpm_enable=0 kgdboc=ttyAMA0,115200 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

修改后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 <unistd.h> ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count);

開關燈:

#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; }

總結

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

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