Ardumotive Arduino Greek Playground
  • Home
    • Blog
    • About us
    • License
  • Tutorials
  • Workshop
  • News (GR)
  • RPi Tutorials
  • Contact
The 1st Arduino Playgroung in Greece - Open Source Hardware

"GRECO" - Ρομπότ αποφυγής εμποδίων για αρχάριους

Available Languages
Picture
Picture

Εισαγωγή

Published date: 16/7/2017
Picture
Αν είσαι αρχάριος και μόλις γνωρίστηκες με το Arduino τότε αυτός είναι ο πιο εύκολος οδηγός για να φτιάξεις επιτέλους το πρώτο σου ρομπότ!

​ Ένα ρομπότ αποφυγής εμποδίων!


Για να το κάνουμε πιο εύκολο κατασκευαστικά θα χρησιμοποιήσουμε ενα έτοιμο κυκλικό ρομποτικό σασί με δυο DC μοτεράκια. Για άλλη μια φορά θα χρησιμοποιήσουμε την δημοφιλή πλακέτα Arduino UNO!
Το μικρό μας ρομποτάκι θα μπορεί να δει οποιοδήποτε αντικείμενο βρεθεί στο δρόμο του με την βοήθεια του αισθητήρα υπαρήχων που διαθέτει. Αν το "GRECO" εντοπίσει εμπόδιο στην πορεία του, σταματάει και κοιτάει αριστερά/δεξιά για να βρει την καλύτερη πορεία διαφυγής! 

Σχετικά με τους υπερήχους 

Picture
Picture
Όπως φαίνεται και στην παραπάνω εικόνα, οι υπέρηχοι βρίσκονται πάνω απ' τις ακουστικές συχνότητες, έτσι δεν μπορεί να τους ακούσει το ανθρώπινο αυτί. Παρόλο πάντως που εμείς δεν τους ακούμε κάποια ζώα μπορούν και να τους ακούν αλλά και να τους χρησιμοποιούν. Χαρακτηριστικά παραδείγματα που μας το δείχνουν αυτό είναι η κίνηση των νυχτερίδων και η σφυρίχτρα που χρησιμοποιείται για τους σκύλους. Αισθητήρες υπερήχων συναντάμε σε πολλές εφαρμογές στην ιατρική, στην πλοήγηση σκαφών/πλοίων ακόμα και στα αυτοκίνητα μας στα γνωστά park sensors. Οι αισθητήρες υπερήχων λειτουργούν με την ίδια αρχή που λειτουργούν τα ραντάρ και τα σόναρ. Εκτιμούν την απόσταση ενός στόχου λαμβάνοντας υπόψη τους την αντανάκλαση ενός ραδιοκύματος ή ενός ηχητικού σήματος πάνω στο στόχο.

Picture
Δημιουργούν υψηλής συχνότητας κύματα και χρησιμοποιώντας το επιστρεφόμενο σήμα καθορίζουν την απόσταση ή ακόμα και την ταχύτητα του στόχου. Για να το επιτύχουν αυτό χρησιμοποιούν τον χρόνο που έκανε το σήμα για να καλύψει την απόσταση από τον αισθητήρα στο αντικείμενο και πίσω.

​HC-SR04 Sensor
​

Στο Arduino η διαδικασία αυτή (αντιστοίχηση χρόνου σε απόσταση) είναι αρκετά απλή διότι υπάρχει συγκεκριμένη βιβλιοθήκη για τον αισθητήρα HC-SR04 που κάνει την "δύσκολη" δουλεία. Εμείς στον κώδικα μας αρκεί να κάνουμε χρήση μόνο μιας εντολής! Η εντολή αυτή θα μας επιστρέψει την απόσταση σε εκατοστά (cm). 
Picture
  • Power Supply :+5V DC
  • Quiescent Current : <2mA
  • Working Currnt: 15mA
  • Effectual Angle: <15°
  • Ranging Distance : 2cm – 400 cm/1" - 13ft
  • Resolution : 0.3 cm
  • Measuring Angle: 30 degree
  • Trigger Input Pulse width: 10uS
  • Dimension: 45mm x 20mm x 15mm

Τα υλικά που θα χρειαστούμε

Picture
Για το project αυτό θα χρειαστούμε τα παρακάτω:​
  • Arduino UNO
  • ​Mini Round Robot Chassis Kit
  • Dual DC Motor Shield with L298 IC
  • Ultrasonic Sensor - HC-SR04
  • Micro Servo
  • Battery holder 4xAA

Επίσης θα χρειαστούμε μερικά καλώδια και αποστάτες.
Εργαλεία: Κατσαβίδι, πιστόλι θερμοσιλικόνης   

Συναρμολόγηση του ρομποτ! 

Δείτε τις παρακάτω εικόνες. (Μια εικόνα, χίλιες λέξεις!)

Το κύκλωμα 

Picture
Η πλακέτα που χρησιμοποιούμε για την οδήγηση των μοτέρ του "GRECO" διαθέτει κάποιους ακροδέκτες που έχουν όνομα "Digital I/O" και "Analog I/O". Θα τους χρησιμοποιήσουμε για να συνδέσουμε όλα τα εξαρτήματα στο Arduino uno.

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);
}
Κατεβάστε τον κώδικα απο εδώ, μέσα στο αρχείο θα βρείτε και την σχετική βιβλιοθήκη για τον αισθητήρα υπερήχων.
object_avoiding_robot.zip
File Size: 2 kb
File Type: zip
Download File

Συγχαρητήρια! 

Picture
Αυτό ήταν!!!

​Εύκολο ή δύσκολο? Πείτε μου παρακάτω!

Επίσης θα ήθελα να δω φωτογραφίες απ' τα δικά σας ρομποτάκια!

Picture

Search Engine

Licence 

Picture
Picture

Help us to grow up!

Picture


Donate us
About us
License
Cookies policy

Visit the biggest Arduino Shop in Greece!

Picture
find us on dwrean.net
find us on Codebender
find us on Instructables
Developed and designed by Vasilakis Michalis Copyright © 2013 Ardumotive All Rights Reserved
All trademarks referenced herein are properties of their
Powered by Create your own unique website with customizable templates.
Design by DivTag Templates
Ardumotive Arduino Greek Playground