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

shimodash が 2022年09月25日16時31分00秒 に編集

初版

タイトルの変更

+

SPRESENSEでお菓子の箱がトロンボーンに⁉

タグの変更

+

spresense

+

VL53L0X

+

SPRESENSE

メイン画像の変更

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

記事種類の変更

+

製作品

ライセンスの変更

+

(Apache-2.0) Apache License 2.0

本文の変更

+

はじめに ==== SPRSENSEのAudio出力機能と最近リリースされたライブラリを使って ゆる楽器⁉のような物を作ってみました。 測距センサとの組み合わせで「簡単に楽器を開発する」はじめの一歩的な 位置づけで参考にして頂けたらと思います。 材料 ==== - SPRESENSEメインボード - SPRESENSE拡張ボード - SDカード - 測距センサ VL53L0X - スピーカー 及び 音声ケーブル 接続図 ==== 接続はシンプルで 1. メインボード、拡張ボードをスタックします 1. メインボード上のI2CとVL530Xを接続します 1. 音声ケーブルとスピーカを接続します ![キャプションを入力できます](https://camo.elchika.com/74afff24ba1518fab62a53d0203cc69fa55e2f16/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f35363063333631352d663463342d346431352d616131342d6533373663653463633839332f62613566336634662d653434312d346630362d626262362d303837316636373163636539/) ![キャプションを入力できます](https://camo.elchika.com/e18d0690ed0b7fbfa155b28a8c2d939ecad699a2/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f35363063333631352d663463342d346431352d616131342d6533373663653463633839332f62666133643962662d336266622d343239652d383464612d396237666162383032323532/) プログラム ==== 以下に公開されている https://github.com/SonySemiconductorSolutions/ssih-music のサンプルスケッチのButtonDrumを修正しています。 センサの入力を"ただ” VL53L0Xに変更したものです。 VL53L0Xのライブラリはライブラリのダウンロードでこちらを使っています。 ![キャプションを入力できます](https://camo.elchika.com/e31675191cd7f177e6ac60e54b8042901fe7fd0b/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f35363063333631352d663463342d346431352d616131342d6533373663653463633839332f65636538663234642d336664622d343132362d623366352d653739623363366166353134/) ```arduino:サンプルプログラム /* * SPDX-License-Identifier: (Apache-2.0 OR LGPL-2.1-or-later) * * Copyright 2022 Sony Semiconductor Solutions Corporation */ #ifndef ARDUINO_ARCH_SPRESENSE #error "Board selection is wrong!!" #endif #ifdef SUBCORE #error "Core selection is wrong!!" #endif #include <MemoryUtil.h> #include <SDSink.h> //sensor #include <Wire.h> #include <VL53L0X.h> VL53L0X sensor; // this file names are deifned middle C (60) as C4 const SDSink::Item table[12] = { {60, "SawLpf/60_C4.wav"}, // C4 {61, "SawLpf/61_C#4.wav"}, // C#4 {62, "SawLpf/62_D4.wav"}, // D4 {63, "SawLpf/63_D#4.wav"}, // D#4 {64, "SawLpf/64_E4.wav"}, // E4 {65, "SawLpf/65_F4.wav"}, // F4 {66, "SawLpf/66_F#4.wav"}, // F#4 {67, "SawLpf/67_G4.wav"}, // G4 {68, "SawLpf/68_G#4.wav"}, // G#4 {69, "SawLpf/69_A4.wav"}, // A4 {70, "SawLpf/70_A#4.wav"}, // A#4 {71, "SawLpf/71_B4.wav"} // B4 }; SDSink inst(table, 12); int selector = 0; int button4 = HIGH; int button5 = HIGH; int button6 = HIGH; void setup() { // init built-in I/O Serial.begin(115200); pinMode(LED0, OUTPUT); pinMode(LED1, OUTPUT); pinMode(LED2, OUTPUT); pinMode(LED3, OUTPUT); // init buttons pinMode(PIN_D04, INPUT_PULLUP); pinMode(PIN_D05, INPUT_PULLUP); pinMode(PIN_D06, INPUT_PULLUP); // initialize memory pool initMemoryPools(); createStaticPools(MEM_LAYOUT_RECORDINGPLAYER); // setup instrument if (!inst.begin()) { Serial.println("ERROR: init error."); while (true) { delay(1000); } } Serial.println("Ready to play ButtonDrum"); // VL53L0X setup // Serial.begin(9600); Wire.begin(); sensor.setTimeout(500); if (!sensor.init()) { Serial.println("Failed to detect and initialize sensor!"); while (1) {} } // Start continuous back-to-back mode (take readings as // fast as possible). To use continuous timed mode // instead, provide a desired inter-measurement period in // ms (e.g. sensor.startContinuous(100)). sensor.startContinuous(); } int note1 = INVALID_NOTE_NUMBER; void loop() { Serial.print(sensor.readRangeContinuousMillimeters()); if (sensor.timeoutOccurred()) { Serial.print(" TIMEOUT"); } Serial.println(); int distance_input = sensor.readRangeContinuousMillimeters(); //測定している距離が一定の距離に入ったら音を出すようにする。以下は 100mm未満 if (distance_input < 100 ) { //距離を12等分したものを割って、小数点が切り捨てられるようにし60に加算 //値が72になるとエラーし暴走してしまうので注意 note1 = 60 + int(float(distance_input / (100 / 12.0)-0.5)); Serial.println(note1); inst.sendNoteOn(note1, DEFAULT_VELOCITY, DEFAULT_CHANNEL); } else { inst.sendNoteOff(note1, DEFAULT_VELOCITY, DEFAULT_CHANNEL); } // run instrument inst.update(); } ``` 動作 ==== @[youtube](https://youtu.be/LV_SBKlw8qA) 最後に ==== SPRESENSEはカメラの搭載できるので お菓子の箱を認識して音色や音階を変化する距離を 自動変更できたら、面白いかなと思います。 すみません、そこまで作り込めなかったのですが アイデアの種として共有させて頂けたらと思います。 ![箱に応じた機能変更](https://camo.elchika.com/5267ddf258bc9d2aeb549d651d92180804ce9a28/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f35363063333631352d663463342d346431352d616131342d6533373663653463633839332f38396365316537392d313431622d343536302d393465382d323136643332303434386239/)