Archive for April 2015
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.
Bootloading Atmega16 with Arduino Uno
Last two days I was experimenting with Microcontrollers and researching about how to write applications on it. I bought one Atmega16A and decided to use Arduino bootloader. So that I can write programs using Arduino IDE and syntax. This post explains about how to bootload Atmega16. I didn’t had any prior experience with Arduino, I have a uno sitting at my desk for quite a long time but never used it. Last three nights I was learning more about Arduino coding and learning about boards config and other stuffs.
Software Setup for Bootloading
I followed the steps posted by Sudar in his blog, please go through the post before reading further. Here I will write some points I had to do to do to complete the bootloading process.
Arduino IDE version: To run the core created by Sudar, we need the IDE version 1.0.x. I have the latest version 1.6.3. There are some differences in configuring boards.txt from 1.0 to 1.6. I tried to rewrite the boards.txt as per 1.6.* standard but it didn’t like it. So I downloaded the old version 1.0.6 from Arduino website. If you have 1.6.* already installed then better download the zip file and extract to a folder. That way you can use 1.6 and 1.0 in same machine.
Adding Boards and Variants: Adding boards to the sketch book folder didn’t work for me, may be I didn’t get it clearly. So I did the below steps.
-
Go to the Arduino’s hardware folder, <<IDE install location of IDE>>/hardware/arduino/ and open boards.txt.
-
Copy the contents of Atmega16 boards and pasted to the boards.txt opened in Step 1.
-
Create a new folder named mega16 under <<IDE install location>>/hardware/arduino/variants and paste the “pins_arduino.h” created for Atmega16.
-
Goto File->Examples->ArduinoISP, it will open a new window with ArduinoISP sketch. Before uploading the sketch make sure you have selected Arduino Uno in Tools->Boards->Arduino Uno. Now upload the sketch to your Uno. Now we setup our Uno as a programmer.
Hardware Setup for Bootloading
Here again I followed the pin connection detailed in Sudar’s post. Please follow exactly the way mentioned in the post. Also don’t forget to connect the capacitor between Reset and GND of Arduino.
Note: If you try to upload any sketch to Arduino Uno when the Capacitor is connected, IDE will throw errors. So before doing any thing with your Arduino remove the Capacitor.
Bootloading
Follow the below steps to burn the bootloader
-
We have to set our Arduino Uno as an ISP. To do that go to Tools->Programmer and select “Arduino as ISP”
-
Set the bootloader from Tools->Boards and select the newly added board, ie. Atmega16(internal 8mhz clock).
-
Now burn the bootloader by selecting “Burn Bootloader” under Tools menu.
If every thing works fine, you could see a success message at the bottom portion of the IDE.
Uploading Sketches to Atmega16
Next we need to upload some sketches to newly bootloaded Atmega16. For this I used the new version of Arduino IDE 1.6.3, If you want you can use IDE 1.0.*. Some how the old IDE is very slow for me, so I decided to use the new version. Skip the below step if you decided to use the old 1.0.* version.
Follow the steps to use the Atmega16 board in new version
-
Create a new folder under <<Installed location of IDE V1.6.*>>/hardware. You can name the folder anything, I named as Mega16.
-
Under Mega16 folder create another folder called “avr”.
-
Inside the avr folder copy the boards.txt and create another folder named variants and copy “pins_arduino.h” inside variants folder.
-
Open boards.txt and add the line “atmega16-8.upload.tool=arduino:avrdude”
Follow the below steps to upload sketch(Common for all versions of IDE)
-
Open up the IDE and load Blink from File->Examples->Basic.
-
Edit the code so that you are writing to a pin of Atmega16, here I write to Digital 6, it’s physical pin 20.
-
Before uploading the sketch Choose Atmega16(internal 8 Mhz) from Tools->Boards.
-
Choose “Upload using Programmer” from File menu.
Just connect a LED with a Resistor to Physical pin 20 of Atmega16 and you can see the LED blinking.
Now I can write any thing to the Atmega16 and connect to sensors or any thing I wanted to do without Arduino.
Water Level Sensor for my Aeroponic– First Experiment in PCB design
Last couple of weeks in my free times I was learning PCB design and basic Electronics. I studied basic electronics in College but that’s only to pass the exam. A couple of weeks ago, when I decided to learn basics of electronics, the only component I knew was Resistor. Rest I learned from YouTube and other blogs.
Next step was PCB Design, I went through so many YouTube videos and created so many designs using Eagle CAD (used Community Edition) and redo the design in several different ways. After some days of experiments with Eagle I was some what confident to design something that I could use in my Aeroponic system, a Water Level sensor. I cant design an electronic circuit but I learn to read Schematic designed by experts in Electronics.
I started searching for a right design for me to try out. I prototyped several design in breadboard but none of them worked as per my requirement. After several trial and error I finalized the below design I copied from one of the site, unfortunately I don’t know from where I copied the schema. (I will refer the url if I get that page again.)
Note: Above is a schema I created in Eagle cad, original author’s schema was very beautiful. Also I didn’t spend much time in schema, my goal was to design the PCB.
PCB Design
The next step was my area of interest, the PCB design. Below is the design I came up after several rearrangements of components.
PCB Etching
There are so many videos in YouTube detailing the PCB Etching process. I decided the approach of Laser printing the design on a glossy paper and doing thermal transfer to copper clad board. My friend Vinod, took a print out of the design on a Magazine cover. Yesterday night, with the help of Pressing iron and some Ferrous chloride, I created my first PCB. It’s a WOW moment for me.
I dill the holes using my Dremel rotatory tool. I added a Silk Screen as well. Printed the top screen in mirror mode on a Glossy paper and transfer to the board using my Wife’s Nail polish remover, It worked, you can see the silk screen in the below picture.
Final Board
Yes it’s a pretty simple circuit but I learned a lot from all these experiments.
Connecting to Raspberry Pi
The sensor will give two outputs, warning and critical status. Those two yellow wires are the sensor outputs, connect those to two GPIO pins of my pi. This is what I programmed.
1. Warning: The system will send a mail to me saying the water is below warning level.
2. Danger/Critical: The system will send a mail as well as shutdown the Submersible pump. If the pump run dry for a minute or two it will damage the pump.
3. When some one fill the tank with water above warning level, the motor will resume running and send a mail to me saying water level is fine.