Raspberry Piでスタンドアロンの写真ブースを作成する

「オンライン」の時代には、デジタル写真の場合と同様に、印刷写真は好奇心のようになりました。 最近、ゲストを楽しませ、写真の形で思い出に残るお土産を受け取るための興味深い方法として、さまざまな写真ブースが人気を集め始めています。 私はプログラミングが好きな写真家です。この組み合わせでは、自分で写真ブースを作ろうとしないのは不思議です。

市販されている写真ブースの市販モデルとは異なり、私は本当にコンパクトで自律的なシステムを作りたかったのです。 メインの仕事と並行して、数分で野外に設置することができ、数十キロの重さも持ち運ばなくなりました。 そして、私はそれをやった。

猫の下では、ハードウェア、ラズベリーパイ、そしてこれらすべてをLinuxで、そしてもちろん私のお気に入りのPythonでプログラミングするという話があります。 今後は、本当に高品質の写真が欲しかったので、ウェブカメラではなくデジタル一眼レフで撮影するので、この記事はさらに興味深いものになります。







鉄 単純なものから複雑なものまで。



このプロジェクトを引き受けたとき、それは冬でした。 冬には、私は多くの自由時間と少しの仕事があるので、プロジェクトはできるだけ安くするべきです。 金融要素に加えて、私はKISSの原則が大好きです。システムはできるだけシンプルでなければなりません。 このような単純さは、信頼性、サイズ、そして重要なことにエネルギー消費などのコンポーネントにも依存します。



そして、鉄の話をもっと簡単にする方法から始めます。さらに、プロジェクトの作業の過程で、「簡単な」がより複雑なものに置き換えられました。 おそらく、実装は誰かにとって「簡単」です。



だから、私たちはデジタル一眼レフカメラとタスクを持っています:写真を撮って印刷するために人の命令で。 これは実際には非常に簡単です。 ボタンを取り、任意のMKに接続します(はい、arduino全体を接続することもできます)。 人がボタンを押すと、秒数をカウントダウンし、その後、写真を撮ります。 DSLRで写真を撮るのも簡単です-有線リモートコントロール(2.5ジャックコネクタを介してカメラに接続し、実際には2つの接点を「閉じる」)に「ふり」をするか、ワイヤレスIRリモートコントロールに「ふり」をします(MKには多くの認識があります)。 時間をカウントするには、任意の信号インジケータまたはLCDディスプレイを使用できますが、サーボドライブと矢印という「アナログ」表示を作成する予定でした。 カメラから写真を送信して印刷しても問題はないはずです。 WiFiトランスミッターを内蔵した素晴らしいSDメモリーカードがあります。 ちなみに、私はすでにこのことについてハブで詳細に書いています さらに、ラップトップでは、受信した写真を印刷用に送信する簡単なスクリプトをすでに作成できます。



さらに、プロジェクトに関する私の「精神的な」作業では、システムを複雑にする必要がありました。 最初のバージョンでは、写真を1枚撮りますが、「本物の」写真ブースのようにシリーズを作成し、1枚の紙に印刷したいと思います。 2番目のボタンを使用してこれを実装できます(人は1枚の写真を撮るか、複数枚を一度に撮ることを選択します)。 問題が発生します-ラップトップはどのボタンが押されたかをどのように認識し、それに応じてこの写真を印刷するか、さらに3枚が1枚のシートに置かれるのを待ちます。 これも簡単に解決されます-誰もが好むesp8266は、WiFiを備えたSDカードと同じネットワークに接続できます。 彼女は、ユーザーの選択についてラップトップに「通知」します。



私が非常に重要なことを考えていなかった場合、プロジェクトはそのまま残ります-人々は撮影中に自分自身を見るべきです。 彼らはあなたがどこまで行く必要があるか、何人の人がフレームに収まるかなどを知りません。もちろん、カメラ自体の表示もあります。LiveViewモードでオンにできます。カメラのディスプレイが回転式であるという事実)、しかし、カメラにはHDMI出力があり、よく知られている「中国の」電器店に必要なものがあるはずであることを思い出しました。 その結果、HDMIを含むさまざまなソースから信号を受信できるコントローラーを備えた7インチLCDディスプレイが注文されました。



ディスプレイが点灯している間、私もラップトップを持って行きたくないと思いました。 私は、真に自律的なシステムを作ることができました。 そして、ここにシステム全体の「頭脳」があります-Raspberry Pi。 彼の登場により、私はすべての仕事を彼に完全に任せることにしました。ボタンを放棄し、ユーザーがタッチスクリーン上のボタンを押して、LiveViewから写真を見せ、最も重要なのは、印刷する写真を「承認」することです撮影中に角質が「点滅」します。



すべてのスペアパーツが到着したとき、私はすべてをまとめ始めました。 ツールのうち、はんだごて、グルーガン、サイディング(!)がありました。 1つ目はディスプレイユニットで、自家製のモニターです。







ディスプレイコントローラーの上、USBタッチスクリーンコントローラーの下の写真。 セット全体がaliexpressで購入されました( このように見えます)

ディスプレイ側では、次のようになります。







全体が5ボルトで駆動され、ピーク時に700〜800ミリアンペアを消費します。



ラズベリーパイの「ケース」を同じサイディングから作成しました(これが最初に目を引いたものであり、作業が非常に簡単です)。







それがどのような「クーリビア」であるかを説明させてください。 上部には5ボルトのクーラーがあります。 私は過熱するのが怖かったので、温度が55度に達すると点灯します。冠から始まる簡単なスクリプトがあります。



スクリプトは非常に単純です。
#!/usr/bin/env python import RPIO import subprocess RPIO.setwarnings(False) RPIO.setup(18,RPIO.OUT) sub=subprocess.Popen(['/opt/vc/bin/vcgencmd', 'measure_temp'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) temp=float(sub.stdout.read().split('=')[1].split("'")[0]) if temp>55: RPIO.output(18,1) if temp<45: RPIO.output(18,0)
      
      











左側にリレーモジュールがあります。 動作中にダイオードのバックライトをオンにするように設計されています。 なぜこれが必要なのかを説明しましょう。さまざまな種類の宴会では、ダンスの休憩中は非常に暗いことがあります。 バックライトは、撮影中のオートフォーカス操作と、「ポーズ」中に画面の暗さではなく自分自身を見るために必要です。 屋内で撮影するとき、フラッシュとカメラのホットシューに接続されている通常のラジオシンクロナイザーを介して動作するソフトボックスを備えたスタンドを持っています。 したがって、私は写真に良い光を取得します。 ダイオードのバックライトだけを残すこともできますが、写真の品質は低下します。



試作船体は、最終バージョンの要件とサイズを評価するために、同じサイディングから組み立てられました。







ケース自体を古いカメラとして様式化したかった。 私はそれを自分でやろうとはせず、装飾に携わっている知人の製造を命じました。 ケースは、アコーディオンにレザーレットを使用したラミネート製でした。







猫は本当に彼を気に入っていましたが、すべての詰め物に対応するためにまだ追い出されなければなりませんでした。







全体が2つの電源銀行に供給されます。 理論的には、5〜6時間の操作で10,000 mA / hで十分ですが、ディスプレイとラズベリーの両方を同時に接続すると、電流負荷が大きくなり、バッテリーの容量が少なくなります。



写真を印刷することについて、それが何をしていたかについてのいくつかの言葉。 通常の家庭用インクジェットプリンターでも、何でも写真を印刷できます。 しかし、再び、コンパクトさが必要でした。 コンパクトであることに加えて、バッテリー寿命のために、あなたはまだ信頼性を必要とします。 インクレベル、ノズルの詰まりなどを心配したくありません。その結果、安価でコンパクトな熱昇華プリンターが選択されました。 利点:プリンターの小型サイズ、トラブルのない印刷(ストライプ、インクの斑点などを忘れることができます)、少なくとも上下逆さまに輸送して印刷する能力、写真の寿命(印刷直後、写真は水に浸され、何もありませんでした)。 マイナス面:印刷コストが高く、18ショットごとに紙を交換し、36ショットごとにリボンからカートリッジを交換する必要がある。 消耗品はオリジナルのみです(キットには、特別な紙、リボン付きの特別なカートリッジを除く)。1枚の印刷のコストは25ルーブルですが、これはサービスの最終コストに含まれます。 この「WiFiホイッスル」はラズベリーパイに接続されているため、プリンターはWiFi経由で動作します。







ソフトウェア



「シリアル」写真ブースには、PCとWindowsでのみ自然に存在するソフトウェアが販売されています。 Linuxの場合、私はすべてを一から書き直さなければなりませんでした(まあ、私はそれが好きでした!)。 Pythonがプログラミング言語として選択されました(実際、私は他に何も知りません)。



開始するには、USB経由で接続されているカメラと対話する方法を学ぶ必要があります。 Linux用の既製のツールがすでにあることを発見したとき、私は驚きませんでした。 これはgphoto2コンソールユーティリティです。



まず、システムの起動直後に起動する設定画面が必要でした。







GUIはTkinterで記述されており、これらのタスクに適しています。

ここでは、特定の撮影条件に合わせてカメラを設定し、メインプログラムを起動し、その動作を設定できます(1枚の大きな写真を撮るか、「1枚の写真」と「4 in 1」を選択して、印刷または保存するだけでなく、印刷モードなど)後で)、テストショットを撮ります。 これはより詳細です。



まず、カメラに設定を書き込む必要があります。これは簡単に実行できます。

 #     bb_list=['','','','','.','. ','',''] sub=subprocess.Popen(['gphoto2', '--set-config', 'whitebalance='+str(bb_list.index(settings['bb'])), '--set-config', 'iso='+t_iso, '--set-config', 'aperture='+settings['a'], '--set-config', 'imageformat=7' #   (jpeg  19201080) ],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) err=sub.stderr.read()
      
      







次に、テストショットを撮り、画面に表示する必要があります。



 sub=subprocess.Popen(['gphoto2','--capture-image-and-download','--filename','/tmp/booth.jpg','--force-overwrite'],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False) err=sub.stderr.read()
      
      





カメラは写真を撮影し、/ tmp / booth.jpgファイルに書き込まれます(作業を高速化し、メモリカードリソースをラズベリーに保存するには、/ tmpでそのようなことを行うことをお勧めします。デフォルトではtmpfsにマウントされます。 その後、評価のためにスクリーンショットが表示され、通常のオープン( '/ home / pi / settings.dat'、 'wb')を使用して設定がファイルに書き込まれます。



カメラがセットアップされました。ユーザーインターフェイスを起動します。







インターフェイス自体は、有名なpygameライブラリを使用して記述されています。

当然、ユーザーが「不要な場所」をクリックできないように、アプリケーションは全画面で起動します。

 pygame.init() pygame.mouse.set_visible(0) screen = pygame.display.set_mode((800,480), pygame.HWSURFACE | pygame.FULLSCREEN,32)
      
      







アプリケーションのアーキテクチャは非常にシンプルです。インターフェイスは事前に保存された画像から描画され、プログラム自体は、事前に定義された状態で、有限状態機械法に従って動作します。 詳しくは、カメラとの相互作用についてお話したいと思います。



最初に必要なことは、カメラからLiveView画像を取得して、撮影の準備中にユーザーが自分自身を確認できるようにすることです。 gphoto2ユーティリティを使用してこれを実行しようとしましたが、覚えていない理由により、成功しませんでした。 piggyphoto pythonのライブラリが見つかりました。このタスクは単純に解決されています。

 cam = piggyphoto.camera() cam.leave_locked() while WORK: s=self.cam.capture_preview() s.save('/tmp/preview.jpg') s.clean() #    ,       https://github.com/alexdu/piggyphoto/issues/2 from_camera = pygame.image.load('/tmp/preview.jpg') #   from_camera=pygame.transform.scale(from_camera, (800, 530)) #     from_camera=pygame.transform.flip(from_camera,1,0) #    ,        )
      
      







LiveViewモードでは、カメラも設定する必要があります。 たとえば、調査自体がISO 100で実施されている場合、LiveViewではこれで十分ではない可能性があります。 電源を入れる前に、次のようにします。

  sub=subprocess.Popen(['gphoto2', '--set-config', 'whitebalance=0', #     '--set-config', 'iso=0', # ISO   '--set-config', 'aperture=2.8', #   '--set-config', 'imageformat=7' ],stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=False)
      
      







タイマーが完了すると、前述のように、フレーム自体を既に実行できます。 「4 frame in 1」モードが選択されている場合、それに応じてこれを4回繰り返して4つの異なる写真を取得し、それらを1つに接着します。 Pillowライブラリは既にこれを行っています(少なくともパフォーマンスのために、古いPILではなく使用することを強くお勧めします)。







デモのために、短いビデオを作成しました。







写真の準備ができたら、印刷用に送信できます。 Linuxでは、これはたった1つのコマンドlpr FILENAMEで実行されます。 WiFiを介してキヤノンセルフィープリンターに印刷する写真を送信する場合、微妙な違いが1つあります。写真を「直接」印刷するために送信する必要があります。つまり、プリンターは既製のjpgファイルlpr -o RAWファイルを受け入れます。



実際、主な機能は準備ができています。 その後、さらにいくつかの機能が追加されました。 最初に実現したかったのは、写真を電子形式で返すことでした。 WiFiは、プリンターが接続するアクセスポイントのモードで既に機能しているため、開いてはいけません。 raspberryでは、シンプルなギャラリーを備えたWebサーバーが作成されました。 このWebサーバーの検索に関する問題を回避するために、Captive Portalを構成しました。アクセスポイントに接続すると、ギャラリーのあるページが開きます。 これは、すべての要求に対してWebサーバーのIPアドレスを提供するDNSサーバーをインストールすることによって行われます。







実際、1つの記事の枠組みの中で、すべてのニュアンスについて話すことは不可能です。 可能な限り、私はコメントであなたの質問に答えようとします。 私の次の記事も興味深いものになることを約束します。この記事では、写真の印刷における古い珍しい技術と、ソフトウェアの分野における新しい技術を組み合わせます。



All Articles