Mira&Luna's nursery lab

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

1つめのトラブル🐉 ArduinoのRAMが足りないエラー..p_q..💦

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

女の子も自作電子工作したい🦋
ArduinoでEEPROM電子オルゴールの作製🎹


<第4回>
「1つめのトラブル🐉
  Arduino(みつは)のRAMが足りない ..p_q..💦」



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


🍩「Tiny蓄音機レコード仕様」
f:id:miraluna:20210926165439j:plain


前回まででEEPROMをレコード盤に、みつは(ATmega328P)を蓄音機にした電子オルゴールの実験は成功しました。EEPROMに短い曲を入れて、Arduinoから独立させたみつはで再生できた。
   ↓ 前回の記事
miraluna.hatenablog.com

ライブラリ📚を作る>
さあ、ここからが大仕事。
加賀谷玲さんの『OneNight』の曲を、まるまる音符データに替えて、EEPROMに保存する計画なの。
つまりとってもたくさんの音符データをプログラムに入力しなくちゃいけない。
音符のデータは「音階」と「長さ」。長さのほうは 4分音符なら「4」、16分音符なら「16」と打てばいいのでそれほど大変じゃない。でも音階のほうは、ドなら131、ミなら165、1オクターブ高いミなら330、というように周波数の数字をプログラムするの。最終的に音符の総数は715音符になったので、これを全て手入力していくのはなかなか大変。
そこで🌟 手間を省く工夫をしましょう😊
ミラ工夫 🍰 f:id:miraluna:20210106121720j:plain:w60#defineを使ってライブラリを作る」

📚 ライブラリのようなもの
f:id:miraluna:20211005185922j:plain:left:w270 Arduino IDEでスケッチ(プログラム)を書くとき、左の写真のピンクの丸のところからタブの設定ができます。クリックして「新しいタブを開く」を選ぶと、真っ白な新しいタブが開かれます。ここに定義づけした予約語を登録できます。
どういうことかというと、ある特定の文字列に値をあらかじめ代入することができるの。例えば「du」という名前の文字列を特別扱いして(予約語)、その文字列には「262」という値が入りますよという取り決め(定義づけ)をすることができる。するとプログラム上で「du」と書けば、それは「262」を意味する
                   ことになるというわけ。便利でしょ?

書き方は

#define  du  262

です。

音階の周波数が全部頭に入っていれば大きな違いはないかもしれないけど、私の場合は周波数表をネットで調べて、それを見ながら「え~と、ファのシャープは...っと。ん~~っと。あっ、185ね。」みたいな感じだからすっごく大変。だから「ファのシャープ」は「fh」と自分で名前を決めちゃえば、どんどん書けちゃう。ちなみに「f」が「ファ」で、「h」はhalfの意味で「シャープ」というふうに決めました。


📚 定義づけ
f:id:miraluna:20211005185926j:plain

オレンジの四角で囲まれた文字列が予約語。私が名付けた"特定の文字列"です。その右の数字が周波数。さらにその右はただのメモ。プログラムに影響しないようにコメントアウト(スラッシュスラッシュ)されています。


これで予約語の辞典のようなもの(ライブラリのようなもの)ができました。
でもこのままではだめなの。この辞典をプログラムに持たせなくては、プログラムは辞典に載っている予約語を無視しちゃう。そこでプログラムにこの辞典を持たせる一文を書き加えます。
タブに書かれている文字が辞典の名前。ここでは「tone_def.h」ね。プログラム上にはその名前を含む

#include "tone_def.h"

という一文をプログラムの初めのほうに書き加えます。
これで辞典に載っている自作のルールは効力を発揮して、「du」は「262」を意味するようになりました(∂, <🎀y


楽譜プログラム♪の作成>
いよいよ楽譜プログラムの作成です。
『あこがれ』のプログラムを書いたときのように、EEPROMへ書き込みを行うプログラムに『OneNight』の楽譜データを入力していきます。
  → 『あこがれ』の楽譜プログラム

参考にさせていただいた加賀谷玲さんの公式Youtubeチャンネルの『OneNight』。楽譜付きなので"絶対音感"どころか"そこそこ音感"も"まあまあ音感"もない私でも楽譜データを入れられました。ありがとうございます😊

www.youtube.com


そしてなんと......。
半年以上かかりました🐥
f:id:miraluna:20210106121657j:plain:w80 え゛~~🐤

まぁ、私がさぼってたのがいけないんだけどね。  長かったなぁ。
f:id:miraluna:20191015184121j:plain:w100:right
でもついについに、この雨ばかりだった夏休みに楽譜データの入力がすべて終わりました。


EEPROMへの書き込み>
それではArduinoとEEPROMを配線して(→ 配線図)、Arduinoに楽譜データ書込み用プログラムを書き込んでEEPROMに楽譜データを書き込みましょう(ややこしぃ)。

🍎 書込み通信開始 🍎
f:id:miraluna:20211005185929j:plain

ん? あれ?
エラーが出てる......。

なになに?
"最大2048バイトのRAMのうち、グローバル変数が2888バイト(141%)を使っていて、"......。
つまりこれってArduinoのRAMが足りないってことね。

RAMとはプログラムを動かす上で一時的に記憶しておくメモリのこと。ここでの楽譜データはRAMを使うことになるデータなので、それがあまりにも多すぎたみたい。Arduino UNOのブレインである"みつは"ことATmega328Pは2kB、つまり2048バイトのRAMを持っている。でも今回の楽譜データプログラムを走らせるには2888バイトのRAMが必要になる。つまりみつはじゃ収まりきらない量の楽譜データだったわけ。
さぁ、どうしよ~🐣


Tea Time
f:id:miraluna:20210302183413j:plain:w300 お茶して考えよ☕
   Mira & Luna's nursery lab


アイディアトラブルをやっつけよぅ👊>
困ったら、お茶したり散歩したりおしゃべりしたりしてくつろぎましょう。きっとそのうちいい考えが浮かんでくるはず。

💡ほら! ひらめいた💡
Arduinoにひといきにデータを入れられなくたって、結果としてEEPROMに全部入ればそれでいい。
バケツを使ってプールの水をいっぱいにするとき、バケツ一杯分でプールをいっぱいにできなくたって問題には感じないでしょ? だって、何回分も汲めばいいんだもん。それと同じよ。Arduinoに楽譜データを小分けにして入れて、数回にわたってEEPROMにデータを入れればいい。

そういう理屈で楽譜データである曲をA~Eのパートに分けて、少しずつ(プログラムが2kB未満ずつ)EEPROMに書き込んでいこうと思います。

「待てば恵みの雨が降る」Mira


f:id:miraluna:20180521193649j:plain:w200 ミラでした。



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