KIPR Robotics
Controller - Wallaby
1.
Open the 2017 Parts List folder, which contains files that list
all of your Botball robot kit components. Please go through the
lists and verify that you have received everything.
Build the DemoBot.
2.
:1
Page
:2
2 Servo
Motor Ports 2 Motor Ports
(Port # 0 & 1) (Port # 0 & 1)
Page
:3
Download port
(micro USB)
USB
Micro HDMI
Power (external battery
connection)
6 Analog
Sensor Ports
(Port # 0 - 5)
2 Servo
2 Motor Ports Motor Ports
10 Digital
Sensor Ports (Port # 2 & 3) (Port # 2 & 3)
(Port # 0 - 9)
Professional Development Workshop
1993 2017 KIPR
Power Switch
Page
:4
Wallaby Power
Page
It will void your warranty to use a battery pack with the Wallaby that hasnt
been approved by KIPR.
:5
:6
Page
:7
Botball 2017
Professional Development Workshop
Prepared by the KISS Institute for Practical Robotics (KIPR)
with significant contributions from KIPR staff
and the Botball Instructors Summit participants
v2017.01.06-2
Page
:8
Page
:9
Housekeeping
Page
: 10
Workshop Schedule
Day 1
Page
Day 2
Botball Overview
Getting started with the KIPR Software Suite
Explaining the Hello, World! C Program
Designing Your Own Program
Moving the DemoBot with Motors
Fun with Functions
Moving the DemoBot Servos
Repetition, Repetition: Counting
Making Smarter Robots with Sensors
Repetition, Repetition: Reacting
Logical Operators
Resources and Support
Making a Choice
Line-following
Homework
: 11
Page
: 12
Page
: 13
Page
: 14
Botball Overview
What and when?
GCER and ECER
Preview of this years game
Homework for tonight
Page
: 15
What is Botball?
Page
: 16
When is Botball?
2016
FALL
Jan. Mar.
Prof. Dev. workshops.
Recruit teams.
Fundraise.
Apply for scholarships.
Page
: 17
7 9 Weeks
Mar. Jun.
July
2017
Regional tournaments.
Global Conference on
Educational Robotics.
International Botball.
When is Botball?
FALL
2016
Jan. Mar.
Prof. Dev. workshops.
Recruit teams.
Fundraise.
Apply for scholarships.
7 9 Weeks
Mar. Jun.
July
2017
Regional tournaments.
Global Conference on
Educational Robotics.
International Botball.
Page
: 18
When is Botball?
FALL
2016
Jan. Mar.
Prof. Dev. workshops.
Recruit teams.
Fundraise.
Apply for scholarships.
Page
7 9 Weeks
Mar. Jun.
July
2017
Regional tournaments.
Global Conference on
Educational Robotics.
International Botball.
Teams must submit three online project documents, which count for points.
Online support throughout the season from KIPR and other Botball teams.
: 19
When is Botball?
FALL
2016
Jan. Mar.
Prof. Dev. workshops.
Recruit teams.
Fundraise.
Apply for scholarships.
Page
7 9 Weeks
Mar. Jun.
July
2017
Regional tournaments.
Global Conference on
Educational Robotics.
International Botball.
Practice: teams test and calibrate robot entries on the official game boards
Seeding rounds: teams compete against the task to score the most points
Double elimination (DE) rounds: teams compete head-to-head
Alliance matches: teams eliminated in DE pair up to score points together
: 20
When is Botball?
FALL
2016
Jan. Mar.
Prof. Dev. workshops.
Recruit teams.
Fundraise.
Apply for scholarships.
7 9 Weeks
Mar. Jun.
July
Regional tournaments.
Global Conference on
Educational Robotics.
International Botball.
: 21
2017
GCER-2017
Global Conference on Educational Robotics
Norman, Oklahoma
July 8-12, 2017
International Botball Tournament
Autonomous Robotics Showcase
Meet and network with students from
around the country and world
Talks by internationally recognized
robotics experts
Teacher, student, and peer reviewed
track sessions
http://gcer.net
Page
: 22
GCER-2017
Global Conference on Educational Robotics
Preconference classes on July 7th
International Junior Botball Challenge
KIPR Open Autonomous Robotics Game
Botball for grown-up kids!
Autonomous
Aerial
Vehicle
Competition
Page
: 23
ECER-2017
European Conference on Educational Robotics
Sofia Tech Park
Sofia, Bulgaria
April 24-28, 2017
Page
: 24
Page
: 25
Page
: 26
Page
: 27
: 28
: 29
??
?
Computer
Page
: 30
Human
Programming
Language
Computer
Machine
Language
Translates
Page
: 31
1 Put micro
USB end here
1.
2.
Page
: 32
2 Attach
USB to
computer
Once your Wallaby has booted, the Wallaby will appear in the list of
available Ethernet connections for your computer.
If you get a message about the driver raise your hand for help or go to the
team home base- Troubleshooting- USB driver for instructions
Professional Development Workshop
1993 2017 KIPR
Port #
: 33
Page
1.
Use the info (Wallaby # and Pass Word) in the about page to connect via Wi-Fi
: 34
Connection
When you are connected to your Wallaby,
your device may give various errors; no
internet connection or connected with
limited..
In the bottom right corner of the KIPR IDE
there is an icon that shows if you are still
connected to the Wallaby.
connected
Page
: 35
NOT
connected
Port #
: 36
: 37
Page
: 38
Student Name
3.
Page
: 39
2.
Page
: 40
Note: you will have a lot of students projects, so consider using their first
name followed by the name of the activity.
Page
: 41
Page
: 42
Proceed as before.
The Project Explorer panel will show you all of the user folder
projects and actively edited files.
Page
: 43
Page
: 44
Hello, World!
Page
: 45
Begin
Top
Print Hello, World!
Return 0.
End
Bottom
: 46
Source code
Page
: 47
Page
: 48
Block of code
The list of actions that the function takes is defined inside a block of
code.
// Created on Thu January 10 2017
Begin
End
int main()
Block Header
{
printf("Hello, World!\n");
return 0;
}
Page
: 49
Programming statements
Page
: 50
Page
: 51
Page
: 52
Comments
The green text at the top of the program is called a comment.
Page
: 53
Includes in purple
Comments in green
Page
: 54
Flowchart
START
int main()
{
// 1. Print your name.
printf("Botguy\n");
// 2. End the program.
return 0;
Page
: 55
STOP
: 56
Page
: 57
Practice printing
Description: Write a program for the KIPR Wallaby that prints "Hello,
World! on one line, and then prints your name on the next line.
Analysis: What is the program supposed to do?
Flowchart
Begin
Pseudocode
Comments
1.
2.
3.
In English,
write a list of actions
to solve an activity.
Page
: 58
End
Practice printing
Solution: Create a new project, create a new file, and enter your
pseudocode (as comments) and source code in the main function.
Note: remember to give your project and file descriptive (unique) names!
Source Code
int main()
{
// 1. Print Hello, World!
printf("Hello, World!\n");
Pseudocode (Comments)
int main()
{
// 1. Print Hello, World!
// 2. Print your name.
// 3. End the program.
}
: 59
Practice printing
Reflection: What did you notice after you ran the program?
The Wallaby reads code and goes to the next line faster than a blink of your eye.
: 60
Using wait_for_milliseconds
int main()
{
printf("slow ");
wait_for_milliseconds(2500);
printf("printer\n");
return 0;
}
What is this?
Another name for wait_for_milliseconds() is msleep().
It is identical and shorter to type, but more difficult to remember.
msleep(2500) is the same as wait_for_milliseconds(2500).
Page
: 61
Comments
1.
2.
3.
4.
Begin
Print Hello, World!
Wait for 2 seconds.
New!
Page
: 62
End
Note: remember to give your project and file descriptive (unique) names!
Source Code
Pseudocode (Comments)
int main()
{
// 1. Print Hello, World!
// 2. Wait for 2 seconds.
// 3. Print your name.
// 4. End the program.
}
int main()
{
// 1. Print Hello, World!
printf("Hello, World!\n");
// 2. Wait for 2 seconds.
wait_for_milliseconds(2000);
// 3. Print your name.
printf("Botguy\n");
// 4. End the program.
return 0;
: 63
Did your code work the first time you typed it in?
Page
: 64
Debugging Errors
!!! ERROR !!!
The Wallaby will try to tell you where it thinks the error is located.
To test this, remove a ; from one of your programs and compile it.
Page
: 65
Debugging Errors
line # : col # (the error is on or before the line # 6)
expected ; (semicolon)
When there is an error, you can ignore the first error line
(In function main) and read the next to see what
the first error is. If you have a lot of errors, start fixing
them from the top going down. Fix one or two and
recompile.
Page
: 66
Page
: 68
Page
: 69
Page
: 70
Plugging in motors
Motors have red wire and a black wire with a two-prong plug.
The Wallaby has 4 motor ports numbered 0 & 1 on left, and 2 & 3 on right.
When a port is powered (receiving motor commands), it has a light that glows
green for one direction and red for the other direction.
Plug orientation order determines motor direction.
By convention, green is forward (+) and red is reverse ().
Motor Port #2
Motor Port #3
Page
: 71
Plugged in motors
Page
: 72
Motor direction
You want your motors going in the same direction;
otherwise, your robot will go in circles!
Motors have red wire and a black wire with a two-prong plug.
There is no left side or right side.
You can plug these in two different ways:
1 2
Page
: 73
2 1
Manually rotate the tire, and you will see an LED light up by the motor port
(the port # is labeled on the board).
If the LED is green, it is going forward (+).
If the LED is red, it is going reverse ().
Use this trick to check the port #s and direction of your motors.
If one is red and the other is green,
turn one motor plug 180 and plug it back in.
The lights should both be green if the robot is moving forward.
Page
: 74
Page
: 75
motor(0, 100);
A positive number should drive
// Turns on motor port #0 at 100% power.
the motor forward; if not,
// Select any power between -100% and 100%. rotate the motor plug 180.
wait_for_milliseconds(# milliseconds);
// Wait for the specified amount of time.
ao();
// Turn off all of the motors.
Page
: 76
int main()
{
motor(0, 100);
wait_for_milliseconds(2500);
ao();
return 0;
}
Page
: 77
Page
: 78
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
Page
: 79
Flowchart
Begin
Pseudocode
1.
2.
3.
4.
Comments
3. Stop motors.
4. End the program.
Stop motors.
Return 0.
End
Page
: 80
Note: remember to give your project and file descriptive, unique names!
Source Code
Psuedocode (Comments)
int main()
{
// 1. Drive forward at 80%.
// 2. Wait for 2 seconds.
// 3. Stop motors.
// 4. End the program.
}
int main()
{
// 1. Drive forward at 80%.
motor(0, 80);
motor(3, 80);
// 2. Wait for 2 seconds.
wait_for_milliseconds(2000);
// 3. Stop motors.
ao();
// 4. End the program.
return 0;
}
: 81
How could you adjust the code to make the robot drive straight?
Professional
Development
Workshop
How can you make the robot
turn left
or right?
Page
: 82
Forward
Making turns:
Page
: 83
Page
: 84
Page
: 85
Page
: 86
Servos
A servo motor (or servo for short) is a motor that rotates to a specified
position between 0 and 180.
Servos are great for raising an arm or closing a claw to grab something.
Servo motors look very similar to non-servo motors, but there are differences
A servo has three wires (orange, red, and brown) and a black plastic plug.
A non-servo motor has two gray wires and a two-prong plug.
Large servo
Small servo
Page
: 87
Page
: 88
Plugging in Servos
The KIPR Robotics Controller has 4 servo ports numbered 0 (left) & 1 (right) on
the left, and 2 (left) & 3 (right) on the right.
Notice that the case of the KIPR Robotics Controller is marked:
(S) for the orange (signal) wire, which regulates servo position
(+) for the red (power) wire
() for the brown (ground) wire (the ground is down, down is negative)
(S) signal wire
(+) power wire
() ground wire
Servo Port #3
Servo Port #2
Page
: 89
Servo positions
Angles in the 180 range of motion (between 0 and 180) are divided into
2048 servo positions.
These 2048 positions range from 0 to 2047, but due to internal mechanical
hard stop variability you should use 150 to 1900
(remember: computer scientists start counting with 0, not 1).
This allows for greater precision when setting a position
(you have 2048 different positions you can choose from instead of just 180).
1024
150
1900
0
Page
: 90
2047
Professional Development Workshop
1993 2017 KIPR
Page
: 91
The current
servo position
Enable
servos
Page
: 92
Servo @ 2047
(maxed out)
Servo @ 1513
: 93
Servo @ 537
Servo functions
To help save power, servo ports by default are not active until they are
enabled.
Functions are provided for enabling or disabling all servo ports.
A function is also provided for setting the position of a servo.
enable_servos();
set_servo_position(2, 925);
disable_servos();
Page
int main()
{
enable_servos();
wait_for_milliseconds(1000);
set_servo_position(2, 925);
wait_for_milliseconds(1000);
set_servo_position(2, 675);
disable_servos();
return 0;
}
Page
: 95
Page
: 96
Page
: 97
Comments
1.
2.
3.
4.
5.
6.
7.
// 1. Enable servos.
Page
Enable servos.
Move servo to YOUR limit.
Wait for 3 seconds.
Move servo to YOUR other limit.
Wait for 3 seconds.
Disable servos.
End the program.
: 98
// 6. Disable servos.
// 6. End the program.
Flowchart
Begin
Enable servos.
Move servo to YOUR limit.
Page
: 99
Professional Development
Workshop
End
1993 2017 KIPR
Lunch!
Page
: 100
Page
: 101
Page
: 102
Draw a square
Description: Write a program for the KIPR Wallaby that drives the
DemoBot along a path in the shape of a square.
Page
: 103
Draw a square
Analysis: What is the program supposed to do?
Flowchart
Begin
Pseudocode
Comments
Drive forward.
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
// 1. Drive forward.
Turn right 90
Drive forward.
// 3. Drive forward.
Turn right 90
Drive forward.
Turn right 90.
Drive forward.
Turn right 90.
Drive forward.
Turn right 90.
Drive forward.
Turn right 90.
Stop motors.
End the program.
Drive forward.
// 5. Drive forward.
Turn right 90
Drive forward.
Turn right 90
// 9. Stop motors.
Stop motors.
Return 0.
End
Page
: 104
Draw a square
int main()
{
// 1. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
Solution:
// 3. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
// 4. Turn right 90-degrees.
motor(0, 100);
motor(3, -100);
wait_for_milliseconds(1500);
// 5. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
// 6. Turn right 90-degrees.
motor(0, 100);
motor(3, -100);
wait_for_milliseconds(1500);
// 7. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
Page
: 105
Page
: 106
Draw a square
Drive forward.
Reflection:
Notice there are many repeated steps.
For example:
// Drive forward.
motor(0, 100);
motor(0, 100);
wait_for_milliseconds(4000);
Turn
right.
Drive forward.
Turn
right.
Drive forward.
You will quickly learn to use copy-andpaste over and over again, but there is a
better and easier way
Learning to write your own functions
allows you to reuse code easily!
Turn
right.
int main()
{
// 1. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
// 2. Turn right 90-degrees.
motor(0, 100);
motor(3, -100);
wait_for_milliseconds(1500);
// 3. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
// 4. Turn right 90-degrees.
motor(0, 100);
motor(3, -100);
wait_for_milliseconds(1500);
// 5. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
// 6. Turn right 90-degrees.
motor(0, 100);
motor(3, -100);
wait_for_milliseconds(1500);
Drive forward.
// 7. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
Turn
right.
Page
: 107
Functions are very helpful if you take some actions multiple times:
Page
We made these up
and thats the point!
You can write your
own functions to do
whatever you want!
Functions often make it easier to (1) read the main function, and
(2) change distance, turning, timing, or other values if necessary.
: 108
Page
void drive_forward();
int main()
{
drive_forward();
return 0;
} // end main
void drive_forward()
// function definition
{
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
ao();
} // end drive_forward
: 109
// function prototype
// function call
void is a data
type, we will
talk about data
types later
Function definitions
go below main.
Page
: 110
void drive_forward();
int main()
{
drive_forward();
return 0;
} // end main
// function prototype
// function call
void drive_forward()
// function definition
{
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
ao();
} // end drive_forward
definition
Page
: 111
void drive_forward();
// function prototype
int main()
{
drive_forward();
return 0;
} // end main
// function call
void drive_forward()
// function definition
{
motor(0, 100);
Notice: no semicolon!
motor(3, 100);
wait_for_milliseconds(4000);
(Why not?)
ao();
} // end drive_forward
int main()
{
drive_forward();
return 0;
} // end main
// function prototype
void drive_forward()
// function definition
{
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
ao();
} // end drive_forward
Neither the function prototype nor the function definition tell the
computer when to use the function. That is the job of the function call
Page
: 112
int main()
{
drive_forward();
return 0;
} // end main
// function prototype
void drive_forward()
// function definition
{
motor(0, 100);
The program then executes
motor(3, 100);
all of the lines of code in the
wait_for_milliseconds(4000);
block of code.
ao();
} // end drive_forward
Page
: 113
// function prototype
int main()
{
drive_forward();
return 0;
} // end main
// function call
void drive_forward()
// function definition
{
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
This is the end } of the
ao();
function definition.
} // end drive_forward
Page
: 114
int main()
{
drive_forward();
turn_right();
return 0;
} // end main
Page
: 115
void turn_right()
// turn_right function definition
{
motor(0, 100);
motor(3, -100);
wait_for_milliseconds(1500);
ao();
} // end turn_right Professional Development Workshop
1993 2017 KIPR
Page
Hint: modify your old square-drawing program to use your own functions.
Break the task down into common subtasks these become your functions!
: 116
int main()
{
// 1. Drive forward.
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
// Stop motors.
ao();
} // end drive_forward_and_turn_right
ao();
// 9. Stop motors.
return 0; // 10. End the program.
} // end main
Page
: 117
Draw a square
Reflection:
1.
2.
Page
: 118
Page
: 119
wave()
1.
2.
3.
4.
5.
6.
Enable servos.
Move servo to YOUR limit.
Wait for 3 seconds.
Move servo to YOUR other limit.
Wait for 3 seconds.
Disable servos.
Solution:
int main()
{
wave(); // function call
return 0;
} // end main
Comments
void
{
//
//
//
//
//
//
}
wave()
1.
2.
3.
4.
5.
6.
Source Code
Enable servos.
Move servo to YOUR limit.
Wait for 3 seconds.
Move servo to YOUR other limit.
Wait for 3 seconds.
Disable servos.
void wave()
{
// 1. Enable servos.
enable_servos();
// 2. Move servo to YOUR limit.
set_servo_position(0, 1400);
// 3. Wait for 3 seconds.
wait_for_milliseconds(3000);
// 4. Move servo to YOUR other limit.
set_servo_position(0, 1024);
// 5. Wait for 3 seconds.
Use YOUR
wait_for_milliseconds(3000);
// 6. Disable servos.
servo limits!
disable_servos();
}
: 120
: 121
Variables
int my_cup;
my_cup = 3;
Page
: 122
Variable names
Each variable is given a unique name so we can identify it
An Example:
// Variable to keep a count of events.
int my_variable;
// variable declaration
my_variable = 0;
// variable initialization
Page
: 123
Variables
You can set the value to any integer you choose.
Page
: 124
int my_cup;
my_cup = 3;
int my_cup;
my_cup = 4;
my_cup
my_cup
Variables
int my_cup;
my_cup = 3;
my_cup = my_cup + 1; // now my_cup is equal to 4
my_cup
Page
: 125
my_cup
Remember This?
When you
call this
function,
how long
will it run
for?
void drive_forward();
// function prototype
int main()
{
drive_forward();
return 0;
}
// function call
void drive_forward()
// function definition
{
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
ao();
}
What if you dont want it to run for this long each time?
Page
: 126
Function arguments: values you will set when you call the
function
// function prototype
int main()
{
drive_forward(4000);
return 0;
} // end main
// function call
Page
: 127
int main()
{
drive_forward(4000);
return 0;
} // end main
// function prototype
// function call
Page
: 128
int main()
{
drive_forward(4000);
return 0;
} // end main
// function prototype
// function call
Page
: 129
int main()
{
drive_forward(80, 4000);
return 0;
}
// function prototype
// function call
Page
: 130
Page
: 131
Begin
Wave Arm.
Pseudocode
Comments
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
//
1. Wave Arm.
//
2. Wave Arm.
//
3. Wave Arm.
//
4. Wave Arm.
//
5. Wave Arm.
//
6. Wave Arm.
//
7. Wave Arm.
//
8. Wave Arm.
Wave Arm.
//
9. Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
End the program.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
End
Page
: 132
You could copy-and-paste lines of code, but it would take a very long time
There has got to be a better way!
(And there is!)
Page
: 133
Page
: 134
Begin
Wave Arm.
Set counter to 0.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
VS
NO
Is
counter
< 10?
YES
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Add 1 to counter.
Wave Arm.
Wave Arm.
Return 0.
Return 0.
End
End
Page
: 135
Wave Arm.
Begin
Set counter to 0.
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
VS
NO
Is
counter
< 10?
YES
Wave Arm.
Wave Arm.
Wave Arm.
Wave Arm.
Add 1 to counter.
Wave Arm.
Wave Arm.
Return 0.
Return 0.
End
End
Page
: 136
while loops
The while loop checks to see if a Boolean test is true or false
If the test is true, then the while loop continues to execute the block of code that immediately
follows it.
If the test is false, then the while loop finishes, and the line of code after the block of code is
executed.
int main()
{
// Code before loop ...
while (Boolean test) // Loop
{
// Code to repeat ...
}
// Code after loop ...
return 0;
}
Page
: 137
while loops
The while loop checks to see if a Boolean test is true or false
If the test is true, then the while loop continues to execute the block of code that immediately
follows it.
If the test is false, then the while loop finishes, and the line of code after the block of code is
executed.
int main()
{
// Code before loop ...
while (Boolean test)
{
// Code to repeat ...
}
Begin
End
Page
: 138
Block Header
(no semicolon!)
Page
: 139
==
!=
<
>
<=
>=
Page
Boolean
English Question
True Example
False Example
A == B
Is A equal to B?
5 == 5
5 == 4
A != B
Is A not equal to B?
5 != 4
5 != 5
A < B
Is A less than B?
4 < 5
5 < 4
A > B
Is A greater than B?
5 > 4
4 > 5
A <= B
4 <= 5
5 <= 5
6 <= 5
A >= B
5 >= 4
5 >= 5
5 >= 6
: 140
3.
4.
Page
: 141
Comments
// 1. Set Variable side_counter to 0.
//
//
// 3. Stop motors.
// 4. End the program.
Begin
Set side_counter to 0.
Boolean Test
YES
NO
Drive forward.
Add 1 to side_counter.
Stop motors.
Return 0.
End
Page
: 142
Boolean Test
side_counter is < 4?
Source Code
int main()
{
int side_counter = 0; // declare and
//initialize variable all in one line
Comments
int main()
{
// 1. Set side_counter to 4.
// 2. Loop: Is side_counter < 4?
//
2.1. Drive forward.
//
2.2. Turn right 90-degrees.
//
2.3. Add 1 to side_counter.
// 3. Stop motors.
// 4. End the program.
}
}
ao();
return 0;
}
Page
: 143
void drive_forward_and_turn_right();
int main()
{
int side_counter = 0 ;
// loop exits when side counter = 4
while (side_counter < 4)
{
drive_forward_and_turn_right();
Comments
int main()
{
// 1. Set side_counter to 4.
// 2. Loop: Is side_counter < 4?
//
2.1. Drive forward.
//
2.2. Turn right 90-degrees.
//
2.3. Add 1 to side_counter.
// 3. Stop motors.
// 4. End the program.
}
side_counter = side_counter + 1;
}
ao();
return 0;
}
void drive_forward_and_turn_right()
{
motor(0, 100);
motor(3, 100);
wait_for_milliseconds(4000);
motor(0, 100);
motor(3, -100);
wait_for_milliseconds(1500);
ao();
}
Page
: 144
Remember to enable the servos at the beginning of your program, and disable the
servos at the end of your program!
5.
6.
Page
Comments
//
//
Disable servos.
End the program.
// 5. Disable servos.
: 145
Begin
Enable servos.
Is counter <
1800
NO
YES
Page
: 146
Solution:
int main()
{
int counter = 200;
set_servo_position(0, counter);
Comments
enable_servos();
int main()
{
// 1. Set counter to 200.
// 2. Set servo position to counter.
// 3. Enable servos.
// 4. Loop: Is counter < 1800?
//
4.1. Wait for 0.1 seconds.
//
4.2. Add 100 to counter.
//
4.3. Set servo position to counter.
// 5. Disable servos.
// 6. End the program.
}
return 0;
Page
: 147
}
Professional Development Workshop
1993 2017 KIPR
Page
: 148
Sensors
Page
: 149
Digital Sensors
Range of values:
0 4095
analog(port #)
Sensors:
Page
Ports: 0 5
Function:
: 150
Range of values:
Light
Small reflectance
Large reflectance
Ports: 0 9
Function:
digital(port #)
Sensors:
Large touch
Small touch
Lever touch
Slide sensor
Sensor Plug
Orientation
Digital Sensor
Ports # 0 9
Page
: 151
Analog Sensor
Ports # 0-5
right_button()
left_button()
Page
: 152
int main()
{
// Has R button been touched?
while(
)
{
printf(Press the R Button!\n");
}
: 153
R button
wait_for_light(3);
// Waits for the light on port #3 before going to the next line.
wait_for_touch(8);
// Waits for the touch on port #8 before going to the next line.
Page
: 154
Using wait_for_light
What is this?
int main()
{
wait_for_light(0);
printf("I see the light!\n");
return 0;
}
Page
: 155
Page
Note: It has a built-in calibration routine that will come up on the screen
(a step-by-step guide for this calibration routine is on a following slide).
The more light (infrared) detected, the lower the reported value.
: 156
Digital Sensor
Ports # 0 9
Analog Sensor
Ports # 0-5
Page
: 157
Page
: 158
Page
: 159
Comments
1.
2.
3.
4.
5.
// 2. Drive forward.
// 3. Wait for 3 seconds.
Stop motors.
// 4. Stop motors.
// 5. End the program.
Return 0.
End
Page
: 160
Page
: 161
int main()
{
wait_for_light(0);
motor(0, 100); //forward
motor(3, 100);
wait_for_milliseconds(3000);
ao();
return 0;
}
: 162
void drive_forward();
int main()
{
wait_for_light(0);
Comments
int main()
{
// 1. Wait for light.
// 2. Drive forward.
// 3. Wait for 3 seconds.
// 4. Stop motors.
// 5. End the program.
}
drive_forward();
wait_for_milliseconds(3000);
ao();
return 0;
}
void drive_forward()
{
motor(0, 100);
motor(3, 100);
}
: 163
Detecting touch
wait_for_touch(port #);
Digital Port #0 9
There are many digital sensors in your kit that can detect touch
Large touch
Small touch
Lever touch
Select the one that can be easily attached and can easily detect the objects.
Page
: 164
Using wait_for_touch
What is this?
int main()
{
wait_for_touch(8);
printf("Im touched!\n");
return 0;
}
Page
: 165
Page
: 166
Flowchart
Begin
Pseudocode
Comments
1.
2.
3.
4.
// 1. Drive forward.
Drive forward.
Wait for touch.
Stop motors.
End the program.
Drive forward.
Wait for touch.
// 3. Stop motors.
// 4. End the program.
Stop motors.
Return 0.
End
Page
: 167
Comments
int main()
{
// 1. Drive forward.
// 2. Wait for touch.
// 3. Stop motors.
// 4. End the program.
}
int main()
{
motor(0, 100);
motor(3, 100);
wait_for_touch(8);
ao();
return 0;
}
: 168
Comments
int main()
{
// 1. Drive forward.
// 2. Wait for touch.
// 3. Stop motors.
// 4. End the program.
}
Source Code
void drive_forward();
int main()
{
drive_forward();
wait_for_touch(8);
ao();
return 0;
}
void drive_forward()
{
motor(0, 100);
motor(3, 100);
}
: 169
Page
: 170
Page
: 171
Remember loops?
Page
: 172
Page
: 173
Page
: 174
int main()
{
while (digital(8) == 0)
{
motor(0, 100);
motor(3, 100);
}
ao();
return 0;
}
while (digital(15) == 0)
{
// Code to repeat ...
}
while (digital(15) == 0)
{
// Code to repeat ...
}
while (analog(3) < 512)
{
// Code to repeat ...
}
while (countdown >= 1)
{
// Code to repeat ...
}
Page
: 175
Comments
1.
2.
3.
4.
// 1. Drive forward.
Page
Drive forward.
Loop: Is not touched?
Stop motors.
End the program.
: 176
NO
Is not
touched?
YES
Drive forward.
Stop motors.
Return 0.
End
Page
: 177
Comments
int main()
{
// 1. Loop: Is not touched?
//
1.1. Drive forward.
// 2. Stop motors.
// 3. End the program.
}
int main()
{
while (digital(8) == 0)
{
motor(0, 100);
motor(3, 100);
}
ao();
return 0;
}
Page
: 178
Making a Choice
Program flow control with conditionals
if-else conditionals
if-else and Boolean operators
Using while and if-else
Page
: 179
Page
: 180
This is similar to the loop, but differs in that it only executes once.
Begin
Is it
touched?
YES
Print Touched!
NO
End
Page
: 181
Is it
touched?
YES
Print Pressed!
NO
End
Page
: 182
Pseudocode
Comments
1.
//
2.
3.
If: Is touched?
1. Print Touched!.
Else.
1. Print Not touched!.
End the program.
//
//
//
//
1. If: Is touched?
1.1. Print Touched!.
2. Else.
2.1. Print Not touched!.
3. End the program.
Page
: 183
if-else conditionals
The if-else conditional checks to see if a Boolean test is true or false
If the test is true, then the if conditional executes the block of code that immediately follows it.
If the test is false, then the if conditional does not execute the block of code, and the else block of
code is executed instead.
int main()
{
if (Boolean test)
{
// Code to execute ...
}
else
{
// Code to execute ...
}
return 0;
}
Page
: 184
Page
: 185
int main()
{
if (digital(8) == 1)
{
printf(Touched!\n");
}
else
{
printf(Not touched!\n");
}
return 0;
}
Page
: 186
Notice: no semicolon!
(Why not?)
if-else conditionals
int main()
{
// Code before conditional ...
if (Boolean test)
{
// Code to execute if test is true
}
else
{
// Code to execute if test is false
}
return 0;
}
Page
: 187
if-else examples
if (right_button() == 0)
{
// Code to execute ...
}
else
{
// Code to execute ...
}
if (analog(3) < 512)
{
// Code to execute ...
}
else
{
// Code to execute ...
}
Page
: 188
int main()
{
while (right_button() == 0)
{
if (analog(0) > 512)
{
printf("Its dark in here!\n");
}
else
{
printf("I see the light!\n");
}
} // loop ends when button is pressed
return 0;
}
Page
: 189
What do these
lines of code say?
Note the ==
(2 equal signs)
Page
: 190
int main()
{
while (right_button() == 0)
{
if (analog(0) > 512)
{
printf("Its dark in here!\n");
}
else
{
printf("I see the light!\n");
}
} // loop ends when button is pressed
return 0;
}
Page
: 191
Sensor Plug
Orientation
Surface
Analog Sensor
Ports # 0 5
Page
: 192
View sensor values from the Sensor List on your KIPR Wallaby.
This is very helpful to view readings from all of the sensors you are using.
You can view the values, then use them in your code.
Page
: 193
Sensor Ports
Professional Development Workshop
1993 2017 KIPR
Sensor Values
Value of 3863
(Black Surface)
Page
: 194
Value of 156
(White Surface)
Page
: 195
Page
: 196
Line-following
Analysis: Flowchart
Begin
Is not
pressed?
NO
YES
YES
Is dark
detected?
Turn/arc left.
NO
Turn/arc right.
Stop motors.
Return 0.
End
Page
: 197
Pseudocode (Comments)
int main()
{
// 1. Loop: Is not pressed?
//
1.1. If: Is dark detected?
//
1.1.1. Turn/arc left.
//
1.2. Else:
//
1.2.1. Turn/arc right.
// 2. Stop motors.
// 3. End the program.
}
void turn_left();
void turn_right();
int main()
{
while (right_button() == 0)
{
if (analog(0) > 512)
{
turn_left();
}
else
{
turn_right()
}
}
ao();
return 0;
}
void turn_left()
{
motor(0, 20);
motor(3, 100); // Turn/arc left.
}
Page
: 198
void turn_right()
{
motor(0, 100);
motor(3, 20); // Turn/arc right.
Professional Development Workshop
}
Homework
Game review
Game strategy
Workshop survey
Page
: 199
Page
: 200
: 201
Page
: 202
Page
: 203
Page
: 204
Welcome back!
Please take our survey to give feedback about the workshop:
https://www.surveymonkey.com/r/LCYB7RY
Botball 2017
Professional Development Workshop
Prepared by the KISS Institute for Practical Robotics (KIPR)
with significant contributions from KIPR staff
and the Botball Instructors Summit participants
v2017.01.06-2
Page
: 205
Workshop Schedule
Day 1
Page
Day 2
Botball Overview
Getting started with the KISS IDE
Explaining the Hello, World! C Program
Designing Your Own Program
Moving the DemoBot with Motors
Fun with Functions
Moving the DemoBot Servos
Repetition, Repetition: Counting
Making Smarter Robots with Sensors
Repetition, Repetition: Reacting
Logical Operators
Resources and Support
Making a Choice
Line-following
Homework
: 206
: 207
NOW!
You have 30 minutes
Page
: 208
Page
: 209
Ideas on construction
Note: our competition tables are built
to specifications with allowable variance.
Page
For example: the specified height of the elevated platform is 15-3/4, but at
the tournament the platform could actually measure 15-7/8. If your arm is
set for exactly 15-3/4, it would not work.
Documentation
What?
When?
Why?
: 211
Page
See the Team Homebase for a document covering all changes made in regards
to Hardware, Rules, the Wallaby, Software, and Documentation.
: 212
Tournament templates
int main() // for your Create robot
{
create_connect();
wait_for_light(0); // change the port number to match the port you use
shut_down_in(119); // shut off the motors and stop the robot after 119 seconds
// Your code
create_disconnect();
return 0;
}
Page
: 213
Page
This function call should come immediately after the wait_for_light() in your code.
If you do not have this function in your code, your robot will not automatically turn off
its motors at the end of the Botball round and you will be disqualified!
: 214
Comments
1.
2.
3.
4.
5.
6.
Page
: 215
Flowchart
START
STOP
Page
: 216
Source Code
Pseudocode (Comments)
int main()
{
wait_for_light(0);
int main()
{
// 1. Wait for light.
// 2. Shut down in 5 seconds.
// 3. Drive forward.
// 4. Wait for touch.
// 5. Stop motors.
// 6. End the program.
}
shut_down_in(5);
motor(0, 100);
motor(3, 100);
wait_for_touch(8);
ao();
return 0;
}
: 217
Page
: 218
What happens if the touch sensor is pressed in less than 5 seconds after
starting the program?
What happens if the touch sensor is not pressed in less than 5 seconds after
starting the program?
What is the best way to guarantee that your program will start with the light in
a Botball tournament round? (Answer: wait_for_light())
What is the best way to guarantee that your program will stop within 120
seconds in a Botball tournament round? (Answer: shut_down_in())
: 219
Page
: 220
get_motor_position_counter(3)
OR
gmpc(3)
// Tells us the number of ticks the motor on port #3 has rotated.
// Note: gmpc is shorthand for get_motor_position_counter.
Motor Port #
(#0 3)
clear_motor_position_counter(3);
OR
cmpc(3);
// Resets the tick counter to 0 for the motor on port #3.
// Note: cmpc is shorthand for clear_motor_position_counter.
Page
Page
: 222
Comments
1.
2.
3.
4.
// 3. Stop motors.
// 4. End the program.
Why
14000?
Page
: 223
int main()
{
// 1. Reset motor position counters.
clear_motor_position_counter(0);
clear_motor_position_counter(3);
// 2. Loop: Is counter < 14000?
if (get_motor_position_counter(0) < 14000)
{
// 2.1 Drive forward.
motor(0, 100);
motor(3, 100);
}
ao(); // 3. Stop motors.
return 0; //4. End the program.
}
Page
: 224
How far did the robot travel? Was it always the same?
How could you modify your program to travel a specific distance in millimeters?
(Hint: Consider writing a function with an argument for the distance.)
How could you modify your program to accurately turn left or right?
Page
: 225
Drive Straight!
Description: Write a program for the KIPR Wallaby that drives the
DemoBot straight for 14000 tics by adjusting the left motor power so that
the position of the left motor is the same (or close) to the right.
Analysis: How can you adjust the left motors position?
Pseudocode
1.
2.
2.
3.
4.
Page
Comments
Stop motors.
End the program.
: 226
// 3. Stop motors.
// 4. End the program.
Professional Development Workshop
1993 2017 KIPR
Drive Straight!
Solution:
Source Code
Pseudocode (Comments)
int main()
{
// 1. clear both motor counters
clear_motor_position_counter(0); // left motor
cmpc(3); // right motor (shorter name)
// 2. Loop: check right position.
while(get_motor_position_counter(3) < 14000)
{
// 2.1 power right motor at 75%
motor(3, 75);
int main()
{
// 1. clear both motor counters.
// 2. Loop: check right position
//
2.1. power right motor at 75%.
//
2.2. compare left to right counters.
//
2.2.1. slower: left motor at 100%.
//
2.1.2. faster: left motor at 50%.
// 3. Stop motors.
// 4. End the program.
}
ao(); // 3. Stop motors.
return 0; // 4. End the program.
}
Page
: 227
Drive Straight
Reflection: What did you notice after you ran the program?
How could you use this technique whenever you wanted to drive straight?
(Hint: Consider writing a function with an argument for the distance.)
Page
: 228
Measuring Distance
Page
: 229
For this activity, you will need the infrared ET distance sensor.
There is both an infrared (IR) emitter and an IR detector inside of this sensor.
The sensor works by sending out an IR beam and then measures the angle the
reflected IR light returns at and triangulates the distance to an object.
Page
Sensor Plug
Orientation
Analog Sensor
Ports # 0 5
Page
: 231
Analog Sensor
Ports 5
Page
: 232
3
Professional Development Workshop
1993 2017 KIPR
ET distance grabbing
To get sensor readings from the ET distance sensor,
you must call the analog function:
analog(5) // Get a reading from analog port #5.
Page
: 233
Values are not reliable beyond these distances, though they appear to be!
Notice: no semicolon!
(Why not?)
Remember
Lower values farther distances.
Higher values closer distances.
Page
: 234
Maintain distance
Description: Write a program for the KIPR Wallaby that makes the
DemoBot maintain a specified distance away from an object, and stops
when the touch sensor is touched.
Analysis: What is the program supposed to do?
Pseudocode
1.
Comments
// 1. Loop: Is not touched?
//
//
//
Page
Stop motors.
End the program.
: 235
1.2. Else.
1.2.1. If: Is distance too close?
1.2.1.1. Drive reverse.
//
1.2.2. Else.
// 2. Stop motors.
// 3. End the program.
Maintain distance
Source Code
Solution:
Comments
int main()
{
// 1. Loop: Is not touched?
//
1.1. If: Is distance to far?
//
1.1.1. Drive forward.
//
1.2. Else.
//
1.2.1. If: Is distance too close?
//
1.2.1.1. Drive reverse.
//
1.2.2. Else.
//
1.2.2.1. Stop motors.
// 2. Stop motors.
// 3. End the program.
}
Page
: 236
int main()
{
while (digital(0) == 0)
{
// 1.1. Is distance too far?
if (analog(5) < 475)
{
motor(0, 100);
motor(3, 100);
}
else // sensor value is 475 or greater
{
// 1.2.1. If: Is distance too close?
if (analog(5) > 525)
{
motor(0, -100);
motor(3, -100);
}
else // sensor value is 475-525
{
ao();
}
}
}
ao();
return 0;
Professional Development
} Workshop
1993 2017 KIPR
Page
: 237
Page
: 238
Create
Underside
Page
: 239
Remove this
Page
: 240
Serial
Port
Professional Development Workshop
1993 2017 KIPR
Page
: 241
Flowchart
Begin
Connect to Create
End
Page
: 242
Examples:
create_drive_direct(100, 100);
create_drive_direct(-200, 200);
create_drive_direct(150, -150);
create_stop();
WARNING: the maximum speed for the Create motors is 500 mm/second = 0.5 m/second.
It can jump off a table in less than one second!
Use something like 200 for the speed (moderate speed) until teams get the hang of this.
Page
: 243
int main()
{
create_connect();
create_drive_direct(200, 200);
wait_for_milliseconds(5000);
create_stop();
create_disconnect();
return 0;
}
Page
: 244
Comments
1.
2.
3.
4.
5.
6.
// 1. Connect to Create.
Page
Connect to Create.
Drive forward at 100 mm/sec.
Wait for 4 seconds.
Stop motors.
Disconnect from Create.
End the program.
: 245
Flowchart
Begin
Connect to Create.
Drive forward at 100 mm/sec.
Return 0.
End
Page
: 246
Solution:
int main()
{
// 1. Connect to Create.
create_connect();
Comments
int main()
{
// 1. Connect to Create.
// 2. Drive forward at 100 mm/sec.
// 3. Wait for 4 seconds.
// 4. Stop motors.
// 5. Disconnect from Create.
}
// 5. Disconnect from Create.
create_disconnect();
return 0;
}
: 247
Starting line
iRobot
Create
Object
Starting line
Object
iRobot
Create
Page
: 248
Starting line
iRobot
Create
Object
Page
: 249
get_create_distance()
// Tells us the distance the Create has traveled in mm.
set_create_distance(0);
// Resets the Create distance traveled to 0 mm.
get_create_total_angle()
// Tells us the total angle the Create has turned in degrees.
// Positive angles are to the left. Negative angles are to the right.
set_create_total_angle(0);
// Resets the Create angle turned to 0 degrees.
Page
: 250
Page
: 251
Page
: 252
Page
: 253
Page
: 254
Notice:
the signs changed!
Page
: 255
lclightbump
cwdrop
rfcliff
lfcliff
rbump
lbump
rlightbump
rcliff
llightbump
battery_capacity
rwdrop
: 256
lcliff
lwdrop
distance
Page
lflightbump
total_angle
Professional Development Workshop
1993 2017 KIPR
: 257
Page
: 258
Comments
1.
2.
// 1. Connect to Create.
3.
4.
5.
Page
Connect to Create.
Loop: Is not bumped?
1. Drive forward.
Stop motors.
Disconnect from Create.
End the program.
: 259
// 3. Stop motors.
// 4. Disconnect from Create.
// 5. End the program.
Begin
Connect to Create.
NO
Is not
bumped?
YES
Drive forward.
Stop motors.
Return 0.
End
Page
: 260
Comments
int main()
{
// 1. Connect to Create.
// 2. Loop: Is not bumped?
//
2.1. Drive forward.
// 3. Stop motors.
// 4. Disconnect from Create.
// 5. End the program.
}
Page
: 261
Page
: 262
Page
: 263
LUNCH
Please take our survey to give feedback about the workshop:
https://www.surveymonkey.com/r/LCYB7RY
Page
: 264
Color Camera
Using the color camera
Setting the color tracking channels
About color tracking
Camera functions
Page
: 265
Color camera
For this activity, you will need the black camera.
The camera plugs into one of the USB (type A) ports on the back of the Wallaby.
Warning: Unplugging the camera while it is being accessed can freeze the
Wallaby, requiring it to be rebooted.
USB Ports
Page
: 266
1
Page
: 267
3
Note: if there is more than one configuration, select one, and
press the Default button to make it be the one in use!
Page
: 268
6
Page
: 269
9
10
Page
: 270
1
2
Page
: 272
(80, 0)
0, 1, 2,
(largest to smallest)
(159, 0)
Channel #
Left
(0, 119)
Page
: 273
Right
(80, 119)
get_object_center_x(0, 0);
// The x-value of the tracked object.
// Note: number between 0 and 159.
(159, 119)
Professional Development Workshop
1993 2017 KIPR
Camera functions
camera_open();
// Opens the connection to the camera.
camera_close();
// Closes the connection to the camera.
camera_update();
// Gets a new picture (image) from the camera and performs color tracking.
get_object_count(channel #)
// The number of objects being tracked on the specified color channel.
get_object_center_x(channel #, object #)
// The center x (column) coordinate value of the object # on the color channel.
get_object_center_y(channel #, object #)
// The center y (row) coordinate value of the object # on the color channel.
Page
: 274
Page
: 275
Page
: 276
Page
: 277
Logical Operators
Multiple Boolean tests
while, if, and Logical operators
Page
: 278
Logical operators
Recall the Boolean test for while loops and if-else conditionals
while (Boolean test)
if (Boolean test)
&&
||
!
And
Or
Not
Page
Boolean
A && B
A || B
!(A && B)
!(A || B)
English Question
True Example
False Example
true || true
false || true
true || false
false || false
false || false
true || true
false || true
true || false
: 280
Page
: 281
Page
: 282
Pseudocode
1.
2.
3.
4.
5.
Page
Comments
Connect to Create.
Loop: Is distance < 1000 AND not bumped?
1. Drive forward.
Stop motors.
Disconnect from Create.
End the program.
: 283
// 1. Connect to Create.
// 2. Loop: Is distance < 1000 AND not bumped?
//
// 3. Stop motors.
Begin
Connect to Create.
NO
Is distance <
1000
AND not
bumped?
YES
Drive forward.
Stop motors.
Return 0.
End
Page
: 284
Pseudocode (Comments)
int main()
{
// 1. Connect to Create.
// 2. Loop: Is distance < 1000
//
AND not bumped?
//
2.1. Drive forward.
// 3. Stop motors.
// 4. Disconnect from Create.
// 5. End the program.
}
int main()
{
// 1. Connect to Create.
create_connect();
// 2. Loop: Is distance < 1000 AND not bumped?
while ((get_create_distance() < 1000) && (get_create_rbump() == 0))
{
// 2.1. Drive forward.
create_drive_direct(200, 200);
} // end while
// 3. Stop motors.
create_stop();
// 4. Disconnect from Create.
create_disconnect();
// 5. End the program.
return 0;
} // end main
Page
: 285
What happens if the Create right bumper is pressed before the Create travels a
distance of 1 meter?
What happens if the Create right bumper is not pressed before the Create
travels a distance of 1 meter?
How could you also check to see if the Create left bumper is pressed? Answer:
while ((get_create_distance()) < 1000) && (get_create_lbump() == 0) && (get_create_rbump() == 0))
Page
: 286
: 287
Page
: 288
E-mail: support@kipr.org
Phone: 405-579-4609
Hours: M-F, 8:30am-5:00pm CT
Page
Site: http://homebase.kipr.org
Content:
Documentation Manual and Examples
Presentation Rubric & Example Presentation
DemoBot Build Instructions & Parts List
Controller Getting Started Manual
Construction Examples
Hints for New Teams
Sensor & Motor Manual
Game Table Construction Documents
All 2017 Game Documents
: 289
Botball Remind
https://www.remind.com/join
OK Regional: @393gf7
Page
: 291
Page
: 292
http://botballprogramming.org
Page
: 293
Social media
Page
: 294
Social media
Page
: 295
Tournament awards
Page
: 297
Tournament awards
There are a lot of opportunities for teams to win awards!
Page
Tournament Awards
Outstanding Documentation
Seeding Rounds
Double Elimination
Overall (includes Documentation, Seeding, and Double Elimination)
: 298
KISS Award
Spirit of Botball
Outstanding Engineering
Outstanding Software
Spirit
Outstanding Design/Strategy/Teamwork
Professional Development Workshop
1993 2017 KIPR
Page
: 299
Page
: 300
Students will not inherently know how to manage their time. Lets face
itit is difficult for many adults!
Mark a calendar or make a Gannt chart with important dates:
1st online documentation submission due
2nd online documentation submission due
3rd online documentation submission due
Tournament date
Set dates and schedules for team meetings.
Plan on meeting a minimum of 4 hours per week.
If you cant build the full game board, you can build of the board.
You could tape the outline of the board onto a floor if you have the right
type of flooring.
Page
: 301
Go over this with your students on the first meeting after the workshop.
// end workshop
Page
: 302