I purchased an SRS Workshop Robot as a learning tool and easy platform to develop initial software while designing a more capable machine. Refer to Seattle Robotics Society for purchase details. The kit is an excellent starting platform. The parts fit together easily and the instructions are excellent. I purchased both the level 1 and level 2 kits plus the wiring accessories.
Assembling the kit took one day.
The software with the kit loaded easily and worked as described.
The Robot under development.








| Direction |
Turn |
Encoder
Relationships |
Target |
| Forward |
Straight |
Left Encoder == Right Encoder |
0 |
| Left |
Left Encoder
< Right Encoder |
-- Counts |
|
| Right |
Left Encoder >
Right Encoder |
+ Counts |
|
| Reverse |
Straight |
Left Encoder == Right Encoder | 0 |
| Left |
Left Encoder > Right Encoder | + Counts | |
| Right |
Left Encoder < Right Encode | -- Counts | |
| Rotate |
Left |
Left Encoder < Right Encode | -- Counts |
| Right |
Left Encoder > Right Encoder | + Counts | |
| Stop |
N/A |
Left Encoder == Right Encoder ==
0 |
0 |
| Behavior |
Priority |
Reacts To |
Description |
Pseudo Code |
|---|---|---|---|---|
| Escape |
1 |
Physical contact. |
Uses contact switches on the
front of the robot. As a ballistic behavior, it is an augmented
finite state machine. Upon initial contact, the robot is
commanded to back up for 1 second. Then, to turn left and go
forward for one-half second. Then to go forward to maximum
speed. If the contact repeats within a dead band time frame, the
robot starts a turn in a random direction by a random amount and
selects forward or backwards in a random manner until it is free. |
Behaviors() |
| Steps |
2 |
Light sensors looking down. |
Uses the analog voltage from light sensors mounted on the bottom front of the robot. As a ballistic behavior, it is an augmented finite state machine. Upon detecting a step or an increased distance from the bottom of the robot to a lower reflective surface, the robot stops, spins in place to the left ninety degrees. If the distance has returned to normal, the robot goes forward at full speed. If the distance has not returned to normal, the robot repeats the turn and detection. If the robot does not detect a normal surface after a full turn, it stops and cries for help. | Steps() |
| Distance |
3 |
IR sensors. |
Uses the analog voltage from IR
distance sensors mounted on the front corners of the robot. |
Distance() |
| Boundary |
4 |
Abstract navigation. |
Uses artificial lines from an
initial point. |
Boundary() |
| Sonar |
5 |
Acoustic ranging. |
Uses ranging data from a sonic
distance sensor mounted on the front of the robot. |
Sonar() |
| Xlate |
6 |
Turn and rotate. |
Turns and offsets the robot
position, based on current position and direction parameters. |
Xlate() |
| Navigate |
7 |
Abstract navigation. |
Go from the current position to
a position defined in x-y coordinates. |
Navigate() |
| Cruise |
8 |
Go straight. |
Go straight ahead at full speed. |
Cruise() |
| Prowl |
9 |
Wander around. |
Go in random directions for
random times. |
Prowl() |
| Passive |
10 |
Hide and watch. |
Go to a point of least sensor
detectsion and stop. |
Passive() |
| Task |
Rate |
Priority |
Description | Pseudo Code |
|---|---|---|---|---|
| Behaviors |
Runs at 20 Hz |
6 |
Primary Control task, calls each behavior function, selects the highest priority and passes the command to the motor function. | Behaviors() |
| Datalog |
Runs every 30 seconds |
8 |
Telemetry to a local computer for later analysis of inputs and reactions. | Datalog() |
| Display |
Runs ar 2 Hz |
10 |
Displays selected data on an onboard LCD. | Display() |
| Location |
Runs at 20 Hz |
3 |
Calculates the relative location of a given target. | Location() |
| Odometer |
Runs at 20Hz |
2 |
Calculates the current location relative to the last reset. | Odometer() |
| Health | Runs every 1 minute | 14 |
Checks things like battery
voltage and puts the result in the telemetry stream |
Health() |
| Range | Runs every 50 msec | 4 |
Pulses the sonar and waits for a
return which may take up to 40 msec. |
Range() |
| Trace | If debugging, runs every 50 msec | 15 |
For debugging, as an alternative
to the datalog task, provides a more detailed data stream. |
Trace() |
| adc(channel) |
Return the adc value for the
requested channel |
|
| odometer_reset() |
Resets the odometer.
Future locations are relative to the position when the odometer was
cleared. |
|
| timer_clear() |
Clears the time counter. |
|
| ISR(SIG_OVERFLOW0) |
Interrupts every 1 msec,
incrementing the time counter. Calls AvrXTimerHandler() to
possibly do a context switch. |
|
| motor(*motor_CB) |
The motor_CB argument is the
control block from the highest priority behavior needing
serevice. Use the control block to change the respective motor
PWM and direction values, thus controlling the motion of the robot. |
Motor() |