Robofun 機器人論壇

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

請問關於按鈕開關控制馬達

[複製鏈接]
跳轉到指定樓層
1#
發表於 2012-7-27 22:14:51 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
本帖最後由 ray41121 於 2012-7-28 01:01 編輯

我想做一個按鈕開關來控制DC馬達
我利用按鈕加上 H橋來控制
一個按鈕沒問題,但加上第二個問題就來了
燒錄後馬達會照著第一個按鈕的程式碼跑 按按鈕才會停
第二個按鈕完全沒作用 想請問各位高手可以幫忙指點嗎?
我用的是MEGA 2560
這是程式碼:
const int motor1a = 4;
const int motor2a = 3;
const int e12 = 5;

const int motor3a = 8;
const int motor4a = 9;
const int e34 = 10;
long lastDebounceTime = 0;
long debounceDelay = 50;

void setup()
{
  Serial.begin(115200);
  pinMode(2, INPUT);
  pinMode(6, INPUT);
  pinMode(motor1a,OUTPUT);
  pinMode(motor2a,OUTPUT);
  pinMode(e12,OUTPUT);

  pinMode(motor3a,OUTPUT);
  pinMode(motor4a,OUTPUT);
  pinMode(e34,OUTPUT);

  digitalWrite(e12,HIGH);
  digitalWrite(e34,HIGH);
}
void loop()
{
  {
  int switchStatus = digitalRead(2);
  digitalWrite(motor1a, switchStatus);
  digitalWrite(motor3a, switchStatus);
  Serial.println(switchStatus);
  forwar();
  }
  {
  int  switchStatus = digitalRead(6);
  digitalWrite(motor2a, switchStatus);
  digitalWrite(motor4a, switchStatus);
  Serial.println(switchStatus);
  back();
  }
}
void forwar()
{
  digitalWrite(motor1a,HIGH);
  digitalWrite(motor2a,LOW);
  digitalWrite(motor3a,HIGH);
  digitalWrite(motor4a,LOW);
}
void back()
{
  digitalWrite(motor1a,LOW);
  digitalWrite(motor2a,HIGH);
  digitalWrite(motor3a,LOW);
  digitalWrite(motor4a,HIGH);
}
2#
發表於 2012-7-28 19:35:17 | 只看該作者
回復 1# ray41121


你這個程式裡都沒有delay(),
一圈只能執行前幾個指令,
太快了,所以忽略後幾個指令.
3#
 樓主| 發表於 2012-7-28 19:49:15 | 只看該作者
我加delay()在
int switchStatus = digitalRead(2);
  digitalWrite(motor1a, switchStatus);
  digitalWrite(motor3a, switchStatus);
  Serial.println(switchStatus);
  forwar();
  delay();

int  switchStatus = digitalRead(6);
  digitalWrite(motor2a, switchStatus);
  digitalWrite(motor4a, switchStatus);
  Serial.println(switchStatus);
  back();
  delay();

結果變成一直自轉 沒辦法控制
4#
 樓主| 發表於 2012-7-28 19:55:16 | 只看該作者
我之後改成這樣
void loop()
{
  {
  int switchStatus = digitalRead(2);
  digitalWrite(motor1a, switchStatus);
  digitalWrite(motor3a, switchStatus);
  Serial.println(switchStatus);
  forwar();
  }
  {
  int  switchStatus = digitalRead(6);
  digitalWrite(motor2a, switchStatus);
  digitalWrite(motor4a, switchStatus);
  Serial.println(switchStatus);
  back();
  }
  return;
}
改成這樣之後就可以用兩個按鈕控制了
但是轉速變低了  是因為電壓不夠嗎?
5#
發表於 2012-7-28 20:10:43 | 只看該作者
回復 4# ray41121


    delay();
裡面要有數字
delay(10);
延遲10毫秒
6#
發表於 2012-7-28 20:27:45 | 只看該作者
回復 4# ray41121

你這個程式forwar();之後馬上back();
相抵的結果轉速就變低了
7#
發表於 2012-7-28 20:47:04 | 只看該作者
回復 4# ray41121

你在兩個按鈕都沒按的時候,
是要馬達正轉還是反轉?
8#
 樓主| 發表於 2012-7-28 22:22:06 | 只看該作者
我delay()裡面有打數字
那個只是範例
我兩個按鈕都沒按的時候是要靜止的

我打return上去之後是靜止的
但是轉速就變低了
9#
發表於 2012-7-29 04:12:28 | 只看該作者
回復 8# ray41121


    請試試改程式如下,看能不能轉快點:
---------------------------------------------
void setup()
{
  Serial.begin(115200);
  pinMode(2, INPUT);
  pinMode(6, INPUT);
  pinMode(motor1a,OUTPUT);
  pinMode(motor2a,OUTPUT);
  pinMode(e12,OUTPUT);
  pinMode(motor3a,OUTPUT);
  pinMode(motor4a,OUTPUT);
  pinMode(e34,OUTPUT);
  digitalWrite(e12,HIGH);
  digitalWrite(e34,HIGH);
}
void loop()
{
  {
  int switchStatus = digitalRead(2);
  digitalWrite(motor1a, switchStatus);
  digitalWrite(motor3a, switchStatus);
  Serial.println(switchStatus);
if (switchStatus == HIGH)
    {
forwar();
delay(100);
return;
    }
else {
  digitalWrite(motor2a,LOW);
  digitalWrite(motor4a,LOW);
      }
  }
  {
  int  switchStatus = digitalRead(6);
  digitalWrite(motor2a, switchStatus);
  digitalWrite(motor4a, switchStatus);
  Serial.println(switchStatus);
  if (switchStatus == HIGH)
    {
back();
delay(100);
return;
    }
else {
   digitalWrite(motor1a,LOW);
   digitalWrite(motor3a,LOW);
      }
  }
return;
}
void forwar()
{
  digitalWrite(motor1a,HIGH);
  digitalWrite(motor2a,LOW);
  digitalWrite(motor3a,HIGH);
  digitalWrite(motor4a,LOW);
}
void back()
{
  digitalWrite(motor1a,LOW);
  digitalWrite(motor2a,HIGH);
  digitalWrite(motor3a,LOW);
  digitalWrite(motor4a,HIGH);
}
10#
 樓主| 發表於 2012-7-29 13:05:21 | 只看該作者
回復 9# vegewell


我有燒錄了
但是第二顆按鈕沒動作了
11#
發表於 2012-7-29 17:10:48 | 只看該作者
回復 10# ray41121


再試試   改如下:
void loop()
{
  int switchStatus2 = digitalRead(2);
  int switchStatus6 = digitalRead(6);
if (switchStatus2 == HIGH && switchStatus6 == LOW)
    {
     forwar();
     delay(100);
    }
if (switchStatus2 == LOW && switchStatus6 == LOW)
     {
  digitalWrite(motor1a,LOW);
  digitalWrite(motor2a,LOW);
  digitalWrite(motor3a,LOW);
  digitalWrite(motor4a,LOW);
  delay(100);
      }
if (switchStatus6 == HIGH && switchStatus2 == LOW)
       {
    back();
    delay(100);
        }
}
void forwar()
{
  digitalWrite(motor1a,HIGH);
  digitalWrite(motor2a,LOW);
  digitalWrite(motor3a,HIGH);
  digitalWrite(motor4a,LOW);
}
void back()
{
  digitalWrite(motor1a,LOW);
  digitalWrite(motor2a,HIGH);
  digitalWrite(motor3a,LOW);
  digitalWrite(motor4a,HIGH);
}
12#
 樓主| 發表於 2012-7-29 20:36:21 | 只看該作者
回復 11# vegewell


可以了!!
而且原本馬達有蜂鳴的聲音也沒了!

謝謝你
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-6-1 18:19 , Processed in 0.153367 second(s), 8 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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