SH2とCMOS-EYEのバス接続及びシリアル接続
|
はじめに
ここでは SH2の中の、SH7144Fを搭載したマイコンボード(インターフェイス誌2006.6月号付録) と浅草ギ研製CMOSイメージセンサーボードCMOS-EYEとの接続例を紹介します。
※このページで紹介する内容はあくまでも一例です。個別の作成のご相談ご質問はお答えできませんのでご了承下さい。このページと同じ内容についてのご質問についてはロボット掲示板にてお願いいたします。
用語について
このページで説明する用語について解説します。
CMOS-EYEはマイコンと接続することが前提となっております。以下の説明で「マイコン」と書いたところは、CMOS-EYEに接続するユーザー側のマイコンを示します。マイコン側の端子名は極力、そのマイコンのデータシートに書かれている名前を記載しています。
マイコンチップが載ったCPUボードを「マイコンボード」とします。マイコンボードの端子名は極力、そのマイコンボードの取扱説明に書かれている名称を記載しています。
CMOS-EYE上にも制御用のマイコンが搭載されていますが、これは「CMOS-EYE上のマイコン」とします。(バス接続時には特にこの「CMOS-EYE上のマイコン」を意識する必要はありません。)
CMOS-EYEからはいろいろな端子が出ています。アドレスを指定する端子の集まりを「アドレスバス」とします。又、データを指定したり受けたりする端子の集まりを「データバス」とします。
CMOS-EYEとSH2
<CMOS-EYEについて>
CMOS-EYEは携帯電話用のCMOSカメラに、画像取り込み回路とSRAMを取り付けたもので、手持ちのマイコンなどと接続して小型の画像処理システムを構築できます。ロボットなどに搭載してスタンドアローンの自立型ロボットシステムを作るのに最適です。CMOS-EYEについては「CMOS-EYEの紹介・仕様・使い方」(以下「CMOS-EYEの紹介ページ」とする)のページに詳しく掲載しています。このCMOS-EYEの紹介ページはマニュアルも兼ねているので、使用前によく読んでください。特に、このページを読む前に、「ハードウェア仕様」「ピン配列」「バス接続での使い方」の節をよく読んでください。
<SH2について>
SH2はルネサステクノロジー社のマイコンで、この下位のH8マイコンはホビー用途などでよく使用されています。SHは1〜4まであり、SH1,2がマイクロコントローラ、SH3,4がプロセッサとなっており、組み込み用途では主にSH1,2、小型携帯端末などのようにプログラムをRAM上に展開して、場合によってはOSなどを載せる場合はSH3,4という用途で作られているようです。
今回使用するSH2の種類の中のSH7144はクロック周波数が最大50MHzというもので、計算を高速化するいろいろな機能が入っているようです。
プログラムはSH2フラッシュメモリ内部のフラッシュメモリに書き込まれます。書き込み回数は保証値で100回ですが、実際は1000回ぐらいまではいける、ということです。私の所感では、勉強用のマイコンで書き込み回数1000回というのは微妙な値だと思います。書き込み回数を超えないように注意が必要です。
<SH7144マイコンボード(インターフェイス誌の付録)>
今回は、インターフェイス誌の付録にである、SH2マイコンの種類のSH7144というCPUが載ったマイコンボードを使用します。お試し版とはいえ、期限無制限の開発環境が付いており、インストール方法から解説が載っているので、使いはじめるには非常に良い環境と言えます。一般的なSH2マイコンボードの価格は数万円しますが、1500円でSH2マイコンボードが入手できるというのも魅力です。大型書籍店などでは、バックナンバーを大量においているところもありますので、まだ入手は可能かと思われます。また、書籍が売り切れになっても、同じボードが販売されるようです(価格は同じではないと思いますが。)。
しかし、実際に使ってみた所感としては、本にも書いてありますが、電源の起動の仕方によっては上手く動作しない場合がありますので注意です。特に、マイコンボードの電源端子にバッテリなどをそのままつなぐと、非常に高い確率(今回の実験では2回に1回ほど)で起動しないことがありました。この仕様はロボット製作にとっては問題があります。
以降の解説はこのマイコンボードを使って行いますが、予算に余裕がある方は、市販のSH2マイコンボードを購入した方が良いような気もします。尚、サンプルプログラムについては、マイコンボードが変わってもあまり影響の無いように考慮はしていますが、お手持ちのマイコンボードの端子などをよく確認して下さい。特にヘッダファイルが違うと、端子名の定義のところは変わります。以降の画像処理のプログラムロジック部分はなるべくそれらに影響しないように考慮しています(しているつもりですがよく確認して下さい)。
<開発環境>
SHやH8の開発環境は、ルネサスから無償の開発環境であるHEWが入手できます。しかし、以降の説明では、バージョン違いによる表記の違いなどが無いように、インターフェイス誌の付録に付いている環境で説明します。
HEWは無償なのはアセンブラ開発までで、C言語で開発する場合は十万円ほどのコンパイラがルネサスより販売されています。また、サードパーティでその半額ぐらいのCコンパイラも出ているようです。
付録には制限付きのCコンパイラが無償でついていますが、サポートはなしなので、本格的に使おうと思ったら苦労するかもしれません。 あまりマイコン開発の経験が無い方で、勉強や調べる時間を使いたくないという方は、市販のCコンパイラを購入することをお勧めします。
尚、以降の説明では、プログラムの中心部分はなるべく、マイコンの種類や開発環境・Cコンパイラの種類に依存しないように書くことを心がけています。
SH7144Fに接続する端子の検討
CMOS-EYE紹介ページを見ると、マイコンとの接続は下のようになります。これはバス接続時の図ですが、シリアル通信命令も使ってみますので、UARTのRXとTXも接続します。
<バス接続時に必要なIO(ここではUARTのRXとTXもつなぎます)>
SH7144Fのデータシートと、本にある回路図を見ながら、CMOS-EYEと接続する端子を検討します。
とりあえず、データシートを見ながら以下のように端子を割り振ってみました。
<端子割り付け案(SH7144FFデータシートの概要の内部ブロック図より)>
TEST端子ですが、これはCMOS-EYEにはありません。後のページで、画像処理にかかった時間を計測するために利用することにした端子で、処理の前後にこの端子をHIGH/LOWさせてオシロスコープでその波形を観測して時間を測定しようと思います。(このページではそこまでいきません)。
本付録のマイコンボードは、プログラムをダウンロードするのにシリアルポートを1つ使用していますが、SH7144Fはシリアルポートが4個ありますので空いている1つはCMOS-EYEと接続してシリアル命令も使えるように考えました。SH71444Fのデータシートの記載によると、シリアル端子はチャンネル0〜4と表示されますが、マイコンボードの回路図を見ると(本参照)チャンネル1がプログラムポートになっているようです。さらにチャンネル0はRS232C電圧変換ICを経由してマイコンボードの外に出ているので、これはCMOS-EYEとは接続できません。ここでは空いているチャンネル3を使うことにしました(端子名だとPE11とPE12になる)。マイコンのTXはCMOS-EYEのRXへ、マイコンのRXはCMOS−EYEのTXへつなぎます。
マイコンボードは外に出している端子を全てJ1とJ2に出していますので、上の図を参考に、本のJ1、J2の端子の場所を確認して接続してください。(本のP70の回路図と上の図を参照することになります)
実際の接続
下は、マイコンボードとCMOS-EYEの接続を図にしたものです。J1とJ2に出ている端子を、本の回路図を見ながら接続しました。TEST端子だけは、CMOS-EYEには無いもので、ここは、後で画像処理プログラムがどのぐらいの時間がかかるかのテストをするためにオシロへ接続してます。ということで実動作はTESTは無くてもいいです。
マイコンのシリアル”送信”端子はCMOS-EYEのRXへ、”受信”端子はCMOS-EYEのTXへ接続しますので注意して下さい。
今回はテストなので、CMOS-EYEとマイコンボードにヘッダピンを取り付けて、その間を一本づつコネクタで接続しました。 その様子は下のようになります。写真の黄色い線のコネクタは2550コネクタというのを使ってます(浅草ギ研で販売してます)。このケーブルの作り方はこのページでやってますので参照してください。一本づつのコネクタだと配線を変えられるので実験に最適です。(使いまわしもできます。ブレッドボードの逆ですね。)
線はAWG28相当の太さのものを使ってますが、実際にロボットに組み込むときにはもっと細い線&小さいコネクタを使用した方が良いでしょう。
マイコンボードのプログラム用のケーブルは、本ではD-subコネクタを取り付けるようになっていますが、回路を見ると、ようは送信、受信、信号GNDだけをつなげば良いようなので、3並列のケーブルを使って3本しかつないでません。これでもプログラムをマイコンボードへ転送することができました。なにかに組み込むときに、コネクタ部が大きくなってしまうのはいやなので、このパターンにします。
上の写真では、CMOS-EYEは自作板金パーツに取り付けています。
一応、板金パーツの図面も載せておきます。ご参考まで。サーボホーン用の穴をあけてありますので、ヨー軸方向にカメラを回転させることもできる、というものです(が実際に使うかどうかは?)。CMOS-EYEは2φ5mm長のスペーサとM2L8ネジあたりで止めています。これらはWILCOで買えます。
センサ部の取り付け金具はCMOS-EYEに付属しているものを使いました。
サンプルプログラム
CMOS-EYEを動かすのに使う基本的な動作を関数にしました。またそれらを使って簡単にCMOS-EYEを動かしてみました。全ソースプログラムはこちら
CMOS-EYE_SH2.c (右クリックで対象を保存)
これは、
1) ST端子を使って撮影してみる
2)シリアル通信で命令を送って撮影してみる
3)CMOS-EYE上のSRAMに値を読み書きしてみる
という流れになります。この、撮影、SRAM読み書き、シリアル命令が実装できれば、CMOS-EYEを使いこなすことができます。
以下、詳細を説明します。
サンプルプログラム−ヘッダーファイルと名称定義
ヘッダーファイルは今回の環境に付いている iodefine.h を使っています。この中で、IOへアクセスする構造体などが記述されていますので、どのようにしてIOにアクセスするかはこのファイルの中を見て、理解します。
名称定義は、上で検討・接続したピンをわかりやすいように名称定義しておきました。このようにすることで、ハードウェアに依存する部分以外の関数などは、違うマイコンを使った場合でも同じ記述で大丈夫になります。実際、以降のプログラムはほとんどがH8のページで作ったものをそのままコピーして使っています。大きく違うところはタイマーを使う部分ぐらいでしょうか。
※上の写真のTESTのところが間違ってました。正しくは最後のB4がB2です。PA2を指定してるので。
アドレスは19本必要なので、ポートCと、ポートBの一部を使っています。これらを使ったアドレッシングについては次で説明します。
IO方向ですが、データバスだけは双方向の通信を行うので、入力と出力を切り替える必要があります。よって、入出力の方向を設定する、ポートDのIOレジスタにDATA_DIRという名称をつけてます。
各ポートの、IOレジスタは 0で入力 1で出力 となっています。初期値は0入力になっています。データシートを見なくてもわかるように、ここでは INPUT OUTPUT の名称をつけてます。よって、たとえば、データバスの方向を変えたい場合は
DATA_DIR = ALL_OUTPUT;
のように記述できます。
サンプルプログラム−アドレスセット
CMOS−EYEのアドレスはA0〜A18の19本あります。SH7144FのIOポートは16本のものが最大ですので3本足りないので、他のポートと合体させて19本のアドレスバスを形成します。
名称と端子の関係は上の名称定義を参照してください。
サンプルプログラム−IO初期化
初期化部分です。各端子のHIGH/LOWの初期値と、入出力の方向などを指定します。
※上の写真のTESTの方向設定のところが間違ってました。(行143)正しくはB4のところがB2です。
−−−タイマ設定−−−
CMOS−EYEの起動終了を待ったり、撮影時のタイミングを調整したりするのにウェイト関数を作っています(下で説明)。これはタイマを使って簡単に待ち時間を作っているもので、タイマを使用しますのでその設定をします。タイマは今回、MTU0を使用しました。設定方法などはデータシートを参考にしました(詳しくはデータシートを参照願います)
−−−IO方向定−−−
IO方向は各IOレジスタで設定します。ほとんどはCMOS−EYEに対しての出力になります。データバスは双方向になります。BSYだけはCMOS−EYEからの情報を受け取りますので入力にします。
−−−シリアルポート設定−−−
CMOS−EYEに対して命令を送るシリアルポートは今回SCI3(チャンネル3)を使用しています。設定方法の詳細はデータシートにて確認して下さい。通常のマイコンと違う点で、「起動時にはシリアル通信機能はスリープモードになっている」というところです。データシートのシリアルポートのところだけしか読まないと、スリープモードで動かないということになりますので注意して下さい。また、送信時のフラグの扱いも、H8などとは違うようですので注意しましょう(よくデータシートを読みましょう)。
−−−初期値−−−
とりあえずの値をセットします。
モード指定やSRAMコントロールについては「CMOS-EYEの紹介」のページで説明しています。
サンプルプログラム−ウェイト関数
ウェイト関数を作りました。かなーり適当に作ったので、正確な時間はウェイトしません(少し長い)。
本来はこのような方法ではなく、コンペアマッチか割り込みでタイマを動かすともっと正確なのができますが、時間の正確さはあまり必要でないのでこれでよしとします。他のプログラムなどに流用しないように注意して下さい。
タイマの値ですが、本当は1mSですと、外部IOが24MHzなのでプリスケーラが1/64のときには375になります。下のプログラムはタイマが動く以外にも
while やら for やらが動いてるので1mSよりも時間がかかり、引数のms_timeの値が大きくなるにしたがって誤差も大きくなります。下では値が350カウントで1mSとしてますが、この値は時計を見ながら大体で調整しました。すいません。
サンプルプログラム−シリアル送信関数
ヘッダファイルの iodefine.h を見ると、4つある各シリアル機能のIOのアドレスはSCI0〜SCI3と定義されてます。今回はチャンネル3を使いますのでSCI3を使います。シリアルデータを1バイト送信するには、トランスミットデータレジスタ(TDR)に値をセットすると自動で送信されるようです。連続でデータを送る場合は、TDRの値が送信され終わってから次のデータをセットする必要があるので、シリアルステータスレジスタ(SSR)のトランスミットデータレジスタエンプティフラグ(TDRE)を見ながらセットする必要があります。データセット後はフラグをクリアする必要があるようです。
ということで作った関数が下のようになります。配列にデータを入れておき、配列のポインタ(先頭アドレス)と長さを渡すと送ってくれるという関数です。
サンプルプログラム−SRAM読み書き関数
CMOS−EYEのSRAMへアクセスする部分を関数化したのが下の部分になります。SRAMへのアクセス手順についてはCMOS−EYEの紹介ページにタイミングチャートなどがありますので参照願います。
基本的には、CEとWEとOEをHIGHにしておき、書き込み時にはWEをLOW、読み込み時にはOEをLOWにします。
タイミングチャートでは、CMOS−EYEのSRAMへのアクセスタイムは30nSとなっています。このマイコンボードでは、外部IOクロックが24MHzとなっているので、最速で切替ても41.6nSはかかりますので、ノーウェイトで操作しても大丈夫なはずです。詳しくは確認してませんが、下のような感じで問題なく動いてます(行222と行223の間にウェイトしなくてもきちんと書き込まれる。)。
コメントにもあるように、CEの操作と、データバスの操作を入れてませんので、これらの関数を呼び出す前に CE=LOWにして、データバス方向を設定しておく必要があります。(この方がプログラム全体が速いかと思ったので)
サンプルプログラム−撮影関数
ST端子を使って撮影をする関数を作りました。
ST端子を数百μS以上LOWにするとCMOS−EYEは外部バスをハイインピーダンス状態にして、撮影を開始します。ここで注意点ですが、ST端子をLOWにするとその瞬間に撮影されるのではなく、撮影には約100mSかかりますので、STをLOWにした後に次の指示をだそうとしても受け付けません。よって、ここではBSY端子を監視することで撮影が終了するのを検知してから、関数を終了させています。
この間の時間も他の処理のためにSH2を動かしたいという場合は、CMOS−EYEのBSY端子を外部割込みが出来る端子につないで割り込み処理をすると良いでしょう。
サンプルプログラム−main(全体の流れ)
上で紹介した関数を使って、
1)ST端子を操作して画像を撮影してみる
2)シリアル命令を使って画像を撮影してみる
3)SRAMになにか書き込んで呼んでみる
という動作をさせてテストしてみます。これらは単純に上の関数を使えばよいのですが、実は起動時にポイントがあります。CMOS-EYEは起動時や設定のときに時間がかかりますので、それらが終わるまで待つ必要があります。これを忘れると、意図したとおりに動かないので注意が必要です。
下はmainの中心部分です。行266はCMOS−EYEが起動するまで待っています(3秒ぐらいでもOK)。また、行272はM0とM1の設定終わるまで待っています。作った自分が言うのもなんですが、私もこの2つを入れてなくて意図した通りに動かなくて悩むことが多いです。注意して下さい。(自分で作った仕様を忘れてしまう...)
細かいところはソースのコメントを参照願います。
実際に動かしてみる
ソースプログラムを動かして、CMOSEYE Viewerで確認した画像が下になります。
CMOS−EYE ViewerはCMOS−EYEの紹介ページからダウンロードできます。このソフトウェアはPCで画像確認するためのサンプルプログラムとして作ったものですのでご注意下さい。ソースも公開していますので改良などを行う場合はそちらを参照してください。
撮影1の画像(0番地から160x120カラーで格納されている)
撮影2の画像(57600番地から格納されている)
10万番地から20バイトの値を表示したところ
プログラムの通りの値が入っています。
画像1と画像2では色合いが若干違います。これはAWB(オートホワイトバランス)機能が働いているためです。カラー画像処理のときは、この機能はジャマなので、AWBをオフにすると良いでしょう。AWBオフはシリアル命令で行います。
おわりに
このように、SH2で画像処理をすることができそうです。次は色判定について解説します。
2006年8月23日
|
|
|