A 3-axis accelerometer sits at the heart of this project to provide a nifty little motion detector. Want to know who is stealing from the cookie jar? Want a simple home intrusion detector? Or to test your partner's driving skills? Then have a look at this:
(Soldering required for this project)
Video:
Parts Required:
- Freetronics Eleven or any compatible Arduino
- Freetronics 3-Axis Accelerometer Module
- Male header pins
- Seeed Studio's Grove Base Shield
- Seeed Studio's Universal Cables
- Seeed Studio's Grove Button
- Seeed Studio's Grove Buzzer
- Mini Breadboard 4.5cm x 3.5cm
- Protoshield and female header pins
- 1 x LED
- 330 ohm resistor
- Wires
- 9V Battery + Battery Clip
Instructions:
- Overlay the Seeed Studio Base Shield onto the Freetronics Eleven (or compatible Arduino).
- Use a Universal Cable to attach a Seeed Studio Grove Button to Analog Pin 0 on the Base Shield. The socket is located directly above the Freetronics Eleven Power plug, and next to the Reset button on the Base Shield. Please note that Analog Pin 1 is not used by the Grove Button.
- Use a universal Cable to attache a Seeed Studio Grove Buzzer to Analog Pin 1 on the Base Shield. This is the socket next to the one used in Step 2.
- Solder the female header pins to the Protoboard. Overlay the protoboard onto the Base Shield to create a third layer. I created this layer to tidy up the project and make it a little bit more portable. You could just wire up another breadboard on the side.
- Stick a mini-breadboard (4.5cm x 3.5cm) onto the protoboard. This allows you to use the protoboard for other projects.
- Solder the male headers to the 3-axis accelerometer, and then place it centrally onto the breadboard.
- You need 5 wires to connect:
- GND on protoboard to GND on accelerometer
- 5V on protoboard to VIN on accelerometer
- Analog Pin 3 on protoboard to X on accelerometer
- Analog Pin 4 on protoboard to Y on accelerometer
- Analog Pin 5 on protoboard to Z on accelerometer
- Connect digital pin 8 to an LED and 330 ohm resistor on the
breadboard,
- Use a wire to connect the resistor mentioned above to GND on the protoboard
- Connect the USB cable from your computer to the Freetronics Eleven, and upload the Arduino Sketch to the board.
- Disconnect the USB cable, and then power the Freetronics Eleven using a 9V battery and clip.
- When you press the button, it will sound 3 warning sounds before it becomes activated.
- If it detects a vibration or motion that exceeds the tolerance
level, it will alarm. The alarm will continue until you either press
the Grove button - which resets and reactivates the device or you can
press the Reset button on the Base Shield to Stop monitoring for motion.
Sketch
Freetronics Eleven / Arduino Sketch:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 |
//Motion Detector Alarm - Written by ScottC on 2/08/2012 //Global Variables and constants const int buttonPin = A0; // button Pin connected to Analog 0 const int buzzerPin = A1; // buzzer Pin connected to Analog 1 //Accelerometer Pins const int x = A3; // X pin connected to Analog 3 const int y = A4; // Y pin connected to Analog 4 const int z = A5; // Z pin connected to Analog 5 //Alarm LED const int ledPin = 8; // LED connected to Digital 8 int tolerance=20; // Sensitivity of the Alarm boolean calibrated=false; // When accelerometer is calibrated - changes to true boolean moveDetected=false; // When motion is detected - changes to true //Accelerometer limits int xMin; //Minimum x Value int xMax; //Maximum x Value int xVal; //Current x Value int yMin; //Minimum y Value int yMax; //Maximum y Value int yVal; //Current y Value int zMin; //Minimum z Value int zMax; //Maximum z Value int zVal; //Current z Value void setup(){ //Begin Serial communication Serial.begin(38400); //Initilise LED Pin pinMode(ledPin, OUTPUT); } void loop(){ // If the button is pressed, initialise and recalibrate the Accelerometer limits. if(analogRead(buttonPin)>500){ calibrateAccel(); } // Once the accelerometer is calibrated - check for movement if(calibrated){ if(checkMotion()){ moveDetected=true; } } // If motion is detected - sound the alarm ! if(moveDetected){ Serial.println("ALARM"); ALARM(); delay(1000); } } //This is the function used to sound the buzzer void buzz(int reps, int rate){ for(int i=0; i<reps; i++){ analogWrite(buzzerPin,900); delay(100); analogWrite(buzzerPin,0); delay(rate); } } // Function used to calibrate the Accelerometer void calibrateAccel(){ // reset alarm moveDetected=false; //initialise x,y,z variables xVal = analogRead(x); xMin = xVal; xMax = xVal; yVal = analogRead(y); yMin = yVal; yMax = yVal; zVal = analogRead(z); zMin = zVal; zMax = zVal; // Calibration sequence initialisation sound - 3 seconds before calibration begins buzz(3,1000); //calibrate the Accelerometer (should take about 0.5 seconds) for (int i=0; i<50; i++){ // Calibrate X Values xVal = analogRead(x); if(xVal>xMax){ xMax=xVal; }else if (xVal < xMin){ xMin=xVal; } // Calibrate Y Values yVal = analogRead(y); if(yVal>yMax){ yMax=yVal; }else if (yVal < yMin){ yMin=yVal; } // Calibrate Z Values zVal = analogRead(z); if(zVal>zMax){ zMax=zVal; }else if (zVal < zMin){ zMin=zVal; } //Delay 10msec between readings delay(10); } //End of calibration sequence sound. ARMED. buzz(3,40); printValues(); //Only useful when connected to computer- using serial monitor. calibrated=true; } //Function used to detect motion. Tolerance variable adjusts the sensitivity of movement detected. boolean checkMotion(){ boolean tempB=false; xVal = analogRead(x); yVal = analogRead(y); zVal = analogRead(z); if(xVal >(xMax+tolerance)||xVal < (xMin-tolerance)){ tempB=true; Serial.print("X Failed = "); Serial.println(xVal); } if(yVal >(yMax+tolerance)||yVal < (yMin-tolerance)){ tempB=true; Serial.print("Y Failed = "); Serial.println(yVal); } if(zVal >(zMax+tolerance)||zVal < (zMin-tolerance)){ tempB=true; Serial.print("Z Failed = "); Serial.println(zVal); } return tempB; } // Prints the Sensor limits identified during Accelerometer calibration. // Prints to the Serial monitor. void printValues(){ Serial.print("xMin="); Serial.print(xMin); Serial.print(", xMax="); Serial.print(xMax); Serial.println(); Serial.print("yMin="); Serial.print(yMin); Serial.print(", yMax="); Serial.print(yMax); Serial.println(); Serial.print("zMin="); Serial.print(zMin); Serial.print(", zMax="); Serial.print(zMax); Serial.println(); Serial.println("------------------------"); } //Function used to make the alarm sound, and blink the LED. void ALARM(){ //don't check for movement until recalibrated again calibrated=false; // sound the alarm and blink LED digitalWrite(ledPin, HIGH); buzz(4,20); digitalWrite(ledPin, LOW); } |



