wsy0315 发表于 2013-2-6 21:30:52

求高手指点蓝牙控制?

本帖最后由 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:39

这点信息量不够判断,首先要排除硬件问题。做一个简单的代码验证蓝牙通讯是否正常。你发的代码对解决问题没什么大的帮助。蓝牙就是一个串口,再软件看来。

wsy0315 发表于 2013-2-7 12:30:28

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);
      }
    }

yyy_zc 发表于 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") ;
}

wsy0315 发表于 2013-2-7 20:36:01

本帖最后由 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");

是当时调试前边的代码时用来监视数据用的,所以写下了!

yyy_zc 发表于 2013-2-7 22:26:50

读取串口数据if (Serial.available() > 0);不就是这句吗
读了,没做动作,其他地方未见有什么兰芽操作。

wsy0315 发表于 2013-2-8 14:09:58

yyy_zc 发表于 2013-2-7 22:26 static/image/common/back.gif
读取串口数据if (Serial.available() > 0);不就是这句吗
读了,没做动作,其他地方未见有什么兰芽操作 ...

是代码里需要读取四个模拟值和一个数字值,怎么能用串口发送的方式替代那些值?
页: [1]
查看完整版本: 求高手指点蓝牙控制?