超小型のシングルボードコンピューター「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」を起動します。
パッケージをインストールするためにはコマンド「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データベース関連のライブラリ)
上記インストールが終わったら、続いて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
続いてvimエディターで設定ファイルを編集します。
※vimエディターの使い方については下記記事を参照してください。
“Raspberry Piと各種モジュール等を接続して使う”
https://www.pc-koubou.jp/magazine/17276
下記コマンドを入力するとvimが起動し、「.bashrc」ファイルが開いた状態になります。
sudo vim .bashrc
「.bashrc」ファイルが開いたら、「i」キーを押して「編集モード」に切り替え、ファイルの一番下に下記のコードを追加して「pyenv」が使えるよう設定します。
export PYENV_ROOT=”$HOME/.pyenv” export PATH=”$PYENV_ROOT/bin:$PATH” eval “$(pyenv init -)”
上記記述して「Esc」キーで「コマンドモード」に移行した後、キーボードの「Shift」キーを押しながら、「z」キーを2回押してvimエディタを終了したら、LXTerminalを再起動します。LXTerminalを閉じてもう一回開いてください。再起動することにより設定ファイルに書き込んだ情報を反映させます。
これで、「pyenv」が使えるようになりました。
pyenvが使えるようになったら下記のようにpyenvコマンドを入力、実行します。
今回はpython3.6.1をインストールします。
pyenv install 3.6.1
インストール後、globalコマンドを下記のように入力し、デフォルトで使用するpythonのバージョンも3.6.1に設定しておきます。
pyenv global 3.6.1
これでpythonの準備は完了です。
Raspberry Piのカメラ撮影をPythonで制御する
カメラ撮影を制御するPythonプログラムの作成
Pythonの準備ができたら、Raspberry Piのカメラ撮影をPythonで制御するプログラムを作成します。まずカメラ操作に必要なライブラリのインストールを行います。
ターミナルで以下のコードを実行します。
sudo pip install picamera
今回はボタンスイッチが取り付けられたボタンモジュール(今回は「Button SHIM」)という部品をRaspberry Piに接続して、ボタンスイッチを押すと撮影ができるようにしたいと思いますので、ターミナルで以下のコードを実行してボタンモジュールを使うために必要なライブラリをインストールします。
sudo apt-get install python3-buttonshim
続いてウインドウ左上のRaspberry Piのメニューボタンから設定→Raspberry Piの順番でRaspberry Piの設定を開きます。
「Raspberry Piの設定」画面上部のタブから「インターフェイス」タブを選び、「カメラ」「I2C」の項目で「有効」ラジオボタンが選択されているかどうかを確認してください。もし「無効」になっていた場合は「有効」を選択して「OK」を押してください。
続いて 下記コマンドにより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」はRaspberry Pi上のGPIOピンに接続して使用します。上図を参考に、GIPIOピンに合うようにモジュールの向きに注意しながら取り付けます。
※作業は必ず通電していない状態で行ってください。また、部品取り付けの際にハンダ付けを行う場合は部品の破損等につながらないよう充分に注意の上、自己の責任で作業を行ってください。
プログラムを実行して撮影する
ボタンモジュールが接続できたら、ターミナルで、「sudo python cambtn.py」を実行します。
プログラムが実行されると、下図のように「Camera Start!」と表示されます。
上図の表示になったら、下図の赤い枠で囲まれた部分にある「A」の部分のボタンを押すと撮影が開始されます。
画像の撮影が完了すると、下図のように「Camera End!」と表示されるので「ctrll」+「c」でプログラムを終了します。
撮影した画像は「/home/pi」の中に保存されています。
実際に「cambtn.py」プログラムを実行して撮影画像が保存されるまでの様子は下記の動画をご覧ください。
Raspberry Piのマイク録音をPythonで制御する
マイク録音を制御するPythonプログラムの作成
今度はPythonでオーディオ端子に接続したマイクを使った録音を制御してみます。
はじめに、オーディオ端子を使用するために必要なライブラリをインストールしましょう。
ターミナルで下記コードを入力します。
sudo apt-get install portaudio19-dev
続いて下記のコマンドで音声を扱うためのライブラリ「python3-pyaudio」をインストールします。
sudo apt-get install python3-pyaudio
必要なライブラリの準備ができたら、録音を制御するプログラムを作成します。
撮影制御用のプログラムを作成した時と同じく、まずは下記コマンドを入力し、ホームディレクトリ(/home/pi)に「micbtn.py」ファイルを作成してvimエディターで開きます。
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
実行後、先ほどと同様にボタンモジュールのAボタンを押して録音を開始します。
「ctrl」+「C」で録音を終了して、録音した音声ファイルを実際に確認してみましょう
「aplay output.wav」を実行して音声ファイルを聞くことができます
下図のような表示となり、録音した音声が再生されます。
「micbtn.py」プログラムを実行して録音した「output.wav」が再生される様子は下記の動画をご覧ください。
まとめ
今回の記事ではRaspberry Pi上でPythonを使って、写真撮影や音声の録音を制御してみました。
Pythonで開発を行うと、今回作成した「cambtn.py」や「micbtn.py」を見ていただくと分かるとおり、解説用のコメントが不要なくらいに分かりやすいプログラムですばやくやりたいことを実行することができます。
今回はシンプルな撮影と録音でしたが、別の機会にRaspberry Piでの画像認識や音声認識についてもご紹介したいと思います。
大学卒業後、公設研究機関勤務を経て、「情報科学芸術大学院大学[IAMAS]」に入学。
専門学校講師を経て、企業の研究開発をコンセプトから開発まで支援する「合同会社4D Pocket」代表、エンジニアを養成するフリースクール「一般社団法人HOPTER TECH SCHOOL」代表理事、「名古屋文理大学」及び「名古屋造形大学」非常勤講師。