shimada-kの日記

ソフトウェア・エンジニアのブログです

Raspberry Piでドラムボードを試す

この記事は「LIFULL Advent Calendar 2017」12日目の記事として書かれました。

qiita.com

年の瀬ですね。年末です。もう今年もアドベントカレンダーの季節です。

ついこの間元旦だったような気さえしますよ。本当に時間の経過は早いものです。

はじめに

仕事でPythonを使うことになったので何かいいおもちゃはないかと思ってこれを期にRaspberry Piを買っていじってみることにしました。

Raspberry Piは言わずと知れた組み込み系のハードウェアですね。OSをMicro SDに焼いてそこから起動しますね。はい、ご存知の通りです。

Raspberry Piはそれ単体だとただの小さいコンピュータなので、何かデバイスと組み合わせてごにょごにょして遊ぶんですが。音が出るボードを2品ほど試してみたのでそのレポートになります。

使用したのはDrum HATとAdafruit Touch Hatの2つの静電容量式のセンサーボードです。

Drum HAT

www.switch-science.com

白い枠の内側部分がセンサーになっており白色LEDもコードで制御することができます。センサーの数は8つです。 「Drum HAT」だけあってドラムの構成楽器のモチーフが基盤にプリントしてあります。「海賊ロボ忍者さる」はよくわかりません。

f:id:shimada-k:20171212004643p:plain

ライブラリがわかりやすくマニュアルが充実しているので普通のエンジニアなら難なく動かせると思います。ただ残念なのが、むき出しで使うことが前提になっているようでセンサー部分の拡張性が全く考慮されておりません。

Adafruit Touch Hat

www.adafruit.com

こちらはタッチ部分が2穴になっていて、公式サイトのようにワニ型クリップで挟むことができるようになっています。センサーは12個です。

f:id:shimada-k:20171212004700p:plain

Drum HATの欠点だった拡張性が確保されていて基本的には触るモノ(もちろん導電性があるもの)をボードに接続することが前提になっています。

ただこちら、実は届いてそのままは使えませんでした。GPIOソケットと本体が別れた状態になっていて、はんだ付けが必要になります。

f:id:shimada-k:20171212005312p:plain

半田付けなんて中学か高校の技術の授業でやったっきりでした。ほんとうに久しぶりでした。そのためにはんだごてを購入しました。はんだごてって意外に安いものなんだということを知りました(800円程度)。

ライブラリについて

Drum HATの方はハードウェア部分は隠蔽化されていて使いやすいライブラリになっている感触です。プログラムを書く側はセンサー部分が反応した時のコールバックインターフェースの実装に集中できます。

Drum HATのサンプルプログラムを改良しクラス化して他のモジュールを組み込みやすいようにしてみました。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import glob
import os
import time
import drumhat
import pygame

import signal

from pprint import pprint

import sys

class TestDrum:
    #DUM_FOLDER = ""
    #files = None
    #samples = None

    def __init__(self, source):
        DRUM_FOLDER = source
    
        BANK = os.path.join(os.path.dirname(__file__), DRUM_FOLDER)
        pygame.mixer.init(44100, -16, 1, 512)
        pygame.mixer.set_num_channels(16)

        self.files = glob.glob(os.path.join(BANK, "*.wav"))
        self.files.sort()
        self.samples = [pygame.mixer.Sound(f) for f in self.files]

    def start_record(self):
        for i in [0, 1, 2, 3, 4, 5, 6, 7]:
            drumhat.led_on(i + 1)
            pygame.time.wait(100);
            drumhat.led_off(i + 1)

td = TestDrum("drums")
td.start_record()

def handle_hit(event):
    td.samples[event.channel].play(loops = 0)
    print("You hit pad {}, playing: {}".format(event.pad, td.files[event.channel]))
    td.hit_time = time.time()

def handle_release():
    pass

drumhat.on_hit(drumhat.PADS, handle_hit)
drumhat.on_release(drumhat.PADS, handle_release)

# シグナルハンドラ
def handler(signal, frame):
    # ここで終了処理を行う
    sys.exit(0)

signal.signal(signal.SIGINT, handler)

while(True):
    time.sleep(1)

一方Adafruitの方はDrum HATよりも一つ下のハードウェア層をいじらないといけないようなイメージです。サンプルを見ると自前で論理演算をやってどのセンサーが反応したかをメインループの中で判定していたりします。

github.com

まとめ

拡張性があるのは断然Adafruitの方です。基盤を直接触れさせたくないですしセンサー部分を基盤から切り離せるのは大きいです。Drum HATの方はアルミホイルを細長く切って繋いでみたり導電スポンジを切って接合部分に繋いでみたりしましたが残念ながら安定しませんでした。

pimoroniはこのDrum HAT以外にもPiano HATやRainbow HATやUnicorn HATなど色々なHATを販売しています。いろいろな組み込みプログラミングが安価で試せるのは素晴らしいですね。

Adafruitはボード自体はしっかりしてますが、ソフトウェアを頑張って作る必要があります。その分拡張性があるボートと12個のセンサーがありますので、仮にドラムの打楽器として8つ使ったとしても残り4つは制御用など別用途で使用できます。センサー部に導線を固定できる機構もありますのでネジとボルトで固定できます。

どちらも使い方次第で夢が広がるボードです。実際にモノを動作させるプログラムを書くのは新鮮で楽しいものです。