Mira&Luna's nursery lab

旅乙女と発明娘の子供部屋

EEPROMを使った電子オルゴールの自作3。読み込みと曲を流すプログラムの紹介🌼

f:id:miraluna:20200223191041j:plain:w200 Mira

自作電子工作🐇
ArduinoとEEPROMを使った電子オルゴール🎹
「Tiny蓄音機レコード仕様🍩」の作り方



<第3回>
EEPROMから楽譜を読み取って演奏するプログラム」



目次
   🍩 Tiny蓄音機レコード仕様を作ろう 🍩
🍩1回目「 構想とEEPROMについてと曲紹介
🍩2回目「EEPROMに楽譜を記録♬ "レコード盤作り"
🍩3回目「EEPROMから楽譜を読み取って演奏するプログラム」(この記事)
🍩4回目「トラブル1🐉 ArduinoのRAMが足りない..p_q..💦
🍩5回目「[トラブル2🦇 tone関数ではすべての音符を鳴らせない
🍩6回目「"ちびやっこ"意気消沈。お姉ちゃんの"みつは"は超オンチに🦆


「Tiny蓄音機レコード仕様」~イメージ~
f:id:miraluna:20210926165439j:plain

前回の記事でEEPROMに楽譜データを書き込むことができ、「EEPROMレコード盤🍩」が完成しました(∂. ∂🎀
今回はEEPROMからデータを読み込んで、音を出して楽譜を演奏するプログラムと配線を紹介します🍭



読み出し演奏プログラムスケッチ

このプログラムはArduinoに初めから備わっている"tone関数"を使ったスケッチ例「toneMelody」をベースにしています。

f:id:miraluna:20210926181547p:plain:w300:right



「toneMelody」のスケッチ例は、Arduino IDEのここ⇒ にあります。





このスケッチ(プログラム)に、EEPROMのデータを読み出すプログラムを書き加えて、読み出した楽譜データをtone関数で演奏します。

🍎 プログラム 🍎

// Tiny蓄音機実装用 [各曲共用]
// 周波数を÷4で濃縮還元した曲用
#include<Wire.h>

int eep_read(int device_add, unsigned int eep_add){
  Wire.beginTransmission(device_add);//対象デバイスへ移動
  Wire.write((int)(eep_add >> 8));
  Wire.write((int)(eep_add & 0xff));
  Wire.endTransmission();
  
  Wire.requestFrom(device_add,1);
  if(Wire.available()){}
  return Wire.read();
}

void setup() {
  Wire.begin();
}

void loop() {
  int onpu = eep_read(0x50,0);  //0番地から音符数を読む
  int sokudo = eep_read(0x50,1);//1番地から速度を読む(100分の1)
  
  for(int note = 0; note < onpu; note++){  //演奏部
    int melody =eep_read(0x50,note+2);  //音階の読み出し
    int duration = eep_read(0x50,note+onpu+2);  //音符の長さの読み出し
    int noteDuration = sokudo*100 / duration;   //速度を復元(x100)
    tone(3, melody*4, noteDuration);  //ブザーは3pin

    int note_hazama = noteDuration * 1.10;  //音符同士の合間の長さ
    delay(note_hazama);
  }
}

プログラムをみつは(ATmega328(マイコン))に書き込めば、Tiny蓄音機#レコード仕様の本体のできあがりです。
それではプログラムを書き込んだみつはと、レコード盤であるEEPROMを配線していきましょう。



みつはEEPROM配線
f:id:miraluna:20210920085347p:plain

f:id:miraluna:20200211155724j:plain:w200:left【 [24LC64] pin配置図 ↓ 】 【 [みつは] pin配置図 ↓ 】

f:id:miraluna:20210929195228p:plain:w200f:id:miraluna:20211001191917p:plain:w180

このように配線します🍓
ブザーは3番pin。
抵抗はプルアップ用で2kΩです(値は近似値でO.K.)。
この他に、電源(2.5~5.5v)もつないでね🔋


これでいよいよ"Tiny蓄音機#レコード仕様"でレコードを再生する準備が整いました。
電源を入れてみつはを動作させてみます🚲
f:id:miraluna:20210920085724j:plain:w290 f:id:miraluna:20210920085744j:plain:w290

f:id:miraluna:20191015184121j:plain:w200 ジョージ・ウィンストンさんの『あこがれ/愛』(ミラ仕様) がブザーから流れ出しました。



EEPROMに楽譜データを書き込んで、そこから読み取ったデータを電子オルゴールとして鳴らす。というもくろみはこれにて大成功です(∂, ∂🎀y
これでも満足なんだけど、今回のプロジェクトではもっと長い『OneNight』という曲をEEPROMに保存したいとたくらんでいます。

次回からは『OneNight』プログラムの作製に入ります。
これがまたいつものようになかなかうまくいかなかったんです🍆

ミラでした。
Mira



目次
   🍩 Tiny蓄音機レコード仕様を作ろう 🍩
🍩1回目「 構想とEEPROMについてと曲紹介
🍩2回目「EEPROMに楽譜を記録♬ "レコード盤作り"
🍩3回目「EEPROMから楽譜を読み取って演奏するプログラム」(この記事)
次回」🍩4回目「トラブル1🐉 ArduinoのRAMが足りない..p_q..💦
🍩5回目「[トラブル2🦇 tone関数ではすべての音符を鳴らせない
🍩6回目「"ちびやっこ"意気消沈。お姉ちゃんの"みつは"は超オンチに🦆



<お買い物コーナー>

♬ これを筐体にしたら素敵ね。   ♬ 本物の蓄音機(Bluetooth対応)