超小型のシングルボードコンピューター「Raspberry Pi」は安価で拡張性も高いのが魅力ですが、実際に外部モジュールなどと連携して使用するためにはプログラムで機器の動作を制御する必要があります。今回はRaspberry Piに標準で用意されている開発環境であるプログラミング言語Pythonを使って、Raspberry Piに接続したカメラモジュールでの写真撮影と、Raspberry Piの音声端子に接続したマイクでの録音を制御してみたいと思います。

チャレンジ&ナレッジ最終更新日: 20210211

Raspberry Piでの撮影と録音をPythonで制御する

  • このエントリーをはてなブックマークに追加

超小型のシングルボードコンピューター「Raspberry Pi」は安価で拡張性も高いのが魅力ですが、実際に外部モジュールなどと連携して使用するためにはプログラムで機器の動作を制御する必要があります。
今回はRaspberry Piに標準で用意されている開発環境であるプログラミング言語Pythonを使って、Raspberry Piに接続したカメラモジュールでの写真撮影と、Raspberry Piの音声端子に接続したマイクでの録音を制御してみたいと思います。

Pythonの準備

今回撮影と録音を制御するために使用するプログラムは「Python」というプログラム言語で記述します。PythonはRaspberry Piに標準でインストールされている開発環境であり、シンプルで平易な記述で理解がしやすく、プログラミングの学習にも適した言語です。

まずPythonに必要なパッケージ(ソフトウェアとインストールに必要なファイルのまとまり)をRaspberry Piにインストールします。

Pythonについては下記の記事も参考にしてください。
“Python Windowsで開発環境の構築”
https://www.pc-koubou.jp/magazine/4188

まず画面上部メニューのアイコンから「LXTerminal」を起動します。

上部メニューの「LXTerminal」をクリックして起動上部メニューの「LXTerminal」をクリックして起動

パッケージをインストールするためにはコマンド「apt-get」を用います。

起動したターミナル画面上で、下記のようにapt-getコマンドをインストールするパッケージ名とともに入力します。

sudo apt-get install -y git openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

このコマンドでは、この後の作業に必要となる下記6つのパッケージをインストールしています。

  • git(コンピューター上のファイル変更履歴などを管理するツール)
  • openssl(インターネット上での暗号化通信を行うためのライブラリ)
  • libssl-dev(上記OpenSSLの開発用ライブラリ)
  • libbz2-dev(圧縮・伸長アルゴリズムのライブラリ)
  • libreadline-dev(コマンドラインUI関連のライブラリ)
  • libsqlite3-dev(SQLデータベース関連のライブラリ)

apt-getコマンド実行画面apt-getコマンド実行画面

上記インストールが終わったら、続いてPythonのバージョン管理ツール「pyenv」をインストールしておきます。

最初にご説明した通り、Raspberry Piには標準でPythonがインストールされていますが、利用するライブラリによっては対応するPythonのバージョンが限られているものもあり、Pythonのバージョンを任意のものに指定できる「pyenv」をインストールしておくと、開発の際に便利です。

pyenvは先ほどインストールしたファイルなどの変更履歴を管理するツール「Git」の仕組みに沿って様々なファイルが公開されている「Github」というサービス上に公開されています。

Github上で公開されているpyenvを手元のRaspberry Pi上にインストールするにはGitのコマンド「git clone」を入力し、Github上のファイルをRaspberry Pi上に複製(clone)します。

下記のコマンドを入力することでホームディレクトリー(今回の環境では「/home/pi/」)に「.pyenv」というフォルダが作成され、その中にGithub上のpyenvが複製されます。

git clone https://github.com/pyenv/pyenv.git ~/.pyenv

git cloneコマンド実行画面git cloneコマンド実行画面

続いてvimエディターで設定ファイルを編集します。

※vimエディターの使い方については下記記事を参照してください。
“Raspberry Piと各種モジュール等を接続して使う”
https://www.pc-koubou.jp/magazine/17276

下記コマンドを入力するとvimが起動し、「.bashrc」ファイルが開いた状態になります。

sudo vim .bashrc

sudo vim .bashrc 実行画面sudo vim .bashrc 実行画面

「.bashrc」ファイルが開いたら、「i」キーを押して「編集モード」に切り替え、ファイルの一番下に下記のコードを追加して「pyenv」が使えるよう設定します。

        export PYENV_ROOT=”$HOME/.pyenv”
        export PATH=”$PYENV_ROOT/bin:$PATH”
        eval “$(pyenv init -)”
    

.bashrc ファイルの編集画面.bashrc ファイルの編集画面

上記記述して「Esc」キーで「コマンドモード」に移行した後、キーボードの「Shift」キーを押しながら、「z」キーを2回押してvimエディタを終了したら、LXTerminalを再起動します。LXTerminalを閉じてもう一回開いてください。再起動することにより設定ファイルに書き込んだ情報を反映させます。

これで、「pyenv」が使えるようになりました。

pyenvが使えるようになったら下記のようにpyenvコマンドを入力、実行します。

今回はpython3.6.1をインストールします。

pyenv install 3.6.1

pyenv install コマンド実行画面pyenv install コマンド実行画面

インストール後、globalコマンドを下記のように入力し、デフォルトで使用するpythonのバージョンも3.6.1に設定しておきます。

pyenv global 3.6.1

pyenv globalコマンド実行画面pyenv globalコマンド実行画面

これでpythonの準備は完了です。

Raspberry Piのカメラ撮影をPythonで制御する

カメラ撮影を制御するPythonプログラムの作成

Pythonの準備ができたら、Raspberry Piのカメラ撮影をPythonで制御するプログラムを作成します。まずカメラ操作に必要なライブラリのインストールを行います。

ターミナルで以下のコードを実行します。

sudo pip install picamera

sudo pip install picamera 実行画面sudo pip install picamera 実行画面

今回はボタンスイッチが取り付けられたボタンモジュール(今回は「Button SHIM」)という部品をRaspberry Piに接続して、ボタンスイッチを押すと撮影ができるようにしたいと思いますので、ターミナルで以下のコードを実行してボタンモジュールを使うために必要なライブラリをインストールします。

sudo apt-get install python3-buttonshim

sudo apt-get install python3-buttonshim実行画面sudo apt-get install python3-buttonshim実行画面

続いてウインドウ左上のRaspberry Piのメニューボタンから設定→Raspberry Piの順番でRaspberry Piの設定を開きます。

メニューボタンから設定→Raspberry Pi の設定を開くメニューボタンから設定→Raspberry Pi の設定を開く

「Raspberry Piの設定」画面上部のタブから「インターフェイス」タブを選び、「カメラ」「I2C」の項目で「有効」ラジオボタンが選択されているかどうかを確認してください。もし「無効」になっていた場合は「有効」を選択して「OK」を押してください。

「インターフェイス」タブの選択内容を確認「インターフェイス」タブの選択内容を確認

続いて 下記コマンドによりvimエディターで「cambtn.py」ファイルを作成します。

sudo vim cambtn.py

sudo vim cambtn.py実行画面sudo vim cambtn.py実行画面

「cambtn.py」ファイルが作成されてvimエディターが起動します。「i」キーを押して「編集モード」に切り替え、下記のプログラムをvimエディターにコピー&ペーストして保存します。

※「#」から始まる行は解説用のコメントですので省略してもかまいません。

            import signal
            import buttonshim
            import sys
            import time
            import picamera
            
            BUTTONS = [buttonshim.BUTTON_A, buttonshim.BUTTON_B, buttonshim.BUTTON_C, buttonshim.BUTTON_D, buttonshim.BUTTON_E]
            
            # ボタンを押されたときに呼び出されるように設定する
            @buttonshim.on_press(BUTTONS)
            def button_p_handler(button, pressed):
                # Aボタンを押されたとき
                if (button == 0):
                    # カメラ初期化
                    with picamera.PiCamera() as camera:
                        # 解像度の設定
                        camera.resolution = (1024, 768)
                        # 撮影の準備
                        camera.start_preview()
                        # 準備している間、少し待機する
                        time.sleep(2)
                        # 撮影して指定したファイル名で保存する
                        camera.capture('my_pic.jpg')
                        print('Camera End!')
            
            signal.pause()            
    

上記ペーストできたら、「Esc」キーで「コマンドモード」に移行した後、キーボードの「Shift」キーを押しながら、「z」キーを2回押してvimエディタを終了してください。

※vimエディターの基本的な操作方法は以前の記事の内容を参考にしてください。
“Raspberry Piと各種モジュール等を接続して使う”
https://www.pc-koubou.jp/magazine/17276

ボタンモジュールをRaspberry PiのGPIO端子と接続する

先に書いたとおり、今回はボタンの付いたモジュールをRaspberry Piに接続し、ボタンを押して撮影ができるように上記プログラムを準備しました。

プログラムの準備ができたらボタンの付いたモジュールを接続します。

今回使用する「Button SHIM」は、5つのボタンとRGBステータスLEDを搭載したRaspberry Pi用の薄型拡張基板です。

今回使用した「Button SHIM」今回使用した「Button SHIM」

gpioピンに合うようにモジュールを装着gpioピンに合うようにモジュールを装着

「Button SHIM」はRaspberry Pi上のGPIOピンに接続して使用します。上図を参考に、GIPIOピンに合うようにモジュールの向きに注意しながら取り付けます。

※作業は必ず通電していない状態で行ってください。また、部品取り付けの際にハンダ付けを行う場合は部品の破損等につながらないよう充分に注意の上、自己の責任で作業を行ってください。

プログラムを実行して撮影する

ボタンモジュールが接続できたら、ターミナルで、「sudo python cambtn.py」を実行します。

sudo python cambtn.py実行画面sudo python cambtn.py実行画面

プログラムが実行されると、下図のように「Camera Start!」と表示されます。

上図の表示になったら、下図の赤い枠で囲まれた部分にある「A」の部分のボタンを押すと撮影が開始されます。上図の表示になったら、下図の赤い枠で囲まれた部分にある「A」の部分のボタンを押すと撮影が開始されます。

上図の表示になったら、下図の赤い枠で囲まれた部分にある「A」の部分のボタンを押すと撮影が開始されます。

Aボタンを押す所Aボタンを押す所

画像の撮影が完了すると、下図のように「Camera End!」と表示されるので「ctrll」+「c」でプログラムを終了します。

撮影した画像は「/home/pi」の中に保存されています。

cambtn.pyプログラム終了画面cambtn.pyプログラム終了画面

実際に「cambtn.py」プログラムを実行して撮影画像が保存されるまでの様子は下記の動画をご覧ください。

Raspberry Piのマイク録音をPythonで制御する

マイク録音を制御するPythonプログラムの作成

今度はPythonでオーディオ端子に接続したマイクを使った録音を制御してみます。

はじめに、オーディオ端子を使用するために必要なライブラリをインストールしましょう。

ターミナルで下記コードを入力します。

sudo apt-get install portaudio19-dev

sudo apt-get install portaudio19-dev実行画面sudo apt-get install portaudio19-dev実行画面

続いて下記のコマンドで音声を扱うためのライブラリ「python3-pyaudio」をインストールします。

sudo apt-get install python3-pyaudio

sudo apt-get install python3-pyaudio実行画面sudo apt-get install python3-pyaudio実行画面

必要なライブラリの準備ができたら、録音を制御するプログラムを作成します。

撮影制御用のプログラムを作成した時と同じく、まずは下記コマンドを入力し、ホームディレクトリ(/home/pi)に「micbtn.py」ファイルを作成してvimエディターで開きます。

sudo vim micbtn.py

sudo vim micbtn.py実行画面sudo vim micbtn.py実行画面

「micbtn.py」ファイルが開いたら、先ほどと同様に「i」キーを押して「編集モード」に切り替え、下記のプログラムをコピー&ペーストして保存しましょう。

            import signal
            import buttonshim
            import sys
            import pyaudio
            import wave
            
            BUTTONS = [buttonshim.BUTTON_A, buttonshim.BUTTON_B, buttonshim.BUTTON_C, buttonshim.BUTTON_D, buttonshim.BUTTON_E]
            
            # 録音する関数
            def recordSound(fn, recordSeconds, channels, rate):
                # 一度に取得する音声データのデータサイズ(2の10乗とする)
                chuck = 1024
                # PyAudioの初期化
                p = pyaudio.PyAudio()
                # 音声データを受け取れるようにする
                stream = p.open(format=pyaudio.paInt16, channels=channels, rate=rate, input=True, frames_per_buffer=chuck)
            
                # 音声データを入れる配列
                frames = []
            
                # 音声データを取得する
                for i in range(0, int(rate / chuck * recordSeconds)):
                    # chuckデータサイズ分、音声データを取得する
                    data = stream.read(chuck)
                    # 音声データを配列に格納する
                    frames.append(data)
            
                # 音声データの取得を停止する
                stream.stop_stream()
                stream.close()
                p.terminate()
            
                # 画像保存
                wf = wave.open(fn, 'wb')
                # チャンネル設定(ステレオ=2)
                wf.setnchannels(channels)
                # 量子化ビットサイズ(一般的には16bitを指定)
                wf.setsampwidth(p.get_sample_size(pyaudio.paInt16))
                # サンプリング周波数の設定
                wf.setframerate(rate)
                # 音声データを書き込む
                wf.writeframes(b''.join(frames))
                wf.close()
            
            # ボタンを押されたときに呼び出されるように設定する
            @buttonshim.on_press(BUTTONS)
            def button_p_handler(button, pressed):
                # Aボタンが押されたとき
                if (button == 0):
                    # 録音する(保存する音声ファイル名、録音する時間、チャンネル数、サンプリング周波数)
                    recordSound('output.wav', 5, 2, 44100)
            
            signal.pause()
    

コピー&ペーストできたら「Esc」キーを押して「コマンドモード」に切り替え、「Shift」キーを押しながら「z」キーボードを2回で保存し、vimエディターを閉じます。

プログラムを実行して録音する

プログラムの準備ができたら作成した「micbtn.py」を実行して、実際に録音を行ってみます。

ターミナルで、下記「sudo python3 micbtn.py」コマンドを入力します。

sudo python3 micbtn.py

sudo python3 micbtn.py実行画面sudo python3 micbtn.py実行画面

実行後、先ほどと同様にボタンモジュールのAボタンを押して録音を開始します。

「A」ボタンを押して録音を開始「A」ボタンを押して録音を開始

「ctrl」+「C」で録音を終了して、録音した音声ファイルを実際に確認してみましょう

「aplay output.wav」を実行して音声ファイルを聞くことができます

aplay output.wav実行画面aplay output.wav実行画面

下図のような表示となり、録音した音声が再生されます。

output.wav再生画面output.wav再生画面

「micbtn.py」プログラムを実行して録音した「output.wav」が再生される様子は下記の動画をご覧ください。

まとめ

今回の記事ではRaspberry Pi上でPythonを使って、写真撮影や音声の録音を制御してみました。

Pythonで開発を行うと、今回作成した「cambtn.py」や「micbtn.py」を見ていただくと分かるとおり、解説用のコメントが不要なくらいに分かりやすいプログラムですばやくやりたいことを実行することができます。

今回はシンプルな撮影と録音でしたが、別の機会にRaspberry Piでの画像認識や音声認識についてもご紹介したいと思います。

ライタープロフィール 合同会社 4D Pocket 石郷祐介

大学卒業後、公設研究機関勤務を経て、「情報科学芸術大学院大学[IAMAS]」に入学。
専門学校講師を経て、企業の研究開発をコンセプトから開発まで支援する「合同会社4D Pocket」代表、エンジニアを養成するフリースクール「一般社団法人HOPTER TECH SCHOOL」代表理事、「名古屋文理大学」及び「名古屋造形大学」非常勤講師。

記事を
シェア