国产农村妇女精品一二区,国产A级毛片久久久久久精品,久久丫精品忘忧草西安产品,久久丫精品久久丫,久久国产精品波多野结衣AV,国产午夜精品一区二区,日韩精品极品视频在线观看免费,国产SUV精品一区二区,久久久国产精品,欧美精品一区二区,久久久久国产精品,欧美日韩精品久久久免费观看,欧美人妻日韩精品

激光測距傳感器自制方法大公開!讓你輕松DIY

  • 時間:2024-06-16 00:25:06
  • 點擊:0

在科技日新月異的(de)(de)(de)時(shi)代,越來(lai)越多(duo)的(de)(de)(de)智能(neng)設備走進我們的(de)(de)(de)生(sheng)活(huo)。今天,我們要分(fen)享的(de)(de)(de)是一種(zhong)非常實(shi)用的(de)(de)(de)設備——激光測距傳感器的(de)(de)(de)自(zi)(zi)制方法。通(tong)過這個方法,你不僅可(ke)以節省購(gou)買成本(ben),還可(ke)以發(fa)揮自(zi)(zi)己的(de)(de)(de)創造力,為你的(de)(de)(de)家居生(sheng)活(huo)增添更多(duo)樂趣(qu)。下面就讓(rang)我們一起來(lai)了解一下吧!

一、所需材料

1. 激光測距傳感(gan)器

2. Arduino開發板(如Arduino UNO)

3. 杜邦線若干

4. 面包板

5. 其(qi)他(ta)電子元件(如電阻、電容(rong)等)

6. 外殼(用于安裝傳感器和電路(lu)板)

二、制作步驟

1. 準(zhun)備工作:首先,我們需(xu)要(yao)準(zhun)備一(yi)(yi)個面包板,將Arduino開發板放(fang)在(zai)面包板上,然后在(zai)開發板周圍固定一(yi)(yi)圈杜邦(bang)線(xian),以便焊(han)接其他電子(zi)元件(jian)。接下來,準(zhun)備一(yi)(yi)個外殼,可以是一(yi)(yi)個簡單的紙盒或者(zhe)購買一(yi)(yi)個專門的外殼。

2. 接線:將(jiang)激光測距傳感器的(de)VCC接到面(mian)包板(ban)上(shang)的(de)5V電(dian)源插(cha)座(zuo),將(jiang)GND接到面(mian)包板(ban)上(shang)的(de)GND插(cha)座(zuo),將(jiang)OUT接到Arduino的(de)數字引腳(如D3)。此(ci)外,還需要連接上(shang)限位開關和驅動電(dian)機(ji)的(de)引腳。

3. 編程:使用(yong)Arduino IDE編寫(xie)程序,控制激(ji)(ji)(ji)光測(ce)距(ju)傳感器的輸出(chu)信號。當激(ji)(ji)(ji)光距(ju)離小(xiao)于(yu)設定值時,限位開關(guan)觸發,電機啟動(dong);當激(ji)(ji)(ji)光距(ju)離大于(yu)設定值時,限位開關(guan)關(guan)閉(bi),電機停(ting)止。以(yi)下是一(yi)個簡單(dan)的示例代碼(ma):

```cpp

#include

const int distancePin = 3; // 激(ji)光測(ce)距傳感器連(lian)接(jie)的(de)數字引腳

const int limitSwitchPin = A0; // 限位(wei)開關連接的模擬引腳

const int motorPin = 9; // 電機驅動器(qi)連接的數字引腳

Servo myservo; // 創建一個(ge)舵機對(dui)象

int targetDistance = 10; // 目標距離,可以根據需(xu)要調整(zheng)

int currentDistance; // 當(dang)前(qian)距離

bool isLimitSwitchOpen = false; // 限位開(kai)關是否打開(kai)的標志

void setup() {

pinMode(distancePin, INPUT); // 設置激光(guang)測距傳(chuan)感器引腳為輸入模式

pinMode(limitSwitchPin, INPUT); // 設置限位開關(guan)引腳為輸入模(mo)式

myservo.attach(motorPin); // 將舵機連接到電機驅動(dong)器(qi)

}

void loop() {

currentDistance = analogRead(distancePin); // 讀取激光(guang)測(ce)距傳感(gan)器的(de)輸出值(zhi)(單位:厘米)

if (currentDistance < targetDistance && !isLimitSwitchOpen) { // 當距離小于目標距離且限位開關未觸發時

myservo.write(90); // 電(dian)機轉動到最右邊的(de)位置(zhi)

} else if (currentDistance > targetDistance && isLimitSwitchOpen) { // 當距離大于目標(biao)距離且限位開關已觸發時

myservo.write(0); // 電機轉動到最左邊的位(wei)置

} else if (currentDistance > targetDistance && isLimitSwitchOpen == false) { // 當距(ju)離大于目(mu)標距(ju)離且限位(wei)開關未(wei)觸發(fa)時(即到達目(mu)標位(wei)置)

delay(500); // 等待500毫秒(miao),讓電機有時間停止

myservo.write(0); // 將舵機(ji)設置(zhi)為初始位(wei)置(zhi)(最(zui)左邊)

} else if (currentDistance <= targetDistance && isLimitSwitchOpen == true) { // 當距離小于等于目標距離且限位開關已觸發時(即未到達目標位置)

int stepsToTarget = map(currentDistance, 0, targetDistance + 1, -90, 180); // 計(ji)算到達目標位置(zhi)需(xu)要轉動的角度范圍(單位:度)

int currentSteps = map(myservo.read(), 0, 180, 0, stepsToTarget); // 根據當前舵(duo)機角(jiao)(jiao)度(du)計算還需要轉動的角(jiao)(jiao)度(du)范圍(wei)(單(dan)位(wei):度(du))

int newSteps = min(currentSteps + stepSpeed * (analogRead(limitSwitchPin) == HIGH), stepsToTarget); // 根據限位開關狀(zhuang)態更新還需要轉動的角度(du)范圍(單位:度(du))

int stepsToTake = abs(newSteps - currentSteps); // 需要轉動的步數(shu)

int direction = newSteps < currentSteps; // 是向前還是向后轉動方向的標志

int delayTime = direction == true ? delayBeforeForwarding * stepsToTake * stepSpeed * (stepsToTake * stepSpeed >= stepsToTarget + delayAfterForwarding * stepSpeed) + delayBetweenForwardingAndBackwarding * (stepsToTake % (stepsToTarget + delayBetweenForwardingAndBackwarding)) * stepSpeed : delayBeforeBackwarding * stepsToTake * stepSpeed * (stepsToTake * stepSpeed <= stepsToTarget + delayAfterBackwarding * stepSpeed) + delayBetweenBackwardingAndForwarding * (stepsToTake % (stepsToTarget + delayBetweenBackwardingAndForwarding)) * stepSpeed; // 根據新的步數和方向計算延時時間(單位:毫秒)

int delayCount = delayTime; // 需要延時(shi)(shi)的次數,用于微(wei)調延時(shi)(shi)時(shi)(shi)間

int lastDirection = direction; // 為(wei)了(le)判斷是否需要調整轉(zhuan)向方向,記(ji)錄(lu)上一次的轉(zhuan)向方向

int counter = delayTime; // 為了判斷是否已經完成延(yan)時,記錄當(dang)前延(yan)時次數

while (delayCount > counter && counter >= delayStartValue) { // 當延(yan)時(shi)(shi)時(shi)(shi)間大于(yu)等(deng)于(yu)開(kai)始(shi)延(yan)時(shi)(shi)的(de)值且延(yan)時(shi)(shi)次數大于(yu)等(deng)于(yu)開(kai)始(shi)延(yan)時(shi)(shi)的(de)值時(shi)(shi)執行(xing)循環體

int angle = map(direction == true ? currentSteps + counter * stepSpeed * lastDirection == newSteps * lastDirection == false && counter % (stepsToTarget + delayBetweenForwardingAndBackwarding) == false && counter % (stepsToTarget + delayBetweenBackwardingAndForwarding) == false && counter >= delayBeforeForwarding * stepSpeed && counter <= delayAfterForwarding * stepSpeed && lastDirection != true && counter >= delayBetweenForwardingAndBackwarding && counter <= delayBetweenBackwardingAndForwarding || counter >= stepsToTarget + delayBeforeBackwarding * stepSpeed && counter <= stepsToTarget + delayAfterBackwarding * stepSpeed && lastDirection == true && counter >= delayBetweenBackwardingAndForwarding && counter <= delayBetweenBackwardingAndForwarding || counter >= stepsToTarget + delayBeforeForwarding * stepSpeed && counter <= stepsToTarget + delayAfterForwarding * stepSpeed && lastDirection == false && counter >= delayBetweenForwardingAndBackwarding && counter <= delayBetweenForwardingAndBackwarding || counter >= stepsToTarget + delayBeforeBackwarding * stepSpeed && counter <= stepsToTarget + delayAfterBackwarding * stepSpeed && lastDirection == true && counter >= delayBetweenBackwardingAndForwarding && counter <= delayBetweenBackwardingAndForwarding || counter >= stepsToTarget + delayBeforeForwarding * stepSpeed && counter <= stepsToTarget + delayAfterForwarding * stepSpeed && lastDirection == false && counter >= delayBetweenForwardingAndBackwarding && counter <= delayBetweenForwardingAndBackwarding || lastDirection != direction && counter >= delayBetweenReverse*stepSpeed && counter <= delayAfterReverse*stepSpeed, true, false) * stepSpeed; // 根據當前轉向方向和延時時間計算舵機轉動的角度范圍(單位:度)

int servoAngle = map(angle + getRotationOffset(), minDegrees, maxDegrees, minPositionDeg, maxPositionDeg); // 根據(ju)舵機轉動的范圍映射到實際的角度范圍(單位:度)

int positionInc = map((direction == true && servoAngle > minPositionDeg), true, false)[0] == true || map((direction == false && servoAngle < maxPositionDeg), true, false)[0] == true || map((lastDirection != direction), true, false)[0] == true; // 根據轉向方向判斷是否需要增加或減少舵機的角度范圍(單位:布爾值)

int positionDecayFactor = map((lastDirection != direction), true, false)[0]; // 根據轉(zhuan)向(xiang)方(fang)向(xiang)確定(ding)衰減因子(用(yong)于調整舵(duo)機轉(zhuan)動速(su)度)

int positionDecayDelayCounter = map((lastDirection != direction), true, false)[0]; // 根據轉向方向記錄衰減延遲計數器(用于微調(diao)延時(shi)時(shi)間(jian))

int speedAdjustment = positionInc == true || positionDecayFactor == true || lastDirection != direction || positionDecayDelayCounter < decayDelayCounter; // 根據上述條件判斷是否需要調整舵機的轉動速度和方向或進行衰減延遲處理(布爾值列表)

String command = ""; // 根據(ju)上(shang)述條件(jian)生成控制命令字(zi)符串(僅(jin)在(zai)需要調整(zheng)舵(duo)機(ji)的(de)轉動速度和(he)方向或進行衰減延遲處理(li)時使用)

String servoCmd = ""; // 根據上述(shu)條件生成(cheng)舵機控制命令字(zi)符(fu)串(chuan)(僅在需要調整舵機的(de)轉動速(su)度和方(fang)向或進行衰減延遲

推薦產品