Arduino的伺服庫:角度,微秒和“可選”命令參數 - 💡 Fix My Ideas

Arduino的伺服庫:角度,微秒和“可選”命令參數

Arduino的伺服庫:角度,微秒和“可選”命令參數


作者: Ethan Holmes, 2019

上週三,我花了大部分時間和下午的部分時間追逐一個異常的信號,事實證明,它並不存在。我不會把這段經歷稱為浪費時間,但這段經歷比我想要的更多地佔用了我的時間。如果您對整個故事感興趣,我在ToolGuyd(示波器,Arduino伺服PWM信號和Wild-Goose Chase)中描述了該帳戶。

結果 - 更好地了解Arduino的伺服庫,我將嘗試與您分享這篇文章。這可能看起來像初學者的東西,但直到上週的複雜化,我已經使用Arduino的伺服庫很多次輕鬆和假設熟練。

Arduino ServoWrite

Arduino的伺服庫可以更輕鬆地控制伺服系統,並且代碼和並發症最少。 Arduino的參考頁面 伺服寫 使用伺服庫的命令提供以下示例代碼:

#包括 伺服myservo; void setup(){myservo.attach(9); myservo.write(90); //將伺服設置為中點} void loop(){}

該示例代碼指示連接到引腳9的伺服器移動到其中心(90°)位置。對於連續旋轉伺服,這將停止伺服的運動。

在實踐中,附加的伺服系統將調整到它們的中心位置,但可能不完全。

90°與1500微秒

大多數常見伺服系統接受1000μs至2000μs的輸入,1500μs對應於中心位置。對於0-180°伺服,這將是90°。

以前,我曾使用伺服庫 writeMicroseconds 命令,它定義了要發送到伺服的確切脈衝寬度。上週三,我的麻煩都開始於我改為使用了 參數為90°的命令。

在理論上,一個 指示伺服調整到90°的命令應發送與a相同的脈衝writeMicroseconds 發送1500μs脈衝的命令。那是, 寫(90)writeMicroseconds(1500) 應該發送1500μs脈衝。但事實證明,這種假設可能導致問題。

我將以下代碼上傳到我的Uno,並用示波器分析信號。

#包括 伺服伺服1;伺服伺服2;伺服伺服3; void setup(){servo1.attach(3); servo2.attach(4); servo3.attach(5,1000,2000); servo1.write(90); //將伺服設置為中點(90°)servo2.writeMicroseconds(1500); servo3.write(90); //將伺服設置為中點(90°)} void loop(){}

以下是引腳3,4和5的輸出從上到下的樣子:

  • 引腳3,發送到90°:1.472 ms
  • 引腳4,發送1500μs脈衝:1.500 ms
  • 引腳5,發送到90°:1.500 ms

使用示波器的內置軟件測量脈衝寬度,但手動測量結果一致。

1472μs和1500μs之間的差異非常小,甚至可能不足以使伺服位置產生差異。這是數字脈衝的屏幕截圖,測量結果顯示在右下方。

但是,它仍然是一個可衡量的差異:

如果你看一下信號servo3,也指示伺服移動到90°位置,你應該看到脈衝寬度是1500μs,與servo2,脈衝指定為1500μs。

命令, 寫(90),對於第一和第三伺服信號是相同的,那麼為什麼一個發送1.472 ms脈衝而另一個發送1.500 ms脈衝?

Arduino ServoAttach

答案在於ServoAttach 命令。 Arduino的參考頁面列出了兩種形式的命令:

servo.attach(pin)servo.attach(pin,min,max)

第一個版本是草圖需要指定用於伺服控制的i / o引腳的最小代碼。第二個包括兩個非常重要的但是可選的 指定草圖的最小和最大脈衝寬度範圍的參數。

在兩者中 連接 命令的參考頁面和伺服庫本身,它清楚地表明默認 最大 設置分別為544和2400μs。

“可選”脈衝寬度限制

如果像我一樣,你習慣使用writeMicroseconds 命令代替那麼你可能沒有太多考慮最小和最大脈衝寬度參數。但是,如果你使用 命令和設置角度和度數的伺服位置,然後考慮在Arduino草圖中明確定義這些參數。

再看一下我的示例代碼,對於第三個伺服信號,I超過了1000和2000μs的默認脈衝寬度限制。這就是第一和第三伺服信號使用相同命令發送不同脈衝的原因。

servo3.attach(5,1000,2000);

除了稍微偏離中心信號的可能性之外,伺服可能無法預測地將脈衝寬度解釋為高於或低於其設計的極限。欠限和超限脈衝也有可能損壞伺服系統。

如果0-180°伺服設計為響應1000-2000μs脈衝,則將1000μs解釋為“0°”,將2000μs解釋為“180°”。但是,默認脈衝寬度限制範圍為544-2400μs, Arduino將發送~1000μs的信號,角度為44°。從1000到2000μs的掃描將僅轉換為伺服臂的~90°擺動而不是整個180°。如果使用微秒而不是以度為單位的角度,或者如果在每個伺服的引腳設置中定義了可選的脈衝寬度下限和上限參數,則可以避免這個和其他潛在問題。

雖然我花了幾個小時試圖破解意外的1.472毫秒信號並弄清楚我的新示波器是否有缺陷,但我感覺有些愚蠢,我覺得我並不是唯一一個將Arduino庫視為理所當然的人。我可能在一段時間後看了一下代碼,但是在使用了一段時間後可預測的結果之後,我只是忘了這不是一個神奇的黑盒子,它讓伺服系統更容易控制。看看圖書館或Arduino的頁面連接 命令會給我帶來一些麻煩,但我也沒想過要這麼做。

下次伺服在新項目中無法預測時,請仔細檢查是否在引腳設置中設置了脈衝寬度限制。它可能就是這麼簡單。

Stuart Deutsch在ToolGuyd上撰寫了更多關於工具和研討會主題的文章。



您可能感興趣

為微控制器設計窗口管理器

為微控制器設計窗口管理器


你的評論

你的評論


Bay Area Maker Faire三週倒計時!

Bay Area Maker Faire三週倒計時!


閃回:LED呼啦圈

閃回:LED呼啦圈






最近的帖子