Как подключить вывод INT MPU 6050?
Я использую Arduino Leonardo вместе с коммутационной платой GY-521 (например, это, схема) для MPU 6050.
В настоящее время я пытаюсь заставить работать версию DMP примеров г-на Роуберга. .
Для всех своих тестов я использую следующие соединения:
- GY-521 -> Леонардо
- VCC -> 5 В (3,3 В ведут себя так же)
- ПДД -> ПДД
- Уровень вероятности нежелательной почты -> Вероятность нежелательной почты
- Земля -> Земля
Необработанный скетч работает нормально, я могу считывать данные с датчиков. Я думаю, что для версии DMP мне нужно соединить контакт INT с контактом 3 на Леонардо, чтобы MPU6050 мог вызвать прерывание.
Но как только я подключаю INT к чему-либо (контакты с 0 по 3), скетчи больше не находят MPU6050. (Они сообщают: «Ошибка подключения MPU6050»).
У меня отключена проводка или чип неисправен, и, что еще важнее, как я смогу это выяснить самостоятельно в будущем? =)
Изменить: В исходном коде примера сказано
/* ======================================== ==============================
ПРИМЕЧАНИЕ. Помимо подключения 3,3 В, GND, SDA и SCL, этот скетч
зависит от того, подключен ли вывод INT MPU-6050 к выводу Arduino.
вывод внешнего прерывания №0. На Arduino Uno и Mega 2560 это
цифровой вход/выход 2.
* =============================================== ======================= */
В примере не делается ничего (как я вижу) для настройки этого вывода.
Изменить еще раз:
Я одолжил осциллограф. SDA и SCL во время нормальной связи находятся под напряжением 3,3 В, и я вижу, как происходит обмен пакетами. Как только я подключаю контакт INT к любому входному контакту моего Leonardo, SDA и SCL замыкаются на землю. Для меня это ничего не значит, но, возможно, для кого-то еще.
@Jens, 👍1
5 ответов
Возможно ли, что вывод INT на MPU 6050 является входом, а не выходом?
Описанные вами симптомы напоминают, что вы блокируете гироскопический чип в состоянии прерывания, поэтому он больше не отвечает.
Однако мне не удалось понять использование контакта INT при беглом сканировании таблицы данных. Это потребует более тщательного изучения.
У вас есть контакт Arduino, настроенный как вход или выход? И если это вход, установлен ли на нем повышающий или понижающий резистор, внутренний или внешний?
возможная проблема: несоответствие уровней
Я предполагаю, что, возможно, какой-то выход этого Arduino пытается подать напряжение около 5,0 В на ваш гироскоп, что значительно выходит за рамки технических характеристик вашего гироскопа. Вам повезло, что что-то вообще сработало.
Согласно странице 12 технического описания гироскопа MPU-6050, гироскоп рассчитан на работу от источника питания VDD=2,375В до 3,46В.
Вы можете подумать, что об этом уже позаботился регулятор 3,3 В на вашей коммутационной плате.
Однако VDD, равный 3,3, также означает, что гироскоп ожидает, что все его входные напряжения будут находиться в диапазоне от 0 В до 3,3 В, а гироскоп будет управлять своими выходными напряжениями в диапазоне от 0 В до 3,3 В.
На странице 358 описания ATmega32u4 говорится, что ATmega32u4 предназначен для работы с любым источником питания в диапазоне от 2,7 В до 5,5 В.
На Arduino Leonardo имеется регулятор 3,3 В, а на коммутационной плате GY-521 имеется еще один стабилизатор. Таким образом, коммутационная плата GY-521 должна иметь напряжение VCC, подключенное к 5 В, а заземление - к заземлению Arduino, чтобы регулятор мог питать чип гироскопа напряжением 3,3 В.
К сожалению для вас, Arduino Leonardo предназначен для питания ATmega32u4 напряжением VCC = 5,0 В.
Что делать с несоответствием уровней
Возможно, было бы лучше, если бы мы соединяли вещи так, как они были задуманы для использования.
На вашем месте я бы постарался поддерживать уровни сигнала в пределах спецификаций с помощью любого из следующих способов:
- Используйте преобразователь уровней, например преобразователь уровней, совместимый с I2C, для каждого соединения данных между 3.3VI/ Контакты O гироскопа и контакты 5.0VI/O Arduino Leonardo. (a) (b) (c) Или
- Как-нибудь настройте Arduino Leonardo так, чтобы оно подключало 3,3 В к выводу VCC ATmega32u4. (Требуется ли для этого вырезать дорожки на печатной плате?). Или
- Используйте другой Arduino, настроенный для работы процессора с напряжением 3,3 В (LilyPad Arduino USB; Arduino Fio; Arduino Zero; Arduino Due; Arduino TRE; некоторые версии Arduino Pro Mini; некоторые версии Arduino Pro и т. д.) или легко подключен к 3,3 В (LilyPad Arduino SimpleSnap; LilyPad Arduino Simple; LilyPad Arduino и т. д.)
Возможная проблема: помехи в контактах
Но как только я подключаю INT к чему-либо (контакты с 0 по 3), скетчи больше не находят MPU6050. (Они сообщают "" MPU6050 соединение не удалось").
У меня отключена проводка или у меня неисправен чип, и что еще важнее, как я смогу это выяснить самостоятельно в будущем? =)
Если я читаю Arduino Leonardo схема правильно, Arduino D0 — это Rx, Arduino D1 — это Tx, Arduino D2 — это I2C_SDA, а Arduino D3 — I2C_SCL.
Вы уже используете I2C_SDA и I2C_SCL в качестве двунаправленной связи I2C; подключение какого-либо другого выходного контакта (например, контакта INT MPU6050) к любому из этих контактов нарушит эту связь, и тогда все не будет работать.
На большинстве плат Arduino Serial.println() и Serial.read(), а также процесс перепрограммирования используют контакты Rx и Tx. Возможно, подключение контакта INT MPU6050 к любому из этих контактов также вызывает какие-то проблемы, приводящие к тому, что что-то не работает. (Хотя Arduino Leonardo на самом деле использует свои контакты USB_D- и USB_D+ как для Serial.println(), так и для перепрограммирования, так что, возможно, для Leonardo это не проблема?). Я бы не стал использовать эти контакты для чего-либо, кроме последовательной связи, хотя я совсем не уверен, что это действительно вызовет проблемы с Arduino Leonardo.
В исходном коде примера говорится ... этот скетч зависит от подключения контакта INT MPU-6050 к вывод внешнего прерывания №0 Arduino. ... В примере ничего не делается (насколько я вижу) для настройки этого вывода.
Я предполагаю, что вы используете https://github.com /jrowberg/i2cdevlib/blob/master/Arduino/MPU6050/Examples/MPU6050_DMP6/MPU6050_DMP6.ino, верно?
Прерывания настраиваются немного иначе, чем ввод-вывод. (В частности, «изменчивость» имеет решающее значение для правильной работы прерываний).
Часть, которая настраивает это прерывание, находится в функции setup():
void setup() {
// ...
// включаем обнаружение прерываний Arduino
Serial.println(F("Enabling interrupt detection (Arduino external interrupt 0)..."));
attachInterrupt(0, dmpDataReady, RISING);
// ...
}
Строка «attachInterrupt(0, dmpDataReady, RISING)» настраивает таблицу векторов прерываний и биты конфигурации так, что когда что-то переключает вывод D2 Arduino (т. е. внешний источник прерывания 0) с низкого уровня на высокий, независимо от того, что делает Arduino, Arduino приостанавливает это , выполняет функцию dmpDataReady(), а затем работа Arduino возобновляет работу с того места, где она остановилась.
Я не понимаю, как это когда-либо работало, поскольку «внешнее прерывание 0» поступает от контакта D2, который на Arduino Leonardo подключен к I2C_SDA, который мы используем для связи I2C, поэтому мы не можем его использовать. для просмотра контакта прерывания гироскопа.
Однако, поскольку "attachInterrupt()" выполняется долго после "MPU6050 сообщение «сбой подключения» распечатывается на вашем экране, программная ошибка в том, как пример кода использует AttachInterrupt(), не объясняет, почему вы получаете это сообщение «сбой» на вашем экране.
что делать с помехами на выводах
Я бы попробовал либо использовать какой-нибудь другой вывод, либо заставить его работать вообще без подключения этого вывода к Arduino.
Использование другого контакта
Я бы попытался назначить специальный вывод на Arduino для вывода INT MPU6050. Может быть, D9 подойдёт?
Думаю, на Arduino Leonardo прерывание должно быть настроено примерно так:
// предупреждение: непроверенный код.
#include <PinChangeInt.h>
#include <PinChangeIntConfig.h>
// подключаем прерывание MPU6050 к Arduino D9
#define MPU6050_INT D9
void setup(){
// ...
// прерывание по смене контакта
pinMode(MPU6050_INT, INPUT);
PCintPort::attachInterrupt(MPU6050_INT, dmpDataReady, RISING);
// ...
}
Как заставить его работать без подключения INT к Arduino
Совершенно не ясно, действительно ли Arduino нужно подключать к выводу INT MPU6050. Похоже, что другой вариант заключается в том, что Arduino может время от времени использовать связь I2C для чтения статуса MPU6050, который включает в себя текущее состояние этого контакта. Это упрощает аппаратное обеспечение — просто оставьте вывод INT MPU6050 неподключенным.
контакт прерывания в команде AttachInterrupt должен быть установлен на № 4, то есть на контакте D7, как указано здесь "http://arduino. cc/en/Reference/AttachInterrupt", поскольку мы не можем использовать контакты D0-D3, единственным оставленным вариантом является D7, но проблема все еще сохраняется. Кто-нибудь, пожалуйста, решите это!
Чтобы использовать внешнее прерывание 4 (INT6), подключите контакт D7 на плате Leonardo. нам нужно изменить регистр прерываний следующим образом
EICRB |= (1<<ISC60)|(1<<ISC61); //устанавливаем тип прерывания
EIMSK |= (1<<INT6); // активирует прерывание
что пишут в WInterrupts.c
Перейдите по этой ссылке
http://forum.arduino.cc/index.php?topic=124057.0
- Подключение нескольких MPU 6050 к Micro/Lenardo
- arduino leonardo прекращает передачу как только кабель hdmi подключен к экрану
- Как использовать SPI на Arduino?
- Нажать клавишу Windows, используя «keyboard.press();»
- Как очистить буфер FIFO на MPU6050?
- Улучшенное циклическое переключение цветов RGB.
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- Проблема с загрузкой моего скетча на Ардуино
Спасибо за ваш ответ. Мне нужно будет проверить, как настроены контакты; Я использую только пример кода, указанный в вопросе, и сам ничего не настраиваю. INT на MPU должен быть выходом. Эта настройка работает и для других (по крайней мере, с Uno)., @Jens