しなぷすのハード製作記

Arduinoで作った回路の小型化(Arduino互換機の製作)(9)

ツイート
シェア
このエントリーをはてなブックマークに追加
フォロー
目次へ  前のページへ (1) (2) (3) (4) (5) (6) (7) (8) (9) 次のページへ
2017年04月13日 公開。

10.ブートローダを使ってUARTからスケッチを書き込む

10-1.UART経由でスケッチを書き込むArduino互換機について

Arduino Unoなどでは、USBケーブルを接続する事で、直接パソコンからスケッチを書き込める様になっています。これは、次の様な仕組みで実現しています。

Arduino Unoに使われているATmega328Pというマイコンは、USBに直接接続する事ができません。そこでUSBの信号を、Arduino Unoに内蔵されているUSBシリアル変換回路を通して、調歩同期のシリアル信号に変換します。この信号は、ATmega328Pに内蔵されているUART(調歩同期でシリアル通信をする回路)につながっています。(図78参照)

図78、パソコンとArduino Uno内のATmega328Pの通信の仕組み
↑ 画像をクリックすると拡大
図78、パソコンとArduino Uno内のATmega328Pの通信の仕組み

また、マイコンにあらかじめブートローダというプログラムを書き込んでおくことにより、UART経由でスケッチを書き込める様になっています。ブートローダは、UART経由で送られてきたスケッチの情報を、フラッシュメモリに書き込む働きをします。(ブートローダの働きの詳細については、Arduinoのブートローダって何?の記事に説明があります)

この様に、パソコンから来たUSBの信号を、USBシリアル変換回路で調歩同期のシリアル信号に変換し、UARTからスケッチの情報を取り込む仕組みになっています。

この章では、Arduino Unoと同様に、UART経由でスケッチを書き込む方式のArduino互換機の作り方を説明します。このタイプのArduino互換機は、スケッチの書き込み方法が純正のArduinoと同じなので、書き込みの際のArduino IDEの操作が純正のArduinoと同じとなり、またスケッチの書き込みのたびにマイコンを基板から外さなくてもいいというメリットがあります。さらに、後述する様に、printデバッグが行え、スケッチのデバッグがやりやすくなるメリットもあります。

ただし、USBシリアル変換回路をArduino互換機に内蔵すると、Arduino互換機が大型化したり、コストが増えたり、表面実装部品を半田付けしなければならないなどの問題が生じますので、その部分だけは、既製のUSBシリアル変換器(USBシリアル変換回路のみをモジュール化した物)を利用する事にします。(写真57参照)

参考:USBシリアル変換器は、複数のArduino互換機で共有できますので、それぞれのArduino互換機にUSBシリアル変換回路を搭載する場合に比べて、外付けのUSBシリアル変換器を利用する場合の方が、コストが下がります。

写真57、USBシリアル変換器の例
↑ 画像をクリックすると拡大
写真57、USBシリアル変換器の例
Arduino関連で使われるUSBシリアル変換器は、SparkFun社のFTDI BASICが代表的です。色々な会社から、FTDI BASICの互換品が出ています。この写真に写っているのは、スイッチサイエンスFTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き)です。
広告

10-2.UART経由でスケッチを書き込むArduino互換機の基本回路

UART経由でスケッチを書き込むArduino互換機の基本回路の回路図を図79に示します。

図79、UART経由でスケッチを書き込むArduino互換機の基本回路
↑ 画像をクリックするとPDFファイルで表示
図79、UART経由でスケッチを書き込むArduino互換機の基本回路

X1の水晶振動子は8MHzまたは16MHzの物をお使いください。

水晶振動子とC1、C2をセラミック発振子(セラロック)に置き換える事は可能ですが、内蔵CR発振器を使うのはお勧めできません。というのは、内蔵CR発振器の周波数精度は10%程度しかなく、UARTの通信に必要な2%程度の精度を確保できないためです。

CN1が、USBシリアル変換器を接続するヘッダです。USBシリアル変換器側の信号名とArduino互換機側の信号名の対応表を表5に示します。

表5、USBシリアル変換器側の信号名とArduino互換機側の信号名の対応
USBシリアル変換器側
の信号名
Arduino互換機側
の信号名
GND GND
CTS GND
VCC(5V,3.3V) VCC
TX(TXD,TXO) RXD
RX(RXD,RXI) TXD
DTR RESET

注:USBシリアル変換器の種類によって、信号名の表記が若干違うので、複数の信号名を併記しました。

表5において、USBシリアル変換器側のTX(TXD,TXO)がArduino互換機側のRXDに対応しており、USBシリアル変換器側のRX(RXD,RXI)がArduino互換機側のTXDに対応している点に注意してください。TXあるいはTXDは、送信信号を意味します。RXあるいはRXDは受信信号を意味します。USBシリアル変換器側の送信信号線は、Arduino互換機側では受信信号線になります。そのため、TXD同士を接続するのではなく、一方のTXDを他方のRXDに接続するのが正しい方法です。(詳しい説明は「UART」の解説をご覧ください) 時々「TXDとRXDをつなぐのはおかしいのではないか」と質問のメールをいただく事があるのですが、TXDとRXDを接続するのはこういう意味です。

なお、スケッチの書き込みに使えるUSBシリアル変換器の代表的な物を表6に示します。AmazonでFTDI BASICで検索すれば、この表に示した以外にも、多数の安価な互換品がヒットします。コストを抑えたい場合は、ご自分で探してみてください。

表6、スケッチの書き込みに使えるUSBシリアル変換器の例
製品名 メーカー
Arduino FTDI Basic Breakout-5V SparkFun
Arduino FTDI Basic Breakout-3.3V SparkFun
FTDI USBシリアル変換アダプター(5V/3.3V切り替え機能付き) スイッチサイエンス
FTDI USBシリアル変換アダプター Rev.2 スイッチサイエンス

USBシリアル変換器には、電源電圧(および信号電圧)が5Vの製品と、3.3Vの製品があります。3.3Vの製品を使う場合は、Arduino互換機の水晶振動子の周波数が8MHzでなければならない点に注意が必要です。(5Vの製品なら、8MHzでも16MHzでもかまいません) スイッチサイエンス製のUSBシリアル変換器の場合は、3.3Vと5Vの切り替えを、ジャンパーピンの設定で切り替えられる様になっているので、便利です。価格の点からも、SparkFun製よりもスイッチサイエンス製の方が安くなっています。

10-3.UART経由でスケッチを書き込む電子サイコロの製作

図79のArduino互換機に、LEDやタクトスイッチを付けて、電子サイコロにした回路が図80です。

図80、UART経由でスケッチを書き込む電子サイコロの回路図
↑ 画像をクリックするとPDFファイルで表示
図80、UART経由でスケッチを書き込む電子サイコロの回路図

この回路をユニバーサル基板を使って組み立てた基板の写真を、写真58と写真59に示します。また、CN1(写真58左上の6ピンのヘッダ)の拡大写真を写真60に示します。

写真58、UARTでスケッチを書き込む電子サイコロ(表)
↑ 画像をクリックすると拡大
写真58、UARTでスケッチを書き込む電子サイコロ(表)
写真59、UARTでスケッチを書き込む電子サイコロ(裏)
↑ 画像をクリックすると拡大
写真59、UARTでスケッチを書き込む電子サイコロ(裏)
写真60、CN1の拡大写真
↑ 画像をクリックすると拡大
写真60、CN1の拡大写真

水晶振動子は、8MHzの物でも16MHzの物でもいいのですが、写真の基板では16MHzの水晶振動子を実装しています。

またマイコンは、ATmega168PでもATmega328Pでもいいのですが(水晶振動子が8MHzならATmega88Vでもいい)、写真の基板ではATmega328Pを実装しています。

このマイコンにはブートローダをあらかじめ書き込んでおく必要があります。ブートローダの書き込みにはArduino用ブートローダ/スケッチライタやArduino Uno用ブートローダライタシールドなどの書き込み器が必要になりますが、あらかじめArduino Unoのブートローダを書き込んだATmega328Pも市販されているので、それを使うと、書き込み器は不要になります。

注:Arduino Unoのブートローダを書き込んだATmega328Pを使う場合は、水晶振動子の周波数は16MHzでなければいけません。

自分でブートローダを書き込む場合は、書き込み方がATmega88/88V/168P/328PにArduinoのブートローダを書き込む(2)の記事に載っていますので、そちらを参照してください。

Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 2200円
販売店 スイッチサイエンス 妙楽堂
サポートページ
Arduino用ブートローダ/スケッチライタ(完成品) 商品名 Arduino用ブートローダ/スケッチライタ(完成品)
税抜き小売価格 3000円
販売店 スイッチサイエンス
サポートページ
Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1200円
販売店 スイッチサイエンス
サポートページ

10-4.UART経由でスケッチを書き込む方法

Arduino互換マイコンにUART経由でスケッチを書き込む方法を説明します。次の手順に従って書き込んでください。

【手順1】CN1にUSBシリアル変換器を接続し、さらにUSBケーブルでパソコンに接続する

写真61の様に、CN1にUSBシリアル変換器を接続し、さらにUSBケーブルでパソコンに接続してください。

写真61、USBシリアル変換器とUSBケーブルの接続
↑ 画像をクリックすると拡大
写真61、USBシリアル変換器とUSBケーブルの接続
 【手順2】Arduino IDEを起動し、マイコンの種類とクロック周波数を設定する

Arduino IDE 1.0.Xを使用している場合は、図81の様に、ツール→マイコンボードメニューから、使用しているマイコンの種類とクロック周波数の組み合わせを選びます。

図81、マイコンの種類とクロック周波数の選択(Arduino IDE 1.0.Xの場合)
図81、マイコンの種類とクロック周波数の選択(Arduino IDE 1.0.Xの場合)

注:図81ではATmega328P(16MHz/X'tal)を選んでいますが、実際にはご自分のArduino互換機の仕様に合わせて選んでください。

Arduino IDE 1.6.X、1.7.X、または1.8.Xを使用している場合は、まず図82の様に、ツール→ボードメニューでマイコンの種類を選び、次に図83の様に、ツール→Clockメニューでクロック周波数を選んでください。

図82、マイコンの種類の選択(Arduino IDE 1.6.X、1.7.Xまたは1.8.Xの場合)
図82、マイコンの種類の選択(Arduino IDE 1.6.X、1.7.Xまたは1.8.Xの場合)

注:図82の例ではATmega328Pを選んでいますが、実際には自分のArduino互換機の仕様に合わせて選んでください。

図83、クロック周波数の選択(Arduino IDE 1.6.X、1.7.Xまたは1.8.Xの場合)
図83、クロック周波数の選択(Arduino IDE 1.6.X、1.7.Xまたは1.8.Xの場合)

注:図83の例では16MHz/X'talを選んでいますが、実際には自分のArduino互換機の仕様に合わせて選んでください。

【手順3】USBシリアル変換器のつながっているシリアルポートを選択する

図84の様に、ツール→シリアルポートメニュー(またはツール→ポートメニュー)で、USBシリアル変換器のつながっているシリアルポートを選択してください。

図84、シリアルポートの選択
図84、シリアルポートの選択

注:図83ではCOM3を選んでいますが、実際には自分の環境に合わせて選んでください。

【手順4】書き込みたいスケッチを開く

書き込みたいスケッチのファイルを開いてください。(図80の電子サイコロの場合は、リスト1のスケッチを開いてください)

図85、書き込みたいスケッチを開く
図85、書き込みたいスケッチを開く
【手順5】スケッチを書き込む

図86の様に、右矢印のボタンをクリックして、スケッチを書き込んでください。

図86、右矢印ボタンをクリックしてスケッチを書き込む
図86、右矢印ボタンをクリックしてスケッチを書き込む

スケッチの書き込みが終わると、図87の様に、書き込み完了のメッセージが表示されます。

図87、スケッチ書き込み完了のメッセージ
図87、スケッチ書き込み完了のメッセージ

以上で、スケッチの書き込みは完了します。スケッチを修正した場合は、もう一度右矢印ボタンをクリックして書き込みなおしてください。

10-5.printデバッグの方法

UART経由でスケッチを書き込むArduino互換機の場合、Serial.print関数(またはSerial.println関数)を使う事で、UART経由でパソコンにメッセージを送る事ができます。この事を利用して、例えば変数の値をパソコンで監視するなど、スケッチのデバッグに役立てる事ができます。この様なデバッグの方法をprintデバッグと呼びます。

例えば、リスト3のスケッチを用いると、パソコンで変数cntの値を監視することができます。

リスト3、変数cntの値をパソコンで監視するスケッチ
int cnt;
void setup()
{
  Serial.begin(9600); // UARTの通信速度を9600bpsに設定して初期化
  cnt=0; // 変数cntを0に初期化
} // setup

void loop()
{
  cnt++; // 変数cntに1を足す
  Serial.println(cnt); // パソコンに変数cntの値を送信
  delay(1000); // 1秒待つ
} // loop

このスケッチは、int型の変数cntsetup関数の中で0に初期化し、loop関数が呼び出されるたびにcntの値を1ずつ増やしていく物ですが、Loop関数に

  Serial.println(cnt); // パソコンに変数cntの値を送信

の1行が入っているために、cntの値を増やした直後に、その値をUART経由で送信します。そのため、実行すると、一秒間隔で1、2、3、…と送信していきます。

実際にこのスケッチを実行してcntの値をパソコンで見るには、前節で説明した方法でリスト3のスケッチをArduino互換機に書き込んだ後、図88の様にツール→シリアルモニタメニューを選び、シリアルモニタを起動します。

図88、シリアルモニタの起動
図88、シリアルモニタの起動

起動したシリアルモニタの右下の部分で、図89の様に通信速度を9600bpsに選択すれば、図90の様に、1、2、3、…と1秒ごとに数字が表示されます。

図89、通信速度の設定
図89、通信速度の設定
図90、シリアルモニタに表示された変数cntの値
図90、シリアルモニタに表示された変数cntの値

この例では変数の値を観察しましたが、適切なメッセージを送るSerial.print関数をスケッチに埋め込んでおくことで、スケッチのどの部分まで処理が進んだかや、if文の条件が成立したかどうかなど、色々な事を調べる事ができます。

デバッグが終わればSerial.print関数を削除してもいいですし、そのまま放置しても、処理が少し遅くなり、スケッチが少し大きくなる程度で、大きな弊害はありません。

この様に、printデバッグが可能という点で、UART経由でスケッチを書き込む方法は、他のスケッチ書き込み法よりも優れています。

10-6.UARTを使用するプロジェクトを開発する場合の注意点

図79のArduino互換機では、UARTをスケッチの書き込みに使っていますが、場合によっては、UARTをセンサからの信号の読み込みなど、他の用途に使いたい場合もあると思います。その場合、スケッチの書き込み時にはUARTをUSBシリアル変換器につなげ、スケッチの実行時にはセンサなどにつなげる必要があります。(当然、このようにすると、printデバッグはできなくなる事に注意が必要です)

そのためには、UARTの接続先を切り替えるスイッチを設ける必要があります。図91に、そのスイッチの接続図を示します。

図91、UARTをセンサ等との通信に利用する場合のUARTの切り替えスイッチの接続
↑ 画像をクリックすると拡大
図91、UARTをセンサ等との通信に利用する場合のUARTの切り替えスイッチの接続

スケッチを書き込む際にはスイッチをOFFにして、UARTのRXD信号を、USBシリアル変換器に、1kΩの抵抗を介してつなぎます。

スケッチを実行する際にはスイッチをONにして、UARTのRXD信号を、センサなどにつなぎます。

この回路構成では、UARTのTXD信号は常にUSBシリアル変換器につながっていますから、スケッチ実行時にシリアルモニタを起動すると、センサに送っている信号をモニタできる事になります。(ただし、バイナリデータを送っている場合は、文字化けすると思いますが)

次回は、必要なI/Oピンが少ないプロジェクトの場合に、8ピンや14ピンのAVRマイコンを使う事により、さらに回路を小型化する方法について説明する予定です。続きを書くのはぼちぼちと。

ツイート
シェア
このエントリーをはてなブックマークに追加
フォロー
目次へ  前のページへ (1) (2) (3) (4) (5) (6) (7) (8) (9) 次のページへ

このページで使われている用語の解説

関連ページ

関連製品

Arduino Uno用ブートローダスケッチライタシールドキット 商品名 Arduino Uno用ブートローダスケッチライタシールドキット
税抜き小売価格 1200円
販売店 スイッチサイエンス
サポートページ
Arduino用ブートローダ/スケッチライタキット 商品名 Arduino用ブートローダ/スケッチライタキット
税抜き小売価格 2200円
販売店 スイッチサイエンス 妙楽堂
サポートページ
Arduino用ブートローダ/スケッチライタ(完成品) 商品名 Arduino用ブートローダ/スケッチライタ(完成品)
税抜き小売価格 3000円
販売店 スイッチサイエンス
サポートページ
このサイトの記事が本になりました。
書名:Arduino 電子工作
ISBN:978-4-7775-1941-5
工学社の書籍の内容の紹介ページ
本のカバーの写真か書名をクリックすると、Amazonの書籍購入ページに移動します。
こちらのページもおすすめです。
サイトマッププライバシーポリシーお問い合わせ用語集
しなぷすのハード製作記