Transcript Autonomous Navigation Workshop
Beginner Programming Workshop
November 17, 2007 Hauppauge High School
SPBLI - FIRST
Simona Doboli Assistant Professor Computer Science Department Hosftra University Email: [email protected]
Mark McLeod Advisor Hauppauge Team 358 Northrop Grumman Corp.
Agenda
FIRST Control System MPLAB Environment C Basics FRC Default Code – Robot Driver Control Demonstration of Basic OI Controls – Robot Autonomous Control Demonstration of Dead Reckoning Hands-On
FIRST Control System
solenoid motor
FIRST Control Elements
Hardware – Robot Controller (RC) User Processor vs. Master Processor PWM, Relay, Digital I/O, Analog, Misc.
– Operator Interface (OI) – Tether cable / Programming cable – Laptop Programming – C Language – MPLAB/mcc18 (write & compile your program) – IFI_Loader (download to robot controller) – Dashboard (optional) – FIRST Default Code
Robot Controller Architecture
User Processor – What we download to – Runs our code – Reads the digital/analog I/O directly Master Processor – Controls Disable/Autonomous/Driver modes – Disables OI inputs & most RC outputs – Must hear from User periodically or shuts it down – Master Code Software is updated each year
Robot Controller I/O
Analog Gyroscope Analog Rangefinder Potentiometer Motors Servo Team LEDs Banner Sensor Touch Sensor Pressure Sensor Switch Encoder Limit Switch Digital Relays Solenoid Compressor Camera TTL
Getting Started
Create/Open an MPLAB Project Edit a File Build/Compile Download
MPLAB IFI_Loader .hex file Dashboard (optional) Operator Interface Robot Controller
C Basics
Structure (#include, functions) IF, THEN, ELSE WHILE FOR =, !
>=, <=, ==, >, <, != &&, || Operators Prototype declarations
C Basics – Structure Program
#include
C Basics – Data Types
Type char unsigned char int unsigned int Size 8 bits 8 bits 16 bits 16 bits short long 24 bits unsigned short long 24 bits long unsigned long 32 bits 32 bits Min -128 0 -32,768 0 -2^23 0 -2^31 0 Max 127 255 32,767 65, 535 2^23-1 2^24-1 2^31-1 2^32-1
C Basics – A simple program
#include
C Basics – if statement
if (touch == 1 && goStraight = 1; light != 0 ) else goStraight = -1; AND Logic
OR Logic (||) !!! NOTE: if (touch =1) vs. if (touch == 1) ASSIGNMENT CONDITION
C Basics – while loop
while (touch == 0) { leftMotor = 5; rightMotor = 5; read(touch); // need to change touch inside // the loop }
// use { } if more than one statement in a loop
C Basics - Exercise
Write a program that computes the first n numbers in the Fibonnacci series: 0, 1, 1, 2, 3, 5, 8, 13. n is an integer number between 0 and 30.
C Basics - Algorithm
int first = 0, second = 1, third; while (n > 0){ third = first + second; output third first = second; second = third; n --; }
FRC Default Code Flow
User Initialization Main() – User_Initialization() – Do as long as we’re on New radio packet (slow loop) – Process_Data_From_Master_uP() – As long as we’re in auto mode do this Default_Routine() User_Autonomous_Code() Fast loop stuff NO Radio packet ?
YES Driver Routine NO Auto Mode ?
YES User Autonomous
FRC Default Code
Files to change – user_routines.c (to add switches & change controls) Default_Routine() User_Initialization() – user_routines_fast.c
User_Autonomous() (to add autonomous movement) – user_routines.h
(to share variables between files)
Input / Output
OI – Inputs Joysticks x & y (0-254) Buttons (0 or 1) Unused inputs – Outputs LEDs – lights or 3-digit readout RC – Outputs Digital I/O for sensors and devices (0 or 1) PWM for motors (0=reverse, 127=stop, 254=forward) Don’t use 13-16 Relay for on/off, e.g., pneumatics (forward, reverse, stop) – Inputs Analog for sensors, e.g., potentiometers (0 to 1023) – Both TTL for devices, e.g., camera or LCD screen
Sample OI Controls
(note: OI switches =0 when off and =1 when on) // 2-Joystick drive pwm01 = p1_y; pwm02 = 255-p2_y; // arm joystick pwm03 = p3_y; // motor controlled by switch pwm03 = 127; if (p1_sw_trig == 1) { pwm03 = 254; } // 1-Joystick drive pwm01 = Limit_Mix(p1_y + p1_x - 127); pwm02 = Limit_Mix(p1_y - p1_x + 127); // Limit_Mix keeps pwm between 0 & 254 Sample uses: • Drive • Control arm • Control turret
Sample OI Input/Output
Changing the OI LED/digital display // LED display on the OI if (user_display_mode == 0) // OI lights are in use (select switch on OI) { Pwm1_green = 1; Pwm1_red = 1; } else // OI digital display is in use { User_Mode_byte = 123; } Sample uses: • Trim joysticks • Display auto selected • Display backup battery voltage
Sample RC Digital Input
Switches on the Robot Controller (RC Digital Inputs) (note: RC switches =1 when off and =0 when on) // Autonomous selection if (rc_dig_in01 == 1) { Autonomous_1(); } else { Autonomous_2(); } // Limit Switch on arm pwm03 = p3_y; if ((rc_dig_in01 == 1) && (pwm03 > 127)) { pwm03 = 127; } Sample uses: • Limit switches • Autonomous selection • Field starting position • Pressure sensor
Sample RC Analog Input
Analog Inputs on the RC (e.g., a potentiometer) // Use of arm position sensor (potentiometer) to limit arm movement int armpot; pwm01 = p3_y; armpot = Get_Analog_Value(rc_ana_in03); // value will be 0-1023 if ( (armpot > 900) && (pwm01 > 127) ) { pwm01 = 127; // Neutral } else if (armpot < 100) && (pwm01 < 127) ) { pwm01 = 127; // Neutral } Sample uses: • Position sensors • Gyroscope • Analog rangefinder
Sample RC Relay Output
Forward / Reverse / Neutral relay8_fwd = 1; relay8_rev = 0; relay8_fwd = 0; relay8_rev = 1; relay8_fwd = 0; relay8_rev = 0; // Single pneumatic solenoid (valve) relay8_fwd = p1_sw_trig; relay8_rev = 0; // Double pneumatic solenoid (valve) relay8_fwd = p1_sw_trig; relay8_rev = !p1_sw_trig; Sample uses: • Pneumatic valves • Compressor on/off • On/off motors // Turn on Compressor when Pressure Switch on digital input 18 says so relay8_fwd = !rc_dig_in18; relay8_rev = 0;
Robot Autonomous Control
Must be developed under identical environment as in competition Training the robot must be repeated over & over to get right Develop code using old robots or prototypes Plan on multiple autonomous options Use as few distinct movements as possible
Sample Autonomous
// Drive forward and stop Sample_Auto_1() { static int counter=0; } if (counter<100) { counter++; pwm01 = 200; pwm02 = 54; //motor is reversed } else // Make sure it always stops { pwm01 = 127; pwm02 = 127; } May need function prototype: void Sample_Auto_1(void);
Common Issues
Syntax and typos Program & Data Space Code Too Slow trying to do too much Joystick trim Embedded math (variable overflow) Infinite or too large loops Variables keep values until you change them Unfortunately, it does exactly what you tell it to do
Hands-On
Vex Robots Timed Autonomous Sensors for Advanced Students 1. Vex w/encoder, turret, gyro 2. Vex w/camera 3. Vex w/pot controlled arm 4. Vex w/rangefinders (IR, sonic) 5. Vex w/swerve drive 6. Edu w/bumper sensor
References
Programming Quick Start FIRST RC Reference Guide FIRST OI Reference Guide www.chiefdelphi.com/forums Programming forum
Reference Books
C For Dummies, Volume One C For Dummies, Volume Two C Programming - A Modern Approach K N King “The C Programming Language” Kernighan & Ritchie “The C Answer Book” - Kernighan & Ritchie
Presentation slides at:
www.cs.hofstra.edu/~sdoboli
or
Team358.org
Questions/Help please email us. [email protected]