Maker Advent Calendar Day #9: Full Tilt!
Welcome to day nine of your 12 Projects of Codemas Advent Calendar. Today we're going to be using a sensor that detects movement - but not like our PIR sensor from day #7 - this is a tilt sensor which can detect when it is tilted over a certain angle.
Whilst we'll be using a simple ball tilt sensor which provides ON/OFF style output, in the outside world much more advanced versions are used in car alarms, boat and airplane roll, robotics and more.
This is a nice simple sensor that gives us a HIGH signal when tilted over a certain angle. In fact, this is probably going to seem like a really easy day considering all of the components you've been tinkering with!
Box #9 Contents
In this box you will find:
- 1x Tilt sensor/switch
- 2x Male to male jumper wires
- 2x Male to female jumper wires
In today's box of fun is a ball tilt sensor - the little can with two legs sticking out. That can has a small metal ball inside. When you tilt the sensor, gravity pulls the ball downwards and makes it roll to the other end.
The legged end has two contacts inside which connect to each leg. When the ball rolls down to the legged end, it connects these contacts/legs together (as metal is conductive) which then provides our Pico with a HIGH signal. When we tilt it back, the ball rolls away and the connection is broken, sending the pin back to LOW.
Great for robotics projects as an auto kill switch if your robot manages to roll over!
Construct the Circuit
You know the drill...turn that Pico off before changing the circuit!
Once again we're going to start with just the LEDs and buzzer connected, so remove the temperature sensor parts from yesterday which should leave you with this as your starting circuit:
Now to add the tilt sensor. It acts like a switch so we only need to connect two wires, and we've included male to female jumper wires to allow you to wire the component without attaching it directly to the breadboard, giving you the flexibility to tilt the switch. We've also included some male to male wires if you'd prefer to wire this to a breadboard.
The legs are only so strong, so whilst supporting the legs with your fingers, gently push the sensor's pins into the female ends of the jumper wires, then connect one of these wires to 3.3V (physical pin 36) and the other to GPIO 26 (physical pin 31).
The legs have no polarity so don't worry about which leg goes where. Your circuit should look like this:
Activity 1: Basic Tilt Sensor Program
Let's get a little program running to test our sensor and see how it works.
We only need a handful of lines to use this kind of tilt sensor as it works just like a button or switch, triggering HIGH or LOW signals.
This is very similar to our button code from day #3 - we set our sensor's pin with pull downs, then run a simple if statement looking for the pin to go HIGH.
# Imports from machine import Pin import time # Set up tilt sensor pin tilt = Pin(26, Pin.IN, Pin.PULL_DOWN) while True: # Run forever time.sleep(0.01) # Short delay if tilt.value() == 1: # If sensor is HIGH print("I tilted!") # Print a string
Activity 2: Tilty McBuzzalot
Let's trigger our buzzer whenever the sensor detects tilting. This is a basic version of the kind of system used in car alarms to detect when the vehicle is being lifted at an angle.
The example below adds the buzzer back into the code (which means we have to import PWM as we have done previously), sets the buzzer frequency before the while loop (as we won't be changing the frequency) and then simply increases the buzzer duty (volume) when a tilt is detected.
Give it a go!
# Imports from machine import Pin, PWM import time # Set up tilt sensor pin tilt = Pin(26, Pin.IN, Pin.PULL_DOWN) # Set up the Buzzer pin as PWM buzzer = PWM(Pin(13)) # Set the buzzer to PWM mode # Set PWM frequency to 1000 buzzer.freq(1000) while True: # Run forever time.sleep(0.01) # Short delay if tilt.value() == 1: # If sensor is HIGH print("***TILT DETECTED***") # Print a string buzzer.duty_u16(10000) # Set duty (volume up) time.sleep(0.2) # Short delay buzzer.duty_u16(0) # Duty to zero (volume off)
Activity 3: Tilt Counter
In some projects, counting the number of times a sensor has detected something can be very useful, like knowing how many times someone has entered a room or attempted to move an object.
Let's alter our code to count each time a tilt is detected.
The example below is a little smarter than our previous counters as we've added a new state variable to ensure the pin always returns back to LOW before we count again - otherwise if we kept the sensor tilted (HIGH), it would just keep counting forever!
We start the state at 0 then use and in our if statements to check for two conditions (remember this from day #3 with the buttons to check if both were being held down?):
- The first if statement won't run unless the state is 0 and the pin is HIGH. When it does run, the block of code inside this if statement changes the state to 1 meaning it can't run this counting block again until we return that state to 0.
- The second if statement handles this. The second if statement only runs if the state is 1 and the pin is LOW...meaning we're forced to tilt the sensor back to trigger this block, return the state to 0, ready to be tilted again.
Try this example, and remember to keep an eye on the jumper wires as they have a habit of popping out when you least expect it!
# Imports from machine import Pin import time # Set up tilt sensor pin tilt = Pin(26, Pin.IN, Pin.PULL_DOWN) # Set up a counter variable at zero tiltcount = 0 # Create a state variable at zero state = 0 while True: # Run forever time.sleep(0.1) # Short delay if state == 0 and tilt.value() == 1: # If state is 0 and our pin is HIGH tiltcount = tiltcount + 1 # Add +1 to tiltcount state = 1 # Change state to 1 print("tilts =",tiltcount) # Print our new tiltcount if state == 1 and tilt.value() == 0: # If state is 1 and our pin is LOW state = 0 # Change the state to 0
Now return to activity #2 and think about how you could improve this in the same way, waiting for the pin to trigger LOW again before allowing the buzzer to sound...or perhaps add the LEDs in for visual feedback on the tilt?
Day #9 Complete!
Well done makers, we've cracked another sensor. Today's sensor (some might call it a switch) was a little easier than others, especially as you're now so familiar with MicroPython and the approaches we're taking, but we thought a little breather would be good before we adventure on to the fun yet slightly-more-advanced goodies in the final three boxes!
Today you have:
- Learnt what a tilt sensor/switch is and why you might use one
- Learnt how to wire a tilt sensor into your circuit (easy peasy!)
- How to use variables and if statements in a way that improves the robustness and accuracy of our project
- Made a basic tilt alarm
- Re-used lots of things you've already learnt!
As always, please do not disassemble the circuit until tomorrow where we will explore the next fun component - see you then!
We used Fritzing to create the breadboard wiring diagram images for this page.