想在小车上加个2度云台,求指教
我用的是切诺基的4wd小车,现在蓝牙连上后,板子接舵机,就会抖舵,要是蓝牙没连上就没事,若是电压不稳的话,求高人指点舵机单独供电方案,并且列一下所需的元件器材
若不是电压问题,请点一下出路
会不会是蓝牙发的命令问题,试试只发一两次看会不会抖动 Holiday 发表于 2013-12-10 10:12
会不会是蓝牙发的命令问题,试试只发一两次看会不会抖动
蓝牙接收,以前我是loop里面receive然后再delay(2)。现在是delay(15),还是抖动
并且我手机的程序没发送数据过去的时候都在抖啊抖,而且只要手机的蓝牙连上了小车上的蓝牙模块时就开始抖。
我回去试试loop里面不处理蓝牙收到的数据看看是否还会抖动,要是还会抖动就应该是电压或者电流的问题了吧? 不一定,你试试直接用Arduino控制看抖不抖,要是还抖的话大概就是电源的问题了。 Holiday 发表于 2013-12-10 13:58
不一定,你试试直接用Arduino控制看抖不抖,要是还抖的话大概就是电源的问题了。 ...
直接用arduino控制不会抖,但是arduino的是USB供电的 楼主能否贴出程序呢?看看是否是程序接收部分造成舵机抖动? cb269267 发表于 2013-12-10 22:58
直接用arduino控制不会抖,但是arduino的是USB供电的
也许是和6楼说的那样的吧。一般不加负载电源是够的 何处不江南 发表于 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>
cb269267 发表于 2013-12-11 22:35
程序如下,c/c++ 不怎么熟悉,求指教
#include
给楼主一个建议 之后代码用专门的贴代码的方式。。 这样看起来有点坑。。楼主软串口接收口需要设置到中断口,刚看了库文件,需要有中断支持,不知道楼主是什么控制器,应该rx设为10可以 何处不江南 发表于 2013-12-12 11:25
给楼主一个建议 之后代码用专门的贴代码的方式。。 这样看起来有点坑。。楼主软串口接收口需要设置到中 ...
我用的是arduino uno,我想问一下为什么有中断支持就没影响呢?
这样的话是不是我不用软串口就没问题了? cb269267 发表于 2013-12-12 13:26
我用的是arduino uno,我想问一下为什么有中断支持就没影响呢?
这样的话是不是我不用软串口就没问题了? ...
你可以试试 我觉得不用软串口应该就可以了,你的想法是接收一个字符存储一个字符,在下一个周期存储一个字符,我个人觉得可以合并在一个函数里完成,接收了直接存储,以免你一个循环收了2个数据,就会在出错。 何处不江南 发表于 2013-12-12 14:40
你可以试试 我觉得不用软串口应该就可以了,你的想法是接收一个字符存储一个字符,在下一个周期存储一个字 ...
一个一个字符接收这个应该是没问题的,在android端我有队列管理发送的数据,而且这是串口接收数据,数据都是顺序过来的,应该没问题 cb269267 发表于 2013-12-12 19:03
一个一个字符接收这个应该是没问题的,在android端我有队列管理发送的数据,而且这是串口接收数据,数据 ...
哥们你的小车上面带android带arduino!?这么吊?然后android和arduino之间通过软串口驱动的蓝牙通讯!? lauren 发表于 2013-12-12 20:34
哥们你的小车上面带android带arduino!?这么吊?然后android和arduino之间通过软串口驱动的蓝牙通讯!? ...
android和arduino通过蓝牙通信嘛。。手机是拿来遥控的。。:L 何处不江南 发表于 2013-12-12 14:40
你可以试试 我觉得不用软串口应该就可以了,你的想法是接收一个字符存储一个字符,在下一个周期存储一个字 ...
昨天晚上我下班回去之后试了一下,不用软串口,直接接tx和rx就ok了,不知道为甚,哥们能不能给我解释一下原理啊?
改成硬串口之后有一个舵机有的时候还是会抖一下,这个估计是舵机的问题了,有什么好点的9g舵机推荐一下啊? 有单独供电吗 cb269267 发表于 2013-12-13 09:42
昨天晚上我下班回去之后试了一下,不用软串口,直接接tx和rx就ok了,不知道为甚,哥们能不能给我解释一下 ...
有2个可能,一个是软串口占用时间不稳定,可能影响舵机引脚的输出,还有就是你软串口引脚设置有问题不能设置我12是rx 你可以尝试下按照例程设置,看看是否还会抖动?
页:
[1]