5iMX宗旨:分享遥控模型兴趣爱好

5iMX.com 我爱模型 玩家论坛 ——专业遥控模型和无人机玩家论坛(玩模型就上我爱模型,创始于2003年)
查看: 4658|回复: 25
打印 上一主题 下一主题

花 4.8 元买的 315M 模块。用于遥控坦克,验证可行性的视频已上。

[复制链接]
跳转到指定楼层
楼主
发表于 2013-9-25 20:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 skypup 于 2013-11-23 01:10 编辑

用于遥控坦克,验证可行性的视频:


波特率只做到了大约 600bit/s.

地对地,1米多的高度。10米内数据正确无丢包。
10-28米,有少量丢包。
28-70米,丢包严重,出现错误数据。
70-166米,有数据,但有丢包。
超过166米,基本无数据。

有啥办法改善并增加距离呢?










欢迎继续阅读楼主其他信息

沙发
发表于 2013-9-25 21:46 | 只看该作者
干什么的?
3
发表于 2013-9-25 22:21 | 只看该作者
看不懂  不过还是要顶顶~~~~~~~~~
4
发表于 2013-9-25 22:25 | 只看该作者
不懂 有啥用?
5
 楼主| 发表于 2013-9-25 22:40 | 只看该作者
本帖最后由 skypup 于 2013-9-26 17:26 编辑

想花尽可能少的钱。




6
发表于 2013-9-29 22:51 | 只看该作者
一对4.8元.在哪买的.
7
发表于 2013-10-3 19:51 | 只看该作者
试一下功放吧
8
发表于 2013-10-7 17:28 | 只看该作者
换更大功率的发射模块, 更高灵敏度的接收模块,比方说,超外差型的,

发射模块 1KM 的哪种性能和价比还算可以,参考价 5RMB
9
发表于 2013-10-7 17:29 | 只看该作者
单向工作方式
10
发表于 2013-10-7 18:20 | 只看该作者
啥玩意
11
发表于 2013-10-9 23:17 | 只看该作者
最简单的是用增益高一点的发射和接收天线,再深入一点就是制作315频段的高频功率放大器,但高频电路制作要求挺高的,不容易稳定的工作,更深入一点就是提高接收机灵敏度,这个也就更不容易了,所以建议最简单的还是用好一点的匹配的天线试试看看能否满足要求,如果还不行,那可以买个发射功率大一点的315模块,直接解决问题
12
发表于 2013-11-6 10:56 | 只看该作者
你可以买一个1km或3km的315发射器,收接用原来的就行,你应该是用在数传电压上的吧。
13
发表于 2013-11-6 15:09 | 只看该作者
单向发送的,抗干扰很差,放弃吧,你的产品怎么死的都不知道。
14
发表于 2013-11-6 15:26 | 只看该作者
si4432模块淘宝只要12元一个,发射接收1体的,100mw发射功率,底层通讯完全硬件控制包含数据CRC,软件只需要读写缓冲区,不知道lz还研究你那玩意干什么!
15
 楼主| 发表于 2013-11-6 20:30 | 只看该作者
ckyo 发表于 2013-11-6 15:26
si4432模块淘宝只要12元一个,发射接收1体的,100mw发射功率,底层通讯完全硬件控制包含数据CRC,软件只需要 ...

感谢分享!



16
发表于 2013-11-6 21:41 | 只看该作者
路过
17
发表于 2013-11-8 09:21 | 只看该作者
学习了
18
 楼主| 发表于 2013-11-22 00:20 | 只看该作者
发射端代码。STC89C52 单片机。串口接收数据,通过315M模块发送。
发送时,LED1长亮,LED2闪烁。

#include "51Duino.h"
#include "STC315TX.h"

unsigned char nTimes = 0;

void setup()
{
}

unsigned char loop()
{
        unsigned char nFlag;

        LED1 = 1;
        while ((nPointReadPos != nPointWritePos) && (nPointReadPos != ((nPointWritePos - 1 + LEN_SIZE) % LEN_SIZE)))
        {
                LED1 = 0;
                nFlag = cString[nPointReadPos++];
                nPointReadPos %= LEN_SIZE;
                SendByte(nFlag);       
                               
                if (nTimes <= 1 && nTimes >= 0)
                {
                        nTimes ++;
                        LED2 = 1;                                                                                                                 
                }                                                                                                 
                else if (nTimes >= 2 && nTimes <= 3)
                {
                        nTimes ++;
                        LED2 = 0;
                }
                else
                {
                        nTimes = 0;
                        LED2 = 1;
                }
        }
        LED1 = 1;
        LED2 = 1;
       
        return TRUE;
}



19
 楼主| 发表于 2013-11-22 01:24 | 只看该作者
本帖最后由 skypup 于 2013-11-23 07:52 编辑

接收端代码。
通过315M模块接收数据,I1, I2, I3, I4 四个管脚与L298模块连接,控制2个电机正反转。

#include "51Duino.h"

typedef unsigned char BYTE;
typedef unsigned int WORD;

#define uchar unsigned char
#define uint unsigned int

sbit IN = P1^6;//信号输入端口
sbit I1 = P1^0;
sbit I2 = P1^1;
sbit I3 = P1^2;
sbit I4 = P1^3;
sbit LED = P0^1;

void setup()
{
        IN = 1;
}

unsigned char receive(void);
void Run(char tcCommand);

char cTimes = 0;

unsigned char loop()
{
        char cToken, cOldToken;
        
        cToken = receive();

          if (cToken != 0)
        {
                Send(cToken);
        }
        Run(cToken);

        return TRUE;
}

void Run(char tcCommand)
{
        char nHeadLeft, nHeadRight, nSpeedLeft, nSpeedRight;
        char i;
        int j;        

        if (tcCommand == 0)
        {
                I1 = 0;
                I2 = 0;
                I3 = 0;
                I4 = 0;
                return;
        }

        nHeadLeft = (tcCommand >> 7) & 0x01;
        nHeadRight = (tcCommand >> 3) & 0x01;
        nSpeedLeft = (tcCommand >> 4) & 0x07;
        nSpeedRight = tcCommand & 0x07;

        for (i = 0; i < 8; i++)
        {
                // ***
                if (i < nSpeedLeft)
                {
                        if (nHeadLeft == 1)
                        {
                                I1 = 1;
                                I2 = 0;
                        }
                        else
                        {
                                I1 = 0;
                                I2 = 1;
                        }
                }
                else
                {
                        I1 = 0;
                        I2 = 0;
                }
                // 右轮
                if (i < nSpeedRight)
                {
                        if (nHeadRight == 1)
                        {
                                I3 = 1;
                                I4 = 0;
                        }
                        else
                        {
                                I3 = 0;
                                I4 = 1;
                        }
                }
                else
                {
                        I3 = 0;
                        I4 = 0;
                }
                for (j = 1000; j > 0; j--);
        }
}

void delay(unsigned char t)//延时程序
{
        unsigned char n;
        for(; t > 0; t--)
                for(n = 40; n > 0; n--);  
}

/*
接收协议:接收函数先寻找前导命令,探测到前导命令之后进入数据接收模式,
否则返回0(表示接收失败或者没发现可用信号),接受成功之后返回收到的数

*/

unsigned char ReadBit()
{
        unsigned char i = 0;
        
        if (IN == 1) i++;
        if (IN == 1) i++;
        if (IN == 1) i++;

  return i >= 2 ? 1 : 0;
}

unsigned char receive(void)//接收处理函数
{
        unsigned char guid = 0, result[16], i, key = 0, res = 0, t, time = 0;
        
        while(1)//捕获前导命令
        {
                while(ReadBit() == 1)
                {
                        t++;
                        if(t >= 27)
                        {
                                delay(100);
                                return 0;
                        }
                }//防止错误数据导致的死循环
        
                if(t >= 18 && t < 26) // 典型值: 19-21
                {
//                        NumericSendString("\r\n\r\nt = ", t);
                        key++;
                        time = 0;
                        if(key > 3)
                                break;
                }        //获得前导命令跳出循环,清除计时信号
                else if(time > 100)
                {
                        delay(100);
                        LED = !LED;
                        return 0;
                }        //长0,错误信号返回0
                else
                {
                        t = 0;
                        time++;
                }//计时垒加,清除t                 
        }  
        
        t = 0;
        time = 0;
        for(i = 1; i <= 16; )
        {
                while(ReadBit() == 1)
                {
                        t++;
                        if(t >= 27)
                        {
                                delay(100);
                                return 0;
                        }
                }//防止错误数据导致的死循环
        
                if(t >= 18 && t < 26)
                {                                
//                        NumericSendString("\r\nt = ", t);
                        t = 0;
                        i = 1;
                        time = 0;
                }//去除多余的前导命令
                else if(t >= 7 && t < 17) // 典型值: 11-14
                {                                                
//                        NumericSendString("\r\nt = ", t);
                        result[i - 1] = 1;
                        i++;
                        time = 0;
                }//捕获数据1
                else if(t > 0 && t < 7)                // 典型值: 1-6
                {                                                
//                        NumericSendString("\r\nt = ", t);
                        result[i - 1] = 0;
                        i++;
                        time = 0;
                }//捕获数据0
                if(time > 100)
                        return 0; //消除长0的干扰确保数据正确
                t = 0;   //清零
                time++;//计时               
        }
        if(((result[0] + result[8]) == 1) &&
                ((result[1] + result[9]) == 1) &&
                ((result[2] + result[10]) == 1) &&
                ((result[3] + result[11]) == 1) &&
                ((result[4] + result[12]) == 1) &&
                ((result[5] + result[13]) == 1) &&
                ((result[6] + result[14]) == 1) &&
                ((result[7] + result[15]) == 1))//判断校验码
        for(i = 0; i < 8; i++)
        {
                res += result[7 - i] << i;
        }//将结果转换为十进制数据
        return res;//返回得到的结果
}



完整代码:http://pan.baidu.com/s/11kIzo

20
 楼主| 发表于 2013-11-22 02:23 | 只看该作者
本帖最后由 skypup 于 2013-11-23 01:06 编辑



测试的视频来了。


您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

关闭

【站内推荐】上一条 /1 下一条

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