查看完整版本: [arduino] 用類比搖桿控制伺服馬達
頁: [1]

house74321 發表於 2016-6-13 05:59 PM

[arduino] 用類比搖桿控制伺服馬達

#include <Servo.h>
Servo servoX, servoY;
const byte pinX = A0;
const byte pinY = A1;
int valX, posX;
int valY, posY;

void setup()
{
  Serial.begin(9600);
  servoX.attach(8);
  servoY.attach(9);
}

void loop()
{
  valX = analogRead(pinX);
  valY = analogRead(pinY);
  
  posX = map(valX, 0, 1023, 0, 179);
  posY = map(valY, 0, 1023, 0, 179);
  /*  
  for (int xx = 0; xx < 180; xx++) {
    servoX.write(xx);
    delay(15);
  }
  */
  servoX.write(posX);
  servoY.write(posY);
  Serial.print(valX);
  Serial.print(", ");
  Serial.println(valY);
  Serial.println("");
  
  delay(15);                           // waits for the servo to get there
}

小的目前是用這個程式來操作
會動是會動
可是一旦放掉搖桿後伺服馬達也會跟著回到原來的角度
要怎麼改才能變成搖桿放掉後馬達的角度維持放掉那一剎那的角度
(此程式為一類比搖桿模組控制雙伺服馬達)
請各位大大幫幫忙{:34:}

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><div></div>

johnwanz 發表於 2016-6-14 08:47 AM

你直接用搖桿絕對位置之數據來驅動的話, 向上, 恢復(下), 都會造成實際作用.

要每次僅有單向驅動, 你在輸入上需要進行處理, 用以確認, 搖桿處於移動操作, 還是恢復行為.
1. 初始的延遲處理, 用以確認是手動執行移動操作; 若短時間的, 快速變化/恢復初始位置, 則是恢復行為.
2. 因為改成單向驅動的操作, 所以原本馬達與搖桿絕對數值正相關, 已經不適用, 馬達驅動量要改成依照(變化量)來驅動. 如此才不至於搖桿恢復時, 馬達也跟著恢復. 至於變化量與位置的控制邏輯, 得自己在想一想要做成什麼樣子.

這是我目前所想到的, 你可以自己再考慮看看....<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

house74321 發表於 2016-6-14 07:44 PM

johnwanz 發表於 2016-6-14 08:47 AM static/image/common/back.gif
你直接用搖桿絕對位置之數據來驅動的話, 向上, 恢復(下), 都會造成實際作用.

要每次僅有單向驅動, 你在輸 ...

那個...
由於目前還只是個arduino新手
對於程式方面不甚了解
原理方面根據大大的說法是大概了解
但實在不知道要從何著手
能不能請大大告訴小的具體方面要怎麼改{:1_newburn:}...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

西岸的来打酱油 發表於 2016-6-15 04:02 AM

不知是否可以接受【按一下搖杆使伺服馬達保持】這種做法?
搖杆模組有一個SW引腳,按下搖杆將使SW電平變化,實際上是一個按鈕(button)。
因此你可以在程序中設置一個標志位bool bt = 0,搖杆每按下一次,bt反轉:bt = !bt;
再用if(bt == 0)來判斷是否讓馬達繼續跟隨搖杆動作。
這樣,在使用的時候,先把搖杆移動到目標位置,伺服馬達(大陸稱為“舵機”)也移動到目標位置,這時按一下搖杆,馬達就不再移動了,任由搖杆恢復。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

house74321 發表於 2016-6-15 08:55 PM

西岸的來打醬油 發表於 2016-6-15 04:02 AM static/image/common/back.gif
不知是否可以接受【按一下搖杆使伺服馬達保持】這種做法?
搖杆模組有一個SW引腳,按下搖杆將使SW電平變化 ...

謝謝大大詳細的解說{:31:}
這是我第一次看得懂程式的意思{:4:}
不過想請教一下
在使if(bt==0)後valX、valY要怎麼形容才能達到 維持目前讀取狀態而無動作 的指令
如果等於0的話就會回到原位變成bt是一個清除的功能
但如果是用analogRead就會沒有差別{:36:}...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div><br><br><br><br><br><div></div>

西岸的来打酱油 發表於 2016-6-16 01:17 AM

house74321 發表於 2016-6-15 08:55 PM static/image/common/back.gif
謝謝大大詳細的解說
這是我第一次看得懂程式的意思
不過想請教一下


bt == 0的時候,analogpin的電壓數據錄入valX,valY。
bt == 1的時候,valX,valY不再改變就行了。

補充內容 (2016-6-16 01:18 AM):
也就是bt == 1的時候不對valX,valY進行任何操作。...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

house74321 發表於 2016-6-17 09:54 PM

西岸的來打醬油 發表於 2016-6-16 01:17 AM static/image/common/back.gif
bt == 0的時候,analogpin的電壓數據錄入valX,valY。
bt == 1的時候,valX,valY不再改變就行了。


可是這樣的話bt就必須一直按著vax,yl才會讀取pinx,y吧@@

西岸的来打酱油 發表於 2016-6-18 06:17 AM

本帖最後由 西岸的来打酱油 於 2016-6-18 06:25 AM 編輯

house74321 發表於 2016-6-17 09:54 PM static/image/common/back.gif
可是這樣的話bt就必須一直按著vax,yl才會讀取pinx,y吧@@
不需要你可以按照示例里面button的方法讀取SW,然后修改bt的值。
這個功能的參考代碼:
假設SW連到D2引腳#define SW 2
bool bt = 0;
setup(){
     pinMode(SW,INPUT);
}
loop(){
    if(digitalRead(SW)==0){
        delay(5);
        if(digitalRead(SW)==0){
             dt = !dt ;
             while(digitalRead(SW)==0);
        }
    }
}每按一次,改變一次bt的值。




補充內容 (2016-6-18 06:18 AM):
只能顯示13行代碼嗎。。。。。

...<div class='locked'><em>瀏覽完整內容,請先 <a href='member.php?mod=register'>註冊</a> 或 <a href='javascript:;' onclick="lsSubmit()">登入會員</a></em></div>

jny00000 發表於 2018-2-18 06:00 PM

有一個問題喔!
我的伺服馬達都會莫名其妙地抖動,是什麼原因啊?
頁: [1]