開発経緯
我が家には子供が練習で使っていた電子ピアノがあります。子供の習い事を卒業する事になり
ピアノを触る機会が少なくなりました…
以前から、こちらのピアノにはBluetooth機能が備わっている事は知っており、それを使って
面白い事したいと思ってました。
習い事をしている時は、『変な事して、壊されてしまったら困る』と警戒されていましたが、
(そもそも、私の日頃の〇〇が悪いとツッコミはおいておいてw)ある程度触らせて貰えそう
なので、これとBLE機能を持ったSPRESENSEを使ってピアノと連携した事をできないか思い取り組む事に
してみました。
システム構成
システム概要図を以下に記載します。
SPRESENSEのメインボードはBLEの拡張ボードを使って、BLE Centralとして動作し、
ピアノ側のPeripheral(CN29)と接続します。
ピアノ側で演奏すると、鍵盤のノート情報がNotify信号をとして、SPRESENSE側に通知されます。
通知された情報を元にメインボードはおもちゃの車に、右旋回または左旋回を指示します。
部品リスト
No | 名称 | 購入先 | 備考 |
---|---|---|---|
1 | SPRESENEメインボード | モニタ提供 | 外部電源用コネクタ実装 |
2 | BLE1507 (BLE for Spresense) | モニタ提供 | serialization FW版 |
3 | モータードライバー | amazon | MX1508のICを使用 |
4 | 2輪駆動のおもちゃの車 | aliexpress | 昔に購入したもので、リンクが切れていました。アマゾンにもありましたが参考情報として掲載します |
5 | 電池ボックス(単3 1.5v x 2) | 秋月電子等 | おもちゃのモーター駆動用 |
6 | 電池ボックス(LR44 1.5v x 3) | Daiso | SPRESENSE動作用 |
7 | 信号接続ケーブル | 秋月電子等 | モーター制御信号との接続 |
配線接続
メインボードの上部のピンはBLE1507で干渉する為、モータードライバは使用されていない、
I2C_SCL,I2C_SDA信号をGPIOとして使用しました。
プログラム修正点
今回 SPRESENSE-SDKを使って開発しました。
sdkに含まれている
examples/ble_midi_central/midi_parser.c
examples/ble_midi_central/led_indicator.c
の2のファイルを修正しました。
①【examples/ble_midi_central/led_indicator.c】
サンプルのソースコードは、BLEの通信状態をメインボードのLEDで示す
ソースコートがあるので、そちらを修正してモータドライブするピンの出力設定をしました。
なお、I2C_SCLがプログラムでは PIN_I2C0_BCK、I2C_SDAがプログラムでは PIN_I2C0_BDT
と定義されているようです。
examples/ble_midi_central/led_indicator.c
void init_led_indicator(void)
{
SETUP_PIN_OUTPUT( PIN_LED0 );
SETUP_PIN_OUTPUT( PIN_LED1 );
SETUP_PIN_OUTPUT( PIN_LED2 );
SETUP_PIN_OUTPUT( PIN_LED3 );
// user pin setting
SETUP_PIN_OUTPUT( PIN_I2C0_BCK ); //追記
SETUP_PIN_OUTPUT( PIN_I2C0_BDT ); //追記
g_connect_waiting = 1;
pthread_create(&g_thd, NULL, connection_wait_indicate, NULL);
}
②【examples/ble_midi_central/midi_parser.c】
サンプルのソースコードをみると、on_notifyのコールバック関数から
midiのデータを解析するソースコードを修正しました。
examples/ble_midi_central/midi_parser.c
/****************************************************************************
* Included Files
****************************************************************************/
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include "led_indicator.h"
#include "midi_parser.h"
#include "midi_play.h"
#include <arch/board/board.h> //gpioのピン制御の為追加しました。
#include <arch/chip/pin.h> //gpioのピン制御の為追加しました。
(中略)
#define DEBUG_MIDIPARSER //コメントを外しておくとデバッグ出力できます。
#ifdef DEBUG_MIDIPARSER
#define dbg_midiparser printf
#else
#define dbg_midiparser(...)
#endif
(中略)
static void print_note(bool on, int key, int vel)
{
int oct = key / 12;
int note = key % 12;
//追加部分 ここから
printf("key is %d\n", key);
if(key<60 || key > 72 ){
board_gpio_write( PIN_I2C0_BCK , 0);
board_gpio_write( PIN_I2C0_BDT , 0);
}else{
board_gpio_write( PIN_I2C0_BCK , (key%2==0) ? 1 : 0 );
board_gpio_write( PIN_I2C0_BDT , (key%2==0) ? 0 : 1 );
}
//ここまで
printf("[%s] O%x %s (%d)\n", on ? "ON " : "OFF",
oct, g_notestr[note], vel);
}
ピアノの上記の鍵盤を打鍵した時に反応するようにしています。
偶数が左旋回奇数が右旋回それ以外は停止としています。
動作画像
私自身はピアノは弾けなく拙い演奏ですみません。。。
(しゃろうさんの 2:23AM の1フレーズです)
まとめ
今回はBLEモジュールを提供して頂き、bluetoothのデバイスとしてSPRESENSEを動かしてみました。
SPRESENSEが通信機能を持つ事は他のデバイスと繋がる事になりより便利になるのではないかと思います。
しかも、ボタン電池3つで動くのは、小型デバイスにするには良いのではと思います。
また、私自身SPRESENSE-SDKを使った開発は初めてでしたが、開発ドキュメントを見ながら比較的
躓くことなく環境は構築できたのではないかと思います。
モータードライブも今回は2端子のみを使って制御していますが、端子数を増やして、正転、逆転
をさせると、より車の動きが細かくできて、面白く出来ると思います。
次は、SPRESENSEからble-MIDIコマンド送信しピアノを演奏するような事をしてみたいと
思います。
投稿者の人気記事
-
shimodash
さんが
2024/01/05
に
編集
をしました。
(メッセージ: 初版)
-
shimodash
さんが
2024/01/05
に
編集
をしました。
ログインしてコメントを投稿する