題:
到達所需位置後通常如何停止伺服?
Bajie
2014-09-07 00:18:52 UTC
view on stackexchange narkive permalink

啟動Arduino時,我沒想到所有內容都必須包含在無限循環中。我以為我可以這樣寫:電動機啟動->電動機停止。但是實際上,我得到的是電動機啟動->電動機停止->電動機啟動-> ...直到永遠。

在將伺服器置於所需位置後,通常要執行哪些操作來使其停止?我是否使用 servo.write(所需位置)使其無法轉動?我要拆下輸出線嗎?

涉及哪些風險?

七 答案:
jdr5ca
2014-09-07 01:50:09 UTC
view on stackexchange narkive permalink

您不會“停止”伺服器。

伺服器始終在運行。在一般意義上,伺服是一個控制迴路,將位置目標作為輸入並施加力以保持在請求的目標。如果要維持目標,則伺服必須正在運行。

伺服電機包含的電子設備可根據需要在內部打開和關閉DC電機,以保持目標位置。如果目標位置與當前位置不匹配,則它將打開電動機,直到兩個位置匹配為止。一旦輸出軸達到您的要求,伺服電動機內部的電子裝置將電動機“關閉”。熄滅表示直流電動機消耗的電流很小或沒有。伺服控制環始終在運行,將軸位置與目標位置進行比較。

如果關閉整個伺服電機的電源,則該位置不受控制,並且可能會移動。在許多應用中,如果拔下電線,齒輪和電機會產生足夠的摩擦力而不會轉動。但總的來說,您不依靠摩擦來使事情正常運行。

 我是否使用... Servo.Write(所需位置)來防止其轉動? 

是。要告訴伺服器停留在一個位置,您可以繼續向其發送相同的目標。

但是您不必一次又一次地寫()。如果需要,您可以跟踪上一個設置,僅在進行更改後才應用。例如,您可以這樣編寫代碼:

  if(position_target!= position_last_set){Servo.Write(position_target); position_last_set = position_target;}  

不管您使用什麼代碼,Servo都會不斷地將位置目標傳遞給伺服電機。

當向輸出軸施加旋轉負載時,伺服器可能會使用大量電流來嘗試保持位置。
BrettAM
2014-09-07 00:46:59 UTC
view on stackexchange narkive permalink

普通伺服沒有“執行”功能,僅具有位置控制。也就是說,無論您是永久運行一次還是執行一次 servo.write(90),伺服系統都將轉到90,並繼續主動保持該位置,直到您寫入另一個位置。關閉伺服器的唯一方法是:

  servo.detach();  

對於普通的直流電動機,您需要將其打開然後關閉,然後使用變量或 millis()等在循環中進行某種狀態跟踪以永遠不要再次打開它。

當然,如果您想要僅運行一次,將其放入 setup()(可能在安裝簡單任務的循環中)。

此外,您還可以通過以下方式進入無限循環來模擬結束程序 while(true){} for(;;){}

是的,問題似乎出在與應用程序之間的arduino循環範式不匹配,而不是與伺服器有關的任何特定問題上,解決方案的確可能是通過放置另一個無限循環來捕獲arduino主循環而阻止執行,結束了。或者,在更複雜的系統中,通過監視某些外部條件並響應於此僅執行一次操作序列。
嗯,我看不出有什麼不適合的地方。如果要停止它,則可以選擇上述選項。如果只想做一件簡單的事情然後停下來,為什麼還要麻煩微控制器呢?那怎麼辦呢?電池沒電了嗎?
Kendall Bennett
2016-02-15 10:48:30 UTC
view on stackexchange narkive permalink

myservo.detach(); 是您要尋找的。將其移動到一個位置而不是分離。當您要使用它來控制伺服器並且不像電池那樣繼續讓它通電時,這很好。這是一個例子。

  #include <Servo.h>Servo myservo; //創建伺服對像以控制Servovoid setup(){myservo.attach(9); //將伺服器在針腳9上連接至伺服對象} void loop(){myservo.attach(9); //將伺服器在針腳9上附加至伺服對象延遲(15); myservo.write(1); //根據定標的值delay(1000)設置伺服位置; //等待它到達位置myservo.detach();延遲(1000); myservo.attach(9); //將伺服器在針腳9上附加至伺服對象延遲(15); myservo.write(179); //根據定標的值delay(1000)設置伺服位置; //等待它到達位置myservo.detach(); delay(1000);  
你必須延遲才可以分開嗎?我還沒有做到這一點,也從未遇到過伺服到達位置的問題。因此,我猜想一旦發送了伺服pwm信號,它就會被發送,您可以繼續前進。
Dale Mahalko
2016-06-13 06:26:20 UTC
view on stackexchange narkive permalink

servo 的定義不明確,可以包含許多類型的子組件。如果您想使用電磁馬達實現無動力位置保持,那麼有四個選擇:

  • 高粘度潤滑脂
  • 集塵桶
  • 極高的傳動比
  • 電磁閘瓦/制動帶

編輯:還有其他一些可能性,但這有點像某些電動機的作用設計:

  • 永磁極保持轉矩或製動轉矩
  • 永磁體拖曳轉矩

高粘度潤滑脂和儀錶盤具有相似的功能;提供高靜摩擦力來抵抗運動,然後分裂為運動。 (儀錶盤實質上是帶齒壁容器內部的齒輪,並永久填充有高粘度流體。)

但是,這兩者都會增加電動機負載以及它們變熱時的負荷。它們會變薄,流動並失去保持能力。

高傳動比會增加使電動機反向旋轉所需的扭矩。不過請注意,如果任何齒輪箱都可以使用完全無摩擦的潤滑劑,則沒有任何齒輪減速裝置可以阻止反向旋轉。

因此,這確實類似於濃稠的潤滑脂和儀錶盤,但是齒輪減速裝置僅允許普通稀薄潤滑可產生足夠的靜摩擦力,以防止迴旋。

電磁制動器可讓您主動控制靜摩擦力,並可以保持很高的保持力能力與輸出軸上的間歇負載峰值之間的關係。通常,在斷電的情況下,彈簧會在沒有動力的情況下接合製動器以保持位置。

注意,有兩種不同類型的製動:靜態位置保持和移動機構的減速。

第二種類型都將熱量散發到製動襯塊和摩擦片中,並使摩擦片和摩擦片磨損。如果制動器過熱,則襯塊通常會解體,並且制動器現在將無法保持位置。

除非我們在談論大型機械,否則通常,伺服制動器是簡單的設計,沒有可更換的零件。當制動器失效時,您將整個部件拉下並更換...可能還包括整個伺服電動機和變速箱。

要使電磁制動具有較長的使用壽命,您需要使用一個主動制動裝置來減輕負載。伺服,然後停止運動,然後接合製動器以完成保持位置的工作。

僅將電磁制動器用於無動力靜態負載保持,會看起來像這樣:

  • 給電機加電,獲取當前位置,並開始主動保持位置。
  • 給制動器通電以釋放它
  • 加速並移至新位置
  • 使電動機減速並保持最終位置
  • 從制動器上斷開電源使其接合
  • 關閉電動機電源

電動機被加電並首先進入保持位置,這樣,在釋放制動器和伺服電動機然後激活之間的瞬間,負載不會突然向任一方向滑動。

編輯#1 :針對某些燙髮電磁電動機,即使在斷電的情況下也存在旋轉阻力,這是因為在某些位置,磁體和極靴之間會更加緊密地相互吸引,稱為制動轉矩

此磁極定位就像一個低能量的谷,它需要一點力才能克服磁吸力,並使用外部轉矩沿任一方向移動轉子。

在一些無刷風扇和步進電機中,您會感覺到這種情況,如果您在無動力的情況下旋轉軸,則軸會阻止連續運動,並且似乎存在轉子不想跨越的高阻力點。旋轉時,轉子迅速減速,並可能落入其中一個磁性吸引孔中,從而陷入來回振盪。

可用於在沒有製動器的情況下抵抗外部扭矩,但可以利用如果需要將轉子停止在一個磁阱中,而不是您可能想要的特定位置。但是,如果與齒輪箱結合使用,確切的特定停止位置可能不會太緊要,並且可能有許多孔彼此相鄰,轉子可以在這些孔處停止,從而提供可接受的末端執行器對準。

編輯#2 :永磁體的轉矩是將所有電源線短接在一起的效果。完成此步驟後,旋轉軸所需的力要比步進線圈導線彼此斷開時要大得多。

這是因為在線圈導線都連接在一起的情況下,當轉子旋轉時,它的作用是發電機和電流流過線圈。這種電流產生了所謂的反電動勢(CEMF),它可以抵消永磁體的磁場。

當伺服器不通電時,該CEMF可以提供額外的旋轉阻力。儘管CEMF不會阻止運動,但是當施加間歇性的尖峰試圖移動無動力的伺服器時,它可以幫助抵抗連續運動並提供即時減速。

以上所有對於直線電機伺服器通常也是如此。那些沒有齒輪減速裝置,但可以用厚的油脂潤滑運動車,可以配備一個儀錶盤,並可以保持電磁制動器的位置。

kale
2014-12-23 10:49:34 UTC
view on stackexchange narkive permalink

我有同樣的問題。

我發現只需添加 myservo.write(90); delay(4000); 幫助停止電動機。

  #include <Servo.h>伺服myservo; //創建伺服對象來控制伺服// //在大多數電路板上可以創建十二個伺服對象int pos = 0; //用於存儲伺服位置的變量void setup(){myservo.attach(9); //將伺服器在針腳9上連接至伺服對象} void loop(){myservo.write(180);延遲(8000); ////停止馬達8秒鐘,用於(pos = 180; pos> = 90; pos- = 1)//從180度變為0度{myservo.write(pos); //告訴伺服器在變量'pos'delay(15)中定位//等待15ms,直到伺服到達位置} myservo.write(90);延遲(4000); //停止電機4秒鐘,用於(pos = 90; pos < = 180; pos + = 1)//從0度變為180度{//以1度為步長myservo.write(pos); //告訴伺服器在變量'pos'delay(15)中定位//等待15毫秒,直到伺服器到達位置}}  
我有同樣的問題,我發現只需添加myservo.write(90);延遲(4000); //停止電機4秒鐘,這有助於停止電機
JRobert
2014-12-23 20:25:22 UTC
view on stackexchange narkive permalink

從本質上說,在存在試圖干擾該位置的干擾的情況下,使用伺服器來保持該位置。如果您只需要移動一種不會嘗試(或無法)反向驅動電機的機構,那麼帶有軸編碼器或位置開關的減速電機可以更好地滿足您的應用需求。

業餘伺服器之所以被廣泛使用,是因為它們“便宜”並且可以抽像出問題*並且不受典型負載的干擾*。反作用力正常應用的應用可能無論如何都會使它們過載(某些高性能伺服系統的內部零件在關閉時更容易反作用驅動,即使是大型模型的控制面也是如此)。
@ChrisStratton:我知道業餘愛好的伺服器可以在很多情況下提供塊盒式解決方案,但我的觀點是,伺服器始終處於活動狀態,如果這是不希望的(如問題中所暗示的那樣),則另一種技術可能會有優勢。
不,業餘愛好伺服器並不總是處於活動狀態-如果它不是被動地處於死區(比較器已滿足,從而使電機關閉)或移至另一個新位置,則可能是誤用了。持續的可聽見動作意味著伺服系統有故障(在$ 3類中很常見),聯動裝置綁定或負載過大。
john
2015-12-07 16:34:12 UTC
view on stackexchange narkive permalink

這是關於伺服器的非常簡短的解釋。

您提出的伺服系統類型是無位置開環系統,通常用於精確的運動速度(受控速度)。在這種情況下,環路通常是一個測速發電機,該發電機將一個電壓(與電動機速度成比例)發送到比較器,該比較器將測速發電機的電壓與所需的可調電壓進行比較,然後比較器的輸出調節電動機的速度,從而調節所需的速度速度。這種類型的伺服系統將繼續以恆定速度運行,直到A比較器信號設置為零或B從電機上去除動力(關閉)–另一方面,點對點伺服控制,通常使用一個位置指令,該位置指令由來自編碼器的信號進行驗證,在該點上,伺服將停止,直到從堆棧發出另一個命令(例如,另一個位置位置或駐留命令(等待)或其他)(最常見)做到這一點的方法是使用gcode,它可以完全控制您的伺服系統。如果沒有編碼設備,那麼即使不是不可能的話,精確的伺服位置控制也會非常困難。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...