編集履歴一覧に戻る
shimodashのアイコン画像

shimodash が 2024年01月05日12時10分35秒 に編集

初版

タイトルの変更

+

SPRESENSEでピアノに合わせて動く車を作ってみました。

タグの変更

+

BLE-midi

+

spresense

+

BLE1507

メイン画像の変更

メイン画像が設定されました

記事種類の変更

+

製作品

本文の変更

+

**開発経緯** 我が家には子供が練習で使っていた電子ピアノがあります。子供の習い事を卒業する事になり ピアノを触る機会が少なくなりました… 以前から、こちらのピアノにはBluetooth機能が備わっている事は知っており、それを使って 面白い事したいと思ってました。 習い事をしている時は、『変な事して、壊されてしまったら困る』と警戒されていましたが、 (そもそも、私の日頃の〇〇が悪いとツッコミはおいておいてw)ある程度触らせて貰えそう なので、これとBLE機能を持ったSPRESENSEを使ってピアノと連携した事をできないか思い取り組む事に してみました。 **システム構成** システム概要図を以下に記載します。 ![システム概要図](https://camo.elchika.com/8460815ee8101e2b5fa5679a587100bcb2afedbf/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f35363063333631352d663463342d346431352d616131342d6533373663653463633839332f65376536303163652d343635382d346262652d623232342d376339636436643035653938/) SPRESENSEのメインボードはBLEの拡張ボードを使って、BLE Centralとして動作し、 ピアノ側のPeripheral(CN29)と接続します。 ピアノ側で演奏すると、鍵盤のノート情報がNotify信号をとして、SPRESENSE側に通知されます。 通知された情報を元にメインボードはおもちゃの車に、右旋回または左旋回を指示します。 **部品リスト** | No | 名称 |購入先|備考| |:---:|:---|:---|:--- |1 | SPRESENEメインボード | モニタ提供|外部電源用コネクタ実装| |2 | BLE1507 (BLE for Spresense) |モニタ提供|serialization FW版| |3 | モータードライバー |[amazon](https://amzn.asia/d/cv1ey5J)|MX1508のICを使用| |4 | 2輪駆動のおもちゃの車 |aliexpress|昔に購入したもので、リンクが切れていました。[アマゾン](https://amzn.asia/d/e0sPB1K)にもありましたが参考情報として掲載します| |5 | 電池ボックス(単3 1.5v x 2) |秋月電子等|おもちゃのモーター駆動用| |6 | 電池ボックス(LR44 1.5v x 3) |Daiso|SPRESENSE動作用| |7 | 信号接続ケーブル |秋月電子等|モーター制御信号との接続| 部品は以下のように配置しました。 ![部品実装](https://camo.elchika.com/b2613da46c49d477b96f9f3f4c4392e53c6823ac/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f35363063333631352d663463342d346431352d616131342d6533373663653463633839332f32316161646161642d313939632d346637632d613032382d333430666631333033336132/) **配線接続** メインボードの上部のピンはBLE1507で干渉する為、モータードライバは使用されていない、 I2C_SCL,I2C_SDA信号をGPIOとして使用しました。 ![配線接続](https://camo.elchika.com/2845a694245b28818474b5658c6a5b9c5c79ad52/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f35363063333631352d663463342d346431352d616131342d6533373663653463633839332f66616132376336302d353866622d343463632d623632382d636261323166353335626130/) **プログラム修正点** 今回 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 と定義されているようです。 ```c: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のデータを解析するソースコードを修正しました。 ```c: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); } ``` ピアノの上記の鍵盤を打鍵した時に反応するようにしています。 偶数が左旋回奇数が右旋回それ以外は停止としています。 ![打鍵の反応音階](https://camo.elchika.com/467c09315a7945e641c67dd69515d2db3591a095/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f35363063333631352d663463342d346431352d616131342d6533373663653463633839332f30366137333161362d333531642d346163332d613538342d633237616466613136303432/) **動作画像** 私自身はピアノは弾けなく拙い演奏ですみません。。。 (しゃろうさんの 2:23AM の1フレーズです) @[youtube](https://youtu.be/jKl69qOVkGY) **まとめ** 今回はBLEモジュールを提供して頂き、bluetoothのデバイスとしてSPRESENSEを動かしてみました。 SPRESENSEが通信機能を持つ事は他のデバイスと繋がる事になりより便利になるのではないかと思います。 しかも、ボタン電池3つで動くのは、小型デバイスにするには良いのではと思います。 また、私自身SPRESENSE-SDKを使った開発は初めてでしたが、開発ドキュメントを見ながら比較的 躓くことなく環境は構築できたのではないかと思います。 モータードライブも今回は2端子のみを使って制御していますが、端子数を増やして、正転、逆転 をさせると、より車の動きが細かくできて、面白く出来ると思います。 次は、SPRESENSEからble-MIDIコマンド送信しピアノを演奏するような事をしてみたいと 思います。