Arduino UNO R4 MinimaでDAC機能を使ったメロディー演奏をやってみた
![Arduino UNO R4 MinimaでDAC機能を使ったメロディー演奏をやってみた](https://cediablog.com/wp-content/uploads/arduinor4-minima-daceye.jpg)
こんにちは、せでぃあ(@cediablog)です。
Arduino UNO R3の後継機種であるArduino UNO R4 Minimaを購入して、新機能を順次試して楽しんでいます。
今回試す新機能は、「DAC(デジタルアナログコンバーター)」という機能で、0Vと5Vの間の電圧(例えば2.5V)を作り出すことができる機能になります。
今回、このRTC機能を使ってパッシブブザーによる童謡「かっこう」のメロディー演奏プログラムを作ってみました。
![DAC機能を使ったメロディー演奏のための、機器配線状態画像](https://cediablog.com/wp-content/uploads/dac-i.webp)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
みんなが知ってる童謡「かっこう」のメロディーを奏でます!
- DAC(デジタルアナログコンバーター)機能の使い方
- パッシブブザーを使ってメロディー演奏させる配線方法
- Arduino IDEでのプログラミング方法
![](https://cediablog.com/wp-content/uploads/happy500-1.png)
![](https://cediablog.com/wp-content/uploads/happy500-1.png)
せでぃあ
せでぃあはこんな人物です
✅プライム企業に勤める電気・機械設計エンジニア
✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作
✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞
✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中
✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中
DAC(デジタルアナログコンバーター)機能について
![DAC機能によるアナログ出力イメージ](https://cediablog.com/wp-content/uploads/dac-9.webp)
![DAC機能によるアナログ出力イメージ](https://cediablog.com/wp-content/uploads/dac-9.webp)
Arduino UNO R4 Minimaの新機能「DAC(デジタルアナログコンバーター)」は、名前の通りデジタルデータをアナログ出力させることができる機能です。
デジタルとアナログ出力の違い
デジタル出力:LOW「0V」またはHIGH「5V」の2通りのみ
アナログ出力:0V~5Vの範囲で様々な電圧出力が可能
アナログ出力機能って、どんなときに使うのか?
それは、電圧値によって機器を制御したいときに使います。
- LEDの点灯明るさを制御する
- DCモーターの回転速度を制御する
![](https://cediablog.com/wp-content/uploads/hirameki-150x150.png)
![](https://cediablog.com/wp-content/uploads/hirameki-150x150.png)
![](https://cediablog.com/wp-content/uploads/hirameki-150x150.png)
アナログ制御は、動作の程度を制御するときに必要な制御です。
従来のUNO R3でもアナログ出力は可能
実はこのアナログ出力機能ですが、従来のArduino UNO R3でもアナログ出力が可能です。
![PWM(パルス変調)により疑似的にアナログ出力が可能です。](https://cediablog.com/wp-content/uploads/dac-a.webp)
![PWM(パルス変調)により疑似的にアナログ出力が可能です。](https://cediablog.com/wp-content/uploads/dac-a.webp)
Arduino UNO R3では、「PWM(パルス変調)」という方法で疑似的に実現することが可能でした。
PWM(Pulse Width Modulation)とは、0Vと5Vの出力時間の割合を制御して疑似的に中間の電圧を作る方法です。
上の図の場合は、疑似的に2Vの電圧を作り出しています。
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
従来は疑似的な方法でしか、アナログ出力が出来ませんでした。
PWM出力制御について詳しく知りたい方は、こちらの記事もあわせてご覧ください。
オーディオ目的でもDACが活用できる
![DAC機能を使った音階出力のイメージ](https://cediablog.com/wp-content/uploads/dac-6.webp)
![DAC機能を使った音階出力のイメージ](https://cediablog.com/wp-content/uploads/dac-6.webp)
今回のメロディー演奏動作につながる機能になります。
Arduino UNO R4 MinimaにはDAC(デジタル-アナログコンバーター)が組み込まれており、デジタル信号をアナログ信号に変換するために使用されます。この機能は、多数の楽しいオーディオプロジェクトを構築するために使用できますが、たとえば、安価な関数ジェネレーターなどのプロのラボ機器としても機能します。
Arduino公式サイトより引用
Arduino公式サイトによると、DAC機能を使うことで正弦波を作ることができ、それを使って任意の周波数の音をパッシブブザー(スピーカー)から出すことができると記載されています。
音階は周波数制御により変更可能
![音階に対応した周波数](https://cediablog.com/wp-content/uploads/dac-e.webp)
![音階に対応した周波数](https://cediablog.com/wp-content/uploads/dac-e.webp)
パッシブブザーから出す音の音階は、正弦波の周波数を変えることで調節することができます。
音階とオクターブの組み合わせで、対応する周波数が異なってきます。
従来のUNO R3でも音階制御は可能
![Arduino UNO R3とUNO R4 Minimaの音階制御方法の違い](https://cediablog.com/wp-content/uploads/dac-7.webp)
![Arduino UNO R3とUNO R4 Minimaの音階制御方法の違い](https://cediablog.com/wp-content/uploads/dac-7.webp)
従来のArduino UNO R3でも音階制御が可能です。
tone関数という関数を使うことで、正弦波ではなく矩形波出力が可能です。
この矩形波出力の周波数を制御することで、音階制御を可能としています。
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
本質的なアナログ出力ができないため、矩形波で周波数制御します。
tone関数を使った音階制御に関しては、こちらの記事で詳しく紹介しています。
DAC機能を使った、メロディー演奏回路で使うもの
![DAC機能を使った、メロディー演奏回路で使うもの](https://cediablog.com/wp-content/uploads/dac-j.webp)
![DAC機能を使った、メロディー演奏回路で使うもの](https://cediablog.com/wp-content/uploads/dac-j.webp)
- パソコン
- Arduino本体
- USBケーブル(typeC)
- ブレッドボード
- タクトスイッチ
- 抵抗(1kΩ)
- パッシブブザー
- ジャンパー線(オスーオス)×6本
今回はELEGOO社のスーパースターターキットに含まれる部品を使っています。
コスパ最強のArduinoキットに含まれる、すべてのパーツを紹介しています。
パソコン
プログラムを作成するために必要です。
プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。
パソコンのOSはWindows、Macどちらでも対応可能です。
Arduino UNO R4 Minima本体
![Aruino Uno R4 minimaの本体写真](https://cediablog.com/wp-content/uploads/minima-4.webp)
![Aruino Uno R4 minimaの本体写真](https://cediablog.com/wp-content/uploads/minima-4.webp)
今回は、Arduino純正品の「Arduino UNO R4 Minima」を使用します。
納期や価格面から、国内から発送される通販サイトからの購入がおすすめです。
R4 Minimaが買える国内サイト
Arduino UNO R4 Minimaの始め方は、こちらを参考にしてみてください。
![](https://cediablog.com/wp-content/uploads/hirameki-150x150.png)
![](https://cediablog.com/wp-content/uploads/hirameki-150x150.png)
![](https://cediablog.com/wp-content/uploads/hirameki-150x150.png)
ピン配置などの基本的な仕様は、UNO R3と同じです!
USBケーブル(TypeC)
![TypeC USBケーブル](https://cediablog.com/wp-content/uploads/USBTypeC.webp)
![TypeC USBケーブル](https://cediablog.com/wp-content/uploads/USBTypeC.webp)
UNO R3は本体に接続する側の端子形状が(TypeB)でしたが、R4 MinimaではTypeC形状になります。
パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
USBケーブルは別売りなので、買い忘れに注意してください。
![](https://cediablog.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
![](https://cediablog.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
ブレッドボード【キット】
![ブレッドボードの機能説明図](https://cediablog.com/wp-content/uploads/image-5-1024x506.png)
![ブレッドボードの機能説明図](https://cediablog.com/wp-content/uploads/image-5-1024x506.png)
たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。
説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能は同じです
ブレッドボードだけの購入も可能です。
![](https://cediablog.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
![](https://cediablog.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
タクトスイッチ【キット】
![押しボタンの説明](https://cediablog.com/wp-content/uploads/lesson2n.webp)
![押しボタンの説明](https://cediablog.com/wp-content/uploads/lesson2n.webp)
今回の回路では、タクトスイッチ(押しボタンスイッチ)を使用します。
押しボタンは押されている間のみ、上記写真での2点が内部でつながります。
このようなボタンをモーメンタリボタンといいます。
今回は扱いませんが、ボタンから手を離してもONしたままになるボタンをオルタネイトボタンといいます。
モーメンタリ・オルタネイトボタンについては以下記事にて詳しく説明しています。
抵抗(1kΩ)【キット】
![1kΩ抵抗と色による見分け方](https://cediablog.com/wp-content/uploads/lesson2m-1024x486.webp)
![1kΩ抵抗と色による見分け方](https://cediablog.com/wp-content/uploads/lesson2m-1024x486.webp)
1kΩの抵抗を1本使用し、押しボタンスイッチに接続します。
抵抗を接続するのは、押しボタンがOFFのときにArduino本体がノイズによる誤検出することを避けるためです。
この記事では詳しく説明しませんが、ボタンを押していないのに押されたと誤認識されることを避ける目的であるということだけ覚えておいてください。
抵抗カラーコードの見分け方については、こちらの記事で詳しく説明しています。
パッシブブザー【キット】
![パッシブブザー](https://cediablog.com/wp-content/uploads/lesson14-1.webp)
![パッシブブザー](https://cediablog.com/wp-content/uploads/lesson14-1.webp)
パッシブブザーとは、普通のスピーカーと同じで一定周波数の電圧によって音を出すことができる電子機器です。
周波数を変化させることで、音色を変えることができます。
ジャンパー線(オスーオス)【キット】
![キットに同梱されているジャンパー線(オスーオス)の説明](https://cediablog.com/wp-content/uploads/basickita.webp)
![キットに同梱されているジャンパー線(オスーオス)の説明](https://cediablog.com/wp-content/uploads/basickita.webp)
ジャンパー線を6本使用します。
Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。
DAC機能を使うための配線
![DAC機能を使ってメロディー演奏させる回路図](https://cediablog.com/wp-content/uploads/dac-4.webp)
![DAC機能を使ってメロディー演奏させる回路図](https://cediablog.com/wp-content/uploads/dac-4.webp)
![Arduino UNO R4 Minimaのピン機能仕様](https://cediablog.com/wp-content/uploads/minima-1.webp)
![Arduino UNO R4 Minimaのピン機能仕様](https://cediablog.com/wp-content/uploads/minima-1.webp)
![DAC機能は「A0」ソケットのみ機能があります。](https://cediablog.com/wp-content/uploads/dac-f.webp)
![DAC機能は「A0」ソケットのみ機能があります。](https://cediablog.com/wp-content/uploads/dac-f.webp)
公式データシートによると、DAC機能はアナログソケット「A0」に接続して使用します。
今回DAC機能で制御したい電子機器は「パッシブブザー」なので、パッシブブザーの「+側」をA0に接続します。
今回はタクトスイッチをデジタル入力ソケット「2番」に接続しています。
これは、押しボタンを押すことでメロディー演奏を開始させるために使用します。
1kΩ抵抗もタクトスイッチに接続していますが、スイッチOFF状態では確実に電位が0Vになるようにしています。
DAC機能を使ったメロディー演奏プログラム
![DAC機能を使ったメロディー演奏のための、機器配線状態画像](https://cediablog.com/wp-content/uploads/dac-i.webp)
![DAC機能を使ったメロディー演奏のための、機器配線状態画像](https://cediablog.com/wp-content/uploads/dac-i.webp)
配線が完了したところで、童謡「かっこう」演奏プログラムを作っていきます。
今回Arduino公式サイトのサンプルプログラムをベースに、アレンジして作っています。
/*
DAC Melody playerGenerates a series of tones from MIDI note values
using the Uno R4 DAC and the AnalogWave Library.
The melody is “Frere Jacques”circuit:
* audio amp (LM386 used for testing) input+ attached to A0
* audio amp input- attached to ground
* 4-8-ohm speaker attached to amp output+
* Potentiometer connected to pin A5created 13 Feb 2017
modified 3 Jul 2023
by Tom Igoe
*/include “analogWave.h”
analogWave wave(DAC);
define NOTE_A4 69 // MIDI note value for middle A
define FREQ_A4 440 // frequency for middle A
// the tonic, or first note of the key signature for the song:
int tonic = 65;
// the melody sequence. Note values are relative to the tonic:
int melody[] = {1, 3, 5, 1,
1, 3, 5, 1,
5, 6, 8, 5, 6, 8,
8, 10, 8, 6, 5, 1,
8, 10, 8, 6, 5, 1,
1, -4, 1,
1, -4, 1
};
// the rhythm sequence. Values are 1/note, e.g. 4 = 1/4 note:
int rhythm[] = {4, 4, 4, 4,
4, 4, 4, 4,
4, 4, 2,
4, 4, 2,
8, 8, 8, 8, 4, 4,
8, 8, 8, 8, 4, 4,
4, 4, 2,
4, 4, 2
};
// which note of the melody to play:
int noteCounter = 0;int bpm = 120; // beats per minute
// duration of a beat in ms
float beatDuration = 60.0 / bpm * 1000;void setup() {
// start the sine wave generator:
wave.sine(10);
}void loop() {
// current note is an element of the array:
int currentNote = melody[noteCounter] + tonic;
// play a note from the melody:
// convert MIDI note number to frequency:
float frequency = FREQ_A4 * pow(2, ((currentNote – NOTE_A4) / 12.0));// all the notes in this are sixteenth notes,
// which is 1/4 of a beat, so:
float noteDuration = beatDuration * (4.0 / rhythm[noteCounter]);
// turn the note on:
wave.freq(frequency);
// tone(speakerPin, frequency, noteDuration * 0.85);
// keep it on for the appropriate duration:
delay(noteDuration * 0.85);
wave.stop();
delay(noteDuration * 0.15);
// turn the note off:
// noTone(speakerPin);
// increment the note number for next time through the loop:
noteCounter++;
// keep the note in the range from 0 – 32 using modulo:
noteCounter = noteCounter % 32;}
MIDI Piano Notes
Arduino公式サイトより引用
- 演奏する曲を「フレールジャック(フランスの民謡)」から「かっこう」に変更
- エンドレスリピートからタクトスイッチによる1曲演奏に変更
- シリアルモニタに音階周波数が表示される機能を追加
Arduino IDEを開く
Arduinoの開発環境ソフトウェアである、Arduino IDEを開きます。
![Arduino IDE2.1の画面](https://cediablog.com/wp-content/uploads/dac-c.webp)
![Arduino IDE2.1の画面](https://cediablog.com/wp-content/uploads/dac-c.webp)
今回Arduino IDE2.1を使ってプログラムを作成しました。
プログラムを作成していきます。
USBケーブルで、Arduino UNO R4 Minimaと接続した状態で開くと、プルダウンから機種選択が可能です。
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
機種選択は、プログラム作成後でも問題ありません。
Arduino IDE2.1のインストール方法については、こちらの記事で紹介しています。
音階制御の考え方
![音階対照表](https://cediablog.com/wp-content/uploads/dac-g.webp)
![音階対照表](https://cediablog.com/wp-content/uploads/dac-g.webp)
今回analogWaveライブラリを使用しますが、「MIDIのノートナンバー」をプログラム内で指定して音階指定します。
童謡「かっこう」では#音は使いませんが、MIDI音階は上の図の鍵盤上記載の数値のような順序でカウントされます。
プログラム内では、基準となるNoteNo.を宣言して、そこからの差分を指示する内容になっています。
動作プログラム
/* 作品名:UNO R4 Minima DAC */
/* 作成者:せでぃあ https://cediablog.com */
/* DAC機能を使った童謡「かっこう」演奏プログラム */
#include "analogWave.h" // DAC制御用ライブラリの読み出し
analogWave wave(DAC); // analogWave型変数の宣言
#define NOTE_A4 69 // 音階「A4」のNote No.「69」
#define FREQ_A4 440 // 音階「A4」の周波数「440.0Hz」
int BTN_SOCKET = 2; // 押しボタン入力ソケット番号
int i; // for文用変数
// 音階の基準となるNote No.を指定=59(B3)
int tonic = 59;
// メロディー演奏音階シーケンス「0,1,2,3,・・・⇒B3,C4,C#4,D4,・・・」 ※全26STEP
int melody[] = { 8, 5, 8, 5,
3, 1, 3, 1,
3, 3, 5, 6, 3,
5, 5, 6, 8, 5,
8, 5, 8, 5,
6, 5, 3, 1 };
// 音階の長さシーケンス
int rhythm[] = { 4, 2, 4, 2,
4, 4, 4, 2,
4, 4, 4, 2, 4,
4, 4, 4, 2, 4,
2, 4, 2, 4,
4, 4, 4, 2, };
// メロディー演奏音階カウンター
int noteCounter = 0;
int bpm = 120; // 変数bpm=120
// bpmをbeat per msecに変換
float beatDuration = 60.0 / bpm * 1000;
void setup() {
Serial.begin(9600); // シリアル通信の準備をする
// 正弦波生成スタート
wave.sine(10);
}
void loop() {
//入出力の割り当て
pinMode(BTN_SOCKET, INPUT); //2番ピンは入力として使用
if (digitalRead(BTN_SOCKET) == 1) { //押しボタンが押されたとき
for (i = 0; i < 26; i++) { //1コーラス演奏する
// 音階=基準音階「59」+シーケンス指示音階
int currentNote = melody[noteCounter] + tonic;
// Note No.に応じた音を出す
// Note No.を周波数に変換する
float frequency = FREQ_A4 * pow(2, ((currentNote - NOTE_A4) / 12.0));
// 音の長さを計算する
// 各音階ごとに指定:4÷beat per msec値
float noteDuration = beatDuration * (4.0 / rhythm[noteCounter]);
// 各音階に合わせた周波数の波形を生成
wave.freq(frequency);
// beat per msec値×0.85msecの時間音を出す
delay(noteDuration * 0.85);
wave.stop();
delay(noteDuration * 0.15);
// 音階出力OFF
// beat per msec値×0.85msecの時間音を止める
// 次の音階シーケンスに進める
noteCounter++;
// 26STEP進むと音階シーケンスカウンタが0になる(26÷26=1余り0の考え方)
noteCounter = noteCounter % 26;
Serial.println(frequency); // 各音階出力自の周波数をシリアルモニタに表示させる
}
}
}
押しボタンを押すと、童謡「かっこう」のメロディーが演奏されるプログラムです。
analogWaveライブラリを使ってプログラムが作られており、サンプルプログラムを読み解きながら日本語コメントを追記しました。
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
Arduino公式ページ記載のサンプルをアレンジして作成しました
動作確認
プログラムをArduino本体に転送したら、動作確認します。
タクトスイッチを押すと、童謡「かっこう」のメロディー演奏ができました。
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
![](https://cediablog.com/wp-content/uploads/nomal-clr-150x150.png)
かなり音が小さいと感じましたが、無事動作確認ができました。
公式サイトによると、音が小さい場合は「4オームまたは8オームのスピーカーとアンプが必要」とのことです。
まとめ
Arduino UNO R4 MinimaはDAC機能が付帯されて、本当のアナログ出力が出来るようになりました。
従来のUNO R3はアナログ出力がPWMによる疑似的なものしか使えませんでしたが、オシロスコープでも使わなければ矩形波と正弦波の違いを見極めるのは難しいくらいのクオリティなんだと感じました。
tone関数を使わないで、メロディー演奏ができることも分かり勉強になりました!
ちなみに秋月電子通商でのArduino UNO R4 Minimaの税込み販売価格は以下となっており、R4のほうが安いです。
・R3:3630円+送料
・R4:3190円+送料
純正品を買うならR4 Minimaの購入がおすすめです。
以上で、Arduino UNO R4 MinimaのDAC機能の紹介を終わります。
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
![](https://cediablog.com/wp-content/uploads/wink-150x150.png)
機能アップしても価格がR3より安いのは、嬉しいですね!
最後まで読んでいただき、ありがとうございました。
Arduino R3互換品キットなら、本体と30以上の電子パーツが入って5,000円程度と高コスパです。
![](https://cediablog.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
![](https://cediablog.com/wp-content/plugins/pochipp/assets/img/pochipp-logo-t1.png)
ELEGOOのArduino互換キットは本ブログのLESSONシリーズでも活用しています。
Arduino UNO R4 Minimaの開封レビュー記事です!
コメント