|
本帖最后由 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.......不行!
|
-
|