500 likes | 634 Views
Boe-Bots!. COMP417 Instructor: Philippe Giguère. Introducing Boe-bots. Simple two-wheeled robot differential drive. Manufactured by parallax inc. www.parallax.com (for support/driver etc.) Great for rapid prototyping and teaching That’s why we are using them!. Components.
E N D
Boe-Bots! COMP417 Instructor: Philippe Giguère
Introducing Boe-bots • Simple two-wheeled robot • differential drive. • Manufactured by parallax inc. www.parallax.com (for support/driver etc.) • Great for rapid prototyping and teaching • That’s why we are using them!
Components • Pair of continuous rotation servos with wheels. • Demo board
Components (cont.) • Microprocessor (Javelin stamp) • Sensors • Batteries, chassis, etc…
The “brain”: Javelin Stamp • Small computer on a 24 pin mini-board. • Own power-supply. • 32k of non-volatile EEPROM. • 32k of RAM. • 15 input/output pins: • to control motors/sensors.
The “brain”: Javelin Stamp • Interprets a subset of Java. • 8000 instructions/seconds. • Virtual Peripherals (VP): • serial communication, • PWM (pulse-width modulation), • timer, etc.
Javelin Stamp Java Limitations • Single Thread • Replaced by “background objects”. • No garbage collection • Use static variables. • Beware of unwanted object creation: • System.out.println(a+b); • Use StringBuffer object instead of String for significant amount of text.
Javelin Stamp Limitations • Subset of primitive data types: • No float/double/long! • Subset of Java libraries. • No abstract type interface. • One dimensional arrays.
Javelin Stamp Integrated Development Environment (IDE) • Runs on Microsoft Windows. • Compile, download code to board and remotely debug. • Need a serial port/or USB version of board. • USB does not work completely: cannot do debugging. • Bi-directional serial message between board and PC • System.out.println() • Terminal.getChar() (doesn’t work on USB) • Check www.parallax.com/javelin/downloads.asp for latest and greatest version
First Example! • Example HelloWorld.java public class HelloWorld { public static void main() { System.out.println("Hello World!"); } }
CPU object • Central to I/O with sensors/motors, low-level functions, communication. • Dozens of methods: • delay(int period) • readPin(int portPin) • writePin(int portPin, boolean value) • count(int timeout, int portPin, boolean edge) • pulseIn(int timeout, int portPin, boolean pinState) • pulseOut(int length, int portPin) • shiftIn(int dataPortPin, int clockPortPin, int bitCount, int mode) • etc..
CPU.delay() • CPU.delay(int period) is similar to sleep(); • Program will pause during that time. • period: the length of time to delay for, measured in 95.48 ms units • CPU.delay(1) sleep for ~ 0.1 ms • CPU.delay(10473) sleep for 1 s
CountDown.java import stamp.core.*; public class CountDown { static int myVar; public static void main() { System.out.println("Commencing Countdown:"); CPU.delay (10000); for(myVar = 10; myVar >= 1; myVar--) { CPU.delay(2000); System.out.println(myVar); } System.out.println("Liftoff!"); } }
A little bit of electronics: resistor • Resists current: • Symbol • Resistor values are color coded.
LED: Light Emitting Diode • A diode a one-way valve: it lets current flow one direction but not the other way. • Made of semi-conductor material. • Emits at a single color.
LED: Light Emitting Diode • Always needs a resistor in series! Typically operate LEDs between 5-20 mA. (in our case ~5 mA: max on all 15 pins is 90 mA). Note: Vdd = +5V, Vss = ground
CPU.writePin(pin,value) • A pin can act like a switch: • CPU.writePin(CPU.pins[13],true) • Connects to Vdd (+5V) • CPU.writePin(CPU.pins[13],false) • Connects to Vss (ground)
CPU.readPin(pin) • A pin can also read a logic voltage: CPU.readPin(CPU.pins[13]) (Note: CPU.pins[13] == CPU.pin13)
Circuit for testing readPin/writePin When Push button pressed: P1 = 0V When Push button released: P1 = +5V Without pull-up, voltage would be “floating” when released: random fluctuations.
readPin/writePin • Example ButtonLED.java import stamp.core.*; public class ButtonLED { static boolean P0 = true; public static void main() { while(true) { if (CPU.readPin(CPU.pins[1]) == false) { P0 = !P0; CPU.writePin(CPU.pins[0],P0); CPU.delay(1000); } else { CPU.writePin(CPU.pins[0],true); } } } }
De-bouncing • When a push button is pressed, contact fluctuates for tens of ms. • De-bouncing is ignoring changes for x ms. • (see Button object for more info)
Bouncing example import stamp.core.*; public class ButtonBounce { static boolean P0 = true; public static void main() { while(true) { if (CPU.readPin(CPU.pins[1]) == false) { P0 = !P0; CPU.writePin(CPU.pins[0],P0); } } } }
PWM object(Pulse Width Modulation) • PWM object generates a pulse train as a background object.
PWM object • PwmLed.java import stamp.core.*; public class PwmLed { static PWM BlinkLed = new PWM(CPU.pin0,32767,32767); public static void main() { while(true) { if (CPU.readPin(CPU.pins[1]) == false) { // If button pressed BlinkLed.update(32767,32767);//32767*8.68uS = 0.28s } else { BlinkLed.update(12000,12000); // Blink Fast } } } }
Servo Commands • Servos on Boe-bots use analog signal to encode rotation rate. • Command is send every 20 ms. • High-level duration encodes command: • Neutral if high = 1.5 ms • CW rotation if < 1.5 ms • CCW rotation if > 1.5 ms
PWM object with servo import stamp.core.*; public class PwmOneServo { final static int SWITCH = CPU.pin1; static PWM ServoL = new PWM(CPU.pin12,173,2304); public static void main() { while(true) { if (CPU.readPin(SWITCH) == false) { // If button pressed ServoL.update(173-30,2304); // 173 is 1.5 ms } // 2304 is 20 ms else { ServoL.update(173+30,2304); } } } } • PwmOneServo.java
Timer object • Timer is another background object. • Used to keep track of time. • 32-bit timer with 8.68 ms resolution. • Can have more than one Timer. • .mark() to “mark” a timer • .timeout() to check if a timer expired.
Timer object import stamp.core.*; public class SimpleTimer { public static void main() { Timer t1 = new Timer(); // timer for first LED Timer t2 = new Timer(); // timer for second LED boolean led0=false; boolean led2=false; t1.mark(); // Start timer t1 t2.mark(); // Start timer t2 while (true) { if (t1.timeout(200)) { led0=!led0; CPU.writePin(CPU.pin0,led0); t1.mark(); } if (t2.timeout(500)) { led2 = !led2; CPU.writePin(CPU.pin15,led2); t2.mark(); } } } } SimpleTimer.java
Timer + PWM object • Using Timer and PWM, it becomes easy to create motion commands. • e.g. go left 2 seconds, then straight 5 seconds, then right 3 seconds. • ServoExample.java
HM55B Magnetic Compass • Using two Hall-effect magnetometers, localizes the magnetic north. • When used indoor, not very precise: steel beams. • Uses HM55B_compass.java with pinout on diagram.
CompassExample.java import stamp.math.*; import stamp.core.*; import stamp.peripheral.sensor.compass.*; public class CompassExample { static int angle; static HM55B_compass compass; // Compass module final static int LED_LEFT = CPU.pin15; // Red LED final static int LED_RIGHT = CPU.pin0; // Red LED public static void main() { while (true) { angle = compass.measure(); if (angle < -5) { CPU.writePin(LED_LEFT,false); CPU.writePin(LED_RIGHT,true); } else if (angle > 5) { CPU.writePin(LED_LEFT,true); CPU.writePin(LED_RIGHT,false); } else { // Points north CPU.writePin(LED_LEFT,false); CPU.writePin(LED_RIGHT,false); } System.out.println(angle); } } }
Trigonometry:Trig.java • Implements fixed-point precision sin,cos,tan.
Fixed-point computation:UnsignedIntMath.java • Used by Trig.java. • Implements fixed-point computation • Format is I.F (Integer + Fraction)
Infra-red detector • Infra-red LED • Sends a small burst @ 38.5kHz • Infra-red receiver • Detects burst @ 38.5kHz
IrTest.java import stamp.core.*; public class IrTest { static PWM emitter = new PWM(CPU.pin2,1,4); // IR LED static boolean result; public static void main() { while(true) { emitter.start(); // Send an infrared signal CPU.delay(10); result = CPU.readPin(CPU.pin3); CPU.writePin(CPU.pin0,result); emitter.stop(); CPU.delay(1000); } } }
Range Measurement with IR • With frequency at which the IR receiver is less sensitive distance duration of receiver pulse. • IrRange.java • Tends to be noisy: • Have to average/filter over a few samples.
IrTestRange.java import stamp.core.*; import stamp.peripheral.sensor.IrRange.*; public class IrTestRange { final static int IR_LED_RIGHT = CPU.pin2; // IR LED final static int IR_RCVR_RIGHT = CPU.pin3; // IR receiver static IrRange RangeR = new IrRange(IR_RCVR_RIGHT,IR_LED_RIGHT); public static void main() { while (true) { int r; // We sample the range measurements r = RangeR.measure(); // And output it on the screen System.out.println(r); CPU.delay(1000); // Need to sleep between samples } } }
Sonar modulePING))) • Range - 2cm to 3m • Uses only one I/O pin • Burst Frequency - 40 kHz for 200 ms
Extra goodie : PING))) motorized brackets • We have ordered also motorized PING))) brackets. • Available as an option to teams .
Piezoelectric “buzzer” • Can generate sound at low power. • Use Freqout object to drive a pin. • Can be useful to do a single beep at start of main() • detects spurious resets.
Buzzer.java import stamp.core.*; public class Buzzer { static Freqout myBuzzer = new Freqout(CPU.pin4); static int frequency; public static void main() { myBuzzer.start(); while (true) { for (frequency=20;frequency<2000;frequency+=15) { myBuzzer.setFrequency(frequency); CPU.delay(500); } } } }
Recap of important methods • System.out.println() to print on PC. • CPU.delay(period) to pause. • CPU.pin0 - CPU.pin15 to identify pin. • CPU.read(pin)to read value of a pin. • CPU.write(pin,value)to output +5V, 0V. • PWM object to create a pulse train for servos. • Timer object to have timing in program.
Recap of I/O • Servo motor to move robot. • Push-button. • LED/Buzzer for debugging online. • Magnetic compass for orientation. • Infrared for obstacle detection/distance. • PING))) Sonar module for obstacle as well.
Extra info • When batteries are low, the processor will reset when servos are activated. • Libraries are installed by creating the proper directories in parallax.
Extra info • Instruction manual is on parallax website • www.parallax.com/javelin/downloads.asp • Code example + libraries + extra instructions available on course web page: www.cim.mcgill.ca/~dudek/417/notes/Boebot.html