前回、Arduino UNOとWio TerminalのTIMERとPWMを比べ、分かった気になっていたのですが、昨日の別投稿にて「Buzzerがか細く鳴った」せいで、またぞろ疑問が出てまいりました。これに決着つけるためにはWio TerminalのMCUであるSAMD51P19のハードウエアと「Arduino的」ソフトの世界のピン番号の対応関係が知りたい!
※「IoT何をいまさら」投稿順Indexはこちら
手っ取り早く結論を書いておきます。SeeedStudio社の”SAMD”マイコン搭載の各種ボードの「違い」を吸収するための以下のソース・ファイルをまず読むべきでした。
variant.cpp
私のArduinoIDEのインストール環境(Microsoftストアからインストール)では、以下のパスにsamdマイコンのライブラリが存在します。
\Users\ユーザ名\Documents\ArduinoData\packages\Seeeduino\hardware\
”Wio Terminal用のvariant.cppは、その下の以下のフォルダにあります。
samd\1.8.1\variants\wio_terminal
variants配下には、Wio Terminal以外にも何種類かの各種ボードが存在し、それぞれにvariant.cppが存在します。このファイルの中で
PinDescription型の定数構造体配列g_APinDescription
が定義されているのですが、これこそ知りたかったものでした。
-
- 配列のインデックス番号は”Arduino”環境から見えるピン番号
- 定数定義されている構造の中に、ハードウエアの実端子との対応を始め、アナログ、デジタル、PWM可能か否か、対応するタイマは、といった諸元が記載
Arduinoのソフト上で0番のピンを知りたければ、インデックス0の構造体をよめば何が出来て、ハードウエアペリフェラルの何と接続しているのか分かる、というわけです。
最初からそう言ってくれよ、という感じ。知らなかったのは私だけ?これを見ればいろいろな疑問氷解です。まず端的なところでは、前回、Arduino環境(デジタル端子に6本)と比較してもすくない4本(他の端子含めて5本)しかなじゃん、と言っていたPWM可能なピンが他にもたくさんあることも判明。4本(他含めて5本)の根拠はご本家の以下のホームページの
Pinout Diagramに「PWM」と記してある端子が5本しかないためでした。SAMD51P19にはUnoのAVRマイコンより豊富なタイマがあり、PWM出力のチャネル数など確実に多いにも関わらずです。しかし、variant.cppみればもっと沢山あることが判明。まずは9本あるデジタル入出力(アナログ入力)端子でPWM可能なもの1本増えました。
Wio(Arduino)端子 | PWM | 対応TIMER |
---|---|---|
D0(A0) | 可 | TC4_CH0 |
D1(A1) | 可 | TC4_CH1 |
D2(A2) | 可 | TC1_CH1 |
D3(A3) | 不可 | |
D4(A4) | 不可 | |
D5(A5) | 不可 | |
D6(A6) | 可 | TC0_CH0 |
D7(A7) | 不可 | |
D8(A8) | 可 | TC1_CH0 |
しかしこれだけではありません。だいたい、再度、疑問に思った原因の一つなのですが、Wio Terminalには
内蔵ブザー
があります。Seeed WikiのサンプルプログラムではPWMをつかわず、わざわざソフトウエアで波形を作って、いろいろな音色を奏でたりしているのです。しかし、パッシブなブザーを鳴らすのに常にソフトウエアで波形を作らねばならないように設計したとは思われませぬ。そう思ってvariant.cppをば見れば、ブザー制御端子、Arduino上の番号12番
PWMありーの、TCC0_CH4にアサイン
であります。よって12番端子にanalogWrite()すれば内蔵ブザー鳴りました。他にも内蔵LED端子、内蔵IRインタフェースなどなど、PWM機能がアサインされている端子が多数。grepでざっと数えたところ合計32本ありました。多くがハード制御用の端子ですが、ちゃんと使える、使われている。
3.3V駆動用のパッシブブザー回路を構成して動作確認
ソースコードの上だけで「動く」と思っていても「実は」ということが時々あるので、一応、実機で動作を確認しておくことにいたします。前回は5V電源用の(Seeeduino Lotus用の)Grove化されたPassive Buzzerモジュールを3.3V電源に接続したために「蚊の鳴くような」音でした。また昨日は、5V電源用のGroveモジュールを3.3V電源系のGroveコネクタに接続する「変換器」を作ったのですが、I2Cには効いてもPassive Buzzerへの適用には問題がありました。そのままにもしておけない(?)ので、3.3V電源でもちゃんと鳴る筈のPassiveブザー回路をブレッドボード上に構成してみました。
昨日見た通り、Seeeduino Lotus用のモジュールが直列の入力抵抗1kΩに加えて1kΩなどという抵抗値でプルダウンしているがために3.3V振幅の信号で問題が起きたのでした。どうせゲート電位を安定させるだけの意味であろうプルダウン抵抗をもっと大きくすればOKの筈。調べてみたらWio Terminalの回路では100kΩ使っていました。手元の部品箱の100kΩは表面実装部品(大量にある)でメンドイので、33kΩにしてみました。駆動用のMOSFETはこれまた大量にあり、別件で2.54mm端子にブレークアウト化したものが大量にあるBSS138を使用。ダイオードは適当な小信号用が見当たらなかったので、ちょっとデカイやつ。気持ちだけ。BUZZERは以前も使った、お楽しみの中華部品キットK4のもの。これを機に3.3V用のGroveキット化して半田付けしてしまうか。
ソフトの方は、D0からD8のデジタル端子のうち、PWM可能な端子ににPWM出力を断続垂れ流しです。比較のため、前回同様PWM不可のD3端子(Arduino UnoではPWMできる)にも出力。この状態で上のブレッドボードをWio Terminal裏面の拡張端子に接続してみます。予定された端子は全て「力強く」鳴りましたぞ。
しかしな、一つ疑問を剥ぐとまた次という感じ。タマネギ状態だな。