转角 发表于 2014-4-12 00:22:48

无线头追

前段时间就准备做个无线头追想集成到我的遥控汽车上。昨天模块刚到齐,今晚开工了。之前只有一个nano和GY-85姿态传感器,计算姿态的代码已有现成的,我拿来简单修改了一下,把姿态数据通过串口发送出去格式是%数据;数据 数据全部使用的字符串方式发送的。接收端通过串口接收之后解析数据,转化成整形数据,然后控制舵机转动带动摄像头。
先上几张图吧。目前摄像头和图传还没买到,准备先把控制部分做出来再说。


//接收端代码
#include <Servo.h>
#define SERIAL_BAUD 9600
Servo servoPan;
Servo servotill;
char data;
int index,panAngle,tiltAngle;
char *p;
void setup() {
// put your setup code here, to run once:
Serial.begin(SERIAL_BAUD);
servoPan.attach(9);
servotill.attach(10);
}

void loop() {
// put your main code here, to run repeatedly:
memset(data,0,10);
index=0;
p=NULL;
while(Serial.available())
{
    data=Serial.read();
    delay(10);
}

if(data=='%')
    {
      
      p=strtok(data+1,";");
      if(p==NULL)
            return;
            
      panAngle = atoi(p);
      
      p=strtok(NULL,";");
          if(p==NULL)
            return;
         
      tiltAngle = atoi(p);      
      servoPan.write((int)panAngle);
      servotill.write((int)tiltAngle);
    }
}//发送端代码

void loop() {

// Check button
if (digitalRead(BUTTON_INPUT)==0) {
   resetValues = 1;
}


// if "read_sensors" flag is set high, read sensors and update
if (read_sensors == 1) {
   
      updateSensors();
   
      gyroCalc();
      accCalc();
      magCalc();
      filter();   
    }
    Serial.print("%");
    itoa((int)panAngle,tmp,10);
    Serial.print(tmp);
    Serial.print(";");
    itoa((int)tiltAngle,tmp,10);
    Serial.println(tmp);
   
// servoPan.write((int)panAngle);
//servotill.write((int)tiltAngle);

}其中姿态计算的代码我没上传,论坛中相关代码多如牛毛。
中间传输部分我买了一对433无线传输模块,串口的,只管发送和读取即可,对于我们来说相当于用串口线连接起来的。
后续工作待续。。。

转角 发表于 2014-4-12 00:26:34

沙发自己坐。
接收端代码中有个漏洞
while(Serial.available())
{
    data=Serial.read();
    delay(10);
}
如果接收的数据大于10个字节就会崩溃,最好是加个判断,如果index大于9就跳出循环,或者加个结束符遇到结束符就跳出循环

春泥蛋炒饭 发表于 2014-4-12 07:14:13

先请教一下,什么叫头追?

chensg 发表于 2014-4-12 10:56:41

就是云台追踪头部动作,用头部动作控制云台,用于第一视角遥控。

转角 发表于 2014-4-12 16:49:31

@leicheng哪有13个字符?角度最大也就占用3个字符   %180;180   这就是一个数据,加上\0 也只有9个字符啊。
你说的NULL是指字符串结束标志吗?串口发送数据的时候不会发送'\0'这个字符的

转角 发表于 2014-4-12 18:39:56

@leicheng0没有被传输,0的概念只在存储字符串的内存中存在,传输的时候0是不会被传输的,即使有负号也不会超过10个字符的。
举个例子char tmp={'1','2','3','\0','4','5'};
这个tmp,如果使用Serial.print(tmp);   接收的时候只会收到“123”,因为遇到0就结束了不会继续发送了。

yiyp77 发表于 2014-4-12 19:44:05

本帖最后由 yiyp77 于 2014-4-12 19:47 编辑

顶LZ。

顺道发个国外的外源头追:
DIY_Headtracker航模头追中文说明书
http://pan.baidu.com/s/1o6nZnnG

leicheng 发表于 2014-4-12 20:26:17

请问转角,你的433M模块从照片上看,好像只连接了4根线,是模块自带TX,RX接口,还是采用SPI接口的? 程序里直接用serial.print()就能够发送和接收了,有对应的库支持?

转角 发表于 2014-4-12 21:13:04

leicheng 发表于 2014-4-12 20:26 static/image/common/back.gif
请问转角,你的433M模块从照片上看,好像只连接了4根线,是模块自带TX,RX接口,还是采用SPI接口的? 程序里 ...

模块自带tx、rx,程序直接使用串口的发送就行,这个无线433模块对我们来说是透明的

转角 发表于 2014-4-12 21:14:18

yiyp77 发表于 2014-4-12 19:44 static/image/common/back.gif
顶LZ。

顺道发个国外的外源头追:


我看过这个,我的姿态计算的代码就是用的他的。他是用遥控传过数据去,我简单的改了一下,就不需要使用遥控器了

leicheng 发表于 2014-4-24 23:42:21

转角 发表于 2014-4-12 21:14 static/image/common/back.gif
我看过这个,我的姿态计算的代码就是用的他的。他是用遥控传过数据去,我简单的改了一下,就不需要使用遥 ...

做好了吗?期待更新~

blackmerida 发表于 2019-5-22 09:28:47

留个记号,最近正好用到。楼主有联系方式吗?
页: [1]
查看完整版本: 无线头追