当前位置: 首页>C++>正文

樹莓派的控制方法,第二篇 樹莓派基本外設基礎篇

樹莓派的控制方法,第二篇 樹莓派基本外設基礎篇

目錄

上篇補充:僅通過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日?

????????????????說明:由于筆者水平有限,文中不可避免有所錯漏,敬請廣大讀者斧正。?

https://www.nshth.com/cplus/338552.html
>

相关文章:

  • 樹莓派的控制方法
  • 樹莓派怎么使用
  • 樹莓派的控制方法,第二篇 樹莓派基本外設基礎篇
  • 手機如何連接外設,iOS連接外設的幾種方式
  • switch可以外接鍵鼠嗎,別再給手機外接OTG鍵鼠玩刺激戰場了:其實還能這樣操作
  • [阿發你好]C/C++學習指南
  • 輸入法哪個最好用,wsl2中安裝中文輸入法
  • 字符串中引入變量方法,字符串處理、變量初始值處理、擴展的腳本技巧、正則表達式
  • 某計算機內存容量是512kb,某計算機主存容量為512kb,Cache容量為16kb,每塊有16個字,每字32位。 (1...
  • 中國工商網商標查詢,工商局爬蟲 商標網爬蟲
  • iOS真機調試TestFlight安裝及提交App Store審核教程
  • 蘋果app上架流程,小白如何在ios中安裝ios上架
  • 蘋果彈出提交表格是什么,蘋果TestFlight測試操作圖文教程(測試后提交App Store審核)
  • 四門外語傍身:外語,讓我的大學如此完美
  • D3D Surface/Texture SDL DDraw渲染視頻的區別和疑問
  • 手機VR播放器,Android VR Player(全景視頻播放器) [10]: VR全景視頻渲染播放的實現(exoplayer,glsurfaceview,o
  • Qt渲染視頻常見問題(視頻渲染窗口上子窗口設置透明出現陰影問題、主窗口縮放導致視頻渲染窗口部分出現視頻閃爍問題)
  • 視頻解析網站源碼,ijkplayer源碼分析 視頻渲染流程
  • 一分鐘的視頻渲染要多久,基礎教程|如何在數分鐘時間內渲染超清精美視頻?
  • Metal(六) 案例之視頻文件的渲染
  • flutter開發小程序,最強整理!寫給程序員的Flutter詳細教程,大廠直通車!
  • c++黑客編程揭秘與防范,C/C++截獲騰訊QQ網絡聊天系統內容和登錄密碼,教你做一個黑客!
  • 支付行業具體做什么,做支付需要了解哪些行業知識
  • 5大底層邏輯,淺談HyperLogLog底層算法邏輯
  • c++實現復數的加減乘除,【C++】輔助C++計算復數(代碼解釋的很清楚)
  • nlogn的算法有哪些,算法運行時間1、logN、N、NlogN 、N^2、N^3、2^n之間的比較
  • 開源圖片庫,幾種常用圖像處理開源庫簡介及使用總結
  • 圖像處理和計算機視覺,《圖像處理與計算機視覺算法及應用》讀后感
  • gps定位,側邊欄固定定位到版心兩側
  • css版心怎么設置,[css]版心和布局流程
  • 瀏覽器多個窗口怎么設置在一個頁面,網頁多種版心適應多屏幕技巧
  • 前端學習之版心和布局流程