Spisu treści:

Lustro do rozpoznawania twarzy z tajnym schowkiem: 15 kroków (ze zdjęciami)
Lustro do rozpoznawania twarzy z tajnym schowkiem: 15 kroków (ze zdjęciami)

Wideo: Lustro do rozpoznawania twarzy z tajnym schowkiem: 15 kroków (ze zdjęciami)

Wideo: Lustro do rozpoznawania twarzy z tajnym schowkiem: 15 kroków (ze zdjęciami)
Wideo: 6 USTAWIEŃ które MUSISZ ZMIENIĆ w Androidzie! 2024, Lipiec
Anonim
Lustro do rozpoznawania twarzy z tajnym schowkiem
Lustro do rozpoznawania twarzy z tajnym schowkiem
Lustro do rozpoznawania twarzy z tajnym schowkiem
Lustro do rozpoznawania twarzy z tajnym schowkiem
Lustro do rozpoznawania twarzy z tajnym schowkiem
Lustro do rozpoznawania twarzy z tajnym schowkiem

Zawsze intrygowały mnie zawsze kreatywne tajne przegródki używane w opowiadaniach, filmach i tym podobnych. Tak więc, kiedy zobaczyłem Konkurs Sekretnego Przedziału, postanowiłem sam poeksperymentować z tym pomysłem i zrobić zwyczajnie wyglądające lustro, które otwiera tajną boczną szufladę, gdy zajrzy do niego właściwa osoba.

Wykorzystując Raspberry Pi, pewną wiedzę na temat programowania w Pythonie i klasę sklepu 8. klasy, możemy stworzyć to sprytne urządzenie do ukrywania obiektów na widoku, do których dostęp będzie miał tylko właściwy użytkownik.

Chciałbym szczególnie podziękować tym osobom/platformom, od których również otrzymałem moje informacje i zasoby:

TeCoEd - kanał Youtube

Emmet z PiMyLifeUp

MJRoBot na Hackster.io (profil)

Gaven MacDonald - Kanał Youtube

Tucker Shannon na Thingiverse (profil)

Kieszonkowe dzieci

Dostawy ramek:

  • Deska drewniana (wymiary tej deski wynosiły 42 "na 7,5" na 5/16")
  • Ołówek Ramka Na Zdjęcia (ze szkłem)
  • Farba w sprayu
  • Jednokierunkowy klej odblaskowy
  • Środek do czyszczenia szkła i szmata
  • Drewno MDF

Materiały do rozpoznawania twarzy:

  • Raspberry Pi (użyłem Pi 3 B+, ale są inne opcje)
  • Moduł kamery
  • Silnik krokowy

Narzędzia:

  • Piła stołowa
  • Puzzle
  • Papier ściernyDrewno
  • KlejTaśma
  • Mierzyć
  • Nożyce
  • Butelka z rozpylaczem
  • drukarka 3d
  • Super klej

Krok 1: Cięcia na ramę pudełka

Cięcia na ramę pudełka
Cięcia na ramę pudełka
Cięcia na ramę pudełka
Cięcia na ramę pudełka
Cięcia na ramę pudełka
Cięcia na ramę pudełka
Cięcia na ramę pudełka
Cięcia na ramę pudełka

Kupiłem ramkę do zdjęć w sklepie z używanymi rzeczami. Tylko ostrzeżenie, upewnij się, że deski tworzące ramę mają co najmniej 1 1/2 cala szerokości. Dzięki temu możesz przykleić do niej inne drewniane deski z wystarczającą ilością miejsca do pracy. Upewnij się również, że szkło jest ramka jest całkowicie przezroczysta. Kupiłem matową przez przypadek, a następnie musiałem kupić inną ramkę tylko do przezroczystego szkła. Ponieważ moja ramka jest używana, wymiary ramy pudełka mogą się różnić.

  • Połóż ramkę w orientacji pionowej. Zmierz długie boki (LS) strony otworu szklanego na ramie z dodatkowymi ½”na górze i na dole. (tj. dodaj cal do dłuższego boku pomiaru otworu szklanego. Zapisz to i oznacz LSM (Long Side Measurement).
  • Podobnie zmierz górną stronę otworu i dodaj dodatkowy 1”. Zapisz to i oznacz SSM (pomiar krótkiego boku).
  • Weź swoją deskę i za pomocą piły stołowej wytnij dwa LSM x 2” i dwa SSM x 2”.
  • Weź jedno z cięć LSM i zmierz prostokąt 2”x1”, który ma 1” od dołu i ½” od lewej i prawej strony (jak pokazano na rysunku 3).
  • Użyj wyrzynarki, aby wyciąć otwór. Następnie użyj papieru ściernego, aby zeszlifować krawędzie.

Krok 2: Cięcia do szuflady

Cięcia do szuflady
Cięcia do szuflady
Cięcia do szuflady
Cięcia do szuflady
Cięcia do szuflady
Cięcia do szuflady
Cięcia do szuflady
Cięcia do szuflady

Teraz zaczniemy budować szufladę (tzw. Secret Compartment).

  • Wytnij dwa boki 4”x 1”, 3 ⅜” x 1” (tylna krawędź), 4 ¼” x 1 ¼” (przednia krawędź) i 4” x 3 ⅜” (platforma).
  • Przyklej pierwszy bok 4” x 1” wzdłuż boku 4” platformy. Umieściłem kilka złożonych papierów pod bokiem platformy, aby był lekko podniesiony, aby nie ciągnął się po dziurze, którą wyciąłem w desce LS. Pozostaw do wyschnięcia na 30 minut.
  • Podobnie przyklej 3 ⅜” x 1” wzdłuż krawędzi 3 ⅜” platformy. Pozostaw do wyschnięcia na 30 minut. Następnie przyklej drugą stronę 4” x 1” po przeciwnej stronie pierwszego. Pozostaw do wyschnięcia na 30 minut.
  • Na razie odłóż na bok przednią krawędź. Będzie to ostatnia rzecz przyklejona do szuflady.
  • Po zakończeniu sprawdź, czy pasuje do otworu, który wyrzynałeś w desce LSM. Jeśli nie, wyszlifuj otwór, aż szuflada będzie się łatwo wsuwać i wysuwać, i nie ma oporu.

Krok 3: Łączenie ramki

Składanie ramy razem
Składanie ramy razem
Składanie ramy razem
Składanie ramy razem
Składanie ramy razem
Składanie ramy razem

Po skompletowaniu wszystkich części możemy przystąpić do montażu całości ramy.

  • Przyklej deskę LSM wyśrodkowaną ze szklanym otworem z ½” z każdej strony. Upewnij się, że jest przyklejony w odległości ½” od otworu (jak pokazano na rysunku 1). Pozostaw do wyschnięcia na 30 minut.
  • Przyklej pierwszą deskę SSM tak, aby krawędź dotykała wnętrza deski LSM, która została właśnie przyklejona. (Użyj linijki, aby upewnić się, że jest przyklejona prosto). Pozostaw do wyschnięcia na 30 minut.
  • Weź drugą stronę LSM i sklej podobnie jak pierwsza. Upewnij się, że znajduje się w odległości ½ cala od otworu i że właśnie przymocowany SSM jest przyklejony po wewnętrznej stronie deski. Pozostaw do wyschnięcia na 30 minut.
  • Przyklej ostatni SSM na górnej krawędzi. Ponieważ masz dwa LSM po obu stronach, w zależności od tego, jak prosto je przymocowałeś, może być konieczne szlifowanie boków SSM, aby upewnić się, że pasuje (moje cięcie jest czasami wyłączone). Pozostaw do wyschnięcia na 30 minut.
  • Zmierz niewielką przestrzeń między dnem szuflady a ramą. Wytnij kawałek drewna MDF o tym wymiarze na 4 cale. Chcesz, aby ten kawałek był blisko szuflady, ale go nie dotykał. Ma to na celu podtrzymanie szuflady przy minimalnym tarciu.
  • Kiedy wszystko było gotowe, pomalowałem ramę natryskowo, aby wszystkie elementy pasowały.

Krok 4: Do lustra

Do lustra
Do lustra
Do lustra
Do lustra
Do lustra
Do lustra
Do lustra
Do lustra

Jednorazowy klej do folii, który kupiłem od Amazona, kosztował około 10 USD. Istnieją lepszej jakości, które są trochę droższe, jeśli jesteś zainteresowany. To, którego używam, odbija, ale możesz powiedzieć, że nie jest to zwykłe lustro, które widziałbyś w domu. Te droższe zapewnią ci taki wygląd.

  • Wyczyść szybę środkiem do czyszczenia szyb po obu stronach.
  • Rozwiń klej jednokierunkowy i połóż szkło na wierzchu. Wytnij klej tak, aby z każdej strony szkła pozostał co najmniej ½ cala nadmiaru.
  • Odstaw szklankę na bok i zwilż jedną stronę wodą. Następnie zdejmij plastikową powłokę z kleju jednokierunkowego i spryskaj wodą nowo odsłoniętą stronę.
  • Umieść mokrą stronę szkła na mokrej stronie kleju. Odstaw na 30 minut.
  • Odwróć się i użyj kciuka, aby spłaszczyć wszelkie bąbelki między klejem a szkłem. Następnie odetnij nadmiar kleju wokół krawędzi.

Krok 5: Zainstaluj Raspbian Stretch

To był mój pierwszy raz, kiedy zagłębiałem się w środowisko Raspberry Pi, zacząłem szukać instrukcji, jak zainstalować system operacyjny. W końcu znalazłem prosty samouczek na Youtube autorstwa TeCoEd, który przeszedł przez proces instalowania Stretch na karcie SD (z dość uroczym wprowadzeniem). Oto link do tego samouczka:

Zasadniczo wszystko, co musisz zrobić, to:

  • Sformatuj kartę SD, wybierając Dysk >> Narzędzia Dysku >> Format. Pobierz plik ZIP dla Raspian Stretch (tutaj:
  • Prześlij obraz systemu operacyjnego na kartę SD. TeCoEd użył programu Win32 Disk Imager, aby to zakończyć. Skończyło się na zainstalowaniu balenaEtcher, co wydawało się nieco prostsze. (Oto link do pobrania balenaEtcher:
  • W balenaEtcher wybierz „Flash From File” i wybierz wcześniej pobrany plik ZIP. Następnie wybierz żądaną kartę SD (jeśli nie została wybrana automatycznie). Następnie naciśnij przycisk soczystego błysku i poczekaj, aż wydarzy się magia.

Po zainstalowaniu na karcie SD możesz włożyć ją do Raspberry Pi i przejść przez ogólny proces konfiguracji Pi.

Krok 6: Zainstaluj OpenCV

Teraz przejdźmy do części bardziej zorientowanych na rozpoznawanie twarzy. Aby rozpoznawać twarze, musimy pobrać bibliotekę OpenCV, która zawiera ogromną liczbę narzędzi do pracy z komputerowym widzeniem.

Instalacja OpenCV była dla mnie najbardziej żmudną częścią aspektu oprogramowania. Ale po wykonaniu licznych instrukcji w końcu znalazłem samouczek autorstwa Emmeta z PiMyLifeUp, który załatwił sprawę, którą można znaleźć tutaj:

Nie będę przechodził przez te kroki, ponieważ lepiej będzie Ci odpowiadać, korzystając z linku (z podanymi wyjaśnieniami i możliwością łatwiejszego kopiowania i wklejania bezpośrednio ze strony).

Krok 7: Włącz/przetestuj kamerę

Włącz/przetestuj kamerę
Włącz/przetestuj kamerę
Włącz/przetestuj kamerę
Włącz/przetestuj kamerę

Po zainstalowaniu OpenCV reszta mojej podróży została zakończona przy użyciu samouczka MJRoBot na Hackster.io, który można znaleźć tutaj:

Zanim zaczniemy, chciałbym przypomnieć, że nie jestem oryginalnym twórcą tych skryptów, ale ostatecznie zmodyfikowałem ich części.

Na początek powinniśmy przetestować kamerę, aby upewnić się, że możemy przechwycić wideo na ekranie. Spędziłem około godziny próbując uruchomić skrypt dostarczony w kroku 3 MJRoBot. Jak by się wydawało, musimy włączyć kamerę na Raspberry Pi (okazuje się, że dobrym pomysłem może być zapoznanie się z dostarczoną instrukcją…mmm nah). Więc po podłączeniu kamery do odpowiedniego portu wykonaj następujące czynności:

  • Otwórz terminal poleceń i wpisz sudo raspi-config
  • Wybierz „Włącz aparat” (można go znaleźć w opcji urządzeń)
  • Wciśnij Enter"
  • Przejdź do „Zakończ” i zostaniesz poproszony o ponowne uruchomienie

Następnie wykonaj następujące kroki:

  • Przejdź do menu głównego Raspberry (u góry po lewej)
  • Preferencje
  • Konfiguracja Raspberry Pi
  • Interfejsy
  • Następnie w aparacie wybierz „Włączone”
  • Więc dobrze"

Teraz powinieneś być w stanie pomyślnie uruchomić ten skrypt z samouczka MJRoBot, aby przetestować kamerę (pamiętaj, że cały ten kod wraz z bardziej szczegółowym opisem znajduje się w podanym powyżej linku do samouczka MJRobota):

importuj numer jako np

import cv2 cap = cv2. VideoCapture(0) cap.set(3, 640) # ustaw szerokość cap.set(4, 480) # ustaw wysokość while(True): ret, frame = cap.read() frame = cv2. flip(ramka, -1) # Odwróć kamerę pionowo szary = cv2.cvtColor(ramka, cv2. COLOR_BGR2GRAY) cv2.imshow('ramka', ramka) cv2.imshow('szary', szary) k = cv2.waitKey(30) & 0xff if k == 27: # naciśnij 'ESC', aby zakończyć break cap.release() cv2.destroyAllWindows()

Poprzedni kod powinien wyświetlać dwa okna, jedno w kolorze, a drugie w skali szarości. Jeśli dotarłeś tak daleko, myślę, że zasługujesz na dobrą kanapkę.

Krok 8: Zbieranie danych i dane treningowe

Zbieranie danych i dane treningowe
Zbieranie danych i dane treningowe
Zbieranie danych i dane treningowe
Zbieranie danych i dane treningowe
Zbieranie danych i dane treningowe
Zbieranie danych i dane treningowe

W dostarczonym samouczku autor zagłębia się w proces kodu, który wkrótce zostanie udostępniony, ale ponieważ są to instrukcje dotyczące tego, jak powstał ten mirror, nie będę zagłębiał się w historię ani skomplikowaną mechanikę. Polecam jednak poświęcić miesiąc swojego życia na czytanie o tych dwóch rzeczach, ponieważ mogą one dobrze służyć twojemu umysłowi.

Do uruchomienia są jeszcze tylko trzy skrypty, zanim wszystko zacznie działać. Pierwszy służy do zbierania danych, drugi do ich trenowania, a ostatni do rozpoznawania. Zbieranie danych wymaga wykonania rzeczywistych zdjęć twarzy i przechowywania ich w określonym miejscu do treningu. Twórca tego kodu bardzo ułatwił wykonanie tego wszystkiego, więc polecam postępować zgodnie z tymi instrukcjami, aby uniknąć bólu głowy.

Otwórz wiersz poleceń i stwórz nowy katalog, nazywając go czymś zabawnym (nazwałem mój FaceRec)

mkdir FaceRec

Teraz zmień katalog na FaceRec i utwórz podkatalog, pamiętając o nazwie dataset

cd FaceRec

zbiór danych mkdir

Skoro już przy tym jesteśmy, możemy również stworzyć drugi podkatalog o nazwie trainer

trener mkdir

Teraz możesz uruchomić i postępować zgodnie ze wskazówkami pierwszego skryptu, który przechwyci zdjęcia użytkownika. (Uwaga, pamiętaj, aby wprowadzić identyfikator użytkownika jako 1, 2, 3 itd.)

import cv2import os cam = cv2. VideoCapture(0) cam.set(3, 640) # ustaw szerokość wideo cam.set(4, 480) # ustaw wysokość wideo face_detector = cv2. CascadeClassifier('haarcascade_frontalface_default.xml') # Dla każdego osoba, wprowadź jeden numeryczny identyfikator twarzy face_id = input('\n wprowadź identyfikator użytkownika koniec naciśnij ==> ') print("\n [INFO] Inicjowanie przechwytywania twarzy. Spójrz w kamerę i poczekaj …") # Zainicjuj indywidualną liczbę próbkowanych twarzy count = 0 while(True): ret, img = cam.read() img = cv2.flip(img, -1) # odwróć obraz wideo pionowo szary = cv2.cvtColor(img, cv2. COLOR_BGR2GRAY) faces = face_detector.detectMultiScale (szary, 1,3, 5) dla (x, y, w, h) w ścianach: cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2) count += 1 # Zapisz przechwycony obraz w folderze zestawów danych cv2.imwrite("dataset/User." + str(face_id) + '.' + str(count) + ".jpg", gray[y:y +h, x:x+w]) cv2.imshow('image', img) k = cv2.waitKey(100) & 0xff # Naciśnij 'ESC', aby wyjść z wideo, jeśli k == 27: złam licznik elif >= 30: # Weź 30 próbek twarzy i zatrzymaj wyświetlanie wideo k print("\n [INFO] Wychodzenie z programu i czyszczenie") cam.release() cv2.destroyAllWindows()

W tym momencie upewnij się, że zainstalowałeś poduszkę na Pi. Jeśli nie, uruchom polecenie:

pip zainstalować poduszkę

Po zakończeniu możesz uruchomić skrypt szkoleniowy (drugi skrypt), który bezproblemowo dostarczy ci plik.yaml, który zostanie użyty w końcowym skrypcie

import cv2import numpy as np z PIL import Image import os # Ścieżka do bazy danych obrazu twarzy path = 'dataset' rozpoznawany = cv2.face. LBPFFaceRecognizer_create() detektor = cv2. CascadeClassifier("haarcascade_frontalface_default.xml"); # funkcja do pobierania obrazów i danych etykiet def getImagesAndLabels(path): imagePaths = [os.path.join(path, f) for f in os.listdir(path)] faceSamples= ids = for imagePath in imagePaths: PIL_img = Image.open(imagePath).convert('L') # przekonwertuj go na skalę szarości img_numpy = np.array(PIL_img, 'uint8') id = int(os.path.split(imagePath)[-1]. split(".")[1]) twarze = detektor.detectMultiScale(img_numpy) for (x, y, w, h) w twarzach: faceSamples.append(img_numpy[y:y+h, x:x+w]) ids.append(id) return faceSamples, ids print ("\n [INFO] Szkolenie twarzy. Zajmie to kilka sekund. Poczekaj…") faces, ids = getImagesAndLabels(path)cognizer.train(faces, np.array(ids)) # Zapisz model w trainer/trainer.ymlcognizr.write('trainer/trainer.yml') #cognizer.save() działało na Macu, ale nie na Pi # Wydrukuj liczbę wytrenowanych twarzy i wydrukuj program końcowy ("\n [INFO] {0} twarze wytrenowane. Kończę program.format(len(np.unique(ids))))

Fajne w tym zestawie skryptów jest to, że do systemu można wprowadzić wiele twarzy, co oznacza, że w razie potrzeby wiele osób może uzyskać dostęp do wnętrza lustra.

Poniżej mam do pobrania skrypt przechwytywania danych i skrypt szkoleniowy.

Krok 9: Czas rozpoznawania twarzy

Czas rozpoznawania twarzy
Czas rozpoznawania twarzy
Czas rozpoznawania twarzy
Czas rozpoznawania twarzy

Na koniec możemy uruchomić skrypt rozpoznawania. Do tego skryptu dodano więcej kodu, aby uczynić proces motoryczny funkcjonalnym, więc wyjaśnię te części nieco dokładniej. Podzielę go na sekcje, ale cały skrypt umieszczę na końcu kroku, jeśli o to Ci chodzi.

Zaczniemy od zaimportowania wszystkich potrzebnych nam modułów, a następnie ustawienia trybu GPIO na GPIO. BCM

importuj numer jako np

import systemu operacyjnego import czasu import RPi. GPIO jako GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO. BCM)

Kolejna lista o nazwie ControlPin to tablica liczb reprezentująca piny wyjściowe, które będą używane przez nasz silnik krokowy.

Pin kontrolny = [14, 15, 18, 23]

Pętla for ustawia te piny jako wyjścia, a następnie upewnia się, że są wyłączone. Wciąż mam tu trochę kodu, który pozwala szufladzie zamknąć się za naciśnięciem przycisku, ale zamiast tego zdecydowałem się użyć timera.

GPIO.setup(ControlPin, GPIO. OUT)

GPIO.output(ControlPin, 0) GPIO.setup(2, GPIO. IN, pull_up_down=GPIO. PUD_DOWN)

Kolejne dwie zmienne to sekwencje, których użyjemy do sterowania silnikiem. Dowiedziałem się tych informacji ze wspaniałego filmu Gavena MacDonalda, który gorąco polecam, ponieważ zagłębia się nie tylko w kod, ale także o silnik (znajdziesz tutaj: https://www.youtube.com/embed/Dc16mKFA7Fo). Zasadniczo każda sekwencja będzie iterowana przez użycie zagnieżdżonych pętli for w nadchodzących funkcjach openComp i closeComp. Jeśli przyjrzysz się uważnie, sekwencja 2 jest dokładnym przeciwieństwem sekw1. Tak, zgadłeś. Jeden służy do przesuwania silnika do przodu, a drugi do tyłu.

seq1 =

seq2 =

Zaczynając od naszej funkcji openComp, tworzymy pętlę for, która będzie iterować 1024 razy. Zgodnie z filmem MacDonalda 512 iteracji zapewni pełny obrót silnika i stwierdziłem, że około dwa obroty to dobra długość, ale można to dostosować w zależności od rozmiaru jednostki. Następna pętla for składa się z 8 iteracji w celu uwzględnienia 8 tablic znalezionych w seq1 i seq2. I wreszcie, ostatnia pętla for iteruje cztery razy dla czterech elementów, które znajdują się w każdej z tych tablic, a także 4 pinów GPIO, do których podłączony jest nasz silnik. Wiersz poniżej wybiera pin GPIO, a następnie włącza go lub wyłącza w zależności od tego, która iteracja jest włączona. Linia po zapewnia pewien czas buforowania, aby nasz silnik w ogóle się nie obracał. Po obróceniu się silnika w celu wyciągnięcia szuflady, szuflada śpi przez 5 sekund przed przejściem dalej. Ten czas można dostosować tutaj lub włączyć zakomentowany kod, który pozwala na użycie przycisku do przesyłania dalej ze skryptem zamiast timera.

dla i w zakresie (1024):

for halfstep in range(8): for pin in range(4): GPIO.output(ControlPin[pin], seq1[halfstep] [pin]) time.sleep(.001) '''while True: if GPIO.input (2) == GPIO. LOW: przerwa;''' time.sleep(5)

W podobny sposób działa funkcja closeComp. Po cofnięciu silnika ustawiam nasze ostatnie piny GPIO na niskie, aby upewnić się, że nie marnujemy energii, a następnie dodaję jeszcze trzy sekundy przed przejściem.

dla i w zakresie (1024):

for halfstep in range(8): for pin in range(4): GPIO.output(ControlPin[pin], seq2[halfstep] [pin]) time.sleep(.001) print("Compartment Closed") GPIO.output (ControlPin[0], 0) GPIO.output(ControlPin[3], 0) time.sleep(3)

Większa część następnej części służy do konfiguracji aparatu i rozpoczęcia rozpoznawania twarzy. Ponownie, instrukcje MKRoBot dotyczą bardziej części, ale na razie pokazuję tylko części użyte do lustra.

Najpierw zmieniłem nazwy list, aby moje nazwisko znalazło się w indeksie, który przypisałem podczas zbierania danych (w moim przypadku 1). A następnie ustawiłem pozostałe wartości na Brak, ponieważ nie miałem więcej twarzy w zestawie danych.

imiona = ['Brak', 'Daniel', 'Brak', 'Brak', 'Brak', 'Brak']

Kilka ostatnich linijek kodu zostało zaimplementowanych w grubej pętli for. Utworzyłem zmienną, aby przechowywać zaufanie jako liczbę całkowitą (intConfidence), zanim zmienna pewność zostanie przekształcona w ciąg. Następnie używam instrukcji if, aby sprawdzić, czy zaufanie jest większe niż 30 i czy identyfikator (którą osobę wykrywa komputer, w tym przypadku „Daniel”) jest taki sam, jak moje imię i nazwisko. Po potwierdzeniu wywoływana jest funkcja openComp, która (jak wyjaśniono wcześniej) porusza silnikiem, uruchamia się po 5 sekundach, a następnie przechodzi do closeComp, która przesuwa silnik w przeciwnym kierunku i wykonuje pewne czyszczenie przed przejściem do grubej pętli.

if intConfidence > 30 i id == 'Daniel':

openComp() closeComp()

Błąd, który tu znalazłem, polega na tym, że czasami po powrocie closeComp kod jest kontynuowany, ale warunkowa instrukcja if jest znowu prawdziwa, tak jakby odczytywał kanał wideo, który wciąż znajduje się w buforze. Chociaż nie zdarza się to za każdym razem, jeszcze nie znalazłem sposobu, aby to się nigdy nie wydarzyło, więc jeśli ktoś ma jakieś pomysły, po prostu daj mi znać w komentarzach.

Oto cały skrypt w jednym miejscu (a tuż pod nim jest do pobrania):

importuj cv2

import numpy jako np import os import czasu import RPi. GPIO jako GPIO GPIO.setwarnings(False) GPIO.setmode(GPIO. BCM) ControlPin = [14, 15, 18, 23] for i in range(4): GPIO.setup (ControlPin, GPIO. OUT) GPIO.output(ControlPin, 0) GPIO.setup(2, GPIO. IN, pull_up_down=GPIO. PUD_DOWN) seq1 =

Krok 10: Montaż Pi i podłączenie silnika

Montaż Pi i podłączanie silnika
Montaż Pi i podłączanie silnika
Montaż Pi i podłączanie silnika
Montaż Pi i podłączanie silnika
Montaż Pi i podłączanie silnika
Montaż Pi i podłączanie silnika

Montaż Raspberry Pi do ramy był dość prosty. Zaprojektowałem mały łokieć 90 stopni, z jedną twarzą mającą dziurę, a drugą całkowicie płaską. Po wydrukowaniu 3D dwa z nich można przymocować śrubami do Raspberry Pi w jego otworach montażowych (użyłem dwóch otworów po każdej stronie pinów GPIO).

Następnie przystąpiłem do użycia super kleju na przeciwległych powierzchniach wydrukowanych łokci 3D, aby przykleić Pi tuż nad szufladą na ramie. Po wyschnięciu kleju mogłem łatwo i wygodnie wyjąć lub wymienić Pi na miejscu za pomocą tylko dwóch śrub. Mam.stl dla łokcia połączonego poniżej.

Teraz po prostu podłącz sterownik silnika do PI z IN1, IN2, IN3, IN4 podłączonym odpowiednio do GPIO 14, 15, 18, 23. Na koniec podłącz styki 5 V i uziemienia płyty kontrolera do wyjścia 5 V i styków uziemienia Pi.

Oto link do Pinout Pi w celach informacyjnych:

Krok 11: Montaż kamery

Montaż kamery
Montaż kamery
Montaż kamery
Montaż kamery
Montaż kamery
Montaż kamery

Montaż kamery był nieco mniej wytrzymały niż Pi, ale metoda wykonała zadanie. Po zaprojektowaniu i wydrukowaniu cienkiej belki z 2 otworami na każdym końcu przymocowałem belkę do Rasberry Pi przez otwór montażowy. Następnie wystarczy przymocować kamerę do przeciwległego końca belki za pomocą innej śruby. Ta-da! Ładnie wygląda.

Krok 12: Tworzenie i montaż mechanizmu przesuwania szuflad

Tworzenie i montaż mechanizmu przesuwania szuflad
Tworzenie i montaż mechanizmu przesuwania szuflad
Tworzenie i montaż mechanizmu przesuwania szuflad
Tworzenie i montaż mechanizmu przesuwania szuflad
Tworzenie i montaż mechanizmu przesuwania szuflad
Tworzenie i montaż mechanizmu przesuwania szuflad

Ten krok został ułatwiony dzięki zawsze życzliwym darom społeczności twórców. Po szybkim przeszukaniu Thingiverse udało mi się znaleźć siłownik liniowy stworzony przez TucksProjects (tutaj: https://www.thingiverse.com/thing:2987762). Pozostało tylko wrzucić go na kartę SD i pozwolić drukarce wykonać pracę.

Skończyło się na tym, że wszedłem do Fusion 360 i edytowałem ostrogę, ponieważ wał mojego silnika był zbyt duży dla tego dostarczonego przez TucksProjects. Mam do tego.stl poniżej. Po wykonaniu wydruku wystarczy go zmontować, umieszczając ostrogę na wale silnika, a następnie przykręcając boki silnika i obudowy 2 śrubami (upewniając się, że stelaż został włożony pomiędzy przed zamknięciem). Skończyło się na tym, że musiałem odciąć półkę o cal, aby zmieściła się między szufladą a ramą.

Teraz pozostaje już tylko przymocować mechanizm do ramy i szuflady. „Ale jak to zrobimy?” pytasz… tak, powiedz to ze mną: Super Glue. Jak pokazano na powyższych zdjęciach, wystarczy przyłożyć mechanizm do dolnej części ramy i docisnąć go do kawałka drewna, po którym przesuwa się szuflada. Bardzo ważne jest, aby postarać się, aby zębatka/mechanizm była jak najbardziej równoległa do ramy, aby podczas ruchu mechanizm przesuwał szufladę prosto, a nie pod kątem. Po wyschnięciu kleju umieść jeszcze trochę kleju na krawędzi stojaka, przesuń szufladę na miejsce i pozostaw do wyschnięcia. Po zakończeniu mamy solidny mechanizm do wsuwania i wysuwania naszej tajnej szuflady.

Krok 13: Dodawanie kartonu za lustrem

Dodawanie kartonu za lustrem
Dodawanie kartonu za lustrem
Dodawanie kartonu za lustrem
Dodawanie kartonu za lustrem
Dodawanie kartonu za lustrem
Dodawanie kartonu za lustrem

Aby ten dwukierunkowy film wyglądał bardziej jak lustro, stwierdziłem, że dobrze służy nam umieszczenie kartonu za szkłem. Użyty karton to taki, który był dostarczany z ramą, ale każdy kawałek przycięty w celu dopasowania będzie działał. Zapewnia to również brak światła z diody LED kamery, sterownika silnika lub Pi pokazuje po drugiej stronie lustra. Gdy wszystko jest na swoim miejscu, zaznacz ołówkiem, gdzie na kartonie znajduje się aparat. Następnie użyj brzytwy, aby wyciąć prostokąt, aby kamera mogła zajrzeć, gdy jest na miejscu.

Krok 14: Zakładanie ostatniego kawałka

Zakładanie ostatniego kawałka
Zakładanie ostatniego kawałka
Zakładanie ostatniego kawałka
Zakładanie ostatniego kawałka

Ostatnią rzeczą do zrobienia jest założenie frontowej części szuflady, która została wcześniej odłożona. Przesuń silnik tak, aby szuflada wystawała. Następnie przyklej przednią część tak, aby element szuflady był wyśrodkowany (powinno być trochę zwisu ze wszystkich stron. Następnie możesz po prostu powiesić go na ścianie.

Krok 15: Finał

Finał
Finał
Finał
Finał

Masz to! Można wprowadzić kilka ulepszeń, takich jak dodanie tego przycisku, zakup lepszej folii dwukierunkowej i naprawienie tego błędu w kodzie, ale w sumie to działa: wygląda jak lustro, rozpoznaje z góry określone twarz użytkownika i otwiera tę uroczą małą szufladę. Jak zawsze chciałbym usłyszeć wasze przemyślenia, pytania i wspomnienia w komentarzach poniżej.

Ogólna ocena: 10/10

Komentarze: #WouldNotTryAgain…chyba że mógłbym postępować zgodnie z instrukcjami;)

Wyzwanie tajnego przedziału
Wyzwanie tajnego przedziału
Wyzwanie tajnego przedziału
Wyzwanie tajnego przedziału

Wielka Nagroda w Wyzwaniu Tajnego Przedziału

Zalecana: