Arduino BOB活用によるセンサやペリフェラルの迅速な評価
DigiKeyの北米担当編集者の提供
2019-10-30
モノのインターネット(IoT)の登場は、次に大注目されるものをつなげようとする多くの革新的な新興企業の意欲を刺激してきました。しかし、そのような新興企業の多くには小規模に切り詰められた設計チームしかなく、一方で市場投入までの厳しいスケジュールに迫られている現実もあります。結果的に、個々の設計者はアナログ、デジタル、無線周波数(RF)、ワイヤレス/有線ネットワークなど、さまざまな設計分野で作業を掛け持ちすることになります。そのため自ずと、IC、センサ、ペリフェラルの評価をどうしたら迅速化できるか、またそのコストをどのように削減できるかを常に模索しています。
1つの選択肢は、ICベンダーが提供する評価/開発キットを使用して、各自のソリューションを堅持することです。サポートをしっかり受けられれば、この方法は完璧に通用するでしょう。一方、もう1つのオプションは、Arduinoのエコシステムを検討してみることです。Arduinoは、趣味として楽しむシステムから、本格的な設計/サポートのエコシステムに進化しました。
この記事では、設計者がArduinoを使用して、設計サイクルの早い段階でIC、ペリフェラル、およびセンサの評価を開始する方法をご紹介します。そこで使用するのが、センサおよびペリフェラルのブレイクアウトボード(BOB)といったオープンソースハードウェア、そしてライブラリやサンプルプログラムといったオープンソースソフトウェアの組み合わせです。例として、Maxim Integratedのリアルタイムクロック(RTC)、およびAdafruit IndustriesのBOBを使用します。
IoTの出現
IoTの最初の実例の1つに、1980年代初頭にカーネギーメロン大学でCoca-Cola自動販売機が接続されたケースがあります。プログラマはインターネットを駆使して、自販機のドリンクが空でないか、冷えているかを実際に自販機に赴く前に確認できるようになりました。概念としてIoTと名付けられたのは、1999年になってからです。
IoTが本格的に登場した正確な時期については、今も議論の的です。おそらく、私たちが知っているIoTが生まれた瞬間の最も相応しい定義は、「人よりも多くの「モノ」または「オブジェクト」がインターネットに接続された時点」ではないでしょうか。それを踏まえると、IoTが誕生したのは2008年から2009年の間の時期で、モノ/人の比率の推移を見ると2003年の0.08から2010年には1.84に増加しています。
Arduinoの出現
IoTの胎動は、2000年代初旬から顕著になったメイカームーブメントと一致しています。Arduinoが最初に世界規模で展開されたのは2005年で、Make誌が創刊された年でもあり、最初のMaker Faire(メイカーフェア)が開催されたわずか1年前です。
Arduinoは登場以来、高度なオープンソースソフトウェアおよびハードウェアのエコシステムを進化させてきました。求められたのは、サポートの行き届いたArduinoのエコシステムを専門的な設計者の領域にもたらし、設計者の仕事を簡素化して市場投入までの時間を短縮することでした。
実際、ソリューションは有機的に浸透し始めました。Arduinoを中心に広がった大きなエコシステムは、予期しない副産物として、専門的な設計者がArduinoを使用してセンサやペリフェラルを各自の設計に展開する前に評価する、という状況を生み出しています。その中にはRTCなど多くの例が見られます。
RTCを使用したペリフェラル評価の例
ほぼすべての最新32ビットマイクロコントローラには、多くの16ビット/8ビットマイクロコントローラと同様に、RTCが組み込まれています。これにより、基板の面積が縮小されて部品点数(BOM)も減り、最終製品のコストが低下しますが、内蔵RTCを使用する場合には短所もあります。
短所の1つは、マイクロコントローラの内部RTCをソフトウェア制御で有効または無効にする必要がある点です。そのため、電源障害など何らかの不測の事態が発生し、マイクロコントローラがフリーズしたりコードが迷走したりする場合、RTCが誤って無効になる可能性があります。これに対して、外付けのRTCはより安定度が高いと考えられます。なぜなら、独立した電源レールと水晶振動子があり、マイクロコントローラで実行するコードにより誤ってオフになる可能性が低くなるからです。さらに外付けRTCでは多くの場合、マイクロコントローラよりも大きなチップ製造プロセスノードを使用して実装され、シリコンフットプリントが大きいため、ビットフリップ、つまり宇宙線などの放射線によるシングルイベントアップセット(SEU)の影響をあまり受けなくなります。
RTC ICの例:Maxim Integrated DS1307およびDS3231
広く使われている2種類のRTC ICに、Maxim IntegratedのDS1307およびDS3231があります。両方のデバイスとも、秒、分、時間、日、日付、月、年の情報を追跡し、31日間未満の月を自動で調整し、うるう年にも対応します。24時間または12時間モードがサポートされます。また、両デバイスともシリアルI2Cバスを介してホストマイクロコントローラと通信し、センス回路を備えていることで電源障害を検出してバックアップ電源(通常はバッテリ)に自動で切り替えますが、その場合でもタイムキーピング動作を維持できます(図1)。
図1:DS1307は外付けRTCの代表的な例です。このデバイスには、独自のローカル水晶振動子と電源レールがあるほか、コードの不具合に影響されないという長所があります。I2Cインターフェースを介してホストマイクロコントローラと通信します。(画像提供:Maxim Integrated)
もちろん、データシートを確認してこれらのデバイスの違いを判断することも大切です。たとえば、DS1307では5V電源、さらに外部の水晶振動子が必要です。これに対して、より高精度なDS3231は2.3~5.5Vの電源で動作し、温度補償水晶発振器(TCXO)と水晶振動子が統合されています。
場合により、これらの部品の違いはわかりにくいかもしれません。たとえば両方のデバイスともSQW(矩形波)を出力し、ソフトウェア制御でそれがアクティブになると、外付けプルアップ抵抗が必要になります。ただしDS1307では、1Hz、4.096kHz、8.192kHz、または32.768kHzの信号を生成するようにSQW出力をプログラムできます。対照的にDS3231では、1Hz、1.024kHz、4.096kHz、または8.192kHzの信号を生成するようにこの出力をプログラムできます。
DS1307では、クロックの精度は水晶振動子の精度、および発振回路の容量性負荷と水晶振動子がトリミングされた容量性負荷との一致精度に依存します。これに対して、温度補償されたDS3231には、-40°C~+85°Cの温度範囲で年間±2分以内という具体的な精度値があります(図2)。
図2:DS3231は温度補償水晶発振器で、その精度は-40°C~+85°Cの温度範囲で年間±2分です。(画像提供:Maxim Integrated)
では、これら2つのデバイスのデータシートを比べてもどちらかを却下するような違いが見当たらない場合、設計者は現実的にどのように評価を行えばよいでしょうか?1つのソリューションとして考えられるのが、カスタムのブレイクアウトボード(BOB)を設計、作成し、デバイスを始めから駆動するコードを開発する方法です。Arduinoハードウェアとソフトウェアのエコシステムの一環として開発されたすぐに使えるBOBとコードを使用すれば、より迅速でコスト効率の良いソリューションとなるでしょう。
RTC BOBの例:Adafruit DS1307およびChronoDot
DS1307およびDS3231 IC用に広く使われている2種類のBOBに、Adafruit 3296 DS1307リアルタイムクロックBOB(図3)と、255 ChronoDot超高精度リアルタイムクロックV2.1 BOB(図4)があります。
図3:AdafruitのDS1307 RTC BOB。(画像提供:Adafruit Industries)
図4:ChronoDotの超高精度リアルタイムクロックv2.1 BOB。(画像提供:Adafruit Industries)
Arduino Uno R3などの適切なマイクロコントローラ開発ボードを、インターネットでダウンロードできるオープンソースライブラリやサンプルコードと組み合わせることで、組み込みシステムやIoTデバイスの専門的な設計者はすぐに本格的な開発を始める準備ができます。
設計者は評価を完了したら、オープンソースハードウェア設計の適切な部分をBOBへの応用に取り入れ、その部分を各自の設計に直接組み込むことができます。同様に、オープンソースライブラリと、オープンソースの実例に基づいて開発したコードを取り入れ、それらを製品の一部として使用できます。
ソフトウェア開発者向けのハードウェアのヒントとコツ
前述のように、DS1307 RTCとDS3231 RTCは両方ともシリアルI2Cバスを介してホストマイクロコントローラと通信します。ソフトウェア開発者が「しまった」と思いがちな事柄の1つは、このバスを形成する両方の信号(SCLおよびSDAと呼ばれる)にプルアップ抵抗が必要なことです。
AdafruitのDS1307またはDS3231(ChronoDot)のBOBにはこれらの抵抗器は含まれていません。ただし、ChronoDotにはR1およびR2の注記があるパッドが含まれており、それを追加できます。
プルアップ抵抗が含まれていない理由は、I2Cバスに複数のデバイス(ICまたはBOB)を接続できることにあります。I2Cバスは7ビットアドレス(27 = 128)を使います。しかし、アドレス0000000はGeneral Call Addressで、バス上の全デバイスのアドレス指定に使用されるので、理論的にはバスで127個のディスクリートデバイスをサポートできることになります。実際には、サポート可能な事実上のデバイス数は、トレースと負荷の静電容量(合計400ピコファラッド(pF)に制限)を含むバスの静電容量によって決まります。
複数の抵抗を並列に接続した場合の等価の値を計算するために、ハードウェア設計者が使用する公式があります。ここでは説明のために、次のような簡単な例を考えてみます。2つのデバイスに同じ値のプルアップ抵抗がある場合、その抵抗は値の半分になります。4つのデバイスに同じ値のプルアップ抵抗がある場合、その抵抗は値の1/4です。
プルアップ抵抗を持つI2Cデバイスが既にバス上にある場合は、特に何もする必要はありません。プルアップ抵抗が存在せず、将来的にプルアップ抵抗を搭載したBOBを追加しないことが100%確実な場合は、プルアップに4.7kΩの抵抗ペアを使用するのが最善の方法です。しかし、プルアップ抵抗搭載のBOBを将来追加する可能性がある場合は、この時点では10kΩの抵抗ペアを追加すべきでしょう。これらは他のBOBをバスに追加する前と後を通じて機能するからです。
ハードウェア開発者向けのソフトウェアのヒントとコツ
「ワイヤライブラリ」は、I2Cデバイスとの2線式クラス通信を容易にする通信ライブラリです。Arduinoの場合、これは統合開発環境(IDE)の一部として提供されるので、設計者はプログラムの先頭にステートメント#include <Wire.h>を追加するだけです。
実際の手順としては、まず最適なRTCライブラリをトラックダウンします。代表的なものにはAdafruitのRTClibがあり、Githubからダウンロードできます。次にプログラムの先頭にステートメント#include "RTClib.h"を追加します。
その後(通常は定数値を定義した後)、使用しているBOBに応じてステートメントRTC_ DS1307 RTC;またはRTC_DS3231 RTC;を使用してRTCをインスタンス化(インスタンスを作成)します。
さらにその後、プログラムですべての設定を行うとき(Arduinoスケッチの場合はsetup()関数の一部として)、設計者はステートメントWire.begin();およびRTC.begin(); を追加して、I2C通信とRTCサブシステムを初期化する必要があります。
前述のGithubページで提供されている例を使用すると、設計者は現在の日付と時刻にすぐにアクセスし調整できるようになります。多少わかりにくいのは、SQW(矩形波)出力にアクセスする方法です。デフォルトでは、電力節約のためにこの出力はアクティブではありません。このピンを使用できる1つの方法は、たとえばこの出力をアクティブにして1Hzで動作するように設定し、この信号を使用してホストマイクロコントローラで割り込みをトリガすることです。
ソフトウェア開発者にとって、ライブラリコードでこのような作業を一通り行うのは難しくないでしょう。しかし、ハードウェアの設計技術者にとっては、このコードで一通りの作業を行うのは難しい場合もあるので、以下に概略を示します。
DS1307では、RTC.Ds1307SqwPinMode(<option>);という形のステートメントを1つまたは複数追加する必要があります。サポートされるオプションの値は、ON、OFF、SquareWave1HZ、SquareWave4kHz、SquareWave8kHz、SquareWave32kHzです。
同様にDS3231では、RTC.Ds3231SqwPinMode(<option>);という形のステートメントを1つまたは複数追加します。サポートされるオプションの値は、ON、OFF、DS3231_SquareWave1Hz、DS3231_SquareWave1kHz、DS3231_SquareWave4kHz、DS3231_SquareWave8kHzです。
まとめ
小規模なチームで、しかも市場投入までの期間に厳しい制約があると、設計者は様々な分野での設計作業を掛け持ちし、IC、センサ、ペリフェラルの評価を迅速化してコストを削減する方法を常に模索する必要があります。これまでに述べたように、その1つの解決方法となるのが、Arduinoをオープンソースハードウェアのセンサやペリフェラルのブレイクアウトボード(BOB)とともに活用し、オープンソースソフトウェアのライブラリやサンプルプログラムを合わせて利用する方法です。
免責条項:このウェブサイト上で、さまざまな著者および/またはフォーラム参加者によって表明された意見、信念や視点は、DigiKeyの意見、信念および視点またはDigiKeyの公式な方針を必ずしも反映するものではありません。


