- Шта је И2Ц комуникацијски протокол?
- Како функционише И2Ц комуникација?
- Где користити И2Ц комуникацију?
- И2Ц у Ардуину
- Компоненте потребне
- Кружни дијаграм
- Радно објашњење
- И2Ц програмирање у Ардуину
- Објашњење мастер Ардуино програмирања
- Објашњење програмирања за славе Ардуино
У нашем претходном водичу сазнали смо о СПИ комуникацији у Ардуину. Данас ћемо сазнати о другом протоколу серијске комуникације: И2Ц (Интер интегрисани кругови). Упоређујући И2Ц са СПИ, И2Ц има само две жице, док СПИ користи четири, а И2Ц може имати вишеструки главни и подређени, док СПИ може имати само један главни и више подређених. Дакле, у пројекту постоји више од једног микроконтролера који треба да буде мајстор, а затим се користи И2Ц. И2Ц комуникација се обично користи за комуникацију са жироскопом, акцелерометром, барометријским сензорима притиска, ЛЕД дисплејима итд.
У овом упутству за Ардуино И2Ц користићемо И2Ц комуникацију између две ардуино плоче и међусобно ћемо слати вредности (0 до 127) помоћу потенциометра. Вредности ће бити приказане на ЛЦД екрану од 16к2 повезаном на сваки од Ардуина. Овде ће један Ардуино деловати као Господар, а други као Славе. Почнимо са уводом о И2Ц комуникацији.
Шта је И2Ц комуникацијски протокол?
Термин ИИЦ означава „ Интер интегрисани кругови “. Обично се означава као И2Ц или И на квадрат Ц или чак као протокол двожичног интерфејса (ТВИ) на неким местима, али све то значи исто. И2Ц је синхрони комуникацијски протокол, што значи да оба уређаја који деле информације морају да деле заједнички сигнал сата. Има само две жице за размену информација од којих се једна користи за сигнал славине, а друга за слање и примање података.
Како функционише И2Ц комуникација?
И2Ц комуникацију је први представио Пхиллипс. Као што је раније речено, има две жице, те две жице ће бити повезане преко два уређаја. Овде се један уређај назива мастер, а други уређај се назива славе. Комуникација треба и увек ће се одвијати између двоје господара и роба. Предност И2Ц комуникације је у томе што се на Мастер може повезати више подређених уређаја.
Комплетна комуникација одвија се кроз ове две жице, наиме, серијски сат (СЦЛ) и серијски подаци (СДА).
Серијски сат (СЦЛ): Дијели сигнал такта који генерира мастер са подређеним уређајем
Серијски подаци (СДА): шаље податке главном и подређеном између и између њих.
У било ком тренутку само ће мастер моћи да започне комуникацију. Будући да је у магистрали више од једног подређеног уређаја, мастер мора да се односи на сваког подређеног користећи другу адресу. Када им се обрати само подређени с том одређеном адресом, одговориће са информацијама, док ће остали наставити да дају отказ. На овај начин можемо користити исту магистралу за комуникацију са више уређаја.
На ниво напона на И2Ц нису предефинисани. И2Ц комуникација је флексибилна, значи уређај који се напаја напоном од 5в, може користити 5в за И2Ц, а уређаји од 3.3в могу користити 3в за И2Ц комуникацију. Али шта ако два уређаја који раде на различитим напонима треба да комуницирају помоћу И2Ц? 5В И2Ц бус не може да се повеже са 3.3В уређајем. У овом случају се мењачи напона користе за усклађивање нивоа напона између две И2Ц магистрале.
Постоје неки услови који уоквирују трансакцију. Иницијализација преноса започиње падајућом ивицом СДА, што је дефинисано као услов „СТАРТ“ на доњем дијаграму где мастер оставља СЦЛ висок док је СДА низак.
Као што је приказано на горњем дијаграму испод, Пад СДА је хардверски окидач за стање СТАРТ. Након тога сви уређаји на истој магистрали прелазе у режим слушања.
На исти начин, растућа ивица СДА зауставља пренос који је приказан као услов 'СТОП' на горњем дијаграму, где мастер оставља СЦЛ високо и такође пушта СДА да иде ВИСОКО. Дакле, успон ивице СДА зауставља пренос.
Р / В бит означава смер преноса следећих бајтова, ако је ВИСОК, значи да ће славе преносити, а ако је низак, значи да ће главни преносити.
Сваки бит се преноси у сваком циклусу такта, па је потребно 8 циклуса такта да би се пренео бајт. Након сваког послатог или примљеног бајта, одржава се девети циклус такта за АЦК / НАЦК (потврђено / неприхваћено). Овај АЦК бит генерира славе или мастер у зависности од ситуације. За АСР бит СДА је постављен на најнижу од мастер или славе на 9 -ог циклусу. Дакле, ниско се сматра АЦК, иначе НАЦК.
Где користити И2Ц комуникацију?
И2Ц комуникација се користи само за комуникацију на кратким удаљеностима. Свакако је поуздан у одређеној мери јер има синхронизовани импулс сата који га чини паметним. Овај протокол се углавном користи за комуникацију са сензором или другим уређајима који морају да шаљу информације мастеру. Врло је згодно када микроконтролер мора да комуницира са многим другим помоћним модулима користећи најмање само жице. Ако тражите комуникацију на дуге домете, требало би да испробате РС232, а ако тражите поузданију комуникацију требало би да испробате СПИ протокол.
И2Ц у Ардуину
На слици испод су И2Ц пинови присутни у Ардуино УНО.
И2Ц линија | Пин у Ардуину |
СДА | А4 |
СЦЛ | А5 |
Пре него што започнемо са програмирањем И2Ц помоћу два Ардуина. Морамо да научимо о жичној библиотеци која се користи у Ардуино ИДЕ-у.
библиотека
1. Вире.бегин (адреса):
Употреба: Ова библиотека се користи за успостављање комуникације са И2Ц уређајима. Ово Иницира жичну библиотеку и придружује се И2Ц магистрали као мастер или славе.
Адреса: 7-битна помоћна адреса није обавезна и ако адреса није наведена, придружује се сабирници као оваква матична.
2. Вире.реад ():
Употреба: Ова функција се користи за читање бајта који је примљен од главног или подређеног уређаја, било да је пренет са подређеног уређаја на главни уређај након позива на рекуестФром () или је пренет са главног на подређени уређај.
3. Вире.врите ():
Употреба: Ова функција се користи за уписивање података у помоћни или главни уређај.
Славе то Мастер: Славе записује податке у мастер када се Вире.РекуестФром () користи у мастеру.
Мастер то Славе: За пренос са мастер на славе уређај Вире.врите () користи се између позива Вире.бегинТрансмиссион () и Вире.ендТрансмиссион ().
Вире.врите () се може записати као:
- Вире.врите (вредност)
вредност: вредност коју треба послати као један бајт.
- Вире.врите (стринг):
стринг: низ који се шаље као низ бајтова.
- Вире.врите (подаци, дужина):
подаци: низ података који се шаљу као бајтови
дужина: број бајтова за пренос.
4. Вире.бегинТрансмиссион (адреса):
Употреба: Ова функција се користи за започињање преноса на И2Ц уређај са датом славе адресом. Након тога, направљена ред бајтова за пренос са писање () функцију, а затим их преноси позивом ендТрансмиссион () функцију. Преноси се 7-битна адреса уређаја.
5. Вире.ендТрансмиссион ();
Употреба: Ова функција се користи за завршетак преноса на подређени уређај који је започет функцијом бегинТрансмиссион () и преноси бајтове који су у редовима Вире.врите ().
6. Вире.онРекуест ();
Употреба: Ова функција се позива када мастер захтева податке користећи славе.рекуестФром () са помоћног уређаја. Овде можемо укључити функцију Вире.врите () за слање података главном.
7. Вире.онРецеиве ();Употреба: Ова функција се позива када помоћни уређај прими податке од главног. Овде можемо укључити Вире.реад (); функција за читање података послатих од мастер-а.
8. Вире.рекуестФром (адреса, количина);
Употреба: Ова функција се користи у главном за тражење бајтова од помоћног уређаја. Функција Вире.реад () користи се за читање података послатих са славе уређаја.
адреса: 7-битна адреса уређаја од којег се захтевају бајтови
количина: број бајтова који се захтева
Компоненте потребне
- Ардуино Уно (2-бр)
- Модул ЛЦД екрана 16Кс2
- Потенциометар 10К (4 бр.)
- Бреадбоард
- Повезивање жица
Кружни дијаграм
Радно објашњење
Овде за демонстрацију И2Ц комуникације у Ардуину користимо два Ардуино УНО са два 16Кс2 ЛЦД дисплеја међусобно повезана и користимо два потенциометра на оба ардуина за одређивање вредности слања (од 0 до 127) од мастер до славе и славе до мастер тако што ћемо променити потенциометар.
Узимамо улазну аналогну вредност на ардуино пину А0 од (0 до 5В) помоћу потенциометра и претварамо их у аналогну у дигиталну вредност (0 до 1023). Затим се ове вредности АДЦ даље претварају у (0 до 127) јер путем И2Ц комуникације можемо послати само 7-битне податке. И2Ц комуникација се одвија преко две жице на пинима А4 и А5 оба ардуина.
Вредности на ЛЦД-у Славе Ардуино-а ће се променити променом ПОТ-а на матичној страни и обрнуто.
И2Ц програмирање у Ардуину
Овај водич има два програма, један за мастер Ардуино и други за славе Ардуино. Комплетни програми за обе стране дати су на крају овог пројекта са демонстрацијским видео записом.
Објашњење мастер Ардуино програмирања
1. Пре свега морамо укључити жичану библиотеку за коришћење И2Ц комуникационих функција и ЛЦД библиотеку за употребу ЛЦД функција. Такође дефинишите ЛЦД пинове за ЛЦД 16к2. Овде сазнајте више о повезивању ЛЦД-а са Ардуином.
#инцлуде
2. У воид подешавању ()
- Почињемо серијску комуникацију брзином преноса 9600.
Сериал.бегин (9600);
- Даље започињемо И2Ц комуникацију на пину (А4, А5)
Вире.бегин (); // Почиње И2Ц комуникација на пин-у (А4, А5)
- Затим иницијализујемо модул ЛЦД екрана у режиму 16Кс2 и приказујемо поруку добродошлице и бришемо након пет секунди.
лцд.бегин (16,2); // Иницирање ЛЦД екрана лцд.сетЦурсор (0,0); // Поставља курсор у први ред Дисплаи лцд.принт ("Цирцуит Дигест"); // штампа ЦИРЦУИТ ДИГЕСТ у ЛЦД лцд.сетЦурсор (0,1); // Поставља курсор у другом реду Дисплаи лцд.принт ("И2Ц 2 АРДУИНО"); // штампа И2Ц АРДУИНО у ЛЦД кашњењу (5000); // Одлагање на 5 секунди лцд.цлеар (); // Брише ЛЦД екран
3. Ин воид лооп ()
- Прво морамо добити податке од подређеног уређаја, па користимо рекуестФром () са славе адресом 8 и тражимо један бајт
Вире.рекуестФром (8,1);
Примљена вредност се чита помоћу Вире.реад ()
бајт МастерРецеиве = Вире.реад ();
- Даље треба да очитамо аналогну вредност из главног ардуино ПОТ-а причвршћеног на пин А0
инт потвалуе = аналогРеад (А0);
Ту вредност претварамо у један бајт у 0 у 127.
бајт МастерСенд = мап (потвалуе, 0,1023,0,127);
- Даље треба да пошаљемо те претворене вредности, па започињемо пренос са славе ардуином са 8 адреса
Вире.бегинТрансмиссион (8); Вире.врите (МастерСенд); Вире.ендТрансмиссион ();
- Затим приказујемо оне примљене вредности из славе ардуина са кашњењем од 500 микросекунди и континуирано примамо и приказујемо те вредности.
лцд.сетЦурсор (0,0); // Поставља курсор на линији један ЛЦД ЛЦД штампе (">> Мастер <<"); // Штампање >> Мастер << на ЛЦД лцд.сетЦурсор (0,1); // Поставља курсор на други ред ЛЦД ЛЦД штампе ("СлавеВал:"); // Штампа СлавеВал: у ЛЦД лцд.принт (МастерРецеиве); // Штампа МастерРецеиве на ЛЦД-у примљено од Славе Сериал.принтлн ("Мастер Рецеивед Фром Славе"); // Штампање у Сериал Монитор Сериал.принтлн (МастерРецеиве); кашњење (500); лцд.цлеар ();
Објашњење програмирања за славе Ардуино
1. Исто као и мастер, прије свега морамо укључити Вире књижницу за кориштење И2Ц комуникацијских функција и ЛЦД библиотеку за кориштење ЛЦД функција. Такође дефинишите ЛЦД пинове за ЛЦД 16к2.
#инцлуде
2. У воид подешавању ()
- Почињемо серијску комуникацију брзином преноса 9600.
Сериал.бегин (9600);
- Даље започињемо И2Ц комуникацију на пину (А4, А5) са славе адресом као 8. Овде је важно навести славе адресу.
Вире.бегин (8);
Даље морамо позвати функцију када Славе прима вредност од мастер-а и када Мастер захтева вредност од Славе-а
Вире.онРецеиве (рецеивеЕвент); Вире.онРекуест (рекуестЕвент);
- Затим иницијализујемо модул ЛЦД екрана у режиму 16Кс2 и приказујемо поруку добродошлице и бришемо након пет секунди.
лцд.бегин (16,2); // Иницирање ЛЦД екрана лцд.сетЦурсор (0,0); // Поставља курсор у први ред Дисплаи лцд.принт ("Цирцуит Дигест"); // штампа ЦИРЦУИТ ДИГЕСТ у ЛЦД лцд.сетЦурсор (0,1); // Поставља курсор у другом реду Дисплаи лцд.принт ("И2Ц 2 АРДУИНО"); // штампа И2Ц АРДУИНО у ЛЦД кашњењу (5000); // Одлагање на 5 секунди лцд.цлеар (); // Брише ЛЦД екран
3. Даље имамо две функције, једну за догађај захтева и једну за догађај пријема
За захтев Догађај
Када се изврши вредност главног захтева од помоћног уређаја, ова функција ће се извршити. Ова функција узима улазну вредност од славе славе-а и претвара је у 7-битну и шаље ту вредност мастеру.
воид рекуестЕвент () { инт потвалуе = аналогРеад (А0); бајт СлавеСенд = мап (потвалуе, 0,1023,0,127); Вире.врите (СлавеСенд); }
За пријемни догађај
Када Мастер пошаље податке славе са славе адресом (8), ова функција ће се извршити. Ова функција чита примљену вредност из мастер и спреми у променљиву бајта типа.
воид рецеивеЕвент (инт ховМани { СлавеРецеивед = Вире.реад (); }
4. У петљи Воид ():
Примљену вредност од мастер-а континуирано приказујемо у модулу ЛЦД екрана.
петља воид (воид) { лцд.сетЦурсор (0,0); // Поставља курсор на линији један ЛЦД лцд.принт (">> Славе <<"); // Штампање >> Славе << на ЛЦД лцд.сетЦурсор (0,1); // Поставља курсор на други ред ЛЦД ЛЦД штампе ("МастерВал:"); // Штампа МастерВал: у ЛЦД лцд.принт (СлавеРецеивед); // Штампа СлавеРецеивед вредност на ЛЦД-у примљену од Мастер Сериал.принтлн ("Славе Рецеивед Фром Мастер:"); // Штампање у Сериал Монитор Сериал.принтлн (СлавеРецеивед); кашњење (500); лцд.цлеар (); }
Би ротирајући потенциометар на једној страни, можете видети различите вредности на ЛЦД на другу страну:
Дакле, тако се одвија И2Ц комуникација у Ардуину, овде користимо два Ардуиноса да демонстрирамо не само слање података већ и примање података помоћу И2Ц комуникације. Дакле, сада можете повезати било који И2Ц сензор са Ардуином.
Комплетно кодирање за Мастер и Славе Ардуино дато је у наставку са демонстрацијским видео записом