找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 7376|回复: 13

再来点有趣的NXT扩展,高速485通讯........

[复制链接]
发表于 2013-6-16 21:14:24 | 显示全部楼层 |阅读模式
本帖最后由 blackblue 于 2013-6-16 21:16 编辑

       前面调通了I2C的通讯(NXT与ARDUINO),得陇望蜀,想进一步提高NXT与外部MCU的通讯速度,主要是想扩展NXT的通讯能力,使得NXT的原来的4个端口的第四个能够接高速的WIFI或者XBee,大大增强NXT的扩展能力!目前NXT给出的这些硬件端口,只有RS485才有这种能力,关键性的一步是调通NXT与外部MCU的打RS485通讯!
       为了这个试验,淘宝大采购了一下,大致清单如下:
       一个USBASP(为了烧写MCU程序用的);
       一个USB-(RS232-TTL-RS485)转换模块,主芯片是CP2012(用于NXT直接和电脑的调试)
       MAX485芯片4个(2个是进口的二个是国产的,事实证明,国产的短距是没有问题的,而且只要0.5元,这是必须品)
       ATMEL 328P(DIP)二个, ATMEL 328P(AU)二个,晶振,电容电阻等一堆(这是我搭自己的ARDUINO最小系统用的)
       .........
       (打住了,这和今天要讲的试验无关)
----------------------------------------------------
       试验所需:ARDUINO MEGA2560 1PCS,MAX458 1PCS,NXT主机1PCS,面包板,杜邦线等
-----------------------------------------------------
       硬件连接:见图,注意,MAX485的B---黄色线,A----兰色线;这个图上网上来的,事实证明,网上不一定正确的,我在这一步整整花了一个星期才知道真相!
-----------------------------------,-----------------
       首先实现的是点对点的通讯,NXT发送,ARDUINO接收!
NXT程序
     void Go_Rtn()
{
   string toArduinoMsg_Hi = "12345678 " ;
   string toArduinoMsg_GD = "arduino hello " ;
   TextOut(0, LCD_LINE4, "Transmitting ..." );
   while(TRUE)
   {
        TextOut(0, LCD_LINE5, "                " );
        TextOut(0, LCD_LINE6, "                " );
        TextOut(0, LCD_LINE5, toArduinoMsg_Hi);
        SendRS485String(toArduinoMsg_Hi);
        while (RS485SendingData());
        Wait(2000);
        TextOut(0, LCD_LINE6, toArduinoMsg_GD);
        SendRS485String(toArduinoMsg_GD);
        while (RS485SendingData());
        Wait(2000);
   }
}
void Init_Rtn()
{
   SetSensorType(IN_4,SENSOR_TYPE_HIGHSPEED);
   UseRS485();
   RS485Uart(HS_BAUD_19200, HS_MODE_8N1);
}
task main()
{
   RS485Enable();
   Wait(100);
   ClearScreen();
   TextOut(0, LCD_LINE1, "NXT ---> Arduino" );
   TextOut(0, LCD_LINE2, "    via RS485   " );
   Init_Rtn();
   Go_Rtn();
}
-------------------------------------------------------
ARDUINO程序

const int DE_RE_PIN = 2;
int mark = 0;
String rcvByte ="";
void printMessage()
{
     int i =  rcvByte.length() - 1;
     Serial.print(i);
     Serial.println(" bytes received");
     Serial.println(rcvByte);
     delay(2000);
     rcvByte = String("");
        
}
void setup()
{
    pinMode(DE_RE_PIN, OUTPUT);   
    Serial.begin(57600);
    Serial1.begin(19200);
}
void loop()
{
    digitalWrite(DE_RE_PIN, LOW);  // Enable data receive
    while (Serial1.available() > 0)
    {
       rcvByte += char(Serial1.read());
       delay(5);      
       mark = 1;
    }
    if(mark == 1)  
       {         
          printMessage();
        }
       mark = 0;
      
     //digitalWrite(DE_RE_PIN, HIGH);  // Enable data send  
        
}

注:

1,如果你没有ARDUINO MEGA2560,其实一般的ARDUINO UNO也可以实现的,但UNO是只有一个硬件串口,为了能用硬串口监测输出,485的B,A端你只能其他数字引脚来模拟串口(即软串口),我试验过了,是可行的,但软串口的速度我试了一下,最大只能到576000,再往上,就会有乱码输出了!
2,这个简单试验,速度我一直设到了115200也是正常的!当然短距离的不算什么,RS485的通讯距离可达最远1200M,这时候的端口硬件连接是不一样的,这里我们不会用到,我也没试过,不多讲了!
3,后记:我用nxt第四口+CP2012(主要是用了485转TTL)+一个BC04兰牙(TTL口),已经实现了将第四端口扩展成兰牙端口;我没有WIFI或者XBEE,这些模块较贵,正在攒钱中......
4,NXT-G中的485BLOCK,我 写了一个循环发送字节的程序,然后从电脑端的串口助手中观看,发现有字节进来,但窗口显示全是0X00!我想,这可能与BUAD有关,但我无法确定485 NXT BLOCK究竟是用了什么速率,我试了9600,14400.......不行!



485.jpg
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
 楼主| 发表于 2013-6-16 21:24:09 | 显示全部楼层
本帖最后由 blackblue 于 2013-6-16 21:55 编辑

二张照片无法上传,JPG格式,每张只有1.5M,按理图片小于10M可传,但事实上真不行,糖老大的网,任重而道远啊!


我错啦!以为可以传10M的图呢,压缩了一下,好了!
5-1.jpg
6.jpg
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-16 21:30:19 | 显示全部楼层
blackblue 发表于 2013-6-16 21:24
二张照片无法上传,JPG格式,每张只有1.5M,按理图片小于10M可传,但事实上真不行,糖老大的网,任重而道远 ...

图片大小的限制就是1M,您在上传图片时看到的提示,是按照附件的文件限制大小提示的。这是论坛程序的bug,我们也一直没找到解决办法。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-16 21:39:13 | 显示全部楼层
因为论坛大多是上传附件是图片,这些图片非常占用空间,图片是限制是按照1MB的,其他类型的附件是10MB。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-6-17 22:12:17 | 显示全部楼层
那是一卷焊锡吗?富态!!!

你的几个Arduino帖子我都读了,学习了。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2013-6-25 12:45:21 | 显示全部楼层
最新的进展:
1,试用NXT-G RS485 BLOCK进行NXT--ARDUINO(其他MCU也一样)通讯时,失败;
2,联系了写NXT-G RS485 BLOCK的Andy,此人非常地热心,他答应我改进他的BLOCK,以适应NXT与其他MCU的RS485通讯!但同时他指出,由于NXT LabVIEW toolkit的限制。NXT-G无法达到NXC或者ROBOTC的效果........
3,一旦Andy写完传给我测试,在经得他同意的情况下,我会公开他的BLOCK!如果他不授权,我至少会公开试验情况和结果!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-8-2 21:33:36 | 显示全部楼层
真的学到不少东西,继续哥们儿,我顶你
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-9-21 18:10:41 | 显示全部楼层
blackblue 发表于 2013-6-25 12:45
最新的进展:
1,试用NXT-G RS485 BLOCK进行NXT--ARDUINO(其他MCU也一样)通讯时,失败;
2,联系了写NXT-G RS4 ...

这非常有意义,努力!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-5-8 20:56:40 | 显示全部楼层
485 NXT BLOCK 速率是 1200
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2014-5-9 11:22:02 | 显示全部楼层
本帖最后由 blackblue 于 2014-5-9 11:23 编辑
bg9aba 发表于 2014-5-8 20:56
485 NXT BLOCK 速率是 1200

1,485NXT BLOCK里面的速率是可以设定的,1200是最低值......
2,Andy写的这个BLOCK,是用于2个NXT间485通讯用的,我大致知道二个NXT间.这个BLOCK是通过轮询应答方式来控制数据流向的,所以我试验失败的原因是,其他MCU与NXT通讯时,MCU里的程序没有使用轮询应答方式,我是按普通的URAT方式写的,所以NXT在发出询问后,我没有做回应直接就向RS485口发送数据了,导致NXT没有置入到接收状态.......
3,这个BLOCK有新VER的,你可以自己找,我本想改成简单的串口方式,但打开后我呆了,太复杂了,我改不好,改了好多天都没有成功!

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-5-9 22:05:53 | 显示全部楼层
是NXTbee吗?这个支持的最高速率是115200,通讯协议很简单,就是发送方先发送字节数,等待接收方返回0xff后,依次发送。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2014-5-10 08:35:36 | 显示全部楼层
bg9aba 发表于 2014-5-9 22:05
是NXTbee吗?这个支持的最高速率是115200,通讯协议很简单,就是发送方先发送字节数,等待接收方返回0xff后 ...

不是XBEE的,就是有线的485啊.......
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-5-10 17:25:31 | 显示全部楼层
新版本我还是找不到,麻烦给发个bg9aba@wo.com.cn
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-5-11 18:40:29 | 显示全部楼层
blackblue 发表于 2014-5-9 11:22
1,485NXT BLOCK里面的速率是可以设定的,1200是最低值......
2,Andy写的这个BLOCK,是用于2个NXT间485通 ...

终于找到新版本了,和您描述的一样,首次发送时先发字节数,等待接收方应答后,应答就是RS485总线有变化就行,然后将数据依次发出。后续发送数据就不需要应答了。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-4-26 19:32 , Processed in 0.085974 second(s), 22 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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