Εισαγωγή |
Published date: 16/7/2017
|
Για να το κάνουμε πιο εύκολο κατασκευαστικά θα χρησιμοποιήσουμε ενα έτοιμο κυκλικό ρομποτικό σασί με δυο DC μοτεράκια. Για άλλη μια φορά θα χρησιμοποιήσουμε την δημοφιλή πλακέτα Arduino UNO!
Το μικρό μας ρομποτάκι θα μπορεί να δει οποιοδήποτε αντικείμενο βρεθεί στο δρόμο του με την βοήθεια του αισθητήρα υπαρήχων που διαθέτει. Αν το "GRECO" εντοπίσει εμπόδιο στην πορεία του, σταματάει και κοιτάει αριστερά/δεξιά για να βρει την καλύτερη πορεία διαφυγής!
Σχετικά με τους υπερήχους
Όπως φαίνεται και στην παραπάνω εικόνα, οι υπέρηχοι βρίσκονται πάνω απ' τις ακουστικές συχνότητες, έτσι δεν μπορεί να τους ακούσει το ανθρώπινο αυτί. Παρόλο πάντως που εμείς δεν τους ακούμε κάποια ζώα μπορούν και να τους ακούν αλλά και να τους χρησιμοποιούν. Χαρακτηριστικά παραδείγματα που μας το δείχνουν αυτό είναι η κίνηση των νυχτερίδων και η σφυρίχτρα που χρησιμοποιείται για τους σκύλους. Αισθητήρες υπερήχων συναντάμε σε πολλές εφαρμογές στην ιατρική, στην πλοήγηση σκαφών/πλοίων ακόμα και στα αυτοκίνητα μας στα γνωστά park sensors. Οι αισθητήρες υπερήχων λειτουργούν με την ίδια αρχή που λειτουργούν τα ραντάρ και τα σόναρ. Εκτιμούν την απόσταση ενός στόχου λαμβάνοντας υπόψη τους την αντανάκλαση ενός ραδιοκύματος ή ενός ηχητικού σήματος πάνω στο στόχο.
Δημιουργούν υψηλής συχνότητας κύματα και χρησιμοποιώντας το επιστρεφόμενο σήμα καθορίζουν την απόσταση ή ακόμα και την ταχύτητα του στόχου. Για να το επιτύχουν αυτό χρησιμοποιούν τον χρόνο που έκανε το σήμα για να καλύψει την απόσταση από τον αισθητήρα στο αντικείμενο και πίσω.
HC-SR04 Sensor
Στο Arduino η διαδικασία αυτή (αντιστοίχηση χρόνου σε απόσταση) είναι αρκετά απλή διότι υπάρχει συγκεκριμένη βιβλιοθήκη για τον αισθητήρα HC-SR04 που κάνει την "δύσκολη" δουλεία. Εμείς στον κώδικα μας αρκεί να κάνουμε χρήση μόνο μιας εντολής! Η εντολή αυτή θα μας επιστρέψει την απόσταση σε εκατοστά (cm).
Τα υλικά που θα χρειαστούμε
Για το project αυτό θα χρειαστούμε τα παρακάτω:
Επίσης θα χρειαστούμε μερικά καλώδια και αποστάτες. Εργαλεία: Κατσαβίδι, πιστόλι θερμοσιλικόνης |
|
Συναρμολόγηση του ρομποτ!
Δείτε τις παρακάτω εικόνες. (Μια εικόνα, χίλιες λέξεις!)
Το κύκλωμα
Η πλακέτα που χρησιμοποιούμε για την οδήγηση των μοτέρ του "GRECO" διαθέτει κάποιους ακροδέκτες που έχουν όνομα "Digital I/O" και "Analog I/O". Θα τους χρησιμοποιήσουμε για να συνδέσουμε όλα τα εξαρτήματα στο Arduino uno.
Servo Motor
Συνδέστε το καλώδιο στο πρώτο σετ ακροδεκτών (D7 5V GND). Όπως και στην εικόνα, το καφέ καλώδιο πρέπει να συνδεθεί στο GND.
Buzzer
Συνδέστε στο πρώτο pin του δεύτερου σετ ακροδεκτών το "+" pin του Buzzer και το "-" στο GND
Ultrasonic Sensor
Για την σύνδεση του αισθητήρα υπερήχων θα χρησιμοποιήσουμε το τρίτο και τέταρτο σετ ακροδεκτών.
Μοτέρ (γυρίστε το ρομπότ ώστε να το κοιτάτε απο πίσω)
Δεξί μοτέρ : Το κόκκινο καλώδιο στο "M1+" και το μαύρο στο "M1-"
Αριστερό μοτέρ: Το κόκκινο καλώδιο στο "M2+" και το μαύρο στο "M2-"
Μπαταρίες
Συνδέστε τα καλώδια απ' την βάση των μπαταριών στους ακροδέκτες Vin και GND του Motor Shield. (κόκκινο καλώδιο στο Vin, μαύρο στο GND). Προσθέστε ένα ακόμα καλώδιο στο Vin του Motor Shield και κουμπώστε το στο Vin pin του Arduino uno. Μπορείτε αν θέλετε να προσθέσετε και εναν διακόπτη On/Off στο κόκκινο καλώδιο των μπαταριών.
Servo Motor
Συνδέστε το καλώδιο στο πρώτο σετ ακροδεκτών (D7 5V GND). Όπως και στην εικόνα, το καφέ καλώδιο πρέπει να συνδεθεί στο GND.
Buzzer
Συνδέστε στο πρώτο pin του δεύτερου σετ ακροδεκτών το "+" pin του Buzzer και το "-" στο GND
Ultrasonic Sensor
Για την σύνδεση του αισθητήρα υπερήχων θα χρησιμοποιήσουμε το τρίτο και τέταρτο σετ ακροδεκτών.
- Vcc - 5V (του τρίτου σετ)
- Trig - A2 (του τρίτου σετ)
- GND- GND (του τρίτου σετ)
- Echo - A3 (του τέταρτου σετ)
Μοτέρ (γυρίστε το ρομπότ ώστε να το κοιτάτε απο πίσω)
Δεξί μοτέρ : Το κόκκινο καλώδιο στο "M1+" και το μαύρο στο "M1-"
Αριστερό μοτέρ: Το κόκκινο καλώδιο στο "M2+" και το μαύρο στο "M2-"
Μπαταρίες
Συνδέστε τα καλώδια απ' την βάση των μπαταριών στους ακροδέκτες Vin και GND του Motor Shield. (κόκκινο καλώδιο στο Vin, μαύρο στο GND). Προσθέστε ένα ακόμα καλώδιο στο Vin του Motor Shield και κουμπώστε το στο Vin pin του Arduino uno. Μπορείτε αν θέλετε να προσθέσετε και εναν διακόπτη On/Off στο κόκκινο καλώδιο των μπαταριών.
Ο κώδικας
Δώστε ζωή στο μικρό ρομποτάκι σας προγραμματίζοντας το με τον παρακάτω κώδικα!
- Αν το ρομπότ σας κινείτε γρήγορα και χτυπάει πάνω στα αντικείμενα αλλάξτε την τιμής της μεταβλητής speedPWM στην γραμμή κώδικα 26. (max 255 - PWM)
- Αν το ρομπότ σας δεν κινείτε ευθεία, προσθέστε στις γραμμές 43 and 44 στο πεδίο "speedPWM" κάποια τιμή (καλό είναι να το πάτε ανα 10). Θα πρέπει το άθροισμα να είναι ίσο ή λιγότερο απο 255. Στην περίπτωση μου πρόσθεσα στο δεξί μοτέρ 50, και απο 150 που ήταν η ταχύτητα σε pwm, πήγε 200.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | /* Arduino Object Avoiding Robot with Ultrasonic Sensor * Dev: Michalis Vasilakis // Date: 15/7/2017 // www.ardumotive.com */ //Libraries #include <Servo.h> #include "Ultrasonic.h" //Constants - Connections const int buzzer = 8; const int motorA1= 2; const int motorA2= 6; const int enableA = 3; const int motorB1= 10; const int motorB2= 9; const int enableB = 5; Ultrasonic ultrasonic(A2 ,A3); //Create Ultrsonic object ultrasonic(trig pin,echo pin) Servo myservo; //Create Servo object to control a servo //Variables int distance; //Variable to store distance from an object int checkRight; int checkLeft; int pos=100; //Variable to store the servo position. By default 90 degrees - sensor will 'look' forward int speedPWM = 150; //Change speed (PWM max 255) void setup() { myservo.attach(7); //Servo pin connected to pin 7 myservo.write(pos); // tell servo to go to position in variable 'pos' pinMode(buzzer, OUTPUT); pinMode(motorA1,OUTPUT); pinMode(motorA2,OUTPUT); pinMode(motorB1,OUTPUT); pinMode(motorB2,OUTPUT); pinMode(enableA, OUTPUT); pinMode(enableB, OUTPUT); delay(5000); //Wait 5 seconds... } void loop(){ analogWrite(enableA, speedPWM); analogWrite(enableB, speedPWM+50); //Read distance... distance = ultrasonic.Ranging(CM); //Tip: Use 'CM' for centimeters or 'INC' for inches delay(20); //Check for objects... if (distance > 15){ forward(); //All clear, move forward! noTone(buzzer); } else if (distance <=15){ stop(); //Object detected! Stop the robot and check left and right for the better way out! tone(buzzer,500); // play a tone //Start scanning... for(pos = 30; pos < 170; pos += 1){ //goes from 0 degrees to 180 degrees myservo.write(pos); //tell servo to go to position in variable 'pos' delay(10); //waits 10ms for the servo to reach the position } checkLeft = ultrasonic.Ranging(CM); //Take distance from the left side for(pos = 170; pos>=30; pos-=1){ //goes from 180 degrees to 0 degrees myservo.write(pos); //tell servo to go to position in variable 'pos' delay(10); //waits 10ms for the servo to reach the position } checkRight= ultrasonic.Ranging(CM); myservo.write(100); // Sensor "look" forward again //Finally, take the right decision, turn left or right? if (checkLeft < checkRight){ left(); delay(500); // delay, change value if necessary to make robot turn. } else if (checkLeft > checkRight){ right(); delay(500); // delay, change value if necessary to make robot turn. } else if (checkLeft <=10 && checkRight <=10){ backward(); //The road is closed... go back and then left ;) left(); } } delay(150); } void forward(){ digitalWrite(motorA1, HIGH); digitalWrite(motorA2, LOW); digitalWrite(motorB1, HIGH); digitalWrite(motorB2, LOW); } void backward(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, HIGH); digitalWrite(motorB1, LOW); digitalWrite(motorB2, HIGH); } void left(){ digitalWrite(motorA1, HIGH); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, HIGH); } void right(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, HIGH); digitalWrite(motorB1, HIGH); digitalWrite(motorB2, LOW); } void stop(){ digitalWrite(motorA1, LOW); digitalWrite(motorA2, LOW); digitalWrite(motorB1, LOW); digitalWrite(motorB2, LOW); } |
Κατεβάστε τον κώδικα απο εδώ, μέσα στο αρχείο θα βρείτε και την σχετική βιβλιοθήκη για τον αισθητήρα υπερήχων.
|
|
Συγχαρητήρια!
Αυτό ήταν!!!
Εύκολο ή δύσκολο? Πείτε μου παρακάτω!
Επίσης θα ήθελα να δω φωτογραφίες απ' τα δικά σας ρομποτάκια!
Εύκολο ή δύσκολο? Πείτε μου παρακάτω!
Επίσης θα ήθελα να δω φωτογραφίες απ' τα δικά σας ρομποτάκια!