МЕФ Радионица

Радионица је намењена за роботику. Кроз ову радионицу научићемо како се користи и програмира Ардуино уређај, како направити везу Ардуина и 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. Бројеви пинова се читају директно са плоче.

Често коришћене функције у програмирању:

+ setup()

Функција се користи на самом почетку кода, служи да се иницијализују варијабле додели pinMode(), покрене серијски монитор. Ова функција се извршава само једном.

+ loop()

Након setup() поставља се loop() функција и она ради константно (бесконачна петља). У тело ове функције ставља се обично главни задатак програма.

+ pinMode()

Специфира који пин шта ради. Да ли ће да буде излазни или улазни пин.
Пример: pinMode(13, OUTPUT); || pinMode(13, INPUT);

+ digitalWrite()

Даје напон на пину који се дефинише или га искључује.
Пример: digitalWrite(13, HIGH); || digitalWrite(13, LOW);

+ digitalRead()

Чита вредност са пина (пин мора да буде INPUT). Добијена вредност је или HIGH или LOW.
Пример: digitalRead(13); резултат: HIGH || LOW

+ analogWrite()

Даје вредност на PWM пину.
Пример: analogWrite(127);

+ analogRead()

Чита вредност са аналогног пина. Враћа вредност од 0 - 1023
Пример: analogRead(A0);

+ delay()

Паузира програм за одређено време. Време се представља у милисекундама.
Пример: delay(1000); Програм ће чекати 1s.

+ map()

Мења вредност из једне у другу.
Пример: value = map(value, fromLow, fromHigh, toLow, toHigh);

+ random()

Псеудо случајан број.
Пример:
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. Потребна је регистрација и може се бирати између пројектовања дизајна робота, пројектовања шеме и симулација Ардуина и његових компоненти.

Пројекти

+ Укључење / искључење led након неког времена

Шема:

Програм:

                                        
    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);
    }     
                                        
                                    

+ Укључење led диоде преко серијског монитора

Шема:

Програм:

                                        
    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);
        }
    }             
                                        
                                    

+ RGB LED

Шема:

Програм:

                                        
    /*
     * 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);
    }
                                        
                                    

+ Транзистор NPN

Шема:

Програм:

                                        
                                            Урадићемо заједно програм
                                        
                                    

+ Контрола мотора преко транзистора

Шема:

Програм:

                                        
                                            Урадићемо заједно програм
                                        
                                    

+ Серво мотор

Шема:

Програм:

                                        
                                            Урадићемо заједно програм
                                        
                                    


IoT

Internet of Things (Интернет ствари) представља умрежавање уређаја и њихову контрулу уз помоћ Интернета. Главна идеја је контролисање удаљених уређаја путем Интернета и прикупљање података које тај уређај нуди.

Замислимо следећу ситуацију:
Возимо се аутом и одједном добијемо информацију на контролној табли аутомобила да имамо проблем у кочном систему. Ауто је опремљен технологијом коју нуди IoT. Када ауто добије информацију о грешки, путем Интернета може да закаже преглед кочног система у некој аутомеханичарској радњи која се налази у близини. Ако та радња зна у чему је проблем, она може да пошаље возачу поруку на е-пошту са садржајем о куповини заменског дела кочног система. Наравно цела комуникација је заштићена, тако да само возач може да одлучује шта ће са својим возилом.
Сви ти подаци се складиште у бази произвођача аутомобила. Ако произвођач примети да има истих проблема и са другим аутомобилима, онда произвођач може имати у виду да је та серија аутомобила изашла на тржиште са фабричком грешком и може да контактира остале возаче тог типа аутомобила и да их обавести да ће можда у будућности имати проблема са кочним системом.

У нашој радионици правићемо роботе и уређаје који ће се контролисати путем Интернета и слати податке са нашег робота или уређаја нама (корисницима) путем графичког интерфејса. Контролу робота (или уређаја) и прикупљање информација које наш робот (или уређај) нуди извршаваће се путем графичког интерфејса.
За такав подухват потребне су нам следеће компоненте:
-py сервер
-javascript
-HTML и CSS
-ajax и bootstrap технологије


Ардуино + py

Комуникација преко Py Shell:

За овај програм потребна је 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);
    }
                            
                        

Комуникација преко сервера:


Raspberry PI

Хардвер

RPI
RPI
Пинови RPI
Linux Noobs

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

Туторијал

Пројекти

+ LED Blink

Шема:

Програм:

                                    
    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) уређај. У већини случајева користићемо следећу шему:



Пази како кодираш ;)

Креатор: Лука Илић