• <dfn id="oesey"><code id="oesey"></code></dfn>
  • <rt id="oesey"><em id="oesey"></em></rt>
    <code id="oesey"><del id="oesey"></del></code>
    <menu id="oesey"><pre id="oesey"></pre></menu>
    <dl id="oesey"><small id="oesey"></small></dl>
    <dfn id="oesey"><dl id="oesey"></dl></dfn>
  • <center id="oesey"></center>

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

    • 時(shí)間:2024-06-16 00:25:06
    • 點(diǎn)擊:0

    在科技日新月異的時(shí)代,越來(lái)越多的智能設(shè)備走進(jìn)我們的生活。今天,我們要分享的是一種非常實(shí)用的設(shè)備——激光測(cè)距傳感器的自制方法。通過這個(gè)方法,你不僅可以節(jié)省購(gòu)買成本,還可以發(fā)揮自己的創(chuàng)造力,為你的家居生活增添更多樂趣。下面就讓我們一起來(lái)了解一下吧!

    一、所需材料

    1. 激光測(cè)距傳感器

    2. Arduino開發(fā)板(如Arduino UNO)

    3. 杜邦線若干

    4. 面包板

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

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

    二、制作步驟

    1. 準(zhǔn)備工作:首先,我們需要準(zhǔn)備一個(gè)面包板,將Arduino開發(fā)板放在面包板上,然后在開發(fā)板周圍固定一圈杜邦線,以便焊接其他電子元件。接下來(lái),準(zhǔn)備一個(gè)外殼,可以是一個(gè)簡(jiǎn)單的紙盒或者購(gòu)買一個(gè)專門的外殼。

    2. 接線:將激光測(cè)距傳感器的VCC接到面包板上的5V電源插座,將GND接到面包板上的GND插座,將OUT接到Arduino的數(shù)字引腳(如D3)。此外,還需要連接上限位開關(guān)和驅(qū)動(dòng)電機(jī)的引腳。

    3. 編程:使用Arduino IDE編寫程序,控制激光測(cè)距傳感器的輸出信號(hào)。當(dāng)激光距離小于設(shè)定值時(shí),限位開關(guān)觸發(fā),電機(jī)啟動(dòng);當(dāng)激光距離大于設(shè)定值時(shí),限位開關(guān)關(guān)閉,電機(jī)停止。以下是一個(gè)簡(jiǎn)單的示例代碼:

    ```cpp

    #include

    const int distancePin = 3; // 激光測(cè)距傳感器連接的數(shù)字引腳

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

    const int motorPin = 9; // 電機(jī)驅(qū)動(dòng)器連接的數(shù)字引腳

    Servo myservo; // 創(chuàng)建一個(gè)舵機(jī)對(duì)象

    int targetDistance = 10; // 目標(biāo)距離,可以根據(jù)需要調(diào)整

    int currentDistance; // 當(dāng)前距離

    bool isLimitSwitchOpen = false; // 限位開關(guān)是否打開的標(biāo)志

    void setup() {

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

    pinMode(limitSwitchPin, INPUT); // 設(shè)置限位開關(guān)引腳為輸入模式

    myservo.attach(motorPin); // 將舵機(jī)連接到電機(jī)驅(qū)動(dòng)器

    }

    void loop() {

    currentDistance = analogRead(distancePin); // 讀取激光測(cè)距傳感器的輸出值(單位:厘米)

    if (currentDistance < targetDistance && !isLimitSwitchOpen) { // 當(dāng)距離小于目標(biāo)距離且限位開關(guān)未觸發(fā)時(shí)

    myservo.write(90); // 電機(jī)轉(zhuǎn)動(dòng)到最右邊的位置

    } else if (currentDistance > targetDistance && isLimitSwitchOpen) { // 當(dāng)距離大于目標(biāo)距離且限位開關(guān)已觸發(fā)時(shí)

    myservo.write(0); // 電機(jī)轉(zhuǎn)動(dòng)到最左邊的位置

    } else if (currentDistance > targetDistance && isLimitSwitchOpen == false) { // 當(dāng)距離大于目標(biāo)距離且限位開關(guān)未觸發(fā)時(shí)(即到達(dá)目標(biāo)位置)

    delay(500); // 等待500毫秒,讓電機(jī)有時(shí)間停止

    myservo.write(0); // 將舵機(jī)設(shè)置為初始位置(最左邊)

    } else if (currentDistance <= targetDistance && isLimitSwitchOpen == true) { // 當(dāng)距離小于等于目標(biāo)距離且限位開關(guān)已觸發(fā)時(shí)(即未到達(dá)目標(biāo)位置)

    int stepsToTarget = map(currentDistance, 0, targetDistance + 1, -90, 180); // 計(jì)算到達(dá)目標(biāo)位置需要轉(zhuǎn)動(dòng)的角度范圍(單位:度)

    int currentSteps = map(myservo.read(), 0, 180, 0, stepsToTarget); // 根據(jù)當(dāng)前舵機(jī)角度計(jì)算還需要轉(zhuǎn)動(dòng)的角度范圍(單位:度)

    int newSteps = min(currentSteps + stepSpeed * (analogRead(limitSwitchPin) == HIGH), stepsToTarget); // 根據(jù)限位開關(guān)狀態(tài)更新還需要轉(zhuǎn)動(dòng)的角度范圍(單位:度)

    int stepsToTake = abs(newSteps - currentSteps); // 需要轉(zhuǎn)動(dòng)的步數(shù)

    int direction = newSteps < currentSteps; // 是向前還是向后轉(zhuǎn)動(dòng)方向的標(biāo)志

    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; // 根據(jù)新的步數(shù)和方向計(jì)算延時(shí)時(shí)間(單位:毫秒)

    int delayCount = delayTime; // 需要延時(shí)的次數(shù),用于微調(diào)延時(shí)時(shí)間

    int lastDirection = direction; // 為了判斷是否需要調(diào)整轉(zhuǎn)向方向,記錄上一次的轉(zhuǎn)向方向

    int counter = delayTime; // 為了判斷是否已經(jīng)完成延時(shí),記錄當(dāng)前延時(shí)次數(shù)

    while (delayCount > counter && counter >= delayStartValue) { // 當(dāng)延時(shí)時(shí)間大于等于開始延時(shí)的值且延時(shí)次數(shù)大于等于開始延時(shí)的值時(shí)執(zhí)行循環(huán)體

    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; // 根據(jù)當(dāng)前轉(zhuǎn)向方向和延時(shí)時(shí)間計(jì)算舵機(jī)轉(zhuǎn)動(dòng)的角度范圍(單位:度)

    int servoAngle = map(angle + getRotationOffset(), minDegrees, maxDegrees, minPositionDeg, maxPositionDeg); // 根據(jù)舵機(jī)轉(zhuǎn)動(dòng)的范圍映射到實(shí)際的角度范圍(單位:度)

    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; // 根據(jù)轉(zhuǎn)向方向判斷是否需要增加或減少舵機(jī)的角度范圍(單位:布爾值)

    int positionDecayFactor = map((lastDirection != direction), true, false)[0]; // 根據(jù)轉(zhuǎn)向方向確定衰減因子(用于調(diào)整舵機(jī)轉(zhuǎn)動(dòng)速度)

    int positionDecayDelayCounter = map((lastDirection != direction), true, false)[0]; // 根據(jù)轉(zhuǎn)向方向記錄衰減延遲計(jì)數(shù)器(用于微調(diào)延時(shí)時(shí)間)

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

    String command = ""; // 根據(jù)上述條件生成控制命令字符串(僅在需要調(diào)整舵機(jī)的轉(zhuǎn)動(dòng)速度和方向或進(jìn)行衰減延遲處理時(shí)使用)

    String servoCmd = ""; // 根據(jù)上述條件生成舵機(jī)控制命令字符串(僅在需要調(diào)整舵機(jī)的轉(zhuǎn)動(dòng)速度和方向或進(jìn)行衰減延遲

    推薦產(chǎn)品