Беспилотники для любознательных [В Н Гололобов] (pdf) читать постранично

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

Гололобов В.Н. Ульянов В.И.

5

!<

SZ
ГО

о
L fi

2
ос

для любознательных
ПРОСТО)
Осложном.

|5»и,к^мерл MjX С 4 0 0 /

( ДОСТАВ»

760 руб.
—1
яявш

22 руб.

0 ближайшая даст»

VD

пщ ня
V о(ч|'о>

•f fi-Hw.c',

W u e i ib fa ry
(.(»’ A'tJs ! Л / 1Ш < i» * v K O r > tin - A n lu m u

!h r* W jr.u y y f l.w s yn u !u /

Ч'»еГ*< Ч,- ’4 b y Hii ' t >‘ j;i tn ,f ■IU"*.1.« „ i.,isr ! 0 On1AkH pin :in» Ai^win-t ilff- k ' U i i f f j M ) VhfliUiS Au’,:r,1)Л}.

«

,4иИ'1

jлепитьАпМпоипо13
] .„ 1/ор.
Купи it,

:'!)•'.)

28/Т*
I I|iiiTii §«**©§ т а т я *

11111Г... .... "..
М , «»'*«!*/

(,«f г!>Л1

~*f~ $ / \(& -■*-,

V

Рис. 15.10. Результат поиска в Интернете

Глава 15. Приручаем модуль трехосевого гироскопа и акселерометра

163

Новичок: В комментариях дальше упоминается еще что-то,

что это?
Не знаю, что и сказать. Похоже, гироскоп дает не только
координаты в плоскости, но и координаты в пространстве — в
комментариях упоминается гравитация.
Вероятно, следует обратиться к описанию модуля гиро­
скопа, нужно внимательнее прочитать все, что написано в про­
грамме. Это правильный подход. Однако я пока не собираюсь
программировать Arduino для полетов, поэтому хочу найти
что-то более простое и понятное.
Введя в строку поиска на Яндексе arduino mpu6050, я обна­
руживаю такой вариант (рис. 15.10).
Может быть, и вам пригодится ссылка на этот ресурс [22].
Автор урока использует другую библиотеку, добавив ссылку на
нее в свой рассказ. Я скачиваю библиотеку, провожу манипуля­
ции, чтобы превратить ее в zip-файл, который легко импорти­
руется в программу Arduino.
ПРИМЕЧАНИЕ.

Среди установленных ранее библиотек появля­
ется новая, которую я назвал Kalman, когда архи­
вировал содержимое скачанных файлов.
Есть и пример, но он ориентирован на вывод данных через
интерфейс PC на дисплей, библиотеки которого у меня нет.
Но автор урока предлагает свою программу, которую можно
скачать на его странице. Что я и делаю. Хотелось бы сказать: к
своему удовольствию. Но нет.
Предыдущая программа что-то «зацепила» в настройках
модуля MPU-6050, отчего монитор порта показывает мне одно
и то же, как я не меняю положение модуля (рис. 15.11).

Новичок: Придется, видимо, разбираться. Или нет?

Беспилотники для любознательных

164

Х:27 Y:49
Х:27 У:49
Х:27 Y:49
Х:27 Y:49
Х:27 Y:49
Х:27 Y:49
Х:27 Y:49

Рис. 15.11. Работа программы из урока

Будем разбираться. Читая обсуждение статьи, я вижу, что не
только у меня все так плохо, у других не лучше. Один из участ­
ников обсуждения предлагает исправленный код программы:
♦include
♦include «Kalman.h»
Kalman kalmanX;
Kalman kalmanY;
uint8_t IMUAddress = 0x68;
/* IMU Data */
int var;
intl6_t accX;
intl6_t accY;
intl6_t accZ;
intl6_t tempRaw;
intl6_t gyroX;
intl6_t gyroY;
intl6_t gyroZ;
double accXangle; // Расчет углов, используя акселерометр
double accYangle;
double temp;
double gyroXangle = 180; // Расчет углов, используя гироскоп

Глава 15. Приручаем модуль трехосевого гироскопа и акселерометра

165

double gyroYangle = 180;
double compAngleX = 180; // Расчет углов, используя компас
double compAngleY = 180;
double kalAngleX; // Расчет углов с фильтром Kalman
double kalAngleY;
uint32_t timer;
void setup() {
Wire.begin();
Serial.begin(9600);
i2cWrite(ОхбВ,0x00); // Запрещаем ждущий режим
kalmanX.setAngle(180); // Задаем начальные углы
kalmanY.setAngle(180);
timer = micros();
var=0;

}
void loop() {
while (var= 0.0) Serial.print(« «); // добавим пробел для
// положительных значений
Serial.print(а,1);
Serial.print(« meters, «);
if (a >= 0.0) Serial.print(« «); // добавим пробел для
// положительных значений
Serial.print(а*3.28084,0);
Serial.println(« feet»);
delay(500);

}
double getPressure()

{
char status;
double T,P,p0,a;
/ / В ы должны вначале выполнить измерение-температуры,
// чтобы выполнить чтение давления.
// Начинаем измерение температуры:
// Если запрос успешен, требуется некоторое количество ms,
// чтобы дождаться ответа.
// Если запрос неудачен, вернется 0.
status = pressure.startTemperature();
if (status != 0)

{
// Ждем завершения измерения:
delay(status);
//
//
//
//

Извлекаем завершенное измерение температуры:
Заметьте, что измерение сохраняется в переменной Т.
Используйте '&Т' для передачи адреса Т в функцию.
Функция возвращает 1,если все удачно, и 0, если нет.

status = pressure.getTemperature(Т);

Глава 17. Высота полета или модуль барометра

187

if (status != 0)

{
//
//
//
//
//

Начинаем измерение давления:
Параметр является установкой дискредитации, от 0 до 3
(выше разрешение, дольше ждать).
Если запрос удачен, возвращается количество ms ожидания.
Если запрос неудачен,возвращается 0.

status = pressure.startPressure(3);
if (status != 0)

{
// Ждать завершения измерения:
delay(status);
//
//
//
//
//
//
//
//

Извлекаем завершенное измерение давления:
Заметьте, что измерение сохраняется в переменной Р.
Используйте '&Р', чтобы передать адрес Р.
Заметьте также, что функция требует предыдущего
измерения температуры (Т).
(Если температура стабильна, вы можете делать одно
измерение температуры для нескольких измерений давления.)
Функция возвращает 1, если все хорошо, и 0, если нет.

status = pressure.getPressure(Р,Т);
if (status !=