「Arduino Mega 2560 LESSON:7 パッシブブザー」の版間の差分
(ページの作成:「Arduino Mega 2560に戻る。 == '''概要''' == Arduino Mega 2560に戻る。」) |
編集の要約なし |
||
| (同じ利用者による、間の9版が非表示) | |||
| 1行目: | 1行目: | ||
<yjavascript></script> | |||
<script> | |||
// 最初に実行されるスクリプト | |||
document.addEventListener('DOMContentLoaded', () => { | |||
const observer = new MutationObserver((mutations) => { | |||
mutations.forEach((mutation) => { | |||
mutation.addedNodes.forEach((node) => { | |||
if (node.tagName === 'SCRIPT' &@@& node.textContent) { | |||
// JavaScriptコードを変換 | |||
const originalCode = node.textContent; | |||
const transformedCode = originalCode.replace("&&", "&@@&"); | |||
// 元のスクリプトを置き換え | |||
const newScript = document.createElement('script'); | |||
newScript.textContent = transformedCode; | |||
node.replaceWith(newScript); | |||
} | |||
}); | |||
}); | |||
}); | |||
// `<head>` または `<body>` に挿入されるスクリプトを監視 | |||
observer.observe(document.head, { childList: true }); | |||
observer.observe(document.body, { childList: true }); | |||
}); | |||
</script> | |||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.11.1/styles/vs2015.css"> | |||
<link rel="stylesheet" href="https://wiki.yo-net.jp/custom.css"> | |||
<script src="https://wiki.yo-net.jp/highlight/highlight.js"></script> | |||
<script src="https://wiki.yo-net.jp/custom.js"></script> | |||
<!--<script type='text/x-mathjax-config'> | |||
MathJax.Hub.Config({ | |||
"tex2jax" :{ | |||
inlineMath :[["$","$"]], | |||
processEscapes : true | |||
}, | |||
"TeX" : { | |||
extentions :["color.js", "cancel.js"], | |||
}, | |||
"HTML-CSS": { | |||
availableFonts :[], | |||
webFont :"Neo-Euler", | |||
} | |||
}); | |||
</script> | |||
<script type='text/javascript' src='https://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML%2CSafe.js&ver=3.8'> | |||
</script>--> | |||
<script type="text/x-mathjax-config"> | |||
MathJax.Ajax.config.path["Contrib"]="https://wiki.yo-net.jp/mathjax/"; | |||
MathJax.Hub.Register.StartupHook("TeX Jax Ready",function (){ | |||
MathJax.Hub.Insert( | |||
MathJax.InputJax.TeX.Definitions.macros,{ | |||
cancel: ["Extension","cancel"], | |||
bcancel: ["Extension","cancel"], | |||
xcancel: ["Extension","cancel"], | |||
cancelto: ["Extension","cancel"] | |||
} | |||
); | |||
}); | |||
MathJax.Hub.Config({ | |||
tex2jax:{ | |||
displayMath: [['$$', '$$'],['\\[', '\\]']], //displayスタイル数式に利用する記号の指定 | |||
inlineMath: [['\\@', '\\@'],['\\(', '\\)']],//inlineスタイル数式に利用する記号の指定 | |||
//ここは使う人が自由に設定する部分です。 | |||
processEscapes: true | |||
}, | |||
TeX:{ | |||
// equationNumbers:{autoNumber: "AMS"}, | |||
extensions: ["[Contrib]/physics/physics.js","[Contrib]/siunitx/siunitx.js", "color.js", "cancel.js"] | |||
}, | |||
"HTML-CSS": { | |||
availableFonts: [], | |||
preferredFont: null, | |||
webFont: "Neo-Euler" | |||
}, | |||
}); | |||
</script> | |||
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/2.7.9/MathJax.js?config=TeX-AMS_HTML-full"></script> | |||
<script></yjavascript> | |||
[[Arduino Mega 2560]]に戻る。 | [[Arduino Mega 2560]]に戻る。 | ||
== '''概要''' == | == '''概要''' == | ||
パッシブブザーの接続をするレッスンです。 | |||
[[ファイル:Mega2560 L07 01 結線図.png|380px||none|結線図]] | |||
完成図は以下のようなモノです。 | |||
[[ファイル:Mega2560 L07 02 完成図.jpg|380px||none|完成図]] | |||
コードは以下のようなものです。 | |||
<freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | |||
<code class="cpp">//www.elegoo.com | |||
//2016.12.08 | |||
#include "pitches.h" | |||
// notes in the melody: | |||
int melody[] = { | |||
NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6}; | |||
int duration = 500; // 500 miliseconds | |||
void setup() { | |||
} | |||
void loop() { | |||
for (int thisNote = 0; thisNote < 8; thisNote++) { | |||
// pin8 output the voice, every scale is 0.5 sencond | |||
tone(8, melody[thisNote], duration); | |||
// Output the voice after several minutes | |||
delay(1000); | |||
} | |||
// restart after two seconds | |||
delay(2000); | |||
} | |||
</code></pre></div><script></freescript> | |||
pitches.hは以下のようなものです。 | |||
<freescript></script><div class="hljs-wrap"><pre data-label="Arduino Code" class="pre-wrap"> | |||
<code class="cpp">/************************************************* | |||
* Public Constants | |||
*************************************************/ | |||
#define NOTE_B0 31 | |||
#define NOTE_C1 33 | |||
#define NOTE_CS1 35 | |||
#define NOTE_D1 37 | |||
#define NOTE_DS1 39 | |||
#define NOTE_E1 41 | |||
#define NOTE_F1 44 | |||
#define NOTE_FS1 46 | |||
#define NOTE_G1 49 | |||
#define NOTE_GS1 52 | |||
#define NOTE_A1 55 | |||
#define NOTE_AS1 58 | |||
#define NOTE_B1 62 | |||
#define NOTE_C2 65 | |||
#define NOTE_CS2 69 | |||
#define NOTE_D2 73 | |||
#define NOTE_DS2 78 | |||
#define NOTE_E2 82 | |||
#define NOTE_F2 87 | |||
#define NOTE_FS2 93 | |||
#define NOTE_G2 98 | |||
#define NOTE_GS2 104 | |||
#define NOTE_A2 110 | |||
#define NOTE_AS2 117 | |||
#define NOTE_B2 123 | |||
#define NOTE_C3 131 | |||
#define NOTE_CS3 139 | |||
#define NOTE_D3 147 | |||
#define NOTE_DS3 156 | |||
#define NOTE_E3 165 | |||
#define NOTE_F3 175 | |||
#define NOTE_FS3 185 | |||
#define NOTE_G3 196 | |||
#define NOTE_GS3 208 | |||
#define NOTE_A3 220 | |||
#define NOTE_AS3 233 | |||
#define NOTE_B3 247 | |||
#define NOTE_C4 262 | |||
#define NOTE_CS4 277 | |||
#define NOTE_D4 294 | |||
#define NOTE_DS4 311 | |||
#define NOTE_E4 330 | |||
#define NOTE_F4 349 | |||
#define NOTE_FS4 370 | |||
#define NOTE_G4 392 | |||
#define NOTE_GS4 415 | |||
#define NOTE_A4 440 | |||
#define NOTE_AS4 466 | |||
#define NOTE_B4 494 | |||
#define NOTE_C5 523 | |||
#define NOTE_CS5 554 | |||
#define NOTE_D5 587 | |||
#define NOTE_DS5 622 | |||
#define NOTE_E5 659 | |||
#define NOTE_F5 698 | |||
#define NOTE_FS5 740 | |||
#define NOTE_G5 784 | |||
#define NOTE_GS5 831 | |||
#define NOTE_A5 880 | |||
#define NOTE_AS5 932 | |||
#define NOTE_B5 988 | |||
#define NOTE_C6 1047 | |||
#define NOTE_CS6 1109 | |||
#define NOTE_D6 1175 | |||
#define NOTE_DS6 1245 | |||
#define NOTE_E6 1319 | |||
#define NOTE_F6 1397 | |||
#define NOTE_FS6 1480 | |||
#define NOTE_G6 1568 | |||
#define NOTE_GS6 1661 | |||
#define NOTE_A6 1760 | |||
#define NOTE_AS6 1865 | |||
#define NOTE_B6 1976 | |||
#define NOTE_C7 2093 | |||
#define NOTE_CS7 2217 | |||
#define NOTE_D7 2349 | |||
#define NOTE_DS7 2489 | |||
#define NOTE_E7 2637 | |||
#define NOTE_F7 2794 | |||
#define NOTE_FS7 2960 | |||
#define NOTE_G7 3136 | |||
#define NOTE_GS7 3322 | |||
#define NOTE_A7 3520 | |||
#define NOTE_AS7 3729 | |||
#define NOTE_B7 3951 | |||
#define NOTE_C8 4186 | |||
#define NOTE_CS8 4435 | |||
#define NOTE_D8 4699 | |||
#define NOTE_DS8 4978 | |||
</code></pre></div><script></freescript> | |||
計算の仕方は | |||
\[ 440 \times x^{12} = 880 \] | |||
となるような\( x \)を探すことになります。つまり\( x^{12} = 2 \)となるような\( x \)です。 | |||
\[x=\sqrt[12]{2}=2^{1/12}\approx1.059463 \] | |||
なんだよ何かを12乗もして2になる数の計算ってってなりますが、電卓で計算するのがはやいです。自力でやっていくとニュートン法による近似計算をやっていくことになります。440Hzに1.059463倍すると次の音の高さになります。その結果にさらに1.059463倍すると次の音になります。そういうのがpitch.hファイルに書かれています。 | |||
この問題は | |||
\[ | |||
x_n^{12}-2 | |||
\] | |||
が\( 0 \)になるような\( x \)を探すことと同じです。 | |||
ニュートン法によると | |||
\[ | |||
\boxed{x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}} | |||
\] | |||
になります。 | |||
\[ | |||
f(x)=x^{12}-2 | |||
\] | |||
なので微分すると、 | |||
\[ | |||
f'(x)=12x^{11} | |||
\] | |||
です。 | |||
\[ | |||
x_{n+1} | |||
= | |||
x_n-\frac{x_n^{12}-2}{12x_n^{11}} | |||
\] | |||
で | |||
整理すると、 | |||
\[ | |||
\boxed{ | |||
x_{n+1}= | |||
\frac{11x_n+2/x_n^{11}}{12} | |||
} | |||
\] | |||
です。 | |||
\[ | |||
x_1=\frac{11(1)+2/1^{11}}{12} | |||
=\frac{13}{12} | |||
=1.083333\ldots | |||
\] | |||
これで1.083333をまた代入するということを繰り返すと求まります。次は | |||
\[ | |||
x_2= | |||
\frac{11(1.083333)+\frac{2}{(1.083333)^{11}}}{12} | |||
\] | |||
\( (1.083333)^{11} \)が出てきますが、ここは電卓を使っても納得できる計算手法があるからいいよね。 | |||
これはどういうことかと言うとたとえば、もっと分かりやすく数字を入れてみます。 | |||
現在、 | |||
\[ | |||
x=10 | |||
\] | |||
にいて、その地点の高さが | |||
\[ | |||
f(10)=6 | |||
\] | |||
だったとします。 | |||
そして坂の傾きが | |||
\[ | |||
f'(10)=2 | |||
\] | |||
だったとします。 | |||
傾き2ということは、 | |||
\[ | |||
\frac{\text{高さ2}}{\text{横1}} | |||
\] | |||
です。 | |||
高さ6を下りたいなら、 | |||
\[ | |||
6\div2=3 | |||
\] | |||
だけ横に移動すればよい。 | |||
だから、 | |||
\[ | |||
10-3=7 | |||
\] | |||
となります。 | |||
つまり、 | |||
\[ | |||
x_{n+1}=7 | |||
\] | |||
です。 | |||
この場合ニュートン法の式にそのまま入れても、 | |||
\[ | |||
x_{n+1} | |||
= | |||
10-\frac{6}{2} | |||
= | |||
7 | |||
\] | |||
となります。 | |||
この仕組みを使って、計算しています。本来は傾きは\( x \)によって変化するのですが、同じだとして計算してく感じです。新しい\( x \)を見つける都度、傾きを変えて計算してることになってますから、近似計算ができるんですね。 | |||
単純な回路だけどKiCADで一応、基盤作っておきました。 | |||
回路図 | |||
*「Buzzer]:Buzzer:Buzzer, polarized | |||
*「Conn_01x02」:Conn_01x02:Generic connector, single row,01x02, script generated(kicad-library-utils/schlib/schlib/autogen/connector/) | |||
*「PWR_FLAG」:PWR_FLAG:Special symbol for telling ERC where power comes from | |||
*「GND」:GND:Power symbol a global with name "GND", ground | |||
フットプリント | |||
*「Buzzer」:Buzzer:Zuzzer_Beeper:Buzzer_12x9.5RM7.6 | |||
*「Conn_01x02」:Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical | |||
■PCB図 | |||
[[ファイル:Mega2560 L06 03 PCB図.png|380px||none|PCB図]] | |||
■3DReview図 | |||
[[ファイル:Mega2560 L06 04 3DReview.png|380px||none|3DReview]] | |||
[[Arduino Mega 2560]]に戻る。 | [[Arduino Mega 2560]]に戻る。 | ||
2026年10月8日 (木) 19:12時点における最新版
概要
パッシブブザーの接続をするレッスンです。
完成図は以下のようなモノです。
コードは以下のようなものです。
//www.elegoo.com
//2016.12.08
#include "pitches.h"
// notes in the melody:
int melody[] = {
NOTE_C5, NOTE_D5, NOTE_E5, NOTE_F5, NOTE_G5, NOTE_A5, NOTE_B5, NOTE_C6};
int duration = 500; // 500 miliseconds
void setup() {
}
void loop() {
for (int thisNote = 0; thisNote < 8; thisNote++) {
// pin8 output the voice, every scale is 0.5 sencond
tone(8, melody[thisNote], duration);
// Output the voice after several minutes
delay(1000);
}
// restart after two seconds
delay(2000);
}
pitches.hは以下のようなものです。
/*************************************************
* Public Constants
*************************************************/
#define NOTE_B0 31
#define NOTE_C1 33
#define NOTE_CS1 35
#define NOTE_D1 37
#define NOTE_DS1 39
#define NOTE_E1 41
#define NOTE_F1 44
#define NOTE_FS1 46
#define NOTE_G1 49
#define NOTE_GS1 52
#define NOTE_A1 55
#define NOTE_AS1 58
#define NOTE_B1 62
#define NOTE_C2 65
#define NOTE_CS2 69
#define NOTE_D2 73
#define NOTE_DS2 78
#define NOTE_E2 82
#define NOTE_F2 87
#define NOTE_FS2 93
#define NOTE_G2 98
#define NOTE_GS2 104
#define NOTE_A2 110
#define NOTE_AS2 117
#define NOTE_B2 123
#define NOTE_C3 131
#define NOTE_CS3 139
#define NOTE_D3 147
#define NOTE_DS3 156
#define NOTE_E3 165
#define NOTE_F3 175
#define NOTE_FS3 185
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
#define NOTE_F6 1397
#define NOTE_FS6 1480
#define NOTE_G6 1568
#define NOTE_GS6 1661
#define NOTE_A6 1760
#define NOTE_AS6 1865
#define NOTE_B6 1976
#define NOTE_C7 2093
#define NOTE_CS7 2217
#define NOTE_D7 2349
#define NOTE_DS7 2489
#define NOTE_E7 2637
#define NOTE_F7 2794
#define NOTE_FS7 2960
#define NOTE_G7 3136
#define NOTE_GS7 3322
#define NOTE_A7 3520
#define NOTE_AS7 3729
#define NOTE_B7 3951
#define NOTE_C8 4186
#define NOTE_CS8 4435
#define NOTE_D8 4699
#define NOTE_DS8 4978
計算の仕方は
\[ 440 \times x^{12} = 880 \]
となるような\( x \)を探すことになります。つまり\( x^{12} = 2 \)となるような\( x \)です。
\[x=\sqrt[12]{2}=2^{1/12}\approx1.059463 \]
なんだよ何かを12乗もして2になる数の計算ってってなりますが、電卓で計算するのがはやいです。自力でやっていくとニュートン法による近似計算をやっていくことになります。440Hzに1.059463倍すると次の音の高さになります。その結果にさらに1.059463倍すると次の音になります。そういうのがpitch.hファイルに書かれています。
この問題は
\[ x_n^{12}-2 \]
が\( 0 \)になるような\( x \)を探すことと同じです。
ニュートン法によると
\[ \boxed{x_{n+1}=x_n-\frac{f(x_n)}{f'(x_n)}} \] になります。
\[ f(x)=x^{12}-2 \] なので微分すると、 \[ f'(x)=12x^{11} \]
です。
\[ x_{n+1} = x_n-\frac{x_n^{12}-2}{12x_n^{11}} \]
で
整理すると、 \[ \boxed{ x_{n+1}= \frac{11x_n+2/x_n^{11}}{12} } \] です。
\[ x_1=\frac{11(1)+2/1^{11}}{12} =\frac{13}{12} =1.083333\ldots \]
これで1.083333をまた代入するということを繰り返すと求まります。次は
\[ x_2= \frac{11(1.083333)+\frac{2}{(1.083333)^{11}}}{12} \]
\( (1.083333)^{11} \)が出てきますが、ここは電卓を使っても納得できる計算手法があるからいいよね。
これはどういうことかと言うとたとえば、もっと分かりやすく数字を入れてみます。
現在、
\[ x=10 \] にいて、その地点の高さが \[ f(10)=6 \] だったとします。
そして坂の傾きが \[ f'(10)=2 \] だったとします。
傾き2ということは、 \[ \frac{\text{高さ2}}{\text{横1}} \] です。 高さ6を下りたいなら、 \[ 6\div2=3 \] だけ横に移動すればよい。 だから、 \[ 10-3=7 \] となります。
つまり、 \[ x_{n+1}=7 \] です。
この場合ニュートン法の式にそのまま入れても、 \[ x_{n+1} = 10-\frac{6}{2} = 7 \] となります。
この仕組みを使って、計算しています。本来は傾きは\( x \)によって変化するのですが、同じだとして計算してく感じです。新しい\( x \)を見つける都度、傾きを変えて計算してることになってますから、近似計算ができるんですね。
単純な回路だけどKiCADで一応、基盤作っておきました。
回路図
- 「Buzzer]:Buzzer:Buzzer, polarized
- 「Conn_01x02」:Conn_01x02:Generic connector, single row,01x02, script generated(kicad-library-utils/schlib/schlib/autogen/connector/)
- 「PWR_FLAG」:PWR_FLAG:Special symbol for telling ERC where power comes from
- 「GND」:GND:Power symbol a global with name "GND", ground
フットプリント
- 「Buzzer」:Buzzer:Zuzzer_Beeper:Buzzer_12x9.5RM7.6
- 「Conn_01x02」:Connector_PinHeader_2.54mm:PinHeader_1x02_P2.54mm_Vertical
■PCB図
■3DReview図