5707浏览
查看: 5707|回复: 16

[已解决] 想在小车上加个2度云台,求指教

[复制链接]
我用的是切诺基的4wd小车,现在蓝牙连上后,板子接舵机,就会抖舵,要是蓝牙没连上就没事,

若是电压不稳的话,求高人指点舵机单独供电方案,并且列一下所需的元件器材

若不是电压问题,请点一下出路

Holiday  初级技匠

发表于 2013-12-10 10:12:24

会不会是蓝牙发的命令问题,试试只发一两次看会不会抖动
回复

使用道具 举报

cb269267  见习技师
 楼主|

发表于 2013-12-10 13:14:25

Holiday 发表于 2013-12-10 10:12
会不会是蓝牙发的命令问题,试试只发一两次看会不会抖动

蓝牙接收,以前我是loop里面receive然后再delay(2)。现在是delay(15),还是抖动
并且我手机的程序没发送数据过去的时候都在抖啊抖,而且只要手机的蓝牙连上了小车上的蓝牙模块时就开始抖。
我回去试试loop里面不处理蓝牙收到的数据看看是否还会抖动,要是还会抖动就应该是电压或者电流的问题了吧?
回复

使用道具 举报

Holiday  初级技匠

发表于 2013-12-10 13:58:05

不一定,你试试直接用Arduino控制看抖不抖,要是还抖的话大概就是电源的问题了。
回复

使用道具 举报

cb269267  见习技师
 楼主|

发表于 2013-12-10 22:58:55

Holiday 发表于 2013-12-10 13:58
不一定,你试试直接用Arduino控制看抖不抖,要是还抖的话大概就是电源的问题了。 ...

直接用arduino控制不会抖,但是arduino的是USB供电的
回复

使用道具 举报

何处不江南  初级技匠

发表于 2013-12-11 10:15:41

楼主能否贴出程序呢?看看是否是程序接收部分造成舵机抖动?
回复

使用道具 举报

Holiday  初级技匠

发表于 2013-12-11 11:58:44

cb269267 发表于 2013-12-10 22:58
直接用arduino控制不会抖,但是arduino的是USB供电的

也许是和6楼说的那样的吧。一般不加负载电源是够的
回复

使用道具 举报

cb269267  见习技师
 楼主|

发表于 2013-12-11 22:35:08

何处不江南 发表于 2013-12-11 10:15
楼主能否贴出程序呢?看看是否是程序接收部分造成舵机抖动?

程序如下,c/c++ 不怎么熟悉,求指教

  1. #include <Servo.h>
  2. #include <SoftwareSerial.h>
  3. #include "stdlib.h"
  4. #define ByteBufferLenght 64
  5. int E1 = 5;     //M1 Speed Control
  6. int E2 = 6;     //M2 Speed Control
  7. int M1 = 4;     //M1 Direction Control
  8. int M2 = 7;     //M1 Direction Control
  9. int gearPin1 = 9;
  10. int gearPin2 = 11;
  11. Servo servo1;
  12. Servo servo2;
  13. char ack = 'z';
  14. char flagServo1 = 'm';
  15. char flagServo2 = 'n';
  16. int bufferCount;
  17. char dataBuffer[ByteBufferLenght];
  18. boolean isInControl = true;
  19. boolean isStopped = true;
  20. String carStop = "stop";
  21. SoftwareSerial mySerial(12,10);
  22. void setup() {
  23.   // put your setup code here, to run once:
  24.   int i;
  25.   for(i=4;i<=7;i++){
  26.     pinMode(i, OUTPUT);
  27.   }
  28.   digitalWrite(E1,LOW);   
  29.   digitalWrite(E2,LOW);
  30.   pinMode(12, INPUT);
  31.   pinMode(10, OUTPUT);
  32.   pinMode(gearPin1, OUTPUT);
  33.   pinMode(gearPin2, OUTPUT);
  34.   
  35.   servo1.attach(gearPin1);
  36.   servo2.attach(gearPin2);
  37.   //set baud rate
  38.   Serial.begin(38400);
  39.   mySerial.begin(9600);
  40. }
  41. void loop() {
  42.   // put your main code here, to run repeatedly:
  43.   receiveData();
  44.   delay(15);
  45. }
  46. void receiveData(){
  47.   char lastByte;
  48.   if(mySerial.available()>0){
  49.     lastByte = mySerial.read();
  50. //    if(lastByte>'z' || lastByte<'0'){
  51. //      return;
  52. //    }
  53. //    Serial.print(lastByte);
  54.     if(lastByte == ack){
  55. //      Serial.println();
  56.       processCommand();
  57.     }
  58.     else if(bufferCount < ByteBufferLenght){
  59.       dataBuffer[bufferCount] = lastByte;
  60.       bufferCount++;
  61.     }
  62.   }
  63. }
  64. void processCommand(){
  65.   //processCommand
  66.   char flag = dataBuffer[0];
  67.   if(flag == 'c'){
  68.     String command = getString();
  69.     handleControlCommand(command);
  70.   }
  71.   else if(flag == 'l'){
  72.     isStopped = false;
  73.     int leftSpeed = getInt();
  74.     left(leftSpeed);
  75. //    Serial.print("l");
  76. //    Serial.println(leftSpeed);
  77.   }
  78.   else if(flag == 'r'){
  79.     isStopped = false;
  80.     int rightSpeed = getInt();
  81.     right(rightSpeed);
  82. //    Serial.print("r");
  83. //    Serial.println(rightSpeed);
  84.   }
  85.   else if(flag == flagServo1){
  86.     int servo1Angle = getInt();
  87.     Serial.print(flag);
  88.     Serial.println(servo1Angle);
  89.     servo1.write(servo1Angle);
  90.     delay(15);
  91.   }
  92.   else if(flag == flagServo2){
  93.     int servo2Angle = getInt();
  94.     Serial.print(flag);
  95.     Serial.println(servo2Angle);
  96.     servo2.write(servo2Angle);
  97.     delay(15);
  98.   }
  99.   reset();
  100. }
  101. int getInt()
  102. {
  103.   char b[bufferCount-1];
  104.   for(int a = 1;a < bufferCount;a++){
  105.     b[a-1] = dataBuffer[a];
  106.   }
  107.   //  b[bufferCount-1] = '\0';
  108.   return atoi(b);
  109. }
  110. String getString(){
  111.   String total;
  112.   for(int a = 1;a < bufferCount;a++){
  113.     total += String(dataBuffer[a]);
  114.   }
  115.   return total;
  116. }
  117. void reset(){
  118.   for(int i = 0; i < ByteBufferLenght; i++){
  119.     dataBuffer<i> = 0;
  120.   }
  121.   bufferCount = 0;
  122. }
  123. //when receive 'l' flag data, this function will be call
  124. void left(int leftSpeed){
  125.   if(isInControl){
  126.     //control left wheels
  127.     if(leftSpeed > 0){
  128.       //left wheels go forward
  129.       analogWrite(E2,leftSpeed);
  130.       digitalWrite(M2,HIGH);
  131.     }
  132.     else if(leftSpeed < 0){
  133.       //left wheels go back
  134.       analogWrite(E2,-leftSpeed);
  135.       digitalWrite(M2,LOW);
  136.     }
  137.     else{
  138.       //stop
  139.       digitalWrite(E2,LOW);
  140.     }
  141.   }
  142. }
  143. //when receive 'r' flag data, this function will be call
  144. void right(int rightSpeed){
  145.   if(isInControl){
  146.     //control right wheels
  147.     if(rightSpeed > 0){
  148.       //right wheels go forward
  149.       analogWrite(E1,rightSpeed);
  150.       digitalWrite(M1,HIGH);
  151.     }
  152.     else if(rightSpeed < 0){
  153.       //right wheels go back
  154.       analogWrite(E1,-rightSpeed);
  155.       digitalWrite(M1,LOW);
  156.     }
  157.     else{
  158.       //stop
  159.       digitalWrite(E1,LOW);
  160.     }
  161.   }
  162. }
  163. void handleControlCommand(String command){
  164.   if(command == carStop && !isStopped){
  165.     Serial.println("--hasStop--");
  166. //    analogWrite(E1,0);
  167. //    analogWrite(E2,0);
  168.     isStopped = true;
  169.     digitalWrite(E1,LOW);   
  170.     digitalWrite(E2,LOW);
  171.   }
  172. }</i>
复制代码

回复

使用道具 举报

何处不江南  初级技匠

发表于 2013-12-12 11:25:56

cb269267 发表于 2013-12-11 22:35
程序如下,c/c++ 不怎么熟悉,求指教

#include

给楼主一个建议 之后代码用专门的贴代码的方式。。 这样看起来有点坑。。  楼主软串口接收口需要设置到中断口,刚看了库文件,需要有中断支持,不知道楼主是什么控制器,应该rx设为10可以
回复

使用道具 举报

cb269267  见习技师
 楼主|

发表于 2013-12-12 13:26:05

何处不江南 发表于 2013-12-12 11:25
给楼主一个建议 之后代码用专门的贴代码的方式。。 这样看起来有点坑。。  楼主软串口接收口需要设置到中 ...

我用的是arduino uno,我想问一下为什么有中断支持就没影响呢?
这样的话是不是我不用软串口就没问题了?
回复

使用道具 举报

何处不江南  初级技匠

发表于 2013-12-12 14:40:50

cb269267 发表于 2013-12-12 13:26
我用的是arduino uno,我想问一下为什么有中断支持就没影响呢?
这样的话是不是我不用软串口就没问题了? ...

你可以试试 我觉得不用软串口应该就可以了,你的想法是接收一个字符存储一个字符,在下一个周期存储一个字符,我个人觉得可以合并在一个函数里完成,接收了直接存储,以免你一个循环收了2个数据,就会在出错。
回复

使用道具 举报

cb269267  见习技师
 楼主|

发表于 2013-12-12 19:03:35

何处不江南 发表于 2013-12-12 14:40
你可以试试 我觉得不用软串口应该就可以了,你的想法是接收一个字符存储一个字符,在下一个周期存储一个字 ...

一个一个字符接收这个应该是没问题的,在android端我有队列管理发送的数据,而且这是串口接收数据,数据都是顺序过来的,应该没问题
回复

使用道具 举报

lauren  高级技师

发表于 2013-12-12 20:34:55

cb269267 发表于 2013-12-12 19:03
一个一个字符接收这个应该是没问题的,在android端我有队列管理发送的数据,而且这是串口接收数据,数据 ...

哥们你的小车上面带android带arduino!?这么吊?然后android和arduino之间通过软串口驱动的蓝牙通讯!?
回复

使用道具 举报

cb269267  见习技师
 楼主|

发表于 2013-12-13 00:14:59

lauren 发表于 2013-12-12 20:34
哥们你的小车上面带android带arduino!?这么吊?然后android和arduino之间通过软串口驱动的蓝牙通讯!? ...

android和arduino通过蓝牙通信嘛。。手机是拿来遥控的。。:L
回复

使用道具 举报

cb269267  见习技师
 楼主|

发表于 2013-12-13 09:42:31

何处不江南 发表于 2013-12-12 14:40
你可以试试 我觉得不用软串口应该就可以了,你的想法是接收一个字符存储一个字符,在下一个周期存储一个字 ...

昨天晚上我下班回去之后试了一下,不用软串口,直接接tx和rx就ok了,不知道为甚,哥们能不能给我解释一下原理啊?
改成硬串口之后有一个舵机有的时候还是会抖一下,这个估计是舵机的问题了,有什么好点的9g舵机推荐一下啊?
回复

使用道具 举报

合乎  初级技匠

发表于 2013-12-13 09:58:35

有单独供电吗
回复

使用道具 举报

何处不江南  初级技匠

发表于 2013-12-13 13:50:12

cb269267 发表于 2013-12-13 09:42
昨天晚上我下班回去之后试了一下,不用软串口,直接接tx和rx就ok了,不知道为甚,哥们能不能给我解释一下 ...

有2个可能,一个是软串口占用时间不稳定,可能影响舵机引脚的输出,还有就是你软串口引脚设置有问题不能设置我12是rx 你可以尝试下按照例程设置,看看是否还会抖动?
回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies |上传

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail