Giroscop MPU-6050 + Processing

Giroscoapele ne ajuta de determinam orientarea unui corp solid in spatiu. In tutorialul de astazi ne vom axa pe citirea inclinarii corpului solid  pe urmatoarele axe: ruliu, giratie, tangaj.

Vom afisa interactiv folosind un Arduino Nano si un giroscop MPU-6050 orientarea in spatiu al ansamblului din figura de mai jos:

Image

 

Cablarea este urmatoarea:

– in caz ca nu se vede INT de la MPU se leaga la pinul digital 2 de pe Nano. Daca folositi alta placa aveti grija sa determinati care pin corespunde intreruperii #0. Arduino Nano are pinul 2 care corespunde intreruperii #0(zero).

wiring

Pasi pentru proiect:

1. Se descarca libraria, codul arduino si codul processing de AICI

2. Se pune libraria in C:\Program Files (x86)\Arduino\libraries. In caz ca ati instalat in alta cale, cautati folderul de librarii.

3. Se instaleaza Processing 2 de AICI

In codul arduino am mai definit niste linii de cod ca atunci cand giratia este de 93 grade sa aprinda un led. Astfel sa stiu ca am “lock” pe giratie si avionul/racheta/vaporul are orientare in directia dorita.

 

Rezultat video:

AICI

Advertisements

GPS Ublox Neo-6M cu Arduino Uno

Pe piata, desi au acelasi nume, aceste GPS-uri pot varia ca specificatii. Asadar, fiti atenti la specificatii sa nu aveti surprize. Veti gasi variante care functioneaza la 3V si altele, ca cel pe care il voi prezenta, care functioneaza la tensiuni cu plaja 3-5V.

Modulul GPS este unul foarte usor de cablat, avand numai 4 pini: Rx, Tx, Vcc, GND. Daca sunteti in casa puneti-l langa un geam, pentru a putea citi streamurile de date NMEA. Eu nu am reusit sa-l fac sa prinda semnalul din casa. In momentul cand citeste streamurile un led verde functioneaa intermitent.

Caracteristici:

  • Alimentare:  3V-5V
  • Model: GY – GPS6MV2
  • Modul cu antena de ceramică, semnal puternic
  • EEPROM salveaza datele parametrilor de configurare, atunci când alimentarea e oprita
  • Are baterie pentru backup de date
  • Ledul de semnal care se aprinde intermitent
  • Rata baud implicită: 9600 baud
  • Compatibilă cu diverse module de control de zbor
  • Dimensiunea modulului 25 mm x35 mm/0.98” x1.37” (inch) (aprox)
  • Dimensiunea antenei: 25x 25 mm/0.98” x0.98”

Astfel, avem 2 cazuri de GPS, avand acelasi nume, dar specificatii diferite:

1) la varianta cu 3V va trebui la montaj sa folositi divizorul de tensiune astfel incat sa nu ardeti modulul. Cablarea exact ca in imaginea de mai jos.

uno_neo6mv2

 

2. La varianta cu plaja intre 3-5 V cablarea este fara niciun rezistor, astfel:

Vcc GPS – 5V pe placa

GND GPS – GND pe placa

Rx GPS – Tx pe placa (pin 3 pe placa)

Tx GPS – Rx pe placa (pin 4 pe placa)

Am pus si niste imagini orientative.

ImageImage

 

Descarcati biblioteca tinyGPS sau tinyGPS++.

Codul aici.

Rezultatele se gasesc in acelasi folder unde este si codul pentru share.

1

 

Masurarea temperaturii si umiditatii cu DHT11

In primul rand trebuie spus ca pe piata veti gasi o gama larga de senzori DHT11. De la senzor cu 4 picioruse in care trebuie sa puneti niste rezistente pe un breadboard, pana la senzor cu 3 pini, lipit pe o placuta cu rezistentele necesare. In acest tutorial vom folosi unul cu toate lipiturile deja facute.

Asadar inainte de a incepe aveti grija la pinii senzorului: + GND si S(sau data).

Specificatii:

  • Model: senzor DHT11
  • Gama de transmitere a semnalului: 20m
  • Domeniu de măsurare umiditate: 20 – 95% RH
  • Eroare de măsurare umiditate: + / -5%
  • Interval de măsurare a temperaturii: 0 – 50 ° C
  • Eroare de măsurare a temperaturii: + / -2 ° C
  • Tensiunea de operare: 3.3 – 5V
  • Tipul de ieșire:  ieșire digitală
  • Dimensiunea plăci mici PCB: 3.2 x 1.4cm
  • Greutate neta: 8g

Dupa ce l-am cablat si programat, termometrul de camera arata 21 C, iar senzorul arata pe seriala 23 C.  Deci este in regula, respecta specificatiile.

Daca nu il folositi in aplicatii unde masurarea temperaturii trebuie sa fie cat mai exacta, il recomand, caci este foarte usor de folosit si cablat. O varianta mai buna este DHT22.

Image

Image

 

Cod:

//Celsius to Fahrenheit conversion
double Fahrenheit(double celsius)
{
return 1.8 * celsius + 32;
}

// fast integer version with rounding
//int Celcius2Fahrenheit(int celcius)
//{
// return (celsius * 18 + 5)/10 + 32;
//}

//Celsius to Kelvin conversion
double Kelvin(double celsius)
{
return celsius + 273.15;
}

// dewPoint function NOAA
// reference: http://wahiduddin.net/calc/density_algorithms.htm
double dewPoint(double celsius, double humidity)
{
double RATIO = 373.15 / (273.15 + celsius); // RATIO was originally named A0, possibly confusing in Arduino context
double SUM = -7.90298 * (RATIO – 1);
SUM += 5.02808 * log10(RATIO);
SUM += -1.3816e-7 * (pow(10, (11.344 * (1 – 1/RATIO ))) – 1) ;
SUM += 8.1328e-3 * (pow(10, (-3.49149 * (RATIO – 1))) – 1) ;
SUM += log10(1013.246);
double VP = pow(10, SUM – 3) * humidity;
double T = log(VP/0.61078); // temp var
return (241.88 * T) / (17.558 – T);
}

// delta max = 0.6544 wrt dewPoint()
// 5x faster than dewPoint()
// reference: http://en.wikipedia.org/wiki/Dew_point
double dewPointFast(double celsius, double humidity)
{
double a = 17.271;
double b = 237.7;
double temp = (a * celsius) / (b + celsius) + log(humidity/100);
double Td = (b * temp) / (a – temp);
return Td;
}

#include <dht11.h>
dht11 DHT11;
#define DHT11PIN 2

void setup()
{
Serial.begin(9600);
Serial.println(“DHT11 TEST PROGRAM “);
Serial.print(“LIBRARY VERSION: “);
Serial.println(DHT11LIB_VERSION);
Serial.println();
}

void loop()
{
int chk = DHT11.read(DHT11PIN);
switch (chk)
{
case DHTLIB_OK:
//Serial.println(“OK”);
break;
case DHTLIB_ERROR_CHECKSUM:
Serial.println(“Eroare de Checksum”);
break;
case DHTLIB_ERROR_TIMEOUT:
Serial.println(“Eroare de Time out”);
break;
default:
Serial.println(“Eroare necunoscuta”);
break;
}

Serial.print(“Umiditate (%): “);
Serial.print((int)DHT11.humidity); //Serial.print((float)DHT11.humidity, 2);
Serial.write(” “);
Serial.print(“Temperatura (oC): “);
Serial.println((int)DHT11.temperature); //Serial.println((float)DHT11.temperature, 2); //cu zecimle
//Serial.write(” “);
//Serial.print(“Temperatura (oF): “);
//Serial.println(Fahrenheit(DHT11.temperature), 2);
/*
Serial.print(“Temperatura (K): “);
Serial.println(Kelvin(DHT11.temperature), 2);

Serial.print(“Dew Point (oC): “);
Serial.println(dewPoint(DHT11.temperature, DHT11.humidity));

Serial.print(“Dew PointFast (oC): “);
Serial.println(dewPointFast(DHT11.temperature, DHT11.humidity));
*/
delay(1000);
}

Libraria si codul sursa pe care le-am folosit:  aici.

Tutorial avansat: aici. -> este in engleza, pentru eventuale informatii folositi formularul de contact de pe magazinul online ArduHobby.

 

Detector EMF cu Arduino Leonardo

Utilizand un LED monocrom, un Arduino Leonardo, rezistente si fire vom detecta campuri electromagnetice.

Pe scurt, teoria ne spune ca  o variatie a campului electromagnetic ne va induce un potential in antena ce va fi citit de placa Arduino.

          De ce avem nevoie:

  • placa Arduino Leonardo/sau Uno
  • o rezistenta de 3.3MOhmi sau chiar de 10MOhmi pentru o senzitivitate crescuta
  • un LED monocrom brick/sau LED normal
  • fire tata-tata

 

          Cum arata schema electrica: 

FI5OSLTG0RSH1X2.MEDIUM

Ca sa nu ne mai complicam cu breadboard, atunci legam rezistorul de ordinul MOhmilor direct la antena si apoi la masa/GND. Astfel ne putem plimba mai usor cu el prin casa.

 

           Codul Arduino: 

#define sample 300 //cate esantioane pe o citire

int inPin = 5; //analog 5
float val;
int pinled = 13;

int array1[sample]; //cream un array sa facem apoi medie artimetica de citiri

unsigned long averaging; //suma
void setup() {

Serial.begin(9600);

}

void loop() {

for(int i = 0; i < sample; i++){ //umplem arrayul cu esantioane de citire
array1[i] = analogRead(inPin); //ce potential citim pe pinul analog de la antena
averaging += array1[i];
}

val = averaging / sample; //medie aritmetica
Serial.println(val);
val = constrain(val, 0, 100); //constrangere sa fie intre 0 si 100
val = map(val, 0, 100, 0, 255); //mapam valori intre 0-100 cu cele intre 0-255
analogWrite(pinled, val); //aprindem ledul mai tare sau mai incet

averaging = 0; //resetam la 0
//delay(100); //nu o mai folosim
}

Din pacate eu nu am avut rezistenta de ordinul MOhmilor, astfel senzitivitatea mea era mica.

          Cam asa arata schema mea electrica, pozata: 

IMG_0362[1]

Eu l-am testat langa obiecte cu campuri electromagnetice puternice, ca lustra cu bec si transformator de la 220 AC la 9V DC.

Rezultat video se gaseste aici.

RGB LED cu Arduino Leonardo

Utilizand leduri RGB si combinand cele 3 culori, putem obtine orice culoare dorim. Marele avantaj al ledurilor, monocrome sau RGB este ca ne semnalizeaza pentru proiecte mai complexe, in ce stare se afla programul nostru, fie ca le aprindem sau stingem, fie ca le coloram intr-un anumit mod pe care il intelegem.

Asadar, sa va dau 3 exemple:

1. Avem un program arduino care prin intermediul unui senzor de temperatura ne citeste temperatura din casa. Daca este prea mica coloreaza in rosu, daca este acceptabila coloreaza in galben, daca este ok coloreaza verde, samd.

2. Avem un server definit pe o placa arduino cu un shield ethernet. De fiecare data cand un client face un GET la server sa “beculeasca”  de 2 ori (multumesc unei colege ca m-a invatat termenul).

3. Daca avem un robotel care se calibreaza (un line follower spre exemplu) vrem ca in momentul calibrarii sa “beculeasca” un LED. Sau daca avem un robot obstacle avoidance pe parcursul intoarcerii ca sa evite obstacolul sa ne aprinda un led.

Asadar LED-urile sunt folosite in folosul nostru pentru control de sanitate, sau chiar debugging.

Vom utiliza pentru acest tutorial un LED RGB cu Anod comun legat la PIN 7, pe placuta Leonardo.

Schema electrica arata in felul urmator.  Practic LEDul RGB contine 3 leduri monocrome, iar noi alegem sa aplicam diverse tensiuni pe fiecare LED/dioda.

Cablare: 

Red – PIN 9

Green – PIN 10

Blue – PIN 11

Anodul comun – PIN 7

Eu am folosit rezistente de 220 Ohmi, fata de cele din figura.

image

Sa vedem acum codul sursa. Vom obtine un set predefinit de culori trimitand prin seriala un anumit string. Arduino il va interpreta si va pune tensiunile pe fiecare dioda asa cum dorim noi.

Codul Arduino

int redPin = 9;
int greenPin = 10;
int bluePin = 11;
int startLEDpin = 7;
String color = “”;
String tmp = “”; 

void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
pinMode(bluePin, OUTPUT); 
pinMode(startLEDpin,OUTPUT);
Serial.begin(9600);
}

void setColor(int red, int green, int blue)
{
analogWrite(redPin, red);
analogWrite(greenPin, green);
analogWrite(bluePin, blue); 
}

void loop()

if (Serial.available() > 0) {
/* read the most recent byte */
while(Serial.available() > 0) {
color+=char(Serial.read());
}
}

if (color == “red”) {
setColor(0, 255, 255); // red
delay(1000);
color=””;
Serial.write(“Red branch \n”);
digitalWrite(9, LOW);
}
else if (color == “start”) { 
digitalWrite(7, HIGH);
}
else if (color == “stop”) { 
digitalWrite(7, LOW);
}
else if (color == “green”) {
setColor(255, 0, 255); // green
delay(1000);
color=””;
Serial.write(“Green branch \n”);
digitalWrite(10, LOW);
}
else if (color == “blue”) {
setColor(255, 255, 0); // blue
delay(1000);
color=””;
Serial.write(“Blue branch \n”);
digitalWrite(11, LOW);
}
else if (color == “yellow”) {
setColor(0, 0, 255); // yellow
delay(1000);
color=””;
Serial.write(“Yellow branch \n”);
digitalWrite(10, LOW);
digitalWrite(9, LOW);

}
else if (color == “purple”) {
setColor(0, 80, 0); // purple
delay(1000);
color=””;
Serial.write(“Purple branch \n”);
digitalWrite(9, LOW);
digitalWrite(11, LOW);
}
else if (color == “pink”) {
setColor(0, 255, 128); // pink
delay(1000);
color=””;
Serial.write(“Pink branch \n”);
digitalWrite(9, LOW);
}
else if (color == “brown”) {
setColor(40, 150, 225); // pink
delay(1000);
color=””;
Serial.write(“Brown branch \n”);
}
else if (color == “aqua”) {
setColor(255, 0, 0); // aqua
delay(1000);
color=””;
Serial.write(“Aqua branch \n”);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
else {
//Serial.write(“Else branch:”); Serial.println(color);
color=””;
delay(1000);
}
}

Rezultat video aici.

LED monocrom cu Arduino Leonardo

Prima lecție de pe blog va fi despre LED-uri monocrome.

Aici este un exemplu de schema electrica: LED

Arduino Uno R3 are protecție pe PIN-ul 13 cu o rezistenta, asadar nu este niciun pericol sa ardeti ledul.

Vom folosi pentru acest tutorial un Arduino Leonardo (orice board poate fi folosit pentru acest tutorial simplu) si un LED rosu ca acesta.

Vom conecta LED-ul la PIN-ul 13 anodul si la GND catodul.

Codul arduino

int ledpin=13; // daca vreodata modificam codul sa ne fie mult mai usor

void setup() { //rutina se executa o singura data

pinMode(ledpin, OUTPUT); //pe acest PIN vom aplica o tensiune de 5V

}

void loop() { //se executa la infinit

digitalWrite(ledpin, HIGH); //intre PIN 13 si GND vom avea o tensiune de 5V

delay(1000); //asteptam 1 secunda

digitalWrite(ledpin, LOW); //punem tensiune de 0V intre PIN 13 si GND

delay(1000);
}

Rezultat

LED-ul se va aprinde pentru 1 secunda si va sta stins pentru o secunda. Se repeta aceasta in bucla infinita.

image

Posibile probleme pentru care nu se aprinde LEDul:

1. LED-ul nu se aprinde deoarece anodul si catodul nu sunt conectate corect.

2. LED-ul nu se aprinde din cauza unui fir defect, sau ambelor. Pentru a preintampina aceasta infigeti direct LED-ul pe placa fara fire aditionale.

3. Cablarea fizica nu corespunde codului sursa (sarma sa fie conectata la PIN 12 si codul sa genereze tensiunea de lucru pe PIN 13)

4. LED-ul este nefunctional. Testarea se face punand anodul la 5V si catodul la GND. Atentie ! Puneti si o rezistenta de ordinul KOhmi sa nu ardeti LEDul.

5. Placa Arduino nu genereaza pe PINul de interes tensiunea de 5V. Puteti verifica cu un multimetru acest lucru.