キノコの自省録

日々適当クリエイト

IoT智絵里アラームを作ろうと思う(2) - ソフト・ハード概念設計編

前回の続きです。智絵里フィギュアの土台に電子回路入れて、目覚ましを作ろうプロジェクト。

目覚まし概要

目覚まし時計なので、時計表示やアラーム設定ができるディスプレイ、操作ボタンなどなど必要かな、と考えたのですが、 欲しいのはアラームであって、時計ではないのです。別に現在時刻を見る必要はないし、何らかの手段でアラーム時刻が設定できれば良い。そして、設定した時刻にアラームが鳴れば十分です。へんてこなボタンがゴテゴテついたら嫌なので、できればバッサリいきたい。

ということで考えたのが、スマホから設定できればいいや、というインタフェースです。どうやってアラームを設定するか?というところですが、いくつかの実現手段があります。BLE通信する、カメラで2次元バーコードを撮らせる、Webサーバを立てる、赤外線通信(これはiPhone側にないですが)、音声認識など。今回は一番楽で拡張性も容易なWebサーバでやります。RaspberryPi ZeroWを中に入れる予定なので、外部のどこか適当な場所にサーバを立てるのではなく、目覚まし自体をWebサーバにしてしまいます。RaspberryPiは家のWiFiに繋いでしまえば、同じネットワークドメインなら自由にアクセスできます。

要するに今流行りのIoT機器ということですね。IoT智絵里アラーム。

物理的なブロック構成は、以下のような感じになります。Webサーバはなんでもいいんですが、割と使い慣れたNode.jsでやります。

f:id:kinokorori:20180324162831p:plain:w600

目覚ましのペリフェラル

ディスプレイと、アラーム設定用ボタンは要らないですが、かといって全くインタフェースが要らないかというと、それも困ります。スヌーズボタンと、アラームOn/Offボタンくらいはないと、アラームとして機能しません。もちろん、スピーカーとアンプ回路も必須です。

以上を踏まえた最低限必要な機器構成は、以下のようになります。一見シンプルですが、ボタン2つにスピーカーと、大物が3つあるため、箱のどこに取り付けるか考える必要が出てきます。なお、図のピン配は適当です。

f:id:kinokorori:20180324162958p:plain:w400

ということで、これを前回の箱の内部に取り付けていきます。

f:id:kinokorori:20170906212353j:plain:w300

フィギュアに電子回路を取り付けて目覚ましにする

フィギュアやプラモ(特にガンプラ)ってエレクトロニクスと抱き合わせると、もっと面白く、表現豊かになるんじゃないかなと、前々から漠然と考えてました。といっても、実際に駆動させるとなると、それは材料からやり直しになる上、造形師の協力が必要なので、流石にそこまでのことはちょっと厳しいですが。ちなみに、この分野に真剣に取り組まれている、スピーシーズという会社があります。私はこの手の機構設計は全くさっぱり知識がないものの、興味はあります。ちょっとやってみたい。単純に面白そうだし、夢がある感じ。

HOME of Speecys Kichijoji Design Studio

今回は、もっと難易度を落として、フィギュアの土台をデコるついでに、土台の中に電子基板を入れて、ちょっとした機能を追加してみようと思います。それでも、結構面白い試みになるんじゃないかと思ってます。

台座って自作している方が多いみたいで、探すと多数見つかります。アクリル台座が多い印象。

何を作るか

とりあえず土台を何かの箱に差し替えて、中に基板を入れます。どういった機能を実装するかですが、今回は目覚まし機能を入れようと思います。目覚ましなら、キャラクターボイスが生かせますし。

対象と台座

この智絵里フィギュアを改造します。

あれ、今売ってるのって、アクリル台座なんですかね?手持ちとちょっと違います。しかもなんか値段が上がってますね。。。それはさておき、智絵里の見た目で、智絵里ボイスの目覚ましを作るということです。こりゃすげえ。

手持ちの台座は至ってシンプル。ABS樹脂ですかね?取り外しも簡単。中央の穴に足の先を挿入して立たせる感じです。

f:id:kinokorori:20180324140502j:plain:w300

代わりの台座は100均で買った、この木箱を使います。キャラ的に木材の方が合うかと思ったので。この中に回路を取り付ける予定。

f:id:kinokorori:20180304152939j:plain:w300

台座の穴あけ

採寸した足の穴を開けて、ヤスリかけて終わり。簡単です。穴は彫刻刀で開けました。ドリルや糸鋸使うなど、いくらかやり方がありますのでお好みで。

f:id:kinokorori:20170906211051j:plain:w300

ばっちり立ちます。鉛筆や削りの汚れがありますが、上にカバーかけてデコる予定なので無問題です。

f:id:kinokorori:20170906212353j:plain:w300

次回はソフトウェア・ハードウェアの設計のお話になると思います。

RaspberryPiでGPIO(I2S)を使ってマイクから録音する

RaspberryPiで録音方法について調べると、大抵USBマイクの紹介記事が見つかります。USBマイクは楽ですが、USB-Aが必要なのでRaspberryPi Zeroの場合はmicroB→HostA変換する必要がありますし、そもそも場所を取るので取り付けに困ったりします。特に、小型化したいとか、基板上に配置したいといった場合に苦労します。

ということで、GPIOで録音する方法を紹介。

方法

RaspberryPiはA-Dコンバータを積んでいないので、デジタル信号を入力する必要があります。音声信号のデジタル入出力は、I2S、PDM、TDMなどがあります。I2Sが一番メジャーで、RaspberryPiもI2Sをサポートしています。

そんなわけで、I2SでRaspberryPiに入力して録音する方法を模索します。

マイクの調達

まずはI2SでRaspberryPiにマイク音声を入力するって、どんな部品を調達すればいいいんでしょう?というところから。”I2S RaspberryPi”とかで検索すると、お値段の高いハイレゾDACに関する記事が大量に見つかります。いや、そっちじゃないんです。DACじゃなくてADCが欲しいんです。

それはさておき、I2SをOutputにするADCは例えばこんなものがあります。

ADAU1977 データシートおよび製品情報 | アナログ・デバイセズ

このADAU1977は、RaspberryPiに標準でDeviceTreeにドライバが登録されています。ただ、チップ単体販売なので、基板を作らなければならないので非常に面倒くさいです。私も扱ったことがないので、たぶんできるよとしか言えません。

しかし、世の中には、I2S出力するデジタルマイクが存在したりします。便利な世の中になったものです。手に入りやすいところではADMP441, SPH0645LM4H, ICS-43432あたり。ADMP441なら秋月電子DIP化キットが売っているので、今回はこれを使います。1つ750円。

ADMP441 DIPモジュール: パーツ一般 秋月電子通商 電子部品 ネット通販

SPH0645LM4Hにもスイッチサイエンス製のモジュールキットがあります。こちらはAmazonでも購入可能。


SPH0645LM4H搭載 I2S MEMSマイクモジュール

ADMP44 DIP化キットはんだ付けの注意

マイクの開口部が実装面の裏にあるので、ピンヘッダの装着面に注意しましょう。この通り、ちゃんと説明書に書いてあります。が、私ははんだ付けしてから気づきました……。

f:id:kinokorori:20180224212215j:plain

ピン配置

ピンの配置は次の通りです。直接挿すだけなので、難しくないです。L/RはGNDの場合は左チャンネル、+Vの場合は右チャンネルになりますが、1つしかマイクがない場合はどのみちモノラルになります。

電源電圧は1.8V~3.3Vなので、3.3Vピンに接続しましょう。動作時の消費電流が1.4mAなので、余裕で給電可能です。

f:id:kinokorori:20180225014458p:plain

RaspberryPiの設定(ソフト)

上記の通り、I2SのGPIOピンは18,19,20(,21)を接続し、ALT0で利用します。ただし、ALT0でI2Sを有効にするだけでなく、デバイスドライバも必要です。しかし、RaspberryPiのデフォルトでは、I2Sマイクで利用可能なモジュールが存在しません。

ただ、カーネルソースにはモジュールがあるので、カーネルをビルドしてカーネルモジュールとくっつけて利用する説明が数多く存在します。

この辺とか。

GitHub - nejohnson2/rpi-i2s: Using the ICS43432 MEMS microphone on a Raspberry Pi with i2s

調べていると、Device-Treeを利用した、もっと簡単な方法を公開している人がいましたので、今回はそちらを紹介します。

GitHub - gtalusan/admp441-rpi: ADMP441 for the Raspberry Pi

手順は書いてありますが、少し補足説明を加えておきます。

kernelフォルダのビルド

git cloneして、kernelフォルダの中身をビルドします。

$ git clone https://github.com/gtalusan/admp441-rpi.git
$ cd admp441-rpi
$ cd kernel
$ make
$ make install

おそらく、make時に以下のようなエラーが出ると思います。

make -C /lib/modules/4.9.59+/build M=/home/pi/admp441-rpi/kernel modules
make[1]: *** /lib/modules/4.9.59+/build: No such file or directory.  Stop.
Makefile:4: recipe for target 'all' failed
make: *** [all] Error 2

このエラーが発生した場合、

$ sudo apt-get install raspberrypi-kernel-headers

を実行してみてください。それでも解決しない場合、おそらくraspberrypi-kernel-headersでインストールされるバージョンと、uname -rのバージョンがずれています。カーネルビルドを施したのであれば、ターゲットのbuildから、ビルドに用いたlinuxディレクトリへのシンボリックリンクを貼ってみてください。

Device Tree Overlay

Device-Treeに登録します。

$ cd ../dts
$ dtc -@ -I dts -O dtb -o i2s-soundcard.dtbo i2s-soundcard-overlay.dts
$ sudo cp i2s-soundcard.dtbo /boot/overlays

これはただ実行するだけです。dtc実行時にwarningが出ますが、特に問題はなさそうです。

Configuration

以上の全てが完了後、/etc/modulesの末尾にadmp441を追加し、/boot/config.txtに、dtoverlay=i2s-soundcard,alsaname=mems-micを追加します。

編集を終えたらリブートをかけます。これで完了です。

※ ADMP411専用っぽい感じがしますが、I2SのMEMSマイクなら、同じモジュールで動作する可能性が高いです。

録音

まずは、録音デバイスの確認。arecord -lを叩いてチェックしてみます。

$ arecord -l
**** List of CAPTURE Hardware Devices ****
card 1: memsmic [mems-mic], device 0: bcm2835-i2s-admp441-hifi admp441-hifi-0 []
  Subdevices: 1/1
  Subdevice #0: subdevice #0

先ほど登録したmems-micがデバイスとして見えています。 では、早速録音してみます。

$ arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono voice.wav
Recording WAVE 'voice.wav' : Signed 32 bit Little Endian, Rate 48000 Hz, Stereo

これでvoice.wavに音声が録音されます。録音できました、やったーと思いきや、めちゃくちゃゲインが低いです。再生してもなんだかほとんど聞こえません。

ゲイン調整

alsamixerやamixerでボリュームを調整できるよう、ALSAのPCMプラグインを登録します。ALSAのPCMプラグインは、ユーザ設定の場合は~/.asoundrcファイルに、システム全体に反映させる場合は/etc/asound.confに書き出します。今回は~/.asoundrcに書き出します。ファイル内容は以下の通りです。

pcm.dmic_hw {
    type hw
    card memsmic
    channels 2
    format S32_LE
}

pcm.dmic_sv {
    type softvol
    slave.pcm dmic_hw
    control {
        name "Boost Capture Volume"
        card memsmic
    }
    min_dB -3.0
    max_dB 30.0
}

上記内容は、基本的にここの情報を参照して、少し組み替えています。 https://learn.adafruit.com/adafruit-i2s-mems-microphone-breakout/raspberry-pi-wiring-and-test

※PCMプラグインのフォーマットについては、こちらを参照のこと。 ALSA project - the C library reference: PCM (digital audio) plugins

登録はしたものの、alsamixerを開いても項目が出てきません。しかし、一度以下のようにもう一度arecordを実行したところ、alsamixerやamixerで設定できるようになりました。

$ arecord -D plughw:1 -c1 -r 48000 -f S32_LE -t wav -V mono -v voice.wav

うーん、これは要調査ですね。とりあえず今回は、この問題は横に置いておきます。

$ alsamixer

でalsamixerを起動し、F6キーを押して、”mems-mic”を選択します。mems-micのボリューム設定に切り替わったら、F4キー、またはTABキーを押して、Captureの音量設定に切り替えます。

f:id:kinokorori:20180304015007p:plain

ボリュームを適当にあげて、再度録音してみましょう。今度はだいぶ録音音量が大きくなったはずです。

RaspberryPi ZeroでGPIOを使って音声出力をするお話(2)

以下の続編(解説編)です。音声出力というより、どちらかというとGPIOのAlternative Functionの話です。

kinokorori.hatenablog.com

そもそも一体何をしているのか

dtoverlayを使用した方法では、以下のような指定をして、PWMを有効にしました。

dtoverlay=pwm-2chan,pin=18,func=2,pin2=13,func2=4

また、gpio_altを使用した方法では、最終的には、以下を実行して、PWMを有効にしました。

$ gpio_alt -p 13 -f 0
$ gpio_alt -p 18 -f 5

果たしてこれは何をしているのでしょう、というお話。

PWM(パルス幅変調)を用いて音声出力する機能が、RaspberryPiに備わっています。それを有効にしているだけといえばだけです。PWMにはPWM0とPWM1の2pinが必要で、それをgpio_altやdtoverlayを使って有効にしているというのが、解説先で紹介されている方法です。

上記例では、GPIO 13のファンクションを0(ALT0)、GPIO 18のファンクションを5(ALT5)にすることで、GPIO13をPWM1に、GPIO18をPWM0に設定しています。

ALTって何?

BCM2835(RaspberryPiのCPU)のGPIOピンには、切り替え可能な機能が最大6種類割り振られています。それがALT0やALT5と呼ばれるものです。raspi-configを使用して、I2CやSPIなどを有効にしたことがあると思いますが、それは、対応するピンをALT0に変更するということを裏で行っています。ALTを設定していない状態の場合、大抵はINです。IN、つまり外部からHIGH/LOWを受け取るだけの単純な機能ということです。

ALT0がどういう機能なのか、ALT5がどういう機能なのかは、このページを参照するのが良いと思います。

RPi BCM2835 GPIOs - eLinux.org

この表の通り、GPIO13のALT0はPWM1、GPIO18のALT5はPWM0です。GPIO18をALT0(I2S)として使いたい場合、別のPWM0の機能を持つピンを探せばよいということです。GPIO12のALT0にPWM0がありますので、gpio_altの場合、

$ gpio_alt -p 13 -f 0
$ gpio_alt -p 12 -f 0

を実行して、GPIO18からGPIO12に配線しなおせば、ちゃんと音声の再生ができるようになります。

dtoverlayの場合は、

dtoverlay=pwm-2chan,pin=12,func=4,pin2=13,func2=4

となります。func=4がALT0です。紛らわしいので注意。うまく再生できない場合はgpio readallで確認しましょう。

Raspberry PiにNode.js + Expressをインストールする虎の巻

Node.js + Expressのインストール手順を紹介。半分は自分備忘録用。Raspberry Piとタイトルで書いてますが、基本的にどのLinux環境でもほとんど一緒です。自分の場合、AWS-Linuxでも同じ手順でやってます。

なお、gitがインストールされていることが前提。Raspbianならsudo apt-get install gitです。

$ git clone https://github.com/creationix/nvm.git ~/.nvm
$ vim ~/.bash_profile
    #.bash_profileに以下を設定
    if [[ -s ~/.nvm/nvm.sh ]] ; then
            source ~/.nvm/nvm.sh
    fi
$ . ~/.bash_profile
$ nvm install --lts
$ nvm use --lts

ここでNode.jsが使用可能に。

$ node -v
v8.9.4

※バージョンはltsを指定しているので、インストールした日によって変わります。

最後にExpressの用意とプロジェクトテンプレートの展開。

$ npm install express-generator -g
$ express kinoko_project
$ cd kinoko_project
$ npm install

ここでExpressを使用したプロジェクトが使用可能に。

$ npm start

デフォルトポートは3000なので、localhost:3000にアクセスすれば、Webページが見れるはず。

続・Witch Criedをニコニコ闘会議2018に出展しました

続きです。

Witch Criedをニコニコ闘会議2018に出展しました - キノコの自省録

このゲーム、作ったはいいけど知名度が全く上がらず、かといって宣伝手段もないという状態だったので、 せめて多くの人の目に触れてくれれば、という思いで自作ゲームフェスに応募しました。

結果として、動画やゲーム自体の閲覧数が増え、さらに何人かのゲーム実況者の方に実況していただけたということで、思ったより多くの効果がありました。非常に感謝しています。 ようやく本当の意味でリリースが出来たと思っています。これでメイも報われました。

実況動画紹介。

www.nicovideo.jp

↑ めちゃくちゃイケボでFateの詠唱をしています。こういう動画、待ってました。

www.nicovideo.jp

↑ 色んな魔法詠唱をされていて、むしろ自分が参考になりました。

まだまだ、感想・実況お待ちしています。

このゲームへの想い

このゲームは、前々から書いていますが、「音声魔法インタフェースを世に広めること」を目的としています。 VRの時代に、30年前と変わらずポチポチ選択するしか魔法が撃てないって有り得ないでしょう。 そういう不満があって、このゲームを作りました。

世に広めることが主目的なので、人目に触れないというのは、個人的に最も不本意なことでした。

なんでこんなにボリューミーなのか

このゲーム、割ときっちりステージを組んでいて、そこそこボリューミーです。

正直、魔法を詠唱する楽しさだけ体験してもらうなら、ステージが2, 3あれば十分です。実際、オツムの弱い子達さんはチュートリアルから進んでません。 個人的にはその楽しみ方も全然OKで、そういう人の方がむしろ多いのでは?とさえ思っています。

じゃあなんでステージをカッチリ作ったのか、というと、音声魔法インタフェースが実際にゲームのインタフェースとして有用かどうかを示すためです。 面白いね、でもこれじゃ普通のゲームには使えないね、という評価を避けたかったということです。 詠唱時間と威力をトレードオフにして、選ぶという行為を詠唱することですり替えることで、それなりにゲームのインタフェースとしての優秀さは出せたのではないかと思います。

ただ、一方で、魔法を使うということの難しさと面倒くささが浮き彫りになっているという側面もあります。 その辺りは今後の課題というところでしょう。

ちなみに、選ぶ・放つという行為を無手で出来るため、コントローラーを激しく操作しながら魔法を発動するということが可能になります。 つまり魔法詠唱+アクションゲームということです。個人的にはこの組み合わせが一番親和性が高いと思っていて、本当はそっちを作りたかったんですが、スマホだと入力インタフェースに限界があるため、それは断念しました。 じゃあPCは?となると、PC用マイク持っている人がそもそも少数という問題があります。

※授賞懇親会でこの話をしたところ、PCゲーでもマイク使うゲームが滅茶苦茶人気を集めていたとか。ならPCゲームも有りかなと今は思ってます。

失敗

最も失敗だったのは、iOS専用になってしまったことです。Cocos2dをエンジンに採用したのはいいんですが、なんとなくぼんやり作り始めた時はバージョン2で、これがObjective-Cなんですね。 なので、他のプラットフォームに移植できなくなりました。 程なくしてCocos2d-xというC++のバージョンが出たのですが、移植するのが絶望的に面倒だったため、そのまま2d-2で開発継続してしまいました。

一部、魔法リストなどはUIKit系使っているため、そのままではAndroidに移植できないとか、手持ちのAndroid端末が古い機器しかないなどの都合もあります。

それでも、3, 4年くらい前にリリース出来たのであれば、iOS専用品であっても注目も集めたかもしれませんが、今はもうレッドオーシャンな上に、アプリが多すぎてニュースサイトも機能していないほどになっています。 そのため、発信力がないと、現状、「誰かが見つけてくれるのを待つ」という苦しい事態になっています。

ダラダラと長期間かけて開発してしまったことも影響しています。これは素直に実力不足です。長期間の開発になると、環境がどんどん変化するため、最新リリースで既に時代遅れになるということです。

ゲーム登録サイトは結構ありますが、iOS+Cocos2dだと、登録しようもないんですよね。割と手詰まりになりました。 そんなわけで、今回のニコニコ自作ゲームフェスはその辺りを救済して貰えたと思っています。感謝。

※アプリなら検索ワードが直刺さるので、結構見つけてくれます。ゲームは厳しいです。

ニコニコ自作ゲームフェスについて

個人的にはレギュレーション違反にならなかっただけでも感謝、作品が割と多くの人の目に触れただけで圧倒的に感謝です。 授賞イベントでクリエイターの人たちとお話しする機会もあって、なかなか勉強になりました。

一方で、昨年はツクールMV作品のみ受付で、今年は以前に戻ってどんな作品でも受付可能に変更したというレギュレーションの変更については、思うところがあります。

ツクールMV作品のみとした前回のレギュレーションは、明らかにドワンゴカドカワの傘下になった影響だと思います。 去年がどうだったのか知りませんが、レギュレーションを変えたということは、2016以前に比べて、2017はあまり盛り上がらなかったのでしょうか?まあ、常識的に考えれば、条件を滅茶苦茶絞って盛り上がるとはちょっと思えません。

ネットワークコミュニティが台頭して、オープン化戦略の有用性がはっきり認められている時代に、わざわざ間口を狭めて自社コンテンツのみを推奨するような決定は、正直言って緩慢な自殺行為に見えます。

ただ、今年は間口が広がりました。おかげで作品を登録することができました。しかし、協賛企業を見ると、以前よりだいぶ寂しくなったように見える、というより、ツクールMVやRPG作品を投稿してほしいように見えます。一方で、以前のような、特にそんなしがらみなく作品を集めたいという願いも感じられます。単純に、以前に戻せなかったのか、思惑が働いたのかはわかりません。

今回の間口を広げたという決定が良い方向であると、未来志向へシフトしてくれるという意思表示だということを願ってやみません。

※私は別にカドカワが嫌いなわけではありません。

Witch Criedをニコニコ闘会議2018に出展しました

Witch Criedが敢闘賞を受賞したため、ニコニコ闘会議の自作ゲームブースに出展してきました。

f:id:kinokorori:20180210154611j:plain

ニコニコ自作ゲームフェスは、コンテンツ(ストーリー、デザイン)やコンセプトに大きな比重を置いているようです。 なので、コンセプトはともかく、それを実現するエンジニアリングに重点を置いてる本作は、結構場違いだった感はあるのですが……。

とりあえず詳細はまた改めて記載します。

ちなみにマグカップを頂きました。

f:id:kinokorori:20180211004238j:plain:w350

デカマグカップですね。このマグカップ、どこかで見覚えが……。

f:id:kinokorori:20180211004334j:plain:w350

プリントマグの定番品なんでしょうかね。 プリントマグも面白そうと思ってしまった。

今回、こんな名刺も用意していきました。名刺大事。

f:id:kinokorori:20180211015009j:plain:w300

名刺は100枚500円~1200円程度で作れるので、絶対作った方が良いと思います。 私は今回ラクスルで作ってもらいました。