Avtor: dr. Simon Vavpotič
2020_286_23
ESP8266 Wi-Fi moduli, kot majhna, enostavna in učinkovita 32-bitna osnova za gradnjo naprav in sistemov interneta stvari (IoT), že leta burijo domišljijo programerjev. Čeprav so novi navadno predprogramirani kot brezžični Wi-Fi modemi, jih lahko z lastno programsko opremo spremenimo v samostojne krmilnike enostavnih IoT naprav.
V preteklem nadaljevanju smo nadgradili ESP8266 spletni strežnik za kakovostnejše prikazovanje spletnih strani, bogatih s slikovnim gradivom, nato pa se posvetili konkretnim problemom in razmišljali o domačih projektih, pri katerih bi lahko koristno uporabili ESP module. Za vstop v IoT svet smo nadgradili smo tudi daljinsko voden model traktorja.
Tokrat bomo traktor opremili z dodatnimi tipali in videli, kako zmogljivost njegovih komunikacij izboljšamo s pravo Wi-Fi anteno, ki jo lahko priključimo na nekatere ESP32 module. V ta namen bomo vzpostavili TTL RS232 povezavo med ESP8266 in ESP32-CAM moduli, tako da bomo zmogljivo anteno slednjega izkoristili tudi za krmiljenje traktorskih motorjev in ne le za prenos žive slike. Pri tem bomo lahko Wi-Fi del ESP8266 celo ugasnili in s tem izničili morebiten neželen medsebojni radijski vpliv modulov, ki sta v neposredni bližini.
Ta vsebina je samo za naročnike
Zanimalo nas bo, ali lahko v isto vezje vgradimo več ESP modulov in ali je prenos podatkov med njimi mogoč tudi brez brezžičnih komunikacij. Spoznali bomo, kako vzpostavimo redundantno IoT mrežo, v kateri je vsaka IoT naprava hkrati strežnik in odjemalec, pri čemer lahko deluje tudi kot komunikacijski most med drugimi IoT napravami, ki so preveč oddaljene, da bi bila mogoča neposredna komunikacijska Wi-Fi povezava med njimi.
Uravnavanje zasuka koles IoT modela traktorja
V preteklem nadaljevanju smo robotiziran model traktorja usposobili za vožnjo, vendar je originalni pogon za sukanje prednjih koles nerodno izdelan, saj prednja kolesa v nevtralni položaj vrača kar vzmet. Za originalni krmilnik bi bilo vračanje v izhodiščni položaj z motorjem prezahtevno, zato mora motor položaj levo ali desno zadrževati zaustavljen in pod napetostjo, kar ima za posledico veliko porabo toka.
Če vzmet odstranimo, je vračanje v nevtralni položaj brez dodatnih tipal mogoče zgolj ročno z opazovanjem traktorja. Zato sem za merjenje zasuka uporabil 10 kohmski trimer, ki sem ga preko vzvoda, narejenega iz prekrivljene vzmeti, povezal z gredjo za obračanje prednji kolesi. Obenem sem vrtljivi del trimerja iz strani, s katere nima zareze nekoliko zarezal, da se vzvod zatakne nanj in na ploščati del, kar prepreči njegovo snemanje s trimerja. Izhod trimerja sem preko novega analognega multiplekserja na osnovi BSS 92 P-MOSFET tranzistorja vezal na A/D pretvornik ESP8266, ki tako lahko izmeri napajalno napetost ali zasuk koles. Za preklapljanje med analognimi kanali sem uporabil GPIO0 in še zadnji prosti negator v ULN2803, ki zagotavlja prilagoditev napetostnih nivojev.
Vrednost napajalne napetosti je pomembna tudi pri izračunu absolutnega zasuka koles, saj je izhodna napetost trimerja, ki meri zasuk koles, odvisna tudi od baterijske napetosti. Absolutni zasuk koles ESP8266 izračuna tako, da izmerjeni zasuk koles pomnoži z razmerjem referenčne in dejanske napajalne napetosti. Referenčna napajalna napetost je tista, pri kateri izmerimo referenčne vrednosti zasuka koles: skrajno levo, nevtralno in skrajno desno. Slednje so uporabljene v programu za samodejno vračanje prednjih koles v nevtralno lego. Čeprav se zdi slednje enostavno, moramo pri vrtenju prednjih koles upoštevati, da to ne bo prenehalo takoj, ko bomo prekinili napajanje smernemu motorju. Hkrati se prednja kolesa na grobi podlagi lahko tudi sama zasukajo, zato je popravek usmerjenosti morda potreben celo, če nismo zahtevali obračanja prednjih koles. Zakaj? Denimo, pri daljinsko vodenemu modelu rudarskega tovornjaka iz LEGO kock prednja kolesa obrača elektromotor z zobniškim prenosom z zelo velikim zobniškim razmerjem, kar onemogoča vrtenje koles od zunaj (SE238 in SE239), pri modelu traktorja pa je prenos izdelan tako, da ga lahko vrtimo tudi preko koles, ne da bi ga pri tem poškodovali. Zato moramo za pravilno usmeritev koles skrbeti s programskim preverjanjem položaja in popravki s smernim motorjem , glej program 1.
Poleg samodejnega vračanja koles v izhodiščni položaj je mogoče tudi daljinsko vodenje robota s podajanjem smernega kota, ki je premo sorazmeren nagibu leve ročke igralne palice v levo ali desno. Tako način vodenja se je izkazal za uspešnega že pri prej omenjenem rudarskem tovornjaku iz LEGO kock , glej program 2.
Dodatni napetostni regulator za ESP32-CAM
Čeprav lahko sprogramiran ESP32-CAM modul zaženemo že s priklopom na 3,3 V ali 5 V napajanje, potrebujemo za njegovo programiranje še vsaj mikrostikalo in TTL RS-232 vmesnik, ki ju lahko povežemo prek natičnih kablov, lahko pa namesto tega izdelamo preprosto miniaturno tiskano s podporno elektroniko in vsemi potrebnimi priključki.
V preteklem nadaljevanju sem model traktorja nadgradil z modulom ESP32-CAM z vgrajenim 3,3 V napetostnim regulatorjem, AMS1117, ki glede na specifikacije iz interneta dovoljuje vhodne napetosti do 15 V. Kljub temu pa je segrevanje regulatorja sorazmerno razliki vhodne in izhodne napetosti, pomnožene s povprečnim električnim tokom, ki ga za svoje delovanje zahtevata ESP32 in OV2640. Ker tok skozi AMS1117 ob normalnem delovanju kamere in Wi-Fi občasno doseže tudi 400 mA, sem dodal napetostni regulator LM7805, ki baterijsko napetost iz okoli 8,5 V zniža na 5 V, hkrati pa sem lahko tako napajanje ESP32-CAM vezal za glavno p-MOSFET stikalo in se vklaplja skupaj z motorno elektroniko.
A vseeno me je zanimalo, ali lahko ESP32-CAM priključimo tudi višjo napajalno napetost od 5 V. Vseeno nisem hotel kar takoj priklopiti baterijske napetosti (med 7 V in 9 V), zato sem izbral napajanje s 6 V. A sem po daljšem času opazil občasno valovanje slike v obliki sinusne napetosti, kar bi lahko bila posledice preobremenitve AMS1117. Vendar je pri napajanju s 6 V mogoča dokaj enostavna rešitev, pri kateri z zaporedno vezavo usmerniške diode (npr. 1N4007) napajalno napetost znižamo za okoli 0,7 V.
Na majhno prototipno vezje za podporo delovanju ESP32-CAM z dvema vrstnima vtičnicama za priklop ESP32-CAM brez spajkanja, sem vgradil še mikrostikalo za zagon ESP32 v načinu za programiranje ter priključek za TTL RS-232 vmesnik. Vse skupaj sem vdelal v miniaturno ohišje, narejeno iz porabljene plastične škatlice za plastični trakec za čiščenje zob, ki je nato pristala na strehi traktorja, kjer ima kamera čudovit razgled.
Krmiljenje z igralno palico
Ročno upravljanje robotiziranega modela traktorja prek tekstovne konzole je primerno predvsem za preverjanje pravilnosti delovanja logičnih in pogonskih sklopov, za zabavo z njim pa je skoraj nepogrešljiva igralna palica. Zahvaljujoč ESP32-CAM moduli in prenosu žive slike, gibanju robota ni potrebno slediti peš, ampak ga lahko upravljamo z enega mesta, oziroma osebnega računalnika, s katerim lahko povežemo tudi standardno igralno palico. Krmiljenje z igralno palico omogoča hitro in natančno upravljanje, pri katerem lahko z velikostjo odmik igralne palice določimo, koliko energije bo dobil posamezni motor in ne samo smer vrtenja.
Aplikacijo za Microsoft Windows za upravljanje robota z igralno palico sem izdelal že za tovornjak iz LEGO kock (SE238 in SE239), za upravljanje preko telneta pa je potreboval le nekaj manjših sprememb. Zaradi hitrejšega in natančnejšega upravljanja, sem običajnemu načinu upravljanja dodal še ukazni način, pri katerem je vsakemu enočrkovnemu ukazu za zagon posameznega motorja dodano tudi trimestno decimalno število, ki določa hitrost vrtenja. Denimo, za obrat prednjih koles s polno hitrostjo aplikacija pošlje ukaz: R000, za vrtenje v desno s približno polovično hitrostjo pa R333. Hitrost vrtenja pri določeni vrednosti je sicer odvisna tudi od sile, oziroma trenja koles pri obračanju, ki je odvisna od podlage in hitrosti premikanja IoT modela traktorja. Nova različica aplikacije je dopolnjena tudi z dodatnim krmiljem za dviganje in spuščanje lopate traktorja, tako na igralni palici od štirih osi ostane prosta le še ena, saj s pomikanjem leve ročke gor in dol upravljam lopato, nagibanjem levo in desno, pa smerni motor. Desna ročka je rezervirana za uravnavanje hitrosti premikanja naprej in nazaj.
Ukazni način omogoča tudi merjenje baterijske napetosti in kota zasuka prednjih koles, vendar vrača rezultat v kratkem decimalnem zapisu in brez obširnih navodil za uporabnika, saj je namenjen krmiljenju robota s programi v višjih programskih jezikih.
ESP8266 in ESP32 sodelujeta!
Cenenost in nizka poraba energije ESP modulov nas navajata k misli, da bi jih v istem vezju uporabili več in s tem zagotovili redundantne komunikacijske povezave in več krmilnih priključkov, ki nam jih pri njih že skoraj tradicionalno primanjkuje. ESP moduli v istem vezju lahko medsebojno komunicirajo prek zaporednih povezav TTL RS-232, s čemer zmanjšamo število hkrati aktivnih brezžičnih modulov in porabo energije, hkrati pa ohranimo rezervne komunikacijske kapacitete.
Ker sem si že dolgo prizadeval izdelati daljinsko vodenega robota s kamero, je bil ESP32-CAM modul logična izbira za dodatni krmilni modul, urediti mu je bilo treba le še priklop na napajanje, napetostno regulacijo na 5 V ter mikrostikalo in priključek TTL RS-232 za programiranje. Žal sem se moral odreči rabi mikro SD kartice, ker bi sicer ne bilo dovolj krmilnih priključkov za dodatna tipala. Po drugi strani, lahko živo sliko robotove vožnje prek Wi-Fi posname tudi PC. Je pa toliko bolj zanimiva možnost govorne komunikacije, za katero bi potrebovali daljše posnetke zvoka (v stereo tehniki) iz mikro SD kartice.
ESP moduli si navadno izmenjujejo podatke prek brezžičnih povezav, če pa so del istega vezja, lahko učinkoviteje komunicirajo prek TTL RS-232 ali drugih serijskih povezav, ki niso odvisne od visoke zasedenosti radijskih kanalov v blokovskih naseljih. Zaradi zahtev po visokih prenosnih hitrostih pri programiranju ESP modulov, je malo možnosti, da bi TxD in RxD priključke uporabili še za kaj drugega kot komunikacijo in razhroščevanje, razen če uporabimo mostiščne ničelne modemske prevezave (angl. null modem connections). Vendar dolžina podatkovnih vodnikov za TTL RS-232 komunikacijo ni omejena na 10 cm, saj lahko programsko prenosno hitrost primerno znižamo (npr. na 19.200 baudov).
Prav to me je zanimalo, ko sem robotizirani model traktorja opremil še z ESP32-CAM modulom, pri katerem je večina vhodov-izhodov ESP32 uporabljenih za komunikacijo z Omni Visionovo barvno kamero z največjo ločljivostjo 1600 x 1200 pik, OV2640, preostali pa so namenjeni mikro SD kartici. Slednje lahko uporabimo za druge namene, če se kartici odrečemo. Po drugi strani, je tudi ESP8266 že zmanjkalo priključkov. Zato sem sem odločil ultrazvočno tipalo za merjenje razdalje povezati kar ne priključka GPIO12 in GPIO13 ESP32-CAM modula.
Komunikacijski most
Vsak ESP mikrokontroler lahko deluje kot komunikacijski most, ki prenaša podatke iz enega v drugo omrežje, s čemer se podaljša dolžina povezave. Tudi ESP32-CAM in ESP8266 za prenos uporabljata podobno logiko, ki omogoča delitev brezžične Wi-Fi povezave. ESP32 je sprogramiran tako, da deluje hkrati kot video spletni strežnik in kot telnet most, ki posreduje zaporedno komunikacija iz vrat 23 na serijski port, ki je povezan na serijski port ESP8266. Pri tem lahko ESP8266 enakovredno sprejema ukaze iz serijskega porta in Wi-Fi telnetne povezave. Zato tak način upravljanja omogoča brezžično krmiljenje celotnega robota prek ESP32-CAM modula, ki ima vgrajeno zmogljivejšo anteno. Wi-Fi ESP8266 tako rabi predvsem za zagon robota in zbujanje robota iz stanja nizke porabe energije, ko sta ESP32-CAM in motorna elektronika izključena.
Pri vzpostavitvi podatkovnega mostu moramo opredeliti tudi način komunikacije. Originalna programska oprema ESP modulov uporablja TTL RS-232 na priključkih za programiranje za izpisovanje diagnostičnih sporočil. Slednje moramo onemogočiti, če želimo prenašati krmilne podatke, ali pa namesto tega opredeliti formata diagnostičnih sporočil in ukazov, ki ju je mogoče strogo ločevati. Ker sem se odločil za prvo možnost, pri kateri mi ni bilo treba spreminjati zgradbe in načina delovanja ukazov, sem moral opredeliti le to, kdaj se diagnostična sporočila lahko izpisujejo in kdaj so prepovedna. Gre za TTL RS-232 komunikacijsko povezavo med ESP32 in ESP8266, po kateri lahko ESP32 upravlja vse funkcije ESP8266, po kateri se med prenosom ukazov ne smejo prenašati diagnostična sporočila , glej program 3.
Za prenehanje prenosa diagnostičnih sporočil je potrebno v vgrajeni programski opremi ESP32 na vseh mestih, kjer nastopa jo ukazi Serial.print… dodati še pogojni stavek, ki izpisovanje dovoljuje le, ko je ukazni način izklopljen. Podrobnosti poiščite v izvorni kodi v datoteki CameraWebServer_Vx.zip, v kateri je poleg spletnega strežnika za prenos videa tudi telnet strežnik, ki z lastnimi ukazi za krmiljenje elektronike, povezane z ESP32 modulom, in prenos ostalih ukazov ESP8266.
Omenimo še, da prava Wi-Fi antena bistveno izboljša prenos Wi-Fi signala, kar je potrebno za prenos žive slike, obenem pa gladko poteka prenos ukazov za premikanje motorjev in upravljanje druge elektronike, kot je ultrazvočni merilnik razdalje, HC-SR04.
Ultrazvočni merilnik razdalje
Z robotom sem povezal tudi ultrazvočni merilnik razdalje, HC-SR04, ki ga krmili digitalni izhod GPIO12, odziv pa ESP32 sprejema preko digitalnega vhoda GPIO13. Ultrazvočni modul sicer vsebuje preprost 8-bitni mikrokontroler, Elan EM78P159N, ki ustvari vlak ultrazvočnih impulzov in izmeri trajanje odbojev, ki ga v obliki časovne zakasnitve posreduje ESP32 prek. Pri tem moramo upoštevati, da HC-SR04 deluje pri 5 V, vendar številni avtorji spletnih projektov navajajo, da je vhod (T) za proženje zvočnega impulza združljiv z izhodnim nivojem visoke vrednosti ESP32 (okoli 3,3 V), ki deluje pri napetosti 3,3 V. Težavo predstavlja le izhod R, katerega vrednost je v visokem stanju za približno tretjino previsoka. Tu je najlažje, če uporabimo kar uporovni delilnik (denimo 4,7 kohmov + 10 kohmov, glej shemo). Pri tem izhod R napaja oba upora, odjem pa je na 10 kohmskem uporu. Tako, da pri vhodni napetosti 5 V, izhodna napetost približno 10/14,7 * 5 = 3,4 V. Vendar ESP32 dopušča napetost Vcc + 0,3 V na digitalnem vhodu, zato je to v redu kljub napajalni napetosti 3,3 V.
Potem, ko smo priklopili ultrazvočni merilnik razdalje, zanj potrebujemo še programsko opremo. Merjenje razdalje bomo za začetek prožili z novim ESP32 telnet ukazom. Vendar je pomembno, da izvajanje tovrstnih ukazov ne vpliva zajem videa s kamere.
Wi-Fi mreža
Omrežne naprave Wi-Fi si lahko pomagajo pri prenosu podatkov tako, da vsaka po potrebi deluje kot podatkovni most med dvema oddaljenima Wi-Fi napravama, vključenima v mrežo komunikacijskih vozlišč (angl. mesh). Načinov gradnje tovrstnih omrežij, odpornih na odpovedi posameznih vozlišč, je veliko. Zato poglejmo osnovni princip delovanja. Denimo, da želi IoT naprava A prenesti podatkovni paket IoT napravi B. Če lahko z napravo B vzpostavi hitro Wi-Fi podatkovno povezavo, se poveže neposredno, v nasprotnem poišče napravo z najboljšo Wi-Fi povezavo v bližini, ki je hkrati vključena v mrežo. To napravo poimenujemo C1. Če ima C1 na volji hitro povezavo z B, lahko A preko C1 pošilja podatkovne pakete B, v nasprotnem naprav C1 preveri ali ima morda naprava C2, ki je izven dosega A dostop do B itn. Kot vidimo, lahko mreža Wi-Fi naprav sama poišče pot do ciljne naprave, če ima katerakoli naprava v mreži dostop to te naprave. Prenos podatkov lahko poteka prek več vozlišč glede na njihove zmogljivosti in zasedenost s podatkovnim prometom.
Zmogljivost mreže neodvisnih Wi-Fi vozlišč lahko izboljšamo z uporabo hierarhije imenikov, tako da vsako vozlišče hrani seznam trenutno neposredno dostopnih vozlišč in posredno dostopnih vozlišč do določene globine omrežja. To pomeni, da morajo vsa vozlišča v mreži vsebovati ne seznam neposredno dostopnih vozlišč, ampak od teh pridobijo sezname vozlišč, ki so dostopni tem vozliščem itn. V kolikor je Wi-Fi mreža vozlišč sorazmerno majhna (do kakih 100 vozlišč), je mogoče vzdrževati enoten seznam vseh vozlišč in njihovih povezljivosti v vsakem vozlišču, za več pa je pametno uporabiti sprotno iskanje
.
Če želite zgraditi mrežo ESP naprav, lahko začnete s primerom HelloMesh, ki ga najdete poleg programske knjižnice ESP8266WiFiMesh. Vsebuje osnovno funkcije za definicijo mreže in komunikacijo med vozlišči, ostale funkcije, ki jih potrebujemo pri večjih mrežah, lahko implementirate sami.
Spremenimo ESP32-CAM v predvajalnik glasbe!
Na koncu tokratnega nadaljevanja pa še to! Ali ste vedeli, da je ESP32 modul odlična osnova za gradnjo predvajalnika glasbe iz glasbenih datotek? Predvajanje zvoka je mogoče prek priključkov GPIO25 in GPIO26, ki ju lahko preko 330 ohmskih uporov povežemo s slušalkami ali nizko energijskimi zvočniki. GPIO25 in GPIO26 v tem primeru krmilimo iz v ESP32 vgrajenega dvokanalnega 8-bitnega D/A pretvornika. V spletu najdemo tudi zahtevnejše projekte za predvajanje zvoka, ki vključujejo zunanje D/A pretvornike in Hi-Fi ojačevalnike, v katere digitaliziran zvok prenašamo prek vodila SPI. Če kot predvajalnik glasbenih datotek uporabimo ESP32-CAM modul, je prednost že vgrajeno ležišče za mikro SD kartico, a sta priključka GPIO25 in GPIO26 dostopna le na ohišju modula, kamor je spajkanje žičnih povezav sorazmerno težko, če so že vgrajeni vrstni konektorji. V tem primeru potrebujemo pri delu mirno roko ter dobra spajkalnik in vid (ali povečevalno steklo)…
Vgrajeno programsko opremo za predvajalnik glasbe najdemo v primeru esp32-i2s-sdcard-wav-player-master, ki ga lahko potegneta iz spletne strani http://www.iotsharing.com/2017/07/how-to-use-arduino-esp32-i2s-to-play-wav-music-from-sdcard.html. V dveh programskih datotekah sta primera za predvajalnik preko v ESP32 vgrajenega stereo D/A pretvornika (2x 8-bitna ločljivost) in I2S povezave s 3,3 V I2S ojačevalnikom, ki ga lahko v svetovnih spletnih trgovinah z mikroelektroniko kupimo kot dodatek za Arduino module in povežemo z dvema podatkovnima kabloma ter napajalnim priključkom in maso.
Omenimo še to, da ista programska knjižnica omogoča tako predvajanje preko zunanjega modula, kot preko vgrajenega D/A pretvornika. Razlika je majhna, ker v obeh primerih prenos zvoka poteka prek ESP32 I2S vmesnika. Za prenos podatkov v avdio ojačevalnik z I2S vhodom, moramo predhodno podati ustrezne nastavitve, pri neposrednem predvajanju z vgrajenim D/A pretvornikom pa je dovolj programski stravek: i2s_stream_cfg_t i2s_cfg = I2S_STREAM_INTERNAL_DAC_CFG_DEFAULT(), s katerim se naložijo prednastavljene vrednosti za uporabo vgrajenega D/A pretvornika. Za tiste, ki bi radi za predvajanje glasbe uporabili zunanji D/A pretvornik, oziroma ojačevalnik z D/A pretvornikom pa je na voljo primer esp32_i2s_play_sdcard_wav.ino. Primera omogočata predvajanje WAV datotek iz korenskega imenika mikro SD kartice, vendar sta dovolj enostavna, da jima lahko dodamo še manjkajoče funkcionalnosti za izbiro posnetka in preskok naprej ali nazaj. Dodamo lahko celo prikazovalnik z zaslonom na dotik, ki ga krmilimo prek vodila SPI ali I2C, ali pa klasični zaslon s tipkovnico, ki ga prav tako krmilimo preko omenjenih vodil.
Prihodnjič
Celotne primere programske kode lahko prenesete iz spletne strani https://sites.google.com/site/pcusbprojects. Prihodnjič se lotimo izdelave pametnega polnilnika akumulatorskih baterij na osnovi ESP32 modula, kar je poseben izziv, če upoštevamo majhen razmik med zunanjimi priključki modula. Po drugi strani, v ohišju enostavnega polnilnika baterij, ki ga bomo uporabili za osnovo, ni veliko prostora, zato je majhnost ESP32 modula sicer nujna. Odlično je tudi to, da lahko z njim brezžično komuniciramo, zato ne potrebuje svojega zaslona ali tipkovnice, potrebujemo le močnostne tranzistorje, s katerimi uravnavamo polnjenje akumulatorski baterij. Prihodnjič nas bodo zanimali še možnost priklopa kapacitivne tipkovnice in krmiljenja naprav infrardečega vmesnika ter izdelava samostojnega daljinskega upravljalnika s kapacitivno tipkovnico na osnovi ESP8266 ali ESP32.
Program 1: Preklapljanje A/D ESP8266 med napajalne merjenjem napetosti in kotnega zasuka #define roboADC_sel 0 // GPIO0 if(!adc_cnt){ adc_val=analogRead(0); // get battery voltage digitalWrite(roboADC_sel,LOW); // switch input channel to rotation angle adc_cnt++; } else { adc_angle=analogRead(0); // get rotation angle digitalWrite(roboADC_sel,HIGH); // switch input channel to battery voltage adc_cnt=0; } __________________________________________ Program 2: Program za upravljanje traktorja z nastavitvijo kotnega zasuka prednjih koles #define STRAIGHT 0 // straight forward direction #define SWH_tollerance 10 #define SWH_max_L 290 #define SWH_max_R 290 #define W_speed 100 // steering motor speed void Steer(int SWH_direction){ if(SWH_direction!=STRAIGHT) { int pos = SWH_center + SWH_direction; if (pos < SWH_max_L)pos = SWH_max_L; if (pos > SWH_max_R)pos = SWH_max_R; if (ADC_STEER > (pos+ SWH_tollerance)) { analogWrite(roboL, W_speed); digitalWrite(roboR,HIGH); } else { if (ADC_STEER < (pos- SWH_tollerance)) { digitalWrite(roboL,HIGH); analogWrite(roboR, W_speed); } else { digitalWrite(roboL,HI GH); digitalWrite(roboR,HIGH); SWH_direction=STRAIGHT; // front wheels set to the desired direction } } } } __________________________________________ Program 3: Program za procesiranje ESP32 telnet ukazov for(i = 0; i < MAX_SRV_CLIENTS; i++){ if (serverClients[i] && serverClients[i].connected()){ if(serverClients[i].available()){ //get data from the telnet client and push it to the UART while(serverClients[i].available()){ u=serverClients[i].read();// ESP32 own commands if(u=='i'){ // light on pinMode(lightSW, OUTPUT);digitalWrite(lightSW,HIGH); } else if(u=='I'){ // light off pinMode(lightSW, OUTPUT);digitalWrite(lightSW,LOW); } else {Serial.write(u);// Relay other commands to ESP8266 } } } } else if (serverClients[i])serverClients[i].stop(); }