ATmega328Pの基本: Arduinoなしで始める方法

Ari Mahpour
|  投稿日 2024/05/29, 水曜日
ATmega328Pの基本:Arduinoなしで始める方法

Arduino Unoボードをかなりの期間使用してきましたが、多くの記事の例としても使用しています。古いUnoボードに使用されている元のチップであるATmega328Pを、完全に独立して動作させるにはどうすればよいか、いつも疑問に思っていました。Arduinoがそのブートローダー、使いやすいGUIソフトウェア、C++の抽象化を通じてアクセスしやすくしているので、なぜこの試みをしたいのか不思議に思うかもしれません。しかし、時には、他人が行ったことを評価するためには、自分でやってみることが重要です。このプロジェクトは、Arduinoの開発者がどれほど多くの作業を行い、そのフレンドリーな製品で世界を変えたかを本当に示してくれました。

この記事では、外部電源とAtmel-ICEプログラマのみを使用して、チップを完全に独立して起動する方法を説明します。オンボードのシリアルインターフェースを介してチップと通信する方法と、LEDを1つまたは2つ点滅させる方法をデモンストレーションします。

環境設定

ATmega328Pを設定する方法はいくつかあります。タイトルからもわかるように、意図的にカバーされていない方法の1つは、ATmega328PチップをArduino Unoに挿入してプログラミングし、その後ブレッドボードに移動させる方法です。フォーラムのフィードバックに基づき、一部の人々はArduinoのプロセスをスキップして、MicrochipのAtmel-ICEなどのプログラマーを使用したより伝統的なアプローチを使用したいと考えています。Microchip(旧Atmel)マイクロプロセッサを始める最も簡単な方法は、Microchip Studioをインストールすることです。この記事を書いている時点で、Microchip StudioスイートのフルバージョンはWindowsでのみサポートされています。CI(継続的インテグレーション)でビルド環境をすべて実行したいと考えているため、代替のアプローチを選択しました。

C言語に対する最も人気のあるコンパイラの1つにGNU Compiler Collection(GCC)があります。これは特定のプラットフォームとアーキテクチャをコンパイルしますが、AVR(ATmega)ファミリーのチップには対応していません。しかし、AVRおよび他のMicrochipファミリー用のコンパイラセットが彼らのウェブサイトにホストされています。幸いなことに、親切な人々がこれらのコンパイラをDebianパッケージにまとめ、DebianやUbuntuで簡単にインストールできるようにしてくれました:

$ apt-get install gcc-avr binutils-avr avr-libc avrdude

これらのツールをインストールしたので、Atmel-ICEプログラマと外部電源(5Vに設定)のみを使用してATmega328Pをコンパイルおよびプログラムすることができます。AVR版のGCCを使用してコードをコンパイルし、AVRDUDEを使用してATmega328Pチップにフラッシュします。

プロジェクト

このプロジェクトの目標は、ATmega328Pの基本的だが機能的な能力をいくつか示すことでした。外部の点滅するLEDといくつかのシリアルコマンドの往復だけで、このチップが独立して立つことができることを証明するために必要なすべてでした。プロジェクトのリポジトリでは、ソースコード(「src」と名付けられています)に加えて、このプロジェクトの開発を支援するいくつかのフォルダを作成しました。

ソフトウェア開発(ハードウェアに搭載されるソフトウェアも含む)において重要な要素の一つがユニットテストです。ユニットテストは、より大きなシステムの機能や部品が期待通りに動作していることを検証します。誰かがその機能の一部を変更した場合、ユニットテストによって回帰(つまり、新しい機能を導入することで他の何かを誤って壊してしまうこと)を防ぐことができます。この例では、ハードウェアをモックアウトし、シリアル通信ライブラリ(USART)の初期化スキームを実行する基本的なユニットテストを書いています。

ユニットテスト(「tests」フォルダに位置しています)に加えて、「hil」というフォルダもあります。これはHardware in the Loopの略です。このフォルダには、実際のハードウェアをループ内でテストを実行するために必要なスクリプトが含まれています(私の以前の記事で多く議論されています)。これにより、私のコードが仮想世界(モックを使用して)だけでなく、実際のハードウェアでテストを実行することによって現実世界でも機能することを保証します。

README.mdを参照すると、Atmel-ICEプログラマをATmega328Pチップに接続するためのピンアウト図が提供されます:

Atmel ICEのピンアウト

図1: Atmel ICEのピンアウト

いくつかのLEDを追加し、シリアル通信ポートをRaspberry Piに接続し、Raspberry Piの+5Vラインを拾うことで、準備が整った完全な組み立てができます:

Raspberry Piブレイクアウトボード

図2: Raspberry PiとAtmel-ICEプログラマを使用したATmega328Pのブレイクアウトボード

テスト、コンパイル、そしてさらなるテスト

新しい機能を開発する際には、Makefileを使用してユニットテストを実行し、コードをコンパイルします。望むコードが意図した通りに動作することを(ユニットテストの検証を通じて)確認した後、バイナリをビルドし、Makefileを介してデバイスにフラッシュし、Raspberry Piのシリアル通信ポートを使用してHardware in the Loop(HIL)テストを実行します。

最も重要な部分の一つは、内部8MHzクロックを有効にするためにフューズビットを正しくフラッシュすることです。これはREADMEに記載されていますが、Makefileのフラッシュコマンドにも追加されています:

avrdude -c atmelice_isp -p m328p -B 32 -U lfuse:w:0xe2:m

その後、オンボードクロックが8 MHzで動作するという前提で(main.cの上部で定義されているように)、チップのシリアルインターフェースを使用できるようになります。ここから、追加のシリアルコマンドのサポート、外部コンポーネントやセンサーへのインターフェース、そしてこの楽しい小さなマイクロコントローラーで考えられるあらゆる機能を追加できるはずです。

結論

この記事では、オリジナルのArduino UnoやMicrochipの評価ボードで一般的に見られる外部回路なしでATmega328Pチップを使い始める方法を学びました。ユニットテスト、バイナリビルド、チップのフラッシング、ハードウェアインザループテストの実行という概念を理解しました。さらに、内部クロックを8 MHzに設定するためにプログラムするフューズビットについて、よく見落とされがちな重要な詳細がありました。この時点で、追加のユニットおよびHILテストでさらに機能を追加し、Atmel-ICEプログラマーと外部の5V電源だけで全てを実行できるようになるはずです。簡単にするために、Raspberry Piを電源およびシリアル通信機能のために使用することが、プロセスをエンドツーエンドで制御する最も簡単な方法です。

プロジェクトのソースコードはこちらで見つけることができます:https://gitlab.com/embedded-designs/atmega328p-serial-led-control

筆者について

筆者について

Ariは、設計、デバイスパッケージ、テスト、および電気、機械、およびソフトウェアシステムの統合において幅広い経験を持つエンジニアです。彼は、設計/デザイン、検証、テストのエンジニアをまとめて団結したグループとして機能させることに情熱を注いでいます。

関連リソース

関連する技術文書

ホームに戻る
Thank you, you are now subscribed to updates.