Showing posts with label RS485. Show all posts
Showing posts with label RS485. Show all posts

Friday, May 26, 2017

Nodes



New nodes now come with blue PCB and as option with USB charger. Here on picture you can see battery powered node with USB charging circuit and temperature sensor. On back there is RFM69HW module, also available as option, and 720mAh Li-on battery. Such batteries can be found on ebay. They are sold for quadrocopter toys, and even they are labeled as 25C RC, they have build in protection circuit.


Further more I will, or I can, equip all battery powered nodes with 8MHz crystal oscillator instead of 16MHz. This reduce the power consumption even more. The whole setup on picture has following consumption:

ATmega328P@8MHz sleeping 33.2~33.6uA
ATmega328P@8MHz running ~4mA

Just to ones that are curious what are the missing components. This board can be either battery or DC powered, and also can communicate over radio(RFM69HW) or RS485.

Monday, December 28, 2015

Remote node code

Just created new GitHub repositories for remote node code and put links to them on the page here on blog.

In the code there is visible declaration of sensors and authentication units, and their way of registration to gateway. In the iButton node, there is also sound and led code that is based on tone library and performs feedback to user. Wired nodes use my own RS485 library, otherwise standard Arduino libraries are used.

Monday, January 26, 2015

RS485 protocol

Last post reminded me to write about library I have created for the wired network. It is called simply LibRS485, or NilRS485 adopted to work in NilRTOS. The library defines packet protocols on RS485 drivers. I use ST3485EB a 3.3 V powered, 15 kV ESD protected and up to 12 Mbps RS-485 half duplex transceiver. Inexpensive SO8 chip that has all that is needed already inside. As it is half duplex we need one extra pin to tell the transceiver if we are receiving or transmitting. The transmission itself require one twisted pair of wire and is able to push the data to distances over 1km with reasonable speed. The nice thing about RS485 it uses a differential balanced line and resists electromagnetic interference from motors and other equipment, more can be found on wiki.

LibRS485 uses a 9bit protocol and Multi-processor Communication mode defined in ATmega. This allows the MCU to do other thing without looking on communication unless there is a address frame. Basically i work like this:

  1. All nodes are in Multi-processor Communication mode (MPCM)
  2. One of the node sends an address frame, and all receive and read this frame.
  3. All nodes reads the address frame and determine if it has been selected. If so, it clears the MPCM, otherwise it waits for the next address frame and
    keeps the MPCM setting.
  4. The addressed node will receive all data frames until a new address frame is received.
  5. The other nodes which still have the MPCM bit set, will ignore the data frames.
  6. When the last data frame is received by the addressed node, the addressed MCU sets the MPCM and waits for a new address frame. The process then
    repeats from 2.
Library also defines a packet structure like this:
 -------------~~~~~~~~~~~~~~~~~~~~~~
 - A - P - X -  D0 - D63 ~ S0 ~ S1 ~
 -------------~~~~~~~~~~~~~~~~~~~~~~
  
  - Required fields
  ~ Data and signature fields
  A Address - 4 bits form and 4 bits to address.
    0  is master, but not really as any node can drive communication
    15 is broadcast to all
    14 addresses left for other devices
  
  P Packet definition - 2 bits type and 6 bits length.
    Flag bit configuration:
    FLAG_ACK 3
    FLAG_NAK 2
    FLAG_CMD 1
    FLAG_DTA 0
     
    Types: CMD - Command - user defined general commands value 0 - 63
           DTA - Data - user data length D0 - D63 and CRC S0, S1
           ACK, NAK - flags for data, using signature of data packet
           
  X XOR of A and P, for basic transfer safety.
  
  D0 - D63 user data.     
                       
  S0 ~ S0  CRC for user data or signature for ACK, NAK.   

So basically there are two types of packets. Command packet that has only 3 bytes (APX) and deliver a command(number 0-63) to node(s). It is used for example to issue a call for registration. Or data packet  that has 6-69 bytes (APX D0~D63 S0S1). This deliver any data to node(s). The nodes are addressed by its address 0-14, which select any individual node. Or address 15 that is broadcast to all nodes.