Микроконтролер Arduino Leonardo



Дата11.11.2022
Размер332.11 Kb.
#115529
ЦМТ

Технически Университет Габрово

Курсов проект по


Цифрова и микропроцесорна техника

Студент: Александър Александров Александров


Факултет : АИУТ
Фак.№ : 21411104

Микроконтролер Arduino Leonardo
Микроконтролера Arduino Leonardo е базиран на ATmega32u4.Той е снабден с 32Kbyte ISP Flash памет, 1Kbyte ЕЕPROM памет и USB контролер за програмиране и комуникация. Захранва се с +5V през USB порта,чрез куплунг предназначен за това намиращ се на самата платка или през пинове VIN и GND, като микроконтролера автоматично избира източника си на захранване. Контролерът предлага 20 входно/изходни извода, като 7 от тях, могат да бъдат широчинно-импулсно модулирани и 12 като аналогови входове.
Входно Изходен Интерфейс
Всеки от 20-те входно/изходни извода на Leonardo, може да бъде използван като вход или изход използвайки функциите PinMode(), DigitalRead(), DigitalWrite(). Те работят на 5V и могат да понесат товар от максимум 40mA и имат вътрешен pull-up резистор(около 20-50 КΩ), който не е свързан по подразбиране. Някои изводи имат специализирани функции:


  • Serial: 0(RX) и 1(TX). За получаване и предаване на данни, използвайки възможността за серийна комуникация на ATmega32u4.

  • TWI: 2(SDA) и 3(SCL) Контролерът има възможност за TWI/I2C комуникация

  • Външни прекъсвания: Пин 3(Прекъсване 0), 2(Прекъсване 1), 0(Прекъсване 2), 1(Прекъсване 3) и 7(Прекъсване 4), могат да бъдат конфигурирани, за да предизвикат прекъсване при ниско ниво, при преден или заден фронт, или при промяна на стойността.

  • PWM: Пинове 3,5,6,9,10,11 и 13. Предоставят 8-битов Широчинно импулсен изход използвайки функцията analogWrite()

  • LED: Пин 13. Това е вграден в платката на микроконтролера светодиод, който е свързан към пин 13. При високо ниво светодиода е включен, а при ниско изключен.

  • Аналогови входове: Пинове A0-А5, А6-А11 (или цифрови пинове 4,6,8,9,10,11 и 12). Leonardo предлага 12 аналогови входа, като всеки от тях може да бъде използван и като цифров вход или изход. Всеки вход е с 10 битова резолюция, тоест 1024 различни стойности.

  • AREF : Опорно напрежение на аналоговите входове

  • Reset: Използва се за рестартиране на микроконтролера, дава възможност за извеждане на външен бутон за рестарт.

Комуникация


Контролерът предлага различни варианти за връзка с компютър,Arduino или друг тип контролер. ATmega32u4 позволява и серийна комуникация през USB като виртуален COM порт. Софтуерът на Arduino предлага сериен монитор, чрез който може да се изпращат или получават данни към него. Има и светодиодна индикация (RX/TX), които дават информация за прехвърляне на данни. Процесорът предлага и I2C и SPI комуникация, използвайки Wire библиотека за да опрости работата с I2C шината и съответно SPI библиотека за SPI.Програмирането на контролера става чрез тяхна собствена среда наречена Arduino IDE, която е безплатна за теглене от техния сайт arduino.cc
Блок схема на контролера

Управление на светодиоден индикатор тип DL1414T и четене на аналогов вход.

Ще използваме микроконтролера Leonardo, за да прочетем един от аналоговите му входове и според състояните му, ще изведем информацията на светодиоден индикатор тип DL1414T. За тази цел ще използваме няколко бутона захранени заедно с контролера, като всеки след всеки от тях има свързани последователно резистори с различна стойност.В случая използвам волан от автомобил, който има съответните бутон. Краищата на резисторите се обединяват и се връщат към аналоговия вход. Това ще ни даде различни нива на аналоговия вход, което ще ни даде информация кой от бутоните е натиснат.



Светодиодният ни индикатор има 4 позиции, като във всяка една от тях може да визуализира един символ. Всяка от тях се избира чрез сигналите A0 и А1 (пин 4 и 5). Използвайки D0-D6 назначаваме символът, който искаме да изпишем върху индикатора. От таблицата дадена ни от производителя виждаме каква комбинация е нужна за съответния символ.


Ще назначим променливи с които ще определим кои входно/изходни пинове ще използваме в нашата програма. Имената им ще съответстват на тези на диодния индикатор. Дефинираме и една променлива btn, която ще използваме за да четем аналоговия вход.
int А0 = 3;
int А1 = 4;
int D0 = 5;
int D1 = 6;
int D2 = 7;
int D3 = 8;
int D4 = 9;
int D5 = 10;
int D6 = 11;
int WR = 12;
int btn;
Всяка от програмите на Arduino, започва с функцията Setup, тя се прочита от контролера еднократно при включването му и повече не се достъпва от него, до следващ рестарт. В нея се конфигурират входно изходните пинове. За да използваме серийния монитор се изисква да се инициализира комуникацията, чрез командата Serial.begin(), като аргумент се задава скоростта с която ще работи. В нашият случай 9600.
void setup() {
pinMode(А0, OUTPUT);
pinMode(А1, OUTPUT);
pinMode(D0, OUTPUT);
pinMode(D1, OUTPUT);
pinMode(D2, OUTPUT);
pinMode(D3, OUTPUT);
pinMode(D4, OUTPUT);
pinMode(D5, OUTPUT);
pinMode(D6, OUTPUT);
pinMode(WR, OUTPUT);
Serial.begin(9600);
}
След Setup(), следва функцията Loop(), това вече е програмата, която ще се изпълнява от микроконтролера.
Използвайки командата AnalogRead(), ще прочетем състоянието на аналоговия вход.
btn = analogRead(1);
Присвояваме състоянието на аналогов вход 1 към променливата btn. От тук нататък ще използваме променливата btn.

Можем да използваме функцията Serial.println(),която ще изведе в серийния монитор на софтуера данните, които желаем.Така ще проверим видим как работи схемата ни дотук.


Serial.println(btn);
Отваряйки серийния монитор, вече наблюдаваме състоянието на аналоговия вход. След като установим, кой бутон какви стойности ни дава, можем да премахнем командата за мониторинга.
За да бъде по-лесно програмирането от тук нататък, ще създадем няколко функции. Първата ще ни послужи за избор на сегмента от индикатора, в който ще изписваме символ.
void pos(int n){
if(n==0)
{
digitalWrite(a0, 1);
digitalWrite(a1, 1);
}
if(n==1)
{
digitalWrite(a0, 0);
digitalWrite(a1, 1);
}
if(n==2)
{
digitalWrite(a0, 1);
digitalWrite(a1, 0);
}
if(n==3)
{
digitalWrite(a0, 0);
digitalWrite(a1, 0);
}
}
От тук нататък, когато искаме да изпишем символ в даден сегмент, ще използваме функцията pos(), а като неин аргумент посочваме номера на сегмента (0-3).
За да визуализираме символа е нужно, също така да подадем комбинация към индикатора, която можем да видим от таблицата със символи по-горе. В случая използваме мултимедиен волан и имаме бутон за усилване или намаляне на звук, превъртане напред или назад, следващ или предишен, спиране на звука и избор на източник на аудио. Това означава, че нямаме нужда от всички символи, които може да визуализира DL1414T, и ще създадем отново няколко функции, чрез които да ги викаме в програмата. Ако се върнем към таблицата ще видим, че преди да запишем данни сигналът WR трябва да се установи в ниско ниво. Ще използваме символите: E,F,L,M,O,P,R,S,T,U,V
За да изпишем символът „Е“ е нужно да подадем към DL1414T, високи нива към D0, D2 и D6. Предварително установяваме WR в ниско ниво, подаваме комбинацията нужна за нашият символ, след което връщаме WR във високо ниво. В противен случай символът, който сме изобразили ще изчезне.
void E(){
digitalWrite(WR,0);
digitalWrite(D0, 1);
digitalWrite(D2, 1);
digitalWrite(D6, 1);
digitalWrite(WR,1);
digitalWrite(D0, 0);
digitalWrite(D2, 0);
digitalWrite(D6, 0);
}
По същият начин ще създадем функции, които да ни извеждат всички останали символи. Например „О“ :
void O(){
digitalWrite(WR,0);

digitalWrite(D0, 1);


digitalWrite(D1, 1);
digitalWrite(D2, 1);
digitalWrite(D3, 1);
digitalWrite(D6, 1);
digitalWrite(WR,1);

digitalWrite(D0, 0);


digitalWrite(D1, 0);
digitalWrite(D2, 0);
digitalWrite(D3, 0);
digitalWrite(D6, 0);
}
След като създадем всички функции от които имаме нужда, остава да определим в програмата, кой бутон сме натиснали и да го визуализираме на индикатора.

if (btn > 0 && btn < 10)


{
pos(0);
V();
pos(1);
O();
pos(2);
L();
pos(3);
minus();
}

if (btn > 0 && btn < 10)


Сравняваме състоянието на аналоговия ни вход с това, което по-рано сме видели в серийния монитор. Задаваме диапазон от 0 до 10, за да сме сигурни, че дори нивото на входа да се измени в някакви минимални граници, ние отново ще имаме нужната информация.
pos(0);
Избираме 1-вия сегмент на DL1414T.
V();
Записваме символ “V” в него.
pos(1);
Избираме 2-рия сегмент на DL1414T.
0();
Записваме символ “О” в него.
pos(2);
Избираме 3-тия сегмент на DL1414T.
L();
Записваме символ “L” в него.
pos(3);
Избираме 4-тия сегмент на DL1414T.
minus();
Записваме символ “-” в него.

Сподели с приятели:




©obuch.info 2024
отнасят до администрацията

    Начална страница