啟動Arduino時,我沒想到所有內容都必須包含在無限循環中。我以為我可以這樣寫:電動機啟動->電動機停止。但是實際上,我得到的是電動機啟動->電動機停止->電動機啟動-> ...直到永遠。
在將伺服器置於所需位置後,通常要執行哪些操作來使其停止?我是否使用 servo.write(所需位置)
使其無法轉動?我要拆下輸出線嗎?
涉及哪些風險?
啟動Arduino時,我沒想到所有內容都必須包含在無限循環中。我以為我可以這樣寫:電動機啟動->電動機停止。但是實際上,我得到的是電動機啟動->電動機停止->電動機啟動-> ...直到永遠。
在將伺服器置於所需位置後,通常要執行哪些操作來使其停止?我是否使用 servo.write(所需位置)
使其無法轉動?我要拆下輸出線嗎?
涉及哪些風險?
您不會“停止”伺服器。
伺服器始終在運行。在一般意義上,伺服是一個控制迴路,將位置目標作為輸入並施加力以保持在請求的目標。如果要維持目標,則伺服必須正在運行。
伺服電機包含的電子設備可根據需要在內部打開和關閉DC電機,以保持目標位置。如果目標位置與當前位置不匹配,則它將打開電動機,直到兩個位置匹配為止。一旦輸出軸達到您的要求,伺服電動機內部的電子裝置將電動機“關閉”。熄滅表示直流電動機消耗的電流很小或沒有。伺服控制環始終在運行,將軸位置與目標位置進行比較。
如果關閉整個伺服電機的電源,則該位置不受控制,並且可能會移動。在許多應用中,如果拔下電線,齒輪和電機會產生足夠的摩擦力而不會轉動。但總的來說,您不依靠摩擦來使事情正常運行。
我是否使用... Servo.Write(所需位置)來防止其轉動?
是。要告訴伺服器停留在一個位置,您可以繼續向其發送相同的目標。
但是您不必一次又一次地寫()。如果需要,您可以跟踪上一個設置,僅在進行更改後才應用。例如,您可以這樣編寫代碼:
if(position_target!= position_last_set){Servo.Write(position_target); position_last_set = position_target;}
不管您使用什麼代碼,Servo都會不斷地將位置目標傳遞給伺服電機。
普通伺服沒有“執行”功能,僅具有位置控制。也就是說,無論您是永久運行一次還是執行一次 servo.write(90)
,伺服系統都將轉到90,並繼續主動保持該位置,直到您寫入另一個位置。關閉伺服器的唯一方法是:
servo.detach();
對於普通的直流電動機,您需要將其打開然後關閉,然後使用變量或 millis()
等在循環中進行某種狀態跟踪以永遠不要再次打開它。
當然,如果您想要僅運行一次,將其放入 setup()
(可能在安裝簡單任務的循環中)。
此外,您還可以通過以下方式進入無限循環來模擬結束程序 while(true){}
或 for(;;){}
。
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);
servo 的定義不明確,可以包含許多類型的子組件。如果您想使用電磁馬達實現無動力位置保持,那麼有四個選擇:
編輯:還有其他一些可能性,但這有點像某些電動機的作用設計:
高粘度潤滑脂和儀錶盤具有相似的功能;提供高靜摩擦力來抵抗運動,然後分裂為運動。 (儀錶盤實質上是帶齒壁容器內部的齒輪,並永久填充有高粘度流體。)
但是,這兩者都會增加電動機負載以及它們變熱時的負荷。它們會變薄,流動並失去保持能力。
高傳動比會增加使電動機反向旋轉所需的扭矩。不過請注意,如果任何齒輪箱都可以使用完全無摩擦的潤滑劑,則沒有任何齒輪減速裝置可以阻止反向旋轉。
因此,這確實類似於濃稠的潤滑脂和儀錶盤,但是齒輪減速裝置僅允許普通稀薄潤滑可產生足夠的靜摩擦力,以防止迴旋。
電磁制動器可讓您主動控制靜摩擦力,並可以保持很高的保持力能力與輸出軸上的間歇負載峰值之間的關係。通常,在斷電的情況下,彈簧會在沒有動力的情況下接合製動器以保持位置。
注意,有兩種不同類型的製動:靜態位置保持和移動機構的減速。
第二種類型都將熱量散發到製動襯塊和摩擦片中,並使摩擦片和摩擦片磨損。如果制動器過熱,則襯塊通常會解體,並且制動器現在將無法保持位置。
除非我們在談論大型機械,否則通常,伺服制動器是簡單的設計,沒有可更換的零件。當制動器失效時,您將整個部件拉下並更換...可能還包括整個伺服電動機和變速箱。
要使電磁制動具有較長的使用壽命,您需要使用一個主動制動裝置來減輕負載。伺服,然後停止運動,然後接合製動器以完成保持位置的工作。
僅將電磁制動器用於無動力靜態負載保持,會看起來像這樣:
電動機被加電並首先進入保持位置,這樣,在釋放制動器和伺服電動機然後激活之間的瞬間,負載不會突然向任一方向滑動。
編輯#1 :針對某些燙髮電磁電動機,即使在斷電的情況下也存在旋轉阻力,這是因為在某些位置,磁體和極靴之間會更加緊密地相互吸引,稱為制動轉矩。
此磁極定位就像一個低能量的谷,它需要一點力才能克服磁吸力,並使用外部轉矩沿任一方向移動轉子。
在一些無刷風扇和步進電機中,您會感覺到這種情況,如果您在無動力的情況下旋轉軸,則軸會阻止連續運動,並且似乎存在轉子不想跨越的高阻力點。旋轉時,轉子迅速減速,並可能落入其中一個磁性吸引孔中,從而陷入來回振盪。
可用於在沒有製動器的情況下抵抗外部扭矩,但可以利用如果需要將轉子停止在一個磁阱中,而不是您可能想要的特定位置。但是,如果與齒輪箱結合使用,確切的特定停止位置可能不會太緊要,並且可能有許多孔彼此相鄰,轉子可以在這些孔處停止,從而提供可接受的末端執行器對準。
編輯#2 :永磁體的轉矩是將所有電源線短接在一起的效果。完成此步驟後,旋轉軸所需的力要比步進線圈導線彼此斷開時要大得多。
這是因為在線圈導線都連接在一起的情況下,當轉子旋轉時,它的作用是發電機和電流流過線圈。這種電流產生了所謂的反電動勢(CEMF),它可以抵消永磁體的磁場。
當伺服器不通電時,該CEMF可以提供額外的旋轉阻力。儘管CEMF不會阻止運動,但是當施加間歇性的尖峰試圖移動無動力的伺服器時,它可以幫助抵抗連續運動並提供即時減速。
以上所有對於直線電機伺服器通常也是如此。那些沒有齒輪減速裝置,但可以用厚的油脂潤滑運動車,可以配備一個儀錶盤,並可以保持電磁制動器的位置。
我有同樣的問題。
我發現只需添加 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毫秒,直到伺服器到達位置}}
從本質上說,在存在試圖干擾該位置的干擾的情況下,使用伺服器來保持該位置。如果您只需要移動一種不會嘗試(或無法)反向驅動電機的機構,那麼帶有軸編碼器或位置開關的減速電機可以更好地滿足您的應用需求。
這是關於伺服器的非常簡短的解釋。
您提出的伺服系統類型是無位置開環系統,通常用於精確的運動速度(受控速度)。在這種情況下,環路通常是一個測速發電機,該發電機將一個電壓(與電動機速度成比例)發送到比較器,該比較器將測速發電機的電壓與所需的可調電壓進行比較,然後比較器的輸出調節電動機的速度,從而調節所需的速度速度。這種類型的伺服系統將繼續以恆定速度運行,直到A比較器信號設置為零或B從電機上去除動力(關閉)–另一方面,點對點伺服控制,通常使用一個位置指令,該位置指令由來自編碼器的信號進行驗證,在該點上,伺服將停止,直到從堆棧發出另一個命令(例如,另一個位置位置或駐留命令(等待)或其他)(最常見)做到這一點的方法是使用gcode,它可以完全控制您的伺服系統。如果沒有編碼設備,那麼即使不是不可能的話,精確的伺服位置控制也會非常困難。