NOBのArduino日記!

NOBのArduino日記!

趣味は車・バイク・自転車・ラジコン・電子工作です。

EXCELで作る正弦波・のこぎり波・矩形波・三角波!(VBA編)

 
 前回 各種波形をsin関数の足し合わせで作るフーリエ級数を使った方法で御紹介致しました。ただ、フーリエ級数は難解で(私にとって)、波形を新たに作るには時間も掛るし、矩形波(くけいは)についてはデューディー比を変えることはつまり、フーリエ級数展開をもう一度やり直さなければならないのでなかなか融通が利きません。
 学術的には信頼と実績のフーリエ級数を使うのがスマートでカッコいいと思います。
フーリエ級数飲食店で例えると、歴史と伝統ある高級レストランで、遅い(時間が掛る)・高い(要求されるレベル)・うまい気がする(Sin波ノイズはどう頑張っても残ります)。
 
 趣味的には現代の技術であるプログラミング(Excelにおまけで付いているVBAで十分!)を使うのが圧倒的に早くて楽です。
VBA 飲食店で例えると、ファストフード店で、早い(私がやった感じ5倍速く同じものが出来ました)・安い(中学校の授業でBasicのプログラミングが有るくらい簡単)・うまい(ノイズ無し!)です。

1.使用方法

1.1 VBAの使い方
 VBAの使用方法について、詳細を知りたい方はこちらをご覧ください。
 
1.2 プログラムを貼り付ける
 各種波形のプログラム(コードともマクロとも言います)を各種波形の項目に記載してあります。例として矩形波(くけいは)のプログラムをコピーして図1の様にModule内にペーストします。
 この状態で図1上段中央の再生ボタンを押して、プログラムを実行します。
イメージ 4
図1:VBAのModuleにコードを張り付ける
 
1.3 InputBox
 矩形波のプログラムを実行すると図2~5の入力画面が開きます。

1.3.1 デューティー
 最初に図2のメッセージBOXが開き「出力波形のデューティー比(%)を0~100迄の整数で入力して下さい」と表示されます。
 デューティー比とは矩形波の山の割合を100%で表したものです。とりあえず「50」と入力します。
イメージ 5
図2:デューティー比入力画面
 
1.3.2 何波長分
 2つ目に図3のメッセージBOXが開き「出力する波形の数を1~255の整数で入力して下さい」と表示されます。3波長分もあれば波形が見易いのでとりあえず「3」と入力します。
イメージ 6
図3:波長数入力画面

1.3.3 周波数
 3つ目に図4のメッセージBOXが開き「出力する波形の周波数を正の数で入力して下さい」と表示されるので分かりやすい周波数1Hz(1秒間に1回振幅する)を見たいので「1」と入力します。
イメージ 7
図4:周波数入力画面
 
1.3.4 電圧
 最後に図5のメッセージBOXが開き「出力する波形の電圧を正の数で入力して下さい」と表示されるのでArduino UNOで使う5Vと想定して「5」と入力し「OK」を押します。
イメージ 8
図5:電圧入力画面

1.4 計算結果の出力
 以上の設定(デューティー比50%、1Hz、5V、3波長分)で、計算結果が図6の通りExcelシートに出力されました。
イメージ 9
図6:矩形波の計算結果が出力された状態

1.5 散布図の作成
 出力された計算結果を散布図にします。やり方は図7の様にAB列を選択し図8の様に散布図を作るだけです。
イメージ 10
図7:グラフ化する列の選択と散布図の選択
 
イメージ 11
図8:散布図作成後画面
 
1.6 補足
 上記例は矩形波の信号を生成している為、デューティー比の設定項目分多い4項目設定しておりますが、他の正弦波、のこぎり波、三角波についてはデューティー比は関係ありませんので3項目(周波数(Hz)、電圧(V)、波長数)入力すれば波形が出力されます。
 矩形波・のこぎり波・三角波については1波長を256(1Byte)分割して計算結果を出力していますが、正弦波については、1波長を360分割した計算結果が出力されています。

2.正弦波

2.1 下記プログラムを貼り付ける

Sub SineWave()
'正弦波生成(2016.3.14 NOB)
    '変数宣言
    Dim i As Single
    Dim j As Byte
    Dim A As Long
    Dim Time As Single
    Dim Wave As Byte
    Dim Hz As Single
    Dim Voltage As Single
    Dim Pi As Single
    Pi = Atn(1) * 4   ' 円周率(π)の値。
 
    '変数入力
    Wave = InputBox("出力する波形の数を1~255の整数で入力して下さい")
    Hz = InputBox("出力する波形の周波数を正の数で入力して下さい")
    Voltage = InputBox("出力する波形の電圧を正の数で入力して下さい")
 
    '信号生成
    For j = 0 To Wave - 1
        For i = 0 To 359
            A = A + 1
            If i = 0 Then
                Cells(A + 1, 2) = 0
            Else
                Cells(A + 1, 2) = Sin((Pi / 180) * i) * Voltage
            End If
            Cells(A + 1, 1) = Time
            Time = Time + (1 / Hz) / 360
        Next i
    Next j
 
    '表題追加
    Range("A1") = "時間(sec)"
    Range("B1") = "電圧(V)"
End Sub

2.2 プログラムを実行する
 再生ボタンを押すだけです。
2.3 InputBoxに出力したい条件を入力する
 何波長「1~255の整数、例えば3」、周波数「小数点以下も可、正の数」Hz、電圧小数点以下も可、正の数」Vを入力。
2.4 出力結果を散布図にする
 散布図を作成した結果が図9です。
 2.3で設定した通りの正弦波が出力されました。
イメージ 12
図9:正弦波

3.のこぎり波

3.1 下記プログラムを貼り付ける

Sub SawtoothWave()
'のこぎり波生成(2016.3.14 NOB)
    '変数宣言
    Dim i As Byte
    Dim j As Byte
    Dim A As Long
    Dim Time As Single
    Dim Wave As Byte
    Dim Hz As Single
    Dim Voltage As Single
 
    '変数入力
    Wave = InputBox("出力する波形の数を1~255の整数で入力して下さい")
    Hz = InputBox("出力する波形の周波数を正の数で入力して下さい")
    Voltage = InputBox("出力する波形の電圧を正の数で入力して下さい")
 
    '信号生成
    For j = 0 To Wave - 1
        For i = 0 To 254
            A = A + 1
            If i <= 254 * (255 / 100) Then
                Cells(A + 1, 2) = i * (1 / 255) * Voltage
            End If
            Cells(A + 1, 1) = Time
            Time = Time + (1 / Hz) / 255
        Next i
    Next j
 
    '表題追加
    Range("A1") = "時間(sec)"
    Range("B1") = "電圧(V)"
End Sub

3.2 プログラムを実行する
 再生ボタンを押すだけです。
3.3 InputBoxに出力したい条件を入力する
 何波長「1~255の整数、例えば3」、周波数「小数点以下も可、正の数」Hz、電圧小数点以下も可、正の数」Vを入力。
3.4 出力結果を散布図にする
 散布図を作成した結果が図10です。
 3.3で設定した通りの正弦波が出力されました。
イメージ 1
図10:のこぎり波
4.1 下記プログラムを貼り付ける

'矩形波生成(2016.3.14 NOB)
    '変数宣言
    Dim i As Byte
    Dim j As Byte
    Dim A As Long
    Dim Time As Single
    Dim Wave As Byte
    Dim Duty As Byte
    Dim Hz As Single
    Dim Voltage As Single
 
    '変数入力
    Duty = InputBox("出力波形のデューティー比(%)を0~100迄の整数で入力して下さい")
    Wave = InputBox("出力する波形の数を1~255の整数で入力して下さい")
    Hz = InputBox("出力する波形の周波数を正の数で入力して下さい")
    Voltage = InputBox("出力する波形の電圧を正の数で入力して下さい")
 
    '信号生成
    For j = 0 To Wave - 1
        For i = 0 To 254
            A = A + 1
            If i <= 254 * (Duty / 100) Then
                If Duty = 0 Then
                    Cells(A + 1, 2) = 0
                Else
                    Cells(A + 1, 2) = Voltage
                End If
            End If
            If i > 254 * (Duty / 100) Then
                If Duty = 100 Then
                    Cells(A + 1, 2) = Voltage
                Else
                    Cells(A + 1, 2) = 0
                End If
            End If
            Cells(A + 1, 1) = Time
            Time = Time + (1 / Hz) / 255
        Next i
    Next j
 
    '表題追加
    Range("A1") = "時間(sec)"
    Range("B1") = "電圧(V)"
End Sub

4.2 プログラムを実行する
 再生ボタンを押すだけです。
4.3 InputBoxに出力したい条件を入力する
 デューティー比「0~100の整数、例えば50」%、何波長「1~255の整数、例えば3」、周波数「小数点以下も可、正の数」Hz、電圧小数点以下も可、正の数」Vを入力。
4.4 出力結果を散布図にする
 散布図を作成した結果が図11です。
 4.3で設定した通りの正弦波が出力されました。
イメージ 2
図11:矩形波
5.1 下記プログラムを貼り付ける

Sub TriangleWave()
'三角波生成(2016.3.14 NOB)
    '変数宣言
    Dim i As Byte
    Dim j As Byte
    Dim A As Long
    Dim Time As Single
    Dim Wave As Byte
    Dim Hz As Single
    Dim Voltage As Single
 
    '変数入力
    Wave = InputBox("出力する波形の数を1~255の整数で入力して下さい")
    Hz = InputBox("出力する波形の周波数を正の数で入力して下さい")
    Voltage = InputBox("出力する波形の電圧を正の数で入力して下さい")
 
    '信号生成
    For j = 0 To Wave - 1
        For i = 0 To 254
            A = A + 1
            If i <= 127 Then
                Cells(A + 1, 2) = i * (1 / 255) * Voltage * 2
            Else
                Cells(A + 1, 2) = (255 - i) * (1 / 255) * Voltage * 2
            End If
            Cells(A + 1, 1) = Time
            Time = Time + (1 / Hz) / 255
        Next i
    Next j
 
    '表題追加
    Range("A1") = "時間(sec)"
    Range("B1") = "電圧(V)"
End Sub

5.2 プログラムを実行する
 再生ボタンを押すだけです。
5.3 InputBoxに出力したい条件を入力する
 何波長「1~255の整数、例えば3」、周波数「小数点以下も可、正の数」Hz、電圧小数点以下も可、正の数」Vを入力。
5.4 出力結果を散布図にする
 散布図を作成した結果が図12です。
 5.3で設定した通りの正弦波が出力されました。
イメージ 3
図12:三角波

6.まとめ

 ブログに載せる各種波形のグラフを作るだけでかなり遠回りしてしまいました・・・。
 しかしさすがVBA!速くて簡単そして正確!何の苦労もトラブルもなくあっけなく各種波形を作成出来ました。
 
イメージ 1 イメージ 3
励みになりますのでよければクリック下さい(^o^)/

↩【NOBのArduino日記!】目次に戻る