Κατασκευή ραντάρ με 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("."); }