请教两个Arduino通过HC-05蓝牙模块通信-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 25936|回复: 19

[已解决] 请教两个Arduino通过HC-05蓝牙模块通信

[复制链接]
发表于 2016-9-30 14:02 | 显示全部楼层 |阅读模式
本帖最后由 qshangwu 于 2016-10-6 21:03 编辑

最近准备用两个arduino板子通过蓝牙连接通信。
板子信息:
从板:Arduino Demilanove+HC-05(从机),连接舵机
主板:Arduino Uno+HC-05(主机),连接电位器按钮

连线示意图请见:
无标题.png
主板程序:
  1. int P_pin = 4;//设置电位器信号口为模拟4口
  2. int P_shift;//存储电位器电压
  3. int S_degree;//存储角度信息
  4. void setup() {
  5.   Serial.begin(9600);
  6.   pinMode(P_pin,INPUT);
  7. }

  8. void loop() {
  9.   P_shift = analogRead(P_pin); //读取电位器模拟数值
  10.   S_degree = map(P_shift,0,1023,0,180);//将电位器电压转换成角度
  11.   if(Serial.available()> 0){
  12.     Serial.write(S_degree);//传出角度信息
  13.     delay(50);
  14.   }
  15. }
复制代码


从板代码:
  1. #include <Servo.h>
  2. int S_Pin = 4;//舵机接4号Pin
  3. int T_info;//存储蓝牙传输信息
  4. Servo motor_1;//创建一个舵机类

  5. void setup() {
  6.   Serial.begin(9600);
  7.   pinMode(S_Pin,OUTPUT);
  8.   motor_1.attach(S_Pin);
  9. }

  10. void loop() {
  11.   if(Serial.available()> 0){
  12.     T_info = Serial.read();
  13.     motor_1.write(T_info);
  14.     delay(60);
  15.   }
复制代码



通电之后,两个板子的蓝牙貌似可以建立连接(蓝牙模块指示灯变化),但是无法通过电位器调节舵机,舵机没有反应。不知我的代码写的是否有问题?

 楼主| 发表于 2016-10-6 21:02 | 显示全部楼层
本帖最后由 qshangwu 于 2016-10-7 18:11 编辑

问题解决,更新了一下代码。
主板程序:

  1. #include <SoftwareSerial.h>
  2. SoftwareSerial BlueTooth(8,9);//创建虚拟串口,Pin8 Rx,Pin9 Tx
  3. int P_Switch_info_1;//存储电位器T1时电压信息
  4. int P_Switch_info_2;//存储电位器T2时电压信息
  5. int P_ave;//将T1/T2电压信息取平均值,避免电压过频波动
  6. int M_angle; //存储舵机角度信息,并通过蓝牙传出

  7. void setup() {
  8.   Serial.begin(9600);
  9.   BlueTooth.begin(9600);
  10.   P_Switch_info_1 = 0;
  11.   P_Switch_info_2 =0;
  12. }

  13. void loop() {
  14.   P_Switch_info_1 = analogRead(A4);//读取A4处电位器T1时电压值
  15.   delay(50);
  16.   P_Switch_info_2 = analogRead(A4);//读取A4处电位器T2(T1+50ms)时电压值
  17.   P_ave = int((P_Switch_info_1 + P_Switch_info_2)/2);//取电压平均值
  18.   M_angle = map(P_ave,0,1023,0,180);//将电压值换算为角度值
  19.   delay(50);
  20.   BlueTooth.write(byte(M_angle));//通过蓝牙传出角度字符,注意此处必须要设置传出数据为byte,否则接受时会因ASIC变为乱码

  21. }

复制代码


从板代码

  1. #include <SoftwareSerial.h>
  2. #include <Servo.h>
  3. SoftwareSerial BlueTooth(8,9); //接收蓝牙(从机)放到Pin8,9口
  4. Servo Motor; //创建servo实例
  5. int M_angle;//存储从蓝牙接收到的角度信息


  6. void setup() {
  7.   BlueTooth.begin(9600);
  8.   Serial.begin(9600);
  9.   Motor.attach(4); //舵机放到Pin4口
  10.   M_angle = 0;
  11. }

  12. void loop() {
  13.   if (BlueTooth.available() > 0){ //当蓝牙有信息传入时开始接收数据
  14.     M_angle = BlueTooth.read();
  15.     Motor.write(M_angle); //将角度数据写入舵机
  16.     delay(50);
  17.     }

  18.   //delay(50);
  19. }

复制代码


目前可以无线遥控舵机旋转,不过舵机还是有微弱的抖动问题。不过蓝牙传输的问题解决了。
发表于 2016-10-7 10:11 | 显示全部楼层
学习了,蓝牙传输不好弄。HC-05需要分别调节到主/从模式。我就是特别怕弄蓝牙。

舵机抖动是不是其本身原因,我用的9g舵机旋转到一定位置也颤动。是不是舵机位置电位器的接触不良?
发表于 2016-10-7 15:50 | 显示全部楼层
190808149 发表于 2016-10-7 10:11
学习了,蓝牙传输不好弄。HC-05需要分别调节到主/从模式。我就是特别怕弄蓝牙。

舵机抖动是不是其本身原因 ...

9G的模拟舵机我用了几个接近极限角度的时候基本都抖,不知道是不是通病。
 楼主| 发表于 2016-10-7 19:36 | 显示全部楼层
190808149 发表于 2016-10-7 10:11
学习了,蓝牙传输不好弄。HC-05需要分别调节到主/从模式。我就是特别怕弄蓝牙。

舵机抖动是不是其本身原因 ...

同意。我当时特意监控过传过来的信号稳定性,电位器固定后也会有+-1度的波动(可能配件比较便宜吧)。所以特意在代码中加入每隔50ms求电位器均值的片段,不过还是有一定的波动,另外一个思路是将电位器的各位数数据略掉,但这样可能会影响舵机的响应敏感性。这个可能要多试试了。
发表于 2017-1-11 06:56 | 显示全部楼层
楼主我想问下主从是怎么调的不用AT指令嘛,要是一块蓝牙,给多块怎么传?
发表于 2017-5-13 17:32 | 显示全部楼层
为什么照楼主的程序烧进控制板,从蓝牙接收的数据与主蓝牙不一样呢?
发表于 2017-5-13 21:13 | 显示全部楼层
再掘一次坟:为什么用mega2560烧程序却怎么也成功不了?无法接收!
发表于 2017-7-7 20:51 | 显示全部楼层
楼主 我是用两个arduino uno做的。舵机情况和你一样。蓝牙可以连接,但舵机就是没反应,请问你怎么解决的?
 楼主| 发表于 2017-8-17 11:12 | 显示全部楼层
尼古拉 发表于 2017-7-7 20:51
楼主 我是用两个arduino uno做的。舵机情况和你一样。蓝牙可以连接,但舵机就是没反应,请问你怎么解决的? ...

请先确认从板舵机是否有独立供电电源。这个装置当时是用来在车间做项目用的。我用了大概1年时间,主要问题就是舵机启动电源需要稳定,之前我曾用9V电池,几次下来基本舵机就不工作了。后来加了一块锂电池,大概可以供到1A左右的电流,会好很多。

有时,代码是一回事,电路又是另一回事。供参考。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 00:34 , Processed in 0.151076 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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