Tytuł może brzmieć dość zawile, ale to dlatego aby wyjaśnić o co dokładnie chodzi. Było już wiele projektów które włączały lampę za pomocą naszego głosu ale jeszcze żadna nie wykonywała ruchów na komendę. Ktoś może pomyśleć, po co coś takiego? A no po to że czasami brakuje nam ręki podczas np. lutowania, bądź wynika to z czystego lenistwa :) Moja lampka jest dość mała, taka w sam raz na biurko ale gdyby ją zwiększyć i połączyć np. z alexą to jej przydatność napewno by wzrosła. Tak jak większość moich projektów, tak również i ten został stworzony głównie dla wartości edukacyjnych oraz aby postawić samemu sobie wyzwanie! Poniżej możecie zobaczyć filmik prezentujący jak lampa działa oraz jak może być stosowana. Pod filmem znajdziecie link do instructables, tam również projekt ten został opublikowany. Lampka została doceniona w trzech konkursach!
Link do instructables: https://www.instructables.com/id/Bluetooth-Voice-Controlled-Moving-Lamp/
Tak więc zaczynajmy budowę waszej pierwszej lampy sterowanej głosowo!
Oto co będzie nam potrzebne do budowy:
- Arduino GearBest | BangGood
- Serwa (dokładnie 3 serwa) GearBest | BangGood
- Lampa GearBest | BangGood
- Przekaźnik GearBest | BangGood
- Moduł Bluetooth GearBest | BangGood
Będziemy również potrzebowali 4 wydrukowane elementy z drukarki 3D które możecie znaleźć tutaj: https://www.thingiverse.com/thing:2527585
Kiedy macie już wszystko co potrzebne możemy przystąpić do montażu wszystkich elementów. Jest to dość proste i raczej nie da się nic pomylić poniżej dodaję dużo zdjęć z montażu krok po kroku oraz kilka podpowiedzi.
Jak zauważycie w jednym z ramion lampy jest otwór aby umieścić tam kabel z serwa oraz diody. Dzięki temu projekt lepiej się prezentuje oraz ma większą swobodę ruchu. Nie polecam drukować tego elementu z supportami gdyż ich usunięcie jest prawie niemożliwe.
Podczas zakładania ramion na serwa uważajcie bo łatwo jest je połamać. Prawdopodobnie będziecie musieli użyć trochę kleju aby mocno zaczepić ramię do serwa gdyż może się ono ślizgać mimo przykręcenia śrubą.
Aby zmieścić kabel z serwa w otworze ramienia musicie odciąć wtyczkę z serwa a następnie przylutować nieco dłuższy kabel. Do zaizolowania połączeń najlepiej użyć koszulek termokurczliwych.
Kiedy wszystko mamy już zmontowane możemy przystąpić do łączenia. Poniżej dodaję schemat z Fritizinga, jest on dość prosty dlatego każdy powinien bez problemu sobie z tym poradzić. Fritzing to świetny program dla początkujących gdyż nie potrzebujcie żadnej specjalnej wiedzy na temat schematów elektrycznych aby to połączyć. Na schemacie i zdjęciach poniżej widać, że użyłem modułu z dwoma przekaźnikami, potrzebny jest tylko jeden ale akurat taki miałem pod ręką. Jak kupujecie części specjalnie na ten projekt to pojedynczy pewnie będzie tańszy ale nie będzie pasował do obudowy. Dioda której użyłem zasilana jest 12V i taki też zasilacz jest potrzebny do jej zasilania, poza nim samo arduino zasilane jest z 5V gdyż serwa nie wytrzymały by napięcia 12V a stabilizator liniowy mocno by się przegrzewał. Oczywiście zamiast przekaźnika można by użyć tranzystora który byłby tańszy i mniejszy, ale jak już mówiłem akurat miałem przekaźniki pod ręką.
Kilka zdjęć z tego jak wygląda cały układ. Aby to wyglądało trochę lepiej wszystkie kable umieściłem w takim “wężu”, nie wiem jak się to profesjonalnie nazywa :) Póżniej zdecydowałem się an zrobienie obudowy na elektronikę, oczywiście została ona wydrukowana w 3D.
Teraz możemy wziąć się za wgranie program do Arduino, nie musicie nic w nim modyfikować, chyb że coś podłączyliście inaczej niż na moim schemacie. Oryginalnie w projekcie komendy były po angielsku ale tutaj zmieniłem je na Polskie :)
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 |
#include <Servo.h> String command; String value; //I don't know why I named them like that. Servo servo_rotation; Servo servo_tilt; Servo servo_height; int step_delay = 50; void setup() { Serial.begin(9600); servo_rotation.attach(3); servo_tilt.attach(5); servo_height.attach(6); servo_rotation.write(90); servo_tilt.write(90); servo_height.write(100); //that's for relay pinMode(7, OUTPUT); digitalWrite(7, HIGH); } void loop() { while (Serial.available()){ delay(10); char command_char = Serial.read(); if (command_char == '#') {break;} command += command_char; } if (command.length() > 0) { Serial.println(command); if(command.indexOf("*lewo") >= 0) { value = command.substring(5, command.length()); for(int a = 0; a < value.toInt(); a++){ if((servo_rotation.read()+1) >= 0 && (servo_rotation.read()+1) <= 180){ servo_rotation.write(servo_rotation.read()+1); delay(step_delay); } } } if(command.indexOf("*right") >= 0) { value = command.substring(6, command.length()); for(int a = 0; a < value.toInt(); a++){ if((servo_rotation.read()-1) >= 0 && (servo_rotation.read()-1) <= 180){ servo_rotation.write(servo_rotation.read()-1); delay(step_delay); } } } if(command.indexOf("*przód") >= 0) { value = command.substring(5, command.length()); for(int a = 0; a < value.toInt(); a++){ if((servo_tilt.read()+1) < 140 && (servo_tilt.read()+1) > 50){ servo_tilt.write(servo_tilt.read()+1); } if((servo_height.read()-1) < 150 && (servo_height.read()-1) >= 0){ servo_height.write(servo_height.read()-1); } delay(step_delay); } } if(command.indexOf("*tył") >= 0) { value = command.substring(4, command.length()); for(int a = 0; a < value.toInt(); a++){ if((servo_tilt.read()-1) < 140 && (servo_tilt.read()-1) > 50){ servo_tilt.write(servo_tilt.read()-1); } if((servo_height.read()+1) < 150 && (servo_height.read()+1) >= 0){ servo_height.write(servo_height.read()+1); } delay(step_delay); } } if(command.indexOf("*góra") >= 0) { value = command.substring(5, command.length()); for(int a = 0; a < value.toInt(); a++){ if((servo_height.read()-1) < 150 && (servo_height.read()-1) >= 0){ servo_height.write(servo_height.read()-1); delay(step_delay); } } } if(command.indexOf("*dół") >= 0) { value = command.substring(4, command.length()); for(int a = 0; a < value.toInt(); a++){ if((servo_height.read()+1) < 150 && (servo_height.read()+1) >= 0){ servo_height.write(servo_height.read()+1); delay(step_delay); } } } if(command.equals("*włącz")) { digitalWrite(7, LOW); } if(command.equals("*wyłącz")) { digitalWrite(7, HIGH); } } command=""; } |
Poza programem dla Arduino potrzebna nam jest również aplikacja na telefon która rozpozna nasze komendy i prześle do Arduino poprzez Bluetooth. Pierwsza aplikacja której używałem została niestety zdjęta z sklepu play, na szczęście jest ich dość sporo a więc podaję linka do jednej z nich poniżej.
https://play.google.com/store/apps/details?id=appinventor.ai_cempehlivan92.Arduino_Sesli_Kontrol
Jesteśmy już prawie gotowi do pierwszego uruchomienia projektu. Po podłączeniu Arduino do źródła zasilania otwórz aplikację i połącz się ze swoim modułem bluetooth. Następnie kliknij na mikrofon i wypowiedz komendę np. lewo 20 co oznacza, że lampa ma się obrócić o 20 stopni w lewo.
Tak prezentuje się końcowy projekt:
Jak wam się podoba? Dajcie znać w komentarzach!
Jeśli chcecie być na bierząco z moimi projektami zapraszam na social media:
YouTube: https://goo.gl/x6Y32E
Facebook: https://goo.gl/ZAQJXJ
Instagram: https://goo.gl/JLFLtf
Twitter: https://goo.gl/eiAecG
Dzięki za przeczytanie, pozdrawiam i miłego majsterkowania :)
Bardzo fajny projekt. Można by kiedyś było popracować nad przeniesieniem tego na mikrokontroler i dodaniem opcji sterowania głosowego bez telefonu.
Dzięki, musiałby chyba zostać przeniesiony na coś mocniejszego np Raspberry Pi, mikrokontroler chyba nie dał by rady z rozpoznawaniem głosu, nawet bardzo szybki.
Świetny projekt! Gratulacje!
Dzięki!
Super projekt!
Irytujące jest zapewne tylko to włączanie mikrofonu w telefonie.
Poza tym wszystko bardzo fajne i ciekawe :)
Dzięki! No jest i to bardzo, fajnie by było gdyby można to wywołać jakąś komendą typu “ok google” niestety nie ma takiej opcji (chciałem napisać taką aplikację ale z tego co się dowiedziałem Google nie pozwala na takie coś, używają tego tylko w swoich produktach). Ale zaciekawiła mnie ostatnio Alexa (a właściwie Amazon echo) jako sterownik inteligentnego domu i zacząłem się zastanawiać jak by to podpiąć pod Arduino i raspberry pi. Może za jakiś czas kupię sobie Echo i zacznę coś z tym kombinować, może coś fajnego się uda :)
Aplikacja Automate może podobno sterować z poleceń google. Osobiście nie sprawdzałem