2008年11月12日 星期三

Arduino扩展板使用之RS485接口篇

前面我们提到过串行接口按标准被分为RS-232、RS-422、RS-485。我们的A板扩展板就集成了RS485(MAX485)接口。
      
RS485采用差分信号负逻辑,+2V~+6V表示“0”,- 6V~-
2V表示“1”。RS485有两线制和四线制两种接线,四线制只能实现点对点的通信方式,现很少采用,现在多采用的是两线制接线方式,这种接线方式为总线
式拓朴结构在同一总线上最多可以挂接32个结点。在RS485通信网络中一般采用的是主从通信方式,即一个主机带多个从机。很多情况下,连接RS-485
通信链路时只是简单地用一对双绞线将各个接口的“A”、“B”端连接起来。其理论的通讯距离是1200米,速率高达20Mbps,并可以用在强噪声的环境
中正常工作,在工业通讯领域中被广泛应用。
       RS485通讯的点对点接法和主从机接法如下图:


       以上2种接法建议都接上地线,以保证减小干扰。在主从网络中,通讯线必须手牵手地并联下去,不可以有星型连接或者分叉。
      
RS485协议只是把TTL的串口转换成差分方式的通讯接口,485芯片的端口还是接到Arduino的RX(PIN0)和TX(PIN1)端,两线制的
RS485是属于半双工网络,则需要有个端口来控制AB差分线上何时收何时发,这就会用到Arduino上的PIN2。Arduino扩展板上需要插上
485接口选择插针,红圈处的3个插针都要插上:



完成上面的操作,我们就可以玩代码了,2个简单的代码:


主机代码:
int EN = 2;

void setup()
{
  pinMode(EN, OUTPUT);
  Serial.begin(19200);
}

void loop()
{
// send data 
  digitalWrite(EN, HIGH);//使能发送
  Serial.print('A');
  delay(1000);
}


从机代码:
int ledPin = 13;
int EN = 2;
int val;

void setup()
{
  pinMode(ledPin, OUTPUT);
  pinMode(EN, OUTPUT);
  Serial.begin(19200);
}

void loop()
{
  // receive data
 digitalWrite(EN, LOW);//使能接收
 val = Serial.read();
  if (-1 != val) {
    if ('A' == val) {
      digitalWrite(ledPin, HIGH);
      delay(500);
      digitalWrite(ledPin, LOW);
      delay(500);
    }
 }
}


代码编译后,分别下载到2个Arduino中(下载代码时请拔掉上图所示的485接口选择插针,因为它要占用串口,导致
下载失败),然后连接2个扩展板上的485接口,A-A,B-B,GND-GND。主机Arduino模块会向从机不停的发送字母A,然后从机接收到字母
A,并使数字PIN13上的发光二极管闪烁。

沒有留言: