Saturday, April 21, 2012

PIC based 3-axis accelerometer

Introduction

At the time of writing this article I cannot really recall why I started out on this project in the first place. Maybe, because some time ago I was experimenting with the built-in analogue-digital converters of some PIC micros and was thinking that they could be used easily to interface the analogue output of an accelerometer… Maybe I saw something similar on a web site and thought I could make a better one… I don’t know. What I do know is that I like projects that involve LEDs (especially blue ones, preferably flashing most of the time :) ), interfacing with real world, and projects that teach me something new. So… one day I decided to make a 3 axis accelerometer – to see if I can make it – that could be used (as is or with slight modifications) in real life applications. I tried it in a car - it works great there, but at the moment I just have it sitting on my desk to entertain visitors.
The assembled 3-axis accelerometer


If you like this project and would like to build it yourself all the necessary information on it is below. If you don’t feel adventurous enough to build it yourself but still would like to have it I can prepare you a kit or a fully built unit – drop me a line for more info.

Hardware

The direction-sensing is accomplished by Freescale’s MMA7361L, which is a three axis low-g micromachined accelerometer in a tiny (14 pin LGA) package. The advantage of this chip is that it’s super simple to use: just connect the three directional output pins to an analog-digital converter input of a microcontroller and you’re ready to go. With a few more pins connected straight to some further microcontroller IO pins you can enhance its operation with functions like SLEEP, 0g detection, sensitivity selection, etc. The disadvantage of this chip is that it’s in a tiny package that’s a bit difficult to solder at home. In fact, I tried to make a breakout board for it, but it doesn’t seem to work. I think I made the solder pads too small for the IC and this is why it doesn’t work, but I still have to find out why. In the meantime, I got a breakout board complete with the sensor on eBay for a few euros to keep me going. That worked like a charm for the very first try.

MMA7361 breakout board from eBay

The MMA7361L has a g-select input. This can be used to select the sensitivity of the device (±1.5g or ±6g). I decided to put a jumper on the PCB to allow easy selection. I could have used an actual switch for even easier selection :-) but I didn’t want to overcomplicate it. It’s not like I need to change it all the time…

The processing is done in Microchip’s PIC16F887. I chose this micro for this project because I had worked with it in the past and I could get my hands on a few of them in a 44 pin TQFP packaging – another challenge for me. I had never soldered this small pitch ICs before and wanted to try my hands at them. It turned out it was not difficult at all – I used the some-solder-and-a-lot-of-flux method with superb results.


Control module PCB "naked"...


... and with components soldered in place


Bottom side - it containd a socket that is aligned with the display module's connector.

Coming up with a nice way of displaying the directional data was not an easy task. I came up with several different layouts – all had pros and contras. Finally I decided having a cross (showing up/down and left/right data) and line (showing forward/backward data) combo made up of blue SMT LEDs. (I just love blue…) The resolution of the displayed data is 8 LED in every direction which adds up to 48 LEDs total. The resolution of the measured data is much higher, but it is not necessary in my application, so in firmware I simply discard the extra information. Since I made my design modular I can later design a new display module for the same “CPU board” without redesigning the whole board or changing the firmware. If you can think of any layout that would look better please let me know in the comments section.

Only the 48 LEDs and the realted resistors (all SMD) on this side of the board.

The 48 LEDs in the current formation are driven by 6 daisy-chained serial-in-parallel-out shift registers (one for each segment) using only 3 pins of the microcontroller. This is a very efficient use of microcontroller IO lines and easy to program since it doesn’t need constant refreshing.

Schematics of the display module


I also added a buzzer (recycled from an old motherboard) to the design – its sole purpose is to beep when the device is in 0g, or free fall. I really don’t expect to hear it very often when this circuit is mounted in a car… but in other applications this might get useful. Anyway, I put it in the design because I could :-).

Schematics of the micro controller module

 The circuit doesn’t contain any stabilization for input voltage – I planned on using a 12V DC -> 5V DC converter. I put a standard USB micro socket on my board, so any USB car charger for mobile phones or GPSs would be OK to power this device.

Finally, the mandatory ICSP header is also aboard for easy development.

Software

As I consider myself a beginner with PICs, programming was done in assembly so that I learn the most about the microcontroller. The source and/or the hex file is available upon request.

Enclosure

As usual, making a nice and useful enclosure for the circuit was the most difficult part of the project. Originally, I wanted a dark plastic panel for the front so that the circuit is not visible only the lit up LEDs. After an extensive search on the internet as well as local stores I realized this is not going to happen. I still don’t understand what is so special about this material – it is used in millions of common everyday items, such as car dashboards, TV/video/dvd player displays etc. If you can recommend a place to me that sells these dark, semi-transparent pieces of plastic sheets in small quantities (and ship to Greece) please let me know.

Back of the display module - all parts soldered in.

From bottom to top: Display module, control module, MMA7361 breakout board - all sandwiched together.
Finally, a short video demonstrating how it works:


Note on comments

I will not see comments left on other sites that might feature this article, so if you want me to read your comments, please leave them here. I love receiving comments on my projects and I always answer them.

21 comments :

  1. Nicely done Vitya! Do you make your own PCBs or send off for them? I was initially put off by SMT as being too hard but I'm starting to warm up to it.

    ReplyDelete
    Replies
    1. I used to, but not anymore. I find it difficult to get all the chemicals I would need these days and I can also get more consistent quality and more features (like silk screen) when I outsource it to professionsals.
      To do SMT work you only need a good set of magnifying glasses and a steady hand. I switched to SMT because it's a lot cheaper than TTH as the parts and the necessary PCB area are both cheaper.

      Delete
  2. same , i make my own boards but via the toner method :/ been looking into makeing a direct printer. so far ive done one smd board @ home , it was fun and not to hard but haveing to toner transfer each time has stoped me from doing more till i can print straght to them .its fun the first few time but then you relize an hour or so for one board is far to long a time to spend when you want to make 5 things a weekend :)

    ReplyDelete
    Replies
    1. Totally right :) Once you finalize your direct printer, please don't forget to share it with us! :)

      Delete
  3. How much does it cost to get the boards made?

    ReplyDelete
    Replies
    1. Please send me a private mail or leave your e-mail address here for details.

      Delete
  4. Replies
    1. sir,thanks 4 ur reply... we are working on a gps gsm based project.. Is there a command for writing a character array using UART in mikroC pro for pic16f877a???

      Delete
    2. Sorry, I don't use MikroC. Why don't you check out its documentation?

      Delete
  5. Hello friend. I am a beginner and would like to receive the source code to learn. Please send to analistadematerial@yahoo.com.br. Thanks

    ReplyDelete
  6. Hi, I am currently doing a project about wii motion plus to control servo.
    can i have your source code for refering?
    because i am quite blur about i2c ><

    ReplyDelete
    Replies
    1. I can sure send you the sources for this project but I can sure you that there is nothing in it about I2C.. Are you sure about it?

      Delete
  7. my mail is reevelim1993@gmail.com
    and i am using hitec C compiler and pic16f887 =)

    ReplyDelete
  8. sir please send me code..as I am trying for accelerometer coding but I am not getting it properly. my mail id is nikhil.agrawal005@gmail.com

    ReplyDelete
  9. sir do you have code in c??
    or algorithm?

    ReplyDelete
  10. Your work is really interesting. I'm also working on PIC16f887 with accelerometer base project. Could you please send the code to me also. My email is sameerat8@gmail.com . Thank you

    ReplyDelete