Ручнаяя мастерская

Большой фотоаппарат MagicBox на Raspberry PI

Эту самоделку мастер сделал для городской выставки самодельных электронных устройств. Работает устройство следующим образом:
При нажатии на синюю кнопку, на лицевой части устройства, она начинает мигать и через 3 секунды срабатывает камера. На другой стороне камеры находится монитор, который показывает обратный отсчет 3-2-1, и после того, как снимок сделан, можно предварительно просмотреть фотографии.

При нажатии на желтую кнопку, снимок удаляется, при нажатии на зеленую отправляется в Twitter и Facebook.

Свое устройство мастер назвал MagicBox.

Инструменты и материалы:
-Raspberry PI;
-Raspberry PI Camera;
-Три большие кнопки;
-TFT-LCD монитор с VGA / HDMI;
-МДФ;
-Крепеж;
-Петли;
-Циркулярная пила;
-Шуруповерт;
-Рулетка;
-Маркер;
-Фольга;
-Аэрозольная краска;
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIШаг первый: корпус
Корпус представляет собой коробку с размерами: 60 см х 40 см х 30 см. Размер зависит от монитора, который будет использоваться. Панели МДФ были вырезаны лазером. Сзади нужно вырезать 3 отверстия — две для кнопок и одну для монитора. Спереди 2 отверстия — одно для большой кнопки, а другое — меньше — для камеры Raspberry PI.
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIДля доступа к внутренней части задняя крышка закрепляется на петлях. Так же мастер устанавливает мебельные амортизаторы.
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIШаг второй: монитор
С монитора был снят пластиковый корпус. Затем он был закреплен на задней панели.
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIШаг третий: отделка
Для имитации объектива мастер использовал картонную коробку. По центру коробки было сделано отверстие и установлена камера. Корпус мастер оклеил утеплителем, а затем покрасил. Затем часть объектива и верхнюю часть корпуса оклеил фольгированным материалом.
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIШаг четвертый: программирование
Дальше мастер устанавливает Рассбери, монитор, кнопки, блок питания.
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIПроизводит монтаж схемы.
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на 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
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIПоскольку мастер хотел отобразить обратный отсчет перед съемкой, нужны были изображения, накладывающиеся на предварительный просмотр камеры.

Создает изображение в формате 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
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PI

Кнопка представляет собой большую круглую кнопку диаметром около 100 мм с небольшим светодиодом. Светодиод работает от 12 В, но достаточно и 3,3 В Рассбери.
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIПрописывает код для кнопки.
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 — это изображение, которое будет прикреплено к твиту.
Большой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIБольшой фотоаппарат MagicBox на Raspberry PIДальше мастер загружает код для работы двух кнопок на задней панели.
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

Присоединяйтесь!

Не стесняйся, общайся. Мы любим встречать интересных людей и заводить новых друзей.