Arduino Ethernet

Arduino Ethernet

Arduino Ethernet

Ar kada pagalvojote kaip būtų galima valdyti vieną ar kitą įrenginį per internetą? Šiame straipsnyje pateiksiu paprastą pavyzdį kaip su Arduino Ethernet prisijungti prie Telnet ir valdyti (grubiu būdu) vieną ar kitą įrenginį.

Pirmiausia kas tai Arduino galite paskaityti jų oficialiame puslapyje kur rasite daug informacijos nuo ko pradėti, daug bibliotekų padėsiančių pagreitinti programavimą ir nesigilinti į specifinius signalo perdavimus.

Pirmiausia ką mums reikėtų žinoti apie Arduino? Arduino yra tiesiog C kalbos karkasas turintis savo jau iš anksto aprašytas funkcijas ir labai paprastai leidžiantis nurodyti įėjimo/išėjimo signalus.

Kaip minėjau šiame pavyzdyje aptarsime kaip susikurti įrenginį padėsiantį valdyti elektros prietaisus/robotą ir dar bala žino ką per Internetą.

Ko mums reikės?

  • Reikia turėti Arduino Uno plokštę arba pačiam galima ją pasidaryti.
  • Taip pat galima persidaryti iš paprasto routerio savo norimą plokštę kuri bus atsakingą už ateinančius paketus ir jų siuntimą, arba galia  naudoti Arduino Ethernet
  • Noro ką nors susikurti :)

Žemiau pateiktame kode parodoma kaip prisijungti prie Telnet serverio su nurodytais prisijungimo duomenimis ir atlikti norimą Telnet komandą.

#include <SPI.h>
#include <Ethernet.h>
 
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1,8 };
byte submask[] = {255, 255, 255, 0};
byte gateway[] = {192,168,1,254};
byte server[] = { 192,168,1,1 }; 
 
Client client(server, 10002);
 
String buffer;
String tmp_buffer;
int a = 1;
int logged = 0;
 
void setup() {
  Ethernet.begin(mac, ip, gateway, submask);
  Serial.begin(9600);
  delay(1000);
  Serial.println("connecting...");
  if (client.connect()) {
    Serial.println("connected");
  }
  else {
    Serial.println("connection failed");
  }
}
 
void loop() {
  if (client.available()) {
    byte c = client.read();
    if ((c << 4) != 432) {
       buffer.concat(c);
    }
    else {
       switch (logged) {
            case 0:
                 if (buffer.substring(5,buffer.length() -3) == "Press any key to continue") {
                      client.println("a");
                   }
                   //Serial.println(buffer);
                   if (buffer.substring(5,11) == "login:" &#038;& logged == 0) {
                       client.println("Arduino");
                       delay(500);
                       client.println("Athernet");
                       delay(5000);
                       client.println("cd valdymas/");
                       client.println("echo off");
                       logged = 1;
                   }
            break;
            case 1:
                 client.println("dir /B");               Serial.println(buffer.substring(14,15).replace("\n","").replace("dir /B",""));
            break;
       }
       buffer ="";
    }
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    while(true);
  }
}
}

Pabandysiu paaiškinti beveik kiekvieną kodo eilutę suprantamai kas už ką atliekama.

Pirmiausia prieš darant bet kokius susijungimus turime būtinai nustatyti IP adresą, MAC adresą, Gateway bei Submask. Šie nustatymai yra privalomi. Nors daugumoje Arduino pavyzdžių nėra naudojamas nei Gateway, nei Submask, bet jie ištikro yra privalomi, nes kitu atveju nepavyks prisijungti prie serverio ar kaip sakant „Išeiti į Internetą“.

Kintamasis server[] naudojamas prisijungti prie norimo IP adreso.

Toliau funkcija void setup() yra naudojama tik vieną kartą kai sistema paleidžiama, nustatomi norimi paremetrai ir po to seka void loop()

Prieš setup() funkciją nurodome kad jau laikas jungtis prie serverio ir sukuriame naują objektą:

Client client(server, 10002);

Mūsų objektas būtent ir bus client kuris susijungė su nurodytu Telnet serverio IP adersu bet 10002 portu.

Toliau setup() funkcijoje nustatome Ethernet plokštės nustatymus tokius kaip IP,MAC,Submask,Gateway.

Nustačius Ethernet plokštės nustatymus patikrinama ar klientas (objektas client) yra prisijungę ar ne. Jei klientas prisijungęs client.connect() grąžins reikšmę true, kitu atveju grąžinama reikšmė false

Informacijos skaitymas

Jeigu mums pavyko prisijungti prie nurodyto serverio, tuomet galime cikle loop() tikrinti ar yra gaunami kažkokie duomenys iš Ethernet plokštės.
Tokiu atveju pirmiausia tikriname ar klientas vis dar prisijungęs: client.available(). Jeigu grąžinama reikšmė yra true, tuomet galime tęsti savo savo ciklą ir skaityti po vieną simbolį iš Ethernet gauto paketo.
Nuskaityti simbolį naudojama yra funkcija read() ir išvedamas vienas simbolis. Jeigu nėra perduodama jokių duomenų, o tiesiog palaikomas ryšys, tuomet atsakymas bus -1.

Kadangi šiame pavyzdyje naudojau paprastą telnet serverį kurį pirmą suradau per Google, tai teks apdoroti duomenis tokius kokius šis serveris grąžiną. Pirmas dalykas kas visiškai netinka tai kad telnet serveris sakinio pabaigoje išveda nulinį bitą 0x00, o Arduino negali jo apdoroti ir šioje vietoje jis sustoja veikti jeigu yra bandoma su šiuo bitu atlikti bet kokie veiksmai. Šiam dalykui išspręsti užtenka truputi pakoreguoti gauta bitą pastumti truputį į kairę ir bus grąžinta sveikojo skaičiaus reikšmė, tokiu būdų išsispręsim problemą dėl nulinio bito.
Kai apdorojam nulinį bitą, tiesiog toliau galime dirbti su gautais duomenimis kaip tik norime ir pateiktame pavyzdyje aiškiai matosi kas yra vykdoma.

Norėdami įvykdyti bet kokia komandą mums tiesiog užtenka pasiųsti į kliento objekto klasę naują eilutę su savo norima komanda. Jeigu naudosite ne println(), o print(), jums teks šią komandą naudoti du kart ir antrą kartą naudodami ją turėsite išsiųsti naujos eilutės komanda \n.

Jeigu klientas nėra prisijungęs ir/ar tiesiog atsijungė ar dingo ryšys, tokiu atveju naudojama komanda connected() kuri grąžina false jeigu klientas nebeturi ryšio su Internetu.

Kai klientas atsijunge nuo serverio ar praranda ryšį būtina siųsti komanda stop(), kitu atveju staigus ryšio nutraukimas nebeleis vėl iš naujo prisijungti ir tiesiog reikės iš naujo keisti IP adresą ir įkelti kodą į mikroschemą.

Mindaugas

IT specialistas, PHP programuotojas. Sritys: PHP, MySQL, JavaScript, Ajax, jQuery, Arduino, (x)HTML, CSS, XML

More Posts - Website

Žymos: ,

Parašykite komentarą

El. pašto adresas nebus skelbiamas. Būtini laukeliai pažymėti *

Galite naudoti šias HTML žymas ir atributus: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>