vineri, 24 august 2018

Mini proiectul de vineri (8) - Evitarea de obstacole folosind senzorul FC-51 IR infrarosu

Descriere proiect: Evitarea de obstacole folosind senzorul FC-51 IR infraroșu
Senzorul IR FC-51 este capabil să distingă obiecte obstacol la o distanta de minim 2 cm si maxim 30 cm, deci este perfect pentru roboti. Dacă de exemplu acest robot ar trebui să ajungă din punctul A in punctul B, pentru orientarea la distante foarte mici pentru evitarea obiectelor de pana la 30 cm, atunci acest senzor seteaza semnalul obiect detectat si aprinde LED-ul (vezi imaginea de mai jos). Este foarte ușor de folosit, pentru ca are nevoie doar de VCC (+5v), GND si un port digital de la Arduino. Mai mult pentru o finețe și mai bună această placă are încorporat un potentiometru care poate regla distanta maxim la care se seteaza semnalul.
In imaginea de mai jos se observa emițătorul IR activ. Această fotografie a fost realizată cu telefonul mobil a cărei cameră nu dispune de filtru infrared, din această cauză se observa o lumina slaba violeta. In mod normal ochiul uman nu distinge nimic din spectrul infraroșu, dar cu ajutorul camerei de luat vederi se pot vizualiza pulsurile infraroșii.


Documentație proiect:
senzorul IR FC-51

Componente:
Senzor infrarosu IR FC-51:
-Operation Voltage - 3.3V - 5V
-Detection Angle -35 degrees
-Active Output level - Outputs Low logic level when obstacle is detected
-Detection range: 2cm – 30cm (Adjustable using potentiometer)
-Atmega2560-Mega2560-Board


Schema electronica/sistem:
- VCC - 3.3V-5V DC power input
- GND -0V Power pin
- OUT - Digital Output Pin


Cod de test pentru semnalizarea obstacolului:
int irSenRead =8;
int isObstacle = HIGH;
int LED=6;

void setup() {

  pinMode(irSenRead ,INPUT);
  pinMode(LED ,OUTPUT);
  Serial.begin(9600);
}

void loop() {

  isObstacle = digitalRead(irSenRead); // // Read IR sensor output
   Serial.println(digitalRead(irSenRead)); // // print the output

  // // isObstacle ==low there is obstacle infront of sensor
  // // using serial monitor we can see this output
  if (isObstacle == LOW) {
    Serial.println("OBSTACLE");
    digitalWrite(LED ,HIGH);
  }
  else
  {
    Serial.println("NO");
    digitalWrite(LED ,LOW);
  }

  delay(500);
}
Citirea receptorului IR folosind biblioteca IRemote:
/*
 * IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv
 * An IR detector/demodulator must be connected to the input RECV_PIN.
 * Version 0.1 July, 2009
 * Copyright 2009 Ken Shirriff
 * http://arcfn.com
 */

#include "IRremote.h"

int RECV_PIN = 8;

IRrecv irrecv(RECV_PIN);

decode_results results;

void setup()
{
  Serial.begin(9600);
  // In case the interrupt driver crashes on setup, give a clue
  // to the user what's going on.
  Serial.println("Enabling IRin");
  irrecv.enableIRIn(); // Start the receiver
  Serial.println("Enabled IRin");
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(results.value, HEX);
    irrecv.resume(); // Receive the next value
  }
  delay(100);
}
Weekend plăcut tuturor !

vineri, 17 august 2018

Mini proiectul de vineri (7) - Masurarea temperaturii si umiditatii folosind senzorul DHT11

Descriere proiect:Masurarea temperaturii si umiditatii folosind senzorul DHT11. Pentru a măsura temperatura si umiditatea cel mai simplu de folosit este senzorul DHT11. Conectarea lui este simpla si rezultatul măsurătorii este de încredere. În plus libraria idDHT11 returneaza temperatura in toate unitatile de măsura a temperaturii Celsius, Kelvin si Fahrenheit.
În imaginea de mai jos se poate observa conectarea senzorului la Atmega2560, Pin 1 DHT11 la 5V, Pin 2 DHT11 la Pinul 2 Arduino, Pin 3 DHT11 e neconectat si Pin 4 DHT11 se conecteaza la GND. Inre pinul 1 si 2 am conectat o rezistenta de 10K:
Documentatie proiect:
DHT11-Technical-Data-Sheet
How-to-set-up-the-dht11-humidity-sensor-on-an-arduino
Componente:
- Senzor de temperatura si umiditate
Schema electronica/sistem:
Afisarea umiditatii si temperaturii:

Cod de test:
/*
  Board            int.0   int.1   int.2   int.3   int.4   int.5
 Uno, Ethernet    2   3
 Mega2560   2   3   21    20    19    18
 Leonardo   3   2   0   1
 Due            (any pin, more info http://arduino.cc/en/Reference/AttachInterrupt)
 
 This example, as difference to the other, make use of the new method acquireAndWait()
 */

#include "idDHT11.h"

int idDHT11pin = 2; //Digital pin for comunications
int idDHT11intNumber = 0; //interrupt number (must be the one that use the previus defined pin (see table above)

//declaration
void dht11_wrapper(); // must be declared before the lib initialization

// Lib instantiate
idDHT11 DHT11(idDHT11pin,idDHT11intNumber,dht11_wrapper);

void setup()
{
  Serial.begin(9600);
  Serial.println("idDHT11 Example program");
  Serial.print("LIB version: ");
  Serial.println(IDDHT11LIB_VERSION);
  Serial.println("---------------");
}
// This wrapper is in charge of calling 
// mus be defined like this for the lib work
void dht11_wrapper() {
  DHT11.isrCallback();
}
void loop()
{
  Serial.print("\nRetrieving information from sensor: ");
  Serial.print("Read sensor: ");
  //delay(100);
  
  int result = DHT11.acquireAndWait();
  switch (result)
  {
  case IDDHTLIB_OK: 
    Serial.println("OK"); 
    break;
  case IDDHTLIB_ERROR_CHECKSUM: 
    Serial.println("Error\n\r\tChecksum error"); 
    break;
  case IDDHTLIB_ERROR_ISR_TIMEOUT: 
    Serial.println("Error\n\r\tISR time out error"); 
    break;
  case IDDHTLIB_ERROR_RESPONSE_TIMEOUT: 
    Serial.println("Error\n\r\tResponse time out error"); 
    break;
  case IDDHTLIB_ERROR_DATA_TIMEOUT: 
    Serial.println("Error\n\r\tData time out error"); 
    break;
  case IDDHTLIB_ERROR_ACQUIRING: 
    Serial.println("Error\n\r\tAcquiring"); 
    break;
  case IDDHTLIB_ERROR_DELTA: 
    Serial.println("Error\n\r\tDelta time to small"); 
    break;
  case IDDHTLIB_ERROR_NOTSTARTED: 
    Serial.println("Error\n\r\tNot started"); 
    break;
  default: 
    Serial.println("Unknown error"); 
    break;
  }
  Serial.print("Humidity (%): ");
  Serial.println(DHT11.getHumidity(), 2);

  Serial.print("Temperature (oC): ");
  Serial.println(DHT11.getCelsius(), 2);

  Serial.print("Temperature (oF): ");
  Serial.println(DHT11.getFahrenheit(), 2);

  Serial.print("Temperature (K): ");
  Serial.println(DHT11.getKelvin(), 2);

  Serial.print("Dew Point (oC): ");
  Serial.println(DHT11.getDewPoint());

  Serial.print("Dew Point Slow (oC): ");
  Serial.println(DHT11.getDewPointSlow());

  delay(1000);
}
Codul l-am preluat de aici .
O zi bună tuturor !

joi, 16 august 2018

Mini proiectul de vineri (6) - Masurarea distantei folosind HC-SR04

Descriere proiect: Măsurarea distanței folosind HC-SR04
Având în dotare de ceva vreme un senzor ultrasonic de 40kHz am decis să încerc să-l pun în funcțiune. După ceva documentare conștiincioasă am constatat că e destul de simplu de conecta pentru ca are doar 4 pini VCC, TRIG, ECHO si GND. Apoi am facut calculele pentru o viteza a sunetului de 340 m/s și am calculat distanța pe baza duratei întoarcerii sunetului la receptor. Totul a mers fără nici o problemă. Senzorul are o rezolutie de minim 2 cm si maxim 4 metrii. Unda sonora este emisa de transmițător, se loveste de un obiect si se intoarce la receptor. Pe baza vitezei sunetului și a formulei de calcul a timpului rezultă formula distanței = timp * 0.034/2. Acest mini proiect probabil o să-l folosesc la dronă sau la un eventual proiect de masinuță autonomă.
În prima imagine am prins si calculele facute pentru un exemplu de obiect aflat la 10 cm de senzor. Iar mai jos se văd desenate semnalele senzorului si ordinea lor, in prima faza se seteaza pe high trigerul pentru 10 us iar apoi urmeaza 8 ropote (burst) :D de semnal urmate de semnalul de echo.

Documentatie proiect:

NewPing lib
Wiki ultrasound
Componente:
HC-SR04 pe robofun
HC-SR04 pe Amazon
Atmega2560-Mega2560-Board
Schema electronica/sistem:
Aici se poate observa conexiunea senzorului la placa Atmega2560:
Aici am testat măsurarea distantaței până la caiet:

Cod de test:
Cel mai simplu cod pentru masurarea distantei folosind doar setarea pinilor:
/*
* Ultrasonic Sensor HC-SR04
*
*/
// defines pins numbers
const int trigPin = 9;
const int echoPin = 10;
// defines variables
long duration;
int distance;

void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
void loop() {
// Clears the trigPin
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
// Sets the trigPin on HIGH state for 10 micro seconds
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Reads the echoPin, returns the sound wave travel time in microseconds
duration = pulseIn(echoPin, HIGH);
// Calculating the distance
distance= duration*0.034/2;
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm ");
}

Codul sursa pentru masurarea distantei folosind libraria NewPing:
/*
* Ultrasonic Sensor HC-SR04
*
*/
#include "NewPing.h"

// defines variables
long duration;
int distance;
// defines pins numbers
#define TRIG_PN 9
#define ECHO_PN 10
#define MAX_DIST 400
#define MIN_DIST 2
NewPing sonar(TRIG_PN,ECHO_PN,MAX_DIST);

void setup() {
pinMode(trigPin, OUTPUT); // Sets the trigPin as an Output
pinMode(echoPin, INPUT); // Sets the echoPin as an Input
Serial.begin(9600); // Starts the serial communication
}
void loop() {
// Calculating the distance
distance= sonar.ping_cm();
// Prints the distance on the Serial Monitor
Serial.print("Distance: ");
if((distance >= MAX_DIST) || (distance <= MIN_DIST))
{
Serial.println("Out of range ");
}
else
{
Serial.print(distance);
Serial.println(" cm ");
}
}

O zi plăcută tuturor !