极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 318|回复: 10

用蓝牙实时模仿人手的机械手

[复制链接]
发表于 7 天前 | 显示全部楼层 |阅读模式
弯曲传感器通过蓝牙HC-05实时模仿人手时,接收的数据跟发送的数据不同,有哪位大神帮忙看看要怎么处理?发送数据用Arduino UNO板
代码如下
  1. int a,b,c,d,e;

  2. void setup() {
  3.   Serial.begin(38400);
  4. }

  5. //本段代码实现功能是读取弯曲传感器数值。
  6. void loop() {
  7.   a=analogRead(A0);           //读取A0端口的传感器的数值,并赋值为a。
  8.   b=analogRead(A1);           //以下均同上。
  9.   c=analogRead(A5);
  10.   d=analogRead(A3);
  11.   e=analogRead(A4);

  12. //本段代码实现功能是由发送端向接收端发送数值的代码。

  13.   Serial.println('<');
  14.   Serial.println(a);
  15.   Serial.println(b);
  16.   Serial.println(c);
  17.   Serial.println(d);
  18.   Serial.println(e);
  19. }

复制代码



接收数据用arduino nano板
代码如下

  1. #include<Servo.h>
  2. Servo s1,s2,s3,s4,s5;                     //舵机
  3. unsigned int val;
  4. int a,b,c,d,e;
  5. int val1,val2,val3,val4,val5;
  6. char ch;
  7. void setup() {
  8. Serial.begin(38400);
  9. s1.attach(6);                           //舵机角度的数值函数
  10. s2.attach(7);
  11. s3.attach(8);
  12. s4.attach(9);
  13. s5.attach(10);
  14. }


  15. void loop() {
  16. if(Serial.available()>0)
  17.   {
  18.     ch=Serial.read();
  19.     if(ch=='<')
  20.     {
  21.        a=Serial.parseInt();
  22.        b=Serial.parseInt();
  23.        c=Serial.parseInt();
  24.        d=Serial.parseInt();
  25.        e=Serial.parseInt();

  26.     }
  27.   }
  28.   Serial.println('<');
  29.   Serial.println(a);
  30.   Serial.println(b);
  31.   Serial.println(c);
  32.   Serial.println(d);
  33.   Serial.println(e);   

  34.    val1 = analogRead(a);            
  35.    val1= map(val1,1024,0, 0, 130);     
  36.    s1.write(val1);   

  37.    val2 = analogRead(b);            
  38.    val2= map(val2, 1024, 0, 0, 130);     
  39.    s2.write(val2);   

  40.    val3 = analogRead(c);            
  41.    val3= map(val3, 1024, 0, 0, 130);     
  42.    s3.write(val3);  

  43.    val4 = analogRead(d);           
  44.    val4= map(val4, 1024, 0, 0, 130);     
  45.    s4.write(val4);  

  46.    val5 = analogRead(e);            
  47.    val5= map(val5, 0, 1024 , 0, 120);   
  48.    s5.write(val5);  
  49.    delay(10);                     

  50. }
复制代码
回复

使用道具 举报

发表于 7 天前 | 显示全部楼层
把发出和收到的内容打印出来啊,不然谁知道你说什么不同
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
本帖最后由 sanri14 于 2018-8-9 20:07 编辑
spirn 发表于 2018-8-9 15:45
把发出和收到的内容打印出来啊,不然谁知道你说什么不同


这是发送的数据

这是发送的数据
                   read.jpg

发送的数据                                   接收的数据

两个数据不同。
蓝牙波特率是:38400,0,0



回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
每个数字之间都加个分隔符
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层
spirn 发表于 2018-8-9 20:17
每个数字之间都加个分隔符


代码怎么写??数据是读取模拟端口电阻变化得到。我是用弯曲传感器实时控制机械手,弯曲度不同,电阻不同,输入的数据就会变化。
回复 支持 反对

使用道具 举报

发表于 7 天前 | 显示全部楼层
sanri14 发表于 2018-8-9 21:27
代码怎么写??数据是读取模拟端口电阻变化得到。我是用弯曲传感器实时控制机械手,弯曲度不同,电阻不 ...

Serial.println('<');
  Serial.println(a);
Serial.println('<');
  Serial.println(b);
Serial.println('<');
  Serial.println(c);
Serial.println('<');
  Serial.println(d);
Serial.println('<');
  Serial.println(e);   
Serial.println('>');

怎么读你自己改代码吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 7 天前 | 显示全部楼层

你好,按你的方法试过了,还是不行,数据还是经常会不一样。
波特率调小后会好一点,但是实时数据还是不能始终保持一致。我查过很多资料,知道是由于传输速度快,导致数据不完整,需要将数据打包才能完整,但是不知道如何打包数据,不知道代码该如何写。
我是新手,刚接触不久,很多基本的都不懂,还望详细指导指导,谢谢
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
sanri14 发表于 2018-8-9 22:49
你好,按你的方法试过了,还是不行,数据还是经常会不一样。
波特率调小后会好一点,但是实时数据还是不 ...

你不要用parseInt, 用Serial.readString()看看读出来的数据和写入是否一样吧。

还有可以试试两边都用 Serial.begin(9600,SERIAL_8E1)初始化。
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
spirn 发表于 2018-8-10 09:53
你不要用parseInt, 用Serial.readString()看看读出来的数据和写入是否一样吧。

还有可以试试两边都用  ...

用Serial.readString(),编译通不过,显示 error: cannot convert 'String' to 'int' in assignment,还需要改其他地方吗?用Serial.read()读取的是ASCII码,所以才用parseInt。
用Serial.begin(9600,SERIAL_8E1)也不行,接收到的是乱码
回复 支持 反对

使用道具 举报

发表于 6 天前 | 显示全部楼层
Serial.begin(9600,SERIAL_8E1) 是增加校验,当然两边都要加,这样可以保证收到的内容没错。

parseInt里面隐藏了太多细节,出错的时候不好估计原因,所以你应该用readString/read之类的办法来取到原始接收到的数据来看是否正确接收了。

readString返回的内容是字符串,你赋值到整数肯定是出错,这样说来代码也不是你自己写的吧,连变量类型都没搞懂,建议先学一下语法,否则你不可能自己进行程序调试的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 6 天前 | 显示全部楼层
spirn 发表于 2018-8-10 11:37
Serial.begin(9600,SERIAL_8E1) 是增加校验,当然两边都要加,这样可以保证收到的内容没错。

parseInt里 ...

是,我是初学者,之前没有编程基础。这段代码是修改别人的,不是我自己写的。前面的变量abcde,还有val1那些也定义为String,但是还是不能通过。能否帮忙修改一下完整的代码?谢谢
回复 支持 反对

使用道具 举报

高级模式  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|联系我们|极客工坊 ( 浙ICP备09023225号 )

GMT+8, 2018-8-16 16:40 , Processed in 0.065189 second(s), 7 queries , File On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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