Μαθήματα Πληροφορικής & Προγραμματισμού

Κατασκευή ραντάρ με Arduino (μέρος 2ο)

Κατασκευή ραντάρ με Arduino

ραντάρ με ArduinoΓια να ολοκληρωθεί η κατασκευή ραντάρ με Arduino θα χρειαστεί να αναπτύξουμε τον παρακάτω κώδικα στον Arduino IDE και να τον φορτώσουμε στο Arduino Board. Μπορείτε να βρείτε ολόκληρο τον κώδικα σε ένα αρχείο με κατάληξη .ino εδώ.

Κατασκευή ραντάρ με Arduino: Οι μεταβλητές

Παρακάτω θα παρακολουθήσουμε τον ορισμό των διαφόρων μεταβλητών, αντικειμένων που απαιτούνται για την υλοποίηση των υπολογισμών. Επίσης μερικές από αυτές χρησιμοποιούνται για τον ορισμό των διαφόρων πυλών του Arduino Board που συνδέσαμε τα περιφερειακά όργανα.

// Περιέλαβε τις βιβλιοθήκες για το Servo motor και την οθόνη LCD 
#include <Servo.h>
#include <LiquidCrystal.h>

//Ορίζουμε τις πύλες που  συνδέσαμε την  οθόνη
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);

// Ορίζουμε τις πύλες που συνδέσαμε τον αισθητήρα απόστασης
const int trigPin = 10;
const int echoPin = 11;

//Ορίζουμε την πύλη που συνδέσαμε το piezo
const int piezoPin = 8;

// Οι παρακάτω μεταβλητές θα κρατάνε την απόσταση, την διάρκεια και την γωνία του σέρβο
long duration;
int distance;
int Angle;

// Ορίζουμε έναν πίνακα με συχνότητες τις οποίες θα στέλνουμε στο piezo 
int notes[] = {262, 462, 862, 1662, 3262}; 

// Δημιουργούμε ένα καινούριο αντικείμενο της κλάσης Servo με όνομα my Servo
Servo myServo; 

Κατασκευή ραντάρ με Arduino : Το κυρίως κομμάτι του κώδικα.

Το παρακάτω κομμάτι κώδικα είναι το κομμάτι αυτό που θα εκτελείται από το Arduino Board κατά την εκκίνηση του και όσο παραμένει ανοιχτό.

void setup() {
  //ορίζουμε τις διαστάσεις πλάτους ύψους της οθόνης LCD
  lcd.begin(16, 2); 
  //Ορίζουμε το trigPin ως πύλη εξόδου
  pinMode(trigPin, OUTPUT); 
  //Ορίζουμε το echoPin ως πύλη εισόδου
  pinMode(echoPin, INPUT); 
  //Ξεκινάμε μια νέα σειριακή επικοινωνία με ρυθμό μετάδοσης 9600bps
  Serial.begin(9600); 
  //Ορίζουμε την πύλη που συνδέσαμε το Servo
  myServo.attach(12); 
  //Ορίζουμε την πύλη που συνδέσαμε το piezo ως πύλη εξόδου.
  pinMode(piezoPin, OUTPUT);
}

void loop() {
  
  // Στρέψε το Servo από τις 15 έως τις 165 μοίρες
  for(int i = 15; i <= 165; i++){  
    Angle=i;
    myServo.write(Angle);
    //Καλούμε την συνάρτηση calculateDistance για να πάρουμε την απόσταση που μέτρησε ο
    //αισθητήρας απόστασης για κάθε μια μοίρα
    distance = calculateDistance();
    //καλούμε την διαδικασία beep για να παράγει ήχο το piezo.
    beep();
    //Καλούμε την διαδικασία lcdprint για να τυπώσουμε τις τιμές της γωνίας
    //και της απόστασης στην οθόνη. 
    lcdprint();  
    //Καλούμε την συνάρτηση Sprint για να τυπώσει στο Serial Monitor.
    Sprint(); //Serial Monitor print
  }
  // Ομοίως και για τις γωνίες από 165 έως 15 μοίρες
  for(int i = 165; i > 15; i--){  
    Angle=i;
    myServo.write(i);
    distance = calculateDistance();
    beep();
    lcdprint();
    Sprint();
  }
}

Κατασκευή ραντάρ με Arduino: Οι συναρτήσεις που χρησιμοποιήθηκαν για τους υπολογισμούς.

Παρακάτω θα παρακολουθήσουμε την κατασκευή των συναρτήσεων που χρησιμοποιήθηκαν στο κυρίως κομμάτι του κώδικα για να πραγματοποιηθεί ο υπολογισμός της απόστασης και ο τόνος που θα παράγει το Piezo την κάθε δεδομένη στιγμή.

// Συνάρτηση που υπολογίζει την απόσταση σύμφωνα με τα δεδομένα που λαμβάνει
// ο αισθητήρας απόστασης.
int calculateDistance(){ 
  //Καθάρισε το trigPin για να ξεκινήσει το μέτρημα.
  digitalWrite(trigPin, LOW); 
  //καθυστέρησε 2 μικρό δευτερόλεπτα.
  delayMicroseconds(2);
  //Στέλνουμε ρεύμα στο trigPin για 10 μικροδευτερόλεπτα
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10);
  //Σταματάμε το εκπομπή σήματος στο trigPin
  digitalWrite(trigPin, LOW);
  //Διαβάζουμε από το echoPin και η συνάρτηση pulseIn μας επιστρέφει 
  //το χρόνο που ταξίδεψε ο ήχος από το trigPin μέχρι να επιστρέψει 
  //πάλι πίσω στον αισθητήρα.
  duration = pulseIn(echoPin, HIGH); // Reads the echoPin, returns the sound wave travel time in microseconds
  //U(m/s)=dX(m)/dT(s) 
  //Σε αυτήν την περίπτωση Duration(time)= 2*Distance/SpeedOfSound=> 
  //Distance=SpeedOfSound*Duration/2
  // Σε συνθήκες δωματίου ο ήχος ταξιδεύει με 343.2 m/s 
 //ή 0.003432 m/Microsecond ή 0,03434 cm/Microseconds
  distance= duration*0.034/2; 
  //Επέστρεψε  την απόσταση.
  return distance;
}

//Συνάρτηση για να παράγει  ήχο το Piezo.
void beep(){
  //αν η απόσταση που μετρήθηκε είναι μεγαλύτερη από 40 cm μην παράγεις ήχο
  if(distance > 40){  
    noTone(piezoPin);
    delay(10);
    noTone(piezoPin);
    delay(30);
  }
  //αλλιώς άν η απόσταση που μετρήθηκε είναι μεταξύ 30 και 40 cm
  else if (distance <= 40 && distance > 30){ 
    //Στείλε στο Piezo την πρώτη συχνότητα από τον πίνακα των συχνοτήτων 
    //που ορίσαμε παραπάνω για 10 milliseconds.
    tone(piezoPin, notes[1]); 
    delay(10); 
    //Σταμάτα την παραγωγή  ήχου  για  30 milliseconds
    noTone(piezoPin);
    delay(30);
  }
  else if (distance <= 30 && distance > 20){
    tone(piezoPin,notes[2]);
    delay(10);
    noTone(piezoPin);
    delay(30);
  }
  else if (distance <= 20 && distance > 10){
    tone(piezoPin,notes[3]);
    delay(10);
    noTone(piezoPin);
    delay(30);
  }
  else {
    tone(piezoPin,notes[4]);
    delay(10);
    noTone(piezoPin);
    delay(30);
  }
}

Οι συναρτήσεις για την εκτύπωση δεδομένων

Στο παρακάτω κομμάτι κώδικα θα δούμε τις void συναρτήσεις που χρησιμοποιήθηκαν στο κυρίως κομμάτι του κώδικα τόσο για την εκτύπωση των δεδομένων στην οθόνη LCD όσο και για την εκτύπωση τους στην σειριακή οθόνη του Arduino IDE

//Συνάρτηση  για να τυπώνει δεδομένα στην οθόνη LCD.
void lcdprint(){
  //Καθάρισε την οθόνη από προηγούμενα δεδομένα.
  lcd.clear();
  //Πήγαινε τον κέρσορα στην Στήλη 0 και Γραμμή 0.
  lcd.setCursor(0, 0);
  //Τύπωσε την γωνία του Servo.
  lcd.print("Angle: "); 
  lcd.print(Angle);
  lcd.print("°");
  //Μετατόπισε τον κέρσορα στην Στήλη 0 και Γραμμή 1.
  lcd.setCursor(0, 1); 
  //Τύπωσε την απόσταση που μετρήθηκε από τον αισθητήρα.
  lcd.print("Distance: ");
  lcd.print(distance);
  lcd.print(" cm");
}
//Συνάρτηση για να τυπώνει δεδομένα στο Serial Monitor.
void Sprint(){
  //Στείλε την γωνία του Servo στην σειριακή θύρα.
  Serial.print(Angle);
  //Στείλε τον χαρακτήρα , στην σειριακή θύρα.
  Serial.print(","); 
  //Στείλε την απόσταση που μετρήθηκε  στην σειριακή θύρα.
  Serial.print(distance);
  //Στείλε τον χαρακτήρα . στην σειριακή θύρα.
  Serial.print("."); 
  }

Αφήστε ένα Σχόλιο

Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *

Αυτός ο ιστότοπος χρησιμοποιεί το Akismet για να μειώσει τα ανεπιθύμητα σχόλια. Μάθετε πώς υφίστανται επεξεργασία τα δεδομένα των σχολίων σας.