// ПРИМЕР ЧТЕНИЯ УГЛОВ ЭЙЛЕРА С АКСЕЛЕРОМЕТРА:                 // * Строки со звёздочкой являются необязательными.
// (только КРЕН и ТАНГАЖ, без КУРСА)                           //   АКСЕЛЕРОМЕТР: измеряет кажущееся угловое ускорение, которое является геометрической разницей между истинным угловым ускорением и ускорением силы гравитации (g).
                                                               //   Если акселерометр неподвижен (истинное ускорение отсутствует), его оси XY параллельны земле, а ось Z направлена вверх, то ...
                                                               //   проекция кажущегося ускорения на ось Z = 0 - -g = g. Где 0 это истинное ускорение, а -g сила гравитации направленная в сторону противоположную оси Z.
                                                               //   Так как вектор g всегда направлен к земле, то в неподвижном состоянии, по данным датчика можно определить угол наклона устройства относительно поверхности Земли.
                                                               //   Эти данные можно использовать, например, для поворота изображения на экране (альбомное / ландшафтное).
// ССЫЛКИ для ознакомления:                                    //
// IMU-сенсор на 9 степеней свободы (Trema-модуль V2.0):       //   https://iarduino.ru/shop/Sensory-Datchiki/imu-9.html
// Информация о подключении модулей к шине I2C:                //   https://wiki.iarduino.ru/page/i2c_connection/
// Информация о модуле и описание библиотеки:                  //   https://wiki.iarduino.ru/page/Trema_IMU9/
                                                               //
#define BMX055_DISABLE_BMG                                     // * Не использовать гироскоп     (данную строку можно и не писать, но её наличие освобождает память программ за счет неиспользуемого датчика).
#define BMX055_DISABLE_BMM                                     // * Не использовать магнитометр  (данную строку можно и не писать, но её наличие освобождает память программ за счет неиспользуемого датчика).
                                                               //
#include <Wire.h>                                              //   Подключаем библиотеку для работы с аппаратной шиной I2C, до подключения библиотеки iarduino_Position_BMX055.
#include <iarduino_Position_BMX055.h>                          //   Подключаем библиотеку для работы с Trema-модулем IMU 9 DOF.
iarduino_Position_BMX055 sensor(BMA);                          //   Создаём объект sensor указывая что ему требуется работать только с акселерометром.
                                                               //   Если указать параметр BMA - то объект будет работать только с акселерометром.
                                                               //   Если указать параметр BMG - то объект будет работать только с гироскопом.
                                                               //   Если указать параметр BMM - то объект будет работать только с магнитометром.
                                                               //   Если указать параметр BMX - то объект будет работать со всеми датчиками сразу.
void setup(){                                                  // 
     Serial.begin(9600);                                       //   Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек.
     while(!Serial){}                                          // * Ждём готовность Serial к передаче данных в монитор последовательного порта.
     sensor.begin(&Wire); // &Wire1, &Wire2 ...                //   Инициируем работу с акселерометром, так как именно для работы с ним создан объект sensor. Указав ссылку на объект для работы с шиной I2C на которой находится модуль (по умолчанию &Wire).
//   sensor.setScale(BMA_4G);                                  // * Меняем диапазон измерений до ±4G. Возможные значения: BMA_2G (по умолчанию), BMA_4G, BMA_8G, BMA_16G.
//   sensor.setBandwidths(BMA_125Hz);                          // * Меняем частоту обновления данных на 125Гц. Возможные значения: BMA_8Hz, BMA_16Hz (по умолчанию), BMA_31Hz, BMA_63Hz, BMA_125Hz, BMA_250Hz, BMA_500Hz, BMA_1000Hz.
//   sensor.setFastOffset();                                   // * Выполняем калибровку акселерометра после установки нового диапазона измерений или частоты обновления данных.
}                                                              //   Чем выше диапазон и частота, тем ниже точность.
                                                               //
void loop(){                                                   // 
     sensor.read(BMA_DEG);                                     //   Функция read() читает данные того датчика, для которого был создан объект sensor.
                                                               //   Для объекта работающего с акселерометром, функция read() может принять
                                                               //   один из четырёх параметров: BMA_M_S, BMA_G, BMA_DEG, или BMA_RAD.
                                                               //   Если параметра нет, то используется параметр по умолчанию
                                                               //   sensor.read(BMA_M_S); читать угловое ускорение в м/с² (по умолчанию).
                                                               //   sensor.read(BMA_G  ); читать угловое ускорение в g.
                                                               //   sensor.read(BMA_DEG); читать углы «крен» и «тангаж» в градусах.
                                                               //   sensor.read(BMA_RAD); читать углы «крен» и «тангаж» в радианах.
                                                               //   Данные прочитанные функцией read() сохраняются в переменных axisX, axisY, axisZ и temp.
     Serial.print((String) "ТАНГАЖ="+sensor.axisX+", ");       //   ТАНГАЖ - угол наклона оси X (нос самолёта) относительно горизонта (0: горизонтально, +90: нос вверх, -90: нос вниз).
     Serial.print((String) "КРЕН="+sensor.axisY+"\r\n");       //   КРЕН   - угол наклона оси Y (крылья самолёта) относительно горизонта (0:горизонтально, +90:левое вверх, -90:левое вниз).
//   ПРИМЕЧАНИЕ:                                               //
//   Углы Эйлера удобно представлять на примере самолёта.      //
//   Ось X проходит вдоль фюзеляжа от хвоста к носу.           //
//   Ось Y проходит от правого крыла к левому.                 //
//   Ось Z проходит через центр самолёта снизу вверх.          //
//   КРЕН   поворот самолёта вдоль оси X (наклон крыльев).     //   Для удобства в библиотеке под углом КРЕН   подразумевается наклон оси Y относительно горизонта (наклон крыльев). Крен берётся из переменной axisY.
//   ТАНГАЖ поворот самолёта вдоль оси Y (нос вверх/вниз).     //   Для удобства в библиотеке под углом ТАНГАЖ подразумевается наклон оси X относительно горизонта (нос вверх/вниз). Тангаж берётся из переменной axisX.
//   КУРС   поворот самолёта вдоль оси Z (направление).        //   Курс берётся из переменной axisZ. Данный угол доступен только при использовании магнитометра.
}
