求高手指点蓝牙控制?
本帖最后由 wsy0315 于 2013-2-24 17:43 编辑上个代码,这代码不能用,搜集了好久资料,可还是找不到蓝牙发送指令控制arduino动作的头绪。希望大侠能帮助下
先说说我的思路吧,就是制作一台蓝牙遥控的挖掘机,关键是要每个关节都能独立操作和PWM。
代码里所有的控制动做都能实现了,但是就是蓝牙控制实在搞不定!
int val1;
int val2;
int val3;
int val4;
int val5;
int val6;
int val11;
int val22;
int EN1 = 6;
int EN2 = 9;
int EN3 = 11;
int EN4 = 3;
int EN5 = 5;
int EN6 = 10;
void motor(char IN1, char IN2, char EN, char state, int val)
{
pinMode(IN1, OUTPUT);
pinMode(IN2, OUTPUT);
pinMode(EN, OUTPUT);
if(state == 1)
{
analogWrite(EN, val);
digitalWrite(IN1, 0);
digitalWrite(IN2, 1);
}
else if(state == 2)
{
analogWrite(EN, val);
digitalWrite(IN1, 1);
digitalWrite(IN2, 0);
}
else if(state == 0)
{
analogWrite(EN, 0);
digitalWrite(IN1, 0);
digitalWrite(IN2, 0);
}
}
//车轮,小臂,挖斗同一摇杆,按键可以考虑控制车灯。。。
void digital_11()//车轮前进
{
motor(4, 5, 6, 1, val1);//左轮电机
motor(7, 8, 9, 1, val2);//右轮电机
}
void digital_22()//车轮后退
{
motor(4, 5, 6, 2, val1);
motor(7, 8, 9, 2, val2);
}
void digital_31()//小臂前
{
motor(13, 12, 11, 1, val3);//小臂电机
}
void digital_32()//小臂后
{
motor(13, 12, 11, 2, val3);
}
void digital_41()//挖斗伸
{
motor(1, 2, 3, 1, val4);//挖斗电机
}
void digital_42()//挖斗缩
{
motor(1, 2, 3, 2, val4);
}
//旋转,大臂,按键同一摇杆
void digital_51()//旋转左
{
motor(4, 5, 6, 1, val5);//旋转电机
}
void digital_52()//旋转右
{
motor(4, 5, 6, 2, val5);
}
void digital_61()//大臂升
{
motor(4, 5, 6, 1, val6);//大臂电机
}
void digital_62()//大臂降
{
motor(4, 5, 6, 2, val6);
}
void setup()
{
Serial.begin(9600);
}
void loop()
{
int key1 = digitalRead(A0);//旋转,大臂的摇杆按键
if (key1 == 1)
{
int val3 = analogRead(A1);
val3 = map(val3, 0, 1023, -255, 255);
if (val3 > 0)//小臂方向转换
digital_31();
else
digital_32();
int val4 = analogRead(A2);
val4 = map(val4, 0, 1023, -255, 255);
if (val4 > 0)//挖斗方向转换
digital_41();
else
digital_42();
analogWrite(EN3, abs(val3));//小臂PWM
analogWrite(EN4, abs(val4));//挖斗PWM
}
else
{
int val11 = analogRead(A1);
val11 = map(val11, 0, 1023, -254, 256);//适配Y轴,应该是255
int val22 = analogRead(A2);
val22 = map(val22, 0, 1023, -249, 261);//适配x轴
val1 = abs(val11) + val22;
val1 = constrain(val1, 0, 255);
val2 = abs(val11) - val22;
val2 = constrain(val2, 0, 255);
if (val11 > 0)//车轮方向转换
digital_11();
else
digital_22();
analogWrite(EN1, val1);//车轮PWM
analogWrite(EN2, val2);
}
int val5 = analogRead(A3);
val5 = map(val5, 0, 1023, -255, 255);
if (val5 > 0)//旋转方向转换
digital_31();
else
digital_32();
int val6 = analogRead(A4);
val6 = map(val6, 0, 1023, -255, 255);
if (val6 > 0)//大臂方向转换
digital_41();
else
digital_42();
analogWrite(EN5, abs(val5));//旋转PWM
analogWrite(EN6, abs(val6));//大臂PWM
if (Serial.available() > 0);
Serial.println("wsy0315");
Serial.println(val3);
Serial.println(val4);
Serial.println("wsy0315");
解决方法见Ansifa 的帖子:Arduino学习笔记A6(补充) - 在串口读取多个字符串,并且转换为数字数组
http://www.geek-workshop.com/thread-260-1-1.html 这点信息量不够判断,首先要排除硬件问题。做一个简单的代码验证蓝牙通讯是否正常。你发的代码对解决问题没什么大的帮助。蓝牙就是一个串口,再软件看来。 yyy_zc 发表于 2013-2-7 10:31 static/image/common/back.gif
这点信息量不够判断,首先要排除硬件问题。做一个简单的代码验证蓝牙通讯是否正常。你发的代码对解决问题没 ...
蓝牙没问题的,用手机蓝牙串口能正常通讯的,这个例子能正常应用的char wordn;
int ledPin = 13;
void setup()
{
pinMode(ledPin,OUTPUT);
Serial.begin(9600);//打开串口并设置波特率为9600bps
}
void loop()
{
if (Serial.available() > 0);//判断串口缓冲器是否有数据输入
{
wordn = Serial.read();//读取串口
Serial.println("wsy0315");//从串口发送字符串
Serial.print("1.");
Serial.println(wordn);//如果Int wordn = 79,串口发送出去的就是string"79" 的ASCII..
Serial.print("2.");
Serial.println(wordn, DEC); //10进制字符串,串口发出去的就是string"79"
Serial.print("3.");
Serial.println(wordn, HEX); //16进制字符串,串口发出去的就是string"4F"
Serial.print("4.");
Serial.println(wordn, OCT); //8进制字符串,串口发出去的就是string"117"
Serial.print("5.");
Serial.println(wordn, BIN); //2进制字符串,串口发出去的就是string"1001111"
if(wordn == 'a')//判断输入字符是否为a
{
Serial.print("6.wordn is "); //ASCII码对应的字符,串口发出去的就是string"O"
Serial.println(wordn);
}
} 第138行:
if (Serial.available() > 0);
这句就是让他什么也不做呀.
是否改为
if (Serial.available() > 0)
{
Serial.println("wsy0315");
Serial.println(val3);
Serial.println(val4);
Serial.println("wsy0315") ;
} 本帖最后由 wsy0315 于 2013-2-7 20:39 编辑
yyy_zc 发表于 2013-2-7 15:51 static/image/common/back.gif
第138行:
if (Serial.available() > 0);
这句就是让他什么也不做呀.
重点不在这里的,重点是我想要让它读取串口数据,然后用串口数据模拟摇杆的控制:L
另外,我的139行:Serial.println("wsy0315");
140. Serial.println(val3);
141. Serial.println(val4);
142. Serial.println("wsy0315");
是当时调试前边的代码时用来监视数据用的,所以写下了! 读取串口数据if (Serial.available() > 0);不就是这句吗
读了,没做动作,其他地方未见有什么兰芽操作。 yyy_zc 发表于 2013-2-7 22:26 static/image/common/back.gif
读取串口数据if (Serial.available() > 0);不就是这句吗
读了,没做动作,其他地方未见有什么兰芽操作 ...
是代码里需要读取四个模拟值和一个数字值,怎么能用串口发送的方式替代那些值?
页:
[1]