Posts Tagged ‘IoT’
MQTT Protocol for Internet of Things (IoT)
I was thinking about how to control my Aeroponic system remotely via internet. The Raspberry Pi controlling the system is connected to internet via a router. I could access RaspberryPi by Port forwarding and stuff like that but it’s complicated. Next option could be using Websockets but I felt it’s an overkill for the applications running in Pi.
Recently I received a Refcard from Dzone regarding a protocol called MQTT. I was not aware of this Protocol before. So thought of doing some experiment with it. I am not going much deeper into the protocol, Dzone refcard did a great job of explaining it well.
In a nutshell, MQTT consist of three parts.
-
Broker
-
Subscribers
-
Publishers
Publisher, publish message to a specific topic and any Subscriber subscribes for that topic receives the message. Broker is the central hub, both Publishers and Subscribers are connected to the Broker and it take care of delivering the message to all the subscribers subscribed for the topic.
Brokers
We can implement our own broker using RabitMQ or Mosca plugin for Node js or any other MQTT brokers available in the market. To experiment it, I used CloudMQTT addon in Heroku. I used Heroku just to manage every thing from one central place.
Dev Environment
I created two set off Node js application, one running in my computer as a publisher and another running in my RaspberryPi as a subscriber. Both have no direct connection instead they are connected to CoudMQTT broker. Below is a test code and nothing related to my Aeroponic system.
Publisher Code
var mqtt = require('mqtt'); var client = mqtt.createClient('<<PortNumber>>', 'm11.cloudmqtt.com', { username: '<<UserName>>', password: '<<Password>>' }); client.on('connect', function () { // When connected // subscribe to a topic client.subscribe('TEMPERATURE_READING', function () { // when a message arrives, do something with it client.on('message', function (topic, message, packet) { console.log("Received '" + message + "' on '" + topic + "'"); }); }); // publish a message to a topic client.publish('SET_TEMPERATURE', '24', function () { console.log("Message is published"); }); });
The above code act as a Publisher as well as a Subscriber. For e.g. the above code can be a piece running in Internet and the Pi’s can Publish the Temperature readings in a periodic interval and logged in a central db. We can see the readings via a webapp or which ever the way we need. Also if required we can set a temperature to all the connected RPi’s by publishing a message to topic ‘SET_TEMPERATURE’.
Subscriber Code
var mqtt = require('mqtt'), url = require('url'); var client = mqtt.createClient('<<Portnumber>>', 'm11.cloudmqtt.com', { username: '<<UserName>>', password: '<<Password>>' }); client.on('connect', function () { // When connected // subscribe to a topic client.subscribe('SET_TEMPERATURE', function () { // when a message arrives, do something with it client.on('message', function (topic, message, packet) { console.log("Received '" + message + "' on '" + topic + "'");
// set the temperature. }); }); });
The code is very minimal and we could achieve an easy communication to all the connected devices. In the above scenario clients are always connected. If you want to end the connection then call ‘client.end()’.
Later I implemented a Broker using Mosca, both scenarios the system worked really well.
RS485 Communication Protocol with Micro Controllers and Raspberry pi
We are in the age of connected devices, devices could talk each other either via RF or wired. In one of my post I explained about Radio Frequency communication using Xbee. In this post lets see how devices can talk each other via wired network. One of the advantage of Wired network is, it is cost effective compare to buying an XBee modules like Xbee pro. I personally prefer Wireless communication as it’s hassle free, just place the devices where ever we need.
In my previous post I explained how to Bootload Atmega16A and program it using Arduino. Next step is to establish the communication between the Micro controllers and Raspberry pi. In this case my Raspberry Pi is acting as the central hub that talk to other controllers and collect data or issue command to do some job.
RS 485 Protocol
I better leave it to Wikipedia to give a detailed explanation of the protocol. In brief using RS485, devices can communicate Full duplex or Half duplex. I used a Half duplex communication. So it’s a protocol, how do we implement the protocol in our hardware, there is a chip Max485 from Maxim. This chip can establish a half duplex communication.
Max485 Pin configuration
Max 485 is a 8 pin chip as shown below. It’s a DIP chip and SMD have different pin layout.
Image from Maxim site
Pin 1 – RO: It’s the Data-In pin, devices can read data from the bus using this pin. Rx pin of the Micro controllers should connect to this pin.
RE and DE: Set this pin to Logical High to transmit any data to the bus. Set this pin to Low to receive data from the bus.
Pin 4 DI: Devices can transmit data via this pin. This pin should be connected to the Tx pin of the device.
Pin 8 and 5 – VCC and GND: To power the chip, VCC should be 5 volt.
Pin 7 and 6 – A and B: Here we connect the data line. A should connect to the A Pin of the next Max 485 and B with B.
Connection Diagram
The below picture will illustrate how to connect all the devices together.
Image created using Fritzing
As per the diagram, if RPi want to transmit any data. We should set a high voltage on GPIO 18 and issue a serial write. All other devices in the network will be in listening mode and can read data using serial read, if any other device wanted to transmit data, then issue a Logical High to RE DE pin and will get promoted as a master and transmit data via serial write.
Now it’s up to you to program it and do some cool things with it.