当前位置: 首页>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
>

相关文章:

  • 樹莓派的控制方法
  • 樹莓派怎么使用
  • github 免費節點,BUMO:超級節點共建接口
  • 學習html/css基礎的重點筆記
  • 企業郵箱怎么群發郵件,企業會員郵件群發解決方案
  • esfp光模塊,闡述一下ecshop各模塊的功能_【光電通信】40G QSFP+ LR4 光模塊的設計與實現(一)...
  • lua編程軟件,QQ郵箱記事本模塊Lua實現小結
  • centos7.6鏡像下載,centos(7.9) minikube(v1.28.0) kaniko 構建鏡像
  • 計算機畢業設計ssm企業部門報銷管理g9d62系統+程序+源碼+lw+遠程部署
  • 鮑森詹森實驗過程,Ornstein-Uhlenbeck過程
  • 嵌入式的發展趨勢,我理解的嵌入式幾個發展方向
  • 51開發板,IMX6ULL_PRO嵌入式開發板介紹
  • 嵌入式軟件工程師,2023屆秋招內推指南|嵌入式開發|軟硬件
  • 剛畢業的大學生適合做什么工作,今天我的就業班的生活開始啦~~~
  • C語言-基礎知識練習習題1
  • 什么監控攝像頭最清晰,計算機為什么找不到攝像頭,為何電腦里找不到攝像頭設備?
  • 網易支付登錄,微信登陸和支付
  • 人工智能自我進化,復雜性思維中文第二版 十一、進化
  • firebase,Firebase 教程: iOS A/B 測試
  • mongodb可視化管理工具,Impala入門筆記---比Hive強大
  • 世界只是一個程序,程序的世界里,短暫的放空
  • 如何用爬蟲爬取網頁上的數據,新聞爬蟲及爬取結果查詢網站的搭建(一)
  • 爬蟲網站,新聞網站爬蟲及結果查詢
  • 深度卷積神經網絡,深度KWeaver:價值驅動,認知智能走向開源共創
  • sci論文翻譯神器,SCI科技論文英語翻譯的一點個人心得
  • 協議的定義,連接跟蹤TCP協議狀態轉換
  • 洛谷 T284709 怨念(resent)
  • 1330 小青蛙跳臺階
  • 動態規劃解決小青蛙跳臺階問題
  • 代碼記錄丨小青蛙和漢諾塔
  • 小青蛙爬井
  • 【基礎】小青蛙回來了