This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:arduino:display:project1:manual [2016/03/22 12:22] – kaupo.raid | et:arduino:display:project1:manual [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ======Nextion TFT mooduli kasutusjuhend====== | ||
| + | ====Praktiliseks katsetamiseks vajalikud vahendid: | ||
| + | |||
| + | **Tarkvara** | ||
| + | * Arduino IDE | ||
| + | * Nextion teek | ||
| + | * Nextion Editor | ||
| + | **Riistvara** | ||
| + | * Arduino Mega ( või Arduino Uno) | ||
| + | * Nextion TFT moodul | ||
| + | * microSD mälukaart või USB-> | ||
| + | * Ühenduskaablid | ||
| + | |||
| + | ====Nextion ekraanile kasutajaliidese koostamine==== | ||
| + | Nextion TFT ekraanile saab ise disainida kasutajaliidese vastavalt vajadusele. Selleks tuleb alla tõmmata programm “Nextion Editor”(Joonis 1). Programmi saab alla laadida tootja [[http:// | ||
| + | |||
| + | {{: | ||
| + | |||
| + | **Programm lubab ekraanile kasutada erinevaid komponente: | ||
| + | * Text – tekstiriba kuvamine (Tekst võib sisendina tulla ka üle jadaliidese) | ||
| + | * Button – ekraanil kuvatakse nupp, mis on vajutatav (Nupu vajutamisel saab signaali saata üle jadaliidese). Nupule on võimalik lisada tekst, mis on muudetav sarnaselt “Text” elemendile. | ||
| + | * Progress bar – kuvab ekraanil tulp näidiku, mis võib sisendi võtta jadaliidese kaudu | ||
| + | * Picture – kuvab ekraanil etteantud pildi | ||
| + | * Crop – võimaldab ekraanil kuvada ainult lõigatud osa etteantud pildist | ||
| + | * Hotspot – tekitab ekraanile ala, mis toimib nupuna, kuid ei kuva nuppu ennast | ||
| + | * Gauge – kuva ekraanil näidiku, mida on võimalik ringjooneliselt liigutada 0-360 kraadi | ||
| + | * Waveform – kuvab ekraanil graafiku vastavalt sisendandmetele | ||
| + | * Slider – ekraanil kuvatakse liugur, mida saab kasutada kasutajaliidese siseselt või ka signaalide saatmiseks jadaliidese kaudu | ||
| + | * Timer – ei ole veel funktsioneeriv | ||
| + | * Global variables – ei ole veel funktsioneeriv | ||
| + | |||
| + | Kõiki komponente on võimalik venitada kuni täisekraani suuruseks. Komponentidele on võimalik määrata täpseid asukohti x ja y koordinaatide alusel. | ||
| + | |||
| + | ====Nextion Arduino teek ja selle installeerimine==== | ||
| + | Nextion mooduli kasutamiseks Arduino arendusplaatidega on loodud teek, mis võimaldab lihtsalt ja kiirelt süsteemi tööle panna. Teeks hõlmab funktsioone erinevate komponentidega suhtlemiseks ja jadaliidese seadistamiseks. Teegi Arduino IDE tarkvaraga sidumiseks tuleb teek lahti pakkida ja paigutada kausta Documents-> | ||
| + | Nextion mooduliga suhtlemine üle jadaliidese | ||
| + | Kogu suhtlus Nextion mooduli ja Arduino plaadi vahel toimub jadaliidese (UART Arduinol ja COM Arvutil) kaudu. Sõnumite saatmisel mooduli ja Arduino vahel on kasutusel kindel sõnumi struktuur, et häiringuid välitda. \\ | ||
| + | Näiteks puute tuvastamise sündmuse puhul saadab nextion moodul järgmise sõnumi: “65 0 2 0 ffff ffff ffff”. | ||
| + | |||
| + | **Sõnumi sisu kirjeldus: | ||
| + | - 65 – puute tuvastuse tähis | ||
| + | - 0 – lehe ID number | ||
| + | - 2 – komponendi ID number | ||
| + | - 0 – puute tuvastamise viis (alla vajutatud nupp “1” ja lahti lastud nupp “0”) | ||
| + | - ffff ffff ffff – sõumi lõpu tähis | ||
| + | |||
| + | Saabunud sõnum saadeti lehel 0 allavajutatud nupu nr 2 lahti laskmisel. Sõnumi struktuur on kõigil komponentidel sama kuid parameetrite arv võib olla erinev. Täpsemat kirjeldust on võimalik lugeda [[http:// | ||
| + | |||
| + | **Jadaliidese pistikul on 4 viiku: | ||
| + | - GND - maa | ||
| + | - RX - andmete vastuvõtmine | ||
| + | - TX - andmete saatmine | ||
| + | - +5V - toide | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Lisaks on Nextion moodulil veel micro SD mälukaardi pesa, mida saab kasutada moodulile uue kasutajaliidese kiiremaks pealelaadimiseks. | ||
| + | Üldine Arduino programmi struktuur on näha joonisel2. Lisaks tavapärastele setup() ja loop() funktsioonidele on juures NexTouch objektide list ja funktsioon iga sündmuse korral tegevuse kirjeldamiseks (nt. b0PopCallback). | ||
| + | \\ | ||
| + | Iga komponent tuleb enne kasutamist tarkvaras deklareerida. Selleks on iga komponendi jaoks eraldi funktsioon teegis, mis võtab kõik komponendi parameetrid ja teeb sellest objekti [Nt. NexButton b0 = NexButton(0, | ||
| + | Programmi näites muudetakse objektiga seotud funktsioonis nupu teksti. | ||
| + | |||
| + | |||
| + | |||
| + | ====Näidisprojekt: | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==Kasutatavad komponendid: | ||
| + | * Nextion moodul (Antud projektis kasutab 4,3” diagonaaliga moodulit, kuid sama programm töötab ka väiksemate ekraanide puhul) | ||
| + | * Arduino Uno või Mega | ||
| + | * 2tk 360 kraadi servot (võimalik ka 180 kraadi servo ümber konverteerida) | ||
| + | * IR analoog kaugusandur (tagastab pinge vahemikus 0-5V) | ||
| + | * IR digitaalne kaugusandur (tagastab pinge 0V või 5V) | ||
| + | * Ultraheli kaugusandur | ||
| + | * Toiteallikas (Antud projektis 7,4V 2S 1,6Ah Lipo) | ||
| + | * Roboti kere | ||
| + | |||
| + | Esmalt tuleb kokku panna robot. Antud juhendis kokkupanekut kirjeldama ei hakata vaid see jäetakse ehitaja oma otsustada. Andurite ja mootorite ühendamisel Arduino arendusplaadiga tuleks jälgida järgmist tabelit: | ||
| + | |||
| + | ^ Viik ^ Sisend/ | ||
| + | | D0 | Digitaalne sisend | ||
| + | | D1 | Digitaalne väljund | ||
| + | | D9 | PWM väljund | ||
| + | | D10 | PWM väljund | ||
| + | | D11 | Digitaalne sisend | ||
| + | | D6 | Digitaalne sisend | ||
| + | | D7 | Digitaalne sisend | ||
| + | | A0 | Analoog sisend | ||
| + | |||
| + | ==Nextion TFT mooduli kasutajaliidese koostamine== | ||
| + | Kasutajaliides peab olema suuteline kuvama andurite infot, võimaldama roboti mõlemat mootorit eraldi juhtida ja eelprogrammeeritud käskude jada täitma(nt. Sõida otse ja keera paremale). | ||
| + | Käivitada Nextion Editor programm ja seal teha uus projekt. Projekti ekraani suurus tuleb valida oma ekraani parameetrite järgi. Ekraani orientatsioon on „horizontal“. Komponente saab lisada ülevalt menüüribast „Add Component“ nupuga. Alustame peaekraanist kuhu on vaja paigutada tekstikast ja kolm nuppu. Paigutuse ja suuruste osas saab ettekujutuse jooniselt 2. Esialgsel komponentide paigutamisel ei teki kastide sisse teksti kuna puudub kuvamiseks kirjastiil („font“). Selle tekitamiseks tuleb ülevalt menüüst valida Tools-> | ||
| + | |||
| + | {{: | ||
| + | \\ | ||
| + | \\ | ||
| + | {{: | ||
| + | Seejärel tekitada paremal „Page“ menüü all „Add“ nupuga 3 lisa lehte. Nimetada need vastavalt nuppudele: Sensorid, Juhtimine ja Programmid. | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | Edasi valib paremalt „page“ menüüst lehe sensorid. Sensorite lehele lisada teksitkastid vastavalt joonisel 5 olevale. Lisaks tuleb „Back“ nupule lisada „Touch Release Event“ korral tekst „page kodu“, et nupu vajutamisel naaseks pealehele. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | Lehel „juhtimine“ tuleb lisada 2 slaiderit ja pöördindikaator(gauge). Slaider on tekitamise ajal horisontaalses konfiguratsioonis ja saab teha vertikaalseks parameetrite alt. Pöördindikaator tuleb algasendiks määrata 90. Slaideritel tuleb lisada „Touch Release Event“ all linnuke kasti „Send Component ID“, et muutuse korral saadetakse positsioon Arduinole. Horisontaalse slaideri väärtused tuleb piirata 0-180 ja vertikaalsel 0-200. Lisaks paigutada kiiruse kuvamiseks nupp alla paremale nurka ja üles vasakule „Back“ nupp sarnaselt sensorite lehele. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | \\ | ||
| + | Lehel „programmid“ tuleb lisada „Back“ nupp ja kuus nuppu erinevate funktsioonide jaoks. Funktsiooni nuppude juurest tuleb „Touch Release Event“ all panna linnuke kasti „Send Component ID“ , et nupu vajutamisel saadetakse signaal Arduinole. | ||
| + | |||
| + | {{: | ||
| + | |||
| + | ==Programmi koostamine== | ||
| + | Koostamisel olev programm kasutab kolme andurit, mida loetakse perioodiliselt. Andurite väärtused kuvatakse Nextion TFT moodulile, et kasutaja saaks neid vaadata. Roboti liikuma panekuks juhitakse kahte servo mootorit, mille juhtimiseks tulevad käsud Nextion TFT moodulilt. Juhtimine võib toimuda nii slaiderite kui ka eelnevalt kirjutatud funktsioonide (lehel programmid) kaudu. | ||
| + | Antud programmi tööpõhimõtte skeem | ||
| + | |||
| + | {{: | ||
| + | |||
| + | == Osadeks jaotatud programm koos selgitustega == | ||
| + | |||
| + | **Nextion mooduli teegi header failide lisamine** | ||
| + | |||
| + | <code c> | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include " | ||
| + | #include < | ||
| + | </ | ||
| + | |||
| + | **Komponentide objektide tekitamine**\\ | ||
| + | Teegi funktsioone kasutades tuleb iga komponent vastavalt komponendi parameetritele deklareerida. Funktsioonide esimene parameeter näitab lehe ID numbrit, teine komponendi ID numbrit ja kolmas | ||
| + | |||
| + | <code c> | ||
| + | NexText t4 = NexText(1, 6, " | ||
| + | NexText t5 = NexText(1, 7, " | ||
| + | NexText t6 = NexText(1, 8, " | ||
| + | NexText t7 = NexText(1, 9, " | ||
| + | |||
| + | NexText t0 = NexText(2, 5, " | ||
| + | NexSlider h0 = NexSlider(2, | ||
| + | NexSlider h1 = NexSlider(2, | ||
| + | NexGauge z0 = NexGauge(2, 2, " | ||
| + | |||
| + | NexButton b1 = NexButton(3, | ||
| + | NexButton b2 = NexButton(3, | ||
| + | NexButton b3 = NexButton(3, | ||
| + | NexButton b4 = NexButton(3, | ||
| + | NexButton b5 = NexButton(3, | ||
| + | NexButton b6 = NexButton(3, | ||
| + | </ | ||
| + | |||
| + | **Globaalsed muutujad ja arduino spetsiifilised deklareerimised**\\ | ||
| + | Antud osa all on servo objektide deklareerimine parema ja vasaku mootori jaoks. Lisaks kasutatakse makrosid „# | ||
| + | |||
| + | <code c> | ||
| + | Servo leftM; | ||
| + | Servo rightM; | ||
| + | |||
| + | #define STOP_L 78 | ||
| + | #define STOP_R 94 | ||
| + | |||
| + | char buffer[10] = {0}; | ||
| + | uint16_t sensor_value = 0; | ||
| + | </ | ||
| + | |||
| + | **NexTouch objektide list**\\ | ||
| + | List koosneb komponentide objektide pointeritest ehk mäluaadressidest. „NULL“ objekt näitab listi lõppu. | ||
| + | |||
| + | <code c> | ||
| + | NexTouch *nex_listen_list[] = | ||
| + | { | ||
| + | &b1, | ||
| + | &b2, | ||
| + | &b3, | ||
| + | &b4, | ||
| + | &b5, | ||
| + | &b6, | ||
| + | &h0, | ||
| + | &h1, | ||
| + | NULL | ||
| + | }; | ||
| + | </ | ||
| + | |||
| + | **Objektidega seotud funktsioonid**\\ | ||
| + | Iga objektiga on seotud funktsioon, mis käivitatakse kui saabub puute kohta signaal. Lisaks on funktsioon nimega „ir_Vasak“, | ||
| + | |||
| + | <code c> | ||
| + | void b1PopCallback(void *ptr) | ||
| + | { | ||
| + | turnRobot(1); | ||
| + | } | ||
| + | void b2PopCallback(void *ptr) | ||
| + | { | ||
| + | turnRobot(-1); | ||
| + | } | ||
| + | void b3PopCallback(void *ptr) | ||
| + | { | ||
| + | turnRobot(3); | ||
| + | } | ||
| + | void b4PopCallback(void *ptr) | ||
| + | { | ||
| + | //drive a square | ||
| + | } | ||
| + | void b5PopCallback(void *ptr) | ||
| + | { | ||
| + | //drive a circle | ||
| + | } | ||
| + | void b6PopCallback(void *ptr) | ||
| + | { | ||
| + | //drive a figure 8 | ||
| + | } | ||
| + | |||
| + | void h0PopCallback(void *ptr) | ||
| + | { | ||
| + | uint32_t number = 0; | ||
| + | char temp[10] = {0}; | ||
| + | h0.getValue(& | ||
| + | utoa(number, | ||
| + | t0.setText(temp); | ||
| + | |||
| + | drive(number); | ||
| + | } | ||
| + | |||
| + | void h1PopCallback(void *ptr) | ||
| + | { | ||
| + | uint32_t angle = 0; | ||
| + | char temp[10] = {0}; | ||
| + | h1.getValue(& | ||
| + | z0.setValue(angle); | ||
| + | |||
| + | if (angle > 90) | ||
| + | { | ||
| + | leftM.write(0); | ||
| + | rightM.write(map(angle, | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | leftM.write(STOP_L -(map(angle, | ||
| + | rightM.write(115); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void ir_Vasak() | ||
| + | { | ||
| + | //for(int i = 0; i<10; i++) buffer[i] = ' | ||
| + | sensor_value = analogRead(A0); | ||
| + | memset(buffer, | ||
| + | itoa(sensor_value, | ||
| + | // | ||
| + | t5.setText(buffer); | ||
| + | // | ||
| + | // | ||
| + | delay(100); | ||
| + | } | ||
| + | |||
| + | void turnRobot(int dir) | ||
| + | { | ||
| + | if (dir == 1) //parem | ||
| + | { | ||
| + | leftM.write(0); | ||
| + | rightM.write(0); | ||
| + | delay(780); | ||
| + | } | ||
| + | else if (dir == -1) // vasak | ||
| + | { | ||
| + | |||
| + | leftM.write(115); | ||
| + | rightM.write(115); | ||
| + | delay(880); | ||
| + | } | ||
| + | else if (dir == 3) //360deg | ||
| + | { | ||
| + | leftM.write(115); | ||
| + | rightM.write(115); | ||
| + | delay(1600); | ||
| + | } | ||
| + | leftM.write(STOP_L); | ||
| + | rightM.write(STOP_R); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **Muud kasutatavad funktsioonid**\\ | ||
| + | Drive funktsioon on vajalik servode eripära tõttu. Funktsioon lihtsustab üldist servode juhtimist. | ||
| + | |||
| + | <code c> | ||
| + | void drive(int speed) | ||
| + | { | ||
| + | if (speed > 100 && speed < 200) | ||
| + | { | ||
| + | leftM.write(map(speed, | ||
| + | rightM.write(map(speed, | ||
| + | } | ||
| + | else if (speed < 100 && speed > 0) | ||
| + | { | ||
| + | leftM.write(map(speed, | ||
| + | rightM.write(map(speed, | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | leftM.write(STOP_L); | ||
| + | rightM.write(STOP_R); | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **Setup() funktsioon**\\ | ||
| + | Funktsiooni läbitakse ainult korra ja selle jooksul sedistatakse kõik vajalik roboti ja nextion mooduli funktsioneerimiseks. | ||
| + | <code c> | ||
| + | void setup(void) | ||
| + | { | ||
| + | Serial.begin(9600); | ||
| + | leftM.attach(9); | ||
| + | rightM.attach(10); | ||
| + | leftM.write(STOP_L); | ||
| + | rightM.write(STOP_R); | ||
| + | nexInit(); | ||
| + | h0.attachPop(h0PopCallback); | ||
| + | h1.attachPop(h1PopCallback); | ||
| + | b1.attachPop(b1PopCallback); | ||
| + | b2.attachPop(b2PopCallback); | ||
| + | b3.attachPop(b3PopCallback); | ||
| + | b4.attachPop(b4PopCallback); | ||
| + | b5.attachPop(b5PopCallback); | ||
| + | b6.attachPop(b6PopCallback); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | **Lõputu loop() funtsioon**\\ | ||
| + | Tsükkel, mis käivitab lõputult kahte funktsiooni. | ||
| + | |||
| + | <code c> | ||
| + | void loop(void) | ||
| + | { | ||
| + | |||
| + | ir_Vasak(); | ||
| + | nexLoop(nex_listen_list); | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ====Viited: | ||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | - [[http:// | ||
| + | |||