Радионица је намењена за роботику. Кроз ову радионицу научићемо како се користи и програмира Ардуино уређај, како направити везу Ардуина и Python, шта је то Internet of Things и које су његове могућности и на самом крају Raspberry PI уређај.
Садржај радионице можете пратити на менију са леве стране.
Ардуино је програмибилни уређај који служи за учење програмирања и роботике. Сам уређај је довољно добар да се може са њим направити пројекти који су захтевнији.
Уређај се састоји из 5 блока:
1. микроконтролерски блог
2. улазно / излазни пинови
3. блок за повезивање са рачунаром
4. блок за напајање
5. додатни пинови
-Рачунар се са Ардуино плочом везује преко USB порта. USB даје напајање плочи и врши пренос информација (код: рачунар -> ардуино, информације: ардуино -> рачунар).
-Код микроконтролерског блока се налази процесор Ардуино плоче. Ту се извршавају наредбе које је претходно обрадио процесор који се налази код USB порта.
-Улазно / излазни пинови служе Ардуину да може управљати са неким другим компонентама / модулима (излаз) и да може примити неке информације од компонената / модула (улаз).
-Ардуино има могућност да се напаја и са екстерног извора енергије (дакле не само преко USB порта). Идеја је следећа: направимо програм и успешно поставимо програм у Ардуино. Да нам не би Ардуино тражио напајање са USB порта, можемо га напајати са неким другим извором енергије. Када смо поставили програм у Ардуино тај програм ће бити у меморији Ардуина. Програм ће се извршавати све док има услава за извршавање (док има напона). Ардуино се може напајати преко батерије и преко адаптера. Напон може да буде од 5V - 20V. Оперативни напон је 5V (такође и излазни напон је 5V - излазни пинови). Ардуино има могућност да преко регулатора напона претвори напон опсега 5V - 20V у 5V.
-Додатни пинови служе за пружање додатним могућности, а то су: давање напона од 5V и 3.3V(+), давање GND(-), улаз аналогних сигнала са других модула (потенциометар, фотодиода ..), спајање са батеријом -> Vin(+) и GND(-).
Структура пинова:
-Дигитални пинови се деле у три групе: дигитални пинови, PWM пинови и пинови за слање и пријем сигнала са модула. Дигитални пинови када се дефинишу раде OUTPUT/INPUT. Пинови за слање и примање информација са модула је TX - слање и RX - примање информација. Ово се често користи код bluetooth модула. Што се тиче PWM то значи Pulse-width modulation. То омогућава пину да се понаша као извор промењивог напона. То значи да ми као програмери можемо да одредимо који ће напон бити на пину у датом тренутку или да тај напон буде константан. PWM пинови се препознају тако што се поред броја пина налази и симбол синусоиде (~). Сигнали се крећу у опсегу од 0-255. 0 значи да нема напонда, док 255 значи да има напона и да је тај напон максималан (5V). Избором сигнала из овог опсега можемо сами постављати напон на пину.
За израду софтвера користи се Ардуинов IDE. Инсталација развојног окружења је једноставна и програм се лако користи.
1. провера, постави, нови пројекат, отвори, сачувај
2. простор за писање програма
3. серијски монитор (Serial monitor)
4. простор за приказ стања плоче и програма
Структура кода:
const int led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWritie(led, HIGH);
}
Прво се креће са дефинисањем две главне функције. void setup() и void loop(). У setup() функцији се најчешће означава који ће пин бити излазни, који улазни и покретање серијске везе. У void loop() се ставља програм који ће се извршавати бесконачно (бесконачна петља).
Функција pinMode(pin, OUTPUT/INPUT) служи за дефинисање типа пина. Има два параметра број пина и његову улогу (OUTPUT/INPUT).
Функција digitalWrite(pin, HIGH/LOW) служи за укључење / искључење пина, HIGH - даје напон на пину (+5V), LOW - нема напона на пину (0V).
const int led = 13; Варијабла led је типа int (цели број) која има вредност 13 и даље у току рада програма никад неће бити измењена. led = 13 значи да ће варијабли led бити придружен пин број 13. Бројеви пинова се читају директно са плоче.
Функција се користи на самом почетку кода, служи да се иницијализују варијабле додели pinMode(), покрене серијски монитор. Ова функција се извршава само једном.
Након setup() поставља се loop() функција и она ради константно (бесконачна петља). У тело ове функције ставља се обично главни задатак програма.
Специфира који пин шта ради. Да ли ће да буде излазни или улазни пин.
Пример: pinMode(13, OUTPUT); || pinMode(13, INPUT);
Даје напон на пину који се дефинише или га искључује.
Пример: digitalWrite(13, HIGH); || digitalWrite(13, LOW);
Чита вредност са пина (пин мора да буде INPUT). Добијена вредност је или HIGH или LOW.
Пример: digitalRead(13); резултат: HIGH || LOW
Даје вредност на PWM пину.
Пример: analogWrite(127);
Чита вредност са аналогног пина. Враћа вредност од 0 - 1023
Пример: analogRead(A0);
Паузира програм за одређено време. Време се представља у милисекундама.
Пример: delay(1000); Програм ће чекати 1s.
Мења вредност из једне у другу.
Пример: value = map(value, fromLow, fromHigh, toLow, toHigh);
Псеудо случајан број.
Пример:
random(num) - случајан број од 0 до num
random(min, max) - случајан број од min до max
Серијски монитор представља терминал који служи за слање и приказ података.
Пример кода:
const int led = 13;
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.print("Jedan red. Dobar za prikaz varijabli");
Serial.println("");
Serial.print("led = ");
Serial.print(led);
Serial.println("");
Serial.println("Ja se štampam u jednom redu i imam u sebi i novi red");
}
За симулацију користићемо програм који се налази на Интернету. Тај програм је Tinker Cad. Потребна је регистрација и може се бирати између пројектовања дизајна робота, пројектовања шеме и симулација Ардуина и његових компоненти.
Шема:
Програм:
const int led = 13;
void setup() {
pinMode(led, OUTPUT);
}
void loop() {
digitalWrite(led, HIGH);
delay(1000);
digitalWrite(led, LOW);
delay(1000);
}
Шема:
Програм:
const int crveno = 13;
const int zuto = 11;
const int zeleno = 9;
void setup() {
int i;
int boje[] = {crveno, zuto, zeleno};
int velicina_niza = sizeof(boje) / sizeof(int);
for(i = 0; i<velicina_niza; i++)
pinMode(boje[i], OUTPUT);
}
void loop() {
semafor();
}
void semafor() {
digitalWrite(crveno, HIGH);
delay(1000);
digitalWrite(zuto, HIGH);
delay(500);
digitalWrite(crveno, LOW);
digitalWrite(zuto, LOW);
digitalWrite(zeleno, HIGH);
delay(1000);
digitalWrite(zeleno, LOW);
delay(1000);
}
Шема:
Програм:
const int tasterPin = 2;
const int ledPin = 13;
int taster = 0;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(tasterPin, INPUT);
Serial.begin(9600);
}
void loop() {
taster = digitalRead(tasterPin);
if (taster == HIGH) {
digitalWrite(ledPin, HIGH);
Serial.println("LED je ukljucen.");
}
else {
digitalWrite(ledPin, LOW);
Serial.println("LED je iskljucen.");
}
}
Шема:
Програм:
const int led = 3;
const int analogPin = A0;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
int val = analogRead(analogPin);
val = map(val, 0, 1023, 0, 255);
analogWrite(led, val);
Serial.println(val);
}
Шема:
Програм:
const int led = 13;
void setup() {
pinMode(led, OUTPUT);
Serial.begin(9600);
}
void loop() {
if(Serial.available() > 0) {
int ulaz = Serial.parseInt();
if(ulaz == 1)
digitalWrite(led, HIGH);
else if(ulaz == 0)
digitalWrite(led, LOW);
else
Serial.println("Nepoznata komanda.");
delay(100);
}
}
Шема:
Програм:
/*
* Author: Luka Ilic
* E-mail: Luka_Bn@hotmail.com
* youtube.com/Luka9840
* RGB LED common anode, common cathode and random color.
*
*/
//Define arduino pins (PWM)
const int red_pin = 11;
const int green_pin = 10;
const int blue_pin = 9;
//variables for random color
int r, g, b;
//If RGBL is with common anode uncomment: common_anode
//#define common_anode
void setup() {
pinMode(red_pin, OUTPUT);
pinMode(green_pin, OUTPUT);
pinMode(blue_pin, OUTPUT);
Serial.begin(9600);
}
void loop() {
/*
* If you want to use random_color(),
* delete everything from loop, except random_color() and uncomment it.
*
*/
//random_color();
make_color(255, 0, 0); //red
delay(1000);
make_color(0, 255, 0); //green
delay(1000);
make_color(0, 0, 255); //blue
delay(1000);
}
void random_color() {
r = random(0, 255);
g = random(0, 255);
b = random(0, 255);
make_color(r, g, b);
delay(1000);
}
void make_color(int red, int green, int blue) {
#ifdef common_anode
red = 255 - red;
green = 255 - green;
blue = 255 - blue;
#endif
//Serial monitor:
Serial.println("NEW LOOP");
Serial.println(red);
Serial.println(green);
Serial.println(blue);
analogWrite(red_pin, red);
analogWrite(green_pin, green);
analogWrite(blue_pin, blue);
}
Шема:
Програм:
Урадићемо заједно програм
Шема:
Програм:
Урадићемо заједно програм
Шема:
Програм:
Урадићемо заједно програм
Internet of Things (Интернет ствари) представља умрежавање уређаја и њихову контрулу уз помоћ Интернета. Главна идеја је контролисање удаљених уређаја путем Интернета и прикупљање података које тај уређај нуди.
Замислимо следећу ситуацију:
Возимо се аутом и одједном добијемо информацију на контролној табли аутомобила да имамо проблем у кочном систему. Ауто је опремљен технологијом коју нуди IoT. Када ауто добије информацију о грешки, путем Интернета може да закаже преглед кочног система у некој аутомеханичарској радњи која се налази у близини. Ако та радња зна у чему је проблем, она може да пошаље возачу поруку на е-пошту са садржајем о куповини заменског дела кочног система. Наравно цела комуникација је заштићена, тако да само возач може да одлучује шта ће са својим возилом.
Сви ти подаци се складиште у бази произвођача аутомобила. Ако произвођач примети да има истих проблема и са другим аутомобилима, онда произвођач може имати у виду да је та серија аутомобила изашла на тржиште са фабричком грешком и може да контактира остале возаче тог типа аутомобила и да их обавести да ће можда у будућности имати проблема са кочним системом.
У нашој радионици правићемо роботе и уређаје који ће се контролисати путем Интернета и слати податке са нашег робота или уређаја нама (корисницима) путем графичког интерфејса. Контролу робота (или уређаја) и прикупљање информација које наш робот (или уређај) нуди извршаваће се путем графичког интерфејса.
За такав подухват потребне су нам следеће компоненте:
-py сервер
-javascript
-HTML и CSS
-ajax и bootstrap технологије
За овај програм потребна је py библиотека PySerial.
import serial, time
ser = serial.Serial('COM4', 9600)
time.sleep(1)
s = ""
while s != "kraj":
s = input("Posalji string Arudinu: ")
ser.write(str.encode(s))
print(ser.readline().decode("utf-8"))
void setup() {
Serial.begin(9600);
}
void loop() {
String odgovor = Serial.readString();
Serial.println(odgovor);
}
1. GPIO улазно / излазни пинови
2. Главни процесор
3. Слот за камеру
4. USB прикључак за напајање
5. Слот за монитор
6. USB портови
7. Ethernet порт
8. Џек за звучнике
9. HDMI
RPI је најбоље оптимисан за Linux Noobs. Тај оперативни систем садржи све шта је потребно за програмирање и извршавање симулација самог уређаја.
Програме које будемо правили за RPI писаћемо у py развојном окружењу. Програмирање се не разликује од класичног програмирања. Да би остварили оно за шта је RPI и намењен, а то је контрола осталих модула преко GPIO пинова, потребна нам је библиотека RPi.GPIO која се налази у самом оперативном систему.
Ако у неком случају једана од библиотека или програма не ради, онда се извршава команда за update библиотека / програма.
$ sudo apt-get update ||
$ sudo apt-get install python-rpi.gpio python3-rpi.gpio
Шема:
Програм:
import RPi.GPIO as GPIO
import time
LedPin = 11
def setup():
GPIO.setmode(GPIO.BOARD)
GPIO.setup(LedPin, GPIO.OUT)
GPIO.output(LedPin, GPIO.HIGH)
def blink():
while True:
GPIO.output(LedPin, GPIO.HIGH)
time.sleep(1)
GPIO.output(LedPin, GPIO.LOW)
time.sleep(1)
def destroy():
GPIO.output(LedPin, GPIO.LOW)
GPIO.cleanup()
if __name__ == '__main__':
setup()
try:
blink()
except KeyboardInterrupt:
destroy()
Наша је идеја да за пројекте које будемо реализовали користимо Raspberry PI (RPI) уређај. У већини случајева користићемо следећу шему: