著作權歸作者所有。 商業轉載請聯繫作者獲得授權,非商業轉載請注明出處。 作者:科長 連結:http://zhuanlan.zhihu.com/makeblock/20271053 來源:知乎 《正交編碼器的原理與實現》一文中,介紹了正交編碼器的原理和資料讀取方法,本文將以 mBot 為基礎,製作一個正交編碼器,實現對 mBot 的測速。 mBot 中帶有一個紅外線巡線感測器,可以加裝少量零件,將巡線感測器安裝在輪子側面,並在輪子側面貼上黑白相間的卡紙,實現一個簡易的正交編碼器。測量 mBot 輪子的直徑約為58cm。 用畫圖軟體畫出一個 24 等分圓,並間隔上色。 將直徑調整為 58mm,列印出來,貼到 mBot 輪子的側面,並將 mBot 上的巡線感測器安裝到側面。然後裝上一個數碼管模組,用來顯示計數值。 mBlock 軟體根據上圖自動生成的 Arduino 代碼如下: #include <Arduino.h> #include <Wire.h> #include <Servo.h> #include <SoftwareSerial.h> #include "mBot.h" #include "MePort.h" MeBoard myBoard(mBot); #include "Me7SegmentDisplay.h" double angle_rad = PI / 180.0; double angle_deg = 180.0 / PI; double position; double newState; double tempState; double oldState; MePort linefollower_1(1); Me7SegmentDisplay seg7_2(2); void setup() { position = 0; } void loop() { newState = linefollower_1.dRead1() * 2 + linefollower_1.dRead2(); tempState = ((oldState) * (4)) + (newState); if(((((tempState) == (1))) | (((tempState) == (7)))) | ((((tempState) == (8))) | (((tempState) == (14))))) { position = (position) - (1); } else { if(((((tempState) == (2))) | (((tempState) == (4)))) | ((((tempState) == (11))) | (((tempState) == (13))))) { position = (position) + (1); } else { if((((tempState) == (3))) | (((tempState) == (12)))) { position = (position) - (2); } else { if((((tempState) == (6))) | (((tempState) == (9)))) { position = (position) + (2); } } } } oldState = newState; seg7_2.display((double)position); } 然後將程式燒錄到 mBot 中,就可以觀察這個 DIY 正交編碼器的工作情況了。需要注意的是,某些印表機用的墨粉可能對紅外的吸收不足,需要用馬克筆或水性筆手動補色,以保證巡線感測器可以正常工作。
0 評論
發表回覆。 |