Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 4002|回復: 7
打印 上一主題 下一主題

請問如何利用joystick控制直流馬達轉動

[複製鏈接]
跳轉到指定樓層
1#
發表於 2012-3-3 15:01:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
由於小弟剛開始接觸Arduino
很多程式部分搞不太懂
以下是我參考網路上程式後再經修改
可是明明沒有控制joystick
可是經過驅動板後馬達卻會自己動作
問題不知道出在哪裡

// # Connection:
// #        X-Axis  -> Analog pin 0
// #        Y-Axis  -> Analog pin 1
// #        Z-Axis  -> Digital pin 3
// #
int pwm_a = 3;  
int pwm_b = 11;  
int dir_a = 12;  
int dir_b = 13;
int JoyStick_X = 0;
int JoyStick_Y = 1;
int JoyStick_Z = 3;
void setup()
{
  pinMode(pwm_a, OUTPUT);  
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);
  
  pinMode(JoyStick_X, INPUT);
  pinMode(JoyStick_Y, INPUT);
  pinMode(JoyStick_Z, INPUT);
  Serial.begin(9600);
}

void loop()
{
  int x,y,z;
  x=analogRead(JoyStick_X);
  y=analogRead(JoyStick_Y);
  z=digitalRead(JoyStick_Z);
  
  if(x == 0 || y == 0){
  digitalWrite(dir_a, HIGH);  
  digitalWrite(dir_b, HIGH);  
  delay(1000);
  analogWrite(pwm_a, 0);  
  analogWrite(pwm_b, 0);
  delay(1000);
  }
  if(x >> 0){
  digitalWrite(dir_a, HIGH);
  digitalWrite(dir_b, LOW);  
  delay(1000);
  analogWrite(pwm_a, 255);  
  analogWrite(pwm_b, 0);
  delay(1000);
  }
  if(x << 0){
  digitalWrite(dir_a, LOW);
  digitalWrite(dir_b, HIGH);  
  delay(1000);
  analogWrite(pwm_a, 0);  
  analogWrite(pwm_b, 255);
  delay(1000);
  }
  if(y >> 0){
  digitalWrite(dir_a, HIGH);
  digitalWrite(dir_b, HIGH);  
  delay(1000);
  analogWrite(pwm_a, 255);  
  analogWrite(pwm_b, 255);
  delay(1000);
  }
  if(x << 0){
  digitalWrite(dir_a, LOW);
  digitalWrite(dir_b, LOW);  
  delay(1000);
  analogWrite(pwm_a, 255);  
  analogWrite(pwm_b, 255);
  delay(1000);
  }
}

請大大解惑
2#
發表於 2012-3-3 23:05:13 | 只看該作者
你要先分出遙桿XYZ的三條線分別插入A0、A1、D3
只要一移動遙桿馬達就會有反應
3#
發表於 2012-3-4 08:13:12 | 只看該作者

這程式感覺有人要整你吧
1.  if(x == 0 || y == 0)  , 搖桿一般要扳到很底才會到0, 但要兩個同時到0只有某個神奇的角度能辦到
建議改為  if(x<100 || y <100)

2.if(y >> 0)  
>>  是移位指令耶!!!    > 才是比較子,  所以要改為if(y > 0)

3.
  digitalWrite(dir_a, HIGH);  
  digitalWrite(dir_b, HIGH);  
  delay(1000);
  analogWrite(pwm_a, 0);  
  analogWrite(pwm_b, 0);
  delay(1000);
這段也很怪!!! 是否先給個電路圖看看呢?
4#
發表於 2012-3-4 08:16:52 | 只看該作者
咦! 剛剛看是joystick ..這個我就沒玩過
那上面回的第一項就當沒看到吧
我講的是arduino 用的那種可變電阻作的小搖桿
但電動用的搖桿感覺應是一樣的東西才是
電阻應不會有小於0的情況喔
而且...analogread回來的數值也只會界於0~1023, 也不會小於0
5#
 樓主| 發表於 2012-3-4 13:20:21 | 只看該作者
本帖最後由 asd456 於 2012-3-4 13:22 編輯

看來是我搞錯了電阻值的定義
所以才會出現小於0的判斷
至於第3項我是想當小搖桿沒有動作時
馬達停止轉動
所以才會出現那些程式

我先嘗試看看
謝謝
6#
發表於 2012-3-4 17:00:14 | 只看該作者
一般來說
沒有動作是中點, 值約在400多到六百多附近(理論上應是512附近而已)---> 搖桿用久爛了就這樣
小於400越遠或是大於600越遠, 代表搖的幅度越大
7#
 樓主| 發表於 2012-3-7 00:52:04 | 只看該作者
瞭解
我量測出來的值大約在350左右
順便請問一下如何隨著推動搖桿的角度增加行走速度
因為我是給車子固定值
不曉得如何隨著電組大小改變而改變速度
改一改反而跑得怪怪的

const byte PIN_ANALOG_X = 0;
const byte PIN_ANALOG_Y = 1;

const int X_THRESHOLD_LOW = 330;
const int X_THRESHOLD_HIGH = 370;   

const int Y_THRESHOLD_LOW = 330;
const int Y_THRESHOLD_HIGH = 370;   

int x_position;
int y_position;

int x_direction;
int y_direction;

int pwm_a = 3;  
int pwm_b = 11;  
int dir_a = 12;  
int dir_b = 13;

void setup() {
  Serial.begin(9600);
  pinMode(pwm_a, OUTPUT);  
  pinMode(pwm_b, OUTPUT);
  pinMode(dir_a, OUTPUT);
  pinMode(dir_b, OUTPUT);
}

void loop () {
  x_direction = 0;
  y_direction = 0;

  x_position = analogRead(PIN_ANALOG_X);
  y_position = analogRead(PIN_ANALOG_Y);


  if (x_position > X_THRESHOLD_HIGH) {
    x_direction = 1;
   
  } else if (x_position < X_THRESHOLD_LOW) {
    x_direction = -1;
   
  }

  if (y_position > Y_THRESHOLD_HIGH) {
    y_direction = 1;
    digitalWrite(dir_a, HIGH);  
        
  } else if (y_position < Y_THRESHOLD_LOW) {
    y_direction = -1;
   
  }
   

  if (x_direction == -1) {
      if (y_direction == -1) {
        //Serial.println("left-down");
        digitalWrite(dir_a, LOW);  
        digitalWrite(dir_b, LOW);  
        delay(100);
        analogWrite(pwm_a, 50);  
        analogWrite(pwm_b, 255);
        delay(100);
      } else if (y_direction == 0) {
        //Serial.println("left");
        digitalWrite(dir_a, HIGH);  
        digitalWrite(dir_b, HIGH);  
        delay(100);
        analogWrite(pwm_a, 0);  
        analogWrite(pwm_b, 255);
        delay(100);
      } else {
        // y_direction == 1
        //Serial.println("left-up");
        digitalWrite(dir_a, HIGH);  
        digitalWrite(dir_b, HIGH);  
        delay(100);
        analogWrite(pwm_a, 50);  
        analogWrite(pwm_b, 255);
        delay(100);     
      }  
  } else if (x_direction == 0) {
      if (y_direction == -1) {
        //Serial.println("down");
        digitalWrite(dir_a, LOW);  
        digitalWrite(dir_b, LOW);  
        delay(100);
        analogWrite(pwm_a, 255);  
        analogWrite(pwm_b, 255);
        delay(100);
      } else if (y_direction == 0) {
        //Serial.println("centered");
        digitalWrite(dir_a, HIGH);  
        digitalWrite(dir_b, HIGH);  
        delay(100);
        analogWrite(pwm_a, 0);  
        analogWrite(pwm_b, 0);
        delay(100);
      } else {
        // y_direction == 1
        //Serial.println("up");
        digitalWrite(dir_a, HIGH);  
        digitalWrite(dir_b, HIGH);  
        delay(100);
        analogWrite(pwm_a, 255);  
        analogWrite(pwm_b, 255);
        delay(100);      
      }
  } else {
      // x_direction == 1
      if (y_direction == -1) {
        //Serial.println("right-down");
        digitalWrite(dir_a, LOW);  
        digitalWrite(dir_b, LOW);  
        delay(100);
        analogWrite(pwm_a, 255);  
        analogWrite(pwm_b, 50);
        delay(100);
      } else if (y_direction == 0) {
        //Serial.println("right");
        digitalWrite(dir_a, HIGH);  
        digitalWrite(dir_b, HIGH);  
        delay(100);
        analogWrite(pwm_a, 255);  
        analogWrite(pwm_b, 0);
        delay(100);
      } else {
        // y_direction == 1
        //Serial.println("right-up");
        digitalWrite(dir_a, HIGH);  
        digitalWrite(dir_b, HIGH);  
        delay(100);
        analogWrite(pwm_a, 255);  
        analogWrite(pwm_b, 50);
        delay(100);      
      }
  }

這是我改寫的程式
pwm_a  跟 pwm_b 是我的固定值
不曉得怎麼藉由電阻值轉換改變速度
8#
發表於 2012-3-9 17:38:29 | 只看該作者
int JXin = 1;         // MotorPower input

int XMotor_OutPin = 5;   // out
int XMOTAspeed = 4;

int JX_Value = 0;       // print
int XMotor_Value = 0;        

int Xspeed;
int dirX ;

void setup()
{
  Serial.begin(9600);
  pinMode(XMotor_OutPin, OUTPUT);
  pinMode(XMOTAspeed, OUTPUT);

  Xspeed = 0;
  dirX = 1;
}
void MOTORDRIVE(int Xspeed,int Xdir)
{
   analogWrite(XMOTAspeed,Xspeed);
   if(dirX == 0)
   {
   digitalWrite(XMOTAspeed,LOW);
   }
   else
   {
   digitalWrite(XMOTAspeed, HIGH);
   }   
}
void loop()
{
   //讀取滑桿式可變電阻的電壓值  範圍:0 - 1023
  int JX_Value = analogRead(JXin);//依據不同的電壓值-起動馬達的各種動作
  MOTORDRIVE(Xspeed , dirX);
  if( JX_Value < 500 )
   {
    dirX=0;
    XMotor_Value  =80;
   
   }
    if(JX_Value>>511 && JX_Value <=520)
   {
    dirX=1;
    XMotor_Value = 0;
   }
if(JX_Value>=531)
   {
    dirX=1;
    XMotor_Value  = map(JX_Value, 531, 1023, 0, 250);   
   }   
   analogWrite(XMotor_OutPin, XMotor_Value);             // change the analog out value:         
   Serial.print("XMotor = " );               
   Serial.println(XMotor_Value);
}

利用繼電器,前進的速度會隨著搖桿改變
但是能力還不到家,後退時無法順利的隨搖桿變化....
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-5-25 04:27 , Processed in 0.185297 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表