---
# System prepended metadata

title: Arduino 電路實驗 藍芽電子琴-Remote player

---

---
###### tag：`Arduino` `bluetooth` `buzzer`
---


# Arduino 電路實驗 藍芽電子琴-Remote player
[TOC]
* 系級：資工三乙
* 學號：1110832064
* 座號：16
* 姓名：王君翔


---

## 1.實驗目的  Purpose
透過操作電路，並實作程式碼，完成藍芽電子琴之設計。


---


## 2.實驗原理  Principle
先將藍芽模組之角色設定為master，之後將電路接好，並安裝APP。
在APP端與藍芽模組配對成功後，進入彈琴頁面，當按下APP上的按鈕後，傳遞訊息給藍芽模組，Arduino端便會讀取訊息，並使蜂鳴器發出相對應的頻率音高。
另外，也具有升降key的功能。

---


## 3.實驗材料 Materials

| 名稱<br>Name | 數量<br>Quantity | 備註<br>Memo |
| -------- | -------- | -------- |
| Arduino Uno R3 | 1 | 附USB線|
| 麵包板 | 1 |  |
| 杜邦線 | 7 | 公對公 |
| HC-05 | 1 | 主從一體 |
| 蜂鳴器 | 1 | 無源蜂鳴器 |
| Vivo V2027 | 1 | Android 12 ，附USB傳輸線|


---


## 4.實驗步驟 Steps
* APP使用android studio進行開發，限定環境為android12(含)以上

1. 進入AT mode，將HC-05進行設定，角色改為master

2. 依照電路圖連接電路
![](https://i.imgur.com/ZT2Q3Yz.png =500x300)
Δ電路圖 (Circuit Diagram)

3. 將以下程式完成後，透過USB線上傳至Uno板 
* 主程式
``` C++=
#include <SoftwareSerial.h> 
#include "music.h"
#define BUZ 7
SoftwareSerial BT(10, 11);
void r();

void setup() {
  pinMode(BUZ, HIGH);
  
  Serial.begin(9600);
  Serial.println("BT is ready!");

  BT.begin(9600);
}

void loop() {
  if (BT.available()) {
    delay(10);
    r();
  }
}

void r(){
  char c = BT.read();
  int n = 0;
  if(c == 43){
    BT.read();
    keyUp();
    return;
  }
  if(c == 45){
    BT.read();
    keyDown();
    return;
  }
  if(!(c > 47 && c < 58)){
    return;
  }
  n = c&15;
  while((c = BT.read()) > 47 && c < 58){
    n *= 10;
    n += c & 15;
  }
  tone(BUZ, getF(n), 50);
}
```
* music.h
```c++=
const float f[] = {
    16.35,    // C0
    17.32,    // C#0/Db0
    18.35,    // D0
    19.45,    // D#0/Eb0
    20.6,     // E0
    21.83,    // F0
    23.12,    // F#0/Gb0
    24.5,     // G0
    25.96,    // G#0/Ab0
    27.5,     // A0
    29.14,    // A#0/Bb0
    30.87,    // B0
    32.7,     // C1
    34.65,    // C#1/Db1
    36.71,    // D1
    38.89,    // D#1/Eb1
    41.2,     // E1
    43.65,    // F1
    46.25,    // F#1/Gb1
    49.0,     // G1
    51.91,    // G#1/Ab1
    55.0,     // A1
    58.27,    // A#1/Bb1
    61.74,    // B1
    65.41,    // C2
    69.3,     // C#2/Db2
    73.42,    // D2
    77.78,    // D#2/Eb2
    82.41,    // E2
    87.31,    // F2
    92.5,     // F#2/Gb2
    98.0,     // G2
    103.83,   // G#2/Ab2
    110.0,    // A2
    116.54,   // A#2/Bb2
    123.47,   // B2
    130.81,   // C3
    138.59,   // C#3/Db3
    146.83,   // D3
    155.56,   // D#3/Eb3
    164.81,   // E3
    174.61,   // F3
    185.0,    // F#3/Gb3
    196.0,    // G3
    207.65,   // G#3/Ab3
    220.0,    // A3
    233.08,   // A#3/Bb3
    246.94,   // B3
    261.63,   // C4
    277.18,   // C#4/Db4
    293.66,   // D4
    311.13,   // D#4/Eb4
    329.63,   // E4
    349.23,   // F4
    369.99,   // F#4/Gb4
    392.0,    // G4
    415.3,    // G#4/Ab4
    440.0,    // A4
    466.16,   // A#4/Bb4
    493.88,   // B4
    523.25,   // C5
    554.37,   // C#5/Db5
    587.33,   // D5
    622.25,   // D#5/Eb5
    659.25,   // E5
    698.46,   // F5
    739.99,   // F#5/Gb5
    783.99,   // G5
    830.61,   // G#5/Ab5
    880.0,    // A5
    932.33,   // A#5/Bb5
    987.77,   // B5
    1046.5,   // C6
    1108.73,  // C#6/Db6
    1174.66,  // D6
    1244.51,  // D#6/Eb6
    1318.51,  // E6
    1396.91,  // F6
    1479.98,  // F#6/Gb6
    1567.98,  // G6
    1661.22,  // G#6/Ab6
    1760.0,   // A6
    1864.66,  // A#6/Bb6
    1975.53,  // B6
    2093.0,   // C7
    2217.46,  // C#7/Db7
    2349.32,  // D7
    2489.02,  // D#7/Eb7
    2637.02,  // E7
    2793.83,  // F7
    2959.96,  // F#7/Gb7
    3135.96,  // G7
    3322.44,  // G#7/Ab7
    3520.0,   // A7
    3729.31,  // A#7/Bb7
    3951.07,  // B7
  };
const int mid = 24;
//const int scale[] = { 0, 2, 2, 1, 2, 2, 2, 1 }; // X full full half full full full half
const int perfix_scale[] = { 0, 2, 4, 5, 7, 9, 11};
int fix = 0;

double getF(int ind){
  ind += fix;
  int k = ind / 7 * 12;
  return f[((mid+k) + perfix_scale[((ind+14) % 7)])];
}

void keyUp(){
  fix++;
}

void keyDown(){
  fix--;
}
```
4. 將App完成並安裝至手機
App程式碼 [github連結](https://github.com/jiu-lin107141137/remote-player)

5. 執行並測試結果


---


## 5.實驗結果 Result
![](https://i.imgur.com/l7Y3DyY.png)
Δ接線完成圖

![](https://i.imgur.com/oMAjITB.png)
ΔAPP首頁

![](https://i.imgur.com/K0N612I.png)
Δ彈琴介面

當按下APP上的按鈕後，蜂鳴器可發出正確的音高，且升降key的功能有運作無誤，符合預期結果。

---

## 6.實驗心得 Reflection
這次透過藍芽完成App與Arduino的溝通，對我而言是一個非常嶄新的體驗，因為不管是Android端或是Arduino端，我都沒有自行開發藍芽功能的相關經驗。開始撰寫程式碼之後，才知道原來要注意的地方十分得多，像是一開始要進入AT mode設定藍芽模組的名稱、密碼以及角色，就花了一些時間來查閱資料並實作，更不用說之後App開發時遇到的各種Exception，以及Arduino在接收藍芽模組訊息的一些細節，整個專案實作下來，可謂獲益良多。
在完成藍芽模組的實作之後，接下來我想進行Wi-Fi模組的實作，透過Firebase完成遠端操控，觀察與藍芽模組的相異之處。


---
## 7.外部連結 Link
[My GitHub (程式碼)](https://github.com/jiu-lin107141137/remote-player)