本帖最后由 MOPPLAYER 于 2015-12-7 02:02 编辑
前言: 利用GPIO的定義,您可以輕鬆使用HC-SR501人體感測器來偵測是否有人體動作,以下是通篇的介紹
實作:
1. HC-SR501簡介和電氣特性如下:
Fig. 1 Datasheet-簡介
2. 本模塊原理圖如下,PIR即紅外線接收頭,7133為穩壓IC,BISS0001為紅外線訊號控制器
Fig. 2 Datasheet-原理圖
3. 再來看它如何工作的原理,如下圖
Fig. 3 Datasheet-工作原理
Fig. 4 Datasheet-BISS0001內部架構圖,由多個放大器和比較器組合而成
Fig. 5 Datasheet-BISS0001波形圖,預設是可重複觸發的組態
4. 利用以上資料我們知道,只要利用GPIO的Input功能,就可以接收由感測器傳送的高低電位資料,即如下關係
- GPIO輸入高電位 <=> 感測器輸出高電位 <=> 偵測到人體移動
- GPIO輸入低電位 <=> 感測器輸出低電位 <=> 無偵測到人體
复制代码
5. 接下來就直接利用上一篇的技巧來設計這個小系統,在虛擬機裡面創建scan.c,輸入以下程式碼
- #define _XOPEN_SOURCE 500
- #include
- #include
- #include
- #include
- #include
- #include
- #include
- #define GPIO_DEVICE "/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio11/value"
- #define EXPORT_PATH "/sys/class/gpio/export"
- #define DIRECT_PATH "/sys/devices/10000000.palmbus/10000600.gpio/gpio/gpio11/direction"
- #define GPIO "11"
- #define DIR "in"
- int main(int argc, char *argv[])
- {
- int ret = 0;
- int fd_gpio = 0;
- int fd_export = 0;
- int fd_dir = 0;
- char buf[4];
- fd_export = open(EXPORT_PATH,O_WRONLY);
- if(fd_export<0){
- perror("open export:");
- return -1;
- }
- write(fd_export,GPIO,strlen(GPIO));
- fd_dir = open(DIRECT_PATH,O_RDWR);
- if(fd_dir<0){
- perror("dir write:");
- return -1;
- }
- write(fd_dir,DIR,strlen(DIR));
- fd_gpio = open(GPIO_DEVICE, O_RDWR);
- if (fd_gpio < 0) {
- printf("can't open %s devicen", GPIO_DEVICE);
- return -1;
- }
- while(1){
- ret = pread(fd_gpio, buf, sizeof(buf), 0);
- if(ret < 0){
- perror("gpio read:");
- break;
- }
- if(atoi(buf) == 0 )
- printf("NO Motion!n");
- else
- printf("Motion Detected!n");
- sleep(1);
- }
- close(fd_gpio);
- close(fd_dir);
- close(fd_export);
- return ret;
- }
复制代码
其中#define _XOPEN_SOURCE 500是必要的,這使得pread函式可以正確指向,並每秒偵測一次由感測器輸出的高低電位
6. 仿照上一篇的流程,輸入以下指令來編譯程式碼
- export STAGING_DIR=
/wrtnode/staging_dir
- export PATH=$PATH:
/wrtnode/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin
复制代码
建立編譯環境
- mipsel-openwrt-linux-gcc scan.c -o scan -Wall
复制代码
編譯程式
Fig. 6 編譯無錯誤無警告
7. 將感測器和開發板連接,接線如下:
- GND <=> P8_6
- VCC <=> 5V電源 (注意,開發板VCC只有3.3V,需外接)
- OUT <=> P7_1
复制代码
8. 利用上一篇的技巧將二進制檔拷貝至開發板上運行,並執行以下指令
9. 將感測器立起來平放時候,若前方扇形100度沒有偵測到人體,則為低電位
Fig. 7 無偵測到人體
10. 若前方扇型100度偵測到人體移動,則輸出低電位
Fig. 8 偵測到人體
11. 完成本篇設計
Fig. 9 實品圖
0
|