Basebot main code
Back to [Basebot]]
Main code
The main code is in basebot_6.ino (sometimes renamed to basebot_6.cpp).
The code is based on the Arduino environment. Here the normal C-main function is hidden. But setup() is called first, followed by an endless loop that calles loop().
Setup
The setup() function is like this and initializes all support modules:
void setup() // INITIALIZATION
{ // to be able to print to USB interface
Serial.begin(12000000);
// initialize sensors, safety and display
robot.setup(); // alive LED, display and battery
motor.setup(); // motor voltage
encoder.setup(); // motor encoders to velocity
imu2.setup(); // gyro and accelerometer - include tilt angle
}
Loop
The loop() function:
void loop ( void )
{ // init sample time
uint32_t nextSample = 0;
while ( true )
{ // main loop
// get time since start in microseconds
uint32_t us = micros();
// loop until time for next sample
if (us > nextSample) // start of new control cycle
{ // advance time for next sample
nextSample += sampleTimeUs;
// read sensors
imu2.tick();
encoder.tick();
// advance test sequence (default is wait for start button)
testSequence();
// make control actions
controlUpdate();
// give value to actuators
motor.tick();
// support functions
robot.tick(); // measure battery voltage etc.
display.tick(); // update O-LED display
}
usb.tick(); // listen to incoming from USB
}
}
The loop (while (true)) runs as fast as it can, and if it is not time for a new sample, then the USB connection is serviced (usb.tick()).
When the sample time has passed, the next sample time is set up. Both use the standard Arduino call micros(), which returns the number of microseconds since boot.
At every sample, the sensors are handled first (imu.tick() and encoder.tick()); these will get new data from the sensor, and the encoder will estimate the motor velocity.
Next is testSequenct(), which is intended as a state machine that changes what the robot should do, as described below. The default is to wait for the start button to be pressed.
All data for the control effort is now available (controlUpdate()). The default controller uses the desired velocity as motor voltage, ignoring the estimated velocity. This is a feed-forward-only controller.
The control effort sets the motor voltages and the motor.tick() implements this as a PWM to the motor driver.
In the end, other service functions are called (robot.tick() and display.tick()), which (mostly) check the battery voltage and update the display.