AutonomusParkingCar
5 years ago
2 changed files with 384 additions and 0 deletions
@ -0,0 +1,61 @@ |
|||||
|
= **ΑΥΤΟΝΟΜΟ ΠΑΡΚΑΡΙΣΜΑ** |
||||
|
|
||||
|
=== ΔΗΜΗΤΡΙΟΣ ΝΙΑΒΗΣ (141070) |
||||
|
=== ΑΠΟΣΤΟΛΟΣ ΣΥΡΙΩΔΗΣ (46683) |
||||
|
=== ΜΕΝΕΛΑΟΣ ΠΙΚΡΙΔΑΣ (141291) |
||||
|
|
||||
|
image::iot.jpg[] |
||||
|
|
||||
|
TIP: ΕΡΓΑΣΙΑ ΣΤΑ ΠΛΑΙΣΙΑ ΤΟΥ ΜΑΘΗΜΑΤΟΣ "ΔΙΑΔΙΚΤΥΟ ΤΩΝ ΑΝΤΙΚΕΙΜΕΝΩΝ" |
||||
|
|
||||
|
== ΠΕΡΙΓΡΑΦΗ ΕΡΓΑΣΙΑΣ |
||||
|
|
||||
|
*Σκοπός της εργασίας μας είναι η συναρμολόγηση και η κωδικοποίηση ενός αυτοκινήτου, |
||||
|
ώστε να μπορεί να παρκάρει αυτόνομα.* |
||||
|
|
||||
|
Αρχικά τοποθετήσαμε στο πάνω μέρος τoυ αυτοκινήτου την υποδοχή για τις μπαταρίες |
||||
|
και τοποθετήσαμε μέσα τις Μπαταρίες. Πάνω σε αυτό βάλαμε το Arduino. |
||||
|
Πάνω στο Arduino, στις υποδοχές Digital PwM, τοποθετήσαμε |
||||
|
το Adafruit Motorshield. Σε αυτό συνδέσαμε τα motors του DIY Αυτοκινήτου. |
||||
|
Δίπλα απο το Arduino κολλήσαμε το Breadboard στο οποίο συνδέσαμε |
||||
|
τους 4 Αισθητήρες Μέτρησης Απόστασης HC-SR04. Το Arduino έχει ως πηγή ρεύματος |
||||
|
ένα μικρό Powerbank, ενώ το Adafruit Motorshield - Α |
||||
|
έχει ως πηγή ρεύματος τις μπαταρίες. Οι Αισθητήρες Μέτρησης Απόστασης |
||||
|
HC-SR04 έχουν ως πηγή ρεύματος τις μπαταρίες. |
||||
|
|
||||
|
Στην εργασία χρησιμοποιήθηκαν: |
||||
|
|
||||
|
- 1 ARDUINO UNO. |
||||
|
- 1 ADAFRUIT MOTORSHIELD. |
||||
|
- 1 RASPBERRY PI. |
||||
|
- 1 DIY ΑΥΤΟΚΙΝΗΤΟ ΜΕ 4 MOTORS. |
||||
|
- 1 BREADBOARD. |
||||
|
- 6 ΑΙΣΘΗΤΗΡΕΣ ΜΕΤΡΗΣΗΣ ΑΠΟΣΤΑΣΗΣ HC-SR04. |
||||
|
- 3 ΜΑΤΣΑΚΙΑ ΚΑΛΩΔΙΑ ΑΡΣΕΝΙΚΟ - ΘΗΛΥΚΟ, ΘΗΛΥΚΟ - ΘΗΛΥΚΟ, ΑΡΣΕΝΙΚΟ - ΑΡΣΕΝΙΚΟ. |
||||
|
- 1 ΥΠΟΔΟΧΗ ΓΙΑ ΜΠΑΤΑΡΙΕΣ. |
||||
|
- 4 ΜΠΑΤΑΡΙΕΣ. |
||||
|
|
||||
|
== ΛΕΙΤΟΥΡΓΙΑ ΤΟΥ ΑΥΤΟΚΙΝΗΤΟΥ |
||||
|
|
||||
|
Το αυτοκίνητο ξεκινά με μέση ταχύτητα 100. Το αυτοκίνητο δέχεται ταχύτητες απο 0 - 255. |
||||
|
Μόλις συναντήσει εμπόδιο το οποίο βρίσκεται σε απόσταση 8cm απο το αυτοκίνητο, |
||||
|
τότε αυτό σταματάει και έπειτα προχωράει προς την αντί - Αθετη κατεύθυνση. |
||||
|
Παράλληλα, οι αισθητήρες απόστασης στα δεξιά και αριστερά του αυτοκινήτου μετρούν |
||||
|
τις αποστάσεις απο τα αντικείμενα που υπάρχουν. Μόλις συναντήσουν ένα κενό, το οποίο |
||||
|
είναι μεγαλύτερο ή ίσο με το μήκος του αυτοκινήτου, |
||||
|
τότε το ατοκίνητο συνεχίζει την πορεία του για ελάχιστα μέτρα και έπειτα οπισθοχωρεί διαγώνια, |
||||
|
ώστε να μπεί στην θέση παρκαρίσματος. |
||||
|
|
||||
|
== ΤΟ DIY ΑΥΤΟΚΙΝΗΤΟ |
||||
|
|
||||
|
|
||||
|
image::IMG-5aaaa10654529dd76b248ac1ec68000d-V.jpg[] |
||||
|
video::20200120_180137.mp4[width=640, start=60, end=140, options=autoplay] |
||||
|
|
||||
|
== ARDUINO CODE |
||||
|
|
||||
|
Ο κώδικας μας είναι ανεβασμένος στο GitHub |
||||
|
|
||||
|
CAUTION: BLOOPER VIDEO |
||||
|
|
||||
|
video::video-1579544521.mp4[width=640, start=60, end=140, options=autoplay] |
@ -0,0 +1,323 @@ |
|||||
|
#include <Wire.h> |
||||
|
#include <Adafruit_MotorShield.h> |
||||
|
#include "utility/Adafruit_MS_PWMServoDriver.h" |
||||
|
|
||||
|
//define logic control output pin
|
||||
|
#define trigPin1 13 |
||||
|
#define echoPin1 12 |
||||
|
|
||||
|
#define trigPin2 A3 |
||||
|
#define echoPin2 A2 |
||||
|
|
||||
|
#define trigPin3 7 |
||||
|
#define echoPin3 6 |
||||
|
|
||||
|
#define trigPin4 9 |
||||
|
#define echoPin4 8 |
||||
|
|
||||
|
#define trigPin5 A1 |
||||
|
#define echoPin5 A0 |
||||
|
|
||||
|
#define trigPin6 11 |
||||
|
#define echoPin6 10 |
||||
|
|
||||
|
// Create the motor shield object with the default I2C address
|
||||
|
Adafruit_MotorShield AFMS = Adafruit_MotorShield(); |
||||
|
|
||||
|
// Select which 'port' M1, M2, M3 or M4. In this case, M1
|
||||
|
Adafruit_DCMotor *myMotor = AFMS.getMotor(1); |
||||
|
Adafruit_DCMotor *myMotor2 = AFMS.getMotor(2); |
||||
|
Adafruit_DCMotor *myMotor3 = AFMS.getMotor(3); |
||||
|
Adafruit_DCMotor *myMotor4 = AFMS.getMotor(4); |
||||
|
|
||||
|
void setup() { |
||||
|
Serial.begin(9600); // set up Serial library at 9600 bps
|
||||
|
|
||||
|
// Configure the pin modes for each drive motor
|
||||
|
pinMode(trigPin1, OUTPUT); |
||||
|
pinMode(echoPin1, INPUT); |
||||
|
|
||||
|
pinMode(trigPin2, OUTPUT); |
||||
|
pinMode(echoPin2, INPUT); |
||||
|
|
||||
|
pinMode(trigPin3, OUTPUT); |
||||
|
pinMode(echoPin3, INPUT); |
||||
|
|
||||
|
pinMode(trigPin4, OUTPUT); |
||||
|
pinMode(echoPin4, INPUT); |
||||
|
|
||||
|
pinMode(trigPin5, OUTPUT); |
||||
|
pinMode(echoPin5, INPUT); |
||||
|
|
||||
|
pinMode(trigPin6, OUTPUT); |
||||
|
pinMode(echoPin6, INPUT); |
||||
|
|
||||
|
AFMS.begin(); // create with the default frequency 1.6KHz
|
||||
|
|
||||
|
// Set the speed to start, from 0 (off) to 255 (max speed)
|
||||
|
myMotor->setSpeed(100); |
||||
|
myMotor->run(BACKWARD); |
||||
|
|
||||
|
myMotor2->setSpeed(100); |
||||
|
myMotor2->run(FORWARD); |
||||
|
|
||||
|
myMotor3->setSpeed(100); |
||||
|
myMotor3->run(FORWARD); |
||||
|
|
||||
|
myMotor4->setSpeed(100); |
||||
|
myMotor4->run(BACKWARD); |
||||
|
} |
||||
|
|
||||
|
void loop() { |
||||
|
long duration1, distance1; |
||||
|
long duration2, distance2; |
||||
|
long duration3, distance3; |
||||
|
long duration4, distance4; |
||||
|
long duration5, distance5; |
||||
|
long duration6, distance6; |
||||
|
long a, b, c, d, e; |
||||
|
|
||||
|
digitalWrite(trigPin1, LOW); // Sets the trigPin1 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin1, HIGH); // Sets the trigPin1 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin1, LOW); |
||||
|
duration1 = pulseIn(echoPin1, HIGH); // Reads the echoPin1, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin2, LOW); // Sets the trigPin2 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin2, HIGH); // Sets the trigPin2 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin2, LOW); |
||||
|
duration2 = pulseIn(echoPin2, HIGH); // Reads the echoPin2, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin3, LOW); // Sets the trigPin3 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin3, HIGH); // Sets the trigPin3 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin3, LOW); |
||||
|
duration3 = pulseIn(echoPin3, HIGH); // Reads the echoPin3, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin4, LOW); // Sets the trigPin4 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin4, HIGH); // Sets the trigPin4 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin4, LOW); |
||||
|
duration4 = pulseIn(echoPin4, HIGH); // Reads the echoPin4, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin5, LOW); // Sets the trigPin5 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin5, HIGH); // Sets the trigPin5 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin5, LOW); |
||||
|
duration5 = pulseIn(echoPin5, HIGH); // Sets the trigPin5 on HIGH state for 10 micro seconds
|
||||
|
|
||||
|
digitalWrite(trigPin6, LOW); // Sets the trigPin6 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin6, HIGH); // Sets the trigPin6 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin6, LOW); |
||||
|
duration6 = pulseIn(echoPin6, HIGH); // Sets the trigPin6 on HIGH state for 10 micro seconds
|
||||
|
|
||||
|
// Calculating the distance
|
||||
|
distance1 = (duration1 /2) / 29.1; |
||||
|
distance2 = (duration2 /2) / 29.1; |
||||
|
distance3 = (duration3 /2) / 29.1; |
||||
|
distance4 = (duration4 /2) / 29.1; |
||||
|
distance5 = (duration5 /2) / 29.1; |
||||
|
distance6 = (duration6 /2) / 29.1; |
||||
|
|
||||
|
// Prints the distance on the Serial Monitor
|
||||
|
Serial.print(distance1); |
||||
|
Serial.println(" cm"); |
||||
|
Serial.print(distance2); |
||||
|
Serial.println(" cm"); |
||||
|
Serial.print(distance3); |
||||
|
Serial.println(" cm"); |
||||
|
Serial.print(distance4); |
||||
|
Serial.println(" cm"); |
||||
|
Serial.print(distance5); |
||||
|
Serial.println(" cm"); |
||||
|
Serial.print(distance6); |
||||
|
Serial.println(" cm"); |
||||
|
Serial.println("\n"); |
||||
|
|
||||
|
a = stop0(distance1, distance2, distance5, distance6); |
||||
|
b = move1(distance1, distance2, distance5, distance6); |
||||
|
c = move2(distance1, distance2, distance5, distance6); |
||||
|
d = turn1(distance1, distance2, distance3, distance4, distance5); |
||||
|
e = turn2(distance1, distance2, distance3, distance4, distance5); |
||||
|
} |
||||
|
|
||||
|
long stop0 (long dis1, long dis2, long dis5, long dis6) //define stop function
|
||||
|
{ |
||||
|
if (dis1 <= 8 && dis2 <= 8 && dis5 <=8 && dis6 <= 8) |
||||
|
{ |
||||
|
myMotor ->run(RELEASE); |
||||
|
myMotor2->run(RELEASE); |
||||
|
myMotor3->run(RELEASE); |
||||
|
myMotor4->run(RELEASE); |
||||
|
Serial.println("stop0"); |
||||
|
} |
||||
|
} |
||||
|
long move1 (long dis1, long dis2, long dis5, long dis6) //define forward function
|
||||
|
{ |
||||
|
if (dis1 < 8 && dis2 > 4 && dis5 > 4 && dis6 < 8) { |
||||
|
Serial.println("move1"); |
||||
|
myMotor ->run(FORWARD); |
||||
|
myMotor2->run(BACKWARD); |
||||
|
myMotor3->run(BACKWARD); |
||||
|
myMotor4->run(FORWARD); |
||||
|
myMotor ->setSpeed(100); |
||||
|
myMotor2->setSpeed(100); |
||||
|
myMotor3->setSpeed(100); |
||||
|
myMotor4->setSpeed(100); |
||||
|
delay(100); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
long move2 (long dis1, long dis2, long dis5, long dis6) //define backward function
|
||||
|
{ |
||||
|
if (dis2 < 4 && dis1 > 8 && dis5 < 4 && dis6 > 8) |
||||
|
{ |
||||
|
Serial.println("move2"); |
||||
|
myMotor ->run(BACKWARD); |
||||
|
myMotor2->run(FORWARD); |
||||
|
myMotor3->run(FORWARD); |
||||
|
myMotor4->run(BACKWARD); |
||||
|
myMotor ->setSpeed(100); |
||||
|
myMotor2->setSpeed(100); |
||||
|
myMotor3->setSpeed(100); |
||||
|
myMotor4->setSpeed(100); |
||||
|
delay(100); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
long turn1 (long dis1, long dis2, long dis3, long dis4, long dis5) //define right turn function
|
||||
|
{ |
||||
|
long dur1, dur2, dur3, dur4, dur5, dur6; |
||||
|
while (dis2 > 7 && dis3 < 9 && dis4 > 2 && dis5 > 9){ |
||||
|
Serial.println("turn1"); |
||||
|
myMotor ->run(FORWARD); |
||||
|
myMotor2->run(BACKWARD); |
||||
|
myMotor3->run(BACKWARD); |
||||
|
myMotor4->run(FORWARD); |
||||
|
myMotor ->setSpeed(200); |
||||
|
myMotor2->setSpeed(200); |
||||
|
myMotor3->setSpeed(20); |
||||
|
myMotor4->setSpeed(20); |
||||
|
|
||||
|
digitalWrite(trigPin1, LOW); // Sets the trigPin1 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin1, HIGH); // Sets the trigPin1 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin1, LOW); |
||||
|
dur1 = pulseIn(echoPin1, HIGH); // Reads the echoPin1, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin2, LOW); // Sets the trigPin2 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin2, HIGH); // Sets the trigPin2 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin2, LOW); |
||||
|
dur2 = pulseIn(echoPin2, HIGH); // Reads the echoPin2, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin3, LOW); // Sets the trigPin3 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin3, HIGH); // Sets the trigPin3 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin3, LOW); |
||||
|
dur3 = pulseIn(echoPin3, HIGH); // Reads the echoPin3, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin4, LOW); // Sets the trigPin4 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin4, HIGH); // Sets the trigPin4 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin4, LOW); |
||||
|
dur4 = pulseIn(echoPin4, HIGH); // Reads the echoPin4, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin5, LOW); // Sets the trigPin5 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin5, HIGH); // Sets the trigPin5 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin5, LOW); |
||||
|
dur5 = pulseIn(echoPin5, HIGH); // Sets the trigPin5 on HIGH state for 10 micro seconds
|
||||
|
|
||||
|
// Calculating the distance
|
||||
|
dis1 = (dur1 /2) / 29.1; |
||||
|
dis2 = (dur2 /2) / 29.1; |
||||
|
dis3 = (dur3 /2) / 29.1; |
||||
|
dis4 = (dur4 /2) / 29.1; |
||||
|
dis5 = (dur5 /2) / 29.1; |
||||
|
|
||||
|
delay(120); |
||||
|
|
||||
|
myMotor ->run(RELEASE); |
||||
|
myMotor2->run(RELEASE); |
||||
|
myMotor3->run(RELEASE); |
||||
|
myMotor4->run(RELEASE); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
long turn2 (long dis1, long dis2, long dis3, long dis4, long dis5) //define left function
|
||||
|
{ |
||||
|
long dur1, dur2, dur3, dur4, dur5; |
||||
|
while (dis2 < 6 && dis3 < 8 && dis4 > 2){ |
||||
|
Serial.println("turn2"); |
||||
|
myMotor ->run(FORWARD); |
||||
|
myMotor2->run(BACKWARD); |
||||
|
myMotor3->run(BACKWARD); |
||||
|
myMotor4->run(FORWARD); |
||||
|
myMotor ->setSpeed(30); |
||||
|
myMotor2->setSpeed(30); |
||||
|
myMotor3->setSpeed(200); |
||||
|
myMotor4->setSpeed(200); |
||||
|
|
||||
|
digitalWrite(trigPin1, LOW); // Sets the trigPin1 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin1, HIGH); // Sets the trigPin1 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin1, LOW); |
||||
|
dur1 = pulseIn(echoPin1, HIGH); // Reads the echoPin1, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin2, LOW); // Sets the trigPin2 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin2, HIGH); // Sets the trigPin2 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin2, LOW); |
||||
|
dur2 = pulseIn(echoPin2, HIGH); // Reads the echoPin2, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin3, LOW); // Sets the trigPin3 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin3, HIGH); // Sets the trigPin3 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin3, LOW); |
||||
|
dur3 = pulseIn(echoPin3, HIGH); // Reads the echoPin3, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin4, LOW); // Sets the trigPin4 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin4, HIGH); // Sets the trigPin4 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin4, LOW); |
||||
|
dur4 = pulseIn(echoPin4, HIGH); // Reads the echoPin4, returns the sound wave travel time in microseconds
|
||||
|
|
||||
|
digitalWrite(trigPin5, LOW); // Sets the trigPin5 on LOW state for 2 micro seconds
|
||||
|
delayMicroseconds(2); |
||||
|
digitalWrite(trigPin5, HIGH); // Sets the trigPin5 on HIGH state for 10 micro seconds
|
||||
|
delayMicroseconds(10); |
||||
|
digitalWrite(trigPin5, LOW); |
||||
|
dur5 = pulseIn(echoPin5, HIGH); // Sets the trigPin5 on HIGH state for 10 micro seconds
|
||||
|
|
||||
|
// Calculating the distance
|
||||
|
dis1 = (dur1 /2) / 29.1; |
||||
|
dis2 = (dur2 /2) / 29.1; |
||||
|
dis3 = (dur3 /2) / 29.1; |
||||
|
dis4 = (dur4 /2) / 29.1; |
||||
|
|
||||
|
delay(120); |
||||
|
|
||||
|
myMotor ->run(RELEASE); |
||||
|
myMotor2->run(RELEASE); |
||||
|
myMotor3->run(RELEASE); |
||||
|
myMotor4->run(RELEASE); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue