Robofun 機器人論壇

標題: 藍芽控制伺服馬達 [打印本頁]

作者: f660229    時間: 2017-11-23 23:37
標題: 藍芽控制伺服馬達
我使用藍芽+inventor 2 APP(手機控制)+arduino  控制伺服馬達   我希望能夠按住1個按鈕=>角度慢慢上升&下降 +指定角度    目前可以指定伺服馬達到180度&1度    但現在按住按鈕伺服馬達的角度會=第6行"float ang = 90;"的角度   放開後會回到接近90度的位置    請問一下可以講解是什麼問題嗎?
程式是抓別人的然後小改一下    下面是inventor 2的物件圖&積木圖& arduino程式

inventor 2物件圖
inventor 2積木圖

#include<SoftwareSerial.h>
#include <Servo.h>
Servo myservo;
SoftwareSerial BT (1,0);
char command;
float ang = 90;

void setup()
  {
    BT.begin(38400);
    myservo.attach(9);
    myservo.write(90);

  }
void loop()
{
      if(BT.available()>0)
      {
        Serial.println(command);
        command=BT.read();
        switch(command)   {
         case'A':
                ang =ang + 1;if(ang>180) ang=180;
                myservo.write(ang);
                delay(40);
                break;

        case 'B':
                if(ang>0) ang =ang - 1;
                ang =ang - 1;if(ang<0) ang=0;
                myservo.write(ang);
                delay(40);
                break;
       case'C':
               myservo.write(180);
               break;
       case'D':
               myservo.write(0);         
               break;        
       case'E':
               Serial.println("Stop");
               stop();
               delay(40);
               break;

       case'F':
              Serial.println("Stop");
              stop();
              delay(40);
              break;
       default:
              break;
         
           }
      }   
}

int stop()
{
  myservo.writeMicroseconds(1600);
}
作者: 超新手    時間: 2017-11-24 06:39
你放開後就會送E或F.就會write 1600us(約等於90度)
作者: f660229    時間: 2017-11-24 18:44
本帖最後由 f660229 於 2017-11-30 09:47 編輯

謝謝講解  請問我該怎麼改?
作者: 超新手    時間: 2017-11-24 19:09
在app中, 拿掉鬆開的程式
作者: f660229    時間: 2017-11-24 21:35
本帖最後由 f660229 於 2017-11-24 22:55 編輯

拿掉之後 就變成按下up&down鍵後直接到0度
作者: 超新手    時間: 2017-11-27 08:30
1. 我試過, 沒問題. 不知道你是怎麼改的?
2. 如果你要按"住"時, 角度會慢慢增加或減少
app 就要設一個 timer 和 變數
當up鈕按下時, 把 變數 設為1, timer 看到  變數等於 1, 就固定時間送 A
當up鈕鬆開時, 把 變數 設為0
當down鈕按下時, 把 變數  設為2, timer 看到  變數等於 2, 就固定時間送 B
當down鈕鬆開時, 把 變數設為 0  

作者: f660229    時間: 2017-11-30 09:40
本帖最後由 f660229 於 2017-11-30 11:51 編輯

對不起我是新手看不太懂   
請問應該怎麼設置積木?還是說Arduino的程式需要更改?
謝謝講解
作者: f660229    時間: 2017-11-30 14:01
本帖最後由 f660229 於 2017-11-30 14:07 編輯

這是我改過的積木圖   Arduino有"stop"的部分都刪除了
可是這樣動作出來up&down都變成90度

javascript:;

0000.png (81.65 KB, 下載次數: 585)

0000.png

作者: 超新手    時間: 2017-12-1 08:39
本帖最後由 超新手 於 2017-12-1 09:00 編輯

你的程式雖然有點小問題, 但應不至變成 90度
或許有其他問題

我照你的程式打, 小改了一下
按住不放, 可以由小變大, 或由大變小
注意!!! 我使用的是 UNO,
所以我直接用 Serial 就可以了, 不用 SoftwareSerial
而且我的藍牙是9600bps
(一般預設都是 9600, 你有特別改過藍牙鮑率嗎?)
和你不同,
timer 預設時間 100ms, 預設關閉
所以要按"住" 18 秒才會從 0 到 180 度

  1. #include <Servo.h>
  2. Servo myservo;
  3. char command;
  4. int ang = 90;

  5. void setup()
  6. {
  7.   Serial.begin(9600);
  8.   myservo.attach(9);
  9.   myservo.write(90);

  10. }
  11. void loop()
  12. {
  13.   if (Serial.available() > 0)
  14.   {
  15.     command = Serial.read();
  16.     Serial.println(command);
  17.     switch (command)   {
  18.       case'A':
  19.         ang = ang + 1; if (ang > 180) ang = 180;
  20.         myservo.write(ang);
  21.         delay(40);
  22.         break;

  23.       case 'B':
  24.         if (ang > 0) ang = ang - 1;
  25.         myservo.write(ang);
  26.         delay(40);
  27.         break;
  28.       case'C':
  29.         ang  = 180;
  30.         myservo.write(180);
  31.         break;
  32.       case'D':
  33.         ang = 0;
  34.         myservo.write(0);
  35.         break;

  36.     }
  37.   }
  38. }
複製代碼


另外, 你說的跳到 90 度
應該不會是說, 先按 0 度(或 180 度), 再按 up 或 down, 就會先跳到 90 度吧?

未命名.jpg (114.59 KB, 下載次數: 623)

未命名.jpg

作者: f660229    時間: 2017-12-6 00:25
本帖最後由 f660229 於 2017-12-6 00:27 編輯

我的也是UNO板   藍芽的鮑率我有改過 因為學校是教我們用38400
跳到90度是指 --> 按住會跑到0度  放開就會跳到接近90度的位置
請問  1.Serial 跟SoftwareSerial的差別在哪裡??
        2.怎麼改上升下降的速度??
        3.可以講解我的積木圖為什麼錯誤嗎??

可以動作了   只是從0度要往上的時候會卡一下
真的很感謝你   
作者: 超新手    時間: 2017-12-6 08:28
1.Serial 跟SoftwareSerial的差別在哪裡??
Serial 是CPU的硬體功能, 完全由硬體負責, 所以讀沒幾行就可搞定
限制就是必須使用固定接腳(如 0, 1)
SoftwareSerial 是用 軟體去模擬, 雖然你用起來和硬體的方式差不多, 但事實
上是前人寫了幾十行的程式去模擬. 好處就是只要是 I/O 腳大致都可以
但鮑率不能太快, 佔用 CPU 時間多
有硬體Serial 可用, 當然就用硬體
2 改ang = ang + 1 (或 ang = ang - 1)
改大一點,  一次加多一點(或減多一點)
但注意不要加(減) 過頭, 要修改一下判斷式的寫法
3. 其實最主要的問題是
要先設 a 的值, 再啟動計時器
否則如果先啟動計時器, 如果此時計時中斷先發生
而 a 又剛好等於 0, 就會先把計時器關掉
就算再設 a 為 1, 也會因為沒計時器中斷
所以也不會繼續執行
其他的話, 就是多餘的程式, 我只是減化而
不過我不覺得會有突然變 90 的問題,
所以我也不確定你的程式是那邊有問題
我也只是把你的程式小改一下而已




作者: f660229    時間: 2017-12-6 22:35
本帖最後由 f660229 於 2017-12-6 22:47 編輯

謝謝你的講解

請問 case 'A'  跟  case 'B'  的程式為什麼不太一樣  

對不起我問題有點多   因為一些原因沒辦法把問題一次提出來
作者: 超新手    時間: 2017-12-7 08:04
一個是用來增加角度
一個是用來減少角度
看你的 APP 就知道了,
按下 up 送出 A
按下 down 送出 B

作者: f660229    時間: 2017-12-7 23:44
case 'A'
ang = ang + 1;
if (ang > 180) ang = 180;

case 'B'
if (ang > 0) ang = ang - 1;

這2個不是類似的嗎?為什麼case 'B要這樣改??


作者: 超新手    時間: 2017-12-8 05:43
本帖最後由 超新手 於 2017-12-8 08:04 編輯

為什麼說"類似"?
case a 執行後,ang 會越變越大。
case b 執行後,ang 會則越來越小

作者: f660229    時間: 2017-12-9 00:34
case 'B' 不能改成這樣嗎??
ang = ang - 1;
if (ang < 0) ang = 0;
作者: 超新手    時間: 2017-12-9 06:44
當然可以,只是速度慢了一點點點點(us級)
作者: f660229    時間: 2017-12-10 21:40
謝謝講解




歡迎光臨 Robofun 機器人論壇 (https://robofun.net/forum/) Powered by Discuz! X3.2