cb269267 发表于 2013-12-10 01:01:26

想在小车上加个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++ 不怎么熟悉,求指教

#include <Servo.h>
#include <SoftwareSerial.h>

#include "stdlib.h"
#define ByteBufferLenght 64

int E1 = 5;   //M1 Speed Control
int E2 = 6;   //M2 Speed Control
int M1 = 4;   //M1 Direction Control
int M2 = 7;   //M1 Direction Control

int gearPin1 = 9;
int gearPin2 = 11;

Servo servo1;
Servo servo2;

char ack = 'z';
char flagServo1 = 'm';
char flagServo2 = 'n';
int bufferCount;
char dataBuffer;

boolean isInControl = true;
boolean isStopped = true;
String carStop = "stop";

SoftwareSerial mySerial(12,10);

void setup() {
// put your setup code here, to run once:
int i;
for(i=4;i<=7;i++){
    pinMode(i, OUTPUT);
}
digitalWrite(E1,LOW);   
digitalWrite(E2,LOW);

pinMode(12, INPUT);
pinMode(10, OUTPUT);
pinMode(gearPin1, OUTPUT);
pinMode(gearPin2, OUTPUT);

servo1.attach(gearPin1);
servo2.attach(gearPin2);

//set baud rate
Serial.begin(38400);
mySerial.begin(9600);
}

void loop() {
// put your main code here, to run repeatedly:
receiveData();
delay(15);
}

void receiveData(){
char lastByte;
if(mySerial.available()>0){
    lastByte = mySerial.read();
//    if(lastByte>'z' || lastByte<'0'){
//      return;
//    }
//    Serial.print(lastByte);
    if(lastByte == ack){
//      Serial.println();
      processCommand();
    }
    else if(bufferCount < ByteBufferLenght){
      dataBuffer = lastByte;
      bufferCount++;
    }
}
}

void processCommand(){
//processCommand
char flag = dataBuffer;
if(flag == 'c'){
    String command = getString();
    handleControlCommand(command);
}
else if(flag == 'l'){
    isStopped = false;
    int leftSpeed = getInt();
    left(leftSpeed);
//    Serial.print("l");
//    Serial.println(leftSpeed);
}
else if(flag == 'r'){
    isStopped = false;
    int rightSpeed = getInt();
    right(rightSpeed);
//    Serial.print("r");
//    Serial.println(rightSpeed);
}
else if(flag == flagServo1){
    int servo1Angle = getInt();
    Serial.print(flag);
    Serial.println(servo1Angle);
    servo1.write(servo1Angle);
    delay(15);
}
else if(flag == flagServo2){
    int servo2Angle = getInt();
    Serial.print(flag);
    Serial.println(servo2Angle);
    servo2.write(servo2Angle);
    delay(15);
}
reset();
}

int getInt()
{
char b;
for(int a = 1;a < bufferCount;a++){
    b = dataBuffer;
}

//b = '\0';
return atoi(b);
}

String getString(){
String total;
for(int a = 1;a < bufferCount;a++){
    total += String(dataBuffer);
}
return total;
}

void reset(){
for(int i = 0; i < ByteBufferLenght; i++){
    dataBuffer<i> = 0;
}
bufferCount = 0;
}

//when receive 'l' flag data, this function will be call
void left(int leftSpeed){
if(isInControl){
    //control left wheels
    if(leftSpeed > 0){
      //left wheels go forward
      analogWrite(E2,leftSpeed);
      digitalWrite(M2,HIGH);
    }
    else if(leftSpeed < 0){
      //left wheels go back
      analogWrite(E2,-leftSpeed);
      digitalWrite(M2,LOW);
    }
    else{
      //stop
      digitalWrite(E2,LOW);
    }
}
}

//when receive 'r' flag data, this function will be call
void right(int rightSpeed){
if(isInControl){
    //control right wheels
    if(rightSpeed > 0){
      //right wheels go forward
      analogWrite(E1,rightSpeed);
      digitalWrite(M1,HIGH);
    }
    else if(rightSpeed < 0){
      //right wheels go back
      analogWrite(E1,-rightSpeed);
      digitalWrite(M1,LOW);
    }
    else{
      //stop
      digitalWrite(E1,LOW);
    }
}
}

void handleControlCommand(String command){
if(command == carStop && !isStopped){
    Serial.println("--hasStop--");
//    analogWrite(E1,0);
//    analogWrite(E2,0);
    isStopped = true;
    digitalWrite(E1,LOW);   
    digitalWrite(E2,LOW);
}
}</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 你可以尝试下按照例程设置,看看是否还会抖动?
页: [1]
查看完整版本: 想在小车上加个2度云台,求指教