本HPにて、最初に使い始めたのがArduino UNOというマイコンボードでした(下図)。
ボード上に見えている28ピンDIPのLSIがATmega328P-PUというMCUです。最近見かけなくなったデュアルインラインパッケージ(DIP)の可愛いMCUです(下図、ラブリィ(1❤_❤))。
今でも、お気に入りのマイコンボードなので、MCUのパフォーマンスが足りる場合には、なるべくUNOを使いたいのですが、そうも行かないことが多くなっています。と言うのは、外部に接続するセンサなどのモジュールに3.3V定格の物が多くなってきたからです。UNOは5V定格なので、電圧レベルが合わず、直接接続できません(間にレベルシフタ(L/S)が必要)。
後から購入したArduino DUEやM5StickC Plus、ESP32ボード、Cmod A7ボード(FPGA)なども3.3V定格なので、UNOと接続して協調動作させようとしても、やはりL/Sの挿入を余儀なくされてしまいます。
そうなると、L/Sを挟んで外部回路を構築する手間を嫌って、結局、オーバスペックなDUE(3.3V定格)を使ってしまったりします。 「#28-4 バーコードリーダ」なんて、その最たるものでした。
今回のテーマは「ブレッドボード上に3.3V版UNOっぽい物を作る」ことです。
Arduino UNOに搭載されたMCUである、ATmega328というLSIから、おさらいして行きましょう。ATmega328は、基本的には5V定格のLSIです。データシートを見ると、以下図の様な推奨動作範囲が規定されています。
横軸に動作電圧[V]、縦軸に最大動作クロック周波数[MHz]を取って、推奨動作範囲を青線で囲んだグラフです。
この図を見ると、ATmega328を3.3Vで動作させることも可能だということです。ただし、5Vで駆動したUNOのように16MHzで動作させることは、青線の外側に外れてしまうため、保証範囲外です。逆に、UNOは5V @16MHzで駆動していますが、スペック(上図)では、最大で5V @20MHz動作させることができます。
上図より、3.3V(+マージン10%)で動作させる場合には、約11.5MHzまで周波数を落とす必要があることが判ります。
昔、手持ちのATmega328で確認したところ、駆動電圧3.3Vでも20MHz超で動作できる実力は有りました(下図)。
横軸に動作電圧[V]、縦軸に最大動作クロック周波数[MHz]を取って、328duinoによる実測データをオレンジ線で示したグラフです。
上図は、手持ちのATmega328(1個)による実測結果であり、実力値です。個体差の影響は無視しています。青線で囲まれた範囲が推奨動作条件なので、それを超えて使用する場合は各自の判断となり、無保証(保証範囲外、自己責任)です。
本HPでは、単体のLSIチップATmega328P-PUを購入してきてブレッドボード上に構築した、UNOっぽいマイコンボード、「328duino」が有りました(下図)。
この実現には、ATmega328と言うMCUチップが、DIP形状のLSIであることがとても重要なのです。上図に示した通り、ブレッドボードに実装して使うことができますから。
328duinoのバリエーションとして、ATmega328チップに内蔵されたRC発振器をクロックとして使った、328duino(第二形態)があります(下図)。
RC発振周波数は8MHzなので、前節でおさらいした様に、ATmega328の駆動電圧Vccを3.3Vまで落として使っても、スペック内です。ここから先は、328duino(第二形態)を3.3V駆動して、3.3V版のArduino UNOとして使えるように構築して行きたいと思います。
まずは、以下記事を参照して、328duino本体およびArduino IDE等、環境構築を済ませてから先へ進んでください。
「#9-5 ブレッドボードにArduinoっぽい物」
「#9-9 328duinoをArduino IDEに組み込む」
「UNOっぽい物」を3.3Vで動作させるためのハードウェア設計を進めます。
USBなどから給電して使う事を想定して、3.3Vより高い電圧(USB給電5V等を想定)から、3.3Vへ降圧できる降圧レギュレータと言う素子を使います。昔購入して、あまり使っていなかったLM1117-3.3(下図)を使います。
LM1117データシートで確認すると、ドロップアウト電圧Vdo=1.4V(MAX @800mA)なので、降圧後の出力電圧3.3Vを確保したい場合、3.3V+1.4V(Vdo)=4.7V以上の電圧を給電する必要があります。
USBのVBUS=5Vなので、USB給電を前提とする場合は、問題ありません。乾電池や充電池等からの給電も想定すると、電池の直列接続で4.7Vを超える電圧を作り出す必要があることに留意してください。
328duinoだと100mAも引かないハズなので、Vdo=1.2V(MAX @100mA)のスペックを適用できます。この場合、給電電圧は3.3V+1.2V(Vdo)=4.5V以上が必要です。1.5Vのアルカリ乾電池×3直列だとマージン無しのオンスペック、1.2Vの充電池×3直列だと3.6Vで不足、なので、×4直列以上で使うのが安心です。
※328duino以外に電流消費量の大きな負荷(モータなど)を接続して使う場合には、Vdo=1.4V(MAX @800mA)のスペックを満たす必要があります。入力可能な上限電圧Vin=15V(MAX)も、頭に入れて使いましょう。
降圧レギュレータで3.3V電圧を給電すること以外は328duino(第二形態)と同じですので、回路図は以下となります。
実際に170タイポイントミニブレッドボード上に実装した「UNO 3.3V化328duino」の外観図は以下の通りです。
※なお、本HPでは、170タイポイントのミニブレッドボード(1枚)へ、コンパクトに形成した328duinoアプリケーション回路を「○○化328duino」と呼んでいます。過去の「○○化328duino」に関しては、こちらの逆引き索引からご確認ください。
前節で設計した「UNO 3.3V化328duino」は、「UNOっぽい物」と言う事で、フォームファクタは兎も角、機能の面では以下の点がUNOと相違しています。
相違点の最後に挙げたUSB⇔UART変換について、少し補足しておきます。USB⇔UART変換モジュールを選ぶ場合の要件としては、以下の通りです。
本HPで使用している、FTDI社のチップを使ったUSB⇔UART変換モジュール(下図)には、上の要件が揃っています。
ただし、5V電源出力はサイドのスルーホールにしか引き出されていなかったので、今回、ピンソケットをはんだ付けして引き出しました(下図)。
L型ピンヘッダに引き出されているVCC端子は、電圧ジャンパの設定に従って、VCC=3.3V/5Vに切り替わってしまうため、不相応です。固定の5V電源出力を引き出して、以下表の様に接続してください。
UNO 3.3V化328duino | 接続 |
USB⇔UART変換 モジュール(FTDI等) |
Vcc | ← | 5V |
GND | ⇔ | GND |
RXI | ← | TX |
TDO | → | RX |
DTR | ← | DTR |
※FTDIの電圧ジャンパは3.3V側。
お手持ちのUSB⇔UART変換モジュールから5V電源を給電できない場合には、別途、降圧レギュレータ(LM1117-3.3)用の電源を確保する必要があります。
今回は、「UNOっぽい機体を3.3V定格で使えるようになったよ」って事だけで、特に大きな違いは無いので、実験は省略しようかと思ったのですが、3.3V定格のOLEDディスプレイを接続して表示させてみることにしました。外部に追加すべき回路図を以下に示します。
※「D4」は、328duinoの「〜_D4」端子と接続します。A4,A5も同様です。
気温・湿度センサDHT11も繋いで、OLEDディスプレイに気温・湿度を表示する温度計に、してみました。こちらの「UNO 3.3V化328duino」へ接続してくたさい。なお、入力電源電圧VccはOLEDディスプレイにも接続するので、上限はVcc≦6Vです(※)。
※OLEDディスプレイに搭載されたレギュレータチップの正確な型番が判らないのですが(検索して見つけた回路図中の記号662Kより、XC6206または互換品等を推定)、Vccの下限電圧は少なくとも4V以上が必要であると思われます。一応念押ししておきますが、レギュレータで3.3Vに降圧されているので、I2C端子(SCL,SDA)は、3.3V定格です。
以下に実験中の様子を示します。
全て3.3V定格に揃い、レベルシフタ(L/S)が必要なくなったお陰で部品数も少なく、コンパクトにまとまりました。……ちょっと、ジャンパ線がごちゃごちゃして見えますが、そいつは、ただの配線ですから……。
順番が逆になりましたが、328duinoで実行するプログラムを以下にリンクしておきます。
プログラム:i2c_tmphum.ino
「#25-9 I2C温度・湿度センサ化328duino」、「#25-10 I2C温度・湿度センサ化328duino(ii)」の記事で作成した、「I2C温度・湿度センサ化328duino」のプログラムに、OLEDディスプレイを制御するオプションを追加しました。プログラム先頭付近、以下の#defineを有効化すると、起動後OLEDディスプレイ表示が有効化した状態で動作開始します。
#define OLED_ENB
Arduino IDEで「ツールメニュー ⇒ 328duino ⇒ プロセッサ:ATmega328P (RC 8MHz)」を選択し、コンパイル&書き込んでください。デフォルトではOLED_ENBマクロを無効化してあって、その状態だと、以下に示すシリアルモニタコマンドで有効化する必要が生じます。
USB⇔UART変換モジュールを接続してシリアルモニタが使用可能な状態になっていると、シリアルモニタから、こちらのコマンドに加えて、以下のコマンドを受け付けています。
以下動画の様に、コンパイルオプション(#define OLED_ENB)によって、独立動作でOLED表示付きの温度計になります。
動画では、USB⇔UART変換モジュールは接続せず、充電池(1.2V)×4直列の電池ボックスから給電しています。
Arduino UNOを使い始めた当初は、逆に「5V定格が使い易くて良いな〜」と思っていました。最近では、3.3V定格のモジュールやマイコンボードを多数入手して使っているため、UNOを使おうとして「あっ、UNOは5V定格か。直結できないじゃ〜ん」というケースが増えていました。その様な状況が、3.3V版UNOとして使用できる328duinoによって緩和されると良いな〜。