Эту самоделку мастер сделал для городской выставки самодельных электронных устройств. Работает устройство следующим образом:
При нажатии на синюю кнопку, на лицевой части устройства, она начинает мигать и через 3 секунды срабатывает камера. На другой стороне камеры находится монитор, который показывает обратный отсчет 3-2-1, и после того, как снимок сделан, можно предварительно просмотреть фотографии.
При нажатии на желтую кнопку, снимок удаляется, при нажатии на зеленую отправляется в Twitter и Facebook.
Свое устройство мастер назвал MagicBox.
Инструменты и материалы:
-Raspberry PI;
-Raspberry PI Camera;
-Три большие кнопки;
-TFT-LCD монитор с VGA / HDMI;
-МДФ;
-Крепеж;
-Петли;
-Циркулярная пила;
-Шуруповерт;
-Рулетка;
-Маркер;
-Фольга;
-Аэрозольная краска;Шаг первый: корпус
Корпус представляет собой коробку с размерами: 60 см х 40 см х 30 см. Размер зависит от монитора, который будет использоваться. Панели МДФ были вырезаны лазером. Сзади нужно вырезать 3 отверстия — две для кнопок и одну для монитора. Спереди 2 отверстия — одно для большой кнопки, а другое — меньше — для камеры Raspberry PI. Для доступа к внутренней части задняя крышка закрепляется на петлях. Так же мастер устанавливает мебельные амортизаторы.
Шаг второй: монитор
С монитора был снят пластиковый корпус. Затем он был закреплен на задней панели.Шаг третий: отделка
Для имитации объектива мастер использовал картонную коробку. По центру коробки было сделано отверстие и установлена камера. Корпус мастер оклеил утеплителем, а затем покрасил. Затем часть объектива и верхнюю часть корпуса оклеил фольгированным материалом. Шаг четвертый: программирование
Дальше мастер устанавливает Рассбери, монитор, кнопки, блок питания.Производит монтаж схемы.
После загрузки Raspberry PI нам нужно включить камеру Raspberry PI. Для этого воспользуемся инструментом raspi-config. Пишем команду
sudo raspi-config
Выбираем вариант 5 — Параметры интерфейса
Выбираем P1 — включить / отключить подключение к камере Raspberry PI
Выбираем — да
Далее — ОК и Готово
Перегружаем.
Дальше мастер устанавливает библиотеки отсюда.
python-pil.imagetk для работы с изображениями
python-rpi.gpio для доступа к GPIO PINS
python-picamera для доступа к камере Raspberry PI
Tweepy чтобы поделиться фото в твиттере
Facebook-SDK, чтобы поделиться на странице Facebook
sudo apt-get install python3-pil.imagetk python3-rpi.gpio python3-picamera python3-tweepy python3-pip
Используйте Python pip для установки facebook-sdk
sudo pip3 install facebook-sdk
Одним из требований, которые мастер установил к этому проекту, было то, что эта программа должна была работать в режиме CLI (разновидность текстового интерфейса). Итак, нам нужно вывести изображение с камеры на консоль. Для этого мастер использует Python Picamera. После этого pil.imagetk, чтобы отобразить наложение поверх предварительного просмотра камеры.
Эта небольшая программа обеспечит предварительный просмотр камеры.
#!/usr/bin/env python
import time
import picamera
from time import sleep
camera = picamera.PiCamera()
# Set the resolution you want
camera.resolution = (1280,1024)
camera.framerate = 24
camera.start_preview()
try:
while (True):
sleep(1)
except (KeyboardInterrupt, SystemExit):
print ("Exiting…")
camera.stop_preview()
Для просмотра команда: python cameraPreview.pyПоскольку мастер хотел отобразить обратный отсчет перед съемкой, нужны были изображения, накладывающиеся на предварительный просмотр камеры.
Создает изображение в формате PNG и устанавливает прозрачный фон. Изображение PNG с номером 1 с разрешением 256×512 пикселей. Его имя 1.png. Помещается в тот же каталог, что и скрипт.
Следующий код будет перекрывать 1.png с предварительным просмотром камеры.
import picamera
from PIL import Image
from time import sleep
with picamera.PiCamera() as camera:
camera.resolution = (1920,1080)
camera.framerate = 24
camera.start_preview()
# load image
img = Image.open('1.png')
# create
pad = Image.new('RGB', (
((img.size[0] + 31) // 32) * 32,
((img.size[1] + 15) // 16) * 16,
))
pad.paste(img, (0,0))
o = camera.add_overlay(pad.tobytes(), size=img.size)
o.alpha = 128
o.layer = 3
while True:
sleep(1)
Для просмотра: python imageOverlay.py
Создает изображения 2 и 3. Дальше создает обратный отсчет с наложенными изображениями используя код:
import picamera
from PIL import Image
from time import sleep
with picamera.PiCamera() as 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')
# create
pad = 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)
#remove previous overlay
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)
# remove previous overlay
camera.remove_overlay(o)
pad.paste(img3, (0,0))
o = camera.add_overlay(pad.tobytes(), size=img3.size)
o.alpha = 128
o.layer = 3
sleep(2)
Проверяет: python imageOverlayCounter.py
Дальше объединяет код снимка и код обратного отсчета.
import picamera
from PIL import Image
from time import sleep
def overlayCounter():
# load image
img1 = Image.open('3.png')
img2 = Image.open('2.png')
img3 = Image.open('1.png')
# create
pad = Image.new('RGB', (
((img1.size[0] + 31) // 32) * 32,
((img1.size[1] + 15) // 16) * 16,
))
# paste the overlay — 3
pad.paste(img1, (0,0))
o = camera.add_overlay(pad.tobytes(), size=img1.size)
o.alpha = 128
o.layer = 3
sleep(1)
# Remove previous overlay
camera.remove_overlay(o)
# paste the overlay — 2
pad.paste(img2, (0,0))
o = camera.add_overlay(pad.tobytes(), size=img2.size)
o.alpha = 128
o.layer = 3
sleep(1)
#remove previous overlay
camera.remove_overlay(o)
# paste the overlay — 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()
Проверяет: python pictureWithTimer.pyКнопка представляет собой большую круглую кнопку диаметром около 100 мм с небольшим светодиодом. Светодиод работает от 12 В, но достаточно и 3,3 В Рассбери.
Прописывает код для кнопки.
from 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)
# Blocking function
GPIO.wait_for_edge(takeButton,GPIO.FALLING)
print ("Button Pressed")
GPIO.output(ledButton,False)
GPIO.cleanup()
Дальше для ее работы с камерой.
import picamera
from time import sleep
from RPi import GPIO
from PIL import Image
# NOTE: This is what will be the cancel button in the main program
# I'm just using it here for sake of clarity in the video
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)
# Function to overlay image
def overlayCounter():
#load images
img1 = Image.open('3.png')
img2 = Image.open('2.png')
img3 = Image.open('1.png')
# Create an overlay
# Used with img1 because all are the same size
pad = Image.new('RGB', (
((img1.size[0] + 31) // 32) * 32,
((img1.size[1] + 15) // 16) * 16,
))
# paste the overlay — 3
pad.paste(img1, (0,0))
ov = camera.add_overlay(pad.tobytes(), size=img1.size)
ov.alpha = 200
# layer is 3 because camera preview is on layer 2
ov.layer = 3
sleep(1)
camera.remove_overlay(ov)
# paste the overlay — 2
pad.paste(img2, (0,0))
ov = camera.add_overlay(pad.tobytes(), size=img2.size)
ov.alpha = 200
# layer is 3 because camera preview is on layer 2
ov.layer = 3
sleep(1)
camera.remove_overlay(ov)
# paste the overlay — 1
pad.paste(img3, (0,0))
ov = camera.add_overlay(pad.tobytes(), size=img3.size)
ov.alpha = 200
# layer is 3 because camera preview is on layer 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()
Дальше мастер создает учетную запись в твиттере. Вам нужно подать заявку на учетную запись разработчика — заполните несколько вопросов и подтвердите свой адрес электронной почты. После этого вы сможете создать новое приложение.
После создания приложения перейдите к разделу «Ключи» и сгенерируйте код доступа и пароль доступа. Появится окно с ключами. Нужно скопировать один из них.
Дальше прописывает:
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'])
return tweepy.API(auth)
# Send to twitter
def sendToTwitter():
cfg = {
"consumer_key" : "",
"consumer_secret" : "",
"access_token" : "",
"access_token_secret" : ""
}
api = get_api(cfg)
# Status Message
tweet = "Twitter message"
status = api.update_with_media("jpg_foto_to_Send",tweet)
sendToTwitter()
jpg_foto_to_send — это изображение, которое будет прикреплено к твиту.Дальше мастер загружает код для работы двух кнопок на задней панели.
pushButtonCameraOverlayDisplayImageLoop.py
Прикрепленный код к этому шагу является окончательным.
Можно запустить его при загрузке Raspberry PI, даже не входя в систему. Для этого нужно просто создать этот небольшой скрипт в каталоге, в котором разместили код, — соответственно изменив путь.
#! / bin / bash
cd / home / pi / magicbox
python MagicBox.py
chmod + x start_magicbox.sh
sudo vi /etc/rc.local
/home/pi/magicbox/start_magicbox.sh &
Сохранить и выйти.
Все файлы изображений должны находиться в том же каталоге, что и скрипт.
1.png
2.png
3.png
Aenviar.png
SelectOption.png
MagicBox.py