This shows you the differences between two versions of the page.
|
pm:prj2021:amocanu:smart-vacuum-cleaner [2021/04/25 21:05] catalin.mihai2109 |
pm:prj2021:amocanu:smart-vacuum-cleaner [2021/06/01 14:24] (current) catalin.mihai2109 [Bibliografie/Resurse] |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | ==== Smart vacuum cleaner ==== | + | ====== Smart Vacuum Cleaner ====== |
| + | ===== Introducere ===== | ||
| - | === Autor === | + | Prezentarea pe scurt a proiectului: |
| - | MIHAI CATALIN VALENTIN 335CC | + | * Scopul final al acestui device este de a fi un aspirator smart care aspira singur evitand obstacolele din jur. |
| + | * In momentul actual nu contine pompa de aspirat, ci doar 'carcasa' si sistemul de miscare/evitare a obstacolelor. | ||
| + | * Ideea de la care am pornit acest proiect a fost de a crea propriul aspirator smart si de-al utiliza in casa. | ||
| - | === Introducere === | + | ===== Descriere generală ===== |
| - | Prezentarea pe scurt a proiectului: | + | Cadrul circular al aspiratorului este facut dintr-o bucata de polistiren extrudat de 3cm grosime. |
| - | ce face? | + | Pe acest cadru vin prinse in holsuruburi componentele. |
| - | - aspira singur evitand obstacolele din jur | + | |
| - | care este scopul lui? | + | Pentru a porni aspiratorul, exista doua surse de alimentare: 9V respectiv 6V. Aceste surse pot fi pornite/oprite prin doua switch-uri. |
| - | - sa faca curatenie fara a avea nevoie de suport/ajutor uman | + | Odata pornita alimentarea, aspiratorul sta 5 secunde in idle asteptand ulterior un 'impuls' intr-unul din senzori pentru a porni rutina de functionare. Acesta va merge non-stop evitand obstacolele din jur. |
| - | care a fost ideea de la care aţi pornit? | + | |
| - | - dorinta de a crea propriul aspirator smart (cele existente sunt foarte scumpe :D) | + | Din pacate aveam nevoie de 4 senzori in loc de 3, deoarece exista un unghi mort in care aspiratorul se blocheaza. |
| - | de ce credeţi că este util pentru alţii şi pentru voi? | + | |
| - | - mentine curatenie in casa | + | Schema bloc: {{ :pm:prj2021:amocanu:vacuum-cleaner-block-scheeme.png |}} |
| + | |||
| + | ===== Hardware Design ===== | ||
| + | |||
| + | Lista de piese | ||
| + | * 1 x Arduino UNO R3 | ||
| + | * 1 x L293D Motor Driver | ||
| + | * 1 x Breadboard 400 | ||
| + | * 1 x Suport carcasa baterii 6xAA | ||
| + | * 1 x Suport carcasa baterii 4xAA | ||
| + | * 10 x Baterii AA Varta | ||
| + | * 1 x Ball Caster | ||
| + | * 3 x Senzor ultrasonic HC-SR04 | ||
| + | * 3 x Suport pentru senzor ultrasonic HC-SR04 | ||
| + | * 2 x Switch cu 2 pozitii | ||
| + | * 2 x Micro motor cu reducție - RPM : 60 | ||
| + | * 2 x Roata din plastic/cauciuc - Culoare : Alb | ||
| + | * 2 x Suport micro-motor | ||
| + | |||
| + | <note tip>Schema hardware:</note> | ||
| + | {{ :pm:prj2021:amocanu:smart-vacuum-cleaner_bb.png |}} | ||
| + | |||
| + | <note tip>Rezultat final:</note> | ||
| + | {{ :pm:prj2021:amocanu:smart-vacuum-cleaner-top-down.jpeg?500 |}} | ||
| + | |||
| + | ===== Software Design ===== | ||
| + | |||
| + | Mediu de dezvoltare | ||
| + | * Arduino IDE 2.0.0 - beta3 (are auto code completion) | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Librarii 3rd-party | ||
| + | * Adafruit-Motor-Shield-library ([[https://github.com/adafruit/Adafruit-Motor-Shield-library]]) | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Surse | ||
| + | * **smart_vacuum_cleaner.ino** | ||
| + | <note><code C++> | ||
| + | #include <AFMotor.h> | ||
| + | |||
| + | static constexpr int startupSleepTime = 5000; | ||
| + | static constexpr int loopSleepTime = 10; | ||
| + | |||
| + | // MOTOR DECLARATIONS | ||
| + | static AF_DCMotor motors[2] = { | ||
| + | AF_DCMotor(2, MOTOR12_1KHZ), | ||
| + | AF_DCMotor(3, MOTOR12_1KHZ) | ||
| + | }; | ||
| + | static constexpr int motorSpeed = 200; | ||
| + | static constexpr int LRTurnDelay = 1200; | ||
| + | |||
| + | // SENSOR DECLARATIONS | ||
| + | static constexpr int triggers[3] = {A0, A1, A2}, echoes[3] = {A3, A4, A5}; | ||
| + | static constexpr float speedOfSound = 0.0343; | ||
| + | static float distances[3] = {0}; | ||
| + | static float minDistance = 5.0; | ||
| + | |||
| + | enum SensorPosition { | ||
| + | FRONT_LEFT = 0, | ||
| + | FRONT_RIGHT = 2, | ||
| + | BACK = 1 | ||
| + | }; | ||
| + | |||
| + | // MOTOR FUNCTIONS | ||
| + | void initMotors() { | ||
| + | motors[0].setSpeed(motorSpeed); | ||
| + | motors[1].setSpeed(motorSpeed); | ||
| + | } | ||
| + | |||
| + | void goForward() { | ||
| + | motors[0].run(FORWARD); | ||
| + | motors[1].run(BACKWARD); | ||
| + | } | ||
| + | |||
| + | void goBackward() { | ||
| + | motors[0].run(BACKWARD); | ||
| + | motors[1].run(FORWARD); | ||
| + | } | ||
| + | |||
| + | void turnLeft() { | ||
| + | motors[0].run(BACKWARD); | ||
| + | motors[1].run(BACKWARD); | ||
| + | delay(LRTurnDelay); | ||
| + | } | ||
| + | |||
| + | void turnRight() { | ||
| + | motors[0].run(FORWARD); | ||
| + | motors[1].run(FORWARD); | ||
| + | delay(LRTurnDelay); | ||
| + | } | ||
| + | |||
| + | void brake() { | ||
| + | motors[0].run(RELEASE); | ||
| + | motors[1].run(RELEASE); | ||
| + | } | ||
| + | |||
| + | // SENSOR FUNCTIONS | ||
| + | void initSensors() { | ||
| + | for (int i = 0; i < 3; i++) { | ||
| + | pinMode(triggers[i], OUTPUT); | ||
| + | pinMode(echoes[i], INPUT); | ||
| + | } | ||
| + | } | ||
| + | |||
| + | void sendSensorsImpulse() { | ||
| + | for (int i = 0; i < 3; i++) { | ||
| + | // Trigger sensor | ||
| + | digitalWrite(triggers[i], LOW); | ||
| + | delayMicroseconds(2); | ||
| + | digitalWrite(triggers[i], HIGH); | ||
| + | delayMicroseconds(10); | ||
| + | digitalWrite(triggers[i], LOW); | ||
| + | |||
| + | // Compute distance | ||
| + | float durations = pulseIn(echoes[i], HIGH); | ||
| + | distances[i] = (durations / 2) * speedOfSound; | ||
| + | } | ||
| + | } | ||
| + | |||
| + | bool isCollision(SensorPosition pos) { | ||
| + | return distances[pos] <= minDistance; | ||
| + | } | ||
| + | |||
| + | void setup() { | ||
| + | delay(startupSleepTime); | ||
| + | |||
| + | // Enable serial debugging | ||
| + | Serial.begin(9600); | ||
| + | |||
| + | initMotors(); | ||
| + | initSensors(); | ||
| + | } | ||
| + | |||
| + | void loop() { | ||
| + | sendSensorsImpulse(); | ||
| + | |||
| + | // Check for collisions: | ||
| + | // Left and right side collision | ||
| + | if(isCollision(SensorPosition::FRONT_LEFT) && isCollision(SensorPosition::FRONT_RIGHT)) { | ||
| + | goBackward(); | ||
| + | delay(LRTurnDelay); | ||
| + | } | ||
| + | // Left side collision | ||
| + | else if(isCollision(SensorPosition::FRONT_LEFT)) { | ||
| + | turnRight(); | ||
| + | goForward(); | ||
| + | } | ||
| + | // Right side collision | ||
| + | else if(isCollision(SensorPosition::FRONT_RIGHT)) { | ||
| + | turnLeft(); | ||
| + | goForward(); | ||
| + | } | ||
| + | |||
| + | // Back side collision | ||
| + | if(isCollision(SensorPosition::BACK)) { | ||
| + | goForward(); | ||
| + | } | ||
| + | |||
| + | delay(loopSleepTime); | ||
| + | } | ||
| + | </code></note> | ||
| + | |||
| + | ---- | ||
| + | |||
| + | Detalii despre implementare | ||
| + | * Se porneste una din cele doua surse de alimentare (utilizand switchu-rile de ON/OFF) | ||
| + | * Se asteapta 5 secunde, iar pentru a porni rutina aspiratorului se atinge unul din cei trei senzori | ||
| + | * Daca unul din senzori este la distanta de cel mult 5cm de un obstacol, se calculeaza noua directie astfel: | ||
| + | * Senzorul stanga-fata (FL) => Viraj dreapta | ||
| + | * Senzorul dreapta-fata (FR) => Viraj stanga | ||
| + | * Ambii senzori fata (FL && FR)=> Mers in spate | ||
| + | * Senzorul spate (B) => Mers in fata | ||
| + | ===== Rezultate Obţinute ===== | ||
| + | |||
| + | <note tip> | ||
| + | Ce nu am reusit sa obtin: | ||
| + | * Pompa de aspirat | ||
| + | * Virtual area map | ||
| + | * Modul bluetooth | ||
| + | |||
| + | Ce am resit sa obtin: | ||
| + | * Partea mecanica (destul de complexa) | ||
| + | * Detectie obstacole si miscari simple | ||
| + | </note> | ||
| - | === Descriere generală === | + | **Videoclip demonstrativ:** |
| + | [[https://www.youtube.com/watch?v=UpZ26sFF9II|{{ :pm:prj2021:amocanu:smart-vacuum-cleaner-thumb.jpeg?500 |}}]] | ||
| - | Aspiratorul va fi capabil sa functioneze autonom si sa evite obstacolele intalnite. | ||
| - | === Schema bloc === | + | ===== Concluzii ===== |
| - | TODO | + | |
| - | === Hardware Design === | + | Partea mecanica a fost mult mai complexa decat am crezut initial. |
| + | Acest proiect m-a facut sa vreau pe viitor sa creez si alte proiecte utilizand Arduino | ||
| + | ===== Download ===== | ||
| - | Aici puneţi tot ce ţine de hardware design: | + | <note> |
| + | {{:pm:prj2021:amocanu:smart-vacuum-cleaner.zip|}} | ||
| + | </note> | ||
| - | WIP: listă de piese | + | ===== Bibliografie/Resurse ===== |
| - | - Arduino uno | + | |
| - | - 3 senzori ultrasonici | + | |
| - | - driver motor | + | |
| - | - roti | + | |
| - | - baterii | + | |
| - | - mini aspirator de birou | + | |
| - | - carton sau plastic | + | |
| - | - breadbord | + | |
| - | TODO: scheme electrice | + | |
| - | TODO: diagrame de semnal | + | |
| - | TODO: rezultatele simulării | + | |
| - | === Software Design === | + | <note> |
| + | https://learn.adafruit.com/adafruit-motor-shield-v2-for-arduino/using-dc-motors | ||
| - | TODO: Descrierea codului aplicaţiei (firmware): | + | https://create.arduino.cc/projecthub/abdularbi17/ultrasonic-sensor-hc-sr04-with-arduino-tutorial-327ff6 |
| + | </note> | ||
| + | <html><a class="media mediafile mf_pdf" href="?do=export_pdf">Export to PDF</a></html> | ||
| - | === Rezultate Obţinute === | ||
| - | TODO | ||