Приобрели детали для эксперимента rov-бегущая строка. Программа не работает. Останавливается при считывании функцией accel.readX_G() показаний акселерометра http://amperka.ru/product/troyka-accelerometer Далее выяснилось, что то же происходит при работе программы тестирования акселерометра из примеров к библиотеке troyka-imu.h. То же самое происходит при неподключенном акселерометре. Экспериментировали как с Arduino Uno, так и с Iskra Mini. Минимальный пример ниже. Что делать? Заранее спасибо. Может, проблема с TWI адресом, если прописанный в библиотеке не совпадает с тем что в акселерометре? Код (C++): // библитоека для работы I²C #include <Wire.h> // библиотека для работы с модулями IMU #include <troyka-imu.h> // создаём объект для работы с акселерометром Accelerometer accel; void setup() { accel.begin(); // устанавливаем чувствительность accel.setRange(RANGE_2); } void loop() { // вывод направления и величины ускорения по оси X int x=(accel.readX_G()); }
Нескромный вопрос на всякий случай. Куда подключены ноги D и С? У уны, нано, искры мини и просто мини надо к А4-А5 У леонардо, искры нео, и микро - к 2-3. У меги - к 20-21
я вставлял код который мигает светодиодиком на 13м пине нужное число раз. до считывания показаний счетчика 3 раза, после - 4. loop() запускается один раз, доходит до команды accel.readX_G() и всё. Я посмотрел в библиотеке, там в бесконечном цикле ожидание ответа от устройства. По-видимому, так и ждёт. на A4-A5. у уно пробовал еще и на отдельные пины диагонально противоположные к A4-A5
И покажите весь код. Скорее всего ошибка в нем. А для дебага попробуйте этот код: Код (C++): #include <Wire.h> #include <troyka-imu.h> Accelerometer accel; void setup(){ Serial.begin(9600); accel.begin(); accel.setRange(RANGE_2); } void loop(){ Serial.println(accel.readX_G()); }
В коде вроде негде ошибаться (привожу ниже). И потом, я же начал не со своих кодов. Собрал с детьми ROV-строку http://wiki.amperka.ru/projects:povdisplay (только на Uno) - не работает. Потом запустил пример из библиотеки - то же (там то как раз в серийный порт вывод). Подключение проверил. Да и собирал уже не раз, эффект один. Код (C++): #include <Wire.h> #include <troyka-imu.h> Accelerometer accel; void setup() { pinMode(13,OUTPUT); accel.begin(); accel.setRange(RANGE_2); flash(5); } void loop() { flash(3); float x=accel.readX_G(); flash(4); delay(300); } void flash(int n) { for (int i=0; i<n; i++) { digitalWrite(13,HIGH); delay(50); digitalWrite(13,LOW); delay(50); } delay(200); }
Так у вас не задействована переменная x. Должно быть так: Код (C++): flash(accel.readX_G()); delay(300); Кстати, зачем вам delay в двух местах подряд? Советую убрать delay из конца функции flash.
Обсуждение кода я готов продолжить, но отмечу, что основной вопрос при этом остаётся в стороне: почему акселерометр не отвечает на запрос (что приводит к тому, что функция accel.readX_G() не возвращает управление)? С практической стороны, от решения зависят дальнейшие действия. Если модуль неисправен, нужно приобрести замену, при этом потерять время (немосква), деньги, но зато надежда что с заменой заработает. Если дело в другом - замена ни к чему не приведёт, зато можно пытаться решить с текущей комплектацией (подобрать TWI-адрес? ). Да, значение переменной никак не используется, но программа зависает до присвоения этого значения, дальнейший код не имеет смысла. Согласен, что особо умный компилятор (в чем я в данном случае сомневаюсь) мог отметить, что не используется присвоенное значение переменной, но это не приведет к эффекту зависания. Для чистоты эксперимента я запустил код (ниже) где значение ячейки x используется. Объясню использование delay() в flash(). Функция flash(i) мигает i раз. Первый delay(50) - столько диодик горит, без этого я его не увижу. Второй delay(50) - столько он не горит, без этого я не увижу сколько раз он мигнул. delay(200) в конце - это чтобы два вызова функции в конце не сливались в одно сплошное моргание. Таким образом я вижу что flash(5) в setup() была вызвана, потом была вызвана flash(3) в loop(), а вот до flash((x>0)?4:6) управление почему-то не дошло. Отдельный delay(300) в loop() действительно в данном коде не нужен - до него управление не доходит, он остался от программы тестирования акселерометра из общих соображений, типа если хочешь понять что происходит то пусть это происходит со скоростью доступной для восприятия. В целом готов пожертвовать несколькими сотнями миллисекунд, если где что лишнее. Спасибо за интерес к проблеме. Код (C++): #include <Wire.h> #include <troyka-imu.h> Accelerometer accel; void setup() { pinMode(13,OUTPUT); accel.begin(); accel.setRange(RANGE_2); flash(5); } void loop() { flash(3); float x = 0; x=accel.readX_G(); flash((x>0)?4:6); } void flash(int n) { for (int i=0; i<n; i++) { digitalWrite(13,HIGH); delay(50); digitalWrite(13,LOW); delay(50); } delay(200); }
Заработало... решение такое Код (C++): // Accelerometer accel; LIS331DLH_TWI accel(0x19); высплюсь, может смогу объяснить подробнее цензурно
Пришлось покопаться в библиотеке, найти какой адрес прописан по умолчанию (0x18) и как можно подсоединить устройство по другому адресу. Потом я нарыл в сети сканер устройств http://playground.arduino.cc/Main/I2cScanner и он мне показал, что вот по адресу 0x19 что-то есть. Это называется проект от Амперки. Купите у нас деталей на эн тысяч и вот что вы получите если сами разберетесь со всеми косяками и недоговоренностями. Кстати, на самой странице проекта http://wiki.amperka.ru/projects:povdisplay не сказано, что заказав все из списка "что нам понадобится" и получив через несколько дней посылку вы не сможете запрограммировать Iskra Mini если у вас нет какого-то адаптера или более дорогого Ардуино. А на страничке с описанием Искры Мини сказано, что можно запрограммировать в частности с помощью Ардуино Уно, а вот по указанной ссылке именно этот способ не описан - ройтесь сами (кстати, ни одним из нарытых программных способов мне запустить Искру не удалось, только с выдёргиванием микроконтроллера из Уно). Спасибо конечно ребятам за популяризацию. Нас с детьми подцепил именно стартап Микроник на Бумстартере. Но как то подругому к клиентам надо относиться. В том же Микронике самая интересная и одна из немногих нетривиальных схем оказалась с несколькими ошибками и не работала. Теперь эти пляски с адресом устройства, убитое время и угасший интерес детей. Очень нетривиально для чайников в радиоэлектронике (а для кого еще эти игрушки). Либо должны быть подробные инструкции, чтобы самому разобраться, либо всё должно работать и так, тщательно проверенно перед тем как предлагать (ну как можно не проверить перед тем как начать продавать). А правильно - и то и то, целевая аудитория ведь разная. Короче, будем продолжать развиваться в этом направлении, но с амперкой или нет - еще подумаем.
Дабы не плодить подобную тему задам вопрос здесь. Приоберел идентичный акселерометр, подключил к Iskra Neo (aka Leonardo) по пинам D - 2 (SDA), C - 3 (SCL), питание от GND и 5V. Код где-то виснет и ничего не выдает. Использовал код от ув. denis-ka, пытался также искать устройство при помощи I2cScanner из поста выше - результат нулевой. Пытался использовать пины SCL/SDA (мало ли, пайка плохая), но тоже ничего. В какую сторону копать?