Куда необходимо подключать гироскоп
Перейти к содержимому

Куда необходимо подключать гироскоп

  • автор:

Как работает гироскоп в телефоне

Мы редко задумываемся о том, чем напичкан наш смартфон. Раньше мы использовали его только для звонков и SMS, теперь же смартфоны стали меньше и быстрее ноутбуков и компьютеров. Современные смартфоны богаты на самые разные сенсоры и умные датчики, которые помогают пользоваться нам самыми простыми функциями. Датчики и сенсоры очень чувствительны к внешним изменениям. Поворачиваете смартфон горизонтально, а экран ориентируется вместе с вами? Значит, стоит поблагодарить гироскоп, установленный в вашем устройстве. Кстати, благодаря гироскопу существует VR и все, что с этим связано. Рассказываем, как работает гироскоп, зачем он нужен, как его откалибровать на Android, чем отличается гироскоп от акселерометра.

Как работает гироскоп в телефоне. Рассказываем, как работает гироскоп в смартфоне. Фото.

Рассказываем, как работает гироскоп в смартфоне

Что такое гироскоп

Гироскоп — это устройство, которое помогает определить положение тела в пространстве. Изобретен он был достаточно давно, еще в 1817 году, а повсеместное применение находит до сих пор. Аналоговый гироскоп состоит из вращающегося вокруг вертикальной оси ротора-волчка, которая меняет положение в пространстве, а скорость вращения волчка превышает скорость поворота оси его вращения. Из-за этого волчок сохраняет свое положение независимо от сил, действующих извне. Для точного определения положения в пространстве такие нехитрые приборы используются в самолетах, ракетах, квадрокоптерах, планшетах и смартфонах.

Как работает гироскоп в смартфоне

Так выглядит гироскоп смартфона

Гироскоп в смартфонах и других умных устройствах сильно отличается от обычных, хоть и выполняет ту же функцию. Механическая энергия в нем преобразуется в электрическую, что формируется в в алгоритм работы. В умных устройствах гироскоп представляет собой подвижные вещества, которые смещаются под наклоном, меняя электрическую емкость конденсаторов, связанную с процессором вашего смартфона. Самый просто вариант гироскопа выглядит как две подвижные единицы, которые меняют положение и посылают сигнал датчикам. При повороте устройства двигается и весь гироскоп, который посылает сигнал об изменившемся местоположении. Благодаря этому нехитрому устройству вы можете встряхивать смартфон и переворачивать, чтобы работали интересные фичи, встроенные в операционную систему вашего смартфона. Если вы планируете пользоваться устройством с VR, например, очками или шлемом, то гироскоп будет играть в этом важную роль, отслеживая повороты головы и направляя виртуальный взгляд именно туда, куда направлен ваш взор. Что еще интересного скрывает VR? Читайте наши материалы в Яндекс.Дзен — пишем то, о чем еще никто не знает!

Чем гироскоп отличается от акселерометра

Чем гироскоп отличается от акселерометра. Акселерометр помогает в играх на смартфоне. Фото.

Акселерометр помогает в играх на смартфоне

Если вы любите иногда играть на смартфоне, то эти два датчика делают вашу жизнь гораздо проще. Они оба предназначены для того, чтобы определять положение гаджета в пространстве. Если гироскоп высчитывает угол наклона вашего смартфона относительно поверхности, передавая информацию в операционную систему, то акселерометр очень точно вычисляет ускорение. Именно поэтому наши смартфоны неплохо справляются с функцией шагомеров. Данные будут плюс-минус точными: можете попробовать сравнить их с данными ваших умных часов или фитнес-браслета, отличия будут незначительными. В современных смартфонах устанавливают и гироскоп, и акселерометр, что помогает избежать случайных поворотов экрана при его перемещении. Что еще интересного хотите узнать о смартфоне? Пишите нам в Telegram-чате!

Как проверить гироскоп в смартфоне

Как проверить гироскоп в смартфоне. С помощью видео в 360 можно проверить работоспособность смартфона. Фото.

С помощью видео в 360 можно проверить работоспособность смартфона

Все современные смартфоны оборудованы этими датчиками. Но если вам интересен принцип их работы, то есть отличный способ.

  • Откройте приложение YouTube
  • Найдите в поиске любое видео, которое поддерживает просмотр в режиме 360 градусов
  • Попробуйте покрутить телефон. Если изображение меняется относительно угла наклона, то гироскоп работает нормально
  • Если ничего не меняется, проверьте, не выключена ли функция автоповорота экрана
  • Проверить этот датчик можно и в играх с дополненной реальностью. Самый простой пример — игра Pokemon Go

Проверить наличие и работоспособность устройств можно также в приложении AIDA64. Устанавливаете приложение и получаете информацию в разделе «Датчики» обо всех установленных комплектующих в вашем смартфоне.

Как откалибровать гироскоп на Android

Гироскоп — это самостоятельный датчик, который невозможно настроить самостоятельно. Он есть во всех смартфонах и включить/отключить его нельзя, он всегда работает. В этой ситуации возможно лишь настроить или откалибровать акселерометр. Например, включить или выключить функцию поворота экрана.

Как откалибровать гироскоп на Android. Функция «Автоповорот экрана» помогает избежать случайной смены ориентации экрана. Фото.

Функция «Автоповорот экрана» помогает избежать случайной смены ориентации экрана

Для калибровки акселерометра используется стороннее приложение Accelerometer Calibration. Мобильное устройство кладется на ровную поверхность, а когда показывающий равновесие шарик окажется в прицеле, надо нажать кнопку «Calibrate».

Гироскоп — это один из важнейших датчиков наряду с датчиком освещенности. Он помогает пользоваться навигацией, меняя положение телефона. Без него не работал бы автоповорот экрана,

Оставить комментарий в Telegram. Поделитесь мнением в чате читателей Androidinsider.ru

Теги

  • Дисплей телефона
  • Игры для Android
  • Мобильные технологии

Урок 11. Подключение гироскопа GY-521 MPU-6050 к Arduio.

Модуль Gy-521 выполнен на базе микросхемы MPU6050, это 3-осевой гироскоп и акселерометр. Данную модель можно использовать для определения положения в пространстве.

В данном уроке нам понадобится:

  • Arduino
  • Провода Папа-Папа или Набор проводов для макетирования 65 шт.
  • Breadboard
  • 3-осевой гироскоп акселерометр GY-521 (MPU-6050)

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека Kalman (Gy-521, mpu6050)
  • Библиотека wire

В данном уроке рассмотрим библиотеку, которая позволяет преобразовать показания координат X и Y.

Подключение модуля производится следующим образом.

Gy-521 (mpu6050) Arduino (Uno)
VCC 3.3 V
GND GND
SCL A5
SDA A4

Для питания модуля необходимо использовать строго 3.3V! Для этого можно использовать преобразователь напряжения на 3.3V.

Пришло время записать следующий скетч в нашу Arduino:

#include #include «Kalman.h» Kalman kalmanX; Kalman kalmanY; uint8_t IMUAddress = 0x68; /* IMU Data */ int16_t accX; int16_t accY; int16_t accZ; int16_t tempRaw; int16_t gyroX; int16_t gyroY; int16_t gyroZ; double accXangle; // Angle calculate using the accelerometer double accYangle; double temp; double gyroXangle = 180; // Angle calculate using the gyro double gyroYangle = 180; double compAngleX = 180; // Calculate the angle using a Kalman filter double compAngleY = 180; double kalAngleX; // Calculate the angle using a Kalman filter double kalAngleY; uint32_t timer; void setup() < Wire.begin(); Serial.begin(9600); i2cWrite(0x6B,0x00); // Disable sleep mode kalmanX.setAngle(180); // Set starting angle kalmanY.setAngle(180); timer = micros(); >void loop() < /* Update all the values */ uint8_t* data = i2cRead(0x3B,14); accX = ((data[0] void i2cWrite(uint8_t registerAddress, uint8_t data) < Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.write(data); Wire.endTransmission(); // Send stop >uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) < uint8_t data[nbytes]; Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.endTransmission(false); // Don't release the bus Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading for(uint8_t i = 0; i

Данный пример пересчитывает координату X и Y и выводит в консоль (Монитор последовательного порта)

Когда X и Y равны 180, значит гироскоп находится в горизонтальной плоскости.

Подключение датчиков типа 10-DOF — акселерометр, гироскоп, магнитометр, температура, давление.

Отлаживаю драйвер для ESP8266 с датчиком на основе блока 10-DOF GY-91:

Пока драйвер успешно живет и тестируется в IRAM (тестовая трансляция и исполнение без прошивки в Flash, а только с загрузкой в память ESP8266 из Eclipse).

Развиваемая скорость сбора обработки данных, при 30% занятости CPU ESP8266 переваливает за 1000 точек на каждый параметр каждого датчика (это поток более 40 кбайт нативных данных в секунду).

Оптимально, чтобы не мешать работе SDK и прочему, решил настраиваться на поток не более 100 точек в секунду. Тогда, пример загрузки шины HSPI (с выводом на UART отладки), выходит примерно такой:
ESP-SPI-10-DOF.gifESP-SPI-10-DOF2.gif
Выходной формат нативных данных уже скорректирован по информации с самих датчиков, но float не применяется, т.к. далее будет необходимо осреднение данных для записи в лог, а в float ESP не успеет обработать такой поток.

IRAM only SDK Init. Free Heap: 81096 Free IRAM: 60216 HSPI CLK = 1000000 Hz Init BMP280. BMP280 id: 58 Dig BMP280: 4a 6b a9 67 18 fc e8 92 38 d6 d0 0b c5 0a 19 01 f9 ff 8c 3c f8 c6 70 17 Regs BMP280: 0c b7 10 00 80 00 00 80 00 00 Temp: 20.75 C, Press: 79857 Pa Init MPU9250.. ID MPU9250: 71 ID Mag: 48 Mag: 48 9a 00 7b ff ab ff 41 fe 10 12 00 00 48 9a ac ae a2 00 F(1): 2215,98720,M(-154,-105,-228),A(8164,7348,12076),G(-4,74,-116) F(1): 2224,98720,M(-149,-96,-228),A(8108,7300,12076),G(-5,30,-86) F(1): 2232,98722,M(-152,-96,-224),A(8116,7292,12048),G(5,71,-141) F(2): 2237,98721,M(-154,-94,-222),A(8116,7372,12092),G(-17,12,-49) F(1): 2241,98725,M(-143,-104,-227),A(8128,7356,12000),G(-12,46,-66) F(1): 2244,98723,M(-153,-90,-226),A(8160,7380,11984),G(1,75,-159) F(1): 2247,98724,M(-151,-97,-225),A(8140,7352,12152),G(8,70,-153) …

Т.е. данные с датчиков полные, с фиксированной точкой. Например для температуры 2247 — надо делить на 100 и выйдет 22.47 С. С этим успешно справиться и java, отображающая данные на Web странице.

Концепция применения драйвера для народа пока не выработана. По этому и создал тему. Необходимо решить область применения или куда и как есть желание использовать. Только после этого драйвер приобретет вид возможный для публикации. Пока я его адаптирую только под свои нужды и уверен что народу такое не надо. Но побочный вариант, после консультации тут возможно родит отдельный открытый драйвер для всех

  1. Передача потока с датчиков в реал-тайм на какой-то внешний сервер.
  2. Накопление и осреднение данных этого потока для проекта сервера статистики с циклической записью данных за промежуток в 1 год с шагом от 5 до 15 минут с графическим выводом для web-свалки.
  3. Драйвер ориентирован на фоновую работу (работу по прерываниям).

PS: драйверы для АрДурино не предлагать — они не умеют работать в фоне или требуют мультизадачной системы, да ресурсов, которых нет у ESP8266 и ESP32. Тем более у Дурины Spiffs, который не даст никому работать своими задержками и множественными перезаписями flash c длительными стираниями, во время которых работа ESP невозможна.

Радиоуправление на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050

.Радиоуправление на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050

Данная машинка получилась более быстрая и удобная в управлении. Но все равно чего-то не хватает: гибкости настройки программы, чувствительности джойстика и пр.

Поэтому я решил сделать машинку на радио управлении.

Что мне понадобится.

Пульт:

Машинка:

5. Источник питания. Я использовал power bank

6. Провода для подключения можно взять от мышки, USB- зарядки и пр. что у вас не работает и лежит без дела.

Схема подключения пульта управления на Arduino + NRF24L01 + гироскоп GY-521 MPU-6050 выглядит вот так.

Схема подключения пульта управления на Arduino + NRF24L01 + гироскоп GY-521

Скетч в среде программирования Arduino IDE выглядит вот так.

#include #include #include const uint64_t pipe = 0xF0F1F2F3F4LL; RF24 radio(9, 10); byte button_jostik = 8; // кнопка джостика byte button_1 = 2; // кнопка byte button_2 = 3; // кнопка byte button_3 = 4; // кнопка byte button_4 = 4; // кнопка byte button_5 = 5; // кнопка byte button_6 = 7; // кнопка byte transmit_data[9]; // массив, хранящий передаваемые данные byte latest_data[9]; // массив, хранящий последние переданные данные boolean flag; // флажок отправки данных // Гироскоп /// #include #include «Kalman.h» Kalman kalmanX; Kalman kalmanY; uint8_t IMUAddress = 0x68; /* IMU Data */ int16_t accX; int16_t accY; int16_t accZ; int16_t tempRaw; int16_t gyroX; int16_t gyroY; int16_t gyroZ; double accXangle; // Angle calculate using the accelerometer double accYangle; double temp; double gyroXangle = 180; // Angle calculate using the gyro double gyroYangle = 180; double compAngleX = 180; // Calculate the angle using a Kalman filter double compAngleY = 180; double kalAngleX; // Calculate the angle using a Kalman filter double kalAngleY; uint32_t timer; /* переменные */ boolean lastButten = LOW; // предыдущее состояние кнопки boolean currentButten = LOW; // текущее состояние кнопки int status = 0; // текущий статус void setup() < Serial.begin(9600); //открываем порт для связи с ПК pinMode(button_jostik, INPUT_PULLUP); // настроить пин кнопки pinMode(button_1, INPUT_PULLUP); // настроить пин кнопки pinMode(button_2, INPUT_PULLUP); // настроить пин кнопки pinMode(button_3, INPUT_PULLUP); // настроить пин кнопки pinMode(button_4, INPUT_PULLUP); // настроить пин кнопки pinMode(button_5, INPUT_PULLUP); // настроить пин кнопки pinMode(button_6, INPUT_PULLUP); // настроить пин кнопки radio.begin(); delay(50); radio.setChannel(9); radio.setPayloadSize(8); radio.setRetries(1,1); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_HIGH); radio.openWritingPipe(pipe); /// Гтроскоп Wire.begin(); i2cWrite(0x6B,0x00); // Disable sleep mode if(i2cRead(0x75,1)[0] != 0x68) < // Read "WHO_AM_I" register Serial.print(F("MPU-6050 with address 0x")); Serial.print(IMUAddress,HEX); Serial.println(F(" is not connected")); while(1); >kalmanX.setAngle(180); // Set starting angle kalmanY.setAngle(180); timer = micros(); > void loop() < currentButten = debvance (lastButten); // Передаем функции дребезга значение по умолчанию LOW if (lastButten == LOW && currentButten == HIGH) // Проверяем отпускали мы кнопку или нет < status = !status; // инвертируем Статус >lastButten = currentButten; // Переприсваеваем прошлое состояние кнопки if (status == true) < transmit_data[1] = map(analogRead(A0), 0, 1023, 0, 255); // получить значение // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве transmit_data[2] = map(analogRead(A1), 0, 1023, 0, 255); >else < /* Update all the values */ uint8_t* data = i2cRead(0x3B,14); accX = ((data[0] 250) y=250; if (y< 110) y= 110; int x = compAngleX; if (x>250) x=250; if (x < 110) x= 110; transmit_data[1] = map(x, 110, 250, 0, 255); // получить значение // в диапазоне 0..1023, перевести в 0..180, и записать на 1 место в массиве transmit_data[2] = map(y, 110, 250, 0, 255); >transmit_data[0] = !digitalRead(button_jostik); // инвертированный (!) сигнал с кнопки transmit_data[3] = !digitalRead(button_1); // инвертированный (!) сигнал с кнопки transmit_data[4] = !digitalRead(button_2); // инвертированный (!) сигнал с кнопк transmit_data[5] = !digitalRead(button_3); // инвертированный (!) сигнал с кнопки transmit_data[6] = !digitalRead(button_4); // инвертированный (!) сигнал с кнопки transmit_data[7] = !digitalRead(button_5); // инвертированный (!) сигнал с кнопки transmit_data[8] = !digitalRead(button_6); // инвертированный (!) сигнал с кнопки for (int i = 0; i < 9; i++) < // в цикле от 0 до числа каналов if (transmit_data[i] != latest_data[i]) < // если есть изменения в transmit_data flag = 1; // поднять флаг отправки по радио latest_data[i] = transmit_data[i]; // запомнить последнее изменение >> //if (flag == 1) < // radio.powerUp(); // включить передатчик radio.write(&transmit_data, sizeof(transmit_data)); // отправить по радио // flag = 0; //опустить флаг // radio.powerDown(); // выключить передатчик // >> boolean debvance (boolean last) //убираем дребизг < boolean current = digitalRead (button_jostik); // считываем данные с кнопки if (last != current) // Если текущее состояни еотличететься от предыдущего < delay (5); // Ждем 5 милисек. current = digitalRead (button_jostik); // Присваеваем текущее состояние кнопки return current; >> void i2cWrite(uint8_t registerAddress, uint8_t data) < Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.write(data); Wire.endTransmission(); // Send stop >uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) < uint8_t data[nbytes]; Wire.beginTransmission(IMUAddress); Wire.write(registerAddress); Wire.endTransmission(false); // Don't release the bus Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading for(uint8_t i = 0; i

Схема подключения Ардуино машинки на на радио управлении NRF24L01 выглядит вот таким образом.

Схема подключения Ардуино машинки на на радио управлении NRF24L01

Скетч среде программирования Arduino IDE для радио Arduino машинки.

#include #include #include #include const uint64_t pipe = 0xF0F1F2F3F4LL; RF24 radio(9, 10); byte msg[9]; unsigned long time; int data; int pos; int fspeed; // forward speed int bspeed; // backward speed const int in1 = 2; // direction pin 1 const int in2 = 4; // direction pin 2 const int in3 = 7; // PWM pin to change speed const int in4 = 8; // direction pin 2 const int ena = 5; // PWM pin to change speed const int enb = 6; // PWM pin to change speed /* определяем два массива с перечислением пинов для каждого мотора */ unsigned char RightMotor[3] = ; unsigned char LeftMotor[3] = ; /* управление скоростью мотора motor - ссылка на массив пинов v - скорость мотора, может принимать значения от -100 до 100 */ void Wheel (unsigned char * motor, int v) < if (v>100) v=100; if (v<-100) v=-100; if (v>0) < digitalWrite(motor[0], HIGH); digitalWrite(motor[1], LOW); analogWrite(motor[2], v*2.55); >else if (v <0) < digitalWrite(motor[0], LOW); digitalWrite(motor[1], HIGH); analogWrite(motor[2], (-v)*2.55); >else < digitalWrite(motor[0], LOW); digitalWrite(motor[1], LOW); analogWrite(motor[2], 0); >> void setup() < pinMode(in1, OUTPUT); // connection to L298n pinMode(in2, OUTPUT); // connection to L298n pinMode(in3, OUTPUT); // connection to L298n pinMode(in4, OUTPUT); // connection to L298n pinMode(ena, OUTPUT); // connection to L298n; pinMode(enb, OUTPUT); // connection to L298n; Serial.begin(9600); delay(50); radio.begin(); radio.setChannel(9); radio.setPayloadSize(8); radio.setDataRate(RF24_250KBPS); radio.setPALevel(RF24_PA_HIGH); radio.openReadingPipe(1,pipe); radio.startListening(); >void loop() < if (radio.available())< time = millis(); radio.read(&msg, sizeof(msg));>if (millis() - time > 1000) < msg[0]=0; msg[1]=0;>int x= map(msg[2], 0, 255, -100, 100); int y= map(msg[1], 0, 255, -100, 100); /* управляем правым мотором */ Wheel (RightMotor, y - x); /* управляем левым мотором */ Wheel (LeftMotor, y + x); Serial.println(msg[1]); Serial.println(msg[2]); >

У Вас наверное возник вопрос, а для чего 6 тактовых кнопок на пульте управлении. Данными кнопками я планирую управлять ковшом который установлю на данную Ардуино машинку . Также есть возможность поставить еще один джойстик. Я его поставлю когда буду собирать уже в нормальный корпус. Также установлю модуль NRF24L01 с внешней антенной . За всеми переделка следите на сайте Portal-PK.ru и на YouTube канале.

Подписывайтесь на мой канал на Youtube и вступайте в группы в Вконтакте и Facebook.

Спасибо за внимание!

Понравилась статья? Поделитесь ею с друзьями:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *