Spisu treści:
- Kieszonkowe dzieci
- Krok 1: Zbuduj
- Krok 2: Aparat
- Krok 3: Monitoruj
- Krok 4: Dekorowanie
- Krok 5: Programowanie
- Krok 6: Przygotowanie Raspberry PI
- Krok 7: Oprogramowanie
- Krok 8: Programowanie - Podgląd kamery
- Krok 9: Programowanie - przycisk z dużą kopułą
- Krok 10: Opublikuj na Twitterze
- Krok 11: Łączenie niektórych elementów
- Krok 12: Okablowanie
- Krok 13: MagicBox
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Jakiś czas temu wpadłem na szalony pomysł stworzenia maszyny fotograficznej z Raspberry PI. W moim mieście był mały pokaz, na który ludzie chodzili i pokazywali, co robią lub co zrobili, używając elektroniki, komputerów itp. Byłem jak Maker Faire dla biedaka, ale w lokalnym zasięgu.
Nadchodził jeden i razem z żoną budujemy to.
Jak to działa ?
Naciskasz niebieski przycisk - zaczyna migać - i po 3 sekundach robi się zdjęcie. Po drugiej stronie aparatu znajduje się monitor pokazujący odliczanie i po wykonaniu zdjęcia podgląd zdjęcia.
Możesz teraz wysłać go do Twittera i Facebooka lub anulować i spróbować ponownie. To takie proste.
Wszystko jest zaprogramowane w Pythonie, korzystając z bufora ramki PI - bez Xorg, bez GUI.
Oto wideo z pracy projektu
Kieszonkowe dzieci
- Raspberry PI (używam wersji 2)
- Kamera Raspberry PI (przy użyciu wersji 1)
- 3x przyciski z dużą kopułą
- Monitor TFT/LCD z VGA/HDMI
- MDF
- Zawiasy metalowe, śruby itp.
- Elektronarzędzia
- Wolny czas i dużo zabawy
Krok 1: Zbuduj
Budowanie tego było zabawne. Dużo cięcia, malowania i wiercenia.
Do budowy podstawowej konstrukcji kamery użyłem płyt MDF. Są lekkie i łatwe w obróbce. Ponadto był to jeden rodzaj drewna, który maszyna laserowa w lokalnym Fablabie była w stanie ciąć.
Dostęp do okablowania wewnątrz wykonano od strony monitora, za pomocą zawiasów hydraulicznych, aby ułatwić podnoszenie monitora.
Krok 2: Aparat
Kamera
Aparat to pudełko o wymiarach: 60cm x 40cm x 30cm Twój może być mniejszy, większy, to zależy od Ciebie. Wystarczy pomieścić monitor, którego będziesz używać. Panele MDF zostały wycięte laserowo w lokalnym Fablabie. Z tyłu potrzebne są 3 otwory - dwa duże przyciski kopułkowe i jeden na monitor. Z przodu 2 otwory - jeden na duży przycisk kopułkowy, drugi - mniejszy - na kamerę Raspberry PI. Nie mam konkretnych pomiarów - wyobraź sobie aparat i użyj go.
Krok 3: Monitoruj
Monitor
Podstawa monitora została wykonana poprzez dodanie małych kawałków drewna, aby utrzymać ją w swoich wymiarach.
Zdjęto go z plastikowej obudowy i zabezpieczono śrubami. Aby ułatwić jego podnoszenie, zastosowano dwa zawiasy hydrauliczne (używane).
Krok 4: Dekorowanie
Ponieważ bardzo podoba mi się styl mojej Fuji X-T30, zrobiliśmy coś podobnego.
Najpierw pokryliśmy go pianką, a następnie pomalowaliśmy natryskowo na czarno. Po malowaniu dodaliśmy folię aluminiową na srebrne części i zawijaliśmy ją w
Aby zasymulować obiektyw, użyliśmy okrągłego Tupperware, w którym zrobiliśmy mały otwór na moduł kamery Raspberry PI.
Krok 5: Programowanie
Programowanie kamery było wyzwaniem, ale było super zabawą.
Nie ma GUI - działa na CLI i działa na Pythonie w wersji 3.
Zacząłem od testowania i programowania przycisków, następnie robiłem zdjęcia za pomocą dostarczonych narzędzi i API Pythona. Następnie przeszedłem do nakładania zdjęć na wyjściu aparatu (do odliczania), a następnie do interakcji z Twitterem i Facebookiem.
Po tym, jak czułem się z tym dobrze, jak puzzle, połączyłem wszystkie elementy razem. Tutaj idziemy z tym samym procesem. Zacznij powoli i powoli, a potem szybko i szybko.
Najpierw zacznijmy od konfiguracji Raspberry PI
Krok 6: Przygotowanie Raspberry PI
Nie zamierzam wyjaśniać, jak zainstalować Raspbian na Raspberry PI - jest tam wiele samouczków, nawet na oficjalnej stronie Raspberry PI.
Wystarczy mieć do niego dostęp SSH lub podłączyć go do monitora i podłączyć klawiaturę i mysz.
UWAGA: Rozpoczynając od kamery Raspberry PI, musisz ją podłączyć do monitora. Do tego czasu wszystkie kroki można wykonać za pomocą SSH.
Po uruchomieniu w Raspberry PI musimy włączyć kamerę Raspberry PI. Użyjmy do tego narzędzia raspi-config.
sudo raspi-config
- Wybierz opcję 5 - Opcje interfejsu
- Wybierz P1 - Włącz/wyłącz połączenie z kamerą Raspberry PI
- Powiedz tak
- dla OK
- Wybierz Zakończ
- Wybierz Tak, aby ponownie uruchomić teraz
Po ponownym uruchomieniu możemy kontynuować
Krok 7: Oprogramowanie
Będziemy potrzebować kilku bibliotek Pythona do zainstalowania. Zostało to zaktualizowane do najnowszej wersji Raspbian - Buster
Najpierw ustawmy Pythona 3 jako domyślnego. Skorzystaj z tego linku, aby dowiedzieć się, jak skonfigurować system WIDE
Biblioteki:
- python-pil.imagetk do manipulowania obrazami
- python-rpi.gpio, aby uzyskać dostęp do PINS GPIO
- Python-picamera, aby uzyskać dostęp do kamery Raspberry PI
- Tweepy, aby udostępnić zdjęcie na Twitterze
- facebook-sdk do udostępnienia na stronie na Facebooku
sudo apt-get zainstaluj python3-pil.imagetk python3-rpi.gpio python3-picamera python3-tweepy python3-pip
Użyj Pythona pip, aby zainstalować facebook-sdk
sudo pip3 zainstaluj facebook-sdk
Krok 8: Programowanie - Podgląd kamery
Jednym z wymagań, które postawiłem przed tym projektem, było to, aby program działał w trybie CLI. Musimy więc wyświetlić obraz z kamery na konsoli. W tym celu użyjmy Pythona Picamera. Następnie użyjmy pil.imagetk, aby wyświetlić nakładkę na podgląd z kamery
Nasz mały program (zamierzamy rozwijać małe programy, aż do jednego dużego na końcu) wyświetli podgląd z kamery.
#!/usr/bin/env python
import time import picamera od czasu import sleep camera = picamera. PiCamera() # Ustaw żądaną rozdzielczość camera.resolution = (1280, 1024) camera.framerate = 24 camera.start_preview() try: while (True): sleep(1) z wyjątkiem (KeyboardInterrupt, SystemExit): print ("Wychodzenie…") camera.stop_preview()
Aby spróbować, po prostu go wykonaj
python cameraPreview.py
Podgląd kamery z obrazami na górze
Ponieważ chciałem wyświetlić odliczanie przed zrobieniem zdjęcia, potrzebowałem obrazów nakładających się na podgląd aparatu.
Utwórz obraz-p.webp" />
Poniższy kod nałoży się na 1-p.webp
import picamerafrom PIL import Obraz z czasu import uśpienia za pomocą picamera. PiCamera() jako aparatu: camera.resolution = (1920, 1080) camera.framerate = 24 camera.start_preview() # load image img = Image.open('1-p.webp
Spróbuj:
python imageNakładka.py
Utwórzmy teraz odliczanie z nakładkami obrazów. Tak jak utworzyłeś obraz 1.png, utwórz kolejne dwa obrazy z 2 i 3 w nich.
Następnie użyj następującego kodu:
importuj pikamerę
z PIL import Obraz z czasu import sleep za pomocą picamera. PiCamera() jako camera: camera.resolution = (1280, 1024) camera.framerate = 24 camera.start_preview() # load image img1 = Image.open('3.png') img2 = Image.open('2.png') img3 = Image.open('1.png') # utwórz podkładkę = Image.new('RGB', (((img1.size[0] + 31) / / 32) * 32, ((img1.size[1] + 15) // 16) * 16,)) pad.paste(img1, (0, 0)) o = camera.add_overlay(pad.tobytes(), size=img1.size) o.alpha = 128 o.layer = 3 sleep(2) #usuń poprzednią nakładkę camera.remove_overlay(o) pad.paste(img2, (0, 0)) o = camera.add_overlay(pad. tobytes(), size=img2.size) o.alpha = 128 o.layer = 3 sleep(2) # usuń poprzednią nakładkę camera.remove_overlay(o) pad.paste(img3, (0,0)) o = kamera. add_overlay(pad.tobytes(), size=img3.size) o.alpha = 128 o.layer = 3 sleep(2)
Teraz wykonaj to:
python imageOverlayCounter.py
I zobacz odliczanie
Wow - Trochę kodu i brak zrobionych zdjęć… Rozwiążmy to, łącząc wszystko razem - podgląd kamery, odliczanie i zrób zdjęcie
import picamerafrom PIL import Obraz od czasu import sleep def overlayCounter(): # załaduj obraz img1 = Image.open('3.png') img2 = Image.open('2.png') img3 = Image.open('1. png') # utwórz podkładkę = Image.new('RGB', (((img1.size[0] + 31) // 32) * 32, ((img1.size[1] + 15) // 16) * 16,)) # wklej nakładkę - 3 pad.paste(img1, (0, 0)) o = camera.add_overlay(pad.tobytes(), size=img1.size) o.alpha = 128 o.layer = 3 sleep(1) # Usuń poprzednią nakładkę camera.remove_overlay(o) # wklej nakładkę - 2 pad.paste(img2, (0, 0)) o = camera.add_overlay(pad.tobytes(), size=img2.size) o.alpha = 128 o.layer = 3 sleep(1) #usuń poprzednią nakładkę camera.remove_overlay(o) # wklej nakładkę - 3 pad.paste(img3, (0,0)) o = camera.add_overlay(pad. tobytes(), size=img3.size) o.alpha = 128 o.layer = 3 sleep(1) camera.remove_overlay(o) camera = picamera. PiCamera() camera.resolution = (1280, 1024) camera.framerate = 24 camera.start_preview() overlayCounter() camera.capture('testingCounter.jpg') camera.stop_preview()
Spróbuj:
python pictureWithTimer.py
A oto mamy Yoda
Krok 9: Programowanie - przycisk z dużą kopułą
Duży przycisk kopułkowy to duży okrągły przycisk - o średnicy zewnętrznej około 100 mm z małą diodą LED. Mówi, że działa przy 12 V, ale 3,3 V Raspberry PI wystarczy, aby go zapalić
Użyj schematu do testowania
Kod:
z RPi import GPIO
takeButton = 17 ledButton = 27 GPIO.setmode(GPIO. BCM) GPIO.setup(takeButton, GPIO. IN, GPIO. PUD_UP) GPIO.setup(ledButton, GPIO. OUT) #Light led GPIO.output(ledButton, True) # Funkcja blokująca GPIO.wait_for_edge(takeButton, GPIO. FALLING) print ("Naciśnięty przycisk") GPIO.output(ledButton, False) GPIO.cleanup()
Wyjaśnienie kodu Jedną z form pobierania wartości z GPIOS jest przerwanie (druga to odpytywanie) - wykrywanie krawędzi.
Zbocze to nazwa przejścia od HIGH do LOW (zbocze opadające) lub LOW do HIGH (zbocze narastające). Gdy PIN nie jest połączony z niczym, każdy odczyt będzie niezdefiniowany. Obejściem tego problemu jest umieszczenie rezystora pull up/down we wspomnianym kodzie PIN. Raspberry PI umożliwia konfigurację rezystorów pull up/down za pomocą oprogramowania.
Linia
GPIO.setup(takeButton, GPIO. IN, GPIO. PUD_UP)
konfiguruje ten kod PIN, aby to zrobić - podciągnij się
Dlaczego się podciągać? Cóż, duży przycisk kopułkowy ma 2 piny - naciśnij, aby złamać lub naciśnij, aby zrobić (podobnie jak małe przyciski, które często są dostarczane z zestawami Arduino/Raspberry PI). Podłączyłem go do kodu PIN przycisku „naciśnij, aby zrobić”. Po naciśnięciu obwód zamyka się i przepływa prąd (normalnie otwarty).
Linia
GPIO.wait_for_edge(takeButton, GPIO. FALLING)
poczeka (efektywnie wstrzymując wykonanie skryptu) aż wykryje upadek PIN-u - puszczenie przycisku odetnie dopływ prądu i PIN przejdzie z 3,3v na 0v
PIN LED służy tylko do zapalenia diody LED na przycisku
Więcej informacji na temat przełączników push z samouczków Arduino, Wikipedii na temat push to make lub push to break i przerwań GPIO
Teraz połączmy przycisk z aparatem - Zrób zdjęcie tylko wtedy, gdy przycisk jest wciśnięty
import picamerafrom time import sleep from RPi import GPIO from PIL import Image # UWAGA: To będzie przycisk anulowania w głównym programie # Używam go tutaj tylko dla jasności w filmie takeButton = 24 ledCancel = 5 GPIO.setmode(GPIO. BCM) GPIO.setup(takeButton, GPIO. IN, GPIO. PUD_UP) GPIO.setup(ledCancel, GPIO. OUT) def onLeds(): GPIO.output(ledCancel, True) sleep(1) def offLeds (): GPIO.output(ledCancel, False) # Funkcja nakładania obrazu def overlayCounter(): #load images img1 = Image.open('3.png') img2 = Image.open('2.png') img3 = Image.open('1.png') # Utwórz nakładkę # Używane z img1, ponieważ wszystkie mają ten sam rozmiar pad = Image.new('RGB', (((img1.size[0] + 31) // 32) * 32, ((img1.size[1] + 15) // 16) * 16,)) # wklej nakładkę - 3 pad.paste(img1, (0, 0)) ov = camera.add_overlay(pad.tobytes (), size=img1.size) ov.alpha = 200 # warstwa 3 ponieważ podgląd kamery jest na warstwie 2 ov.layer = 3 sleep(1) camera.remove_overlay(ov) # wklej nakładkę - 2 pad.paste(obraz2, (0, 0)) ov = camera.add_overlay(pad.tobytes(), size=img2.size) ov.alpha = 200 # warstwa to 3, ponieważ podgląd z kamery jest na warstwie 2 ov.layer = 3 sleep(1) camera.remove_overlay(ov) # wklej nakładkę - 1 pad.paste(img3, (0, 0)) ov = camera.add_overlay(pad.tobytes(), size=img3.size) ov.alpha = 200 # warstwa to 3, ponieważ podgląd kamery jest na warstwie 2 ov.layer = 3 sleep(1) camera.remove_overlay(ov) camera = picamera. PiCamera() camera.resolution = (1280, 1024) camera.framerate = 24 camera.start_preview() GPIO.wait_for_edge(takeButton, GPIO. FALLING) onLeds() overlayCounter() camera.capture('pushTesting.jpg') camera.stop_preview() offLeds() GPIO.cleanup()
Trochę wyjaśnienia kodu
Uruchamia podgląd kamery i czeka tam na naciśnięcie przycisku. Po naciśnięciu przycisku zapala się dioda LED i rozpoczyna się odliczanie. Po dotarciu do końca zdjęcie jest robione, a dioda LED gaśnie
Krok 10: Opublikuj na Twitterze
Teraz użyjemy Pythona i tweetniemy tweeta!:) Będziesz potrzebować obrazu do postu - wybieraj mądrze.
Najpierw musimy uzyskać dostęp do twitterowego API i do tego musimy stworzyć aplikację. Przejdź do https://apps.twitter.com i utwórz nową aplikację.
Musisz złożyć wniosek o konto programisty – odpowiedz na kilka pytań i potwierdź swój adres e-mail. Następnie będziesz mógł utworzyć nową aplikację.
Po utworzeniu aplikacji przejdź do Keys and Tokens i wygeneruj Access Token i Access Token Secret. Pojawi się okno z Kluczami TYLKO RAZ - SKOPIUJ JE I ZAPISZ NA PÓŹNIEJ.
Użyj poniższego kodu, aby wysłać zdjęcie na swoje konto na Twitterze. Nie zapomnij wypełnić:
- Klucz klienta
- konsument_sekret
- access_token
- access_token_secret
wiadomość na Twitterze to tekst do wysłania w tweecie.
jpg_foto_to_send to obrazek, który zostanie dołączony do tweeta. Proszę umieścić jakiś obrazek w tym samym katalogu co skrypt Pythona i zmienić nazwę w kodzie.
import tweepy # Twitter settings def get_api(cfg): auth = tweepy. OAuthHandler(cfg['consumer_key'], cfg['consumer_secret']) auth.set_access_token(cfg['access_token'], cfg['access_token_secret']) tweepy. API(auth) # Wyślij na twittera def sendToTwitter(): cfg = { "consumer_key": "", "consumer_secret": "", "access_token": "", "access_token_secret": "" } api = get_api(cfg) # Wiadomość o statusie tweet = "Wiadomość na Twitterze" status = api.update_with_media("jpg_foto_to_Send", tweet) sendToTwitter()
Sprawdź swój kanał na Twitterze pod kątem tweeta.
Oto tweet
Lub poniżej:
#RaspberryPI MagicBox. Rób zdjęcia, przeglądaj je i wysyłaj na Twittera i Facebooka. Zasilany przez Raspberry PI. @@Malina_Pi#MalinaPI#MalinaPIProjectpic.twitter.com/cCL33Zjb8p
- Bruno Ricardo Santos (@feiticeir0) 29 lutego 2020
Krok 11: Łączenie niektórych elementów
Połączmy teraz przycisk Big Dome Push, wciskając go, odliczając, zróbmy zdjęcie, zdecydujmy, czy wysłać je na twittera.
Dodamy kolejny obraz nakładki i użyjemy wszystkich trzech przycisków. Po wykonaniu zdjęcia zaświecą się wszystkie 3 diody LED przycisków.
Dodajemy kolejne zdjęcie, które pokazuje ikony do opublikowania w sieciach społecznościowych
SelectOption-p.webp
Aenviar-p.webp
Na filmie nie widać niebieskiego przycisku (przód kamery), ale dioda LED jest włączona i zaczyna migać zaraz po naciśnięciu.
Kod jest dołączony, jeśli wolisz
To jest ostatni kod testowy przed głównym programem.
# coding=utf-8 import picamera import _thread import podproces jako sp od czasu import sleep z RPi import GPIO z PIL import Image import threading # Twitter import tweepy # Facebook import facebook # Przycisk do zrobienia zdjęcia TakeButton = 17 # SocialNetwork Button socialNetworkButton = 23 # Anuluj zdjęcie cancelButton = 24 # Dioda przycisku Zrób zdjęcie takePicButtonLed = 27 # Dioda przycisku Wyślij do sieci społecznościowej postSNLed = 22 # Dioda przycisku Anuluj cancelButtonLed = 5 GPIO.setmode(GPIO. BCM) GPIO.setup(takeButton, GPIO. IN, GPIO. PUD_UP) GPIO.setup(socialNetworkButton, GPIO. IN, GPIO. PUD_UP) GPIO.setup(cancelButton, GPIO. IN, GPIO. PUD_UP) GPIO.setup(takePicButtonLed, GPIO. OUT)) GPIO.setup(cancelButtonLed, GPIO. OUT) # Ustawienia Twittera def get_api(cfg): auth = tweepy. OAuthHandler(cfg['consumer_key'], cfg['consumer_secret']) auth.set_access_token(cfg['access_token'], cfg['access_token_secret']) return tweepy. API(auth) # Wyślij do twittera def sendToTwitter(): cfg = { "con sumer_key": "", "consumer_secret": "", "access_token": "", "access_token_secret": "" } api = get_api(cfg) # Wiadomość statusu tweet = "Testowanie z instrukcją MagicBox. #MagicBox #RaspberryPI #Raspberry #Instructables" status = api.update_with_media("pushTesting.jpg", tweet) # Facebook AOth def get_api_facebook(cfg): graph = facebook. GraphAPI(cfg['access_token']) # Pobierz token strony do opublikuj jako stronę. Możesz pominąć # poniższe, jeśli chcesz publikować jako sam. resp = graph.get_object('ja/konta') page_access_token = Brak dla strony w resp['data']: if page['id'] == cfg['page_id']: page_access_token = page['access_token'] graph = facebook. GraphAPI(page_access_token) return graph # Wyślij do facebooka def sendToFacebook(): #Wartości dostępu cfg = { "page_id": "", "access_token": "" } api = get_api_facebook(cfg) caption = "Podpis obrazu" albumid = "" api.put_photo(image=open("pushTesting.jpg", "rb"), caption="Podpis obrazu ") # Tylko Light TakePicButtonLed def onlyTakePicLed(): GPIO.output(takePicButtonLed, True) GPIO.output(postSNLed, False) GPIO.output(cancelButtonLed, False) # Tylko Light Cancel i SocialNetwork button def cancelPostLEDS(): GPI O.output(takePicButtonLed, False) GPIO.output(postSNLed, True) GPIO.output(cancelButtonLed, True) # Miga dioda LED robi zdjęcie podczas odliczania def countingTimerPicture(): GPIO.output(takePicButtonLed, True) sleep(0.5) GPIO.output(takePicButtonLed, False) sleep(0.5) GPIO.output(takePicButtonLed, True) sleep(0.5) GPIO.output(takePicButtonLed,False) sleep(0.5) GPIO.output(takePicButtonLed, True) sleep(0.5) GPIO.output(takePicButtonLed, False) # Blink postSNLed podczas wysyłania do sieci społecznościowych def blinkPosting(stop_event): # Start while (not stop_event.is_set()): print ("off") GPIO.output(postSNLed, False) sleep(0.5) print ("on") GPIO.output(postSNLed, True) sleep(0.5) def timer(): GPIO.output(takePicButtonLed, True) sleep(1) GPIO.output(postSNLed, True) sleep(1) GPIO.output(cancelButtonLed, True) sleep(1) def showAllLeds(): GPIO.output(takePicButtonLed, True) GPIO.output(postSNLed, True) GPIO.output(cancelButtonLed, True) # Wyświetl podgląd na warstwie 1 def displayPreview(imgName): # Ponieważ pokaz obrazu PIL to bzdura # używamy nakładki z aparatu do wyświetlenia # podglądu img = Image.open(imgName) dopełnienie = Image.new('RGB', (((img.size[0] + 31) // 32) * 32, ((img.size[1] + 15) // 16) * 16,)) padding.paste(img, (0, 0)) ov = camera.add_overlay(padding.tobytes(), size=img.size) ov.layer = 1 # Wyświetl podgląd na warstwie 3 def displayPreview3(imgName): # Ponieważ pokaz obrazu PIL jest bzdurą # używamy nakładki z aparatu do wyświetlenia # podglądu img = Image.open(imgName) padding = Image.new('RGB', (((img.size[0] + 31) // 32) * 32, ((img.size[1] + 15) // 16) * 16,)) padding.paste(img, (0, 0)) ov = camera.add_overlay(padding.tobytes(), size=img.size) ov.alpha = 150 ov.layer = 3 return ov # Funkcja overlaySocialNetwork def overlaysn(): imgsn = Image.open('SelectOption.png') # Utwórz Nakładka = Image.new('RGB', (((imgsn.size[0] + 31) // 32) * 32, ((imgsn.size[1] + 15) // 16) * 16,)) # Wklej nakładkę pad.paste(imgsn, (0, 0)) ov = camera.add_overlay(pad.tobytes(), size=imgsn.size) ov.alpha = 100 ov.layer = 3 return ov # Funkcja do nałożenia image def overlayCounter(): #load images img1 = Image.open('3.png') img2 = Image.open('2.png') img3 = Image.open('1.png') # Utwórz nakładkę # Używane z img1, ponieważ wszystkie mają ten sam rozmiar pad = Image.new('RGB', (((img1.size[0] + 31) // 32) * 32, ((img1.size[1] + 15) // 16) * 16,)) # wklej nakładkę - 3 pad.paste(img1, (0, 0)) ov = camera.add_overlay(pad.tobytes(), size=img1.size) ov.alpha = 200 # warstwa 3 bo podgląd kamery jest na warstwie 2 ov.layer = 3 sleep(1) camera.remove_overlay(ov) # wklej nakładkę - 2 pad.paste(img2, (0, 0)) ov = camera.add_overlay(pad.tobytes(), size=img2.size) ov.alpha = 200 # warstwa to 3, ponieważ podgląd kamery jest na warstwie 2 ov.layer = 3 sleep(1) camera.remove_overlay(ov) # wklej nakładka - 1 pad.paste(img3, (0, 0)) ov = camera.add_overlay(pad.tobytes(), size=img3.size) ov.alpha = 200 # warstwa to 3, ponieważ podgląd z kamery jest na warstwie 2 ov.layer = 3 sleep(1) camera.remove_overlay(ov) # Główna funkcja # Wyczyść ekran, aby nie pojawiły się komunikaty startowe # prawdopodobnie lepiej byłoby zrobić to w bash tmp = sp.call('clear', shell=True) camera = picamera. PiCamera() camera.resolution = (1280, 1024) camera.framerate = 24 camera.brightness = 55 camera.sharpness = 0 camera.contrast = 0 #camera.exposure_co mpensation = 0 #camera.exposure_mode = 'auto' #camera.meter_mode = 'średnia' # Testowanie tutaj spróbuj: while (True): camera.start_preview() #Pokaż diodę LED tylko dla wykonania zdjęciaTakePicLed() # Poczekaj na przycisk do zrobienia Obrazek GPIO.wait_for_edge(takeButton, GPIO. FALLING) # Rozpocznij wątek, aby liczyć z diodami podczas wyświetlania obrazów # Zapewne można by użyć w funkcji overlayCounter, # ponieważ ma też timery do pokazywania zdjęć, ale efekty led # nie byłby taki sam _thread.start_new_thread (countingTimerPicture, ()) # Pokaż nakładkę zdjęć w kamerze picture overlayCounter() # Pokaż wszystkie diody LED podczas robienia zdjęcia showAllLeds() camera.capture('pushTesting.jpg') camera. stop_preview() #wyświetl obraz displayPreview('pushTesting.jpg') # Pokaż nakładkę oo = overlaysn() # Pokaż diody LED do anulowania lub wysłania do sieci społecznościowych cancelPostLEDS() GPIO.add_event_detect(socialNetworkButton, GPIO. FALLING) GPIO.add_event_detect(cancel, GPIO. FALLING) while (True): jeśli GPIO.event_detecte d(socialNetworkButton): camera.remove_overlay(oo) GPIO.output(cancelButtonLed, False) o = displayPreview3('Aenviar.png') #print "Przycisk sieci społecznościowych" sendToTwitter() sendToFacebook() camera.remove_overlay(o) break if GPIO.event_detected(cancelButton): #print "Anulowane" camera.remove_overlay(oo) break # reset GPIOS GPIO.remove_event_detect(socialNetworkButton) GPIO.remove_event_detect(cancelButton) GPIO.remove_stoptake_view_detect camera (klawiatura „Zakończono…”) #offLeds() GPIO.cleanup()
Krok 12: Okablowanie
Okablowanie to po prostu okablowanie przycisków Big Dome Push do Raspberry PI.
Wystarczy postępować zgodnie ze schematem Fritzing.
Połączenia to:
Połączenie RPI GPIO PIN GND Zielony przyciskGND (#3) GND Żółty przyciskGND (#9) GND Niebieski przyciskGND (#39) Zrób zdjęcie (niebieski przycisk "Push to make")17 (BCM) Wyślij do sieci społecznościowych (zielony przycisk Przycisk „Naciśnij, aby wykonać”) 23 (BCM) Anuluj (Żółty przycisk „Naciśnij, aby wykonać”) 24 (BCM) Niebieski przycisk LED27 (BCM) Zielony przycisk LED22 (BCM) Żółty przycisk LED5 (BCM)
Folia termokurczliwa jest również oznaczona kolorem
- Czarny to połączenia GND
- Żółte to połączenia typu „push to make”
- Niebieskie są połączenia LED
Numery GPIO. BCM a połączenia GPIO. BOARD
Ponieważ moje kontakty to BCM, myślę, że teraz jest dobry moment, aby o tym porozmawiać i o różnicy między BCM a BOARD.
Główną różnicą jest to, w jaki sposób odnosisz się do pinów GPIO, co z kolei wpływa na sposób wykonywania połączeń. GPIO.board odniesie kody PIN według numeru wydrukowanego na dowolnym układzie GPIO w Internecie.
GPIO. BCM odnosi się do numerów PIN tak, jak widzi je Broadcom SOC. Prawdopodobnie zmieni się to wraz z nowszymi wersjami Raspberry PI.
Na stronie pinout.xyz numery płytek są tymi, które znajdują się tuż obok pinów, a BCM są określane w ten sposób - BCM X (gdzie X to liczba)
Krok 13: MagicBox
Załączony kod do tego kroku jest ostateczny.
Możesz go uruchomić podczas rozruchu raspberry PI, nawet bez konieczności logowania. Aby to zrobić, po prostu utwórz ten mały skrypt w katalogu, w którym umieściłeś kod - odpowiednio zmień ścieżki
#!/kosz/bash
cd /home/pi/magicbox python MagicBox.py
Spraw, aby był wykonywalny
chmod +x start_magicbox.sh
Teraz wywołaj to w /etc/rc.local, tuż przed instrukcją wyjścia 0
sudo vi /etc/rc.local
/home/pi/magicbox/start_magicbox.sh &
Zapisz i wyjdź.
Teraz, przy każdym ponownym uruchomieniu, program Pythona będzie się wykonywał
UWAGA: Wszystkie pliki obrazów muszą znajdować się w tym samym katalogu co skrypt. Musisz mieć:
- 1.png
- 2.png
- 3.png
- Aenviar.png
- WybierzOpcja.png
Wszystkie te pliki można pobrać na github MagicBox.