3.7 Arduinoとマイクロコントローラについて
今回メインコントローラに使用しようとしているボードは”Arduino(アルドゥイノ又はアルドゥイーノ)”と呼ばれるフリーな仕様のボードです。このボートの心臓部は近年高性能であると同時に使いやすいと評価の高いアトメル社(ATMEL)の8ビットのマイクロコントローラ(MCU)のAVRを使用しています。
”Arduino(アルドゥイノ又はアルドゥイーノ)”は狭義にはAVRのマイクロコントローラをベースに製作された基板のことを指していますが、 Arduino自体はC言語風の 言語とそのプログラムを開発するためのツール、デバックのための機能、通信回線を介して基板のROMにプログラムを書き込むための諸機能といった諸機能をもった統合開発環境でもあります。また、I/Oピンの仕様や基板配置などといったハード仕様とプログラムの開発に必要な言語とそれを使用して開発されたライブラリなどのソフト仕様の全てを規定しているプロジェクトでもあります。
そもそもArduinoプロジェクトは2005年にイタリアで始まったもので、より安価で有用な開発ハード環境を当時の学生たちに供給しようと始まったものです。
Arduinoは、搭載されたマイクロコントローの周辺I/Oをダイレクトに制御できるだけでなく、プログラムの書き込みに特別なハードを必要としない便利さに加え、ソフトウエアの仕様のみならず、バードの仕様そのものもオープンなプロジェクトとして開始されたことが多くのユーザに受け入れられました。
基板の性能自体は使用されたマイクコントローラに依存するところが多く、MCUとして採用された8ビットのAVRチップの種別によってプログラム領域の大きさや通信を行うためのハードが若干異なることを除けば基本的な動作と性能はほぼ同じです。
ただし、AVRマイクロコントローラには様々なバージョンのものが製造されていますので、それに伴ってArduino自体も進化しており、I/Oポート数が増加しているものもあります。今回使用するArduinoボードはMCUにATmega328を搭載したものです。今後はAVRマイクロコントローラ自体の高性能化に合わせて、動作周波数のより高いものや16ビットや32ビット処理をベースとするハードなどが発表されていくものと思われます。また、プロジェクト自体は互換ボートなどを作製すること許しているフリーシステムですから、今後さらに様々な基板が製作されるかもしれません。今回使用しようとしたボードのマイクロコントローラきATmega328は、非常に高機能な割に価格が安く(2013/2現在、秋月電子では250円)、使用しやすい様々な特徴を有するコントローラでもあります。Arduinoボードの性能はこのチップの性能に依存していることは明白なので、このマイクロコントローラの優位な特徴について記述してみることにしましょう。
3.7.1 ATmega328の主な特徴
■RISC構造
◆RISC構造の129命令の多くは1クロック周期で1命令を実行するので高速
凡そ1MHz当たりの計算量は1MIPSとなる
◆2周期での乗算命令のサポート
◆最大クロック20MHzで駆動可能(ただし、Arduinoでは16MHzで動作)
◆20MHz時には20MIPSに達する高速動作
◆完全なスタティック動作
■高耐久な不揮発性メモリ
◆プログラム用に1万回書き換え可能なフラッシュメモリを内蔵
◆位置変更可能なブートコード領域、ブートプログラムでファームウエア書き換えが可能
◆書き換え中に同時読み込み可能な機能のサポート
◆データ保持用の10万回書き換え可能なEEPROMを内蔵
◆プログラム実行用のSRAMを内蔵
◆書き換え回数:1万/フラッシュ、10万/EEPROM
◆データ保持力:20年/80℃,10年/100℃
■内部周辺操作機能
◆前置分周器と比較機能付きの独立した2つの8ビットタイマ/カウンタ
◆前置分周器と比較及び捕獲機能付きの独立した1つの16ビットタイマ/カウンタ
◆6つのPWM出力が可能
◆6チャネル(PDIP,QFN/MLF28)、8チャネル(TQFP,QFN/MLF32)の10ビットA/D変換器
◆設定可能な専用発振器付きのウォッチドッグタイマ機能
◆動作変更可能な直列UART
◆主装置/従装置動作の可能なSPI直列インターフェース
◆バイト対応の2線直列インターフェース(Philips I2C互換)
◆アナログ比較器
◆ピン変化での割り込み機能
3.7.1 Atmega328の機能概要
AVRはアトメル(Atmel)社が製造しているRISCベースの8ビットマイクロコントローラ(制御用IC)で、日本で沢山のアマチュアユーザを持っているPICと同様に比較的小型でシンプルな回路構成で様々な機器の制御回路を組めるところが特徴となっています。
上記のようにAVRにはシステム開発に必要な内蔵メモリや様々な内部周辺操作機能の回路が予め組み込まれているので、これらの中でEJAN赤道儀制御システムのファームウエアを作成するうえで必要となる主な機能についての概略を示そうと思います。
<プログラム用フラッシュメモリ>
作成した制御プログラムを書き込むための不揮発性メモリで、約1万回書き換え可能なフラッシュメモリが内蔵されています。これは、実際に動作するファームウエア本体をストアしているメモリ領域のことで、開発中は何度も実行オブジェクトの上書きを行い、完成したらそのままで半永久的に実行可能なものとして使用することができます。
このフラッシュメモリは電源を落としても内容が消去しないし、書き換えも前述のように約1万回も可能なので、プログラム開発時はデバッグ用のプログラム保持領域として利用するのです。
そのプログラムのデバッグが終了すれば、そのままの状態でコントローラのファームウエアとして利用することになります。
更にAVRのフラッシュメモリの特徴は書き込み時に特別な電圧を掛けることなく、マイクロコントローラが稼働する5Vの電圧で書き込みが行えることです。このため、ArduinoがUSBポートからこのフラッシュメモリにファームウエアを書き込めるのです。
フラッシュメモリのアドレスは下位から上位に単純にインクリメントするような直線的(リニア)なものとなっており、各デバイス種の違いは上位メモリアドレスのサイズの違いとなっています。
つまり、ファームウエアのボリュームにより使用するチップが異なるだけで、同じ系列のマイクロコントローラを用いる限りプログラムそのものには大方修正変更などの必要がないという特徴もあります。下に示すとおりとにかくAVRのチップは価格が安い割に制御プログラム用のメモリが大きいことが特徴で、そのおかげでファームウエアが非常に楽になるし、比較的大きなプログラムの開発が可能になります。
◆Atmega168では16Kバイト ◆Atmega328では32Kバイト
◆Atmega64 では64Kバイト ◆Atmega128では128Kバイト
<データ保持用EEPROM>
データ保持用のメモリで、主に初期化データやパラメータなどを保持する目的に使用されます。
書き換えが可能なので、プログラムから必要なデータのロードや保持のための書き換え処理を行うことができます。このメモリは電源を落としても内容は消えないし、書き換えも約10万回行うことができるので、システム固有なデータの保持領域として利用できます。EJAN赤道儀制御システムでは、各種望遠鏡の制御データ、観測点情報、ステッピングモータの制御パラメータ情報、天体導入速度等の情報がこのモリの中にストアされており、同時にそれらの情報は随時修正・変更が可能なように設計されています。
◆Atmega168では512バイト ◆Atmega328では1Kバイト
◆Atmega64 では2Kバイト ◆Atmega128では4Kバイト
<プログラム実行用SRAM>
プログラム実行時のスタックや一時メモリとして使用しますが、電源を落とすと内容は消去あるいは不定の状態になります。
サイズそのものはあまり大きくはないのですが、マイクロコントローラとしてはそれ程少ないという訳ではありません。
◆ATmega168では1Kバイト ◆Atmega328では2Kバイト
◆Atmega64 では4Kバイト ◆Atmega128では4Kバイト
このようにAVRの優位な事柄は上記のように多々ありますが、プログラム側から見ると最も大きな特徴はプログラム領域がリニアな空間で比較的大きくなっていることでしょう。そして、製品の上位バージョンは下位からのハード仕様をそのまま拡張するような構造になっており、開発したプログラムは若干の修正があるとしても上位マイクロコントローラでも基本的に動作することが考慮されています。また、129命令の多くは1周期で命令を実行することができるために1MHz当たり1MIPSの計算能力があること、2周期での乗算命令のサポートしていることなどにより非常に高速な処理が可能になっています。
メモリ空間がリニアであることはメモリ領域が拡張してもバンクシステムのような面倒な領域切替処理が要らないし、非常に見通しの良いシステム開発ができることになるわけです。
ATmega328の入出力ピンは通常はデジタル入出力として使用することができるのですが、Bポート(PBn)の各ピンは外部要因による割り込みやクロック処理のピンとして機能させることができます。また、Cポート(PCn)はアナログ入出力ピンとしても動作し、更にDポート(PDn)はピンの状態変化による割り込みなどの機能ピンとしても機能させることができる兼用機能をサポートしています。
このように、AVRのマイクロコントローラは様々な機能を1チップに詰め込んだ非常に高機能で高速な8ビットコントローラに仕上がっているのです。
3.8 ATmega328とArduinoのフリーな開発環境
プログラム開発はC言語あるいはアセンブラを基本としており、アトメル(Atmel)社から非常に開発しやすい環境として「AVR Studio」が無償で提供されています。
「AVR Studio」はアトメルのマイクロプロセッサを使用した場合の標準開発システムともいえるもので、C/C++コンパイラ、エディタ、デバッガ、ライティング等の開発環境が集約されており、一般にIDE(Integrated Development Environment)と言われているものです。このアトメルのIDEは無償の統合開発環境としてでなく、開発に必要な様々な機能や開発を早めるためのサンプルソースなども含まれている無償で非常に強力なツールシステムです。
Arduino「(アルドゥイノ又はアルドゥイーノと呼ぶ)」は、このAVR Studioとは全く別のものとしてC言語とほぼ同じ仕様でプログラムの開発が可能なプロジェクトとして存在しています。
ArduinoはAVRのマイクロコントローラを採用しハードにおけるボード形状や入出力ピン及び動作環境と開発環境の全てに関わる仕様を規定しているものです。このプロジェクトは、単にマイクロコントローラのハードを規定するシステムというものでもないですが、AVRチップをボードの心臓部に使用した優れたシステム開発環境であることは間違いありません。
さらに、Arduinoはフリーな開発システムとして、ハードのみならずソフトウエアそのものも全て公開されているオープンなシステムとして提供されていることが他システム環境との違いとなっています。特に、メインボードのハードウエア設計情報を公開するオープンハードウエアなので、その回路設計データであるEAGLEデータファイルすらも無償で公開されていることは特筆に値します。
要するに、ソフトウエアからすれば開発におけるフリーな開発環境とその書法を仕様で規定しているだけでなく、同時に様々なライブラリなども提供されてユーザにとって非常にわかりやすいシステムとなっています。同時に、ハード的にはI/Oのピン形状とその仕様が定められているためにボードを用いたシステム開発も行い易くなっていることが大きな特徴でもあります。
ArduinoボードのI/Oソケットの形状と位置関係は非常に特徴的で、I/OソケットはマイクロコントローラのI/Oピンのポートと対応して、ダイレクトに設定されているために非常に分かりやすくなっています。下図にArduino UNO(ATmega328仕様)のボードとピンマッピングが示されていますが、マイクロコントローラのI/OピンはB(PB)ポート、C(PC)ポート、D(PD)ポートというように機能仕様毎に分かれています。
ちなみにArduinoボードは搭載されているマイクロプロセッサには特段の規定が無いようなので、別種のプロセッサを使用している様々な互換ボードが発表されているし、回路図そのものがオープンのためにその派生互換ボードも多々あります。
通常使用的には各ポートは内蔵プルアップ抵抗付きのデジタル入出力ができるポートとして機能しますが、各I/Oピンはその動作設定を変えることでデジタル入出力以外の様々な処理を行う特殊な機能ピンとしても動作できるような設計になっています。
ArduinoボードのI/Oがこのようなソケット形状をとっているのは、このソケットと同じピンソケットをもった増設ボードをドーターボード(積み上げ)として次々にスタックするような機能拡張システムを考えているからです。このような、機能拡張ボードは”シールド”と呼ばれており、それらはArduinoのソケットと接続用のピンのあるものであればよいことになっています。シールドは様々な機能のものが各社から発売されているので機能拡張は非常に簡単です。
ただし、Arduinoのソケット配置は、ユニバーサルボードがそのまま乗るようなピな配置とはなっていません。電源関連,C,Dポートソケットはユニバーサルボードと同じ100milのグリッド上に配置されていますが、残りのBポートソケットは同一グリッド上にはありません。このため、互換ボードの一部はわざわざB ポートのみ100milのグリッドの端子を増設しているものさえあります。このソケット配置の意味合いは主に基板の差し違え防止の意味合いもありますが、所定のシールドを使用させる意味合いもあるように思いますが真意は分かりません。
このように、Arduino UNOなどはI/Oピンの絶対数が比較的少ないので、使用できるシールドの数やピン配置にも若干の制約はあることは否めないのですが、とにかくハード仕様が明確になっているおかげで、シールド自作的にも様々な問題がかなり緩和されていることも事実です。
3.9 Arduinoにおけるピンの定義
ArduinoではI/OピンPD0~PD7、PB0~PB7、PC0~PC6の順にデジタルピンpin0~pin19としてデジタルデータを扱うことができます。
ただし、ArduinoにおいてはPC0~PC6(pin14~pin19)については、アナログピンanalog input0~analog input5として使用するように仕様上定義づけられていますが、ピン定義によりデジタルデータのI/Oピンとして動作させることができます。その場合には、対応するピンの動作モードを下記のコードで明示的に指定しなければなりません。
<ピン操作関数> pinMode(pin, mode)
<機能概要> 指定するピン(pin)の動作を入力か出力(mode)に設定します。
Arduino1.0.1から、INPUT_PULLUPを指定することで、
内部プルアップ抵抗を有効にすることができます。
INPUTを指定すると、内部プルアップは無効となります。
<パラメータ > < 内容>
pin アナログ出力に使用するデジタルピンの番号
mode デジタルピンの番号の機能設定
INPUT : 指定したpinを出力ピンに設定します
OUTPUT : 指定したpinを出力ピンに設定します
INPUT_PULLUP : 指定したpinを内部プルアップ抵抗が有効な入力ピンに設定します
戻り値 なし
Arduinoはこれらマイクロコントローラの機能を有効に活用すべく作られたAVRの開発環境を上手に利用しながら、プログラム開発になれない初心者のために分かりやく、処理環境を意識させないように設計されたシステムなのです。更に、プログラムの開発に関連したエディタ、コンパイラ、ファームウエアをハードに転送するための機能等を総合的に提供する有用なシステムでもあります。
Arduinoのシステム的な唯一の欠点を上げるならば、その書法からくるものでC言語のような開発仕様ですが、前述の「AVR Studio」のようなソースデバッグの機能がないことでしょうか。
ファームウエアの実行時にターゲット(ATmega328)側のデータ内容を参照することはデバック時には必須のことなのですが、Arduinoでは直接これらを参照する手段がありません。
このため、ファームのソース上にprint文を入れてシリアルに必要なデータを出力し、データ内容をデバッグモニタで参照するという面倒なことをしなくてはなりません。この作業は何しろ面倒なだけでなく、データ出力するためのprint文そのものが多くのメモリを消費することになり、開発に必要なメモリ領域に大きな負荷がかかるという欠点があります。
この問題は後々解消されるのかもしれないのですが、いずれにせよArduinoはあまり大きなプログラムを開発するようなものとしては設計されていないようです。現時点ではArduinoが発展途上にあるシステムということを考え合わせると、数千ステップを超えるようなシステム開発の場合はハードのみArduinoのボードを使用し、開発そのものは「AVR Studio」で行うような方法が良いのかもしれません。この点はArduino使用したシステム開発の課題ということになるのでしょうか。いずれにしても、そのようなソースデバックを行えるようなハードでなくてはならないのですが、その点Arduinoは余り考慮されていないようなのです。
3.10 Arduinoのスケッチ
さて、Arduinoにおけるファームウエアのソースは”スケッチ”という名称で呼ばれています。これは、作成者が作りたい部分又は制御したい部分のプログラムのみを作成すればよいという思想から、通常のC言語などによるプログラムとは差別化し、プログラム作成をより簡略でイメージ化し易くするために考え出されたものなのだと思います。
とりわけ、ArduinoにはC言語にある”main”の部分が無く、プログラムが動作するために最初に行うセットアップ(setup())関数と実処理に相当するループ処理(loop())の内容のみコーディングすれば良いことになっています。
たとえば、以下のようにArduinoボードの13ピンに接続されたLEDを点滅させるスケッチはArduinoのFile->Example->Basics->Blink からスケッチの例として使用することができます。Arduinoの良さはこのようなスケッチの例が豊富なことも特徴の一つです。
このスケッチは、ArduinoのUPLOAD(7個あるボタンの内右から2番目の)ボタンを押すことでこのスケッチはコンパイルが実行されます。続けて実行オブジェクトがボードのメモリ領域に書き込まれると同時にプログラムは実行されてLEDが点滅を始めるのです。
<Arduinoの最も簡単なプログラムの例>
このスケッチは、ArduinoのUPLOAD(7個あるボタンの内右から2番目の)ボタン を押すことでこのスケッチはコンパイルが実行されます。続けて実行オブジェクトがボードのメモリ領域に書き込まれると同時にプログラムは実行されてLEDが点滅を始めるのです。
/*
1秒ごとの点滅:LEDが一秒点灯し、 一秒間消灯を繰り返す
*/
void setup() {
// デジタルピン13を出力ポートに初期化する
// Pin 13 は LEDに結線されている
pinMode(13, OUTPUT);
}
void loop() {
digitalWrite(13, High); // LED を点灯する
delay(1000); // 1000mSec遅延
digitalWrite(13, Low); // LED を消灯する
delay(1000); // 1000mSec遅延
}
上例のようにArduinoでのプログラム開発はサンプルスケッチを有効に活用しながら行うことが基本となっているようで、初心者には非常にありがたいシステムです。
Arduinoシステムはこのスケッチをボードに書き込む際のコンパイル処理にともなって、必要なインクルード文やメイン関数などを付け足したテンポラリソースファイルを作成した後に、そのソースをgccコンパイラによってコンパイルすることによりバイナリファイルを作成してからボードに書き込んでいます。
従って、Arduinoシステムはgccコンパイラがベースであることは明白なので、ファームウエアの開発にはC言語で開発された様々なライブラリも利用することができることになります。特にATMEL社の提供する標準ライブラリ”AVR Libc”とも非常に相性が良いことも事実なのです。
このため、AVR Libcパッケージで提供されているCの関数は、Arduinoの言語仕様やライブラリにない標準Cライブラリのサブセット関数やAVR固有の関数などの強力なCの関数を含んでおり、これらを使用することでより細かなプログラミングが可能になっています。このAVR Libcパッケージは、AVRの8ビットと32ビットマイクロコントローラのプログラム開発を行いやすくするためにATMEL社から無償で提供されるもので非常に有用なライブラリです。
余談ですが、このライブラリを使い始めると結局のところArduinoでの開発はUSBポートのみを使用してファームウエアの書き込みができるという点で便利なのですが、プログラム開発ではオンラインデバッグを含めてAVR Studioを利用した方がよりスマートなように感じるのは筆者だけなのでしょうか。
Arduinoシステムはバイナリファイルを開発ボードに対して送ろうとするとき、その都度通信ポートのオープンを要求することになり、Arduinoボード側はポートオープンに伴ってリセットがかかるようなハード構成となっているために、やはりポートオープンの度にリセット割り込みがかかるようになっています。
このリセット割り込みはブートローダに処理を移し、このローダプログラムが外部通信ポートからのバイナリファイルの送信要求を受け取って、マイクロコントローラ内のプログラム用フラッシュメモリに対してプログラムデータを書き込むのです。ATmegaのフラッシュメモリの特徴は通常動作電圧のみで書き換えができることなので、これがArduinoシステムのブートローダによるバイナリデータの書き換えという処理を可能にしているのです。Arduinoシステムの特徴は、このブートローダの処理にあり、このローダのおかげで特別な開発システムがなくともマイクロコントローラのプログラム作成を楽しむことができるのです。そのため、組み込みプログラムを楽しむためのハードルが非常に低いものとなり、少なくともプログラム開発言語Cを知っているか、あるいは正確に知らなくとも前述のようなサンプルスケッチをロードするだけで簡単なプログラム作成の面白さを実体験できるのです。
その意味でArduinoは非常に便利で有用なシステムということにはなるのですが、前述のように開発環境という観点からすると非常にデバッグが行い難いものでもあります。それは、ダウンロードされたターゲットプログラムのデバックにおいて感じることなのです。いざデバッグを始めるとファームの実行状態が全く判らないので、丁度真っ暗やみの中で落とした小物を探すような状況に陥るのです。ファームウエアがバグなく作成されていれば何も問題はないですが、バクがあった場合は動作途中の変数値やメモリの状態を確認しようとすることになります。しかし、それらを直接読み取る手段がそのものがArduinoにはないのです。そのため、これらの内容を参照しようとするファームのソースのなかにデータ出力ステートメント(print)を追加しておき、それの実行時に通信を介してArduinoのデバッグモニタにデータを出力させなくてはならなくなるのです。
これは非常に面倒であるばかりでなく多くのメモリ領域を消費することになるので、ファームウエアの開発からすると開発メモリ領域の減少という結果になり、全くありがたくないものになってしまうのです。その点、AVRの統合開発環境である「AVR Studio」はこれらの不都合をすべて解消することになるのですが、ファームウエアの書き込みやデバッグには別途専用ハードを必要とする点が唯一の難点ということになります。ただし、これらの開発ハードは他社のものと比較しても安価なものなのでアマチュアでも十分使用することができるものですから、この点が難点といえるかどうかは若干議論の余地がありそうなのですが・・。
3.11 Arduinoでのオブジェクトの作られ方
Arduinoというシステムは、ハードとプログラム書法を明確に規定しているフリーな開発環境です。ハードは本来AVRのMCUを基本として、アマチュアが容易にプログラム開発やロボットなどのハード制御ができるように設計されており、プログラムの開発言語はC/C++に似たような書法になっています。似たようなというのも、Arduinoのソフト開発環境におけるコンパイラがGCCを採用しているからに他なりませんが、実際の開発ではC/C++にあるようなmain関数などが存在しないことに気づくはずです。
Arduinoにおけるソースプログラムは”スケッチ”と呼ばれており、それはloop()関数とsetup()の関数のみで処理が完了します。通常のC/C++で作られたプログラムのメインにあるその他の関数定義やで定義文(#include 文や定数のような)等は一切記述の必要がありません。ただし、Arduinoシステムで標準的に提供されていないライブラリ(サンプルにあるような)を使用するときは、そのライブラリの定義文(#include 文)をスケッチの始めに書くことでその機能を使用することができるようになります。
それでは、Arduinoはどのようにしてスケッチからボードで実行できるオブジェクトを生成することができるのでしようか。実は、そのことの解決法そのものがArduinoというシステムの最大の特徴になっているのです。先ほど、スケッチに必要な関数はloop()とsetup()のみと書きましたが、ArduinoがいかにしてMCUで実行可能なオブジェクトを生成することができるのかを知ることは非常に重要なことです。
表 Arduinoで必要な関数
< 関 数 > loop()
< 処理概要 > 実際の処理を記述したソースファイルで、
プログラムは通常電源が落とされるまで、と何度でも実行され続けます。
本当の意味でメインプログラムと呼べる部分です。
この中のプログラムがないものは、まさに空のプログラムで何もできません。
< 関 数 > setup()
< 処理概要 > デバイスや特定な値などの初期化を行うための関数で、
スケッチが実行されるときに一度だけ実行される処理プログラムです。
Arduinoでのスケッチについて考える前に、一般的なプログラムの開発の手順について考えてみましょう。全てのプログラムはプログラマが書いたC/C++等のソースプログラムを、最終的には稼働するMCU(またはMPU)が解釈し実行できるような実行オブジェクトの形式に変換されなくてはなりません。このソースプログラムから実行オブジェクトへの変換処理を”コンパイル”と呼んでいます。
Arduinoの場合でも人が分かりやすい言語で書いたプログラム、つまりスケッチを記述しコンパイルという手順を経て実行オブジェクトが作られることは、他のC/C++等のプログラムと全く同じです。そして、実際のコンパイルを行うプログラムが”コンパイラ”と呼ばれるもので、そのコンパイラは、Arduinoでは”GCC”と呼ばれるフリーのコンパイラが採用されています。
それでは、なぜ一般的なC/C++言語で必要なmainや#include 文等の記述がArduinoでは必要がないのでしょうか。
実はArduinoにおいても、スケッチをコンパイルしようとしているGCCコンパイラ自体はそれらの記述内容が必須なのです。要は、これら言語的な書法への書式変更や関数とその定義文の追加などのコンパイルに必要な記述処理をArduinoシステムがプログラマに代わって行なっているということなのです。それなので、スケッチでは最小限のプログラムソース記述だけで良いということになっているわけです。
Arduinoが開発された最大の要因は、旧来のプログラム開発を行ったことのある人ならば分かるのですが、プログラムをコンパイルするまでの開発環境の設定や操作の理解といったことが、プログラム初心者にとっては非常に高いハードルとなるという事柄なのです。また、プログラムの書法そのものを学習することでさえ、従来の開発環境では非常に設定事項が多くて分かり難く複雑ということだったのです。そのため、このような状況を解消するための統合開発環境(IDE)が作られましたが、その環境そのものもまた複雑で理解しづらいということで、更にプログラム開発のハードルを上げる結果となっていたのです。この反省に基づいて、そのような開発環境をできるだけプログラマに意識させず、プログラムの実行イメージ(スケッチ)のみに集中できるように設計された開発システムがArduinoということになります。
以下にピン番号13を利用した1秒ごとのLEDの点滅のスケッチとCでのソースの展開イメージが示されています。この二つのソースを見比べてみましょう。
表 Arduino のスケッチとCの展開ソース
< Arduinoでのスケッチ >
/* Blink */
int led = 13;
// the setup routine : 初期設定
void setup() {
// デジタルピンを出力に設定
pinMode(led, OUTPUT);
}
// the loop routine 繰り返し実行される
void loop() {
// turn the LED on (HIGH is the voltage level)
digitalWrite(led, HIGH); // LED点灯
delay(1000); // 1秒待ち
digitalWrite(led, LOW); // LED消灯
delay(1000); // 1秒待ち
}
< 展開後のスケッチに対応するCのソース>
#include <Arduino.h>
/* Blink */
int led = 13;
// the setup routine : 初期設定
void setup() {
// デジタルピンを出力に設定
pinMode(led, OUTPUT);
}
// the loop routine 繰り返し実行される
void loop() {
// turn the LED on (HIGH is the voltage level)
digitalWrite(led, HIGH); // LED点灯
delay(1000); // 1秒待ち
digitalWrite(led, LOW); // LED消灯
delay(1000); // 1秒待ち
}
int main(void)
{
init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
これは、様々なArduinoの入門書で示されるサンプル・スケッチですが、前半はご覧のようにsetup()とloop()関数のみのスケッチで、後半はそれがArduinoによってソース展開された後のソースプログラムが示されています。
このスケッチの内容は一秒ごとにArduino基板上のLEDを点滅させるという簡単なものです。その前半部の内容のスケッチが、Cのソースに展開され、コンパイルされる直前のソースとして下段に比較表示されています。
Arduinoボードのピン番号13はLEDがハード的に接続されていますから、このポートの状態をONするとLEDが点灯し、OFFに設定するとLEDが消灯することになります。
ArduinoによってCのソース展開された内容がソースの下段に示されており、この中で太字で表記された部分がArduinoによって追加されたCのソースです。
結局のところ、スケッチのsetup()とloop()関数がCソースのmain関数の中で呼び出される関数して記述されています。setup()関数は一度だけ実行されますが、loop()関数は、for(;;){}の無限ループ中で毎回呼び出され、LEDが点灯してから1秒の待ちを実行し、その後LEDを消灯し1秒の待ちを行うという一連の処理を実行しています。
このLEDの点滅を行うスケッチは非常にシンプルですが、実際のArduinoのスケッチは様々な処理を行うでしょうから通常はもっと複雑なものになります。ですが、基本的な手順としてはこのようなスケッチのCソースへの変換処理が行なわれた後に、CコンパイラであるGCCにかけられて実行オブジェクトが作られるという点では全く同じなのです。
3.11.1 スケッチがCのソースに展開された内容の確認方法
Arduionoはこのように複雑な仕組みを意識させないシステムなので、以下で説明することは本来理解する必要のない事柄ですが、あくまでもコンパイル処理の内容を理解するためのアプローチとして次のような操作を行ってみると良いでしょう。それは、スケッチがArduionoによってCのソースに展開された後の内容をソースとして確認することです。
先ずArduinoの”環境設定”パネルを開いて”以下のファイルを直接編集すれば、より多くの設定を行うことができます”表示の下に示されたテキストファイル”preference.txt”の内容を確認すると、Arduinoの様々な情報を確認することができます。
この例では、次のようになっています。
”C:¥User¥yoshi¥AppData¥roamng¥arduino¥preference.txt”
前述のような内容を実際に確認したいのならば、このファイル(preference.txt)のpreproc.save_build_files=falseの項目をtrueにすれば中間ファイルがAppData/Local/Tempのテンポラリファイル(build****.txt)として残されるのでその内容を実際に確認することができます。
また、Arduino 1.05における前処理に必要なファイルは、Arduinoシステムがストアされているディレクトリの/hardware/arduino/core/arduino/に全て入っています。これらのファイルをみるとmain等の全てのソースファイルの拡張子が”.cpp”なので、システム開発の基本はC++になっているのが分かります。このため、当然Cのソースも有効なファイルとなります。
Arduinoが実行オブジェクトを作成するとき、これらのファイルの必要なものをロードして一つのソースファイルを一時的に形成するのです。それが先に説明したテンポラリファイルトいうことになります。
スケッチに書かれた2つのソース関数は、main.cppから呼び出される関数として存在しています。一般にスケッチにあるloop関数の部分が実処理の内容になるのですから、ユーザはこの部分のみ把握して作成すればよいという考えでシステムが構築されます。
4.EJAN赤道儀制御システムのピン割り当て
さて、EJAN赤道儀制御システムはこのArduino Duemilanove 仕様より後のボード(UNOなど)をメインボードにすることにしたので、次はピン割り当てを考えなければなりません。ただし、ボードそのものは様々なものでシステム稼働が望めるので、赤道儀の制御システムとして必要なの制御ピンを考えてみます。そのためには、EJAN赤道儀制御システムが行う制御とその信号の内容を吟味してみる必要があります。
EJAN赤道儀制御システムが行うべき作業と信号の種別は以下のように大別できます。
1.ステッピングモータの制御
<信号制御のドライバ基板を使用したとき>
◆ RA/Decモータの回転方向を決めるためのDirection信号
◆ RA/Decモータの回転を行うためのステップ信号
◆ RA/DecモータのEnable/MSn(マイクロステップ)動作を決める信号
・RA/Decへの回転方向を決めるための信号は各1本必要です。
・RA/Decへの実回転を行うための信号は各1本必要です。
・RA/Decへの マイクロステップ値を決めるための信号は各2本(1/8)又は
3本(1/16)必要です。
ただし、モータ制御基板内でマイクロステップ動作をディップスイッチなどで設定
するもの、あるいは外部基板に回路設定したときそのには必要はありません
<SPI制御のドライバ基板を使用したとき>
◆ RA/Decモータの回転を行うためのステップ信号
多数回転する場合はSPIによるコマンド制御により行うことになりますが、
1ステップごと の動作に必要な信号線が必要です。
◆ RA/Decモータの回転制御するため信号
・MOSI信号 : マスターからスレーブへのデータ信号線
・MISO信号 : スレーブからマスターへのデータ信号線
・SCK信号 : データ転送同期クロック信号
・SS信号 : スレーブ機器の選択信号
2.上位アプリケーションとの通信
◆ USB-シリアル通信のための信号(TX/RX)
・USB-シリアル通信の信号(TX/RX)各1本必要です。
3.ハンドコントローラとの通信
ハンドコントローラの制御信号はメインボードに対する入力信号として処理することもできますが信号数だけのポートが必要となるため、あまり良い方法とは考えられありません。このため、ハンドコントローラ処理の内容をコマンド通信形式でメインに指示するので次のいずれかの信号が必要です。
◆ SOFT-シリアル通信のための信号(TX/RX)
・SOFT-シリアル通信の送信(TX)と受信(RX)各1本ずつの信号が必要。
◆ USB-シリアル通信のための信号(TX/RX)
・USB-シリアル通信の信号(TX/RX)各1本必要です。
4.ホームポジションの検出
◆ RA/Decモータのホームポジションを決めるための信号入力
・最低RA/Decからの位置検出信号各1本と電源各1本必要
5.オートガイダーの制御
オートガイダーの仕様により様々なものが考えられます。
◆ 東西南北を指し示す信号(概ね4本と電源、GND線など)
◆ SOFT-シリアル通信のための信号(TX/RX)
・SOFT-シリアル通信の信号(TX/RX)各1本必要です。
◆ USB-シリアル通信のための信号(TX/RX)
・USB-シリアル通信の信号(TX/RX)各1本必要です。
6.LCDの制御(制御ピンに空きのある場合、メインROMに余裕のある場合)
◆ LCD(液晶)表示装置のポート制御
・通常は制御信号2信号とデータ用8信号が必要ですが、データ信号に対しては上位
と下位の4ビットずつの出力にして4信号に圧縮し、都合6信号で制御が可能に
なりますから、最低でも6信号が必要です。
◆ LCD(液晶)表示装置のSPI制御
・SPI制御のLCDの場合は4信号で制御が可能になりますが、メインポートが
SPIに対応していることが条件です。
制御自体はポート制御よりも高速になりますから、システム的には有利な制御法
です。
これらのデバイスを制御するために外部デバイスに対して出力または入力処理を行うための信号ポートを割り当てなければなりません。使用できる制御ピンはデジタルpin0~pin19までの計20本であるから非常に厳しいが、どのようにしてもこのピンの中に上記の機能信号を割り当てなければならないのです。下図に制御ピンと前記制御機能との対応案の例が示されています。
図 Arduinoボードの形状とI/Oソケットの機能マッピング例
信号の定義はシステム設計の内容と機能仕様によってその必要度が異なることになるので、それらの則って信号の内容を少し吟味してみることにします。
制御信号の内、ステッピングモータの制御に必要な信号は、回転の方向を決める信号と回転そのものを与えるステップ信号の2信号が一つの制御軸毎に必要なので、合計4信号ポートが必須です。
また、上位パソコンのコントロールソフトとのシリアル通信のための送信(TX)と受信(RX)のための2ポートは絶対になくすことはできありません。同様にハンドコントローラとのソフトシリアル通信のための送信(TX)と受信(RX)のための2ポートも必須です。
オートガイダーからの信号仕様は数多いガイダーの仕様によって異なる可能性はありますが、少なくとも信号線を入れようとすれば赤道儀の赤緯軸と赤経軸の回転を与える4つの信号(東西南北)は最低限必要であることは言うまでもないことです。ただし、オートガイダ信号の内容を何らかの通信コマンドの形で送受することができればより細かい処理ができるだけでなく、信号線そのものも2線に圧縮することができることになります。
LCD(液晶表示装置)を使用するためには制御用に2信号、データ用に4信号が最低限必要ですが、システム稼働には必ずしも必須ではないと考えてLCDを使用しないことにすると、計6信号を他の処理で使用することができるからやや余裕が生まれます。将来的に拡張すること前提に考えるならば、この信号ポートはいずれかの信号ピンを確保しておかなければならないことになります。
ホームポジションの検出信号のポートは使用頻度が極端に低いのでデジタルポートの中ではあまり重要とは言い難いと思われるかもしれないのですが、EJAN赤道儀制御システムの目差す完全自動導入処理にはやはり必須なのでこれも外すことはできません。
このように信号の必要性についての考察というのは、提供される機能の内容だけでなく、採用されるボード則ち搭載されているマイクロコントローラ(MCU)の種別によっても大きな影響を受けるものであることを十分に留意しなければなりません。
なぜなら、現在採用予定のボードはArduiono UNOという機種でAtmege328という8ビットのマイクロコントローラを使用していますから信号ピンの数は前述の通り20信号のみですが、ボードをArduiono MEGAに変更すれば信号ピンの問題は一気に解決してしまいます。というのも、このArduiono MEGAには信号ピンが52ピンもあるからなのですが、このMCUを採用したボードならば当面信号ピンの割り当てで苦慮することはなくなる訳なのです。
というわけで、Arduiono UNO使用する限り、非常に苦しいピン数のなかで信号配置を定義していかなければならないわけですが、これらの信号はシステムのハード構成とも密接に関連しているので、以下でシステム構成の要求に従ったピン配置をより詳しく考察してみたいと思います。
4.1 各種Arduinoピンと機能との関連
今日、Arduinoボードは搭載されるMCUの種別によって様々なものがあります。基本的にはアトメル社 AVRのRISCベースの8ビットマイクロコントローラ(MCU)が搭載されたボードということになりますが、近年32ビットMCUを搭載したものも発表されています。
Arduinoはオープンソースハードウエアの環境になりますから、純正(Arduinoと呼べるオリジナルなもの)品以外にも沢山の互換ボートが市場に出回っています。オープンソースハードウエアというのは、ソフトウエアの開発に関する開発環境や提供されるフリーソフトウエアなどを基本として、そのソフトウエアの稼働するハード(ボードなどの)使用もオープンにされているシステムのことです。そのため、同じ機能を持ったハードが沢山開発されています。これらの互換機はMCUが純正品と同一ものを使用していますし、回路そのものも基本部分はほぼ同一ですが、USBや電源回路等の周辺部品は若干ことなつているものがあります。
以下で説明する事柄は、Arduinoボードのソケット部分に出力されたピン機能に関するもので、この部分の仕様は純正、互換ボードの全てにおいて同一のことが保証されていますから、特定互換機については述べません。また、システム開発ボーリュームからATmega328以上のMCUが搭載されたものを対象として話を進めます。Arduinoの場合はATmaga168が採用されたボードも概ねATmega328が採用された機種と同一の仕様になっています。
Arduinoボードは、下表 で示すように採用されているMCUの種類ごとに大きく分けて次のようなボード区分けすることができます。
表. MCU種別によるArduinoボードの分類
<MCUの種別> ATmega32U4
<ボード名称> Arduino Micro
<基本的な機能と特長> 表面実装されたATmega32U4が使用され、Flashメモリは32KB,SRAM 2.5KB、EEPROM 1KBになっている。Arduino Unoの廉価バージョンという位置づけです。20のデジタル入出力ピンと12のアナログ入力と1つのUSBコネクタがあり、16MHzの水晶発振子で駆動される。
基板サイズは48mm×18mmです。
<ボード名称> Arduino Leonald
<基本的な機能と特長> 表面実装されたATmega32U4が使用され、Flashメモリは32KB,SRAM 2.5KB、EEPROM 1KBになっている。Arduino Unoの廉価バージョンという位置づけです。20のデジタル入出力ピンと12のアナログ入力と1つのUSBコネクタがあり、16MHzの水晶発振子で駆動される。
基板サイズは68.6mm×53.3mmです。
<MCUの種別> ATmega328
<ボード名称> Arduino Uno
<基本的な機能と特長>
DIPタイプのATmega328が使用され、Flashメモリは32KB,SRAM 2KB、EEPROM 1KBになっている。14のデジタル入出力ピンと6のアナログ入力と1つのUSBコネクタがあり、16MHzの水晶発振子で駆動される。
基板サイズは68.6mm×53.4mmです。
<ボード名称> Arduino Duemilanove
<基本的な機能と特長>
Arduino Unoの旧バージョンという位置づけです。
基板サイズは68.6mm×53.4mmです。
<ボード名称> Arduino mini
<基本的な機能と特長>
表面実装されたATmega168又はATmega328が使用され、Flashメモリは16KB,SRAM 2.5KB、EEPROM 1KBになっている。Arduino Unoの廉価バージョンという位置づけです。14のデジタル入出力ピンと8つのアナログ入力があり、USB機能はありませんが、16MHzの水晶発振子で駆動される。
基板サイズは30mm×18mmです。
<ボード名称> Arduino Pro mini
<基本的な機能と特長>
表面実装されたATmega328が使用され、Flashメモリは32KB,SRAM 2KB、EEPROM 1KBになっている。Arduino Unoの旧バージョンという位置づけです。14のデジタル入出力ピンと6のアナログ入力があり、16MHzの水晶発振子で駆動される。USB機能は基板上にはなく信号ピンのみ出力されています。
基板サイズは30mm×18mmです。
<ボード名称> Arduino Nano
<基本的な機能と特長>
表面実装されたATmega328が使用され、Flashメモリは32KB,SRAM 2KB、EEPROM 512か1KBになっている。Arduino Unoの超小型バージョンという位置づけです。14のデジタル入出力ピンとゆのアナログ入力と1つのUSBコネクタがあり、16MHzの水晶発振子で駆動される。
基板サイズは45mm×18mmです。
<MCUの種別> ATmega2560
<ボード名称> Arduino Mega 2560
<基本的な機能と特長> 表面実装されたATmega2560が使用され、Flashメモリは256KB,SRAM 8KB、EEPROM 4KBになっている。Arduino Megaの上位バージョンという位置づけです。54のデジタル入出力ピンと16のアナログ入力と4つのUARTがあり、16MHzの水晶発振子で駆動される。
基板サイズは101.52mm×53.3mmです。
AT91SAM3x8E
<ボード名称> Arduino Due
<基本的な機能と特長> 32ビットのAtmel SAM3X9EというARMのCoretex-M3, 84MHzのMCUを採用している。Arduino Mega 2560の上位に相当する。
Flashメモリは512KB,SRAM 96KBになっている。
基板サイズは101.52mm×53.3mmです。
4.1.1 Arduinoボードの基本仕様の比較
表 Arduinoボードの基本仕様の比較
<マイクロコントローラ種別とArduinoボードの基本仕様の比較>
<基本仕様の内容> <ATmega32U4> <ATmega328> <ATmega2560> <AT91SAM3X>
・動作電圧 5V 5V 5V 3.3V
・動作クロック周波数 16MHz 16MHz 16MHz 84MHz
・フラッシュメモリ 32KB 32KB 256KB 512KB
・SRAM 2.5KB 2KB 8KB 96KB
・EEPROM 1KB 1KB 4KB -
・デジタル入出力ピン 24本 20本 70本 70本
(7本PWM出力)(6本PWM出力)(15本PWM出力) (12本PWM出力)
・アナログ入力ピン 12本(10bit) 6本(10bit) 16本(10bit) 12本()
・アナログ出力(DAC) - - - 2本(12bit)
4.1.2 入出力ピンの番号と機能対応
表 入出力ピンの番号と機能対応
マイクロコントローラ種別と入出力ピン番号の機能対応
<機能ピンの種別> <ATmega32U4> <ATmega328> <ATmega2560> <AT91SAM3X>
・デジタル 0~13 0~13 0~53 0~53
入出力ピン番号 14(MISO) 14~19(A0-A5) 54-69(A0-A15) 54-65(A0-A11)
15(SCK) 66(DAC1)
16(MOSI) 67(DAC2)
17(SS) 68(CANRX)
18-23(A0-A5 ) 68(CANTX)
・PWM出力PIN番号 3,4,6,9,11,13 3,4,6,9,10,11 2-13,44-46 2-13
・LED点灯PIN番号 13 13 13 13
・アナログ入力記号 (デジタル入出力ピンと共用)
A0~A5 A0~A5 A0~A15 A0~A15
A6-A1
(4,6,8,9,10,12)
・DAC出力PIN記号 DAC1
DAC2
上記のピン番号はArduinoボードにおけるMCUピン番号のことで、機能からの分類では必ずしも同じピン番号にならないことに注意が必要です。
つまり、Arduinoのアナログ入力ポートのソケット位置(例えば、UnoとMegaのA0~A5のソケット位置)はソケット位置は同じでも制御されるMCUのピン番号は異っています。
UnoのアナログポートA0~A5のピン番号は、ピン番号14~19ですが、Megaではピン番号54~59までが対応するピン番号ということになります。つまり、UnoボードとMegaボードのアナログポートをデジタル入出力ポートとして使用するような場合には、同じソケット位置のポートを使用する場合で有っても、そのときの操作ピン番号が異なることに注意が必要です。
このピン番号はピンモードの設定(pinMode)に使用されるpin番号です。
< 関数の機能 > pin番号の入出力モード(mode)を設定する
Arduino Unoにおけるアナログピン(A0~A5)は、本関数を使用すればデジタルピンとして使用することができるようになります。その場合、アナログピンA0がデジタルピン14とし、順次A5ピンがデジタルピン19として扱えます。
< 構文 > pinMode( pin, mode )
引数 : pin : 処理対象となるpinの番号
mode : INPUT:ピン番号(pin)を入力ピンに設定する
OUTPUT:ピン番号(pin)を出力ピンに設定する
INPUT_PULLUP:ピン番号(pin)を内部プルアップした入力ピンに設定する
戻り値 なし
4.1.3 外部割り込みに関するピン番号の対応
外部割り込みとは外部からの信号の状態によって、メイン処理に割り込んで指定するルーチン(プログラム)を実行するモードです。割り込みの処理はメインで行なっている全ての処理よりも優先してリアルタイムに実行されます。
下表 に示すように外部割り込みは特定なピンに対して発生させることができます。その場合、外部割り込み(INT0~INT5のような)は、Arduinoボード毎、より詳しくはMCU毎に異なったピンに対して行なわれる機能ということになります。
表 外部割り込みピンの番号対応
<マイクロコントローラの種別と外部割り込みとピン番号対応
<割り込み番号> <ATmega32U4> <ATmega328> <ATmega2560> <AT91SAM3X>
INT0 3 2 2 (注 )
INT1 2 3 3
INT2 0 - 21
INT3 1 - 20
INT4 - - 19
INT5 - - 18
(注 ) DueのAT91SAM3Xプロセッサでは全てのデジタルピンに対して外部入力を定義することができます。その場合、ArduinoではattachInterrupt()関数を使用して外部割り込みを設定します。
上記のピン番号はその割り込みを定義したときの割り込み信号ピンの番号ということになります。
Arduinoにおける外部割り込み番号は、前表に示す通りINT0からINT5です。
attachInterrupt()関数を使用することで所定のデジタルピンを外部割り込みの信号ソースとして使用することができるようになります。その場合、必ず割り込み処理を行う関数を作成しておかなくてはなりません。
< 関数の機能 > 割り込み番号で指定されたピンの状態による割り込みを設定する
Unoの場合は、INT0,1が利用できます。この場合の割り込みソースピンの番号は次のようになります。
INT0 : ピン番号 2, INT1 : ピン番号 3
割り込み処理関数の中では、特定にポートの状態変化を待つようなポーリング処理を行ってはなりません。できる限り簡潔に処理を終了します。また、以下の事項に注意する必要があります。
・delay関数は機能しません
・millis関数の戻り値は増加しません
・シリアル通信により受信したデータは失われることがあります
・割り込み処理関数ないで使用する変数にはvolatileを付けて宣言しておきます
< 構文 > AttachInterrupt ( Interrupt , function, mode )
<引数> Interrupt : 処理対象となる割り込み番号 0,1
function : 割り込み発生時に呼び出される関数
mode : LOW :ピンの信号状態がLOWの時に発生する
CHANGE :ピンの信号状態が変化した時に発生する
RISING :ピンの信号状態がLOWからHIGHに変化した時に発生する
FALLING :ピンの信号状態がHIGHからLOWに変化した時に発生する
<戻り値> なし
4.1.4 ハードウエアシリアルに関するピン番号の対応
ハードウエアシリアルとはMCUの内部機能として提供されているシリアル通信のことです。
ハードウエアシリアルのサポート状況はMCUの種別によって異なっています。
下表 で示す通り、ATmega2560とAT91SA3Xは4つの独立したシリアル通信機能を有していますが、ATmega328とATmega32U4は1つのみシリアル通信があります。
表 ハードウエアシリアルの機能ピンの番号対応
マイクロコントローラの種別とハードウエアシリアル機能ピンの番号と対応
<シリアル番号> <ATmega32U4> <ATmega328> <ATmega2560> <AT91SAM3X>
Serial USB通信 0(RX) 1(TX) 0(RX)
1(TX) 0(RX) 1(TX)
Serial1 0(RX) - 19(RX) 19(RX)
1(TX) - 18(TX) 18(TX)
Serial2 - - 17(RX) 17(RX)
16(TX) 16(TX)
Serial3 - - 15(RX) 15(RX)
14(TX) 14(TX)
4.1.5 ソフトウエアシリアルに関するピン番号の対応
ソフトウエアシリアルとはMCUの内部機能ではなく、Arduinoのライブラリが提供するデジタルピンをシリアル機能ピンのように処理して提供されるシリアル通信のことです。
ソフトウエアシリアルのサポート状況はデジタルピンの状況がMCUによって異なっていますから当然のことながら異なります。
下表 で示す通り、ATmega2560とAT91SA3Xは4つの独立したシリアル通信機能を有していますが、ATmega328とATmega32U4は1つのみシリアル通信があります。
表 ソフトウエアシリアルの機能ピンの番号対応
<マイクロコントローラの種別とソフトウエアシリアル機能ピンの番号と対応>
<シリアルの信号> <ATmega32U4> <ATmega328> <ATmega2560> <AT91SAM3X>
受信(RX) 8,9,10,11 0~19 任意 10,11,12,13 0~69 任意
14(MISO) 50,51,52,53
15(SCK) 62,63,64,65
16(MOSI)任意 66,67,68,69任意
送信(TX) 0~23 任意 0~19 任意 0~69 任意 0~19 任意
4.1.6 SPIに関するピン番号の対応
SPI(Serial Peripheral interface)とはMCUの内部機能として提供されているデバイス同士が4線で行なうシリアル通信機能のことです。
SPI通信はハードウエアが提供するシリアル通信なので、サポート状況はMCUによって異なっています。SPIにおけるデバイスの制御はMCU側がマスター、周辺装置側がスレーブというようにはっきりと分けられており、マスターデバイス(MCU)が周辺装置のSS信号を操作(信号がLOWに設定)することでスレーブに通信許可を与えます。
下表 で示す通り、信号ピンは概ね固定ですが、スレーブデバイスを選択するピンの番号(SS)は任意のデジタルピンを使用してもかまいません。その場合は複数のデバイスとの通信が可能になります。ただし、この場合はSS信号をユーザサイドが全てプログラムで制御しなくてはなりません。
あくまでも、Arduinoのライブラリを使用する場合は表 で指定する信号ピンを使用することが前提です。
複数のデバイスを下表 で示す4線のみで制御する場合には、信号線をディジーチェイン接続したうえで、ソフト側が適切なコマンド送出処理を行ってやる必要が生じます。
また、SS信号をデバイス毎に結線する場合はSSピンのポート制御によって、個別にデバイス通信が可能ですが、欠点として信号線が制御デバイス分必要になることです。
表 SPIの機能ピンの番号対応
・MOSI(Master Out Slave In)
・MISO(Master In Slave Out)
・SCK(Serial Clock)
・SS(Slave Select)
・SS(Master)
<マイクロコントローラの種別とSPI機能ピンの番号と対応>
<SPIの信号種別> <ATmega32U4> <ATmega328> <ATmega2560> <AT91SAM3X>
MOSI ICSP4 11 51/ICSP4 ICSP4
MISO ICSP1 12 50/ICSP1 ICSP1
SCK ICSP3 13 52/ICSP3 ICSP3
SS - 10 53 -
SS(Master) - - - 4,10,52
4.1.7 TWIに関するピン番号の対応
TWI(I2C : Inter Integrated Circuit アイ・ツー・シー)とはMCUの内部機能として提供されているマスターとスレーブデバイス同士がSDA信号線とSCLの信号線の2線で行なうシリアル通信機能のことです。
TWI 通信はハードウエアが提供するシリアル通信なので、サポート状況はSPIド同様にMCUによって異なっています。
下表 で示す通り、信号ピンは概ね固定ですが、スレーブデバイスに対する情報や返答はSCLのクロック信号に同期する形でSDA信号線から情報を取得します。この通信の特長はSDAとSCLの信号線が制御に関連する全てのデバイスに同格に接続されていることです。情報自体はSDA線に対して発信することになりますが、このときデータの授受に関連して各デバイスにデバイス番号が振られていますから、所定のデータフォーマットに従っていれば特定なデバイスとの通信が2線だけでも可能になる訳です。
複数のデバイスを表 で示す2線のみで制御する場合には、信号線を各デバイスに接続したうえで、マスタソフト側が適切なコマンド送出処理を行ってやる必要が生じます。2線信号でデバイス制御手切る点は良いのですが、制御するデバイスにこの機能がサポートされていることとそれらデバイス間の距離が近い必要性が生じるという点が欠点としてあります。
表 TWIハードウエアシリアルの機能ピンの番号対応
マイクロコントローラの種別とハードウエアシリアル機能ピンの番号と機能対応
<回線種別> <ATmega32U4> <ATmega328> <ATmega2560> <AT91SAM3X>
wire A2(SDA) A4(SDA) A20(SDA) A20(SDA)
A3(SCL) A5(SCL) A21(SCL) A21(SCL)
wire1 - - - SDA1,SCL1
Arduinoボード R3以降、デジタルソケット側のAREFピンの外側にSDAとSCLのソケットが追加されています。
0コメント