极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 9006|回复: 6

求高手指点蓝牙控制?

[复制链接]
发表于 2013-2-6 21:30:52 | 显示全部楼层 |阅读模式
本帖最后由 wsy0315 于 2013-2-24 17:43 编辑

上个代码,这代码不能用,搜集了好久资料,可还是找不到蓝牙发送指令控制arduino动作的头绪。希望大侠能帮助下
先说说我的思路吧,就是制作一台蓝牙遥控的挖掘机,关键是要每个关节都能独立操作和PWM。
代码里所有的控制动做都能实现了,但是就是蓝牙控制实在搞不定!

[code]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
回复

使用道具 举报

发表于 2013-2-7 10:31:39 | 显示全部楼层
这点信息量不够判断,首先要排除硬件问题。做一个简单的代码验证蓝牙通讯是否正常。你发的代码对解决问题没什么大的帮助。蓝牙就是一个串口,再软件看来。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-7 12:30:28 | 显示全部楼层
yyy_zc 发表于 2013-2-7 10:31
这点信息量不够判断,首先要排除硬件问题。做一个简单的代码验证蓝牙通讯是否正常。你发的代码对解决问题没 ...

蓝牙没问题的,用手机蓝牙串口能正常通讯的,这个例子能正常应用的
  1. char wordn;
  2. int ledPin = 13;

  3.              void setup()
  4. {
  5.     pinMode(ledPin,OUTPUT);
  6.     Serial.begin(9600);  //打开串口并设置波特率为9600bps
  7. }
  8. void loop()
  9. {
  10.     if (Serial.available() > 0);  //判断串口缓冲器是否有数据输入
  11.     {
  12.         wordn = Serial.read();  //读取串口
  13.         Serial.println("wsy0315");  //从串口发送字符串
  14.         Serial.print("1.");
  15.         Serial.println(wordn);  //如果Int wordn = 79,串口发送出去的就是string"79" 的ASCII..
  16.         Serial.print("2.");
  17.         Serial.println(wordn, DEC); //10进制字符串,串口发出去的就是string"79"
  18.         Serial.print("3.");
  19.         Serial.println(wordn, HEX); //16进制字符串,串口发出去的就是string"4F"
  20.         Serial.print("4.");
  21.         Serial.println(wordn, OCT); //8进制字符串,串口发出去的就是string"117"
  22.         Serial.print("5.");
  23.         Serial.println(wordn, BIN); //2进制字符串,串口发出去的就是string"1001111"
  24.         if(wordn == 'a')  //判断输入字符是否为a
  25.         {
  26.             Serial.print("6.wordn is "); //ASCII码对应的字符,串口发出去的就是string"O"
  27.             Serial.println(wordn);
  28.         }
  29.     }
复制代码
回复 支持 反对

使用道具 举报

发表于 2013-2-7 15:51:09 | 显示全部楼层
第138行:
    if (Serial.available() > 0);
这句就是让他什么也不做呀.
是否改为
     if (Serial.available() > 0)
{     
Serial.println("wsy0315");   
Serial.println(val3);   
Serial.println(val4);   
Serial.println("wsy0315") ;
}
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-7 20:36:01 | 显示全部楼层
本帖最后由 wsy0315 于 2013-2-7 20:39 编辑
yyy_zc 发表于 2013-2-7 15:51
第138行:
    if (Serial.available() > 0);
这句就是让他什么也不做呀.


重点不在这里的,重点是我想要让它读取串口数据,然后用串口数据模拟摇杆的控制
另外,我的139行:Serial.println("wsy0315");

140.     Serial.println(val3);

141.     Serial.println(val4);

142.     Serial.println("wsy0315");

是当时调试前边的代码时用来监视数据用的,所以写下了!
回复 支持 反对

使用道具 举报

发表于 2013-2-7 22:26:50 | 显示全部楼层
读取串口数据  if (Serial.available() > 0);  不就是这句吗
读了,没做动作,其他地方未见有什么兰芽操作。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-2-8 14:09:58 | 显示全部楼层
yyy_zc 发表于 2013-2-7 22:26
读取串口数据  if (Serial.available() > 0);  不就是这句吗
读了,没做动作,其他地方未见有什么兰芽操作 ...

是代码里需要读取四个模拟值和一个数字值,怎么能用串口发送的方式替代那些值?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-24 15:16 , Processed in 0.038577 second(s), 18 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

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