Browse Source

Upload files to ''

master
AutonomusParkingCar 4 years ago
parent
commit
8c063d64f9
  1. 61
      DOCUMENTATION.adoc
  2. 323
      FINAL.ino

61
DOCUMENTATION.adoc

@ -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]

323
FINAL.ino

@ -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…
Cancel
Save