Популарни И2Ц протокол омогућава две или више Ардуино плоча да комуницирају. Откријте како да их повежете и кодирате.

Док један Ардуино може да изврши много задатака, неки пројекти могу захтевати коришћење више од једне плоче за руковање различитим функционалностима. Дакле, да би се омогућио пренос података између два микроконтролера, мора се поставити комуникациони протокол као што су ЦАН, СПИ, И2Ц или УАРТ.

У овом водичу ћемо покрити основе како И2Ц функционише, хардверске везе и софтверску имплементацију која је потребна за постављање две Ардуино плоче као И2Ц мастер и славе уређаја.

Шта је И2Ц?

Интер-интегрисано коло (И2Ц) је широко коришћен комуникациони протокол у уграђеним системима и микроконтролерима за омогућавање преноса података између електронских уређаја. За разлику од СПИ (Сериал Перипхерал Интерфаце), И2Ц вам омогућава да повежете више од једног главног уређаја на магистралу са једним или више славе уређаја. Први пут га је користио Пхилипс, а познат је и као комуникациони протокол двожичног интерфејса (ТВИ).

Како функционише И2Ц комуникација?

И2Ц користи две двосмерне линије: серијски подаци (СДА) и серијски сат (СЦЛ) за пренос података и синхронизацију комуникације између уређаја. Сваки уређај повезан на И2Ц магистралу има јединствену адресу која га идентификује током комуникације. И2Ц протокол омогућава више уређаја да деле исту магистралу, а сваки уређај може да делује као главни или славе.

Комуникацију покреће главни уређај, а погрешно адресирање славе уређаја може узроковати грешке у преносу. Погледајте наш детаљни водич на како функционишу УАРТ, СПИ и И2Ц серијске комуникације да вам дам неки контекст.

Главна предност И2Ц комуникације коју вреди напоменути је флексибилност коју нуди када је у питању управљање напајањем. Уређаји који раде на различитим нивоима напона и даље могу ефикасно да комуницирају уз помоћ мењача напона. То значи да су уређајима који раде на 3,3 В потребни мењачи напона да би се повезали на 5В И2Ц магистралу.

Тхе Вире Либрари

Вире библиотека је уграђена Ардуино библиотека која пружа функције за комуникацију преко И2Ц. Користи два пина — СДА и СЦЛ — на Ардуино плочи за И2Ц комуникацију.

И2Ц пинови на Ардуино Уно:

Ардуино Нано И2Ц пинови:

Да бисте користили библиотеку, морате укључити Жица.х заглавље датотеке на почетку ваше Ардуино скице.

#укључити

Вире библиотека пружа функције за покретање комуникације са И2Ц уређајем, слање података и примање података. Неке важне функције које треба да знате укључују:

  • Вире.бегин(): користи се за придруживање И2Ц магистрали и покретање комуникације.
  • Вире.бегинТрансмиссион(): користи се за одређивање славе адресе и почетак преноса.
  • Вире.врите(): користи се за слање података на И2Ц уређај.
  • Вире.ендТрансмиссион(): користи се за завршетак преноса и проверу грешака.
  • Вире.рекуестФром(): користи се за тражење података са И2Ц уређаја.
  • Вире.аваилабле(): користи се за проверу да ли су подаци доступни за читање са И2Ц уређаја.
  • Вире.реад(): користи се за читање података са И2Ц уређаја.

Користити Вире.бегинТрансмиссион() функција за постављање адресе сензора, која се убацује као аргумент. На пример, ако је адреса сензора 0к68, користили бисте:

Жица.бегинТрансмиссион(0к68);

Подешавање Ардуино И2Ц хардвера

Да бисте повезали две Ардуино плоче користећи И2Ц, биће вам потребне следеће хардверске компоненте:

  • Две Ардуино плоче (мастер и славе)
  • Бреадбоард
  • Жице за краткоспојнике
  • Два 4.7кΩ пулл-уп отпорника

Повежите СДА и СЦЛ пинове обе Ардуино плоче на матичној плочи. Повежите пулл-уп отпорнике између СДА и СЦЛ игле и струјна шина на матичној плочи. На крају, повежите две матичне плоче заједно помоћу краткоспојних жица.

Ардуино Уно коло

Ардуино Нано коло

Кредит за слику: Ардуино И2Ц документација

Постављање Ардуино плоча као И2Ц мастер и славе уређаја

Користити Вире.рекуестФром() функцију да одредимо адресу славе уређаја са којим желимо да комуницирамо. Затим користите Вире.реад() функција за добијање података са славе уређаја.

Главни код уређаја:

#укључити
празнинаподесити(){
Жица.започети(); // придружи се и2ц магистрали
Сериал.започети(9600); // покреће серијски за излаз
}
празнинарецеивеДата(){
инт адреса = 8;
инт битесТоРеад = 6;
Жица.рекуестФром(адреса, битесТоРеад);
док (Жица.доступан()) {
цхар подаци = Жица.читати();
Сериал.принт(подаци);
}
кашњење(500);
}
празнинапетља(){
рецеивеДата();
}

Тхе Вире.онРецеиве() функција се користи да одреди шта треба да се ради када славе прими податке од главног уређаја. У горњем коду, Вире.аваилабле() функција проверава да ли су подаци доступни, а Вире.реад() функција чита податке које шаље главни уређај.

Шифра подређеног уређаја:

#укључити
празнинаподесити(){
Жица.започети(8); // придружите се И2Ц магистрали са адресом 8
Жица.онРецеиве(рецеивеЕвент); // позива рецеивеЕвент када су подаци примљени
}
празнинапетља(){
кашњење(100);
}
празнинарецеивеЕвент(инт бајтова){
Жица.писати("Здраво "); // одговара са поруком од 6 бајтова како очекује мастер
}

Слање и пријем података помоћу И2Ц

У овом примеру, прочитајмо температуру са сензора температуре ДХТ11 који је повезан са подређеним Ардуином и одштампамо је на серијском монитору главног Ардуина.

Хајде да изменимо код који смо раније написали да укључи мерење температуре које ћемо затим послати на главну плочу преко И2Ц магистрале. Главна плоча тада може прочитати вредност коју смо послали, а затим је приказати на серијском монитору.

Главни код уређаја:

#укључити
празнинаподесити(){
Жица.започети();
Сериал.започети(9600);
Сериал.принтлн("Мастер иницијализован!");
}
празнинапетља(){
Жица.рекуестФром(8, 1); // Захтевај податке о температури од славе-а
ако (Жица.доступан()) {
бајт температура = Жица.читати(); // Читање података о температури са славе-а
Сериал.принт("Температура: ");
Сериал.принт(температура);
Сериал.принтлн("°Ц");
}
кашњење(2000); // Сачекајте 2 секунде пре него што поново затражите температуру
}

Шифра подређеног уређаја:

#укључити
#укључити

#дефинисати ДХТПИН 4 // Пин повезан са ДХТ сензором
#дефинисати ДХТТИПЕ ДХТ11 // Тип ДХТ сензора
ДХТ дхт(ДХТПИН, ДХТТИПЕ);
бајт температура;

празнинаподесити(){
Жица.започети(8); // Славе адреса је 8
Жица.на захтев(рекуестЕвент);
дхт.започети();
}

празнинапетља(){
кашњење(2000); // Сачекајте 2 секунде да се ДХТ стабилизује
температура = дхт.реадТемпературе(); // Очитавање температуре са ДХТ сензора
}

празнинарекуестЕвент(){
Жица.писати(температура); // Шаље податке о температури мастеру
}

Можете да прилагодите овај код тако да одговара сензорима које имате у свом пројекту или чак да прикажете вредности сензора на модулу за приказ да направите сопствени собни термометар и мерач влажности.

Славе адресирање са И2Ц на Ардуину

Да бисте прочитали вредности са компоненти које су додате у И2Ц магистралу у таквом пројекту, важно је да укључите исправну славе адресу приликом кодирања. Срећом, Ардуино нуди библиотеку скенера која поједностављује процес идентификације славе-а адресе, елиминишући потребу за пробирањем дугачких листова са подацима о сензорима и збуњујућим онлајн документацију.

Користите следећи код да бисте идентификовали адресу било ког славе уређаја која је присутна на И2Ц магистрали.

#укључити // Укључује Вире библиотеку за И2Ц комуникацију

празнинаподесити(){
Жица.започети(); // Иницијализујте И2Ц комуникацију
Сериал.започети(9600); // Покрени серијску комуникацију са брзином преноса од 9600
док (!Сериал); // Сачекајте да се успостави серијска веза
Сериал.принтлн("\нИ2Ц скенер"); // Штампајте поруку која означава почетак И2Ц скенирања
}

празнинапетља(){
бајт грешка, адреса; // Декларишите променљиве за чување грешака и адреса уређаја
инт нДевицес; // Декларишемо променљиву за чување броја пронађених уређаја

Сериал.принтлн(„Скенирање...“); // Штампајте поруку која означава почетак И2Ц скенирања

нДевицес = 0; // Поставите број пронађених уређаја на 0
за (адреса = 1; адреса < 127; адреса++) { // Итерирајте све могуће И2Ц адресе
Жица.бегинТрансмиссион(адреса); // Покрени пренос на тренутну адресу
грешка = Жица.ендТрансмиссион(); // Прекините пренос и сачувајте све грешке

ако (грешка == 0) { // Ако нису пронађене грешке
Сериал.принт(„И2Ц уређај пронађен на адреси 0к“); // Штампајте поруку која показује да је уређај пронађен
ако (адреса < 16) Сериал.принт("0"); // Ако је адреса мања од 16, додајте почетну 0 ради форматирања
Сериал.принт(адреса, ХЕКС); // Штампајте адресу у хексадецималном формату
Сериал.принтлн(" !"); // Штампајте поруку која показује да је уређај пронађен

нДевицес++; // Повећај број пронађених уређаја
}
другоако (грешка == 4) { // Ако је пронађена грешка
Сериал.принт(„Непозната грешка на адреси 0к“); // Одштампај поруку која указује да је пронађена грешка
ако (адреса < 16) Сериал.принт("0"); // Ако је адреса мања од 16, додајте почетну 0 ради форматирања
Сериал.принтлн(адреса, ХЕКС); // Штампајте адресу у хексадецималном формату
}
}
ако (нДевицес == 0) { // Ако уређаји нису пронађени
Сериал.принтлн(„Није пронађен ниједан И2Ц уређај\н“); // Одштампај поруку која указује да нису пронађени уређаји
}
друго { // Ако су уређаји пронађени
Сериал.принтлн("готово\н"); // Штампајте поруку која означава крај И2Ц скенирања
}
кашњење(5000); // Одложите 5 секунди пре почетка следећег скенирања
}

Проширите свој пројекат већ данас

Повезивање две Ардуино плоче коришћењем И2Ц комуникационог протокола нуди флексибилан и ефикасан начин за постизање сложених задатака које не може да обради једна плоча. Уз помоћ Вире библиотеке, комуникација између две плоче помоћу И2Ц је олакшана, што вам омогућава да додате више компоненти свом пројекту.