おもしろ工作・プログラミング動画配信中!せでぃあのYouTube

Arduino UNO R4 MinimaでDAC機能を使ったメロディー演奏をやってみた

Arduino UNO R4 MinimaでDAC機能を使ったメロディー演奏をやってみた
  • URLをコピーしました!

この記事内には、プロモーションが含まれます。

こんにちは、せでぃあ(@cediablog)です。

Arduino UNO R3の後継機種であるArduino UNO R4 Minimaを購入して、新機能を順次試して楽しんでいます。

今回試す新機能は、「DAC(デジタルアナログコンバーター)」という機能で、0Vと5Vの間の電圧(例えば2.5V)を作り出すことができる機能になります。

今回、このRTC機能を使ってパッシブブザーによる童謡「かっこう」のメロディー演奏プログラムを作ってみました。

DAC機能を使ったメロディー演奏のための、機器配線状態画像
DAC機能を使って、メロディー演奏させます!
せでぃあ

みんなが知ってる童謡「かっこう」のメロディーを奏でます!

この記事を読んでわかること
  • DAC(デジタルアナログコンバーター)機能の使い方
  • パッシブブザーを使ってメロディー演奏させる配線方法
  • Arduino IDEでのプログラミング方法
この記事を書いた人
せでぃあ

せでぃあはこんな人物です

✅プライム企業に勤める電気・機械設計エンジニア

✅親子の絆を深めるため、夏休みに子供と一緒に電子工作を製作

✅Arduinoプログラミングを用いて作ったプログラミング電子工作「信GO機」が市の発明くふう展で「優秀賞」を受賞

✅本ブログにてArduinoスクラッチプログラミングLESSON記事投稿中

✅YouTubeチャンネル「せでぃあブログちゃんねる」運営中

目次

DAC(デジタルアナログコンバーター)機能について

DAC機能によるアナログ出力イメージ
DAC機能によるアナログ出力イメージ

Arduino UNO R4 Minimaの新機能「DAC(デジタルアナログコンバーター)」は、名前の通りデジタルデータをアナログ出力させることができる機能です。

デジタルとアナログ出力の違い

デジタル出力:LOW「0V」またはHIGH「5V」の2通りのみ
アナログ出力:0V~5Vの範囲で様々な電圧出力が可能

アナログ出力機能って、どんなときに使うのか?

それは、電圧値によって機器を制御したいときに使います。

アナログ出力で機器を制御する例
  • LEDの点灯明るさを制御する
  • DCモーターの回転速度を制御する
せでぃあ

アナログ制御は、動作の程度を制御するときに必要な制御です。

従来のUNO R3でもアナログ出力は可能

実はこのアナログ出力機能ですが、従来のArduino UNO R3でもアナログ出力が可能です。

PWM(パルス変調)により疑似的にアナログ出力が可能です。
PWM(パルス変調)のイメージ

Arduino UNO R3では、「PWM(パルス変調)」という方法で疑似的に実現することが可能でした。

PWM(Pulse Width Modulation)とは、0Vと5Vの出力時間の割合を制御して疑似的に中間の電圧を作る方法です。

上の図の場合は、疑似的に2Vの電圧を作り出しています。

せでぃあ

従来は疑似的な方法でしか、アナログ出力が出来ませんでした。

PWM出力制御について詳しく知りたい方は、こちらの記事もあわせてご覧ください。

オーディオ目的でもDACが活用できる

DAC機能を使った音階出力のイメージ
DAC機能を使った音階出力のイメージ

今回のメロディー演奏動作につながる機能になります。

Arduino UNO R4 MinimaにはDAC(デジタル-アナログコンバーター)が組み込まれており、デジタル信号をアナログ信号に変換するために使用されます。この機能は、多数の楽しいオーディオプロジェクトを構築するために使用できますが、たとえば、安価な関数ジェネレーターなどのプロのラボ機器としても機能します。

Arduino公式サイトより引用

Arduino公式サイトによると、DAC機能を使うことで正弦波を作ることができ、それを使って任意の周波数の音をパッシブブザー(スピーカー)から出すことができると記載されています。

音階は周波数制御により変更可能

音階に対応した周波数
周波数を制御することで音階を変えます

パッシブブザーから出す音の音階は、正弦波の周波数を変えることで調節することができます。

音階とオクターブの組み合わせで、対応する周波数が異なってきます。

音階と周波数の組み合わせについてはこちらの外部サイトで、詳しく紹介されています。

従来のUNO R3でも音階制御は可能

Arduino UNO R3とUNO R4 Minimaの音階制御方法の違い
UNO R3での音階制御(左)とDAC制御(右)の比較

従来のArduino UNO R3でも音階制御が可能です。

tone関数という関数を使うことで、正弦波ではなく矩形波出力が可能です。

この矩形波出力の周波数を制御することで、音階制御を可能としています。

せでぃあ

本質的なアナログ出力ができないため、矩形波で周波数制御します。

tone関数を使った音階制御に関しては、こちらの記事で詳しく紹介しています。

DAC機能を使った、メロディー演奏回路で使うもの

DAC機能を使った、メロディー演奏回路で使うもの
配線が完了しプログラム転送できる状態写真
準備するもの
  1. パソコン
  2. Arduino本体
  3. USBケーブル(typeC)
  4. ブレッドボード
  5. タクトスイッチ
  6. 抵抗(1kΩ)
  7. パッシブブザー
  8. ジャンパー線(オスーオス)×6本

今回はELEGOO社のスーパースターターキットに含まれる部品を使っています。

キットに含まれる部品は、機器名後に【キット】と記載しています。

コスパ最強のArduinoキットに含まれる、すべてのパーツを紹介しています。

パソコン

プログラムを作成するために必要です。

プログラム制御の演算はArduino側で行うため、パソコンのSPECは一般的なモデルで十分対応可能です。

パソコンのOSはWindows、Macどちらでも対応可能です。

Arduino UNO R4 Minima本体

Aruino Uno R4 minimaの本体写真
Arduino UNO R4 Minima本体

今回は、Arduino純正品の「Arduino UNO R4 Minima」を使用します。

納期や価格面から、国内から発送される通販サイトからの購入がおすすめです。

R4 Minimaが買える国内サイト

Amazon
スイッチサイエンス
秋月電子通商

Arduino UNO R4 Minimaの始め方は、こちらを参考にしてみてください。

せでぃあ

ピン配置などの基本的な仕様は、UNO R3と同じです!

USBケーブル(TypeC)

TypeC USBケーブル
TypeCのUSBケーブル

UNO R3は本体に接続する側の端子形状が(TypeB)でしたが、R4 MinimaではTypeC形状になります。

パソコンとArduinoを接続してプログラムデータのやり取りをするために必要です。

せでぃあ

USBケーブルは別売りなので、買い忘れに注意してください。

ブレッドボード【キット】

ブレッドボードの機能説明図
ブレッドボードの機能説明図

たくさんの穴が開いていて、部品の端子を穴に差し込むだけで電気的に接続が可能な板です。

説明図は30列のショート版ですが、スーパースターターキットに含まれる63列タイプでも機能は同じです

ブレッドボードだけの購入も可能です。

タクトスイッチ【キット】

押しボタンの説明
押しボタンの説明

今回の回路では、タクトスイッチ(押しボタンスイッチ)を使用します。

押しボタンは押されている間のみ、上記写真での2点が内部でつながります。

このようなボタンをモーメンタリボタンといいます。

今回は扱いませんが、ボタンから手を離してもONしたままになるボタンをオルタネイトボタンといいます。

モーメンタリ・オルタネイトボタンについては以下記事にて詳しく説明しています。

抵抗(1kΩ)【キット】

1kΩ抵抗と色による見分け方
1kΩ抵抗と色による見分け方

1kΩの抵抗を1本使用し、押しボタンスイッチに接続します。

抵抗を接続するのは、押しボタンがOFFのときにArduino本体がノイズによる誤検出することを避けるためです。

この記事では詳しく説明しませんが、ボタンを押していないのに押されたと誤認識されることを避ける目的であるということだけ覚えておいてください。

抵抗カラーコードの見分け方については、こちらの記事で詳しく説明しています。

パッシブブザー【キット】

パッシブブザー
パッシブブザー

パッシブブザーとは、普通のスピーカーと同じで一定周波数の電圧によって音を出すことができる電子機器です。

周波数を変化させることで、音色を変えることができます

ジャンパー線(オスーオス)【キット】

キットに同梱されているジャンパー線(オスーオス)の説明
ジャンパー線

ジャンパー線を6本使用します。

Arduino本体とブレッドボードの接続や、ブレッドボードの共通電源ライン(GNDまたは5V)からブレッドボード内の配線系統穴に差し込んで接続するのに使います。

DAC機能を使うための配線

DAC機能を使ってメロディー演奏させる回路図
DAC機能を使ってメロディー演奏させる回路図
Arduino UNO R4 Minimaのピン機能仕様
公式データシートより引用
DAC機能は「A0」ソケットのみ機能があります。
DAC機能は「A0」ソケットに接続して使います

公式データシートによると、DAC機能はアナログソケット「A0」に接続して使用します。

今回DAC機能で制御したい電子機器は「パッシブブザー」なので、パッシブブザーの「+側」をA0に接続します。

今回はタクトスイッチをデジタル入力ソケット「2番」に接続しています。

これは、押しボタンを押すことでメロディー演奏を開始させるために使用します。

1kΩ抵抗もタクトスイッチに接続していますが、スイッチOFF状態では確実に電位が0Vになるようにしています。

DAC機能を使ったメロディー演奏プログラム

DAC機能を使ったメロディー演奏のための、機器配線状態画像
配線作業が完了した状態

配線が完了したところで、童謡「かっこう」演奏プログラムを作っていきます。

今回Arduino公式サイトのサンプルプログラムをベースに、アレンジして作っています。

/*
DAC Melody player

Generates 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 A5

created 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の画面
Arduino IDE2.1の画面

今回Arduino IDE2.1を使ってプログラムを作成しました。

プログラムを作成していきます。

USBケーブルで、Arduino UNO R4 Minimaと接続した状態で開くと、プルダウンから機種選択が可能です。

せでぃあ

機種選択は、プログラム作成後でも問題ありません。

Arduino IDE2.1のインストール方法については、こちらの記事で紹介しています。

音階制御の考え方

音階対照表
今回のプログラムでは、Note No.を使って音階指定します

今回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ライブラリを使ってプログラムが作られており、サンプルプログラムを読み解きながら日本語コメントを追記しました。

せでぃあ

Arduino公式ページ記載のサンプルをアレンジして作成しました

動作確認

再生する際は設定音量にご注意ください。

いいね!と思ったらチャンネル登録していただけますと嬉しいです!

プログラムをArduino本体に転送したら、動作確認します。

タクトスイッチを押すと、童謡「かっこう」のメロディー演奏ができました。

せでぃあ

かなり音が小さいと感じましたが、無事動作確認ができました。

公式サイトによると、音が小さい場合は「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機能の紹介を終わります。

せでぃあ

機能アップしても価格がR3より安いのは、嬉しいですね!

最後まで読んでいただき、ありがとうございました。

Arduino R3互換品キットなら、本体と30以上の電子パーツが入って5,000円程度と高コスパです。

ELEGOOのArduino互換キットは本ブログのLESSONシリーズでも活用しています。

Arduino UNO R4 Minimaの開封レビュー記事です!

応援ありがとうございます(^^)/

Arduino UNO R4 MinimaでDAC機能を使ったメロディー演奏をやってみた

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次