You are on page 1of 52

МИКРОПРОЦЕСОРСКИ СИСТЕМИ

ПРЕДАВАЊЕ 13
ВОВЕД ВО ARDUINO
ВОН. ПРОФ. Д-Р НЕВЕНА АЦКОВСКА
ТЕМИ
• Arduino
• Програмирање Arduino
• Влез-Излез
• Прекини
• Сериска комуникација
ARDUINO Е

Зборот „Arduino“ има три значења

Хардвер Околина за програмирање Заедница и филозофија

todbot.com/blog/bionicarduino
ARDUINO

• Arduino е прототип платформа (отворен код)


• Може да пишувате програми да креирате програми и да
креирате електрични кола со кои можат да се читаат
прекинувачи и други сензори и со кои може да се
контролираат мотори, светла и слично со многу мал труд

• Се состои од:
• Circuit board, која може да се програмира (го нарекуваме
микроконтролер) и
• Софтвер: Arduino IDE (Integrated Development Environment)
• Базиран на C++
ARDUINO ПЛОЧКИ

• Arduino Uno
• Arduino PRO
• Arduino Mega
ARDUINO UNO
MICROCONTROLLER

• ARV Atmega 328


• 8-битен микроконтролер
• Часовник: 16 MHz
• Напон: 5V
• Интерфејс: I/O пинови
• Меморија
• 2 Kb RAM меморија
• 32 Kb флеш меморија
(програма)
• 1 Kb EEPROM (параметри)
EXTEND ARDUINO

• Shields
• Solderless Breadboards
• Solderable Breadboards
SHIELDS

• Shields се плочки кои


може да се постават врз
една Arduino плочка со
што се зголемуваат
можностите за примена
• Wireless Network Shield
• Ethernet Shield
• GPS Shield
• Touchscrean shield
• Motor Shield
ПРОТОБОРД
• Има дупчиња кои се од внатре
поврзани и затоа е лесно да се
користат за поврзување со жици
• Црвената хоризонтална линија: +5 V
• Сината хоризонтална линија: Gnd
• 20 вертикални линии кои се
поврзани по вертикали

• Жици: од протобордот до влезно-


излезните пинови на Arduino или
други модули
СЕНЗОРИ
• Сензор за боја
• Сензор за гас
• Ултрасоничен сензор
• Линиски сензор
• Инфрацрвен сензор
• Читач за отпечаток на прст
• Сензор за светлина
• Сензор за плус
• Сензор за звук
АКТУАТОРИ И ДРУГИ МОДУЛИ

• Bluetooth Serial Module


• LCD Дисплеј
• Плочка драјвер за мотори
• DC Мотори
• Степер мотори
ТЕМИ
• Arduino
• Програмирање Arduino
• Влез-излез
• Прекини
• Сериска комуникација
ПОВРЗУВАЊЕ НА ARDUINO
• Поврзи со компјутер
• Има USB конектор преку кој
се поврзува со компјутер

• Напојување
• DC приклучок за напојување
за поврзување со
надворешен извор од 6-20
V
• На пример со батерија од
9 V (плочката може да се
напојува и да не е
поврзана со компјутер)
ARDUINO IDE

• Една програма се нарекува


скеч (skatch)
• Компајлирање на
програма
• Резултатот е даден во
status bar

• Програмирање на плочка -
Upload
• Вашиот скеч ќе се запише
на плочката

http://arduino.cc/en/Guide/Environment - за повеќе информации


ИЗБОР НА СЕРИСКА ПОРТА И ТИП
НА ПЛОЧКА
ДЕЛОВИ ОД ЕДЕН СКЕЧ

• Функција setup()
• Се повикува еднаш
• Функција Loop()
• Се повикува со
бесконечно многу пати

• Други делови
• Глобални променливи
• Кориснички дефинирани
функции
• Коментари
ТЕМИ
• Arduino
• Програмирање Arduino
• Влез-излез
• Прекини
• Сериска комуникација
ВЛЕЗНО/ИЗЛЕЗНО ПИНОВИ

• На плочката има:
• 14 дигитални I/O пинови
• PWM на 6 пинови
• 6 аналогни влезни пинови
ДИГИТАЛЕН ВЛЕЗ/ИЗЛЕЗ

• Дигиталниот влез/излез има


бинарна вредност
• on или off,
• 1 или 0
• Праќа дигитална вредност на
излезен пин
• Прима дигитална вредност на
влезен пин
АНАЛОГЕН ВЛЕЗ

Пример на аналоген влез:


• Температура

todbot.com/blog/bionicarduino
• Аналогниот сигнали има бесконечно многу вредности
• Компјутерите не можат да ги разберат аналогните сигнали, па тие ја
квантизираат и дискретизираат аналогната вредност
• Резолуција: бројот на различни нивоа на напон кои се користат за
дискретизација на аналогниот сигнал
• Кај Arduino има 1024 нивоа на напон или состојби (10 битови)
• Најмалата разлика во напон која може да се регистрира: 5V/1024 или 4.8 mV
АНАЛОГЕН ИЗЛЕЗ OUTPUT

• Аналогниот излез може да


се симулира со : Pulse width
modulation (PWM)
• Пример на аналоген излез:
• Поставување на ниво на
светлина
• Како?: Промената ON-OFF се
случува толку брзо што
поврзаниот излезен уред „добива“
информација за намалување на
напонот
АНАЛОГЕН ИЗЛЕЗ

• DUTY CYCLE
• On_time: времето во еден циклус
кога сигналот има вредност 1
(On/High)
• Cycle_time: времето на еден циклус
• Duty cycle се мери во проценти
• Процентот на време кога сигналот
има вредност 1 во времетраење
на еден циклус е output voltage = (on_time / cycle_time) * 5V
правопропорционален со
излезниот напон
ПРОГРАМИРАЊЕ НА I/0 ПИНОВИ

• Во функцијата setup
• Се поставува модот за секој пин кој се користи
• pinMode(pin, mode)
• Mode: има вредност (INPUT или OUTPUT) -
Влезен или излезен пин
• pin: редниот број на пинот
ПРОГРАМИРАЊЕ НА I/0 ПИНОВИ
• Digital
• digitalRead(pin)
• Прима HIGH или LOW од пинот pin

• digitalWrite(pin, value)
• Праќа HIGH или LOW на пинот pin
• Analog
• analogRead(pin)
• Прима 10битна вредност од пинот pin
• Оваа функции враќа вредност од 0 до 1023, која го претставува
напонот од 0 до 5 волти
• Ако на пинот 0 има напон од 2.5 V, функцијата analogRead(0) ваќа 512.
• analogWrite(pin, value)
• Праќа VALUE кој е во ранг од 0 до 255 на пинот pin
• Ќе гарантира стабилен квадратен сигнал кој има duty cycle чија
вредност е (value/255)
ФУНКЦИЈА ЗА МАНИПУЛАЦИЈА СО
ВРЕМЕ
• Функција: delay (value)
• Програмата чека додека да продолжи да се извршува
следната наредба од кодот. Времето на чекање е дадено
во аргументот на функцијата (value) кој е број даден во
милисекунди
• Оваа функција е блокирачка функција
• Функција: delayMicroseconds (value)
• Функција: millis ()
• Го враќа бројот во милисекунди од почетокот на
вклучување на програмата

• Фунцкија: micros ()
ПРОГРАМИРАЊЕ I/0 ПИНОВИ

INT LED=13;
void setup() // функција која се повикува еднаш на почетокот
{
pinMode(LED,OUTPUT); // се поставува пинот 2 како излезен
}
void loop() // се извршува со повторување постојано
{
digitalWrite(LED,HIGH); // постави го пинот 2 на вредност HIGH (ледот е вклучен)
delay(500); // чекај 500 ms
digitalWrite(LED,LOW); // постави го пинот 2 на вредност HIGH (ледот е исклучен)
delay(500); // чекај 500 ms
}
ТЕМИ
• Arduino
• Програмирање на Arduino
• Влез-излез
• Прекини
• Сериска комуникација
КОРИСТЕЊЕ НА ПРЕКИНИ

• Хардверските прекини се случуваат на промена на


состојбата на некој од дигиталните пинови
• Кај најголем дел од плочките Arduino, само пиновите
2 и 3 можат да се користат за прекини ("interrupt0" и
"interrupt1")
• Може да дефинирате рутина или функција за
справување со прекин која се нарекува: Рутина за
справување со прекини “Interrupt Service Routine” (ISR)
КОРИСТЕЊЕ НА ПРЕКИНИ
• Овозможување на прекин во кодот:
• attachInterrupt(interrupt, function, mode)
• Interrupt : 0 или 1 што претставува дали се работи за прекин 0 или
прекин 1
• Function: името на функцијата која ќе се повика кога ќе се случи
прекинот
• Функцијата нема аргументи и не враќа ништо
• Mode: означува кога ќе се случи прекин
•LOW : секогаш кога вредноста на пинот е 0 (low)
•CHANGE: секогаш кога вредноста на пинот се менува
•RISING : секогаш кога вредноста на пинот се менува од 0 во 1
•FALLING : секогаш кога вредноста на пинот се менува од 1 во 0

• Пример: attachInterrupt(2, doEncoder, FALLING);


КОРИСТЕЊЕ НА ПРЕКИНИ
int led = 13;
volatile int state = LOW;
void setup()
{
pinMode(led, OUTPUT);
attachInterrupt(1, blink, CHANGE);
}
void loop()
{
digitalWrite(led, state);
}
void blink()
{
state = !state;
}
ТЕМИ
• Arduino
• Програмирање на Arduino
• Влез-излез
• Прекини
• Сериска комуникација
ПАРАЛЕЛНА КОМУНИКАЦИЈА
• Паралелно комуникација:
• Со паралелен интерфејс еден податок од повеќе битови се праќа
така што повеќе битови се праќаат истовремено
• Најчесто ова побарува комуникација со повеќе сигнални линии –
пренос преку 8, 16 или повеќе жици

• Проблем
• побарува повеќе влезно излезни порти или линии
СЕРИСКА КОМУНИКАЦИЈА

• Еден податок е разбиен на битови кои се праќаат


сериски еден по друг по една иста жица
• ASCII знакот на В се праќа

• Типови на сериска комуникација


• Синхронизирана: го користат истиот часовник
• Асинхронизирана: имаат свој часовник и комуникацијата се
поттикнува со сигнали
CLOCK Baud rate: број на битови кои се пренесуваат во една секунда [bps]
СЕРИСКА КОМУНИКАЦИЈА

• Денес, поголем дел од Arduino плочките се изградени со


неколку различни системи за сериска комуникација како
стандардна опрема.
• UART (Universal Asynchronous Receiver Transmitter)
• За синхронизирана комуникација
• SPI
• I2C

• Протоколи кај сериска комуникација


• Дефинира како два уреди можат да разменуваат податоци
• Може да се користат специјални функции за сериска
комуникација
UART СЕРИСКА КОМУНИКАЦИЈА

• Покрај трансфер на од податоците има и


• Битови за синхронизација
• Бит за старт и бит или битови за стоп: Битот за старт секогаш
се праќа пред да се прати податокот и секогаш претставува
бит со вредност 0 (во состојба на мирување вредноста е 1),
додека битот за стоп секогаш има вредност 1
• Битови за парност
• Знаменце со кое се регистрира парноста на податоците
• Ова е стандарден механизам за асинхронизира комуникација со што
се овозможува робустен пренос на податоци без грешки
UART СЕРИСКА КОМУНИКАЦИЈА

• Поврзување на компјутер со Arduino


• RX: Праќање на програмата преку USB кабел до Arduino
• Двете лед диоди блиску до USP портата треперат додека се
праќаат податоци
• TX: Праќање на податоци до компјутер
• Се прикажуваат на SERIAL Monitor

Image from http://www.ladyada.net/learn/arduino/lesson4.html


UART СЕРИСКА КОМУНИКАЦИЈА
• Функција за иницијализација
• Serial.begin(boud_rate)

• Функција за пренос
• Serial.print(value) or
Serial.println(value)
• Serial.write()

• Функција за прием
• Serial.read()
• Serial.available()
• Serial.parseInt()
UART СЕРИСКА КОМУНИКАЦИЈА

void setup()
{
Serial.begin(9600); //се иницијализира сериска комуникација со брзина од 9600bps
}

void loop()
{
if(Serial.available()) //ако има достапни битови слободни за читање
{
Serial.print("I received:"); //печати: I received
Serial.write(Serial.read()); //прати го она што е прочитано
}
}
I2C

• Inter-integrated circuit (I2C)


• Се користи кога растојанието меѓу двата уреди е кратко
(најмногу до неколку метри)
• Врската е овозможена преку две сигнални линии за:
• Податочен трансфер- кај Arduino Uno: A4 (SDA)
• Синхронизација (часовник)- кај Arduino Uno: A5 (SCL)
I2C – MASTER МОД

Wire.begin(address) –address е 7-битна адреса на slave-уредот

ПРЕНОСТ ПРИЕМ
• Wire.beginTransmission(address) • Master уредот, прво бара, а
потоа ги чита бајтите пратени
• Wire.endTransmission()
од Slave-уредот
• Wire.write(value) – Вредноста
се додава во редот од бајти кои
• Wire.requestFrom(address,number
of bytes) – master уредот бара
ќе се пратат од master-уредот
бајти од slave-уредот
до slave-уредот
• Бајтите потоа може да се
прочитаат со функциите
• wire.available()
• wire.read()
I2C - SLAVE МОД

Wire.begin(address) – address е 7-битна адреса на slave-уредот

ПРЕНОС ПРИЕМ
• Wire.onRequest(handler) – • Wire.onReceive(handler) –
аргументот е името на аргументот е името на
функцијата која треба да се функцијата која треба да се
повика кога master-уредот бара повика кога slave-уредот прима
податоци од slave-уредот податоци од master-уредот

• Wire.write(value) – пренесува • Wire.available() – го враќа


податок до master-уредот бројот на бајти кои се достапни
за читање

• Wire.read()
I2C ПРИМЕР

• Код за Master-уредот

www.tutorialspoint.com
I2C ПРИМЕР

• Код за Slave-уредот
SPI

• Serial Peripheral Interface


• Овозможува full-duplex комуникација, што значи дека податоците се
праќаат и примаат истовремено
• Врската е воспоставена со 4 сигнални линии:
• SCK: Часовникот за комуникација креиран од master-уредот: Пин 13 кај
UNO
• MOSI (master output/slave input): за праќање на податоци од master-уредот
кон slave-уредот: Пин 11 кај UNO
• MISO (master input / slave output): за примање на податоци од master-
уредот од slave-уредот: Пин 12 кај UNO
• SS (slave-selection): за избор на slave - Пин 10 кај UNO
SPI
• SPI.begin() – иницијализација на SPI
• SPI.setClockDivider(divider) – driver e параметарот кој го поставува
часовникот за тактот на комуникацијата релативно во однос на
системскиот часовник
• Можни фактори се 2, 4, 8, 16, 32, 64 или 128.
• Претдефинирана вредност е SPI_CLOCK_DIV4, со што SPI часовникот има
фреквенција која е ¼ од фреквенцијата на системскиот часовник (5 Mhz за
плочките чија фреквенција е 20 MHz).
• receivedVal =SPI.transfer(value) – SPI преносот е базиран на симултан
пренос и прием на податоци, каде примениот податок е сочуван во
receivedVal
• SPI.attachInterrupt(handler) – аргументот е функцијата која треба да се
повика кога еден slave-уред прима податоци од master-уредот
SPI

• Повеќе подесувања:
• SPI.beginTransaction(SPISettings(speedMaximum, dataOrder,
dataMode))
• speedMaximum е брзината на комуникација,
• dataOrder може да биде MSBFIRST или LSBFIRST (most or least
significant bit first)
• dataMode:
• SPI_MODE0: Clock is normally low (CPOL = 0), and the data is sampled on
the transition from low to high (leading edge) (CPHA = 0).
• SPI_MODE1, SPI_MODE2, or SPI_MODE3
#include <SPI.h>
void setup (void)
{
Serial.begin(9600); //се поставува брзината на 9600bps

SPI-MASTER digitalWrite(SS, HIGH);


не е селектиран slave-уред
// оневозможи Slave Select, со што

SPI.begin ();
SPI.setClockDivider(SPI_CLOCK_DIV8); //брзината е 1/8 од
системската брзина
}
void loop (void)
{
char c;
digitalWrite(SS, LOW); // овозможи Slave Select,
со што slave-уредот со кој е поврзан е избран за комуникација
// прати тест стринг
for (const char * p = "Hello, world!\r" ; c = *p; p++) {
SPI.transfer (c);
Serial.print(c);
}
digitalWrite(SS, HIGH); // оневозможи Slave Select
delay(2000);
}
#include <SPI.h>
char buff [50];
volatile byte indx;
volatile boolean process;
void setup (void)

SPI-SLAVE {
Serial.begin (9600);
pinMode(MISO, OUTPUT); //постави го пинот поврзан со влезот од
Master-уредот како излезен
SPCR |= _BV(SPE); // вклучи SPI во slave-мод
indx = 0; // празен бафер
process = false;
SPI.attachInterrupt(); // вклучи прекини: функцијата ISR
}
ISR (SPI_STC_vect) // SPI рутина за прекин
{ byte c = SPDR; // вчитај бајт од SPI податочниот регистер
if (indx < sizeof buff)
{
buff [indx++] = c; // зачувај го бајтот во buff
if (c == '\r') // провери дали е дојдено до крајот на зборот
process = true;
}
}
void loop (void) {
if (process)
{
process = false; // ресет на процесот
Serial.println (buff);// печатење на низата на сериски монитор
Се користат променливите од indx= 0; // ресетирај
библиотеката: MISO, SPCR, }
SPDR, IRS, SPI_STC_vect }
ПРИМЕРИ

• Сензор за притисок
• Поврзување со степер мотор
ПРОЕКТИ

• Робот
• Комуникација со Raspberry Pi

You might also like