Robofun 機器人論壇
標題:
請問如何利用joystick控制直流馬達轉動
[打印本頁]
作者:
asd456
時間:
2012-3-3 15:01
標題:
請問如何利用joystick控制直流馬達轉動
由於小弟剛開始接觸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);
}
}
請大大解惑
作者:
trance2000
時間:
2012-3-3 23:05
你要先分出遙桿XYZ的三條線分別插入A0、A1、D3
只要一移動遙桿馬達就會有反應
作者:
mzw2008
時間:
2012-3-4 08:13
哈
這程式感覺有人要整你吧
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);
這段也很怪!!! 是否先給個電路圖看看呢?
作者:
mzw2008
時間:
2012-3-4 08:16
咦! 剛剛看是joystick ..這個我就沒玩過
那上面回的第一項就當沒看到吧
我講的是arduino 用的那種可變電阻作的小搖桿
但電動用的搖桿感覺應是一樣的東西才是
電阻應不會有小於0的情況喔
而且...analogread回來的數值也只會界於0~1023, 也不會小於0
作者:
asd456
時間:
2012-3-4 13:20
本帖最後由 asd456 於 2012-3-4 13:22 編輯
看來是我搞錯了電阻值的定義
所以才會出現小於0的判斷
至於第3項我是想當小搖桿沒有動作時
馬達停止轉動
所以才會出現那些程式
我先嘗試看看
謝謝
作者:
mzw2008
時間:
2012-3-4 17:00
一般來說
沒有動作是中點, 值約在400多到六百多附近(理論上應是512附近而已)---> 搖桿用久爛了就這樣
小於400越遠或是大於600越遠, 代表搖的幅度越大
作者:
asd456
時間:
2012-3-7 00:52
瞭解
我量測出來的值大約在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 是我的固定值
不曉得怎麼藉由電阻值轉換改變速度
作者:
純屬路過
時間:
2012-3-9 17:38
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);
}
利用繼電器,前進的速度會隨著搖桿改變
但是能力還不到家,後退時無法順利的隨搖桿變化....
歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/)
Powered by Discuz! X3.2