がじぇっとるねさす

ホビーとエレクトロニクスを繋げるサイト

がじぇるね工房

作品タイトル:GR-CITRUSプレーヤー

表示名:登尾 徳誠

GR-CITRUSプレーヤー

コンセプト・作品説明
こんにちは、コワーキングスペースHaLakeを運営しています、ニャンパス株式会社の登尾と申します。
今回、GR-CITRUSとWA-MIKANを使って圧力センサーからの操作で音を鳴らしてみます。さらに、Wifi経由で、ブラウザから動くデバイス(PCやスマートフォン、タブレット)からも操作する方法を説明します。

もともと圧力センサーによって、あるいは遠隔操作で音を変えたいというのは、コワーキングスペースHaLakeで障害者向けの機器を作ろうとういハッカソンを開催したところから、幾つかの作品作りの一つとして作ってきていました。GR-CITRUSはその中でも、コンパクトなサイズと、WA-MIKANを使ったSDカードの音の再生が手軽にできて扱いやすいデバイスです。

圧力センサーからの操作方法が分かれば、例えばおもちゃに組み込んでいろいろなきっかけで音がなる装置を作れるといった事もできますし、Wifi経由での操作がわかるといろんな応用が効くかと思いますので、ぜひモノ作りに活かしてみてください。
####

圧力センサーで音を鳴らす - 仕組みと組み立て

圧力センサーはふれている間抵抗値が変化しますのでその変換をもとに短い時間で何回タップされたかという判断をGR-CITRUSで行い、そのタップ回数に応じて再生させる曲を決定し再生を行います。WA-MIKANについているESP-8266は使用しません。

 

スピーカー - GR-CITRUS - 圧力センサー

WA-MIKAN(SDカードから曲を読み込む)

 

 

圧力センサーには、秋月電子で購入の”圧力センサーFSR406”を使用し、スピーカーも同じく秋月電子で購入の”圧電スピーカー(圧電サウンダ)SPT15”を使用しました。スピーカー部分は、アンプモジュールでも試して問題なく利用できています。

GR-CITRUSのピンマックはこちらにあります。

http://gadget.renesas.com/ja/product/citrus.html

これを見ながら、A0に圧着センサーの片方をGNDに繋ぎ、もう片方を抵抗を経由させて3.3Vに繋ぎます。さらに抵抗とセンサーの間からA0をジャンパーワイヤーなどで繋ぎます。

圧電スピーカーは、赤いケーブルをSer.1 TXの0番ピンに、もう片方をGNDに繋ぎます。

また、予めSDカードを用意し音のデータを入れておいてください。ファイル形式はMP3を想定していますが、WAVファイルもいけるようです。

  • S.WAV
  • 1.WAV
  • 2.WAV
  • 3.WAV
  • 4.WAV

S.WAVファイルは起動のたびになる音として想定しており、それ以外の音はタップした回数に応じて鳴る音を想定しています。

####

圧力センサーで音を鳴らす - 実装

ガジェルネのサイトからWebコンパイラを使って書き込みを行います。

こちらのサイトから、ログインしてください。

http://gadget.renesas.com/ja/

GR-CITRUS用のサンプルが用意されておりさらにSDカードからの音の再生するためのプロジェクトもありますので、これをそのまま利用します。

下図の通りプロジェクトを作成時のテンプレートとして、GR-CITRUS_MP3_WAVを選択してください。

 

このテンプレートによってプロジェクトを作成することで、gr_sketch.cppファイルが作成されますので、このファイルをもとに以下のように書き換えました。

 

#include 
#include 
#include 
#include 
#include 

#define LED_ON		HIGH
#define LED_OFF		LOW

WavMp3p wavmp3p(44100);
File root;

static void touch_handler(void);

void setup()
{
	Serial.begin(115200);
    Serial3.begin(115200);

	pinMode(PIN_LED0, OUTPUT);
	digitalWrite(PIN_LED0, LED_ON);

	while(!SD.begin())
	{
		Serial.println("Card failed, or not present.");
		digitalWrite(PIN_LED0, LED_OFF);
		delay(1000);
		digitalWrite(PIN_LED0, LED_ON);
	}

	pinMode(SW_PAUSE, INPUT_PULLUP);
	pinMode(SW_SKIP, INPUT_PULLUP);

	MsTimer2::set(200, server_handler);
	MsTimer2::start();

	wavmp3p.play("S.MP3");
}

void loop() {
}

static void touch_handler() {
	static int tapSumFirstValues = 0;
	static float tapAvgValue = 0;
	static int TAP_COUNT_AVG = 10;
	static int tapFirstCounts = TAP_COUNT_AVG;
	static int tapTime = 0;
	static int tapCount = 0;
	static bool isTapped = false;

	if (tapFirstCounts > 0) {
		tapSumFirstValues +=  analogRead(A0);
		tapFirstCounts--;
		return;
	}
	if (tapFirstCounts == 0) {
		tapAvgValue = (float)tapSumFirstValues / TAP_COUNT_AVG;
		tapFirstCounts = -1;
	}
	Serial.println(tapAvgValue);
	int v = analogRead(A0);
	if (((float)v / tapAvgValue) < 1.0) {
		isTapped = true;

	} else if (isTapped) {
		tapCount++;
		isTapped = false;
		tapTime = 0;

	} else if (tapTime > 20) {
		switch (tapCount) {
		case 0:
			break;

		case 1:
		case 2:
		case 3:
		case 4:
			wavmp3p.play((String(tapCount) +  ".MP3").c_str());
			break;

		default:
			wavmp3p.play("S.MP3");
			break;

		}
		tapCount = 0;
		tapTime = 0;
	}
	
	tapTime++;
}

ポイントはtouch_handler関数の中でA0ピンからの値をもとにタップされたかどうかを検知、その回数が何回かによって、MP3ファイルの再生を初めているところです。

GR-CITRUSの書き込みはこちらのチュートリアル(http://gadget.renesas.com/ja/product/citrus_sp2.html)が参考になります。

無事書き込みに成功すると圧力センサーのタップに応じて音が切り替わりますので、いろいろと応用してみてください。

####

リモートで音を鳴らす - 仕組み

先ほどとの違いは、WA-MIKANにあるESP8266モジュールを使用してリモートで音の再生を行う点です。

 

スピーカー - GR-CITRUS       _

WA-MIKAN(SDカードから曲を読み込む + ESP-8266がWifiルータと通信)

 

ESP8266はWebサーバとして動くように書き換え、ESP8266へブラウザなどからアクセスすることによって再生したい音を伝え、ESP8266からのシリアル通信でその曲名をGR-CITRUSが理解して再生が始まるという流れです。

####

リモートで音を鳴らす - WA-MIKAN側の準備

WA-MIKANのマイコンであるESP-8266はもともとのファームウェアが用意されていますが、

Arduino IDEを使ってWA-MIKAN用に書き換えています。

WA-MIKANの書き換えには以下の資料を参考にしました。

http://www.slideshare.net/MinaoYamamoto/wamikan

 

具体的には、WA-MIKANのJ1をオンにして、SDカードのスロットがない方の6つのピンが並んでいるところから、3.3V、GND、RXD、TXDのピンとUSB-TTLシリアル変換ケーブルを繋ぎます。USB-TTLシリアル変換ケーブルは、3.3Vが出るものを使ってください。

ソフトウェアとしてはArduino IDEを使って書き込みます。Arduino IDEの仕組みであるボードマネージャーというのを使って、ESP8266に書き込める準備を行います。

 

(図: 書き込んでいるところ)

Arduino IDEを起動後、[Preferences]を開き、”追加のボードマネージャーのURL”の入力欄の中に以下のURLを入力してください。

http://arduino.esp8266.com/stable/package_esp8266com_index.json

入力後、[OK]を選択し、次に[ツール]メニューの中から[ボード]で始まるメニューを選ぶと、その中からさらに[ボードマネージャー]という選択肢がありますのでこちらを選択します。

すると[ボードマネージャー]というダイアログが現れますので、ここから”esp8266 by ESP8266 Community”をスクロールして選択しインストールを行います。インストール完了後、念のためArduino IDEを再起動しておいてください。

[ツール]メニューの[ボード]にカーソルを合わせると、その中に”Generic ESP8266 Module”という選択肢が出ていれば正しくインストールが出来ていますので、これを選択しておいてください。

ここから実際に書き込みを行います。[ファイル]メニューから、[スケッチの例] > [ESP8266WebServer] > [HelloServer]と選択してください。

まず、このサンプルファイルのhandleRoot関数を以下のように書き換えます。

 

void handleRoot() {
  server.send(200, "text/plain", "hello from wa-mikan!");

  for (uint8_t i=0; i

 

これによって、Webサーバとして受けたリクエストの引数をシリアル通信で送信するようになります。例えば例として、ESP8266に対してブラウザから、

              http:///?a=hoge

とリクエストを投げますと、ESP8266はシリアル通信へ、

              a: hoge

という結果を送信します。この仕組を使って再生させたい音のファイル名をGR-CITRUSへ渡すという流れになります。

忘れてはいけないのが、SSIDとパスワードの設定です。アクセスポイントの設定になりますので、6、7行目にある設定部分を正しいアクセスポイントの設定に変更してください。

const char* ssid = "";

const char* password = "<パスワード>";

また、ESP8266がアクセスポイントに繋がったときにIPアドレスが何になったのかが分からないとアクセスできないことになりますので、mDNSという仕組みを使って、IPアドレスへの名前解決を行うようにします。すでにサンプルに使ったHelloServerのソースコードはmDNSに対応していますので、以下の箇所を分かりやすいwa-mikanという名前に変更しておいてください。

(54行目付近にあります。)

  if (MDNS.begin(“wa-mikan")) {

    Serial.println("MDNS responder started");

  }

こうしておきますと、http://wa-mikan.local/というURLでアクセスできるようになり、わざわざIPアドレスを調べる必要がなくなり便利です。

以上の変更をArduino IDE経由でWA-MIKANへ書き込んでください。

 

####

リモートで音を鳴らす - 実装

長くなりましたがここまででWA-MIKAN側の設定が終わりましたので、最後にGR-CITRUSへの書き込みを行います。圧力センサーのときにやったようにWebコンパイラを使い以下のプログラムを書き込んでください。

 

#include 
#include 
#include 
#include 
#include 

#define LED_ON		HIGH
#define LED_OFF		LOW

WavMp3p wavmp3p(44100);
File root;

static void server_handler(void);

void setup()
{
	Serial.begin(115200);
    Serial3.begin(115200);

	pinMode(PIN_LED0, OUTPUT);
	digitalWrite(PIN_LED0, LED_ON);

	while(!SD.begin())
	{
		Serial.println("Card failed, or not present.");
		digitalWrite(PIN_LED0, LED_OFF);
		delay(1000);
		digitalWrite(PIN_LED0, LED_ON);
	}

	pinMode(SW_PAUSE, INPUT_PULLUP);
	pinMode(SW_SKIP, INPUT_PULLUP);

	MsTimer2::set(200, server_handler);
	MsTimer2::start();

	wavmp3p.play("S.MP3");
}

void loop() {
}

static void server_handler() {
	String readString = "";

	if (Serial3.available()) {
		while (Serial3.available()) {
			delay(1);
			char c = Serial3.read();
			readString += c;
		}
		Serial.println(readString);
		if (readString.startsWith("s: ")) {
			String soundFile = readString.substring(3);
			soundFile.remove(soundFile.length() - 2); // trim newline
			Serial.println("play: " + soundFile);
			wavmp3p.play(soundFile.c_str());
		} else {
			Serial.println("not mutch command");
		}
	}
}

圧力センサーよりもコード量が短くなっていますが、機能はパワーアップしていてWifi経由での音の再生に対応するようになりました。これはWA-MIKANに搭載のESP8266が頑張ってくれているからです。

####

再生してみよう!

ここまでの手順で、GR-CITRUS+WA-MIKAN側は完成しましたが、まだ実際に曲を選択させるブラウザ側の画面ができていません。以下のようなHTMLファイルをいずれかのWebサーバ上においてPCないし、タブレットやスマートフォンからアクセスしボタンを押すとHTMLが表示されます。

(本来は、ESP8266がWebサーバとして動いていますのでこのサーバ上にHTMLファイルを置いてて動くようにすればスマートなのですが、この記事を読まれた方の次のステップアップとして宿題という形にさせてください。)

/edDir/files/citrus_player_sample.html

HTML中のbuttonタグの部分のdata-idという属性部分がボタンを押したときに再生されるSDカードに保存したファイル名に当たりますので、こちらを書き換えていただければ自由に曲再生が可能です。

 

ちなみにMac環境であれば、Pythonが標準で入っていると思いますので、以下のコードで[ターミナル]上からPythonのWebサーバとして立ち上がりますので、先ほどのHTMLファイルをと同じディレクトリに置いて、”http://:8000/”とブラウザからドレスを打ち込むとページを見ることが出来き、現れるボタンを押すことで WA-MIKANのESP8266と同じWifi上にあれば音の再生が始まります。

         % python -m SimpleHTTPServer

登尾 徳誠

ニャンパス株式会社代表で、越谷市レイクタウンにてコワーキングスペースHaLakeを開催、IoT勉強会やプログラミング教室を毎週開催してます。

フォローする

share