Skip to content
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи
Collapse
  1. Главная
  2. Аппаратные модули
  3. Общие вопросы по GPIO, I2C, UART, SPI, 1-Wire, DSI, CSI, I2S
  4. Подключаем датчик температуры к шине данных i2c

Подключаем датчик температуры к шине данных i2c

Запланировано Прикреплена Закрыта Перенесена Общие вопросы по GPIO, I2C, UART, SPI, 1-Wire, DSI, CSI, I2S
7 Сообщения 1 Posters 189 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • piP Не в сети
    piP Не в сети
    pi
    написал в отредактировано pi
    #1

    i2c - шина данных для обмена информацией между устройствами. Представлена двумя линиями - линия данных SDA (второй вывод в колодке GPIO) и тактовая линия SCL (третий вывод в колодке GPIO).

    5b0015af-7fc7-49c7-bb47-2dfb38271567-image.png

    Как передаются данные по i2c на электрическом уровне я описывать не буду, это всё можно прочитать в гугле, поэтому перейдём сразу к практической части. Нам потребуется чип датчика температуры LM75A:

    737363b0-1121-4b58-a3a1-d2fd175ab108-image.png

    Поскольку чип выполнен в очень неудобном для домашнего использования форм-факторе soic-8 (очень мелкий), то нам также потребуется переходник на DIP-8,

    a16ac172-d1e7-4b5c-a358-b6f5d9aa1eef-image.png

    чтобы можно было сделать проводное соединение с Raspberry Pi. Припаиваем чип к переходнику. Линии SDA и SCL необходимо подтянуть резисторами 1кОм к питанию.В итоге конструкция должна выглядеть примерно так:

    f6d9cf7c-11d7-48e5-9ecd-4d0a5a0b9650-image.png

    59ab0dc4-2b34-48c4-8db2-d28acb0b5866-image.png

    Я использовал Raspbian по 2 причинам:

    1. В дистрибутив включены i2c драйвера в виде модулей ядра, которые остаётся лишь подгрузить командой modprobe

    2. в репозитории есть i2c-tools, которые нам потребуются для работы с датчиком температуры Итак, подгружаем модули ядра, которые позволят нам работать с i2c:

    sudo modprobe i2c-dev
    sudo modprobe i2c-bcm2708
    

    Устанавливаем i2c-tools из репозитория:

    sudo apt-get install i2c-tools
    

    В i2c-tools входят следующие утилиты:

    • i2cdetect - для определения устройств, подключенных к шине i2c
    • i2cget - для чтения данных из регистров подключенных устойств
    • i2cset - запись данных в регистры подключённых устройств

    Для начала проверим, что драйвера успешно подгрузились и шина данных i2c видна.

    i2c-detect -l
    

    Если в выводе команды отобразились доступные шины i2c (i2c-0, i2c-1), то значит можно двигаться дальше.

    Будем работать с i2c-0. Подключим датчик температуры к линиям SDA0 и SCL0, 5V питания и GND для датчика также будем брать с колодки GPIO.

    Если датчик правильно подключён, то в ответ на команду i2cdetect -y 0 мы увидим сетку, в одной из ячеек которой будет стоять адрес датчика (в моём случае 48).

    К одному ведущему (master) устройству по i2c можно подключить множество ведомых (slave), поэтому каждому ведомому устройству необходим адрес, по которому к нему будет обращаться ведущее устройство. Адрес датчика LM75A задаётся в регистре Conf

    67ef6bb3-b471-449c-8353-b66ee40f2402-image.png

    A2,A1,A0 - выводы 7,6,5 чипа LM75A(см.схему ниже). Если они присоединены к питанию, то принимают значение 1, если к земле, то 0. У меня А0 A1 A2 посажены на землю, а значит регистр, отвечающий за адрес имеет значение (1001000=0x48), что подтверждается командой i2cdetect

    60fc933b-bc3d-4b74-903c-8ee5d20fe5fb-image.png

    Теперь получим значение температуры. LM75A проводит замеры температуры каждые 100мс. Её значение хранится в регистре Temp, который состоит из двух байтов. t=(значение регистра Temp, сдвинутое на 5 битов вправо)*0.125

    a5fde0f9-df12-4a00-8e37-7d2e8cda0e2c-image.png

    Получим значение регистра:

    i2cget -y 0x48 0x00 w
    

    -y: игнорировать предупреждение о потенциальной опасности i2c-tools для вашего оборудования.

    0x48 - адрес датчика на шине i2c

    0x00 - адрес регистра Temp

    w - получить слово данных (поскольку ответ состоит из двух байтов. Для получения одного байта нужно использовать параметр b)

    в ответ мы должны увидеть значение регистра Temp. У меня это 0xa014

    0xa0 - значение младшего байта (LSByte)0x14 - значение старшего байта (MSByte) записываем в двоичной форме и сдвигаем на 5 битов вправо: 10100101=165

    165*0.125 = 20.625 градусов значение температуры на датчике.

    Запись в регистры рассмотрим в следующей статье, в которой будем управлять чипом FM приёмника по i2c

    piP 1 ответ Последний ответ
    0
    • piP Не в сети
      piP Не в сети
      pi
      replied to pi on отредактировано
      #2

      а нельзя ли использовать внутреннюю подтяжку линий к + питания?

      piP 1 ответ Последний ответ
      0
      • piP Не в сети
        piP Не в сети
        pi
        replied to pi on отредактировано
        #3

        Пользователь @pi написал в Подключаем датчик температуры к шине данных i2c:

        а нельзя ли использовать внутреннюю подтяжку линий к + питания?

        Можно. На Raspberry Pi реализована внутренняя подтяжка SDA и SCL 1,8kОм резисторами. Просто эта панелька с датчиком температуры у меня валялась давно и подключалась к плате, в которой не было внутренней подтяжки на i2c линиях

        piP 1 ответ Последний ответ
        0
        • piP Не в сети
          piP Не в сети
          pi
          replied to pi on отредактировано
          #4

          это хорошо. в описании на этоту микросхемку есть фраза, что старший бит старшего байта определяет, положительная температура или отрицательная. как это можно реализовать в программе для вывода реальной температуры?

          piP 1 ответ Последний ответ
          0
          • piP Не в сети
            piP Не в сети
            pi
            replied to pi on отредактировано
            #5

            Пользователь @pi написал в Подключаем датчик температуры к шине данных i2c:

            а нельзя ли использовать внутреннюю подтяжку линий к + питания?

            Если температура отрицательная, то бит D10 старшего байта температурного регистра будет равен 1, т.е если значение старшего байта регистра температуры >127. В этом случае температура будет вычислять следующим образом: значение регистра температуры приводится к дополнительному коду (dop_code=~temp_registry_value+1), сдвигается на 5 разрядов вправо и умножается на 0.125: temp = (dop_code>> 5)*0.125

            piP 1 ответ Последний ответ
            0
            • piP Не в сети
              piP Не в сети
              pi
              replied to pi on отредактировано
              #6

              ответ
              Люди, подскажите где мы берем коэффициент 0,125 на который умножаем. Никак не могу понять…

              piP 1 ответ Последний ответ
              0
              • piP Не в сети
                piP Не в сети
                pi
                replied to pi on отредактировано pi
                #7

                Пользователь @pi написал в Подключаем датчик температуры к шине данных i2c:

                ответ
                Люди, подскажите где мы берем коэффициент 0,125 на который умножаем. Никак не могу понять…

                из документации к датчику

                1. If the Temp data MSByte bit D10 = 0, then the temperature is positive and Temp value (°C) = +(Temp data)×0.125°C.
                2. If the Temp data MSByte bit D10 = 1, then the temperature is negative and Temp value (°C) =−(2’s complement of Temp data)×0.125°C.
                1 ответ Последний ответ
                0

                • Войти

                • Нет учётной записи? Зарегистрироваться

                • Login or register to search.
                • Первое сообщение
                  Последнее сообщение
                0
                • Категории
                • Главная
                • Документация
                • Последние
                • Пользователи