Part of the challenge of this is COST. Sniffbot is super cheap, but the RC controller it uses isn't. While RC is by far the best way to drive a robot like this, we're hoping to put together a complete system that can do everything the full Sniffbot can do for less that £25. That includes all of the mechanical and electronic components for a programmable, remote control robot (batteries not included, but that's another story!). The RC kit I generally use costs about £60 for the controller, and £15 for the receiver. That's still within reasonable budget if you want to buy one yourself, but not if we're building 5 for a workshop...
IR control is cheap and easy. An IR receiver costs about £1, and for the transmitter you can use any old one one you have around - doesn't everyone have a draw full of them. However if you do need to buy a new one then they're again only about £1.
We can reuse some of the original SniffBot code to drive the motors:
##### NOW CONTROL THE MOTORS #####
make leftDrive number
make rightDrive number
make motorController device
make motor1 number
make motor2 number
make motor3 number
make motor4 number
when updateMotors
.set motor3 to leftDrive
.set motor4 to rightDrive
.tell motorController to "update"
SniffBot Jr will have only 2 driven wheels, so this code isn't really necessary, but it means we can use the same code for both the 2 and 4wd drive versions: set leftDrive and rightDrive and then call updateMotors. It's important to use motor3 for left and motor4 for right, as the timers used by the IR receiver clash with PWM on the M1 and M2 outputs of the Motor Shield.
To receive IR commands we need a receiver which demodulates the signal, such as the TSOP4838. These have three pins: Vcc, Gnd and signal, so they can easily be wired to plug into the servo pins on the Arduino motor controller shield (which appear as inputs D9 and 10).
To use the IR we just need to make an IR device and tell it to read:
make receiveIR device 9
make keyPressed number
when start
.forever
..tell receiveIR to "read"
..if keyPressed > 0
...say [ keyPressed ]
There are several standards and protocols that IR keys can and should use but to keep things simple in Sniff they're set up so that more or less any key press should return a quasi-unique value. If you run the above code you can test your controller and find out what numbers it generates. Then we can use the values we get to control the motors on the robot:
when start
.forever
..tell receiveIR to "read"
..
..if keyPressed = 55335
...set leftDrive to 1
...set rightDrive to 1
...broadcast updateMotors and wait
..
..if keyPressed = 22695
...set leftDrive to -1
...set rightDrive to -1
...broadcast updateMotors and wait
..
..if keyPressed = 8415
...set leftDrive to -1
...set rightDrive to 1
...broadcast updateMotors and wait
..
..if keyPressed = 24735
...set leftDrive to 1
...set rightDrive to -1
...broadcast updateMotors and wait
..
..if keyPressed = 41055
...set leftDrive to 0
...set rightDrive to 0
...broadcast updateMotors and wait
These values are for a spare, unbranded IR remote I happened to have. I used the previous code to figure out the number for each button I wanted to use, and dropped them in to make a forward, backwards, left, right and stop control.
This is the most basic control you could have, but it could easily be extended so that holding/repeatedly pressing accelerates or slows the robot, and/or that left/right steer, rather than just putting the thing into an on-the-spot spin. However the important thing is we now have control over our robot in a way that's cheap enough to use with a workshop of people.
No comments:
Post a Comment