Друзья, привет!
Гироскоп, вообще очень полезная вещь, а современный гироскоп вещь еще и высокотехнологичная. Я еще помню те времена, когда гироскопы представляли собой довольно громоздкую конструкцию с маховиком и сложной системой подвесов. Где-то они и по сей день используются в таком виде, однако, нам с вами, не без помощи китайских друзей, разумеется, доступны полностью электронные устройства, лишенные какой бы то ни было механической части. Я говорю о народном модуле GY-521 на основе чипа MPU-6050.
Мне этот чип знаком уже относительно давно. Именно на его основе я сделал несколько версий игровых рулей, предназначенных для управления автомобилями и самолетами в компьютерных симуляторах.
В свое время я скрещивал его с микроконтроллерами Arduino Pro Micro и ESP32. Теперь настала очередь китайского микроконтроллера на архитектуре RISC-V: CH32V003J4M6. Сегодня я попробую подключить к нему гироскоп, чтобы оценить возможность использования этой связки в игровых контроллерах. Уж очень мне хочется сделать недорогой игровой руль из подручных средств. Посмотрим, что из этого выйдет...
Схема подключения
Модуль гироскопа подключается к микроконтроллеру при помощи стандартного последовательного интерфейса IIC (I2C). Это простой и довольно устойчивый протокол обмена. В наше время любой приличный микроконтроллер обладает аппаратной поддержкой этого протокола. Естественно, это обязывает подключать периферийные устройства к определенным ножкам. Тем не менее, хотелось бы отметить, что эмуляция этого простого протокола может быть выполнена программно (такая эмуляция использовалась, например в простом FM-приемнике на микроконтроллере ATtiny13). В этом случае подключаться можно практически к любым выводам GPIO. Я решил использовать аппаратную реализацию, поскольку имею возможность выбирать любые ножки.
Вот так выглядит минимально возможная схема подключения.
Модуль гироскопа подключен к микроконтроллеру выводами интерфейса I2C: SCL, SDA. Кроме того, на модуль подается питание. Как видно, 4 ножки модуля остались вообще неподключенными. Они нам не понадобятся. Но в кратце, зачем они нужны. Выводы XDA, XCL служат для подключения к гироскопу дополнительных датчиков. Вывод AD0 служит для изменения адреса модуля на шине I2C. Это нужно, например если вы захотите подключить второй гироскоп к той же шине. И, наконец, вывод INT предназначен для вызова прерывания по готовности данных от гироскопа, чтобы не опрашивать его постоянно. Это не слишком большая проблема, поэтому для экономии количества задействованных ножек его тоже не используем.
К микроконтроллеру я дополнительно подключил динамик через балластный резистор. будем изменять его тональность в зависимости от угла наклона.
Питание на нашу связку будет подаваться непосредственно с программатора. Через него же, естественно, будем и программировать микроконтроллер (вывод SWIO).
Практическая реализация
Собирать схему я буду быстрым монтажом на небольшой макетной плате типа breadboard. Собственно, собирается все минут за пятнадцать (если аккуратно). Вот так выглядит результат.
Микроконтроллер установлен на переходную панельку для DIP-монтажа. Для перемычек использован провод из Ethernet-кабеля. Динамик - пассивная пищалка с сопротивлением 32 Ома. Можно использовать любой другой. Возможно лишь, что придется подобрать сопротивление для получения адекватной громкости. Я обычно устанавливаю с запасом, чтобы динамик сильно не пищал. Немного слышно, и ладно. Тем более, большинство своих экспериментов я провожу когда семья уже сладко спит...
После сборки микроконтроллер подключается к программатору.
Детали я объяснять подробно не буду. Если кто-то не знаком с основами программирования микроконтроллеров CH32V003, то предлагаю ознакомится с ними в статье: "Китайские микроконтроллеры CH32V003: с чего начать". Для подключения потребуется три провода с Dupont-разъемами мама-папа.
Вот как выглядит подключение при большем увеличении (контакты подключены к программатору с другой стороны).
После этого можно приступить к написанию софта, отладке и экспериментам...
Софт и эксперименты
Для экспериментов я набросал небольшую тестовую программу. Как обычно в VS-Code + PlatformIO. Ссылка на архив проекта будет размещена в конце статьи. Программа, как обычно, снабжена подробными комментариями, но, тем не менее, остановлюсь на основных особенностях чуть подробнее.
Для вывода звукового сигнала на динамик используется 4-й канал 1-го таймера (ножка 7). Тональность звука будет изменяться путем изменения значения в регистре перезагрузки TIM1->ATRLR. Скважность сигнала всегда удерживается равной двум. Инициализация таймера происходит в процедуре TIMER_init().
В процедуре MPU6050_init() производится инициализация гироскопа. Для представления адреса устройства на шине I2C используется 7-битное значение, которое выравнивается к старшему биту. Значение младшего бита определяет будет ли производится последующая запись в устройство (младший бит = 0) или чтение из него (младший бит равен 1). Вся инициализация заключается в передаче в регистр PWR_MGMT_1 (0x6B) значения 0. После этого гироскоп начинает работать.
В основном цикле программы обычно производится последовательное чтение данных из регистров ускорения по координата X, Y и Z. А также углового ускорения. для того, чтобы получить точное значение угла наклона, можно провести обработку полученных данных одним из нескольких возможных алгоритмов. НО! Это нужно только, если вам действительно нужно точное значение угла! Для многих практических случаев этого не нужно. Достаточно знать, что датчик вращается вокруг какой-то оси. Для этого вполне можно использовать лишь данные о линейном ускорении. Именно так я делал в своих проектах игровых рулей. Главное, что нужно знать при этом: поворот гироскопа на плюс-минус 180 градусов соответствует изменению значения регистра линейного ускорения от - 32767 до +32767. Шкала при этом нелинейна, но для наших целей подойдет! Если вам потребуется реальное значение угла, то, полагаю, вы без труда найдете информацию в интернете.
Для наглядной демонстрации работы интерфейса I2C я подключил к этой шине цифровой анализатор. Вот так:
Временные диаграммы чтения ускорения по одной координате выглядят следующим образом. В горизонтальном положении:
Видно, что сначала по адресу гироскопа (0x68) записывается адрес регистра из которого будет производиться чтение (0x3B - регистр ускорения по оси X). Затем производится чтение. Значения, которые были возвращены образуют число 0x0344, которое в десятичной форме соответствует числу 836. Это примерно горизонтальное положение. Теперь под наклоном.
Теперь возвращаемое значение 0x3E0C, или в десятичном виде: 15884. Это соответствует наклону примерно на 45 градусов.
Возвращаемые значения помещаются программой в переменные ax, ay и az и могут быть использованы для управления чем-либо в зависимости от угла наклона. Записывать изменяющийся звук динамика я не стал. Полагаю, что любопытные без труда смогут повторить эксперимент самостоятельно. Я же попробую сделать несложный в повторении контроллер для управления аркадными гонками.
Проект доступен для скачивания здесь:
Как обычно, готов ответить на любые вопросы!
Спасибо, что читаете-смотрите Terrabyte! Подписывайтесь, если вам интересна радиолюбительская тематика, микроконтроллеры, мини-ПК, необычные компьютерные решения и инновационные разработки! А теперь еще и КВ-тематика! Спасибо всем, кто поддерживает меня своими советами, комментариями и лайками!
Группа ВК: https://vk.com/terrabyte
Канал на VK-Video: https://vk.com/video/@terrabyte/all
А вот что еще есть интересного: