несколько I2C - устройств

Тема в разделе "Проводная и беспроводная связь", создана пользователем Turder, 30 янв 2014.

  1. Turder

    Turder Нуб

    Здравствуйте, я запутался.

    Захотел собрать в одном месте следующие компоненты:
    • датчик температуры и влажности SHT1x
    • барометр
    • семисегментный индикатор
    • часы реального времени
    ну и выводить это на lcd 20х4, но до этого далеко еще.

    1) Так вот, про первый, от ДФроботов, датчик я читал - да киньте дата пин и клок пин на цифровые пины ардуино и вон простенький код вам.
    2) А остальные изделия, от Grove, пишут в своих вики - да втыкайте в Grove - Base Shield, а его на ардуино через Grove cable, и вообще не парьтесь, код ниже.
    3) А в описании товара в Амперке написано - да подключите через Troyka, это удобно.
    4) А Джереми Блюм говорит: подключайте рельсовым методом на аналоговые (!) пины 4 и 5 ардуино столько устройств, сколько душе угодно. Тока в коде прописывайте id устройства, с которого хотите считать.

    :eek::mad::confused::(
    Мои мысли по этому поводу:
    1) Самый топорный и простой метод, но мне понадобится аж 14 пинов (при этом использование 0, 1 и аналоговых чревато неправильной работой - проходил через это), к тому же для Grove библиотеки написаны под их шилд или нет? если нет, как задавать пины?
    2) Этот их шилд я найти не успею, да и не особо хочу покупать.
    3) Тот же вопрос, что и в 1) - как задавать пины у Grove и как их сэкономить.
    4) Это самый вкусный метод! Только - что, и правда библиотека Wire сработает универсально для всех этих устройств? Откуда мне знать id каждого устройства? И еще - в примерах кодов у термогигрометра и у остальных устройств разный baud rate . Это значит, он не сможет быть с ними на одной I2C линии? Вообще не сможет обмениваться данными с ардуиной одновременно с остальными датчиками? Или это ничего не значит?
     
  2. ИгорьК

    ИгорьК Гуру

    Попробую распутать.
    1. Все указанные шилды - это приспособления для более удобного соединения. Можно обойтись вообще без них, скрутив все провода руками, но так не красиво и не удобно. Поэтому выберите какой-нибудь один. Возможно, при этом, придется переделывать разъемы.

    2. Все устройства с большой долей вероятности будут работать одновременно на одной шине I2C. Не забудьте про подтягивающие резисторы. То есть все устройства должны быть включены параллельно.
    ... и здесь надо разбираться с тем как там и что на шилде подключается. Возможно никакой шилд не обеспечит параллельного подключения. Обычно шилды соединяют отдельные входы с отдельными ногами Ардуино. Значит - паяльник в руки и нюхать канифоль - задача то все включить в параллель.

    3. Как определить адрес каждого - это исключительно путем чтения инструкции и изучения форумов на тему каждого конкретного датчика.

    Можно собрать все адреса в массив специальной командой поиска адресов устройств, а потом разбираться с каждым адресом конкретно - что к чему. (Не уверен, что это для начинающего будет ясно. Работа с шиной I2C все таки не начальный уровень.)

    4. baud rate у I2C типовой - 100 и 400. В Ардуино, насколько я понимаю, он по умолчанию 100. Все должно работать.
     
    Последнее редактирование: 31 янв 2014
    Turder нравится это.
  3. sagis

    sagis Нерд

    Как минимум 3 устройства великолепно себя чувствуют на I2C
    Барометр-термометр BMP085, часы реального времени DS1307RTC, дисплей LCD1602 с I2C

    Примерно так
    [​IMG]
    Да кстати адреса I2C устройств удобно смотреть Сканером http://playground.arduino.cc/Main/I2cScanner
     
    Последнее редактирование: 31 янв 2014
    Mr. DeWitt, TarLink, Megakoteyka и 3 другим нравится это.
  4. Turder

    Turder Нуб

    Спасибо!
    Про резисторы - ими нужно притягивать к питанию (3,3 В)?

    Насчет шилдов вопрос возник потому, что в кодах сенсоров от Grove я не увидел дефайна пинов для ардуино. Теперь догадываюсь, что этот их grove cable тупо идет от шилда к тем же самым А4 и А5 - пинам.

    За сканер спасибо, сейчас попробую) В инструкциях нашел только спецификации на присвоение адресов (типа, сколько бит инфы - это код производителя, а сколько - тип устройства).

    Что-то подобное собранному на фотке я и строю) Только упакую в корпус и попробую заменить ардуино уже на ARM-процессор.
     
  5. geher

    geher Гуру

    Если датчик собран по человечески, то притягивать резисторами ничего никуда уже не надо, все уже есть в датчике.
    Сам делаю потихоньку что-то вроде часов-метеостанции.
    Барометрический датчик и часы от Grove подключил к пинам I2C напрямую (точнее, проводами через макетную плату, но без дополнительных деталей).
    Библиотеки обоих датчиков уже содержат прошитые в датчики адреса, ничего дополнительно сканировать не нужно. только дергать за простые и достаточно понятные из примеров функции библиотек. Библиотеки и примеры можно взять непосредственно с сайта Grove.
    Разве что потом, чтобы сэкономить драгоценную память, если ее вдруг будет не хватать, можно раздраконить исходный код библиотеки, выкинув все ненужное.
     
  6. sagis

    sagis Нерд

    Чаще всего адреса действительно прописывать не надо, но например в некоторых примерах I2C дисплеев адрес записан 0×20, и соответственно примеры не идут с адресом 0×27 который встречается очень часто, знаю многих кто неделями пытался запустить скетчи с подобным косячком:)
     
  7. geher

    geher Гуру

    Ну если использовать библиотеку и скетчи от одного устройства на другом (или если устройства разных производителей), то спецэффекты возможны всякие.
    Для заявленного же состава оборудования (2 I2C устройства от Grove) все вроде должно быть без проблем.
     
  8. acos

    acos Официальный гик Администратор

    Имеются ввиду готовые модули? Думается мне, если на шину посадить 10 таких модулей — работать не будет) Параллельные сопротивления
     
    sagis нравится это.
  9. geher

    geher Гуру

    Естественно, бесконечно увеличивать количество подключенных устройств не получится.
    Не знаю, сколько там можно предельно подключить без плясок с бубном, у меня столько нет. Но не думаю, что очень много. На RS-422, например, предел - всего 10 устройств. Не думаю, что тут будет существенно больше.
    Пробовал поискать заветную цифру в сети, но везде пишут про предельные 400 пФ, ничего не поясняя по существу вопроса.
     
  10. Unixon

    Unixon Оракул Модератор

    I2C это вообще межплатный протокол, для применения в устройствах, где количество устройств на шине фиксировано и заранее известно. Подтяжки на шинах с открытым коллектором выбираются исходя из этой априорной информации. Естественно, что в процессе прототипирования с переменным количеством модулей условия будут меняться. Обычно для пользователя все эти трудности скрыты в готовом устройстве, но для инженера-конструктора они никуда не исчезали.
     
  11. Turder

    Turder Нуб

    Кхм... сканирую я, значит, адреса по очереди, дохожу до четырехразрядного семисегментного индикатора, а он начинает дудосить монитор адресами:

    Scanning...
    I2C device found at address 0x01 !
    I2C device found at address 0x02 !
    I2C device found at address 0x03 !
    I2C device found at address 0x04 !
    I2C device found at address 0x05 !
    I2C device found at address 0x06 !
    I2C device found at address 0x07 !
    I2C device found at address 0x08 !
    I2C device found at address 0x0A !
    I2C device found at address 0x0C !
    I2C device found at address 0x0E !
    I2C device found at address 0x0F !
    I2C device found at address 0x10 !
    I2C device found at address 0x11 !
    I2C device found at address 0x12 !
    I2C device found at address 0x13 !
    I2C device found at address 0x14 !
    I2C device found at address 0x15 !
    I2C device found at address 0x16 !
    I2C device found at address 0x17 !
    I2C device found at address 0x18 !
    I2C device found at address 0x1A !
    I2C device found at address 0x1C !
    I2C device found at address 0x1E !
    I2C device found at address 0x1F !
    I2C device found at address 0x20 !
    I2C device found at address 0x21 !
    I2C device found at address 0x22 !
    I2C device found at address 0x23 !
    I2C device found at address 0x24 !
    I2C device found at address 0x25 !
    I2C device found at address 0x26 !
    I2C device found at address 0x27 !
    I2C device found at address 0x28 !
    I2C device found at address 0x2A !
    I2C device found at address 0x2C !
    I2C device found at address 0x2E !
    I2C device found at address 0x2F !
    I2C device found at address 0x30 !
    I2C device found at address 0x31 !
    I2C device found at address 0x32 !
    I2C device found at address 0x33 !
    I2C device found at address 0x34 !
    I2C device found at address 0x35 !
    I2C device found at address 0x36 !
    I2C device found at address 0x37 !
    I2C device found at address 0x38 !
    I2C device found at address 0x3A !
    I2C device found at address 0x3C !
    I2C device found at address 0x3E !
    I2C device found at address 0x3F !
    I2C device found at address 0x40 !
    I2C device found at address 0x41 !
    I2C device found at address 0x42 !
    I2C device found at address 0x43 !
    I2C device found at address 0x44 !
    I2C device found at address 0x45 !
    I2C device found at address 0x46 !
    I2C device found at address 0x47 !
    I2C device found at address 0x48 !
    I2C device found at address 0x4A !
    I2C device found at address 0x4C !
    I2C device found at address 0x4E !
    I2C device found at address 0x4F !
    I2C device found at address 0x50 !
    I2C device found at address 0x51 !
    I2C device found at address 0x52 !
    I2C device found at address 0x53 !
    I2C device found at address 0x54 !
    I2C device found at address 0x55 !
    I2C device found at address 0x56 !
    I2C device found at address 0x57 !
    I2C device found at address 0x58 !
    I2C device found at address 0x5A !
    I2C device found at address 0x5C !
    I2C device found at address 0x5E !
    I2C device found at address 0x5F !
    I2C device found at address 0x60 !
    I2C device found at address 0x61 !
    I2C device found at address 0x62 !
    I2C device found at address 0x63 !
    I2C device found at address 0x64 !
    I2C device found at address 0x65 !
    I2C device found at address 0x66 !
    I2C device found at address 0x67 !
    I2C device found at address 0x68 !
    I2C device found at address 0x6A !
    I2C device found at address 0x6C !
    I2C device found at address 0x6E !
    I2C device found at address 0x6F !
    I2C device found at address 0x70 !
    I2C device found at address 0x71 !
    I2C device found at address 0x72 !
    I2C device found at address 0x73 !
    I2C device found at address 0x74 !
    I2C device found at address 0x75 !
    I2C device found at address 0x76 !
    I2C device found at address 0x77 !
    I2C device found at address 0x78 !
    I2C device found at address 0x7A !
    I2C device found at address 0x7C !
    I2C device found at address 0x7E !
    done

    - это что, он по всем адресам одновременно? и как теперь подключать его с другими датчиками?
     
  12. geher

    geher Гуру

    Индикатор, случайно, не такой?
    https://amperka.ru/product/troyka-quad-display
    Если такой, то он вроде, хотя и похож, но совсем не I2C. У него при инициализации контакты CLK и данных назначаются произвольно, а в его библиотеке никаких признаков адресации.
     
  13. Turder

    Turder Нуб

    Хм. Круто, чо. Он хоть поймет, если я скажу ему что-то вроде
    clock.begin ();
    TimeDisp[0] = clock.hour/ 10;
    TimeDisp[1] = clock.hour% 10;

    -объединяя скетчи из его (индикатора)примера в папке библиотеки и примера из вики часов реального времени? или придется городить алгоритм "считай первую цифру показания часов реального времени - определи как цифру в новой переменной - отобрази эту цифру командой TimeDisp - повтори еще три раза"?

    От индикатора отказаться ну никак не могу, изделие выйдет непрактичным.
     
  14. SerMos

    SerMos Нуб

    Товарищи! Всем ДВС! А как измень адрес i2c устройства. Заказал два дисплея с китая. Написано что адрес у каждого 0x27. Тоесть на одной шине они независимо работать не будут? Или я не очень разобрался в i2c? Как быть?
     
  15. Unixon

    Unixon Оракул Модератор

    1) селектор адреса на плате дисплея, если есть;
    2) мультиплексор;
    3) МК с несколькими шинами I2C;
     
  16. SerMos

    SerMos Нуб

    Понял. Спасибо. Как придут дисплеи буду разбираться
     
  17. s1984i

    s1984i Нерд

    I2C Scanner не видит адрес i2c устройства. что может быть. зависает на этой строке Serial.println("Scanning...");



    Код (C++):
    #include <Wire.h>

    byte error, address;
    int nDevices;  //Кол-во найденных устройств

    void setup() {
      Wire.begin();
      Serial.begin(9600);
      Serial.println("\nI2C Scanner");
    }

    void loop() {
      Serial.println("Scanning...");
      nDevices = 0;
      for (address = 1; address < 127; address++ )  {
        Wire.beginTransmission(address);
        error = Wire.endTransmission();
        if (error == 0)    {
          Serial.print("I2C device found at address 0x");
          if (address < 16)
            Serial.print("0");
          Serial.print(address, HEX);
          Serial.println("  !");
          nDevices++;
        }
        else if (error == 4)    {
          Serial.print("Unknow error at address 0x");
          if (address < 16)
            Serial.print("0");
          Serial.println(address, HEX);
        }
      }
      if (nDevices == 0)
        Serial.println("No I2C devices found\n");
      else
        Serial.println("done\n");
      delay(5000);  // Ждем 5 сек. до следующего сканирования
    }
     
  18. kbln

    kbln Нуб

    Подскажите пожалуйста, реально ли подключить два Troyka-акселерометра к одной Iskra Neo?
    Если достаточно прикрутить их параллельно к I2C, то как забирать с них данные по отдельности стандартной библиотекой TroykaIMU?

    UDP нашел комментарий про перемычку:
    // если напаяна перемычка, устройство доступно по новому адресу
    где она на плате?
     
    Последнее редактирование: 6 июл 2018
  19. Mitrandir

    Mitrandir Гуру

    http://wiki.amperka.ru/продукты:troyka-imu-10-dof

    На этой странице написано как менять. Не во всех ревизиях можно
     
    kbln нравится это.
  20. kbln

    kbln Нуб