公開日:2024/02/03
title.png

28th Season


#28-10 UNO 3.3V化328duino

 本HPにて、最初に使い始めたのがArduino UNOというマイコンボードでした(下図)。

ar2_uno.jpg

 ボード上に見えている28ピンDIPのLSIがATmega328P-PUというMCUです。最近見かけなくなったデュアルインラインパッケージ(DIP)の可愛いMCUです(下図、ラブリィ(1❤_❤))。

ar94_atmega328p.jpg

 今でも、お気に入りのマイコンボードなので、MCUのパフォーマンスが足りる場合には、なるべくUNOを使いたいのですが、そうも行かないことが多くなっています。と言うのは、外部に接続するセンサなどのモジュールに3.3V定格の物が多くなってきたからです。UNOは5V定格なので、電圧レベルが合わず、直接接続できません(間にレベルシフタ(L/S)が必要)。
 後から購入したArduino DUEM5StickC PlusESP32ボードCmod A7ボード(FPGA)なども3.3V定格なので、UNOと接続して協調動作させようとしても、やはりL/Sの挿入を余儀なくされてしまいます。
 そうなると、L/Sを挟んで外部回路を構築する手間を嫌って、結局、オーバスペックなDUE(3.3V定格)を使ってしまったりします。 「#28-4 バーコードリーダ」なんて、その最たるものでした。

 今回のテーマは「ブレッドボード上に3.3V版UNOっぽい物を作る」ことです。

ATmega328 MCU

 Arduino UNOに搭載されたMCUである、ATmega328というLSIから、おさらいして行きましょう。ATmega328は、基本的には5V定格のLSIです。データシートを見ると、以下図の様な推奨動作範囲が規定されています。

ar5a_fmax.png

 横軸に動作電圧[V]、縦軸に最大動作クロック周波数[MHz]を取って、推奨動作範囲を青線で囲んだグラフです。
 この図を見ると、ATmega328を3.3Vで動作させることも可能だということです。ただし、5Vで駆動したUNOのように16MHzで動作させることは、青線の外側に外れてしまうため、保証範囲外です。逆に、UNOは5V @16MHzで駆動していますが、スペック(上図)では、最大で5V @20MHz動作させることができます。

 上図より、3.3V(+マージン10%)で動作させる場合には、約11.5MHzまで周波数を落とす必要があることが判ります。


 昔、手持ちのATmega328で確認したところ、駆動電圧3.3Vでも20MHz超で動作できる実力は有りました(下図)。

a105_vccmin.png

 横軸に動作電圧[V]、縦軸に最大動作クロック周波数[MHz]を取って、328duinoによる実測データをオレンジ線で示したグラフです。
 上図は、手持ちのATmega328(1個)による実測結果であり、実力値です。個体差の影響は無視しています。青線で囲まれた範囲が推奨動作条件なので、それを超えて使用する場合は各自の判断となり、無保証(保証範囲外、自己責任)です。

328duino

 本HPでは、単体のLSIチップATmega328P-PUを購入してきてブレッドボード上に構築した、UNOっぽいマイコンボード、「328duino」が有りました(下図)。

ar95_328duino_1.jpg

 この実現には、ATmega328と言うMCUチップが、DIP形状のLSIであることがとても重要なのです。上図に示した通り、ブレッドボードに実装して使うことができますから。

 328duinoのバリエーションとして、ATmega328チップに内蔵されたRC発振器をクロックとして使った、328duino(第二形態)があります(下図)。

ar95_328duino_2.jpg

 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(下図)を使います。

a145_lm1117.jpg

 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(第二形態)と同じですので、回路図は以下となります。

a28a_schem.png


 実際に170タイポイントミニブレッドボード上に実装した「UNO 3.3V化328duino」の外観図は以下の通りです。

a28a_328d_u3v3.jpg

※なお、本HPでは、170タイポイントのミニブレッドボード(1枚)へ、コンパクトに形成した328duinoアプリケーション回路を「○○化328duino」と呼んでいます。過去の「○○化328duino」に関しては、こちらの逆引き索引からご確認ください。

UNOとの相違点

 前節で設計した「UNO 3.3V化328duino」は、「UNOっぽい物」と言う事で、フォームファクタは兎も角、機能の面では以下の点がUNOと相違しています。

 相違点の最後に挙げたUSB⇔UART変換について、少し補足しておきます。USB⇔UART変換モジュールを選ぶ場合の要件としては、以下の通りです。

 本HPで使用している、FTDI社のチップを使ったUSB⇔UART変換モジュール(下図)には、上の要件が揃っています。

ar41_ftdi.jpg

 ただし、5V電源出力はサイドのスルーホールにしか引き出されていなかったので、今回、ピンソケットを半田付けして引き出しました(下図)。

a28a_ftdisock.jpg

 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ディスプレイを接続して表示させてみることにしました。外部に追加すべき回路図を以下に示します。

a28a_schem2.png

※「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定格です。


 以下に実験中の様子を示します。

a28a_expr.jpg

 全て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によって緩和されると良いな〜。


btn_arduino.png

btn_prev.png btn_next.png

home