樹莓派的控制方法,第二篇 樹莓派基本外設基礎篇
樹莓派的控制方法,第二篇 樹莓派基本外設基礎篇
目錄
上篇補充:僅通過ssh登錄樹莓派
本篇主題:淺學樹莓派基本外設(自動開蓋垃圾桶)
?一、HC-SR04超聲波測距原理和代碼實現
超聲波測距demo:?
二、SG90舵機原理
什么是PWM:(來源于百度)
PWM驅動舵機的demo:
上篇補充:僅通過ssh登錄樹莓派
①一條這樣的線,一端連樹莓派網口,一端連電腦?
②電腦連接wifi(手機熱點也可),右鍵網絡圖標 ,打開“網絡和Internet”設置,點擊高級網絡設置里的“更改適配器選項”,,選擇正在使用的那個適配器(這里是WLAN)
③樹莓派開機,等待網口燈亮后。打開Advanced IP Scanner(可以掃描本機網段下所有設備IP的工具)?,或win+R,輸入cmd,打開命令提示符,輸入arp -a命令。找到MAC(物理地址)為B8:27:EB開頭的設備
樹莓派的控制方法,④復制獲得的IP,打開Xshell或putty等工具,登錄到樹莓派?
進入本篇主題:淺學樹莓派基本外設(自動開蓋垃圾桶)
模塊:HC-SR04超聲波模塊? ?SG90舵機
-
樹莓派的接口:
I/O:Input Ouput 對于主控芯片來說
? ? ? ? Input:人體紅外傳感器,煙霧傳感器,火焰傳感器,震動傳感器
????????Output: 繼電器,蜂鳴器
PWM:電機調速,調整燈光明亮度
串口uart、SPI、IIS、其他特定硬件接口:flash
其他芯片:? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ????????? ? ?Nanopi、S3c2410、2440、6410、Tiny210 、tiny4412(Linux)
海思方案,瑞芯微方案,移遠方案
C51,STM32,Arduino,WemosD1(沒有OS(Linux)純裸機開發)
?一、HC-SR04超聲波測距原理和代碼實現
原理:(常見于中學物理題,霍霍了多少孩紙)
GPIO4向 Trig?引腳發送一個 10us 的脈沖信號,開始發送超聲波,并把 Echo置為高電平,發射超聲波之后,與接收到傳回的超聲波之前,Echo這個響應引腳會一直呈現高電平,然后準備接收返回的超聲波。等到超聲波撞到障礙物彈回來并被模塊接收,Echo引腳置為低電平。
(有用的話:Echo持續高電平的時間就是超聲波往返路程的花費的時間,通過記錄時間,再利用路程=速度X時間?可算出路程(注意是往返路程),已知:超聲波速度340m/s)
PS:實際編寫代碼時,需注意時間是微秒級別,轉換單位時避免精度丟失?。
超聲波測距demo:?
#include<wiringPi.h>
#include<softPwm.h>
#include<unistd.h>
#include<sys/time.h>
#include<stdio.h>
#include<stdlib.h>
#include<error.h>
#define TRIG 4
#define ECHO 5
#define BEE 6
void init_hardware(){int retn;retn=wiringPiSetup();if(retn < 0){perror("init hardware");exit(-1);}
}
void init_pins(){pinMode(ECHO,INPUT);pinMode(TRIG,OUTPUT);
}
float measure_distance(){long start_usec,stop_usec;struct timeval rawtime1,rawtime2;float distance;digitalWrite(TRIG,LOW);delayMicroseconds(2);digitalWrite(TRIG,HIGH);delayMicroseconds(10);digitalWrite(TRIG,LOW);//start send ultrasonic
// printf("%d\n",digitalRead(ECHO));while(!(digitalRead(ECHO) == 1));gettimeofday(&rawtime1, NULL);while(!(digitalRead(ECHO) == 0));//lowgettimeofday(&rawtime2,NULL);start_usec = rawtime1.tv_sec * 1000000 + rawtime1.tv_usec;stop_usec = rawtime2.tv_sec * 1000000 + rawtime2.tv_usec;distance = (float)(stop_usec - start_usec)/1000000 * 34000 / 2;return distance;
}
int main(){float distance;init_hardware();init_pins();while(1){distance = measure_distance();printf("%0.2f cm\n",distance);delay(1000);}return 0;
}
二、SG90舵機原理
原理:不同于HC-SR04超聲波模塊,SG90舵機的控制信號是PWM信號,利用其占空比的變化,改變舵機轉動的角度。如下圖(來源于百度)
通過控制線發送一個PWM信號可以控制舵機轉動到一個角度,這個PWM信號必須周期性發送,否則舵機就會轉到一個任意的角度。通常,控制舵電機的PWM信號周期為20ms(50HZ),寬度在0.5ms-2.5ms之間(對應最小角度和最大角度)。
以0-180度的舵機為例,,我已經知道了舵機的pwm周期為20ms,然后是這樣的
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
這里舵機的實現與wemos?D1有所不同,通過查詢眾多文章(大部分用Python實現)
C寫的主要了解到的方式有三種:①硬件PWM;②軟件PWM;③高低電平模擬。
什么是PWM:(來源于百度)
????????樹莓派或者是其他單片機一個引腳只能輸出兩個特定的電平——高電平和低電平。在樹莓派上大多的GPIO都是高電平3.3V,低電平0V。但如果想要輸出3.3~0V之間的電壓怎么辦呢?比如輸出一個2V?樹莓派(以及stm32,C51之類的)是沒有辦法直接設置引腳的電平來達到輸出2V的電平值。那么就要使用PWM來輸出介于低電平和高電平之間的電壓。
????????那么PWM是怎么做到的呢?很簡單:我們不能直接輸出2V,那我們換一種方式——通過給引腳一個周期脈沖,然后看這個脈沖的高電平部分占整個脈沖的比例,從而計算這個輸出的電平。舉個栗子?:比如我給出一個周期為20s的周期脈沖,然后讓其中的高電平為12s,這樣的話輸出的電平就是(12/20)*3.3V≈2V,那么2V就輸出了?。
也就是說,PWM是根據周期脈沖中高電平所占的比例來確定GPIO輸出的電壓的。這里,高電平所占周期脈沖的周期的比例稱為占空比。
在wiringPi中提供的關于硬件PWM的通用GPIO函數有:
- 函數①:? void pinMode (int pin, int mode)
參數解釋:pin:配置的引腳????????mode:指定引腳的IO模式(PWM_OUTPUT為PWM輸出模式)
注意:只有wiringPi 引腳編號下的1腳(BCM下的18腳) 支持PWM輸出
- 函數②:?void pwmWrite (int pin, int value)
?參數解釋:pin:引腳???????????????value:寫入到PWM寄存器的值,范圍在0~1024之間。
?注意:pin只能是wiringPi 引腳編號下的1腳(BCM下的18腳)
(可以利用PWM做LED的呼吸燈實驗)
在wiringPi中提供的關于軟件PWM的通用GPIO函數有:?
PWM驅動舵機的demo:
#include<stdio.h>
#include<wiringPi.h>
#include<softPwm.h>
#define SERVO 7
void init_(){wiringPiSetup();pinMode(SERVO,PWM_OUTPUT);
}int main(){init_();while(1){softPwmCreate(SERVO,20,200);softPwmWrite(SERVO,10);delay(1000);softPwmWrite(SERVO,25);delay(1000);}return 0;
}
在做開蓋垃圾桶過程中的問題:
①供電不足可以會導致程序運行時死機,或者模塊工作不正常,建議使用穩定電源供電(充電寶、符合規格的充電適配器等),樹莓派供電正常時,紅燈常亮。
②查找資料時,有說法樹莓派PWM不穩定,會導致舵機抖動的問題(其中有建議使用pigpio庫可解決,附網址:pigpio libraryhttp://abyz.me.uk/rpi/pigpio/cif.html#gpioInitialise
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 最后編輯于:2022年2月20日?
????????????????說明:由于筆者水平有限,文中不可避免有所錯漏,敬請廣大讀者斧正。?