Не могу запустить акселерометр (troyka-модуль)

Тема в разделе "Arduino & Shields", создана пользователем denis-ka, 4 окт 2015.

  1. denis-ka

    denis-ka Нерд

    Приобрели детали для эксперимента 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());
    }
     
     
  2. vvr

    vvr Инженерище

    а как вы определили что программа не работает (по вашему коду)?
     
  3. geher

    geher Гуру

    Нескромный вопрос на всякий случай. Куда подключены ноги D и С?
    У уны, нано, искры мини и просто мини надо к А4-А5
    У леонардо, искры нео, и микро - к 2-3.
    У меги - к 20-21
     
  4. denis-ka

    denis-ka Нерд

    я вставлял код который мигает светодиодиком на 13м пине нужное число раз.
    до считывания показаний счетчика 3 раза, после - 4.
    loop() запускается один раз, доходит до команды accel.readX_G() и всё.
    Я посмотрел в библиотеке, там в бесконечном цикле ожидание ответа от устройства.
    По-видимому, так и ждёт.
    на A4-A5. у уно пробовал еще и на отдельные пины диагонально противоположные к A4-A5
     
  5. egordorichev

    egordorichev Гик

    Вот схема подключения с вики:

     
  6. egordorichev

    egordorichev Гик

    И покажите весь код. Скорее всего ошибка в нем. А для дебага попробуйте этот код:
    Код (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());
    }
     
  7. denis-ka

    denis-ka Нерд

    В коде вроде негде ошибаться (привожу ниже). И потом, я же начал не со своих кодов. Собрал с детьми 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);
    }
     
  8. egordorichev

    egordorichev Гик

    Так у вас не задействована переменная x. Должно быть так:

    Код (C++):

    flash(accel.readX_G());
    delay(300);
     
    Кстати, зачем вам delay в двух местах подряд? Советую убрать delay из конца функции flash.
     
    Последнее редактирование: 5 окт 2015
    denis-ka нравится это.
  9. denis-ka

    denis-ka Нерд

    Обсуждение кода я готов продолжить, но отмечу, что основной вопрос при этом остаётся в стороне:
    почему акселерометр не отвечает на запрос (что приводит к тому, что функция 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);
    }
     
    egordorichev нравится это.
  10. denis-ka

    denis-ka Нерд

    Заработало... решение такое
    Код (C++):
    // Accelerometer accel;
    LIS331DLH_TWI accel(0x19);
    высплюсь, может смогу объяснить подробнее цензурно
     
  11. egordorichev

    egordorichev Гик

    Странно... Но все равно - поздравляю!
     
  12. denis-ka

    denis-ka Нерд

    Пришлось покопаться в библиотеке, найти какой адрес прописан по умолчанию (0x18) и как можно подсоединить устройство по другому адресу. Потом я нарыл в сети сканер устройств http://playground.arduino.cc/Main/I2cScanner и он мне показал, что вот по адресу 0x19 что-то есть.
    Это называется проект от Амперки. Купите у нас деталей на эн тысяч и вот что вы получите если сами разберетесь со всеми косяками и недоговоренностями. Кстати, на самой странице проекта http://wiki.amperka.ru/projects:povdisplay не сказано, что заказав все из списка "что нам понадобится" и получив через несколько дней посылку вы не сможете запрограммировать Iskra Mini если у вас нет какого-то адаптера или более дорогого Ардуино. А на страничке с описанием Искры Мини сказано, что можно запрограммировать в частности с помощью Ардуино Уно, а вот по указанной ссылке именно этот способ не описан - ройтесь сами (кстати, ни одним из нарытых программных способов мне запустить Искру не удалось, только с выдёргиванием микроконтроллера из Уно).
    Спасибо конечно ребятам за популяризацию. Нас с детьми подцепил именно стартап Микроник на Бумстартере. Но как то подругому к клиентам надо относиться. В том же Микронике самая интересная и одна из немногих нетривиальных схем оказалась с несколькими ошибками и не работала.
    Теперь эти пляски с адресом устройства, убитое время и угасший интерес детей. Очень нетривиально для чайников в радиоэлектронике (а для кого еще эти игрушки). Либо должны быть подробные инструкции, чтобы самому разобраться, либо всё должно работать и так, тщательно проверенно перед тем как предлагать (ну как можно не проверить перед тем как начать продавать). А правильно - и то и то, целевая аудитория ведь разная.
    Короче, будем продолжать развиваться в этом направлении, но с амперкой или нет - еще подумаем.
     
  13. Dexogen

    Dexogen Нуб

    Дабы не плодить подобную тему задам вопрос здесь. Приоберел идентичный акселерометр, подключил к Iskra Neo (aka Leonardo) по пинам D - 2 (SDA), C - 3 (SCL), питание от GND и 5V. Код где-то виснет и ничего не выдает. Использовал код от ув. denis-ka, пытался также искать устройство при помощи I2cScanner из поста выше - результат нулевой. Пытался использовать пины SCL/SDA (мало ли, пайка плохая), но тоже ничего. В какую сторону копать?

    -QyYdeRUFPc.jpg
     
  14. egordorichev

    egordorichev Гик

    Код брали с вики?
    Уберите строки
    Код (C++):
    while (!Serial.available()) {
    // ждём
    }