Как подключить несколько устройств по I2C Arduino
В следующем примере к шине IIC Arduino будет подключено сразу три устройства — текстовый дисплей 1602, датчик давления bmp180 и RTC модуль часов. После сборки схемы можно сделать предварительное сканирование шины, но адреса у всех устройств разные и изменить адрес можно только у дисплея. У других устройств адреса «вшиты» производителем и используются в библиотеках по умолчанию.
Скетч. Подключение нескольких устройств к шине i2c
I2C интерфейс: подключение нескольких устройств
После сборки схемы, убедитесь, что у вас установлены необходимые библиотеки для работы с устройствами по IIC протоколу, и загрузите следующий пример кода в микроконтроллер. Данная программа будет выводить на текстовый экран текущую дату и время суток (устанавливаются в процедуре void setup и время можно поменять), а также данные о температуре воздуха и атмосферном давлении.
#include "Wire.h" // подключаем библиотеку для интерфейса I2C #include "LiquidCrystal_I2C.h" // подключаем библиотеку для 1602 LiquidCrystal_I2C LCD(0x27, 16, 2); // создаем объект LCD #include "SFE_BMP180.h" // подключаем библиотеку для bmp180 SFE_BMP180 pressure; // создаем объект pressure #include <iarduino_RTC.h> // подключаем библиотеку для часов iarduino_RTC time(RTC_DS1307); // создаем объект time void setup() { LCD.init(); // инициализация дисплея LCD.backlight(); // включение подсветки pressure.begin(); // запускаем датчик давления time.begin(); // запускаем модуль часов time.settime(0, 30, 16, 1, 4, 21, 5); // сек, мин, часы, дата, мес, год, день недели } void loop() { char status; double T, P, p0, a; // если прошла 1 секунда обновляем информацию if (millis() % 1000 == 0) { // выводим время с секундами и дату (день, месяц) LCD.setCursor(0, 0); LCD.print(time.gettime("H:i:s - d.m")); // узнаем температуру и выводим на дисплей status = pressure.startTemperature(); if (status != 0) { delay(status); status = pressure.getTemperature(T); if (status != 0) { LCD.setCursor(0, 1); LCD.print("T:"); LCD.print(T, 2); // узнаем давление и выводим на дисплей status = pressure.startPressure(3); if (status != 0) { delay(status); status = pressure.getPressure(P, T); if (status != 0) { p0 = pressure.sealevel(P, 1655.0); LCD.print(" D:"); LCD.print(p0, 2); } else { LCD.setCursor(0, 1); LCD.print("error retrieving pressure"); } } else { LCD.setCursor(0, 1); LCD.print("error starting pressure"); } } else { LCD.setCursor(0, 1); LCD.print("error retrieving temperature"); } } else { LCD.setCursor(0, 1); LCD.print("error starting temperature"); } } }
Пояснения к коду:
- обновление информации на текстовом экране происходит каждую секунду, данный интервал можно увеличить по своему желанию;
- время выводится с секундами, формат вывода времени и даты также можно изменить в строчке
Как подключить жк дисплей к Ардуино по I2C
Жидкокристаллический дисплей 1602 с I2C модулем подключается к плате Ардуино всего 4 проводами — 2 провода данных и 2 провода питания. Подключение QAPASS 1602a к Arduino проводится стандартно для шины I2C: вывод SDA подключается к порту A4, вывод SCL – к порту A5. Питание LCD дисплея осуществляется от порта +5V. Смотрите подробнее схему подключения жк монитора 1602 на фото ниже.
Для занятия нам понадобятся следующие детали:
- плата Arduino Uno / Arduino Nano / Arduino Mega;
- LCD монитор 1602 i2c;
- 4 провода «папа-мама».
После подключения LCD монитора к Ардуино через I2C вам потребуется установить библиотеку LiquidCrystal_I2C.h для работы с LCD дисплеем по интерфейсу I2C и библиотека Wire.h (имеется в стандартной программе Arduino IDE). Скачать рабочую библиотеку LiquidCrystal_I2C.h для LCD 1602 с модулем I2C можно на странице Библиотеки для Ардуино на нашем сайте по прямой ссылке с Google Drive.
Пояснения к коду:
- перед выводом информации на дисплей, необходимо задать положение курсора командой setCursor(0,1) , где 0 — номер символа в строке, 1 — номер строки;
- в отличии от clear() — команда noDisplay() не удаляет надпись, а отключает ее вывод на дисплее и ее можно снова покзать.
TCA9548A I2C Multiplexer Selecting an I2C Bus
As mentioned previously, to select a specific I2C bus to read/write data, you just need to send a single byte to the multiplexer with the desired output port number (0 to 7).
To do that, you can simply use the following user-defined function:
Then, you just need to call that function and pass as an argument the port bus number you want to control before sending the I2C commands. For example, to control the device connected to bus number 3, you would call the following line before calling other I2C commands (note that it starts at 0):
You’ll see how this works with practical examples in the following sections.
Подключение ЖК экрана к Ардуино по I2C
Для подключения необходимы сама плата Ардуино, дисплей, макетная плата, соединительные провода и потенциометр.
Если вы используете специальный отдельный i2c переходник, то нужно сначала припаять его к модулю экрана. Ошибиться там трудно, можете руководствоваться такой схемой.
Жидкокристаллический монитор с поддержкой i2c подключается к плате при помощи четырех проводов – два провода для данных, два провода для питания.
- Вывод GND подключается к GND на плате.
- Вывод VCC – на 5V.
- SCL подключается к пину A5.
- SDA подключается к пину A.
И это все! Никаких паутин проводов, в которых очень легко запутаться. При этом всю сложность реализации i2C протокола мы можем просто доверить библиотекам.
LCD с RGB подсветкой
Эти экраны работают так же как и обычные, но для подсветки установлены три светодиода (красный, зеленый, синий), так что вы можете использовать разные цвета подсветки.
После подключения LCD и его проверки в соответствии с инструкциями выше, подключите светодиоды к ШИМ аналоговым пинам вашего Arduino для точной настройки цвета. Если вы используете Arduino Uno, у вас должно было остаться три свободных ШИМ контакта. подключите красный светодиод (16 контакт на LCD) к Digital 3, зеленый светодиод (контакт 17) — к Digital 5, а синий светодиод (18 контакт на LCD) — к digital 6. На LCD модуле уже предусмотрены резисторы, так что подключать дополнительные не надо.
Теперь загрузите приведенный ниже скетч на Arduino.
// включаем в скетч библиотеки:
#include
#include
#define REDLITE 3
#define GREENLITE 5
#define BLUELITE 6
// объявляем количество контактов, которые используем
// для передачи данных
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);
// яркость можно изменять в диапазоне 0 -> 255
int brightness = 255;
// настраиваем количество столбцов и строк на LCD:
lcd.begin(16, 2);
// отображаем сообщение на LCD.
lcd.print(«RGB 16×2 Display «);
lcd.setCursor(0,1);
lcd.print(» Multicolor LCD «);
pinMode(REDLITE, OUTPUT);
pinMode(GREENLITE, OUTPUT);
pinMode(BLUELITE, OUTPUT);
brightness = 100;
for (int i = 0; i
setBacklight(i, 0, 255-i);
for (int i = 0; i
setBacklight(255-i, i, 0);
for (int i = 0; i
setBacklight(0, 255-i, i);
void setBacklight(uint8_t r, uint8_t g, uint8_t b) {
// настраиваем красный светодиод — он ярче остальных!
r = map(r, 0, 255, 0, 100);
g = map(g, 0, 255, 0, 150);
r = map(r, 0, 255, 0, brightness);
g = map(g, 0, 255, 0, brightness);
b = map(b, 0, 255, 0, brightness);
// общий анод, так что инвертируем!
r = map(r, 0, 255, 255, 0);
g = map(g, 0, 255, 255, 0);
b = map(b, 0, 255, 255, 0);
Serial.print(«R = «); Serial.print(r, DEC);
Serial.print(» G = «); Serial.print(g, DEC);
Serial.print(» B = «); Serial.println(b, DEC);
analogWrite(REDLITE, r);
analogWrite(GREENLITE, g);
analogWrite(BLUELITE, b);
Результат работы данного скетча приведен на видео ниже
Как подключить LCD дисплей 1602 к Arduino
При сборке своего металлоискателя у меня на руках оказался LCD дисплей 1602, построенный на контроллера HD44780. Решил не упустить возможность и подключить его к своему китайскому аналогу Arduino UNO.
Вот такой дисплей 1602 будем сегодня подключать к Arduino.
Купить подобный экран можно за $1.25.
Цифры «1602» говорят о том, что дисплей состоит из 2-х строк, по 16 символов. Это довольно распространённый экран, с применением которого народ конструирует часы, тестеры и прочие гаджеты. Дисплей бывает с зелёной и голубой подсветкой.
- К дисплею я припаял гребёнку контактов, что бы можно было легко подключать провода.
Подключать дисплей 1602 к Arduino будем через 4-битный вариант параллельного интерфейса. Существует вариант и 8-битного интерфейса, но при нём задействуется больше проводов, а выигрыша в этом мы не увидим.
Кроме дисплея и Arduino, нам понадобятся провода и переменный резистор на 10кОм. Резистор подойдёт любой марки, лишь бы был необходимого номинала.
Питание на дисплей подаётся через 1-й (VSS) и 2-й (VDD) выводы. К выводам 15 (А) и 16 (K) — подаётся питание на подсветку дисплея.
Поскольку для питания и подсветки используется одно напряжение +5В, запитаем их от пинов Arduino «5V» и «GND».
Главное не перепутать полярность, иначе можно спалить электронику дисплея.
3-й вывод (V0) подключаем к ножке переменного резистора, им будем управлять контрастностью дисплея. Резистор можно не использовать, а вывод «V0» подключить к GND. В таком случае контрастность будет максимальной и не будет возможности её плавной регулировки.
5-й вывод (RW) используется для чтения с дисплея либо для записи в него. Поскольку мы будем только писать в дисплей, соединим этот вывод с землёй (GND).
Выводы: 4-й (RS), 6-й (E), 11-й (D4), 12-й (D5), 13-й (D6), 14-й ( D7) подключаем к цифровым пинам Arduino. Не обязательно использовать пины те же что и у меня, можно подключить к любым цифровым, главное затем правильно их выставить в скетче.
- Моя подключённая Ардуина, осталось соединить её с компьютером через USB и залить скетч.
- В примете будем использовать скетч из стандартного набора.
- В Arduino IDE выбираем «Файл» — «Образцы» — «LiquidCrystal» — «HelloWorld».
- Давайте посмотрим на код скетча.
В строке «LiquidCrystal lcd», в скобках, выставлены цифровые пины, которые задействованы на Arduino. Пины выставляются в такой последовательности: RS, E, DB4, DB5, DB6, DB7. Если вы задействовали другие цифровые пины, при подключении дисплея, впишите их в нужной последовательности в скобках.
В строке «lcd.print(«hello, world!»);» выводится приветствие на дисплей, по-умолчанию это надпись «hello, world!», её можно поменять на любую свою, пишем на латинице.
Загружаем скетч в Arduino и вот результат. Вместо «hello, world!» я вписал свой сайт. Строкой ниже, таймер производит отсчёт времени.
Приступая к работе
Во-первых, рассмотрим сам мультиплексор TCA9548A. TCA9548A — это шлюз между вашим Ардуино и восемью отдельными I2C шинами.
Стороны TCA9548A у вас есть одна шина с Ардуино. С другой стороны TCA9548A у вас есть восемь шин I2C, и только одна из них может быть подключена к Ардуино одновременно.
TCA9548 может функционировать при напряжении от 1,8 до 5 В и работать с устройствами, которые имеют рабочее напряжение от 1,8 до 5 В. Это очень удобно, так как, например,вы можете использовать устройства с питанием 3,3В с 5 вольтовой Ардуино. Итак, приступим.
Вставьте модуль в макетную плату и подключите его, как показано ниже:
Мы используем красные и синие линии питания макетной платы как 5В и GND соответственно. Подключим 5В и GND от Ардуино к линии питания макетной платы. Выводы A0, A1 и A2 подключим к GND, а A4/A5 к SDA/SCL соответственно к модулю:
Электрические соединения следующие (модуль TCA9548 — Ардуино):
- Vin к 5В
- GND к GND
- A0 к GND
- A1 к GND
- A2 к GND
- SDA к A4
- SCL к A5
Далее мы рассмотрим адрес I2C шины для TCA9548A. Используя схему подключения, показанную выше, адрес I2C шины будет 0x70. Вам нужно изменить его только в том случае, если одно из ваших устройств также имеет адрес 0x70.
Протокол I2C в Arduino
На следующем рисунке показаны контакты платы Arduino UNO, которые используются для связи по протоколу I2C.
Линия протокола I2C | Контакт платы Arduino UNO |
SDA | A4 |
SCL | A5 |
Для осуществления связи по протоколу I2C в плате Arduino используется библиотека <Wire.h>. В ней содержатся следующие функции для связи по протоколу I2C.
1. Wire.begin(address).
Эта команда производит инициализацию библиотеки Wire и осуществляет подключение к шине I2C в качестве ведущего (master) или ведомого (slave). 7-битный адрес ведомого в данной команде является опциональным и если он не указан , то устройство (плата Arduino) подключается к шине I2C в качестве ведущего (master).
2. Wire.read().
Эта функция используется для считывания байта, принятого от ведущего или ведомого.
3. Wire.write().
Эта функция используется для записи данных в устройство, являющееся ведомым или ведущим.
От ведомого ведущему (Slave to Master): ведомый записывает (передает) данные ведущему когда в ведущем работает функция Wire.RequestFrom().
От ведущему ведомому (Master to Slave): в этом случае функция Wire.write() должна использоваться между вызовами функций Wire.beginTransmission() и Wire.endTransmission().
Функцию Wire.write() можно использовать в следующих вариантах:
- Wire.write(value); value — значение передаваемого одиночного байта;
- Wire.write(string) – для передачи последовательности байт;
- Wire.write(data, length); data – массив данных для передачи в виде байт, length – число байт для передачи.
4. Wire.beginTransmission(address).
Эта функция используется для начали передачи по протоколу I2C устройству с заданным адресом ведомого (slave address). После этого вызывается функция Wire.write() с заданной последовательностью байт для передачи, а после нее функция endTransmission() для завершения процесса передачи.
5. Wire.endTransmission().
Эта функция используется для завершения процесса передачи ведомому устройству, который до этого был инициирован функциями beginTransmission() и Wire.write().
6. Wire.onRequest().
Эта функция вызывается когда ведущий запрашивает данные с помощью функции Wire.requestFrom() от ведомого устройства. В этом случае мы можем использовать функцию Wire.write() для передачи данных ведущему.
7. Wire.onReceive().
Эта функция вызывается когда ведомое устройство получает данные от ведущего. В этом случае мы можем использовать функцию Wire.read() для считывания данных передаваемых ведущим.
8. Wire.requestFrom(address,quantity).
Эта функция используется в ведущем устройстве чтобы запросить байты (данные) с ведомого устройства. После этого используется функция Wire.read() чтобы принять данные переданные ведомым устройством.
address: 7-битный адрес устройства, с которого запрашиваются байты (данные).
quantity: число запрашиваемых байт.
ESP32 с несколькими устройствами I2C
Как мы уже упоминали ранее, каждое устройство I2C имеет свой собственный адрес, поэтому можно использовать несколько устройств I2C на одной шине. Когда у нас есть несколько устройств с разными адресами, все просто в их настройке: подключите оба периферийных устройства к линиям ESP32 SCL и SDA, в коде обращайтесь к каждому периферийному устройству по его адресу. Посмотрите на следующий пример, который получает показания датчика от датчика BME280 (через I2C) и отображает результаты на OLED-дисплее I2C.
Схема подключения для этого примера следующая.
Поскольку OLED и BME280 имеют разные адреса, мы можем без проблем использовать одни и те же линии SDA и SCL. OLED-дисплей имеет адрес 0x3C, а адрес BME280 — 0x76.
Но что, если у вас есть несколько периферийных устройств с одним и тем же адресом? Например, несколько дисплеев OLED или несколько датчиков BME280? Есть несколько решений: изменить адрес устройства I2C или использовать мультиплексор I2C.
Рассмотрим первый случай. Многие платы имеют возможность изменять адрес I2C в зависимости от его схемы. Например, если посмотреть на следующий OLED-дисплей:
Поместив резистор на одну или другую сторону, вы можете выбрать разные адреса I2C. Это также происходит с другими компонентами.
Однако в предыдущем примере это позволяет вам иметь только два дисплея I2C на одной шине: один с адресом 0x3C, а другой с адресом 0x3D. Кроме того, иногда сложно выполнить изменение адреса I2C. Таким образом, чтобы иметь несколько устройств с одинаковым адресом на одной шине I2C, вы можете использовать мультиплексор I2C, такой как TCA9548A, который позволяет обмениваться данными с 8 устройствами с одним и тем же адресом.
Что такое I2C?
c — это аббревиатура от Inter-Integrated Circuit (меж-интеграционная цепь или последовательная асимметричная шина).
I2C — низкоскоростной последовательный протокол связи, подходящий для передачи данных на короткие расстояния. Если вам необходимо передавать данные на большие расстояния, этот протокол не рекомендуется. Пример простой сети I2C показан ниже.
Как видно на диаграмме, преимущество использования I2C состоит в том, что для связи с несколькими устройствами требуется всего два провода.
Вся связь проходит по двум проводам к ведущему и ведомым устройствам и от них. Это очень полезно при выполнении проектов Arduino, так как Arduino имеет ограниченное количество входных/выходных контактов.
Многие датчики и модули, предназначенные для Arduino используют I2C для связи.
Использование I2C
Чтобы продемонстрировать, как использовать I2C в Arduino, давайте создадим проект, который посылает данные туда и обратно между двумя ардуинами.
Мы будем использовать I2C связи для изменения скорости мигания светодиода контакта 13 на одном Arduino, в зависимости от положения потенциометра, подключенного к другому Arduino.
Один Arduino будет выступать в качестве мастера, а другой Arduino будет выступать в качестве ведомого.
Пины I2C Arduino
Arduino имеет специальные контакты для I2C, которые имеют встроенные подтягивающие резисторы в соответствии с требованиями протокола I2C.
Для плат Arduino Uno это контакты A4 и A5. Пин A4 — это контакт SDA, а пин A5 — это контакт SCL. В версии Arduino Uno R3 есть еще один набор контактов I2C рядом с USB-разъемом:
Компоненты оборудования
Чтобы создать этот проект, вам понадобятся следующие компоненты:
- Arduino Uno — 2 шт.
- Потенциометр (10КОм) — 2 шт.
- Перемычки
Схема соединения
После того, как вы соберете все детали, пришло время собрать проект. Следуйте нижеприведенной электрической схеме, чтобы все подключить:
Вы могли заметить, что у нас нет подтягивающих резисторов на линиях SDA и SCL. Подтягивающие резисторы уже встроены в I2C контакты Arduino, так что они нам не нужны.
Включение I2C на Raspberry Pi.
Первым делом нам следует включить интерфейс I2C. Для этого воспользуемся утилитой для конфигурации Raspberry Pi — raspi-config. Вводим в терминале команду:
sudo raspi-config
Далее переходим в пункт Interfacing options и включаем I2C:
После этого необходимо перезапустить плату:
sudo reboot
Альтернативным способом включения I2C является редактирование файла /boot/config.txt. В файле находим и раскомментируем строку:
dtparam=i2c_arm=on
После чего аналогичным образом перезапускаем плату. При следующем включении модуль I2C будет активирован. Оба этих способа можно использовать, подключившись к плате по SSH.
Не Ардуино единым
- Полезная и интересная информация.
- Язык программирования Processing. Сайт.
- Язык программирования Processing. Учебное видео.
- Proteus.
- Графический редактор EasyEDA. Дистрибутив.
- ExpressPCB.
- Настройка RDP в Windows 7.
- Что такое Linux Mint.
- Как установить Arduino IDE в Ubuntu Linux.
- Славянский календарь.
- Славянский календарь. Гороскоп по дате рождения.
———————————————
Похожие запросы по теме:
- Ардуино обучение.
- Ардуино обучение программированию
- Обучение ардуино с нуля.
- Ардуино уно обучение.
- Arduino +для обучения программированию.
- Программа для ардуино нано обучение.
- Обучение программированию ардуино с нуля.
- Ардуино уно обучение с нуля.
- Онлайн обучение ардуино.
- Обучение программированию ардуино с нуля бесплатно онлайн.
———————————————
- Скороговорки.
- Безопасность бизнеса.
Методы библиотеки
begin()
Инициализация библиотеки Wire и подключение к шине I2C в качестве ведущего или ведомого устройства. Как правило, вызывается только один раз.
Параметры
address: 7-битный адрес устройства (если работаем в режиме ведомого). Если не указано, то контроллер подключается к шине в роли ведущего (master).
requestFrom()
Используется ведущим устройством для запроса байта от ведомого устройства. Байты могут быть получены с помощью методов available() и read().
Параметры
- address: 7-битный адрес устройства для запроса байтов данных
- quantity: количество запрошенных байт
Возвращает число считанных байт.
beginTransmission()
Начало передачи I2C для ведомого устройства с заданным адресом. Затем, нужно вызвать метод write() для добавления последовательности байт в очередь предназначенных для передачи, и выполнить саму передачу данных методом endTransmission().
Параметры
address: 7-битный адрес устройства для передачи.
endTransmission()
Завершает передачу данных для ведомого устройства, которое было начато beginTransmission() и, фактически, осуществляет передачу байт, которые были поставлены в очередь методом write().
Параметры
Нет
Возвращает байт, который указывает статус передачи:
- 0: успех
- 1: данных слишком много и они не помещается в буфер передачи/размер буфера задаётся определением #define BUFFER_LENGTH 32
- 2: получили NACK на передачу адреса
- 3: получили NACK на передачу данных
- 4: другая ошибка
write()
Записывает данные от ведомого устройства в ответ на запрос мастера, или записывает очередь байт для передачи от мастера к ведомому устройству (в промежутках между вызовами beginTransmission() и endTransmission()).
Параметры
- value: значение для отправления как единичный байт
- string: строка для отправления как последовательность байт
- data: массив байт для отправления
- length: число байт для передачи
Возвращает число записанных байт.
available()
Метод available() наследуется от класса Stream. Возвращает количество байт, доступных для получения. Этот метод должно быть вызван на мастере, после вызова requestFrom() или ведомым внутри обработчика onReceive().
Параметры
Нет.
Число байт, доступных для чтения.
read()
Метод read() наследуется от класса Stream. Считывает байт, который был передан от ведомого устройства к мастеру, после вызова requestFrom() или был передан от мастера к ведомому.
Параметры
Нет.
Следующий полученный байт.
onReceive()
Регистрирует функцию, которая вызывается, когда ведомое устройство получает данные от мастера.
Параметры
function: функция, которая вызывается, когда ведомый получает данные; обработчик должен принимать один параметр — int (число байт, считанных от мастера) и ничего не возвращать. Например:
void MyHandler (int numBytes);
Параметры
function: функция, которая будет вызываться; не имеет параметров и ничего не возвращает.
например:
void MyHandler();
Последние материалы
Как конвертировать документ PDF в файл Microsoft Word
Онлайн конвертеры быстры и легки в использовании. Онлайн конвертер PDF в DOC — это конвертер, который облегчит вам задачу конвертирования и позволит сохранить PDF документ в формат Microsoft Word (DOC или DOCX). Конвертер из PDF в WORD преобразует докумен.
Как удалить «Байду» с компьютера?
Есть такой китайский антивирус
– Baidu
. Причем, говорят, вполне неплохой. Лично я пока его не устанавливал, поэтому ничего о нем сказать не могу. Но беда в том, что среди пользователей о нем идет дурная слава. Происходит это из-за того, что под китайск.
Сброс настроек на Windows Phone
Вы решили сделать хард ресет Microsoft Lumia 535? Скорее всего, вы забыли пароль или просто хотите стереть персональные данные с внутренней памяти смартфона. Мы расскажем вам про несколько способов, как сделать хард ресет Microsoft Lumia 535.
Прежде чем д.
Как убрать надпись об активации через реестр Как заблокировать кнопку windows на клавиатуре
Надоело уже это бесконечное обновление Windows 7! Каждый день загружает и устанавливает. Режет скорость интернета, тормозит компьютер, перезагружает его без спроса. И без разницы этой системе, смотрю я фильм, пишу курсовую или делаю важный отчет для начал.
Использование I2C
Чтобы продемонстрировать, как использовать I2C в Arduino, давайте создадим проект, который посылает данные туда и обратно между двумя ардуинами.
Мы будем использовать I2C связи для изменения скорости мигания светодиода контакта 13 на одном Arduino, в зависимости от положения потенциометра, подключенного к другому Arduino.
Один Arduino будет выступать в качестве мастера, а другой Arduino будет выступать в качестве ведомого.
Пины I2C Arduino
Arduino имеет специальные контакты для I2C, которые имеют встроенные подтягивающие резисторы в соответствии с требованиями протокола I2C.
Для плат Arduino Uno это контакты A4 и A5. Пин A4 — это контакт SDA, а пин A5 — это контакт SCL. В версии Arduino Uno R3 есть еще один набор контактов I2C рядом с USB-разъемом:
Схема соединения
После того, как вы соберете все детали, пришло время собрать проект. Следуйте нижеприведенной электрической схеме, чтобы все подключить:
Вы могли заметить, что у нас нет подтягивающих резисторов на линиях SDA и SCL. Подтягивающие резисторы уже встроены в I2C контакты Arduino, так что они нам не нужны.
ЖК-дисплей LCD 1602: подключение к Arduino через I2C-модуль
Contents
В это статье мы рассмотрим способы подключения жидкокристаллического дисплея LCD 1602 (чип HD44780) к Arduino. Вообще говоря, LCD 0802 подключается аналогично.
Дисплей LCD 1602 наиболее ходовой из ЖК-дисплеев для ардуины, поскольку прост в подключении и программировании, и стоит недорого. Дисплей позволяет выводить на экран 2 строки по 16 символов в каждой, чего в принципе достаточно для простых приложений типа вывести текущее время и дату.
Сразу скажу, что проще всего этот дисплей будет подключать через IIC/I2C-модуль, что позволяет сильно сократить число проводов до четырех , два из которых — это питание. Стоит этот дополнительный модуль меньше стоимости дисплея. Собственно комплект дисплей + IIC/I2C-модуль, если брать на Али, обойдется меньше, чем в 2$ .
Так что нет смысла покупать их по отдельности.
В общем два основных способа подключения — это напрямую и через I2C-модуль. Давайте сначала рассмотрим способ через I2C-модуль, т.к. он наиболее практический.
Работа с I2C на Python.
Для работы с шиной I2C необходимо установить пакет python-smbus:
sudo apt-get install -y python-smbus
По традиционной схеме создаем файл, в котором и будем писать код для работы с I2C, назовем файл, к примеру, i2c_test.py. Ну и для наглядной демонстрации прочитаем значение все того же регистра с адресом 0x75 и сравним результаты. Собственно, пишем минимально необходимый для этого код:
from smbus import SMBus bus = SMBus(1) data = bus.read_byte_data(0x68, 0x75) print(hex(data)) bus.close()
Давайте разберем, что тут происходит, поэтапно. Делаем import библиотеки:
from smbus import SMBus
Открываем использующуюся у нас шину i2c-1:
bus = SMBus(1)
И, наконец, читаем значение регистра, выводим его на экран и заканчиваем работу с I2C:
data = bus.read_byte_data(0x68, 0x75) print(hex(data)) bus.close()
Первый аргумент функции — адрес устройства, второй — адрес регистра. Запускаем выполнение кода:
python i2c_test.py
И в результате видим верное значение регистра:
А это говорит нам о том, что код сработал абсолютно верно. Напоследок, рассмотрим некоторые другие функции библиотеки smbus, которые можно использовать по своему усмотрению:
Функция | Описание |
---|---|
long read_byte(int addr) | Чтение байта данных |
long write_byte(int addr, char val) | Запись байта данных |
long read_byte_data(int addr, char cmd) | Чтение значения регистра |
long write_byte_data(int addr, char cmd, char val) | Запись значения в регистр |
long[] read_block_data(int addr, char cmd) | Чтение блока данных (до 32-х байт) из регистра |
write_block_data(int addr, char cmd, long vals[]) | Запись блока данных в регистр |
long read_word_data(int addr, char cmd) | Чтение слова (2-х байт) из регистра |
long write_word_data(int addr, char cmd, int val) | Запись слова (2-х байт) в регистр |
На этом заканчиваем обзор работы с шиной I2C для Raspberry Pi, на очереди — интерфейс SPI, который будем запускать в следующей статье.
LCD I2C arduino не могу подключить
попробовать опредилить адрес заливаю его а мне только показывает Scanning. и дальше ничего. Что подскажете сделать?
а почему дисплей подключен сразу к 3,3 В и к 5 В?
там просто плохо видно он подключен к 5 и к земле
Все вы правильно делаете. Ищите контакт со стороны UNO, попробуйте разъемы SCL и SDA на UNO рядом с кварцем.
Можете рассмотреть чип на переходнике. Маркировка PCF8574T даст I2C адрес по умолчанию 0x27, PCF8574AT — адрес 0x3F.
Я это все уже пробовал к сожалению ничего не помогло, а маркировка ida8574p n2k0h5
сканер I2C какой адрес выдает?
в том и дело что сканер ничего не выдает пишет что началось сканирование и все ничего более не происходит
Код сканера корректно обрабатывает ситуации, когда вообще никакое устройство не подключено к I2C. Был неправ, дело не в контакте. Что-то у вас с программной средой.
Маркировкой чипа адаптера сильно озадачили. Но дело все равно не в этом.
и что посоветуете сделать? уже куча всего перепробовал
прописать ноги Ардуины как входы, дальше сделать пустой бесконеный цикл и посмотреть тестером наряжение на ногах, т.е. проверка на наличие подтягивающих резисторов к +5В
Ну подсказал же уже. Железо тут вообще ни при чем, этот код работает на пустой плате. Далек от среды ардуино, но специально запустил приведенный вами код на такой же плате, что и на фотографии. Библиотека Wire работает хорошо и не зависает, мне не удалось найти в ее коде возможные причины зависания при неподключенном устройстве.
Если правильно вас понял, вы видите в окне терминала слово Scanning. и на этом все заканчивается. Но чудес не бывает (только если очень редко). Из цикла for вы не выходите, зависнуть там можно только при входе в Wire (ну или в twi.h, которая под ней), никто из них не зависает (у меня, специально мучил).
Какой вывод? Разбирайтесь со средой, с ее установками или что там. Вообще что-нибудь, не требующее перефирии, запускается?
И вам спасибо. Благодаря вам посмотрел библиотеки, twi.h забавно написана, хорошо.
Источник
ЖК дисплей Arduino LCD 1602
LCD 1602
Краткое описание пинов LCD 1602
Давайте посмотрим на выводы LCD1602 повнимательней:
Каждый из выводов имеет свое назначение:
- Земля GND;
- Питание 5 В;
- Установка контрастности монитора;
- Команда, данные;
- Записывание и чтение данных;
- Enable;
7-14. Линии данных;
Технические характеристики дисплея:
- Символьный тип отображения, есть возможность загрузки символов;
- Светодиодная подсветка;
- Контроллер HD44780;
- Напряжение питания 5В;
- Формат 16х2 символов;
- Диапазон рабочих температур от -20С до +70С, диапазон температур хранения от -30С до +80 С;
- Угол обзора 180 градусов.
Схема подключения LCD к плате Ардуино без i2C
Стандартная схема присоединения монитора напрямую к микроконтроллеру Ардуино без I2C выглядит следующим образом.
Из-за большого количества подключаемых контактов может не хватить места для присоединения нужных элементов. Использование I2C уменьшает количество проводов до 4, а занятых пинов до 2.