Tutorial 03 Chronos Watch Controlled Rover
Clone this wiki locally
This tutorial shows you how to build on Tutorial 02, to control your rover using the wireless accelerometer feature of the Chronos EZ-430 watch. Raise your hand and the rover starts moving forwards, lower it and it stops, rotate your wrist to the left and the rover turns left, rotate it to the right and the rover turns right!
Here is a Youtube video of the rover in action: http://youtu.be/T_NB44FhRIo
And here is a video of it on the bench: http://youtu.be/-qHpqYByu_8
If you are not familiar with the Chronos watch, it is a fantastic little gadget, that functions as a digital watch, but also, amongst other things, has an accelerometer and a wireless transceiver. So it comes with a USB dongle that you can plug into your Raspberry Pi and then write a Python program to read acceleration data transmitted from the watch.
Wire up the rover just as you did in Tutorial 02 but instead of the wireless dongle for the keyboard, use the dongle for the watch.
Install and run this program on your Raspberry Pi over SSH (see Tutorial 02).
#!/usr/bin/python import time import serial import array from raspirobotboard import * rr = RaspiRobot() def startAccessPoint(): return array.array('B', [0xFF, 0x07, 0x03]).tostring() def accDataRequest(): return array.array('B', [0xFF, 0x08, 0x07, 0x00, 0x00, 0x00, 0x00]).tostring() def twos_comp(val, bits = 8): if ((val & (1 << (bits-1))) != 0): val = val -(1 << bits) return val ser = serial.Serial('/dev/ttyACM0',115200,timeout=1) ser.write(startAccessPoint()) full = 16 half = 12 dead = 20 go_level = 10 while (True): ser.write(accDataRequest()) accel = ser.read(7) x = -twos_comp(ord(accel)) # -50 to +50 y = twos_comp(ord(accel)) z = twos_comp(ord(accel)) if x > -dead and x < dead: left_duty = full right_duty = full elif x <= -dead: left_duty = full right_duty = half elif x >= dead: left_duty = half right_duty = full go = (y < go_level) if x == 0 and y == 0 and z == 0: go = 0 #print(str(left_duty * go) + " " + str(right_duty * go) + " " + str(y)) # rough pwm of left and right channels for j in range(1, 100): for i in range(1, 16): rr.set_motors((left_duty * go > i), 0, (right_duty * go > i), 0) time.sleep(0.1)