风筝
发表于: 2018-5-2 15:53:50 | 显示全部楼层

在机器人中使用伺服电机进行精确控制很常见。在本文中,我们将向您展示如何使用Arduino UNO开发板无线连接一个伺服电机,并且通过蓝牙连接一台Android设备。我们已经介绍过如何使用Arduino开发板控制伺服电机,这次我们使用无线蓝牙模块HC-06控制伺服电机。


所需的材料

●    Arduino UNO开发板

●    HC-05或HC-06蓝牙模块

●    伺服电机

●    Playstore的Roboremo App

●    面包板

●    连接导线


HC-06蓝牙模块

蓝牙可以运行在以下两种模式:

1.    AT指令设置模式

2.    工作模式


在AT指令设置模式下,我们可以配置蓝牙属性,如蓝牙信号的名称、密码、运行波特率等。工作模式是我们可以在PIC单片机和蓝牙模块之间发送和接收数据的一种模式。因此,在本教程中,我们将仅使用工作模式进行测试。AT指令设置模式保留为默认设置。设备名称将是HC-05,密码将为0000或1234,最重要的是所有蓝牙模块的默认波特率为9600。

Bluetooth-Module-HC-05.jpg


该模块工作在5V电源,信号引脚工作在3.3V,所以模块内部安装有一个3.3V稳压器。因此我们不必担心。在六个引脚中工作模式只使用了四个引脚。引脚连接表如下所示

序号
HC-05模块的引脚
MCU的引脚
PIC的引脚
1
Vcc
Vdd
第31脚
2
Gnd
Gnd
第32脚
3
Tx
RC6 / Tx / CK
第25脚
4
Rx
RC7 / Rx / DT
第26脚
5
State
NC
NC
6
EN(Enable)
NC
NC

电路原理图

使用Arduino开发板蓝牙控制伺服电机的电路图:

Bluetooth-Controlled-Servo-Motor-Circuit-diagram-using-Arduino.png


配置Roboremo App以控制伺服电机

第1步: 从Android Play商店下载Roboremo应用程序并将其安装到您的智能手机中。安装完成后,您将看到如下图左侧所示的应用程序窗口,然后点击“Menu”按钮,您将看到如下图右侧所示的窗口:

Roboremo-App-first-page-01.png


第2步: 然后点击“connect”按钮,你会看到如下图3所示的窗口,然后你需要选择'Bluetooth RFCOMM',然后你就可以将HC-06蓝牙模块连接到Android应用'Roboremo'。

Connect-to-your-HC-06-bluetooth-device.png


第3步: 连接HC-06蓝牙模块后,返回到第2步右侧的窗口,然后点击'edit ui'按照您的需要创建用户界面。


当点击''edit ui"时,您将再次看到图1所示的窗口,然后在屏幕上的任意位置点击屏幕,您将看到如下图所示的应用程序窗口,并选择“Button”以获得一个按钮模板。

Select-button-to-place-on-interface.png


第4步: 选择按钮模板后,您将在屏幕上获得一个按钮进行编辑。您可以调整大小并将结构移动到屏幕的任何位置。现在,为了设置通过蓝牙点击发送的值,需要设置“set press action”,并键入您想要从该特定按钮发送的值。就像我们通过按下Roboremo android应用程序中的'Start'按钮发送'1'来旋转伺服。

Drag-resize-config-option-01.png


第5步: 最终我们设计了一个用户界面来使用智能手机来控制伺服电机。

Final-interface-for-Bluetooth-controlled-servo-motor.png


代码和说明

本文末尾给出了使用蓝牙控制伺服电机的完整Arduino代码。


Arduino自带有伺服电机库,它处理所有PWM相关的事情来旋转伺服,你只需要输入你想旋转的角度,然后使用函数servo1.write(angle)即可;该函数将使伺服电机旋转到所需的角度。

因此,我们首先定义伺服电机库和软件串行库用于定义Rx和Tx引脚。

  1. #include <SoftwareSerial.h>
  2. #include <Servo.h>
复制代码

在下面的代码中,我们正在初始化Arduino的Rx和Tx引脚,为伺服电机和其他事情定义变量。

  1. Servo myServo;
  2. int TxD = 11;
  3. int RxD = 10;
  4. int servoposition;
  5. int servopos;
  6. int new1;
  7. SoftwareSerial bluetooth(TxD, RxD);
复制代码

现在,将所有变量和组件设置为初始阶段。在这里,我们使用Arduino开发板的第9脚连接了伺服电机,并将伺服电机的初始位置设置为0度。串行和蓝牙通信的波特率也设置为9600。

  1. void setup() {
  2.   int pos=0;
  3.   myServo.attach(9);
  4.   myServo.write(0);
  5.   Serial.begin(9600);       // start serial communication at 9600bps
  6.   bluetooth.begin(9600);
  7. }
复制代码

void loop()函数中,Arduino将始终检查输入值,并根据智能手机接收到的值旋转伺服器。所有的值将通过串行通信接收。


如果该值为0,伺服将旋转到0度。同样,如果我们从蓝牙应用程序发送45、90、135和180,则伺服器将分别旋转到45、90、135和180度角。

  1. void loop() {
  2. if (bluetooth.available()){
  3.     String value = bluetooth.readString();
  4.     servoposition = value.toInt();

  5.     if (value.toInt() == 0){
  6.       Serial.println(servoposition);
  7.     myServo.write(0);
  8.       }

  9.       if (value.toInt() == 45){
  10.       Serial.println(servoposition);
  11.     myServo.write(45);
  12.       }

  13.       if (value.toInt() == 90){
  14.       Serial.println(servoposition);
  15.     myServo.write(90);
  16.       }

  17.       if (value.toInt() == 135){
  18.       Serial.println(servoposition);
  19.     myServo.write(135);
  20.       }

  21.       if (value.toInt() == 180){
  22.       Serial.println(servoposition);
  23.     myServo.write(180);
  24.       }
复制代码

如果我们通过按下开始按钮发送值'1',伺服将一直旋转,直到按下停止按钮。在这里我们按下停止按钮时发送'2',Arduino开发板读取后,它将跳出while循环,伺服电机停止旋转。

  1. while(value.toInt()==1){
  2.     if (bluetooth.available())
  3.    {
  4.     value = bluetooth.readString();
  5.     Serial.println(value);

  6.     if (value.toInt()==2)
  7.     {Serial.println("YYY");  break; }
  8.    }
  9.     servopos++;
  10.     delay(30);
  11.     Serial.println(servopos);
  12.     myServo.write(servopos);

  13.     if (servopos ==180 )
  14.     {servopos=0;break;}   
  15.   }   
  16. }
  17. }
复制代码

使用蓝牙的伺服电机控制的工作过程

Bluetooth-Controlled-Servo-Motor-using-Arduino.jpg


在这个项目中,我们使用Android应用程序“Roboremo”来控制伺服电机。在这个应用程序的界面中,我们创建了5个按钮来控制伺服电机,如前所述。每个按钮的功能在下表中给出:

序号 按钮名称 发送值 描述
1
Start
1
该按钮用于开始将伺服从0°旋转到180°。
2
Stop
2
该按钮用于在任何时候停止伺服。
3
0⁰
0
该按钮用于将伺服旋转至0°。
4
90⁰
90
该按钮用于将伺服旋转至90°。
5
180⁰
180
该按钮用于将伺服旋转至180°。

因此,通过在Android应用程序Roboremo上按下这些按钮,数据将通过智能手机的蓝牙发送到HC-06蓝牙模块。Arduino接收来自该HC-06模块的数据,然后根据代码中按钮表示的角度旋转伺服电机。我们也可以编写角度45和135的代码,但由于Roboremo应用程序的限制,只能创建5个按钮,所以我们跳过了这两个按钮。


通过使用这种方式,我们可以使用蓝牙将数据从智能手机发送到Arduino开发板,然后以无线方式控制伺服器。这可以用于许多应用程序,如玩具车、机器人等。


代码

本文使用的完整代码如下所示: main.txt (1.42 KB, 下载次数: 194)

跳转到指定楼层
a1612267926
发表于: 2019-12-24 12:23:05 | 显示全部楼层

为什么连接成功了 伺服电机就动一下就不动了
回复

使用道具 举报

风筝
发表于: 2019-12-24 15:21:37 | 显示全部楼层

a1612267926 发表于 2019-12-24 12:23
为什么连接成功了 伺服电机就动一下就不动了

使用蓝牙发送数字1试试,另外看伺服电机的型号,电流驱动能力
回复

使用道具 举报

小跑的芥子
发表于: 2020-1-1 21:18:53 | 显示全部楼层

风筝 发表于 2019-12-24 15:21
使用蓝牙发送数字1试试,另外看伺服电机的型号,电流驱动能力

楼主有wifi+arduino uno板子六个舵机的智能机械臂程序吗?我怎么搞都搞不好〒_〒
回复

使用道具 举报

小跑的芥子
发表于: 2020-1-1 21:20:46 | 显示全部楼层

小跑的芥子 发表于 2020-1-1 21:18
楼主有wifi+arduino uno板子六个舵机的智能机械臂程序吗?我怎么搞都搞不好〒_〒 ...

#include <IRremote.h>#include <IRremoteTools.h>#include <Servo.h>Servo servo1;Servo servo2;Servo servo3;Servo servo4;Servo servo5;Servo servo6;const byte RECV_PIN=11;const byte SERVO_PIN1=3;const byte SERVO_PIN2=4;const byte SERVO_PIN3=5;const byte SERVO_PIN4=6;const byte SERVO_PIN5=7;const byte SERVO_PIN6=8;boolean sw=false;byte servoPos=90;void duojiSport(Servo servo){  IRrecived();  while(getIRresult()==0xFFA857||getIRresult()==0xFFE01F)  {       switch (getIRresult())       {         case 0xFFA857://VOL+         if (servoPos>10){         servoPos-=10;         servo.write(servoPos);         }         break;         case 0xFFE01F://VOL-         if (servoPos<170){         servoPos+=10;         servo.write(servoPos);         }             break;       }       resumeIRremote();       IRrecived();   }}void setup(){beginIRremote(RECV_PIN);servo1.attach(SERVO_PIN1);servo1.attach(SERVO_PIN2);servo1.attach(SERVO_PIN3);servo1.attach(SERVO_PIN4);servo1.attach(SERVO_PIN5);servo1.attach(SERVO_PIN6);servo1.write(servoPos);servo2.write(servoPos);servo3.write(servoPos);servo4.write(servoPos);servo5.write(servoPos);servo6.write(servoPos);}void loop(){ if (IRrecived()) {   switch (getIRresult())   {     case 0xFF30CF://1     duojiSport(servo1);     break;     case 0xFF18E7://2     duojiSport(servo2);     break;     case 0xFF7A85://3     duojiSport(servo3);     break;     case 0xFF10EF://4     duojiSport(servo4);     break;     case 0xFF38C7://5     duojiSport(servo5);     break;     case 0xFF5AA5://6     duojiSport(servo6);     break;   }   resumeIRremote();  } }
这个不能运动  按键无反应 不知道错在哪里
这个是用红外遥控的  但是没反应!!!完全不知道哪里错了!!
回复

使用道具 举报

小跑的芥子
发表于: 2020-1-1 21:21:53 | 显示全部楼层

风筝 发表于 2019-12-24 15:21
使用蓝牙发送数字1试试,另外看伺服电机的型号,电流驱动能力

楼主 救急啊!!!一直搞不好!!!看楼下!!
回复

使用道具 举报

MASTER1
发表于: 2022-2-14 14:50:28 | 显示全部楼层

风筝 发表于 2019-12-24 15:21
使用蓝牙发送数字1试试,另外看伺服电机的型号,电流驱动能力

您好,楼主给的的软件蓝牙调试软件下载链接打不开呀,您可以下载吗?求分享
回复

使用道具 举报

MASTER1
发表于: 2022-2-14 14:50:52 | 显示全部楼层

小跑的芥子 发表于 2020-1-1 21:21
楼主 救急啊!!!一直搞不好!!!看楼下!!

您好,楼主给的的软件蓝牙调试软件下载链接打不开呀,您可以下载吗?求分享
回复

使用道具 举报

MASTER1
发表于: 2022-2-14 14:51:13 | 显示全部楼层

小跑的芥子 发表于 2020-1-1 21:20
#include #include #include Servo servo1;Servo servo2;Servo servo3;Servo servo4;Servo servo5;Servo  ...

您好,楼主给的的软件蓝牙调试软件下载链接打不开呀,您可以下载吗?求分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 700 | 回复: 1482



手机版|

GMT+8, 2024-4-30 14:47 , Processed in 0.063783 second(s), 6 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表