vineri, 24 februarie 2017

Realizarea programelor Arduino - partea 2




În această postare voi prezenta alte 3 programe simple realizate cu Arduino Uno/Nano, câteva elemente de bază ale folosirii microcontrolerelor pe plăcuțe Arduino. Aceasta este o continuare a unei alte postări, în care am arătat cum se aprinde și stinge un LED, cum putem controla luminozitatea unui LED și modul în care afișăm mesaje pe Serial Monitor. Vă recomand să accesați postarea respectivă (deoarece vom folosi anumite noțini din ea pentru programele următoare), pe linkul următor :
Arduino Uno - Realizarea unui program

Prin intermediul primului program voi prezenta modul în care se face citirea digitală, în al doilea program vom folosi citirea analogică, iar în cel de-al treilea program voi arăta cum putem trimite comenzi prin intermediul ferestrei Serial Monitor.


1. Citirea digitală - conectarea unui buton la Arduino


În acest prim program vom folosi un buton (pushbutton), pe care îl conectăm la plăcuța Arduino. Vom mai conecta și un LED, care se va aprinde la apăsarea butonului, iar apoi se va stinge la următoarea apăsare. Butonul îl conectăm în felul următor: un picior al butonului la pinul de 5V, iar celălalt picior al butonului la un pin digital (de exemplu pinul 3) și printr-un rezistor de 10k ohmi la GND-ul plăcuței. Astfel, când butonul este apăsat, pe pinul digital vom avea tensiunea de 5V ( nivelul "1" logic), iar când nu este apăsat avem 0V, deci nivelul "0" logic.
Pentru determinarea nivelului logic vom folosi citirea digitală, prin instrucțiunea Arduino, digitalRead(pin); ,unde în loc de pin vom pune numărul pinul la care este conectat butonul.

În program vom folosi o variabilă în care citim starea butonului, o variabilă care să memoreze starea precedentă a butonului și o variabilă pentru starea ledului. Se vor folosi 2 LED-uri, cel existent pe plăcuță (conectat la pinul 13) și încă un LED conectat exterior, print-un rezistor la un pin digital al plăcuței (eu voi folosi în acest exemplu pinul 10).

Schema de conectare buton

Programul folosit este următorul:

/*
  Folosirea unui Pushbutton - citirea digitala
        
  Conectarea butonului:
 * un picior al butonului il punem la pinul de +5V al placutei
 * al doilea picior il punem la pinul 3
 * punem si un rezisor de 10K de la al doilea picior al butonului la GND 

  Cand butonul este apasat vom avea "1" logic, altfel avem "0" logic
  Conectam un LED exterior. "+" LED-ului la pinul 10, iar minusul LED-ului il 
  conectam printr-un rezistor de 220 ohmi la GND
 */

int b = 0;    // variabila pentru a citi starea butonului
int a=0, s=0; // alte variabile pentru memorarea anumitor informatii   
   
void setup() {
  pinMode(3, INPUT);  // pinul la care este conectat butonul (folosit ca intrare)
  pinMode(10, OUTPUT); // pin setat ca iesire (pinul la care conectam un LED)
  pinMode(13, OUTPUT); // pinul 13 are un led conectat la el pe placuta Arduino
  digitalWrite(10,LOW); // starea initiala a LED-ului (LOW = "0" logic = stins)
  digitalWrite(13,LOW);  // starea initiala a LED-ului (LOW = "0" logic = stins)
}

void loop() {
  b = digitalRead(3); // se citeste starea butonului(apasat sau neapasat)
  if (b == LOW) // daca butonul este neapasat, memoreaza acest lucru intr-o variabila
    a=0;  // memoram intr-o variabila ca pinul este pe nivelul "0" logic
  if ((a==0) and (digitalRead(3)==HIGH)){ // daca starea precedenta este "0" si citirea actuala indica "1" logic(HIGH), va schimba starea LED-ului
      if (s==0){  // verifica daca LED-ul este stins sau aprins
        // daca LED-ul este stins:
  digitalWrite(10, HIGH);   // aprindem LED-ul de la pinul 10
  digitalWrite(13, HIGH);   // aprindem LED-ul de la pinul 13
  s=1;    // variabila pentru starea LED-ului
  }
      else{
        // daca LED-ul este aprins:
  digitalWrite(10, LOW);   // stingem LED-ul de la pinul 10
  digitalWrite(13, LOW);   // stingem LED-ul de la pinul 13
  s=0;  
  }
  a=1;   // atribuim valoarea 1 variabilei care memoreaza starea anterioara a butonului
  }
  delay(100);  // asteptam 100 de ms(milisecunde) intre momentele in care citim starea butonului
}

Programul de mai sus pare puțin complicat, deoarece folosim o variabilă în care memorăm starea anterioară a butonului. Avantajul acestui program este acela că nu contează cât timp ținem apăsat butonul, la o apăsare fie scurtă, fie mai lungă, starea LED-urilor se schimbă o singură dată.
Un pushbutton poate fi folosit cu un program mai simplu, în care doar citim starea butonului și când aceasta este 1 logic să schimbăm starea LED-ului. Însă dacă intervalul de timp la care se face citirea este mare, este posibil să nu detecteze o apăsare mai scurtă, iar dacă intervalul de timp este prea mic se schimbă starea de mai multe ori la o singură apăsare.
Putem îmbunătății programul de mai sus, prin introducerea unei alte variabile, în care să memorăm numărul de apăsări, iar în funcție de acestă să efectuăm o anumită operație.

Am realizat montajul pe breadboard, cu un Arduino Nano, ca în imaginea de mai jos. LED-ul de pe plăcuță, de la pinul 13 se va aprinde/stinge simultan cu LED-ul conectat exterior la pinul 10, la o apăsare a butonului.

Montajul realizat pe breadboard + Arduino Nano

Ledurile aprinse după apăsarea butonului




2. Citirea analogică - folosirea unui fotorezistor 

Prin acest program voi arăta cum putem afla nivelul de luminozitate într-o încăpere. Aceasta se va face destul de simplu prin folosirea unui fotorezistor pe care îl conectăm la plăcuța Arduino. Fotorezistorul este caracterizat de o rezistență care variază în funcție de nivelul de lumină. Vom conecta fotorezistorul la un pin cu funcție de intrare analogică (de exemplu A0) și vom face o citire analogică pe acest pin.
Schema de conectare a fotorezistorului este următoarea:
- un picior al fotorezistorului îl punem la pinul de 5V.
- al doilea picior al fotorezistorului îl punem la un pin cu funcție de intrare analogică, eu voi folosi pinul A0.
- de asemenea, mai este necesar să conectăm un rezistor de 10k ohmi, de la al doilea picior al fotorezistorului la un pin de GND al plăcuței.



Montajul realizat pe breadboard


Fotorezistor



Programul pe care îl vom folosi va afișa în fereastra Serial Monitor, la un anumit interval de timp valoarea citită de la fotorezistor. Această valoare va fi un număr întreg între 0 și 1023, unde 0 reprezintă întuneric beznă, iar o valoare apropiată de 1023 este echivalentă cu o luminozitate foarte puternică. Pe pini folosiți ca intrări analogice, vom citi un nivel de tensiune între 0V și 5V, care cu ajutorul unui convertor analog-digital, de pe plăcuța Arduino, va reprezenta acest nivel de tensiune cu o valoare numerică, în intervalul specificat mai sus (0 - 1023). Pentru a transforma valoarea numerică în tensiune se procedează astfel. Înmulțim cu 5 valoare citită, apoi împărțim la 1023 și obținem tensiunea citită pe pinul plăcuței.

Programul folosit este următorul:

/*        Fotorezistor  -  citirea analogica

 * Conectam un picior al fotorezistorului pe pinul de 5V
 * Conectam al doilea picior al fotorezistorului la pinul A0
 * De la al doilea picior al fotorezistorului mai ducem o rezistenta de 10k la GND 

  Vom afisa in fereastra Serial Monitor valoarea citita
*/

void setup() {
 Serial.begin(9600);   // initializam comunicatia seriala
 Serial.println("Fotorezistor");   //mesaj de inceput
 Serial.println("");     // rand liber
}

int v;  // variabila in care facem citirea valorii

void loop() {
  v = analogRead(A0);   // citim valoarea tensiunii pe fotorezistor
  Serial.print("Valoarea citita este: ");  // afisam un mesaj fara a trece pe randul urmator
  Serial.println(v);  // afisam valoarea citita si mutam cursorul pe randul urmator
  delay(2000);    // asteptam 2 secunde pana la urmatoarea citire
}

Copiați codul în programul Arduino IDE și realizați montajul corespunzător. Selectați în meniul Tools tipul plăcuței Arduino folosită (Uno sau Nano), încărcați programul pe aceasta (Upload), apoi deschideți fereastra Serial Monitor și o să vă apară ca în imaginea de mai jos. Valoarea citită trebuie să fie aproximativ constantă. Dacă acoperiți cu ceva fotorezistorul, valoarea trebuie să se apropie de 0, iar dacă îl puneți într-un loc mai luminos, aceasta trebuie să fie în jur de 1000 (maximul este 1023).




3. Trimiterea de comenzi în fereastra Serial Monitor

În următorul program, vă voi prezenta modul în care citim și interpretăm mesaje prin intermediul ferestrei Serial Monitor a programului Arduino IDE. Pentru aceasta vom folosi schema de mai sus cu fotorezistorul, la care mai adăugăm un LED, sau putem folosi LED-ul conectat la pinul 13 de pe plăcuța Arduino. Când vom trimite comanda "LED ON" vom aprinde LED-ul, la comanda "LED OFF" vom stinge LED-ul, iar la comanda "citeste" vom afișa valoarea citită de la fotorezistor.
Puteți folosi și montajul de la punctul 1, din care se înlătură butonul și se adaugă fotorezistorul ca în schema prezentată la punctul 2. Dar pentru simplitate putem să folosim doar pinul 13.

Trimiterea de comenzi prin intermediul ferestrei Serial Monitor și interpretarea acestora se face în felul următor. Mai întâi verificăm dacă a fost trimis un mesaj (dacă există date în buffer), cu instrucțiunea if (Serial.available()>0){...}, apoi vom citi mesajul într-o variabilă de tip șir de caractere (String), cu instrucțiunea Serial.readString(). După ce am citit un mesaj, verificăm conținutul acestuia și în funcție de el vom realiza anumite instrucțiuni.

Programul folosit este următorul:

/*   Trimiterea de comenzi - Serial Monitor

 Avem conectat un fotorezistor astfel:
 * Conectam un picior al fotorezistorului pe pinul de 5V
 * Conectam al doilea picior al fotorezistorului la pinul A0
 * De la al doilea picior al fotorezistorului mai ducem o rezistenta de 10k la GND 

  Vom citi in fereastra Serial Monitor un mesaj si vom aprinde/stinge un LED
  sau vom afisa valoarea citita de la fotorezistor sau un mesaj de eroare
*/

void setup() {
 pinMode(13, OUTPUT);    // declarm pinul la care este conectat LED-ul ca iesire
 digitalWrite(13, LOW);  // starea initiala a pinului este LOW = LED stins
 Serial.begin(9600);     // initializam comunicatia seriala
 Serial.println("Trimiterea comenzilor pe Serial Monitor");   //mesaj de inceput
 Serial.println("");     // rand liber
 Serial.println("");     // rand liber
}

String m;  //variabila pentru citirea mesajului

void loop() {
  if (Serial.available()>0){   // verificam daca exista date (un mesaj) in buffer
    m=Serial.readString();    // citim mesajul din buffer intr-un string
    
// verificam mesajul
    if ((m=="LED ON") || (m=="led on") || (m=="led ON")) {
      digitalWrite(13, HIGH);  // aprindem LED-ul de la pinul 13(ledul de pe placa Arduino)
      Serial.println("LED aprins"); // afisam un mesaj de confirmare
    }
    else if ((m=="LED OFF") || (m=="led off") || (m=="led OFF")) {
      digitalWrite(13, LOW);  // stingem LED-ul de la pinul 13
      Serial.println("LED stins"); // afisam un mesaj de confirmare
    }
    else if ((m=="citeste") || (m=="Citeste")){
  Serial.print("Valoarea citita este: ");  // afisam un mesaj fara a trece pe randul urmator
  Serial.println(analogRead(A0));  // citim si afisam valoarea tensiuni pe fotorezistor
   }
    else Serial.println("Comanda necunoscuta");  // afisam un mesaj de eroare

}
 else delay(100);    // daca nu avem date asteptam 0,1 secunde pana la urmatoarea verificare a buffer-ului
}

Am folosit programul atât pe o plăcuță Arduino Uno, cât și pe o plăcuță Arduino Nano. În fereastra Serial Monitor trebuie să vă apară asemănător cu imaginile de mai jos, în funcție de comenzile (mesajele) trimise.



Dacă ați înțeles programele din această postare și din postarea precedentă, puteți încerca diverse combinații cu LED-uri, butoane, fereastra Serial Monitor și alte componente.
Mult succes!


vineri, 17 februarie 2017

Ortogonalizarea unei baze




Prin intermediul acestei postări o să explic cum se demonstrează că o mulțime este bază, iar apoi o să vă arăt cum se ortogonalizează această bază, prin procedeul Gram - Schmidt.

Vom lua direct un exemplu concret de mulțime cu 3 vectori și ne propunem să arătăm că aceasta este o bază în spațiul R3 , apoi vom ortogonaliza această bază prin procedeul Gram - Schmidt .



Se consideră o mulțime de forma B = {v1, v2, v3}, B = {(0, 1, -1), (3, -2, 3), (0, -1, 2)}
Deci, v1 = (0, 1, -1),  v2 = (3, -2, 3) și  v3 = (0, -1, 2).

Să se arate că B este o bază în spațiul R3 (R X R X R), unde R - mulțimea numerelor reale.
Mai întâi arătăm că mulțimea B este un sistem liniar independent (S L I), rezolvând ecuația a1v+ a2v+ a3v= 0, iar ca rezultat al ecuației trebuie să obținem soluția unică a1=0, a2=0 și a3=0.

a1v+ a2v+ a3v= 0
a1*(0, 1, -1) + a2*(3, -2, 3) + a3*(0, -1, 2) = (0, 0, 0)
(0, a1, -a1) + (3a2, -2a2, 3a2) + (0, -a3, 2a3) = (0, 0, 0)
(3a2,  a- 2a2 - a3 ,  -a+ 3a+ 2a3 ) = (0, 0, 0)


Din aceasta egalitate rezultă următoarele ecuații:
- ec. 1)   3a= 0    => a= 0
- ec. 2)   a1 - 2a- a= 0   => a1 - 0 - a= 0  => a1 - a= 0 
- ec. 3)   -a1 + 3a+ 2a= 0  =>  -a1 + 0  + 2a= 0  =>  -a1 + 2a= 0

Adunând ecuațiile 2) și 3), se obține  a= 0
Din ecuația 2, rezultă a1 - a= 0  => a1 = a3   =>  a1 = 0

Deci, am obținut soluția unică: a1 = 0,  a2 = 0 și a3 = 0 , rezultă că B formează un sistem liniar independent.

Din următoarele:
-  B este S.L.I   (sistem liniar independent)
-   dim(R3) = 3  (dimensiunea spațiului R(R X R X R) este 3)
-  card(B) = 3  (mulțimea B are 3 elemente)
obținem că mulțimea B este o bază în spațiul R3.



Pentru un alt subiect în legătură cu acesta, despre cum putem scrie un vector ca o combinație liniară de vectori din baza B, accesați următoarea postare:


Ortogonalizarea bazei B

Acum vom trece la parte cea mai importantă, aceea de a ortogonaliza baza B, prin  procedeul Gram - Schmidt.
Pentru cei interesați să afle mai multe despre procedeul Gram - Schmidt vă recomand următoarea pagină:
https://ro.wikipedia.org/wiki/Procedeul_Gram%E2%80%93Schmidt


Pentru aceasta, trebuie să punctez modul în care se efectuează produsul scalar a doi vectori, deoarece avem nevoie de acest calcul pentru ortogonalizarea bazei.

Produsul scalar se calculează în felul următor: se înmulțesc coeficienții corespunzători versorilor, i, j și k, de la primul vector cu cei de la al doilea vector (sau coordonatele primului vector cu cele corespunzătoare de cel de-al doilea vector) și apoi se însumează rezultatele. Produsul scalar a 2 vectori u și v se notează < u, v > , iar rezultatul este un număr.

Fie vectorii: u = a1*i + b1*j + c1*k = (a1, b1, c1)  și  v' = a2*i + b2*j + c2*k = (a2, b2, c2),  unde i, j și k sunt versorii axelor. Produsul scalar este următorul.

< u' , v'> a1*i + b1*j + c1*k  ,   a2*i + b2*j + c2*k> = < (a1, b1, c1), (a2, b2, c2) > = a1*a2 + b1*b2 + c1*c2

Vom folosi a doua variantă pentru reprezentarea vectorilor, cea sub formă de coordonate, nu cea cu versorii i, j și k.

Exemplu:  Pentru vectorii u = (2, 5, -3) ,  v = (-1, 3, 4), avem produsul vectorial:
  < u , v > = < (2, 5, -3) , (-1, 3, 4) > = 2*(-1) + 5*3 + (-3)*4 = -2 + 15 - 12 = 1


Baza ortogonalizată va fi de forma B' = {u1, u2, u3}. Elementele acestei mulțimi se determină după cum urmează:
  • u1 = v1    
           u1 = (0, 1, -1)

  • u2 = v2 - (<v2, u1> / <u1, u1>) * u1

u2 = (3, -2, 3) - (<(3, -2, 3)(0, 1, -1)> / <(0, 1, -1)(0, 1, -1)>) * (0, 1, -1)
u2 = (3, -2, 3) - ( 3*0 + (-2)*1 + 3*(-1) ) / ( 0*0 + 1*1 + (-1)*(-1) ) *  (0, 1, -1)
u2 = (3, -2, 3) - (-5)/2 * (0, 1, -1) = (3, -2, 3) + 5/2 * (0, 1, -1)
u2 =  (3, -2, 3) + (0, 5/2, -5/2) = (3+0, -2+5/2, 3-5/2) = (3, -4/2+5/2, 6/2-5/2)
         u2 = (3, 1/2, 1/2) 


  • u3 = v3 - (<v3, u2> / <u2, u2>) * u2 - (<v3, u1> / <u1, u1>) * u1

u3 = (0, -1, 2) - (<(0, -1, 2)(3, 1/2, 1/2)> / <(3, 1/2, 1/2)(3, 1/2, 1/2)>) * (3, 1/2, 1/2) - (<(0, -1, 2)(0, 1, -1)> / <(0, 1, -1)(0, 1, -1)>) * (0, 1, -1)
u3 = (0, -1, 2) - (0 - 1/2 + 2/2) / (9 +1/4 + 1/4) * (3, 1/2, 1/2) - (0 - 1 - 2) / (0 + 1 + 1) * (0, 1, -1)
u3 = (0, -1, 2) - (1/2) / (19/2) (3, 1/2, 1/2) - (-3) / 2 * (0, 1, -1)
u3 = (0, -1, 2) - 1/19 (3, 1/2, 1/2) + 3/2 * (0, 1, -1)
u3 = (0, -1, 2) - (3/19, 1/38, 1/38) + (0, 3/2, -3/2)
u3 = (0 - 3/19 + 0,  -1 - 1/38 + 3/2,  2 - 1/38 - 3/2)
u3 = (-3.19,  -38/38 - 1/38 +57/38,  76/38 -1/38 - 57/38)
u3 = (-3/19,  18/38,  18/38)
         u3 = (-3/19,  9/19,  9, 19)

Așadar, baza ortogonalizată este:

B' = { (0, 1, -1),  (3, 1/2, 1/2),  (-3/19, 9/19, 9/19) }

Mai sus, cu roșu avem formulele de calcul, cu negru calculul efectiv, iar cu albastru rezultatele. Nu vă speriați de lungimea calculului, acesta este rezolvat detaliat și s-a întâmplat să fie niște fracții mai urâte, dar în general este vorba doar de operații aritmetice elementare (adunări, scăderi, înmulțiri, împărțiri).



joi, 16 februarie 2017

Calcularea valorilor și vectorilor proprii ai unei matrici



Prin intermediul acestei postări, veți învăța cum se calculează valorile și vectorii proprii ai unei matrici pătratice de ordinul 3, cu ajutorul unui exemplu concret. Există multe pagini unde puteți găsi teoria acestui subiect, însă este dificil de înțeles din teorie (unde se folosesc matrici de ordin n), cum se calculează în mod concret aceste elemente.

Mai întâi de toate, vreau să amintesc cum se calculează un determinant de ordinul 3, deoarece este necesar să efectuăm acest calcul asupra matricii, pentru a putea determina ceea ce ne interesează.
Determinantul unei matrici este un număr.

Considerăm următoarea matrice pătratică de ordinul 3, notată A:

Pentru a calcula determinantul acestei matrici, vom folosi regula triunghiului. Se observă în imaginea de mai jos că am marcat cele 2 diagonale ale matricii A, cu roșu am marcat diagonala principală, iar cu albastru diagonala secundară
Pentru calcularea determinantului se procedează ca în imaginea de mai jos. Mai întâi înmulțim elementele de pe diagonala principală, apoi pe cele aferente acesteia (de deasupra, respectiv dedesubtul ei - se iau câte 2 elemente și colțul opus)  și le punem cu semnul plus "+" în suma determinantului. Procedăm asemănător pentru diagonala secundară și elementele aferente ei, numai că pe acestea le vom pune cu minus "-" în suma determinantului.
Sper să înțelegeți mai bine modul cum înmulțim elementele matricii, în exemplul de mai jos.


În continuare vom lua un exemplu concret de matrice pe care vom calcula valorile și vectorii proprii.


Exemplu

Considerăm matricea următoare:    
Valorile proprii ale matricii A sunt rădăcinile polinomului caracteristic, PA(λ) = det(A-λI3), unde I3 sau I3, reprezintă matricea unitate.
Rădăcinile polinomului le aflăm rezolvând ecuația det(A-λI3) = 0, după cum urmează :



Astfel:     det(A-λI3) = 0   =>  (-4-λ) * (-1-λ) * (3-λ) = 0

Soluțiile ecuației de mai sus sunt:
-4-λ = 0  =>  λ1 = -4
-1-λ = 0  =>  λ2 = -1
 3-λ = 0  =>  λ3 = 3   

Deci, valorile proprii ale matricii A sunt:  λ1 = -4,  λ2 = -1 și λ3 = 3


Vectorii proprii ai matricii A

Se vor calcula vectorii proprii corespunzători celor 3 valori proprii ale matricii: λ1 = -4,  λ2 = -1 și λ3 = 3. Pentru aflarea acestora rezolvăm câte o ecuație matriceală de forma (A-λI3) * X = 0, după cum urmează:


Pentru λ1 = -4  avem:

Astfel, ecuația  (A-λI3) * X = 0 este:

Am notat deasupra primei matrice variabilele x1, x2 și x3, unde x1 corespunde primei coloane, x2 corespunde celei de-a doua coloană, iar x3 la cea de-a treia coloană.
Pentru rezolvarea ecuației, din această matrice de 3 linii pe 3 coloane, alegem una de 2 pe 2 (un minor de ordinul 2), care să aibă determinantul diferit de 0 (nenul). Variabila corespunzătoare coloanei rămase în afară, o vom nota cu t.

Notăm, x3 = t și avem ecuațiile:
       2x1 + 3x2 = 0  (ec. 1)
       x1 + 5x2 + 7t = 0  => x1 + 5x2 = -7t | *(-2)   =>  -2x1 -10x2 = 14t  (ec. 2)
Adunând ecuațiile 1 și 2, obținem:   -7x2 = 14t => x2 = -2t  
=> 2x1 + 3*(-2t) = 0  => 2x1 – 6t = 0 => 2x1 = 6t  => x1 = 3t

Astfel, vectorul propriu X corespunzător primei valori proprii a matricii A este următorul:



Pentru λ2 = -1  avem:


Deci, ecuația  (A-λI3) * X = 0 este:
Notăm, x3 = t și avem ecuațiile:
        2x1 = 0  => x1 = 0
        x1 + 5x2 + 4t = 0  => 0 + 5x2 = -4t  => x2 = -4/5 t

Astfel, vectorul propriu X corespunzător pentru a doua valoare proprie a matricii A este următorul:


Pentru λ3 = 3  avem:  


 Deci, ecuația  (A-λI3) * X = 0 este:

Notăm, x3 = t și avem ecuațiile:
       -7x1 = 0  => x1 = 0
       2x1 -4x2 = 0  => 0 -4x2 = 0  => x2 = 0

Astfel, vectorul propriu X corespunzător celei de-a treia valori proprii a matricii A este următorul:


miercuri, 15 februarie 2017

Arduino Uno - Realizarea unui program



În această postare vă voi prezenta modul de realizare al unui program simplu, folosind Arduino și vă voi prezenta câteva exemple.

Pentru început trebuie să aveți o plăcuță Arduino și să aveți instalat programul Arduino IDE.
Pentru modul de instalare a programului și pentru câteva informații despre acesta, puteți consulta o altă postare de pe acest blog: http://gabimath.blogspot.ro/2017/02/notiuni-introductive-arduino.html

Deschideți programul Arduino IDE și o să vă apară fereastra următoare:



Un program Arduino trebuie să conțină obligatoriu, cele 2 funcții care apar și în imaginea de mai sus. Pe lângă acestea, utilizatorul își poate crea propriile funcții, după ceea ce dorește ca programul să realizeze. Dar până să ajungem la crearea unei funcții, să vedem ce fac acestea obligatorii și cum se pot realiza câteva programe simple.


Funcția setup

Așa cum se observă și în imagine, aceasta este funcția de început a unui program Arduino, care se execută o singură dată. Ca o paranteză, specific că într-un program Arduino, ceea ce se scrie după 2 bare oblice ( // ) reprezintă un comentariu. Astfel " // put your setup code here, to run once ", este un comentariu care ne spune ceea ce am scris și eu mai sus.
Conținutul unei funcții în Arduino, se scrie între acolade - { //conținutul funcției }
În această funcție, se declară pinii folosiți și tipul lor, OUTPUT (ieșire) sau INPUT (intrare), se inițializează diverse operații și componente (comunicarea serială, senzori, LCD, receptor IR, etc.)


Funcția loop

Aceasta este funcția principală a unui program Arduino, care rulează "la infinit", bineînțeles atât timp cât plăcuța Arduino este alimentată. Este important să ținem cont de faptul că funcția loop este o funcție repetitivă, atunci când realizăm un program.


Ce mai este de specificat în legătură cu un program realizat în Arduino, este aceea că la început de tot, înainte de funcția setup, includem librăriile care ne sunt necesare ( #include ) și putem defini anumite variabile globale. De asemenea, variabilele pot fi declarate și între cele 2 funcții ale programului, între setup și loop, sau local în funcția loop.

Pentru tipuri de variabile, operatori, structură, funcții, etc., folosite într-un program Arduino, consultați următorul link: https://www.arduino.cc/en/Reference/HomePage



Acum, să începem realizarea unui program cu Arduino Uno.

Nu uitați ca după ce ați conectat plăcuța Arduino la computer, să alegeți în meniul Tools, tipul acesteia și portul corespunzător. Eu voi folosi o plăcuță Arduino Uno, conectată la portul COM 4.



Plăcuța Arduino Uno este prezentată în imaginea următoare.


Nu voi vorbi despre alcătuirea acestei plăcuțe, despre interfețele I2C sau SPI, în ceea ce urmează, deoarece nu acesta este scopul postării.
Ceea ce vreau să specific în legătură cu plăcuța Arduino Uno, este că aceasta are 14 pini care pot fi folosiți ca intrări sau ieșiri digitale ( pinii de la 0 la 13) și 6 pini folosiți ca intrări analogice (pinii A0 la A5). Dintre cei 14 pini digitali, 6 (pinii 3, 5, 6, 9, 10 și 11) sunt pini PWM(~) și vom folosi într-un exemplu de program unul dintre ei. Pinii de tip PWM permit ca la ieșire să variem tensiunea între 0V și 5V.
Pentru mai multe informații despre plăcuța Arduino Uno și pinii acesteia, consultați următoarele pagini:
https://www.arduino.cc/en/Main/ArduinoBoardUno
https://www.allaboutcircuits.com/technical-articles/understanding-arduino-uno-hardware-design/
http://playground.arduino.cc/Learning/Pins

Controlul unui LED

Primul program, cel mai simplu de realizat, este să aprindem și să stingem un LED. Plăcuța Arduino Uno are un LED conectat la pinul 13 și îl vom folosi pe acesta.
Mai întâi. în funcția setup declarăm pinul 13 ca ieșire , iar apoi îi dăm starea de LOW - tensiune 0.
În funcția loop, vom aprinde și vom stinge LED-ul conectat la pinul 13 la câte 1 secundă. Pentru aceasta vom schimba starea pinului din HIGH, adică 5V în LOW - 0 V, la un interval de timp de 1000 ms = 1 s.

Programul folosit este următorul:

void setup() {
 pinMode(13, OUTPUT);  // declaram pinul 13 ca iesire
 digitalWrite(13, LOW);  // starea initiala a pinului - LOW = stins
}

void loop() {
 digitalWrite(13, HIGH);  // punem pinul pe starea HIGH - aprindem ledul
 delay(1000);   // asteaptam 1 secunda (1000 ms - milisecunde)
 digitalWrite(13, LOW);  // punem din nou pinul pe LOW  - stingem ledul
 delay(1000);   // asteptam inca o secunda pana la relearea functiei

}



Instrucțiunile se termină cu caracterul punct și virgulă(;), și după ele eu am pus și câte un comentariu.
Copiați codul, salvați programul, dați upload la program, iar apoi urmăriți funcționarea plăcuței. Ledul situat lângă pinul 13, se va aprinde și stinge la fiecare secundă.

Acum puteți conecta și un LED extern pe oricare din pinii digitali de la 2 la 13. Puneți minusul (-) LED-ului, picioul mai scurt al acestuia la GND, printr-un rezistor și plusul (+) LED-ului la pinul dorit. Folosiți un rezistor de 220 sau 270 ohmi. Pentru leduri albastre, verzi sau albe, și un rezistor de 100 ohmi este bun, însă pentru ledurile roșii, galbene sau portocalii, care merg la tensiune mai mică, folosiți un rezistor cu valoarea în jur de 220 de ohmi, după cum aveți la dispoziție.
Modificați în codul programului, numărul 13, cu numărul pinul ales, de exemplu 7,  peste tot unde acesta apare. Dacă aveți LED-uri la 5V sau la 12V nu mai este necesar să conectați rezistorul respectiv.




Varierea intensității luminoase a unui LED

Următorul program este acela de a modifica intensitatea luminoasă a unui LED. Aceasta o vom face prin varierea tensiunii pe pinul la care vom conecta LED-ul. Astfel, mai întâi vom crește tensiunea de la 0V la 5V, apoi o vom scădea de la 5V înapoi la 0V și acest proces se va repeta atât timp cât lăsăm plăcuța alimentată și nu modificăm programul încărcat pe ea.
Am amintit mai sus de pinii digitali de tip PWM ai plăcuței Arduino. Pentru programul acesta vom folosi un pin dintre aceștia. Eu, de exemplu voi folosi pinul 10 pentru programul care urmează.
Conectăm plusul LED-ului la pinul 10, apoi printr-o rezistență de 220 ohmi cuplăm minusul LED-ului la GND-ul plăcuței Arduino.

Pentru realizarea programului, instrucțiunea principala este analogWrite(pin, valoare), unde în loc de pin scriem numărul unuia din pinii PWM (3, 5, 6, 9, 10 sau 11) - pentru exemplul nostru folosim pinul 10. Pentru valoare putem da orice număr întreg între 0 și 255, valoarea 0 reprezentând 0V, iar 255 reprezentând 5V. Numerele întregi cuprinse între 1 și 254, vor atribui un nivel de tensiune proporțional. De exemplu, pentru 1V vom da valoarea 51, pentru 2,5V vom da valoarea 128, iar pentru  4V avem valoarea 204. Noi vom lua toate valorile între 0 și 255, iar aceasta o vom face cu o structură repetitivă de tip for. Mai întâi luăm valorile crescător de la 0 la 255, apoi descrescător de la 255 la 0.

Programul folosit este următorul:

// varierea intensitatii luminoase a unui LED

void setup() {
pinMode(10, OUTPUT);  // declaram pinul 10 ca iesire
digitalWrite(10, LOW);  // punem pinul in starea LOW - la 0V (zero volti)
}

int i;  // declaram o variabila de tip numar intreg

void loop() {
  // cresterea tensiunii de la 0V la 5V
for(i=0; i<255; i++){
  analogWrite(10, i);  // setam pe pinul 10, nuvelul '"i" de tensiune
  delay(20);   // asteptam 20 ms (mili secunde) pana dam urmatoarea valoare 
  }

  // scaderea tensiunii de la 5V la 0V
for(i=255; i>0; i--){
  analogWrite(10, i);
  delay(20);
  }
}

În program am folosit un timp de asteptare (delay) de 20 ms, înainte de a crește sau descrește cu o unitate nivelul de tensiune. În aproximativ 5s (secunde), intensitatea va ajunge de la 0 la 255, apoi în alte 5s va scădea înapoi la 0. Dacă vă doriți ca aceasta să se facă mai încet, măriți delay-ul, de exemplu la 50, sau dacă vreți ca varierea luminozității să se facă mai rapid, scădeți delay-ul la 10. Acum, modificați codul după bunul plac!



Folosirea ferestrei Serial Monitor


Un ultim program pe care vreau să vi-l prezint în această postare, este acela de a afișa mesaje în fereastra Serial Monitor a programului Arduino IDE.
Acest lucru este foarte util, dacă trebuie să cunoașteți rezultatele anumitor operații sau valorile citite de la diferiți senzori, cuplați la plăcuța Arduino.

Pentru realizarea programului, mai întâi trebuie să inițializăm comunicarea serială, în funcția Setup. Aceasta se face cu instrucțiunea Serial.begin(9600), unde 9600 reprezintă "baud rate-ul" - sau viteza de modulare a simbolurilor. Programul Arduino poate lucra la diferite valori ale baud rate-ului, însă cea mai folosită este aceasta de 9600.
Apoi, în funcția loop, vom afișa diverse mesaje cu comenzile Serial.print("mesaj"); sau Serial.println("mesaj");, dacă ne dorim să trecem pe rândul următor, după afișarea mesajului.
Pentru a lăsa un rând liber sau mai multe între diverse mesaje, vom folosi instrucțiunea: Serial.print("");

Folosim următorul program pentru a scoate în evidență ceea ce am spus puțin mai sus.

// folosirea ferestrei Serial Monitor

void setup() {
  Serial.begin(9600);  // initializam comunicarea seriala 
  Serial.println("TEST SERIAL MONITOR");  // afisam un mesaj de inceput
  Serial.println("");     // lasam un rand liber
}

void loop() {
  // mesajele urmatoare vor fi afisate in mod repetat
  Serial.print("Numele meu este: ");  // afisam mesajul fara a trece pe randul urmator
  Serial.println("Buica Corneliu");   // inlocuiti cu numele vostru
  delay(5000);   // asteptam 5 secunde
  Serial.println("Acesta este un program Arduino!");  // se afiseaza mesajul 
  delay(2000);   // asteptam alte 2 secunde
  Serial.println("Acesta este un mesaj afisat pe Serial Monitor!");
  Serial.println(""); 
  Serial.println("");  // lasam 2 randuri liber
  delay(3000);
}

După ce încărcăm codul pe plăcuța Arduino deschidem fereastra Serial Monitor și vom vedea următoarele mesaje, ca în imaginea de mai jos:



Mesajul din funcția setup se afișează o singură dată, apoi cele 3 mesaje din funcția loop se vor repeta la intervalele de timp stabilite în program, prin instrucțiunile de așteptare - delay().
Dacă apăsați butonul de reset al plăcuței, programul o va lua de la început, veți vedea mesajul inițial, apoi celelalte 3 mesaje repetându-se.
Acum, modificați programul, introduceți și alte mesaje, modificați timpul de așteptare dintre ele, încercați mai multe combinații.


Pentru încă un tutorial Arduino, în care sunt prezentate alte 3 programe de început, consultați următoarea postare, o continuare a acesteia:
Realizarea programelor Arduino - partea 2

Succes!

Notă: Programele realizate pentru o plăcuță Arduino UNO, pot fi încărcate și rulate și pe un Arduino Nano, cu procesor ATmega328. Configurația pinilor este aceeași, trebuie doar să setați în meniul Tools, la Board și la Port, tipul corespunzător.

duminică, 12 februarie 2017

Elemente de geometrie analitică



În această postare veți afla cum se calculează elementele de bază din geometrie, prim metode algebrice și anume: vectorul de poziție, expresia analitică a unui vector, lungimea unui segment, perimetrul și aria unui triunghi, cosinusul unghiului dintre 2 drepte, ecuația dreptei, ecuația planului și volumul tetraedrului.

Toate aceste elemente enumerate mai sus se vor calcula cunoscând coordonatele a 3 puncte în spațiul tridimensional al axelor de coordonate:
A(xA, yA, zA), B(xB, yB, zB), C(xC, yC, zC).

Avem, de asemenea, punctul de origine al axelor: O(x0, y0, z0), cu x0=0, y0=0, z0=0 și versorii:

pe care îi vom utiliza sub următoarea formă: 

Pentru a nu îngreuna foarte mult scrierea, vom renunța la folosirea indicilor corespunzători și astfel, avem:
xA=xA, yA=yA, zA=zA, 
xB=xB, yB=yB, zB=zB, 
xC=xC, yC=yC, zC=zC.

De asemenea vectorii care apar în formule și exemple îi vom reprezenta sub forma următoare:

Mai precizez reprezentarea operatorilor aritmetici folosiți în ceea ce urmează:

  • * reprezintă înmulțirea 
  • / reprezintă fracție sau împărțirea 
  • ^ reprezintă ridicarea la putere
  • sqrt(x) reprezintă radicalul numărului x
  • | x | reprezintă modulul numărului x
  • <u,v> reprezintă produsul scalar al vectorilor u și v
  • u X v  reprezintă produsul vectorial dintre vectorii u și v 

Pentru exemplele de calcul numeric voi folosi următoarele puncte: A(-1, 2, 1), B(2, 1, -1) și C(1, -1, 2), iar originea axelor este O(0, 0, 0).




Vectorul de poziție al unui punct


Fie A(xA, yA, zA) un punct situat în sputiul axelor Oxyz. Vectorul de poziție reprezintă segmentul orientat OA, unde O reprezintă punctul de origine al axelor de coordonate.
Astfel, avem: 

OA’ = (xA-xO)*i + (yA-yO)*j + (zC-zO)*k = xA*i + yA*j + zA*k
OB’ =  xB*i + yB*j + zB*k
OC’ =  xC*i + yC*j + zC*k

Exemplu:

OA’ =  -1*i + 2*j + 1*k = -i + 2j + k
OB’ =  2*i + 1*j + (-1)*k = 2i + j - k
OC’ =  1*i + (-1)*j + 2*k = i - j + 2k



Expresia analitică a unui vector


Pentru punctele A(xA, yA, zA), B(xB, yB, zB), C(xC, yC, zC), vectorii corespunzători se exprimă în felul următor:

AB’ = (xB-xA)*i + (yB-yA)*j + (zB-zA)*k

AC’ = (xC-xA)*i + (yC-yA)*j + (zC-zA)*k

BC’ = (xC-xB)*i + (yC-yB)*j + (zC-zB)*k

Exemplu:


AB’ = (2-(-1))*i + (1-2)*j + (-1-1)*k = 3i-j-2k

AC’ = (1-(-1))*i + (-1-2)*j + (2-1)*k = 2i-3j+k

BC’ = (1-2)*i + (-1-1)*j + (2-(-1))*k = -i-2j+3k


Fie vectorul MN. Opusul vectorului MN este NM = -MN și este un vector de același modul, aceeași direcție, dar sens opus.
Astfel avem:

BA’ = -AB’ ,  BA’ = -3i+j+2k

CA’ = -AC’ ,  CA’ = -2i+3j-k

CB’ = -BC’ ,  CB’ = i+2j-3k



Lungimea vectorului sau lungimea segmentului.


Aceasta reprezintă de fapt distanța dintre 2 puncte situate în spațiul axelor. Altfel spus, cât de apropiat sau depărtat este un punct față de celălalt. Se calculează după formula de mai jos, exprimată pentru cele 3 cazuri: distanța dintre A și B, distanța dintre A și C, respectiv distanța dintre B și C.

AB = sqrt( (xB-xA) ^2 + (yB-yA) ^2 + (zB-zA) ^2 )

AC = sqrt( (xC-xA) ^2 + (yC-yA) ^2 + (zC-zA) ^2 )

BC = sqrt( (xC-xB) ^2 + (yC-yB) ^2 + (zC-zB) ^2 )

Exemplu:

AB = sqrt(3^2 + (-1)^2 + (-2)^2) = sqrt(9+1+4) = sqrt(14)

AC = sqrt(2^2 + (-3)^2 + 1^2) = sqrt(4+9+1) = sqrt(14)

BC = sqrt((-1)^2 + (-2)^2 + 3^2) = sqrt(1+4+9) = sqrt(14)




Perimetrul și aria triungiului ABC


Pentru calcularea perimetrului triunghiului, lucrurile sunt foarte simple. Întrucât perimetrul reprezintă lungimea conturului unei figuri geometrice, pentru un triunghi trebuie doar să facem suma celor 3 laturi ale acestuia. Astfel:

PABC = AB + AC + BC ,  unde AB, AC și BC reprezintă lungimile laturilor triunghiului ABC.

Exemplu:

Pentru lungimile laturilor triunghiului ABC, care au fost calculate mai sus, se obține:

PABC = sqrt(14) + sqrt(14) + sqrt(14) = 3*sqrt(14)


În ceea ce privește aria triunghiului ABC, calculul este mai greu de efectuat decât în cazul perimetrului. Aria reprezintă jumătate din norma produsului vectorial al vectorilor OA' și OB' și trebuie să folosim produsul vectorial.
Formula este următoarea:

AABC = ½ * || OA’  X  OB’ ||

În această formulă au fost introduse 2 noțiuni noi:
- norma unui vector, numită și modulul vectorului, care reprezintă de fapt lungimea vectorului;
- produsul vectorial dintre 2 vectori, ce se calculează cu formula de mai jos, un determinant, care are pe prima linie versorii axelor -  i, j și k, pe a doua linie coeficienții primului vector, iar pe a treia linie coeficienții celuilalt vector. Rezultatul produsului vectorial este tot un vector.

Exemplu:
= i*2*(-1) + j*1*2 + k*(-1)*1 - 2*2*k - 1*1*i - (-1)*(-1)*j = -2i + 2j - k - 4k - i - j = -3i + j - 5k

Deci, OA' X OB' = -3i + j - 5k . 
Rezultă că || OA' X OB' || = sqrt( (-3)^2 + 1^2 + (-5)^2 ) = sqrt( 9 + 1 + 25 ) = sqrt( 35 )
Așadar: AABC = 1/2 * || OA’  X  OB’ || = 1/2 * sqrt(35) = sqrt(35) / 2

 


Cosinusul unghiului dintre 2 vectori


Pentru a afla unghiul format de 2 vectori, este suficient să calculăm cosinusul unghiului dintre aceștia cu formulele de mai jos: 

cos A = <BA’ , AC’>/ (||BA’|| * ||AC’||)
cos B = <AB’ , BC’>/ (||AB’|| * ||BC’||)
cos C = <AC’ , CB’>/ (||AC’|| * ||CB’||)

Apare din nou norma vectorilor în formule, însă aceasta reprezintă, așa cum am mai precizat, lungimea vectorului. Mai sus, am calculat deja lungimile pentru vectori AB' , AC' și BC'.

||AB’|| = ||BA’|| = AB
||AC’|| = ||CA’|| = AC
||BC’|| = ||CB’|| = BC

De asemenea, apare un element nou, produsul scalar a 2 vectoriAcesta se calculează în felul următor: se înmulțesc coeficienții corespunzători versorilor, i, j și k, de la primul vector cu cei de la al doilea vector și apoi se însumează rezultatele.

Fie vectorii: u' = a1*i + b1*j + c1*k  și  v' = a2*i + b2*j + c2*k,  unde i, j și k sunt versorii axelor.
< u' , v'> a1*i + b1*j + c1*k  ,   a2*i + b2*j + c2*k> = a1*a2 + b1*b2 + c1*c2

Exemplu:  Pentru vectorii u' = 2i + 5j - 2k ,  v' = -i + 3j + 7k, avem produsul vectorial:
  <u' , v'> = < 2i+5j-2k , -i+3j+7k > = 2*(-1) + 5*3 + (-2)*7 = -2 + 15 - 14 = -1

Exemplu:

<BA’ , AC’> = < -3i+j+2k, 2i-3j+k > = -3*2 + 1*(-3) + 2*1 = -6 – 3 + 2 = - 7

<AB’ , BC’> = < 3i-j-2k , -i-2j+3k > = 3*(-1) + (-1)+(-2) + (-2)*3 = -3 + 2 – 6 = - 7

<AC’ , CB’> = < 2i-3j+k, i+2j-3k > = 2*1 + (-3)*2 + 1*(-3) = 2 – 6 – 3 = -7

||AB’|| = ||BA’|| = sqrt(14)
||AC’|| = ||CA’|| = sqrt(14)
||BC’|| = ||CB’|| = sqrt(14)

Astfel:
cos A = <BA’ , AC’>/ (||BA’||*||AC’||) = -7/( sqrt(14) * sqrt(14) ) = -7/14 = -1/2

cos B = <AB’ , BC’>/ (||AB’||*||BC’||) = -7/( sqrt(14) * sqrt(14) ) = -7/14 = -1/2

cos C = <AC’ , CB’>/ (||AC’||*||CB’||) = -7/( sqrt(14) * sqrt(14) ) = -7/14 = -1/2 , 

unde sqrt(14) * sqrt(14) = 14 (Radicalul ridicat la puterea a 2-a dispare).



Volumul tetraedrului format de cele 3 puncte (A, B, C) și originea O a sistemului de coordonate


Pentru calcularea volumului tetraedrului vom folosi următoarea formulă:

VOABC = 1/6 *| (OA’, OB’, OC’) | = 1/6 * | < OA’, OB’ X OC’ > | , unde (OA’, OB’, OC’) = <OA’, OB’ X OC’> reprezintă produsul mixt al vectorilor de poziție corespunzători punctelor A, B, C. 

Produsul mixt a 3 vectori este egal cu produsul scalar dintre primul vector și vectorul rezultat din efectuarea produsului vectorial ai celorlalți 2 vectori.

Exemplu:

Avem vectorii OA’ = -i + 2j + k,   OB’ = 2i + j – k,   OC’ = i – j + 2k, calculați mai sus și ne dorim să aflăm volumul tetraedrului VOABC.
Mai întâi calculăm produsul vectorial dintre OB' și OC' .

Acum, calculăm produsul scalar astfel:
< -i+2j+k,  i-5j-3k > = -1*1 + 2*(-5) + 1*(-3) = -1 - 10 - 3 = -14
Deci volumul este: VOABC = 1/6 * | < OA’, OB’ X OC’ > | = 1/6 * | -14 | = 1/6 * 14 = 14/6 = 7/3


Ecuația dreptei determinată de 2 puncte (a dreptelor AB, AC, BC)


Avem punctele de coordonate, A(xA, yA, zA), B(xB, yB, zB), C(xC, yC, zC) utilizate și mai sus.
Ecuațiile dreptelor corespunzătoare sunt descrise de formulele de mai jos, unde "/ " reprezintă fracție.

(AB): (x-xA)/(xB-xA) = (y-yA)/(yB-yA) = (z-zA)/(zB-zA)
(AC): (x-xA)/(xC-xA) = (y-yA)/(yC-yA) = (z-zA)/(zC-zA)
(BC): (x-xB)/(xC-xB) = (y-yB)/(yC-yB) = (z-zB)/(zC-zB)

Exemplu:

Pentru aceleași puncte folosite și în exemplele de mai sus , A(-1, 2, 1), B(2, 1, -1) și C(1, -1, 2), avem:

(AB): (x-(-1))/(2-(-1)) = (y-2)/(1-2) = (z-1)/(-1-1)
(AB): (x+1)/3 = (y-2)/(-1) = (z-1)/(-2)

(AC): (x-(-1))/(1-(-1)) = (y-2)/(-1-2) = (z-1)/(2-1)
(AC): (x+1)/2 = (y-2)/(-3) = (z-1)/1

(BC): (x-2)/(1-2) = (y-1)/(-1-1) = (z-(-1))/(2-(-1))
(BC): (x-2)/(-1) = (y-1)/(-2) = (z+1)/3

Observație: în cazul în care numitorul fracției dă valoarea 0 (zero), fracția respectivă nu se mai scrie în egalitate, rămân celelalte 2 fracții. Pentru aceasta luăm dedesubt o altă ecuație în care egalăm numărătorul cu 0.

Exemplu: Pentru ecuația (x-2)/(2-2) = (y-1)/(-2-1) = (z-(-1))/(1-(-1)),  avem 2-2 = 0 și rezultă x-2 = 0 ,  x = 2. Deci ecuația devine:
(y-1)/(-3) = (z+1)/2
x = 2



Ecuația planului determinat de 3 punte (planul ABC)


Formula de calcul este următoarea:


Exemplu:

Pentru punctele A, B și C considerate și în exemplele de mai sus, avem următoarea ecuație a planului : 


(ABC):  (x+1)*(-1)*1 + (y-2)*(-2)*2 + 3*(-3)*(z-1) - 2*(-1)*(z-1) - (-3)*(-2)*(x+1) - 3*(y-2)*1 = 0
(ABC):  -x -1 - 4y + 8 - 9z + 9 + 2z -2 - 6x -6 - 3y + 6 = 0
Deci, ecuația planului este:   (ABC): -7x -7y -7z + 14 = 0


Pentru a completa aceste definiții și exemple ale elementelor de bază din geometria analitică, vă propun să urmăriți și această postare mai veche despre distanța de la un punct la un plan: