The main loop is running at 1000 Hz. All the dataflow is happening through global variables (for simplicity):
t(float) — current step time, s.dt(float) — time delta between the current and previous steps, s.gyro(Vector) — data from the gyroscope, rad/s.acc(Vector) — acceleration data from the accelerometer, m/s2.rates(Vector) — filtered angular rates, rad/s.attitude(Quaternion) — estimated attitude (orientation) of drone.controls(float[]) — user control inputs from the RC, normalized to [-1, 1] range.motors(float[]) — motor outputs, normalized to [-1, 1] range; reverse rotation is possible.
Firmware source files are located in flix directory. The key files are:
flix.ino— main entry point, Arduino sketch. Includes global variables definition and the main loop.imu.ino— reading data from the IMU sensor (gyroscope and accelerometer), IMU calibration.rc.ino— reading data from the RC receiver, RC calibration.estimate.ino— drone's attitude estimation, complementary filter.control.ino— drone's attitude and rates control, three-dimensional two-level cascade PID controller.motors.ino— PWM motor outputs control.
Utility files include:
vector.h,quaternion.h— project's vector and quaternion libraries implementation.pid.h— generic PID controller implementation.lpf.h— generic low-pass filter implementation.
See build instructions in build.md.