Langaton yhteys Arduino <->  PC:llä oleva Visual Studio

 

Lähettäminen UDP:lla  Arduinoon

 

Dokumentaatiota yhteydelle löysimme täältä:

https://www.open-electronics.org/lets-program-arduino-with-microsoft-visual-studio-2017/

Arduinon esimerkki auttoi alkuun Arduinon päässä ja vb.netille tsekkasimme täältä:

https://www.codeproject.com/Articles/8877/UDP-Send-and-Receive-using-threads-in-VB-NET

Ensimmäinen tehtäväoli lisätä kirjastot projektiin:

Imports System.Net.Sockets 

Imports System.Net 

 

imagee0.png

Määrittelimme Arduinon käyttämän portin ja IP:n. Sisäverkon IP:n osalta kannattaa tässä kohden mainita, että tuo IP kannattaa määritellä reitittimeen kiinteäksi MAC-osoituksella (ja mieluusti käytetyn sarjan loppupäästä), jolloin yhteys ei katoa reitittimen jakaman IP-osoitteen leasetimen tullessa vastaan ja osoitteen mahdollisesti muuttuessa.

Sitten laitoimme esimerkistä koodia ja Web Editorin sarjaportin monitoroinnissa ja GUIssamme näytti nyt tältä:

 

imagee1.png

 

 

Lähetys siis toimi PC:ltä Arduinolle.

 

Vastaanotto UDP:lla  Arduinosta

 

Arduinon puoli

Tämä paljastuikin sitten olevan astetta hankalampi rasti. Harhailimme aikamme ja huomasimme, että oikotietä ei tälläkään kertaa ollut, vaan ongelma on ratkottava pala kerrallaan ja nollasta. Projektin ongelmana oli,ettäsiinä oli kaksi erillistä liikkuvaa osaa ja kun koetti  ratkoa molempia kerralla, niin ei tiennyt missä kohtaa mikäkin tökki. Eli oli Arduino ja sen koodi ja PC/vb.net ja sen koodi.

Löysimme esimerkkiprojektin, josta saimme UDP-kuuntelijan PC:n vb.netille. 

https://www.codeguru.com/columns/vb/communication-using-udp-and-visual-basic.html

Näin saimme eliminoitua PC-puolen ongelmat tässä vaiheessa. Ainoat muutokset koodiin teimme määrittelemällä socketin.

Arduinon lähettäjäesimerkin saimme täältä:

https://forum.arduino.cc/index.php?topic=176669.0

Siellä oleellista tässä vaiheessa oli tämä:

imagee2.png

 

Lisäsimme tuon koodinpätkän Arduinon luuppiin samaan suoritukseen UÄ-sensorin etäisyysilmoituksen kanssa, niin saimme helposti toistoa esimerkillemme.Kuitenkin niin että vaihdoimme näytettävän tekstin, PC:mme IP:n ja portin eli socketin.

Starttasimme ensin kuuntelun PC:ssä ja sitten tuuppasimme muunnetun koodin Arduinoon.

Nyt kuuntelija alkoi suoltaa tällaista:

 

imagee3.png

 

Hyvä! Se toimii, tosin merkistö on pielessä UTF8 vs. ANSI varmaan, mutta se ei ole tässä oleellista.

Seuraavaksi ajattelimme koettaa saada Arduino lähettämään ne etäisyys-, lämpötila- ja painiketiedot UDP:lla.

 

Etäisyystieto

 

Ja kun parin tunnin päästä saimme ensi kertaa jotain tolkullista etäisyysdataa UDP:lla näytölle tuntui se varsinaiselta työvoitolta. Tässä lyhyt selostus tämän ongelman ratkonnasta.

Huomasimme heti, ettei homma ole lähellekään yhtä simppeli kuin sarjaportin kanssa. Siinähän riitti, kun laittoi komennolla println  aiemmin saatu desimaalinen etäisyysarvo (muuttujassa) ja halutut tekstit liitettynä menemään tyyliin:

Serial.println("Etaisyys: "+ String(distance)+ " cm");

Suoraviivaista ja selkeää. Mutta UDP:n kanssa, ehei. Saimme siis menemään tekstiä lainausmerkkien sisältä, mutta tuo sarjaporttityyli ei toimi.

Loimme ensin taulukon packetBuffer2[], johon meillä oli tarkoitus saada se etäisyystieto, vaikka sitten tekstinä. Saimme muutaman sata eri virheilmoitusta yhtä monella yrittämällä, koska C++:n  logiikka poikkeaa täysin vb.netin vastaavasta. Mikään konsti ei tuntunut purevan. Mutta lopulta löysimme yrityksen ja erehdyksen kautta varsin lupaavan esimerkin:

https://arduino.stackexchange.com/questions/26832/how-do-i-convert-a-float-into-char

There is a function in the standard Arduino library called dtostrf(). I think of it as "Decimal to String Float". You pass in the float, how wide you want the whole number to be (if it will fit), the number of decimals of precision - and the buffer you want it to fill. 

Ei kun kokeilemaanVaan ei, ilmoitti ettei tunne koko komentoa. Piti siis löytää vielä komennolle kirjasto. Google kertoili parin yrityksen jälkeen tällaista:

apparently dtostrf is available only on avr, I've added a function to emulate it, it will be available on the next IDE release by including <avr/dtostrf.h>. 

Joten lisäsimme tuon kirjaston <avr/dtostrf.h> ja johan alkoi lyyti kirjoittamaan.

Laitoimme koodiin siis rivin:

 

imagee4.png

 

Distance on se aiemman koodin antama desimaalilukema etäisyydelle.

Sitten data piti saada packetBufferiin. Ja tämäkin rassasi tovin aikaa. Löytyi tällainen uusi hieno komento kuin strcpy()

https://stackoverflow.com/questions/15286014/segmentation-fault-strcpy-c

Sen avulla saimme taas luotua rivin lisää koodia:

imagee5.png

 

Ja lopulta itse asiaan:

 

imagee6.png

 

Ja nyt!

 

imagee7.png

 

Teksti tuli sieltä vb.netin koodista, mutta lukema etäisyysanturilta Arduinosta, jes.

Etäisyys sai olla oikeastaan tarkempikin lukema, joten lisäsimme desimaalit:

 

imagee8.png

 

Kerralla nappiin, oho:

 

imagee9.png

 

Tuo tulisi tarvitsemaan tunnisteita, jotta ei mene lämpötilan ja painikkeen kanssa sekaisin. Mutta katsomme sen myöhemmin.

 

Lämpötilatieto

 

Nyt meillä oli valmis sapluuna, joten lämpötilatiedon saaminen langattomasti ei oletuksemme mukaan pitänyt olla enää iso ongelma.

Lähdimme siis luomaan Arduinoon koodia luuppiin lämpötilasensorin kohdalle.

Ihan pikkuisen harha-askeleen jälkeen saimme koodin toimimaan. Meitä hämäsi, että tilanne oli nyt helpompi, muunnoksia ei tarvittu!

Laitoimme lämpötila-anturin sarjaporttikoodissa lasketun numberString-merkkitaulukon karvoineen kaikkineen suoraan lähetykseen ja toimi laakista.

 

imageea.png

 

PC:lle tuli kamaa nyt näin:

 

imageeb.png

 

Eli joka toinen rivi etäisyyttä ja toinen lämpötilaa. Noille arvoille pitää tosiaan kehitellä fiksausta jompaan kumpaan päähän, parempi olisi ehdottomasti Arduinon pää.

 

Painonapin tila

 

Sitten vielä napin painallus. Lähdimme tsekkaamaan sen koodin ja kuinka siihen saadaan UDP-komponentti mukaan.

Tämä oli helppo, meillehän riitti, että lähetetään ennaltavalittu teksti, kun trigger laukeaa ja tämä triggerhän oli valmiina sarjaporttiosuuden koodissa, joten lisäsimme sen sinne, esimerkkikoodihan meillä oli jo alkujaan:

 

imageec.png

 

Ja sitten testaamaan, näytti tältä:

 

imageed.png

 

Pelasi kerrasta, huolestuttavaa.

Yhteenvetoa tilanteesta. Nyt toimivat siis kaikkien sensoreiden lähetys Arduinosta langattomasti lähiverkossa PC:lle ja lukemat saatiin vb.netillä tehdyllä ohjelmalla myös näkymään. Jo aiemmin oli saatu lähetettyä tekstimuotoista dataa langattomasti Arduinoon.

 

Arduinon pään lähettämän datan muodon virittäminen

 

Saimme nätisti lisättyä koodia, jotta ulostuonti saatiin tolkulliseksi. Lämpötilalukema oli muodoltaan hassu, mutta se olisi helposti korjattavissa PC:n/vb.netin päässä.

Ultraäänisensori:

 

 imageee.png

 

Lämpötilasensori:

 

imageef.png

 

Ja kuuntelijan päässä näkymä nyt:

 

imagef0.png