【おしらせ】
・2007.2.14 生産ロットによって、シリアルコマンドの命令4にバグのあるものが発見されました。シリアル接続で、命令4をUART端子指定で使おうとしてもデータが送られなかった場合は、恐れ入りますが浅草ギ研まで商品を着払いにて送付願います。こちらでファームウェアを書き換えた上でご返送いたします。お手数をおかけしており申し訳ありません。
<このページのもくじ>
・製品の概要
・ハードウェア仕様
・CMOS-EYEを使うために必要な条件と、実現可能なこと
・ピン配列
・外形図
・価格
・撮影画像及び、画像処理の例
・画像フォーマットとメモリ領域
・バス接続での使い方
・シリアル接続での使い方
・IOを3.3Vから5Vに変換する方法
・撮影した画面をPCで確認する方法
・画像処理の勉強について
・接続例とサンプルプログラム
・Q&A
・故障/不具合と思ったら?
・質問について
・オプション5V変換ボードの説明のページ
注意)
※製品をご購入前に「このセンサーを使うために必要な条件と、実現可能なこと」をよくお読み下さい。
※このページは、マニュアル及び、仕様書を兼ねています。
※使用前に、このページをよくお読み下さい(特に注意、注釈のところもよくお読み下さい)。
<使用上の注意>
・このセンサーボードは電子機器です。作業時、輸送時には静電気対策を行ってください。ICの足や、各ピンを直接手で触ったりすると静電破壊される場合があります。
・バッテリ使用時には電源ラインをショートさせると、バッテリが破裂・発火する可能性があります。作業中にはショートさせないよう十分注意して下さい。また、取り付け後も、あいている電源ラインに導電物質が触らないように注意して下さい。
・CMOS-EYEのセンサー部はFPCコネクタに接続されていますので抜き差しが可能ですが、非常にピン間が狭いコネクタなので、抜き差しするときちんと接続されない場合があります。特に、電源とGNDが近いので、斜めに挿入するとショート状態となり破損する可能性があります(数十秒のショートなら大丈夫です)。 よって、センサー部は極力取り外さないようにしてください。出荷時にはきちんと接続されているか確認されています。
もし、外さなければならない場合になったら、ショートしているかどうかは、目玉の面の黒い大きなIC(3本足)が、電源投入後すぐに非常に熱くなりますのでこれで確認できます。電源がバッテリの場合はショートしてバッテリが発火する可能性がありますので、壊れても良いAC電源などでテストしてください。(やけどに注意して下さい。また、ICの足には触らないようにしてください。)
・下の写真の位置の取り付け穴の近くに、パターンがむき出しになっている場所(Mの字の左上の丸い場所)があります。この穴をネジ止めする場合は、電気を通さないネジをご使用下さい。この裏面も同様です(スルーホールなので)。(リリース後に発見されました。申し訳ありません。)
ネジがむき出しパターン(スルーホール)に接触している。
・添付の取り付け金具の穴の大きさはセンサとほぼ同じ大きさになっています。金具の穴はセンサよりも若干大きいですが、差し込む方向が少しでもななめになると入りません。強くセンサー部を押すと、センサーが壊れますので注意して下さい。差し込む方向がまっすぐの場合は軽い力でも入りますので根気よく差し込んで下さい。
また、センサー部のピントはメーカー側で調整され、ボンドで固定されています。このボンド部がはみ出しているために金具の穴に入らない場合があります。この場合はボンド部をカッターなどで軽くけずってみて下さい。
・電源端子は、プラスとマイナスを逆につなぐとほぼ間違いなく壊れますので注意して下さい。ショートは数十秒なら耐えられます。
<製品の概要>
■マイコンと接続して使用する、スタンドアローンのイメージセンサモジュール
イメージセンサモジュール CMOS−EYE は、携帯電話用の超小型CMOSイメージセンサに、画像取り込み回路とSRAMをつけたもので、撮影した画像は白黒又はカラーでSRAMに格納され、マイコンからSRAMアクセスすることで自由に画像処理・認識を行うことができます。
※ユーザー側で用意した任意のマイコンをつなぎます。
■ホームページで画像処理プログラムについても解説
ホビーでの画像処理・認識などは初めて、という方も多いと思います。浅草ギ研では、各種マイコンからCMOS−EYEの画像にアクセスして、画質改善・画像フィルタ・二値化・かんたんな画像認識・色位置判定などを行う、基本的なプログラミング例を紹介します。(このページ下の方で解説)
■撮影・処理画像をPCでモニタリングが可能
CMOS−EYEにはRS232Cインターフェイス及び専用PCケーブルが付属しており、SRAM内のデータをPCなどへ転送することができます。転送されたデータをPC上での画像表示するには、ユーザー側でPCアプリケーションプログラムを組む必要がありますが、浅草ギ研では、Windowsの.NET環境での画面表示プログラムを配布しています。また、このプログラムのC#でのソースも公開しています。
※シリアル通信によるPCへの画像転送は、CMOS−EYEとマイコンを使ったシステム開発のデバック用です。転送速度などの面で、CMOS−EYE+PCでの本格的なロボット作成は難しく、CMOS−EYE+マイコンでの高速アクセスによる画像処理を基本に考えられています。
■内蔵の簡易画像処理プログラム
CMOS−EYEは、基本的には、マイコンとCMOS−EYEのバス接続による高速画像処理を想定して作られています。しかし、手持ちのマイコンのIO数が足りない場合でも、シリアル通信経由での命令を送ることにより、撮影した画像を、内蔵の簡易画像処理プログラムで加工したり、情報を得たりすることが可能です。シリアル通信命令でできることは、下の「シリアル通信での使い方」を参照して購入前に確認してください。
■選べる解像度
320x240、160x120、80x60の3種類の解像度を選択できるので、処理の内容によって解像度を使い分けることができます。
■他のAGR65シリーズに接続可能。CMOS−EYEとのバス接続で、手持ちのマイコンのIOを使い切っても、シリアルIOが残っていればサーボやセンサなども同じマイコンで動かすことができる
オプションの5V変換ボードを装着することにより、ロボット神経システムAGB65シリーズのセンサやコントローラと同じシリアルラインを共有できます。AGB65シリーズについては「ロボット神経システムAGB65シリーズの説明」のページを参照願います。
■電源搭載で外部に電源回路不要!バッテリ駆動が可能!
ボード上に電源回路を内蔵し、外部に電源回路が不要で、バッテリなどで駆動することができます。
■39x46mmの超小型設計!
ロボットに基板を搭載する場合はその大きさがネックになりますが、CMOS−EYEは極力小さい部品で構成されており、実装面積が小さくて済みます。
<イメージセンサ部仕様>
画素
|
640x480ベイヤーパターン ※CMOS-EYE全体では320x240が最高解像度です。(*1) |
画像補正
|
自動露出/オートホワイトバランス/RGBオートゲイン/蛍光灯フリッカ補正
|
画面方向
|
上下左右に反転可能 ※CMOS-EYEのシリアルIO経由で設定します。
|
寸法
|
寸法8x8mm |
<光学特性>
レンズ構成
|
2群2枚 |
F値
|
2.8
|
水平画角
|
50度 |
撮像範囲
|
20cm〜無限大 |
OPLF
|
なし |
IRCF
|
あり |
TV歪曲
|
<1.0% |
<モジュール部仕様(CMOS-EYE全体の仕様)>
電源電圧
|
+4.8〜+15V (*2) |
IO電圧
|
3.3V (オプションボード装着により、5V可能) |
消費電流
|
平均35mA 最大45mA |
記録フォーマット
|
320x240 160x120 80x60
ドットの、RGB又は白黒 8bit データでSRAMに保存 |
SRAM容量
|
512KByte (320x240カラーで2画面、80x60白黒で109画面分) |
アクセス速度
|
外部から画像へのアクセス速度 30nS
(*3) |
撮影所要時間
|
70〜100mS (*4) 約10fps |
バス接続
必要IO数
|
【マイコンとバス接続する場合にマイコン側に以下の本数のIOが必要です。】
アドレス(IN) 19本(解像度が最低の場合でも13本以上必要)
データバス(IN/OUT) 8本
SRAMコントロール(IN) 3本 (CE,OE,WEの3つ,SRAMの使い方は下で説明)
解像度・カラー/白黒コントロール(IN) 3本
シャッター端子(IN) 1本 (*5)
BUSY出力(OUT) 1本 (*5)
合計 35本 (*5:最低33本) ※(IN)はCMOS-EYEへの入力 (OUT)はCMOS-EYEからの出力
|
他インターフェイス
|
RS232Cポートx1 UART(3.3V)x1 シリアル通信により命令を送る場合に使用 |
固有ID
|
98/99 スイッチにより2種類に切替可能
(*6) |
内蔵プログラム
|
【シリアル通信命令により下記処理が可能】
※バス接続時の同様の処理のサンプルプログラムを下で紹介しています。
●基本処理:撮影/画面反転/ソフトウェアリセット/画面コピー/四角形書き込み
●濃度変換:ガンマ補正/コントラスト強調 など
●画像フィルタ:雑音平滑化/微分(エッジ検出)/高域強調(ボケ・ブレ改善) など
●二値化処理:固定しきい値二値化/収縮・膨張/細線化/ラベリング など
●色処理:色・色相記憶/色・色相領域判定/色・色相領域マスク など
●動体検知:2画面の差の位置検出 など
●その他:ヒストグラム計算 など |
寸法/重量
|
寸法39x46mm 穴ピッチ35x42mmφ2.2 重量:10g |
付属品
|
■PCケーブルx1 |
(*1)デジタルカメラなどと違い、マイコンでの画像処理の場合は、マイコンの処理スピードが低いので、あまり解像度を上げるとシステム全体の処理速度が非常に遅くなり、ロボットのセンサとしては現実的な速度が出せません。また、各種認識など、通常は160x120程度画素でほとんどの用途が足ります。
(*2)電源は5〜9Vのバッテリ駆動を想定して作られています。10Vを超える電圧の場合は、基板上のレギュレータIC(目玉が書いてある面のIC)が非常に熱くなりますので注意して下さい。熱による誤動作を防ぐ為、可能であれば、10V以上のバッテリを使用する場合には5V付近まで降圧して接続してください。放熱FANの取り付けなどにより熱対策を行う場合は、電圧が高くても熱による誤動作を防ぐとこができます。CMOS-EYEは内部3.3Vで動いており、レギュレータに余裕があるので、基板上の3.3V端子からは、外部に約700mAまで供給することができます。
(*3)オプションボードを装着して5V仕様にすると、アクセス速度は+8〜10nS余分にかかります。つまり全体で約40nS以上となります。
(*4)撮影所要時間は、撮影するタイミングで70〜100mSに可変となります。撮影中はBSY端子がLOWになりますので、これで撮影終了を検知します。撮影所要時間は解像度には依存しません(実際には解像度によらず640x480ベイヤーパターンをスキャンしてしまう。)
(*5)シャッター指示は、RS232C又はUARTへシリアル通信で命令を送ることによっても指示できます。撮影終了タイミングをシビアにみない場合はBUSY端子を使用しなくてもかまいません。その他のIOは、バス接続時には必須です。
(*6)オプションボードを使用して、ロボット神経システムAGB65シリーズと、シリアルラインを共有する場合は、IDでどのボードに対しての命令か判定します。シリアル通信による命令については以下で詳しく説明します。
−もくじへ戻る−
<CMOS-EYEを使うために必要な条件と、実現可能なこと>
■CMOS-EYEの主旨
CMOS-EYEは基本的に、ユーザー手持ちのマイコンに接続して画像処理や認識を行うことを想定としたモジュールです。また、マイコンで画像処理システムを作る場合には、撮影したり計算した画像をモニタする仕組みが必要になりますので、開発中はPCで、撮影画面をモニタできるようになっています。
■CMOS-EYEを使ったシステムの方向性
CMOS-EYEで、高速に動く画像認識システムをロボットなどに組み込む場合には、50MIPS(一命令1クロックで動くマイコンの場合、駆動周波数が50MHzのもの)以上の処理能力があるマイコンが適しています。2006年7月現在で、ホビー用途で入手可能なマイコンボードの中でこれに相当するのは、インターフェイス誌の付録にもなったSH2があります。当ページでは、SH2での使用方法も解説します。
H8、PIC、AVR、ARM7などでロボットを作っている方が多いかと思います。これらは大体20MIPS以下程度の処理能力のものが多いようです。本格的に、リアルタイムに近い画像処理システムを作ろうとする場合は、プログラムを工夫したり、処理内容によって解像度を最低の80x60にしたりすれば、実用的なロボットシステムを作ることも可能です。H8、AVRの上位機種、例えばtinyではないH8、ATmega128(AVR)、ARM7などでは、浮動小数点演算を極力しないようにしたり、三角関数を計算ではなくテーブル参照で求めたりすれば、ある程度実用的なシステムを作ることができます。(プログラム例で詳細を解説)
H8tinyや、一般的なPIC(12F,16F,18Fシリーズ)の場合は、まずIO数が足りないので、バス接続は難しいでしょう。しかし、CMOS−EYE内蔵プログラムを組み合わせた処理だけを行うのであれば、なんらかの画像センサーシステムとして使うことはできます。ちなみに、これらのマイコンは1命令が数クロックで動いたりするので、駆動周波数が高くても計算が速いとはいえない場合がありますのでお手持ちのマイコンの仕様をあらかじめ確認することをお勧めします。例えばPICの場合はほとんどの命令が4クロックで動くので、18Fシリーズあたりを20MHzで動かしても大体5MIPSになります。
CMOS−EYE内蔵のプログラム(画像フィルタなど)は、約14MIPSのマイコンで計算しています。各プログラムは80x60の解像度の時、速いもので100〜300mS、時間がかかるもので3秒ほどかかります。よって、5MIPSのマイコンとバス接続した場合は、300mSかかる計算は840mSとなります。体感で、300mSはさほど時間がかからないように感じますが、1秒近いと明らかに時間がかかっているのがわかります。逆に、300mSかかる処理を50MIPSのマイコンで計算すると、84mSと一瞬でおわることになります。
CMOS−EYE内蔵プログラムは、各値をきちんと計算しており、浮動小数点演算を多用したり、三角関数を計算で求めていますので、プログラミングによっては、14MIPS以下のマイコンをつないだ場合でも計算が速い(しかし、値は近似値で出る)ということもありえます。また、内蔵プログラムは、画面全ての領域に対して計算してしまいますので、なんらかの方法で画面の一部だけを計算するという方法も考えられます。
■マイコンの種類と、条件・実現可能なことの関係(まとめ)
<基本条件>
・マイコンの開発が行える環境を持っている
・マイコンのプログラミングができる
・PCを持っている(COMポートの空きが1つあること)
・インターネットが使用できる環境がある
・端子をハンダ付けする必要がある
<SH2などの3.3V駆動の高性能マイコンでシステムを構築する場合>
・IOに十分な空きがあることが必要ですが、この手のマイコンはIO数が多いものがほとんどなのでまず問題ないと思われます。
・CMOS−EYEとマイコンボードだけで、実用的なロボットの画像処理・認識システムの構築ができます。
<H8、AVRの上位機種(ATmega128など)、ARM7などのマイコンでシステムを構築する場合>
・5V駆動のマイコンボードが多いと思いますので、5V駆動の場合は、CMOS−EYEの3.3VIOを5Vに変換する回路を作る(下で説明します)か、オプションの5V変換ボードを購入する必要があります。
・IOの数が多いCPUの場合は、バス接続することができます。このとき、計算速度を速くするようにプログラムを考慮すれば、処理内容によっては実用的なシステムが作れます。
・IOが足りない場合は、シリアル通信のIO端子が空いていれば、CMOS−EYEに内蔵された画像処理のみを行うことは可能です。このとき、5V駆動のマイコンの場合は、マイコンのTXを5V−>3.3Vへ、マイコンのRXに5V<−3.3Vに変換する回路を作る必要があります。(オプションの5V変換ボードでもTX,RXを電圧変換しますが、シリアル機能しか使わない場合はコストパフォーマンスが悪いので、回路を自作することをお勧めします。変換方法については下で説明します。)
<H8tinyや一般的なPIC、AVRの下位機種(ATmega32など)でシステムを構築する場合>
・5V駆動が多いと思いますので、5V駆動の場合は、CMOS−EYEの3.3VIOを5Vに変換する回路を作る(下で説明します)か、オプションの5V変換ボードを購入する必要があります。必要があります。
・IO数が足りないものがほとんどだと思いますので、基本的にはシリアル通信経由の命令により、CMOS−EYE内蔵プログラムの処理のみを行うことになります。その中で、速度などの面で実用的なものには「色の記憶と位置判定」、「動体位置判定」があります。
・実用的な速度ではなくても、画像処理システムの入門、勉強にはなります。
■市販のロボットキットとの接続
2006年7月現在の市販のロボットキットに付属しているコントローラ(基板のこと)のほとんどは、ユーザーが自由にプログラミングできないか、大量のIOを自由に使うことができないものが多いと思います。手持ちの市販ロボットキットを活用したい場合は、現時点では、フレーム・サーボ・筐体(外装)だけを使い、ユーザー自身で開発可能なマイコンボードに乗せ変えるのが現実的です。
但し、ロボットのコントローラのシリアルIOが自由に使えて、かつ電気的に接続が可能(3.3V又は5Vからの変換が可能)で、なおかつ独自の通信制御をしていない(ACKなどを使用していない、フロー制御していない、ソフト的にパリティエラーチェックをしていない)場合は、CMOS−EYEの内蔵プログラムのみを使うことはできます。
現在、これに該当するものに、姫路ソフトワークスのHSWBシリーズがあります。浅草ギ研では、HSWBシリーズとの接続検証を行う予定があります。(場合によっては、CMOS−EYE発売後のファームウェアバージョンアップ時の対応になる可能性があります。)
参考として、以下に、マイコン別での処理時間を実験してみた結果を示します。処理内容は、バス接続で典型的な処理である周囲8近傍処理の空間フィルターである、「二値化画像の縮小処理」(サンプルプログラムのところで紹介してます)を行った場合の処理時間です。
マイコン |
内部クロック |
IOクロック |
処理時間 |
SH2(SH7144F) |
50MHz |
24MHz |
96mS |
CMOS-EYE内蔵PG |
14.7Mhz |
14.7MHz |
310mS |
AVR(ATmega128) |
16MHz |
16MHz |
1040mS |
H8Tiny(3687F) |
20MHz |
? |
1200mS |
※(撮影時間は除く)
−もくじへ戻る−
<ピン配列>
−もくじへ戻る−
<外形図>
−もくじへ戻る−
<CMOS-EYE価格>
価格 29,800円(税込み)
<付属品>
・PCケーブル
・センサー取り付け金具(アルミ製)
<オプション>
CMOS-EYE-5V 10,500円(税込み)
※CMOS−EYEに装着して、IOを5Vに変換する基板。ロボット神経システムAGB65シリーズとコネクタ互換。
CMOS−EYEのファームウェアの書き換え方法とソースプログラムをご提供することも可能です。個別にメールにてお問い合わせ下さい。(条件によりますが、数十万円単位と高額になりますのでご了承下さい。)
−もくじへ戻る−
<撮影画像及び、画像処理の例>
■撮影例
白黒80x60
白黒160x120
白黒320x240
カラー80x60
カラー160x120
カラー320x240
■画像処理例(内蔵プログラムを使用。接続したマイコンでのプログラム例も下で説明)
<ニ値化画像の処理例>
1)白黒160x120撮影 |
2)ニ値化 |
3)細線化 |
|
|
|
4)図形抽出1 |
5)図形抽出2 |
|
|
|
|
※4)は、3)の図形で「外周にかかっていない、連結数4が1個、端点数が4個」の図形領域を抽出という条件
※5)は、3)の図形で「外周にかかっていない、連結数3が1個、端点数が3個」の図形領域を抽出という条件
連結数は交点の線数です、詳しくはプログラミング例で詳細を説明します。
<カラー画像処理の例>
「80x60撮影」−>「色抽出」−>「1ライン縮小」−>「1ライン膨張」
その他の動作も、画像処理の組み合わせ次第でいろいろとできます。
−もくじへ戻る− |
<シリアル接続での使い方(接続)>
■接続図(一般)
※5V駆動マイコンと接続する場合には、電圧変換回路を自作するか、オプションの5V変換ボードを装着します。
電源端子
4.8〜15Vの電源を取り付けてください。CMOS−EYEは内部1.8〜3.3V(IOは3.3V)で動作しています。10V以上の電源を取り付ける場合は、電圧レギュレータIC(目玉の書いてある面のIC)が非常に熱くなりますので注意して下さい。
電源には、乾電池、ラジコン用のバッテリ、ACアダプタなど、電圧が合えばどんな電源でも使うことが可能です。但し、CMOS−EYEの3.3V端子からマイコン(又は外部回路)へ電源を供給する場合は、
電源の出力可能電流に注意して下さい。たとえば、9V乾電池を使う場合、一般的な9V乾電池は数百mAしか出力できません。CMOS−EYE自体は最大45mAしか消費しませんので問題ありませんが、外部に乾電池の出力容量以上のマイコンなどをつなぐと、乾電池の電圧が下がって誤動作する可能性があります。「外部へ供給する電流+1.5A」以上の出力が出る電源を推奨します。外部へ供給できる最大電流は約700mAですので、最大電流を供給する場合には、2.2A以上出力できる電源が望ましいです。
GNDは、CMOS−EYEのGNDと、マイコンのGNDを接続してください。
A0-A18端子
シリアル通信命令を使用するときには、A0-A18で設定したアドレスを先頭に撮影データが記録されます。この撮影先頭アドレスをシリアル命令で変えることはできません。(回路を小さくするために、やむをえずこのような仕様になっています。)各端子はハード的にLOW(GNDにつなぐ)か、HIGH(2〜10KΩの抵抗を経由して3.3V端子につなぐ)に設定してください。
SRAMコントロール端子 CE,OE,WE
シリアル接続だけで動かす場合は、SRAMコントロール端子を直接駆動することは行いませんので、全ての端子をHIGH(2〜10KΩの抵抗を経由して3.3V端子につなぐ)に設定してください。
画面モード指定端子 M0-M2
画面モードは、M0-M2で設定します。画面モードはシリアル命令で変えることはできません。各端子をハード的にHIGHかLOWに設定してください。尚、マイコンのIOが空いている場合には、ここにだけIOをつないで、モードを切り替えることはできます。
抵抗値は2〜10KΩの抵抗を使いますが、抵抗値が小さいと電流を多く消費し、大きいと応答速度が悪くなります。一般的なマイコンの場合は5.1KΩの抵抗を使ってください。
この3種類の端子は、シリアル接続時でもかならず設定する必要があります。以下に例を示します。尚、IOに余裕がある場合は、バス接続、シリアル接続両方をおこなってもかまいません。
■接続例(撮影アドレスを0番地固定、モードはカラー80x60に固定する場合)
■接続例(撮影アドレスを0番地固定、モードを可変、撮影終了タイミングをBSYで検知する場合)
ほとんどのマイコンには、汎用シリアル通信機能がついています。大抵は、UARTもしくはUSARTという名称になっており、TXとRXの2つの通信線で1つのシリアル通信機能として働きます。TXはデータ送信線、RXはデータ受信線です。この他に、信号GNDを共通化する必要がありますので、CMOS-EYEとマイコンのGNDを接続します。
UARTの場合は、「非同期シリアル通信」機能です。USARTの場合は「Universal Synchronous and
Asynchronous Reciever and Transmitter:汎用同期・非同期シリアル通信(設定により非同期か同期を選ぶ)」です。CMOS-EYEの場合には、非同期シリアル通信でデータの送受信を行います。
同期通信の場合には、送信・受信線以外に、同期を取るクロック線も必要ですが、非同期通信の場合には、あらかじめお互いに通信速度を決めておき、信号が変化した時から非同期でデータのやりとりを行います。よって、信号線はTXおよびRXの2本で済みます。
シリアル通信の規格で、RS232Cというものがあり、電圧とコネクタ形状とピン配列を決められています。RS232Cの電圧規格と、UARTの電圧規格は異なりますので注意して下さい。PCにはRS232C電圧レベルのシリアルポートがついており、CMOS-EYEの232CポートはPCと直結することができます。これは、CMOS-EYEの内部信号(0V/3.3V)をRS232Cレベルに変換しています。通常のマイコンのIOにRS232Cレベルの電圧を加えると、そのIOが破損しますので、PCのRS232CラインをCMOS-EYEのUARTに接続しないように注意して下さい。
(マイコンのシリアル通信端子の電圧と、PCの電圧の違い)
|
論理値0 |
論理値1 |
UART |
0V |
マイコンの電源の電圧 |
RS232C |
+3〜+12V |
-3〜-12V |
※CMOS-EYEの場合は電源が3.3V動作なので、UARTの論理1は3.3Vになります。
CMOS-EYEのシリアル通信設定は「フロー制御なし、パリティなし、ストップビット1」となっています。(通常のマイコンの非同期シリアル通信機能の初期設定はだいたいこのようになっている。)
RX端子
マイコンからの信号を受信します。よってマイコン側のTX(送信)と接続します。
TX端子
マイコンへ信号を送信します。よって、マイコン側のRX(受信)と接続します。
RS232C端子
この端子は、CMOS-EYE内部のシリアル信号をRS232Cレベルに変換しています。PCとの通信専用です。マイコンのUART端子につながないようにしてください。
付属の専用のPCケーブルを接続してください。コネクタにRXと書いてある方をRX、TXと書いてある方をTXに接続します。この端子はPCなどでSRAM内部の画像をモニタリングするのに使います。ロボット組み込み後などで、モニタリングの必要がない場合は外してもかまいません。
シリアル通信ポートが無いPCの場合は、USBシリアルアダプタを経由して接続してもOKです。TXとRXラインしか使用していないので、ほとんどのUSBシリアルアダプタが使用できます。
<シリアル接続での使い方(命令)>
−データ形式−
マイコンからCMOS-EYEへシリアル通信で命令を出すことにより、内蔵のプログラムを動かすことができます。命令は4〜17バイトの数値データで送られます。バイトサイズ(8ビット)なので、表される数値は0〜255の256種類になります。
CMOS-EYEはIO電圧が3.3Vですが、シリアル接続のデータ形式は、ロボット神経システムAGB65シリーズ互換になっています。よって、IOを5Vに変換すればAGB65シリーズと同じ通信ラインを供給できます。但し、AGB65シリーズではシンクロバイト以外の[255]の送信を許可していませんが、システム開発中にCMOS-EYEから画像データを転送する場合には値[255]が含まれる場合があります。よって、システム開発中は他のAGB65シリーズは接続しないようにしてください(サーボコントローラのサーボが突然動いてしまうということがありえますので危険です。)
尚、以下特に記述がない場合は、数値は10進数で表しています。
−基本形−
データの基本形は次の通りになります。[ ]内は1バイトを表します。()内は送りえる数値の範囲を表します。
[シンクロバイト(255)] [ID(98/99)] [送信バイト数(1-14)] [命令(0-254)] [値1] [値2] ...
シンクロバイト |
データの通信開始を知らせるデータで、常に「255」で始まります。 |
ID |
CMOS-EYEに設定された固有のID。
初期値は98で、DIPSWで99に変更可能。 |
送信バイト数 |
送信される命令の(バイト)数。 シンクロバイト、ID、送信バイト数は数えません。 |
命令 |
CMOS-EYEに動作させたい命令。以下で詳しく説明します。 |
|
注)データはキャラクタデータではなく、数値(バイナリ)データで送ります。
例えばマイコンをマスタとし、C言語でプログラムを作る場合に255を送信しようとして(PCや他の言語も考え方は同じ)、
printf("255");
とするのは間違いです。これですとキャラクタデータですので実際には2と5と5を表す3バイトのキャラクタデータが送られてしまいます。数値データに直すと[32][35][35]が送信され(ASCIIコード参照)、[255]ではないことになります。
unsigned char SINC = 255;
printf("%d",SINC);
で、[255]が2バイトだけ送られます。
※お使いのCコンパイラによっては構文がことなるかもしれません(printf関数がないとか、バイトサイズ変数の宣言はcharではなくintやbyteだとか)のでご注意下さい。
例)---撮影命令を送る場合---
フォーマットは次のようになります。
[255] [ID] [長(1)] [命令(10)]
今、CMOS−EYEのIDが98(出荷時設定)になっていたとしますと、プログラムは次のようになります。
unsigned char data[4];
int i;
data[0]=255;
data[1]=98;
data[2]=1;
data[3]=10
for (i=0; i<data[3]+3; i++){
printf("%d",data[i]);
}
|
|
−命令の概要−
※詳細は名称をクリック、モードはBWが白黒特有の命令、COLがカラー特有の命令です。
命令値
|
名称
|
モード
|
概要
|
|
【基本動作、他】 |
|
|
0 |
ソフトウェアリセット |
−
|
CMOS-EYEをリセットします。 |
2 |
データ書きこみ |
−
|
指定したアドレスに、1つのデータを書き込みます。 |
4 |
データ読み込み |
−
|
指定したアドレスを先頭に、指定したバイト数のデータを、指定したシリアル端子から送信させます。 |
6 |
四角形書きこみ |
−
|
SRAM領域に、指定した濃度で四角形を書き込みます。 |
10 |
撮影 |
−
|
M0-M2で指定した画面モードで、A0-A18で指定したアドレスを先頭に、撮影を行います。 |
12 |
画像コピー |
−
|
指定した領域の画像データを、別な領域へコピーします。 |
14 |
画面反転 |
−
|
撮影時に、画面を上下左右に反転します。 |
100 |
画像データ転送 |
−
|
指定した領域の画像データを、232C端子から転送します。※この場合、CMOS-EYEのUART端子は選択できません。通信速度は115200bps固定。 |
102 |
自動機能設定 |
−
|
センサの自動露出、オートホワイトバランスのON/OFFを行います。 |
|
【濃度変換】 |
|
|
20 |
線形濃度変換 |
BW
|
画像データの濃度を変化させます。 |
22 |
ガンマ補正 |
BW
|
画像データの濃度を変化させます。明るすぎる場合や、暗すぎる場合の調整に適しています。 |
24 |
コントラスト強調 |
BW
|
画像データのコントラストを改善します。 |
|
【空間フィルタ】 |
|
|
26 |
雑音除去フィルタ |
BW
|
画像データの雑音成分を除去します。細かい点などが入ってしまった場合に、ボカすことができます。 |
28 |
微分フィルタ |
BW
|
画像データのエッジを検出します。 |
30 |
高域強調フィルタ |
BW
|
ボケた画像や、ブレた画像をある程度はっきりさせます。 |
|
【ニ値化画像】 |
|
|
32 |
固定しきい値処理 |
BW
|
設定したしきい値を境に、画像を白(255)と黒(0)の二値にします。 |
40 |
膨張 |
BW
|
ニ値化した画像を1ライン膨張させます。 |
42 |
収縮 |
BW
|
ニ値化した画像を1ライン縮小させます。 |
44 |
細線化 |
BW
|
ニ値化した画像を、線幅1の線に変形します。 |
46 |
境界線ラベリング |
BW
|
ニ値化した画像の境界線を抽出します。 |
48 |
領域ラベリング |
BW
|
ニ値化した画像の離れている物体同士に番号をつけます。 |
50 |
円形度計算 |
BW
|
領域ラベリングした画像のラベル値を指定して、そのラベルの物体がどのぐらい円形に近いかを計算します。 |
52 |
特徴点抽出 |
BW
|
細線化−>領域ラベリングを行った後、ラベル値を指定して、その線画に存在する端点、交点、交差点の数と位置を抽出します。 |
54 |
角点抽出 |
BW
|
特徴点抽出を行った後、ラベル値を指定して、その線画にある角点の数、位置、だいたいの角度を抽出します。 |
|
【色処理】 |
|
|
80 |
平均色記憶 |
COL
|
画面内の範囲を指定して、その場所のRGBそれぞれの平均色濃度を記憶します。 |
82 |
色領域判定 |
COL
|
RGBそれぞれの上限値と下限値を指定して、画面内にそのピクセルが存在する位置を判定します。(XYで返す) |
84 |
平均色相記憶 |
COL
|
画面内の範囲を指定して、その場所の平均色相を角度で記憶します。色相はR=0°、G=約120°、B=約240°のようになります。 |
86 |
色相領域判定 |
COL
|
色相と、誤差角度を指定して、画面内にそのピクセルが存在する位置を判定します。(XYで返す) |
88 |
色抽出 |
COL
|
RGBそれぞれの上限値と下限値を指定して、画面内にその範囲内のピクセルがあればそこを黒(値0)にする画像を作成します。(マスクができる) |
90 |
色相抽出 |
COL
|
色相と、誤差角度を指定して、画面内にその範囲のピクセルがあればそこを黒(値0)にする画像を作成します。(マスクができる) |
|
【動体検知】 |
|
|
96 |
動体エリア検知 |
BW
|
2画面を比較し、差が大きい領域を判定します。(XYで返す) |
98 |
動体エリア抽出 |
BW
|
2画面を比較し、差が大きいピクセルを黒(値0)とする画像を作成します。 |
|
【補助系】 |
|
|
200 |
ヒストグラム取得 |
−
|
白黒又はカラー画像のヒストグラムを計算し、SRAMに格納します。 |
201 |
ヒストグラム要求 |
−
|
ヒストグラム結果領域を返信します。。 |
254 |
セルフチェック |
−
|
CMOS-EYEが正常動作しているか確認します。 |
上以外 |
無視されます |
|
|
|
アドレス指定は、19ビット幅で指定する必要があるので、アドレス指定には3バイト使用します。3バイトで24ビットになりますが、上位の5ビットは使用しません。上位5ビットにデータが入っていた場合でも、CMOS−EYE側はマスクをかけてこれらのビットを0にしますが、念のため、送信するデータの上位5ビットは0にしてください。アドレスは上位ビットから送ります。
アドレス指定の計算を10進数で表すと、
アドレス=(アドレス1x65,536)+(アドレス2x256)+(アドレス3)
となります。以下、よく使われるであろうと思われるアドレスの3バイトの表記を示します。
実アドレス
|
2進数値
|
アドレス1
|
アドレス2
|
アドレス3
|
4800
|
000 00010010 11000000
|
0
|
18
|
192
|
9600
|
000 00100101 10000000
|
0
|
37
|
128
|
14400
|
000 00111000 01000000
|
0
|
56
|
64
|
19200
|
000 01001011 00000000
|
0
|
75
|
0
|
24000
|
000 01011101 11000000
|
0
|
93
|
192
|
38400
|
000 10010110 00000000
|
0
|
150
|
0
|
57600
|
000 11100001 00000000
|
0
|
225
|
0
|
76800
|
001 00101100 00000000
|
1
|
44
|
0
|
96000
|
001 01110111 00000000
|
1
|
119
|
0
|
153600
|
010 01011000 00000000
|
2
|
88
|
0
|
230400
|
011 10000100 00000000
|
3
|
132
|
0
|
307200
|
100 10110000 00000000
|
4
|
176
|
0
|
384000
|
101 11011100 00000000
|
5
|
220
|
0
|
460800
|
111 00001000 00000000
|
7
|
8
|
0
|
463999
|
111 00010100 01111111
|
7
|
20
|
127
|
469000
|
111 00101000 00001000
|
7
|
40
|
8
|
471000
|
111 00101111 11011000
|
7
|
47
|
216
|
473000
|
111 00110111 10101000
|
7
|
55
|
168
|
473100
|
111 00111000 00001100
|
7
|
56
|
12
|
476200
|
111 00111000 01110000
|
7
|
56
|
112
|
473300
|
111 00111000 11010100
|
7
|
56
|
212
|
473400
|
111 00111001 00111000
|
7
|
57
|
56
|
※アドレス1は一番目に送るバイト,2は二番目,3は三番目です。上の表では10進表記で表してます。
このアドレス指定は、撮影後の画像に対するアドレス指定のみとなります。シリアル命令時の撮影先頭アドレスは、CMOS−EYEのアドレス端子をハード的に設定する必要があります。つまり、シリアル通信命令だけを使う場合は、撮影先頭アドレスは固定になります。尚、撮影した後に、その画像を違う領域にコピーすることはできますので、複数画像の処理は可能です。
画面の座標をXYで指定する場合は、最大値が320x240なので、1バイトで表す255よりも大きなビット幅が必要です。よって、XY座標を指定する命令では、座標位置を2バイトで表します。座標をシリアル通信で送る場合には、上位バイトを先に送ります。同じく、結果がXY座標で得られる命令は、上位バイトが先に格納されます。
※Y座標は最大でも240なので、1バイトでもすみそうですが、今後の拡張性を考えて2バイトで表しています。
アドレスとXY座標を指定する場合は、アドレスは画面の先頭アドレスを示し、XYはその先頭アドレスからの相対位置となります。
−もくじへ戻る−
■命令0:ソフトウェアリセット
1)送信フォーマット (マイコン−>CMOS-EYE)
[255] [ID] [長(1)] [命令(0)]
2)説明
CMOS-EYEへこの命令を送ると、CMOS-EYEはリセットします。LEDが3回点滅した後にCMOS−EYEが正常に動き始めます。
ごくまれに、動作中にシリアル命令を送ってしまった場合に、CMOS−EYE内部の設定が変わってしまう場合がありますので、このような時はソフトウェアリセットを行います。
また、CMOS−EYEの232C端子とマイコンをつないだ状態で、マイコン側のソフトウェアを書き換えた場合にも設定が変わる場合があり、特に、カラーモードで撮影しても、RGB各領域に白黒画像しか入らなくなる(RGB領域にまったく同じデータが入る)時があります。この場合もソフトウェアリセットを行ってください。
−命令の概要へ戻る−
■命令2:データ書き込み
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(5)] [命令(2)] [アドレス1] [アドレス2] [アドレス3] [Data]
・アドレス:データを書き込むアドレス
・Data:書き込むデータ
2)説明
CMOS−EYEのSRAMに、「アドレス」で指定したアドレスに「Data」で指定した1バイトのデータを書き込みます。
CMOS−EYEのSRAMのデータにアクセスして計算する場合は、基本的にはバス接続を推奨していますので、この命令はあくまでも簡易的なものです。シリアル通信経由でのSRAMアクセスは、動作スピードの面であまり実用的ではありません。
−命令の概要へ戻る−
■命令4:データ読み込み
※出荷ロットによってはポートをUART端子にした場合に、データが送信されまいものがありました。恐れ入りますが、他の命令は動いて、命令4のUARTが動かなかった場合は商品を浅草ギ研まで着払いでご返送いただくようお願いいたします。
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(6)] [命令(4)] [ポート] [データ数] [アドレス1] [アドレス2] [アドレス3]
・ポート:返信データを送る端子を指定します。1が232C、2がUARTに指定されます
・データ数:読み込むデータ数を指定します。最大値は254となります。
・アドレス:読み込む先頭アドレスを指定します。
2)返信フォーマット (CMOS−EYE−>マイコン)
[255] [ID] [長(6)] [命令(4)] [ポート] [データ数] [アドレス1] [アドレス2] [アドレス3]
[data1] [data2] ...
・ポート:送信した値と同じポート値が返されます。
・データ数:送信したデータ数と同じ値が返されます。
・アドレス:読み込むデータの先頭アドレスが返されます。
・data1〜:データ数で指定した数のデータが返されます。
3)説明
送信フォーマットで指定した端子から、指定したアドレスを先頭に、指定した数のデータをシリアル通信で返信させます。CMOS−EYE側は、マイコン側の状態にかかわらず、1)の送信フォーマットを受け取った後は、その命令に従ってすぐにデータを返信します。
−命令の概要へ戻る−
■命令6:四角形書き込み
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(14)] [命令(6)] [MODE(0-5)] [アドレス1]
[アドレス2] [アドレス3] [濃度] [x1上] [x1下] [y1上] [y1下] [x2上] [x2下]
[y2上] [y2下]
※XYはそれぞれ2バイトで1つの値を表します。[x1上]はx1の上位バイト、[x1下]はx1の下位バイトを表します。
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
3 |
カラー |
80x60 |
4 |
カラー |
160x120 |
5 |
カラー |
320x240 |
※この命令は白黒特有の命令なので、MODE3,4,5に指定するとそれぞれ0,1,2に変換されます。
・アドレス:四角形を書き込む”画面の先頭アドレス"の先頭を指定します。
・濃度:書き込む四角形の濃度を指定します。0に近いほど黒く、255に近いほど白くなります。
・座標XY:XY座標で書き込む四角の大きさを指定します。これは、アドレスで指定したアドレスからの相対位置を指定します。(x1,y1)が左上、(x2,y2)が右下になります。
2)説明
MODEとアドレスで指定した画面の相対位置(x1,y1)(x2,y2)へ四角形を書き込みます。下の命令で出てくる、画面の領域判定などで取得した結果に基づいて、画面上に計算結果領域を表示するのに便利です。主に画像システム構築中に計算結果を確認するのに使います。
−命令の概要へ戻る−
■命令10:撮影
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(1)] [命令(10)]
2)説明
CMOS−EYEのアドレス端子で設定したアドレスを先頭に、M0−M2で指定した画面モードで撮影を行います。アドレス端子と、M0−M2の画面モードについては、バス接続の節(上)を参照願います。
撮影には70〜100mSかかります。撮影終了のタイミングを検知したい場合は、BSY端子を監視してください。BSY端子は通常はHIGHで、撮影中はLOWになります。
シリアル通信時の先頭アドレスと画面モード指定は、CMOS−EYEの端子を使って行います。シリアル通信でそれぞれを設定することはできません。(モジュール小型化のため、やむおえず、このような仕様になっています。)
−命令の概要へ戻る−
■命令12:画像コピー
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(12)] [MODE(0-2)] [元アドレス1]
[元アドレス2] [元アドレス3]
[先アドレス1] [先アドレス2]
[先アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:コピー元の先頭アドレスを指定します。
・先アドレス:コピー先の先頭アドレスを指定します。
2)説明
MODEで指定した画像サイズの画像を、元アドレスから先アドレスへコピーします。カラー画像のコピーはRGBそれぞれの濃淡をコピーしてください(コピーを3回する)。
−命令の概要へ戻る−
■命令14:画面反転
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(2)] [命令(14)] [画面反転モード]
・画面反転モード:反転を指定します。
MODE |
反転方向 |
0 |
反転なし |
1 |
上下左右 |
2 |
上下 |
3 |
左右 |
|
2)説明
撮影時の画面を反転させます。設定後は、再度設定を変えるまで、その反転モードが続きます。電源入り後と、ソフトウェアリセット後はノーマルに設定されています。ノーマルの場合は、FPC(茶色い部分)側が下になります。
−命令の概要へ戻る−
■命令100:画像転送
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(5)] [命令(100)] [MODE(0-5)] [ADD1] [ADD2] [ADD3]
2)返信フォーマット
[255][ID][長(2)][命令(100)][MODE(0-5)] この後、画像データ...
3)説明
[ADD1] [ADD2] [ADD3]で設定したアドレスを先頭に、232C端子からシリアル通信で画像データを転送します。
白黒の場合は指定したモードの画面サイズの分だけデータを転送します。例えば、MODEが0の場合は上記の返信フォーマットのヘッダが送信されたあと、80x60バイトのデータが送信されます。
カラーの場合は指定したモードの画面サイズx3バイト分のデータ、つまりRとGとBが1画面ずつ送信されます。例えば、MODEが0の場合は上記の返信フォーマットのヘッダが送信されたあと、80x60x3バイト分のデータが送信されます。
画面データはSRAMに入っているままの順番で送信されます。SRAMに入っている画面の様子は画像フォーマットとメモリ領域を参照願います。
−命令の概要へ戻る−
■命令20:線形濃度変換
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(10)] [命令(20)] [MODE(0-2)] [A] [B] [元アドレス1] [元アドレス2]
[元アドレス3] [格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・A:濃度値の下の値
・B:濃度値の上の値
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した画像を、A,Bで設定した濃度範囲で線形濃度変換を行い、結果を格納アドレスに記録します。
線形濃度変換は、指定した範囲の濃度のヒストグラムを引き伸ばす処理です。
A〜B の範囲を中心にした場合はコントラスト改善になります。
範囲を値が低い方へシフトした場合には明るいところが強調されます。
範囲を値が高い方へシフトした場合には暗いところが強調されます。
Bの方をAよりも高くした場合は、濃度が反転します。
3)画像処理例
−命令の概要へ戻る−
■命令22:ガンマ補正
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(9)] [命令(22)] [MODE(0-2)] [ガンマ値] [元アドレス1] [元アドレス2]
[元アドレス3] [格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・ガンマ値:ガンマ値を指定します。
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した画像をガンマ補正して、格納アドレスに記録します。
ガンマ補正は、画面を明るくしたり、暗くする場合に使用します。単純に全体を明るくしたり暗くするのではなく、ヒストグラムを非線形で変換することにより、暗いところは暗いままに、明るいところは明るいままに明暗を補正させます。
ガンマ値は1/100の値で指定します。ガンマ値100=1、ガンマ値50=0.5、ガンマ値200=2、というγ値になります。
3)画像処理例
−命令の概要へ戻る−
■命令24:コントラスト強調
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(24)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した画像のコントラストを強調して、格納アドレスに記録します。
3)画像処理例
−命令の概要へ戻る−
■命令26:雑音除去フィルタ
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(26)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した画像の平滑化を行い、格納アドレスに記録します。ドット状の雑音が多い画像は、雑音成分がなめらかになります。
3)画像処理例
−命令の概要へ戻る−
■命令28:微分フィルタ(エッジ検出)
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(28)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した画像を微分して、格納アドレスに記憶します。各ピクセルごとに、周囲8ピクセルと微分を行うことで、エッジの検出された画像になります。
周囲8ピクセルに対して計算するため、外周は計算できませんので外周1ピクセルは白(値255)となります。
3)画像処理例
−命令の概要へ戻る−
■命令30:高域強調フィルタ(ボケ・ブレ改善)
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(30)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した画像の高域成分を強調して、格納アドレスに記憶します。これにより、ボケ・ブレ画像の改善を行うことができます。
周囲8ピクセルに対して計算するため、外周は計算できませんので外周1ピクセルは白(値255)となります。
3)画像処理例
※CMOS−EYEが上下に震動している状態で、元画像を撮影しています。
−命令の概要へ戻る−
■命令32:固定しきい値二値化処理
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(9)] [命令(32)] [MODE(0-2)] [しきい値] [元アドレス1] [元アドレス2]
[元アドレス3] [格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・しきい値:白と黒をわける濃度を指定します。
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した画像の各ピクセルがしきい値以上か以下かを判定して、しきい値を基準に黒(値0)と白(値255)の二値に変換した画像を作成して格納アドレスに記憶します。
3)画像処理例
4)送信データ例
ID=98のCMOS-EYEで、0番地に格納されたMODE=1の画像を、しきい値=80で二値化して、14400番地に格納する場合、
[255] [98] [9] [32] [1] [80] [0] [0] [0] [64] [56] [0]
−命令の概要へ戻る−
■命令40:膨張
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(40)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した、すでに黒(値0)と白(255)にニ値化されている画像の、黒部分を1ピクセル膨張させます。収縮命令と組み合わせて、ニ値化画像の雑音を取り除くことができます。
3)画像処理例
「元画像」 −> 「収縮」 −> 「膨張」
−命令の概要へ戻る−
■命令42:収縮
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(42)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した、すでに黒(値0)と白(255)にニ値化されている画像の、黒部分を1ピクセル収縮させます。膨張命令と組み合わせて、ニ値化画像の雑音を取り除くことができます。
3)画像処理例
「元画像」 −> 「縮小」 −> 「膨張」
−命令の概要へ戻る−
■命令44:細線化
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(44)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[作業アドレス1] [作業アドレス2] [作業アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・作業アドレス:計算中の一時データを格納する先頭アドレスを指定します。
作業アドレスは元画像と同じ大きさが必要です。
2)説明
MODEと元アドレスで指定した、すでに黒(値0)と白(255)にニ値化されている画像を、線幅1の黒線にします。結果は元アドレスに上書きされます。計算中は、作業アドレスで指定した領域を使用しますので、作業アドレスに入っていたデータは書き換えられます(最終的には元アドレスと作業アドレス両方の領域に同じデータが入ります)。
線幅1に変換された図形を細線と呼びます。細線はニ値化図形の中心線になります。黒図形のまわり1ピクセルごとに判定して線化していくので、元画像の黒領域が大きいほど、計算に時間がかかります。もともとの画像が線図形の場合に(つまり白領域が多い)有効な処理です。
3)画像処理例
※上の例では、すでにニ値化されている真ん中の画像を元アドレスとして処理しています。
※この例では160x120の画面サイズで処理を行ってますが、細線化処理は非常に時間が掛かります。
できるだけ、80x60で処理することをお勧めします。
4)注意点
上の例では、160x120で処理を行ってますが、内蔵プログラムによる細線化は非常に時間がかかるので、あまり実用的ではありません。実際に使用する場合には80x60の画面モードで、元画像に黒領域が少ないように撮影することをお勧めします。
−命令の概要へ戻る−
■命令46:境界線ラベリング
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(46)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)説明
MODEと元アドレスで指定した、すでに黒(値0)と白(255)にニ値化されている画像の境界線を検出し、左上に存在する図形から番号順の濃度で描画します。番号は最大が254になります(背景は255なので混同しないようになっている)。黒図形が255個以上あった場合は、番号が0に戻って次の図形の境界線を描画します。(つまり、254で描画された図形より右下にある図形は、0で描画される。)
3)画像処理例
※上の例では、すでにニ値化されている真ん中の画像を元アドレスとして処理しています。
−命令の概要へ戻る−
■命令48:領域ラベリング
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(48)] [MODE(0-2)] [元アドレス1] [元アドレス2] [元アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:結果画像を格納する先頭アドレスを指定します。
2)領域情報格納フォーマット
領域ラベリングを行った場合は、同時に、各領域の位置、面積、周囲長の情報を取得し、SRAMの463,999番地以降に記録されます。
※各ラベルデータの最後は円形度を格納する場所になっていますが、これは命令50を実行後に入ります。
・総ラベル数:検出した黒(0)図形の数
・ラベル番号:ラベルの番号
・x1、y1、x2、y2:黒図形の位置座標を表します。各値は2バイトで表されます。
※座標の表し方については、この節の上(命令0の上)を参照願います。
・面積:黒図形のピクセル数。3バイトで表されます。面積1は最上位、面積2は中間バイト、面積3は下位バイト
よって、 面積値 = (面積1 x 65536)+(面積2 x 256)+(面積3) となります。
・周囲長:黒図形の周囲長をピクセルで表します。周囲長1は最上位、周囲長2は中間バイト、周囲長3は下位バイト
よって、 周囲長 = (周囲長1 x 65536)+(周囲長2 x 256)+(周囲長3) となります。
3)説明
MODEと元アドレスで指定した、すでに黒(値0)と白(255)にニ値化されている画像の、独立した黒図形を検出し、左上に存在する図形から番号順の濃度で描画します。番号は最大が254になります(背景は255なので混同しないようになっている)。黒図形が255個以上あった場合は、番号が0に戻って次の図形の境界線を描画します。(つまり、254で描画された図形より右下にある図形は、0で描画される。)
同時に、各図形のデータを取得し、SRAMの463,999番地以降に記録します。記録したデータは、命令4(データ読み込み)を実行することで取得できます。
4)画像処理例
※上の例では、すでにニ値化されている真ん中の画像を元アドレスとして処理しています。
この例の処理後、463,999番地以降のアドレスには次のようなデータが入りました。
3,
0,0,17,0,57,0,45,0,83,0,2,90,0,0,89,2,
1,0,61,0,64,0,84,0,84,0,0,179,0,0,90,58,
2,0,99,0,67,00,123,0,87,0,1,11,0,0,74,110,
よって、ラベル数は3、つまり3つの独立した黒図形を検知しました。
ラベル番号0の位置は左上が(17,57)、右下が(45,83)であることがわかります。面積は 面積値 = (0 x 65536)+(2
x 256)+(90)=602であることがわかります。周囲長は 周囲長 = (0 x 65536)+(0 x 256)+(89)=89であることがわかります。ラベル番号0のデータの最後の
2 は、円形度を表す場所ですが、円形度は命令50を実行後に格納されますので、ここにはもともと入っていたデータがそのまま入っています(つまり意味のない数値)。
同じようにラベル番号1、ラベル番号2についてのデータも格納されていることがわかります。(x1,y1)(x2,y2)の位置情報をもとに、命令6を使って四角を書いたところが下の画像になります。
円形度については、次の命令50で説明します。
−命令の概要へ戻る−
■命令50:円形度計算
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(1)] [命令(50)]
2)説明
領域ラベリングが終わった状態(命令48が終わった状態)で、各図形の円形度を計算し、463,999番地以降の該当する場所に記録します。円形度は%で表し、円に近い図形ほど100%に近くなります。円形度は、面積と周囲長の関係から算出していますので、図形の複雑度を表しているとも言えます。対象図形が極端に小さいと100%を超える場合がありますので注意して下さい。
記録したデータは、命令4(データ読み込み)を実行することで取得できます。
3)計算例
上の命令48が終了した状態で、この命令を実行した後の463,999番地以降のデータが次のようになりました。
3,
0,0,17,0,57,0,45,0,83,0,2,90,0,0,89,95,
1,0,61,0,64,0,84,0,84,0,0,179,0,0,90,27,
2,0,99,0,67,00,123,0,87,0,1,11,0,0,74,61,
赤字の部分が今回書かれたところです。このように、丸が95%、星が27%、三角が61%ということで円形度がわかります。(図形は上の命令48の例を参照願います)
−命令の概要へ戻る−
■命令52:特徴点抽出
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(6)] [命令(52)] [MODE(0-2)] [ラベル] [元アドレス1]
[元アドレス2] [元アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・ラベル:計算する対象のラベル番号を指定します。
・元アドレス:処理対象画像の先頭アドレスを指定します。
2)特徴点情報格納フォーマット
特徴点抽出を行った結果データは、SRAMの469,000番地以降に記録されます。
・ラベル番号:命令を実行したときに指定したラベル番号が入ります。
・特徴点数:端点、分岐点、交差点の総数を記録します。結果は2バイトで表され、特徴点1が上位バイト、特徴点2が下位バイトとなります。よって、実際の計算は 特徴点数=
(特徴点1 x 256) + (特徴点2) となります。
・端点数:端点の数を2バイトで表します。実際の計算は特徴点数の計算と同じです。
・分岐点数:分岐点の数を2バイトで表します。実際の計算は特徴点数の計算と同じです。
・交差点数:交差点の数を2バイトで表します。実際の計算は特徴点数の計算と同じです。
・x,y:それぞれの特徴点の座標を表します。
※座標の表し方については、この節の上(命令0の上)を参照願います。
3)説明
ニ値化−>細線化した画像にさらに領域ラベリングを行うと、独立した細線ごとにラベリングがされた状態になります。この処理が終わった画像に、命令52を使うと、指定したラベルの端点、分岐点、交差点の数と相対座標を計算し、SRAMの469,000番地以降に記録します。
4)画像処理例
上の例で、領域ラベリングが終わったあとに、ラベル0を指定して命令52を実行すると、SRAMの469,000番地以降には次のように記録されました。
0,0,4,0,3,0,1,0,0,1,0,32,0,26,3,0,14,0,30,1,0,1,0,31,1,0,13,0,60
これにより、
特徴数=4
端点数=3
分岐点=1
交差点=0
ということがわかります。ラベル0は「T」の字型なので、端点x3、分岐点x1で合っています。またそれぞれの位置もわかります。分岐点の座標は、途中のデータ 3,0,14,0,30
により、(14,30)の位置にあることがわかります。
これらのデータをもとに、命令6を使って点を書いてみた例が上写真の下中の写真になります。
※命令6で(x1,y1)と(x2,y2)を同じ座標にすると点になります。上の例では、中間濃度で点を描画しています。
次に、ラベル1を指定して命令52を実行した後の、469,000番地以降のデータを示します。
1,0,5,0,4,0,0,0,1,1,0,55,0,30,1,0,75,0,37,4,0,64,0,46,1,0,53,0,56,1,0,75,0,62
ここから、端点x4、交差点x1の線画だということがわかります。ラベル1は「X」の字型なので合っています。
5)注意点
このようにして、線画像の特徴を抽出することができますが、上の例の丸型の図形のように、線が閉じている図形だと、領域ラベリングの時点で、2回描画されてしまいますので、このプログラムでは閉じた図形には対応できません。閉じた線図形にも対応する場合には、バス接続により、独自のロジックでプログラムを組む必要があります(このロジックについては、浅草ギ研のホームページでは解説していません。)。
上の例では、160x120で処理を行ってますが、細線化などで非常に時間がかかるので、シリアル接続での細線特徴検出はあまり実用てきではありません。実際に使用する場合には80x60の画面モードで、元画像に黒領域が少ないように撮影することをお勧めします。
上の例では、ニ値化−>細線化で約9秒かかっています。
細線化の過程で、交差点が2つの分岐点や、2つの交差点になることがあります。よって、このプログラムでは、「2つの交差点が2ピクセル以内の距離にある場合」と「2つの分岐点が5ピクセル以内の距離にある場合」は1つの交差点として処理しています。これにより、意図した特長点の個数にならない場合がありますので注意して下さい。
−命令の概要へ戻る−
■命令54:角点抽出
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(8)] [命令(54)] [MODE(0-2)] [ラベル] [しきい角度(0-180)]
[サンプル間隔] [元アドレス1] [元アドレス2] [元アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・ラベル:計算する対象のラベル番号を指定します。
・しきい角度:直線からどのぐらい外れていたら「角」として認識するかの角度を度で指定します。
180以上の数値を入れた場合は、180に修正されます。
・サンプル間隔:何ピクセルごとに角を計算するかを指定します。3以下の数値を入れた場合は3に修正されます。
※間隔が短いと計算が出来ないため、最低サンプリング間隔は3になります。
・元アドレス:処理対象画像の先頭アドレスを指定します。
2)角点情報格納フォーマット
角点抽出を行った結果データは、SRAMの471,000番地以降に記録されます。
・ラベル番号:命令を実行したときに指定したラベル番号が入ります。
・角点数:角点の数を記録します。結果は2バイトで表され、角点1が上位バイト、角点2が下位バイトとなります。よって、実際の計算は 角点数=
(角点1 x 256) + (角点2) となります。
・x,y:それぞれの角点の座標を表します。
※座標の表し方については、この節の上(命令0の上)を参照願います。
・角度:それぞれの角点の角度を表します。
※この角度は概算になります。また、サンプル間隔によっては値が大きく変わる場合があります。
3)説明
ニ値化−>細線化−>領域ラベリング−>特徴点抽出を行った画像に命令54を実行すると、指定したラベルの角点数と角度、座標を計算し、SRAMの471,000番地以降に記録します。
4)処理画像例
上のように、特徴点抽出まで終わった画像を、しきい角度=30、サンプル間隔=5で角点抽出をおこなったところSRAMの471、000番地以降には次のようなデータが記録されました。(上写真の下左)
0,0,1,0,85,0,54,116
このデータから、ラベル番号0の線図形は、角が1つ、位置が(85,54)、角度が116という結果になりました。
実際には、写真を見てもわかるとおり、角度はほぼ90°に近いのですが、サンプリング間隔により値が変わるので近似値しか取れません。また、サンプリング間隔が上手く角点付近にこなかった場合は、鋭角が鈍角になったりしますので、角度の値は参考程度に考えてください。
試しに、同じ画像を、しきい角度=30、サンプル間隔=10で角点抽出をおこなったところ、次のようになりました。(上写真の下右)
0,0,1,0,83,0,58,101
位置が(83,58)、角度が101°と、若干変化しています。
5)注意点
処理例のように、この角点抽出は正確な値を取ることができませんので、あくまでも角があるかないかや、おおまかな位置を判定する目安として考えます。正確な判定を行いたい場合は、バス接続により、独自のロジックを自作する必要があります。(浅草ギ研では、正確な角を判定するロジックの解説は行っていません。)
−命令の概要へ戻る−
■命令80:平均色記憶
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(13)] [命令(80)] [MODE(3-5)]
[元アドレス1] [元アドレス2] [元アドレス3] [x1上] [x1下] [y1上] [y1下] [x2上] [x2下]
[y2上] [y2下]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
3 |
カラー |
80x60 |
4 |
カラー |
160x120 |
5 |
カラー |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・(x1,y1):領域の左上の座標を表します。
・(x2,y2):領域の右下の座標を表します。
2)平均色情報格納フォーマット
平均色記憶を行った結果データは、SRAMの473,000番地〜473,011番地に記録されます。
・MODE:実行したMODEの値を記録します。(送信した命令の値がそのまま入る)
・(x1,y1)(x2,y2):平均色を計算した領域を記録します。(送信した命令の値がそのまま入る)
※座標の表し方については、この節の上(命令0の上)を参照願います。
・R,G,B平均濃度:領域内の各色の平均濃度を記録します。
3)説明
MODEと元アドレスで指定した画像内のある部分の領域を(x1,y1)(x2,y2)で指定して、その領域内のRGBの各色の平均濃度を計算し、473,000番地以降に記録します。記録した値は、命令4(データ読み込み)で取り出します。
4)計算例
※オートホワイトバランスをOFFで撮影。命令102参照。
今、上のようにカラー160x120で画像を撮影して、トマトの色を記憶したいとします。画面中央部の色を計算するとして、計算範囲を左上(70,50)右下(90,70)、つまり中央部20x20ピクセルを指定するとします。IDは98だったとします。画像はSRAMの0番地から記録したとしますと、送信するデータは、
[255] [98] [13] [80] [4] [0] [0]
[0] [0] [70] [0] [50] [0] [90] [0] [70]
となります。
この命令を実行した後に、命令4を使用して、473,000番地以降のデータを確認すると次のようになりました。
4,0,70,0,50,0,90,0,70,252,24,59
最後の3バイトが、指定した領域の色平均ですので、 R=252 G=24 B=59 であることがわかりました。これにより、トマトの色は、「赤が強く、緑が弱く、青が弱いが緑よりは強い」ということになります。
−命令の概要へ戻る− |
■命令82:色領域判定
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(11)] [命令(82)] [MODE(3-5)]
[元アドレス1] [元アドレス2] [元アドレス3] [R下限] [R上限] [G下限] [G上限] [B下限] [B上限]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
3 |
カラー |
80x60 |
4 |
カラー |
160x120 |
5 |
カラー |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・RGB上限、下限:判定する各色の濃度の、上限値と下限値を設定します。
2)平均色情報格納フォーマット
色領域判定を行った結果データは、SRAMの473,100番地〜473,114番地に記録されます。
・MODE:実行したMODEの値を記録します。(送信した命令の値がそのまま入る)
・RGB下限値/上限値:計算したRGB濃度の範囲を記録します。(送信した命令の値がそのまま入る)
・(x1,y1)(x2,y2):RGB濃度範囲が存在した座標を記録します。
※座標の表し方については、この節の上(命令0の上)を参照願います。
3)説明
MODEと元アドレスで指定した画像全体の中から、RGB下限値/上限値で設定した範囲内の色がある部分の領域座標を 左上(x1,y1)右下(x2,y2) で記録し、473,100番地以降に記録します。記録した結果データは、命令4(データ読み込み)で取り出します。
4)計算例
(左上の写真)
命令80で撮影し、色平均を計算した画像をそのまま色領域計算してみます。命令80の結果から、中心部の色平均は、 R=252 G=24 B=59 であることがわかっています。このデータは平均値ですので、値をそのまま使った場合は上手く抽出できない可能性があります。よって、領域判定を行う色は、このデータに幅をもたせて計算することにします。ここではとりあえず、各色濃度が平均から±20の幅でおこなってみます。
今、IDが98で、左上の写真を、SRAMの0番地から、カラー160x120で記録していたとします。この場合、送信データは次のようになります。
[255] [98] [11] [82] [4]
[0] [0] [0] [232] [255] [4] [44] [39] [79]
この後、命令4を使って473,100〜473,114番地のアドレスを読むと、次のようになりました。
4,232,255,4,44,39,79,0,29,0,12,0,150,0,113
(右上の写真)
計算結果から、指定した色濃度の領域は、 左上(29,12)右下(150,113)ということがわかります。この領域に、命令6を使って四角を書いたのが右上の写真になります。
(左中の写真)
次に、トマトを動かして、領域判定ができるか実験してみます。撮影した結果が左中の写真になります。光源が変わったので、写りが暗くなっており、トマトのRGB値も変わっていますが、判定するRGB濃度範囲に幅をもたせているので、この程度なら検知できます。
(右中の写真)
同じ条件で領域判定を行い、取得した座標をもとに四角を書いたのが右中の写真になります。この結果の場合は、実際のトマトの画像よりも広い範囲が指定されてしまっています。原因は、背景に色々な色があり、たまたま、トマト以外の場所に同じ範囲の色があったということにあります。
(下の写真)
これは命令84を実行して、同じ条件の色を抽出したところです。トマトのまわりにも、実は、同じ色が点在していることがわかります。
このように、色領域判定の場合は、背景にも影響されますので、背景に少しでも対象物と同じ色がある可能性がある場合は、命令84を使い、縮小−>膨張によって雑音を取り除いた方が正確な判定ができます。
ただし、背景があきらかに対象物とは異なる場合は、この命令の方が、全体の処理スピードは早くなるという利点はああります。
5)注意点
上限値と下限値を逆に設定すると、結果が出ません。473,100〜473,114番地の値は不定となります。
この命令は、RGBの絶対値をもとに計算していますので、同じ撮影対象でも環境の明暗によってRGB値が大きくかわってくる場合があります。環境の明暗に左右されない色検出方法としては、命令84、命令86、命令90のように、色相を計算する方法もあります。但し、色相計算は時間がかかりますので、色による計算と色相による計算を場合によって使い分けることをお勧めします。
−命令の概要へ戻る−
■命令84:平均色相記憶
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(13)] [命令(84)] [MODE(3-5)]
[元アドレス1] [元アドレス2] [元アドレス3] [x1上] [x1下] [y1上] [y1下] [x2上] [x2下]
[y2上] [y2下]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
3 |
カラー |
80x60 |
4 |
カラー |
160x120 |
5 |
カラー |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・(x1,y1):領域の左上の座標を表します。
・(x2,y2):領域の右下の座標を表します。
2)平均色情報格納フォーマット
平均色相記憶を行った結果データは、SRAMの473,200番地〜473,209番地に記録されます。
・MODE:実行したMODEの値を記録します。(送信した命令の値がそのまま入る)
・(x1,y1)(x2,y2):平均色を計算した領域を記録します。(送信した命令の値がそのまま入る)
※座標の表し方については、この節の上(命令0の上)を参照願います。
・平均色相:領域内の平均色相を記録します。値は角度/2の値が入ります。赤が0°になります。
3)説明
MODEと元アドレスで指定した画像内のある部分の領域を(x1,y1)(x2,y2)で指定して、その領域内の平均色相角度を計算し、473,000番地以降に記録します。記録した値は、命令4(データ読み込み)で取り出します。
色相は赤=0°とし、360°の範囲の角度で表されますが、結果の値は 角度/2 という数値になります。つまり、赤を0°とした場合は緑は約120°になりますが、結果値は120/2=60となります。色相については下の図を参照願います。
これにより、色の明暗にかかわらずに色の検出を行うことができます。
4)計算例
例えば今、ID−98で、160x120カラーモードで撮影した画像が0番地から入っていたとします。中心部分の色相を判定したいので、 左上(70,50)右下(90,70)の領域、つまり中心部分20x20ピクセルを指定するとしますと、送信データは次のようになります。
[255] [98] [13] [84] [4] [0] [0]
[0] [0] [70] [0] [50] [0] [90] [0] [70]
元アドレスに上のトマトの画像が入っていた場合の、473,200番地以降のデータが次のようになりました。
4,0,70,0,50,0,0,90,0,70,0
最後の部分が色相なので、値0(0°)という結果になりました。色相0°は赤ですので合っています。
上の例では、黄色い本を撮影したときには夕方になっており、暗い画像になっていますが、明暗にはかかわらずに黄色の角度結果が出ています。
5)注意点
色相の計算は非常に負荷がかかる処理を行っていますので、判定領域を広げると非常に時間が掛かります。例えば、上の画像では160x120で処理していますが、全領域に対して判定を行うと、内蔵プログラムでは約10秒ほどかかります。大きな領域での実用的な色相計算は、バス接続による高速アクセス及び、プログラムロジックの簡易化が必要です。
CMOS−EYEで使われる色相は赤=0°で計算していますが、一般的には他の色を0°とする色表現形式もあるので注意して下さい。
■命令86:色相領域判定
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(11)] [命令(86)] [MODE(3-5)]
[元アドレス1] [元アドレス2] [元アドレス3] [色相値] [誤差(±)] [彩度]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
3 |
カラー |
80x60 |
4 |
カラー |
160x120 |
5 |
カラー |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・色相値:判定する色相値を設定します。値は色相角度/2になります。詳細は命令84を参照。
・誤差:判定する色相の誤差角度を指定します。値は角度/2になります。例えば、色相値を60、誤差を2とすると、色相120°±4°の色相を判定します。
・彩度:判定するピクセルの最低彩度を指定します。例えば、一見、黒に見える部分でも、計算結果によってはある色に判定されます。この場合、彩度を上げると、はっきりと色がわかる部分しか判定しなくなります。通常は20〜50程度に設定してください。
2)色相領域情報格納フォーマット
色相領域判定を行った結果データは、SRAMの473,300番地〜473,310番地に記録されます。
・MODE:実行したMODEの値を記録します。(送信した命令の値がそのまま入る)
・色相:計算した色相を記録します。(送信した命令の値がそのまま入る)
・誤差:計算した誤差を記録します。(送信した命令の値がそのまま入る)
・(x1,y1)(x2,y2):色相値と誤差と彩度で指定したピクセルが存在した座標を記録します。
※座標の表し方については、この節の上(命令0の上)を参照願います。
3)説明
MODEと元アドレスで指定した画像全体の中から、色相値・誤差・彩度で設定した範囲内の色がある部分の領域座標を 左上(x1,y1)右下(x2,y2) で記録し、473,300番地以降に記録します。記録した結果データは、命令4(データ読み込み)で取り出します。
色相については、命令84を参照願います。色相値、誤差は実際の角度の1/2になります。
4)計算例
例えば今、ID−98で、160x120カラーモードで撮影した画像が0番地から入っていたとします。赤色を判定したいので、色相値=0、誤差=2、最低彩度=50としますと、送信データは次のようになります。
[255] [98] [11] [86] [4] [0] [0]
[0] [0] [2] [50]
例の計算対象画像1は赤成分が少ないであろうものを背景に撮影してみました。結果を命令4で読み出し、得られた結果から画像の領域に四角を書いてみると、若干左と上も反応しています。同じ画像を命令90で見てみると、棒の部分に赤成分が若干あったようです。
この画像は、元画像をホワイトバランスOFFで撮影しています。夕方の室内で撮影したものなので画面全体が暗いですが、赤部分を判定できています。
同じように、昼間撮影した画像が画像2になります。上の赤とはあきらかにRGB値が違いますが、同じ赤として判定できています。
この画像は背景が込み入っているので、赤と判定する領域が広くなっており、あまり正確に範囲を判定できていません。このような場合は、命令90でニ値化した画像を収縮−>膨張することで、位置を判定することができます。
−命令の概要へ戻る−
■命令88:色抽出
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(14)] [命令(88)] [MODE(3-5)]
[元アドレス1] [元アドレス2] [元アドレス3] [格納アドレス1] [格納アドレス2] [格納アドレス3] [R下限]
[R上限] [G下限] [G上限] [B下限] [B上限]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
3 |
カラー |
80x60 |
4 |
カラー |
160x120 |
5 |
カラー |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:処理結果画像を格納する先頭アドレスを指定します。
・RGB上限、下限:判定する各色の濃度の、上限値と下限値を設定します。
2)説明
MODEと元アドレスで指定した画像全体の中から、RGB下限値/上限値で設定した範囲内の色が存在するピクセルを黒(0)とした画像を作成し、格納アドレスを先頭にした場所へ記録します。このとき、背景は白(255)ですので、ニ値化画像が得られます。結果画像を白黒画像として、他のニ値化画像を対象とした命令を実行することができます。
3)画像処理例
命令80で撮影し、色平均を計算した画像をそのまま色領域計算してみます。命令80の結果から、中心部の色平均は、 R=252 G=24 B=59 であることがわかっています。このデータは平均値ですので、値をそのまま使った場合は上手く抽出できない可能性があります。よって、領域判定を行う色は、このデータに幅をもたせて計算することにします。各
尚、色の再現性の問題から、元画像はオートホワイトバランス機能をOFFにして撮影しています。(命令102参照)
色濃度が平均から±20の幅でおこなった画像が、上中の写真になります。±40の場合が上右の写真になります。
下の写真は、対象を遠ざけて撮影したものです。色抽出を行うと、対象のトマトの画像以外にも、背景の雑音が入ります。色抽出後はニ値化画像として扱えますので、さらに収縮−>膨張を行うと雑音が消え、対象のトマトだけを抽出することができます。
4)注意点
上限値と下限値を逆に設定すると、結果が出ません。格納アドレスには背景の白(255)画像だけが入ります。
−命令の概要へ戻る−
■命令90:色相抽出
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(11)] [命令(90)] [MODE(3-5)]
[元アドレス1] [元アドレス2] [元アドレス3] [格納アドレス1] [格納アドレス2] [格納アドレス3] [色相値]
[誤差(±)] [最低彩度]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
3 |
カラー |
80x60 |
4 |
カラー |
160x120 |
5 |
カラー |
320x240 |
|
・元アドレス:処理対象画像の先頭アドレスを指定します。
・格納アドレス:処理結果画像を格納する先頭アドレスを指定します。
・色相値:抽出する色相値を設定します。値は色相角度/2になります。詳細は命令84を参照。
・誤差:抽出する色相の誤差角度を指定します。値は角度/2になります。例えば、色相値を60、誤差を2とすると、色相120°±4°の色相を判定します。
・彩度:抽出するピクセルの最低彩度を指定します。例えば、一見、黒に見える部分でも、計算結果によってはある色に判定されます。この場合、彩度を上げると、はっきりと色がわかる部分しか判定しなくなります。通常は20〜50程度に設定してください。
2)説明
MODEと元アドレスで指定した画像全体の中から、色相値・誤差・彩度で設定した色が存在するピクセルを黒(0)とした画像を作成し、格納アドレスを先頭にした場所へ記録します。このとき、背景は白(255)ですので、ニ値化画像が得られます。結果画像を白黒画像として、他のニ値化画像を対象とした命令を実行することができます。
3)画像処理例
上左の写真に対して、色相値=0、誤差=2、彩度=50で抽出を行った画像が、上右になります。このように、画像が暗くても、赤領域を問題なく抽出できます。
中左の写真は、昼間撮影した画像です。ここで、設定を同じ色相値=0、誤差=2、彩度=50で抽出を行っても、問題なく対象物が抽出できています。尚、この画像は背景に赤成分が沢山あるのですが、抽出後は背景白(255)の二値化画像になりますので、収縮−>膨張を行うことで雑音を取り除くことができます。
4)注意点
このように、色相での判定は明暗に左右されませんが、計算に非常に負荷がかかる処理をしており、例のような160x120の画像では、計算に約10秒ほどかかります。
大きな領域での実用的な色相計算は、バス接続による高速アクセス及び、プログラムロジックの簡易化が必要です。
CMOS−EYEで使われる色相は赤=0°で計算していますが、一般的には他の色を0°とする色表現形式もあります。
−命令の概要へ戻る−
■命令96:動体領域検出
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(9)] [命令(96)] [MODE(0-2)]
[誤差濃度] [現在アドレス1] [現在アドレス2] [現在アドレス3] [過去アドレス1] [過去アドレス2] [過去アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・誤差濃度:濃度の誤差を表します。
・現在アドレス:差分を取る現在画像の先頭アドレスを指定します。
・過去アドレス:差分を取る過去画像の先頭アドレスを指定します。
※現在アドレスと過去アドレスは、差分を取るだけなので、入れ違いになっても問題ありません。
2)色相領域情報格納フォーマット
色相領域判定を行った結果データは、SRAMの473,400番地〜473,408番地に記録されます。
・MODE:実行したMODEの値を記録します。(送信した命令の値がそのまま入る)
・(x1,y1)(x2,y2):過去画像と現在画像の違いがある座標を記録します。
※座標の表し方については、この節の上(命令0の上)を参照願います。
3)説明
2画面を撮影して、その差分を取り、過去アドレスの画像と現在アドレスの画像を比べて、誤差濃度以上の濃度の違いがある領域を計算し、473,400番地以降に記録します。記録したデータは、命令4で読み出します。
シリアル接続だけを行っている場合は、撮影アドレスが変更できませんので、一度撮影した画像を任意のアドレスにコピーしておきます。これが過去画像になります。その後、現在画像を撮影し、それぞれのアドレスを指定して判定します。手順は計算例を参照願います。
4)計算例
(手順1)
今、IDが98で、160x120白黒で過去画像を撮影したとします。シリアル接続だけを行っており、CMOS−EYEのアドレス端子全てをGNDにつないだ状態、つまり、撮影先頭アドレスが常に0番地からの状態としますと、画像は0番地から19,199番地に格納されます。
(手順2)
撮影した画像をとりあえず、19,200番地以降にコピーしたとします。
(手順3)その後、現在画像を撮影すると、0番地〜19,199番地に格納されます。これで、0番地を先頭に現在画像、19,200番地を先頭に過去画像が入ったことになります。
(手順4)
ここで、命令96を行います。誤差濃度は60にしました(命令98参照)。この場合の送信データは次のようになります。
[255] [96] [9] [96] [1] [60] [0]
[0] [0] [0] [75] [0]
アドレッシングは、「命令の概要」の下の説明を参照してください。19,500番地は (0x65,535)+(75x256)+(0) で求められますので、アドレスを表す3バイトは
[0] [75] [0] となります。
(手順5)
結果が記録されている、473,400番地を命令4で読み込みます。この例の結果は次のようになりました。
1,0,28,0,49,0,121,0,119
ということで座標 左上(28,49)右下(121,119) の範囲が、濃度が30以上変わったところという結果がでました。この座標を元に、現在画像に四角形を書いたのが上の下の写真になります。ちょうどパンダの部分だけ判定されました。
−命令の概要へ戻る−
■命令98:動体領域抽出
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(12)] [命令(96)] [MODE(0-2)]
[誤差濃度] [現在アドレス1] [現在アドレス2] [現在アドレス3] [過去アドレス1] [過去アドレス2] [過去アドレス3]
[格納アドレス1] [格納アドレス2] [格納アドレス3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
|
・誤差濃度:濃度の誤差を表します。
・現在アドレス:差分を取る現在画像の先頭アドレスを指定します。
・過去アドレス:差分を取る過去画像の先頭アドレスを指定します。
※現在アドレスと過去アドレスは、差分を取るだけなので、入れ違いになっても問題ありません。
・格納アドレス:処理結果画像を格納する先頭アドレスを指定します。
2)説明
2画面を撮影して、その差分を取り、過去アドレスの画像と現在アドレスの画像を比べて、誤差濃度以上の濃度の違いがあるピクセルを黒(0)とした画像を作成し、格納アドレスへ記録します。背景は白(255)になります。
シリアル接続だけを行っている場合は、撮影アドレスが変更できませんので、一度撮影した画像を任意のアドレスにコピーしておきます。これが過去画像になります。その後、現在画像を撮影し、それぞれのアドレスを指定して判定します。手順は画像処理例を参照願います。
3)画像処理例
(手順1)
今、IDが98で、160x120白黒で過去画像を撮影したとします。シリアル接続だけを行っており、CMOS−EYEのアドレス端子全てをGNDにつないだ状態、つまり、撮影先頭アドレスが常に0番地からの状態としますと、画像は0番地から19,199番地に格納されます。
(手順2)
撮影した画像をとりあえず、19,200番地以降にコピーしたとします。
(手順3)その後、現在画像を撮影すると、0番地〜19,199番地に格納されます。これで、0番地を先頭に現在画像、19,200番地を先頭に過去画像が入ったことになります。
(手順4)
ここで、誤差濃度を30、格納アドレスの先頭を38,400番地にしたとして、命令98を行います。この場合の送信データは次のようになります。
[255] [96] [12] [98] [1] [30] [0]
[0] [0] [0] [75] [0] [0] [150] [0]
アドレッシングは、「命令の概要」の下の説明を参照してください。19,500番地は (0x65,535)+(75x256)+(0) で求められますので、アドレスを表す3バイトは
[0] [75] [0] となります。おなじように、38,400番地は150x256なので [0] [150] [0]
となります。
ということで38,400番地以降に格納されたデータを見ると、上の例の右下の写真になります。この画像はニ値化画像なので、収縮−>膨張させても雑音が除去できますが、誤差濃度を上げればさらに精度が上がります。誤差60と誤差90の場合をその横に示しました。
−命令の概要へ戻る−
■命令102:自動機能設定
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(2)] [命令(102)] [設定(0-3)]
・設定:自動機能のON/OFFを設定します。
設定 |
AWB |
AE |
0 |
OFF |
OFF |
1 |
OFF |
ON |
2 |
ON |
OFF |
3 |
ON |
ON |
|
AWB(Auto White Balance):オートホワイトバランス
AE(Auto Exposure):自動露出
※電源立ち上げ後は、どちらもONになっている。
2)説明
センサーには「オートホワイトバランス機能」と「自動露出機能」がついており、CMOS−EYEの電源を立ち上げた後は、この2つの機能が動いています。
自動露出は、撮影環境が多少暗かったり明るかったりした場合の露出を自動的に調整します。
オートホワイトバランスは、センサのダイナミックレンジを活用するために、撮影前に画面周辺の濃度を取得し、なるべく全ての濃度で撮影するように調整します。これにより、1画面内に極端に明るかったり暗かったりする部分があっても、あるていどその部分が撮影されるようになります。
但し、これらの機能、特にオートホワイトバランスは、カラー画像を撮影した場合に、色が忠実に再現されない可能性があります。例えば、画面いっぱいに赤があるような場合は、赤色濃度全体が押さえられますので、全体的に赤が弱くなったりします。このような場合には、この命令を使って、自動機能のON/OFFを行うことで問題が改善される場合があります。
注意)
この操作は、センサー自体を設定するものです。センサー設定には数十〜数百mSの時間がかかりますので、この間にCMOS-EYEに対して何かの指示を与えても無視されます。よって、この操作後は500mS程度待ってから次の指示を与えるようにしてください。
3)撮影例
−命令の概要へ戻る−
−もくじへ戻る−
■命令200:ヒストグラム取得
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(5)] [命令(200)] [MODE(0-5)] [ADD1] [ADD2] [ADD3]
・MODE:画面モードを指定します。
MODE |
カラーモード |
解像度 |
0 |
白黒 |
80x60 |
1 |
白黒 |
160x120 |
2 |
白黒 |
320x240 |
3 |
カラー |
80x60 |
4 |
カラー |
160x120 |
5 |
カラー |
320x240 |
・ADD1-3:ヒストグラム取得を開始するアドレスを指定する
2)説明
この命令が実行されると、CMOS-EYEは指定されたアドレスを先頭に、指定したモードでヒストグラムを取得します。ヒストグラムは 白黒の場合=461000-461765、カラーの場合
R=462000-462765 G=463000-463765 B=463000-463765番地に格納されます。値はそれぞれ3バイトづつで表されます。
{#0:上位BYTE、中位BYTE、下位BYTE}{#1:上位BYTE、中位BYTE、下位BYTE}..{#255..}
という具合です。
この命令はヒストグラムを計算してCMOS-EYEのSRAM内に記憶させるだけで出力はしません。バス接続で読み取るか、次の命令201を実行してシリアル通信で値を取得します。
−命令の概要へ戻る−
−もくじへ戻る−
■命令201:ヒストグラム結果要求
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(2)] [命令(201)] [BWorCOL(0,1)]
2)受信フォーマット (CMOS−EYE−>マイコン)
[255] [ID] [長(2)] [命令(201)] [BWorCOL(0,1)]
この後、ヒストグラムデータが続く...
3)説明
この命令が実行されると、CMOS-EYEは白黒かカラーかで指定されたモードで、ヒストグラム格納領域のデータを出力します。命令200が実行されていなくても、各領域のデータが出力されますので気をつけてください。。
ヒストグラムは各諧調3バイトづつで表現されますので、白黒の場合は3バイトx256階調のデータが、返信フォーマット頭5バイトの次から出力されます。カラーの場合はRGBの順番で3x256x3色バイトが出力されます。
−命令の概要へ戻る−
−もくじへ戻る−
■命令254:セルフチェック
1)送信フォーマット (マイコン−>CMOS−EYE)
[255] [ID] [長(1)] [命令(254)]
2)受信フォーマット (CMOS−EYE−>マイコン)
[255] [ID] [長(1)] [命令(254)]
3)説明
CMOS-EYEはこの命令を受け取った後、正常動作をしている場合は同じデータを返信します。
|
<IOを3.3Vから5Vに変換する方法>
CMOS−EYEはマイコンからバス接続による画像データへの高速アクセスを基本として設計されています。前述の通り、ロボット搭載などの実用的なシステムを考えた場合には、マイコン側もそれなりの計算スピードが要求されます。最近のマイコンチップは高速化の為に、動作電圧が下がってきており、ホビー用などで使われるもので高速なものは3.3V動作が多くあります(2006年8月現在)。よって、CMOS−EYEのIO電圧は3.3V仕様になっています。
ちなみに、余談ですが、CMOS−EYEのセンサー部は2.5Vで動いており、画像取り込み回路の大部分は1.8Vで動いています。
但し、現在ホビー用途で使われているマイコンの電圧は5Vが主流かと思います。プログラムの組み方によっては、5V動作の、少々低速なマイコンでも実用的なシステムは構築可能です。ここでは、自作回路によりCMOS−EYEのIO電圧を3.3Vから5Vへ変換する方法を紹介します。
尚、この電圧変換回路を自作したくないという方や、できるだけシステム全体を小さくしたいという方は、CMOS−EYEに装着するタイプの5V変換ボード(オプション)を用意しております。
<<<この5V変換ボードはまだ試作中です。早くて9月リリース予定>>>
IOの電圧変換ですが、大きく分けて「出力の場合」と「入力の場合」と「入出力の場合」(マイコン側から見た場合)があり、それぞれで回路は異なります。
■マイコン(5V)−>CMOS−EYE(3.3V) へ出力する場合
マイコンからの出力、つまりCMOS−EYEの入力端子は
1)アドレスバス x 19
2)SRAMコントロール端子 x 3
3)画面モード指定端子 x 3
4)シャッター端子 x 1
5)RX(マイコン側はTX) x 1
があります。
CMOS-EYEのIOは、最高耐圧が4Vなので、4V以上の電圧は絶対に加わらないようにしてください。5VマイコンとCMOS-EYEの入力端子の直結はやめてください。
簡単に5Vを3.3Vに変換するのに、「5V入力トレラントの、3.3V駆動のバッファIC」を間に入れるという方法があります。入力トレラントとは、その電圧で入力しても大丈夫(壊れない)というものです。よって、そのICに5Vの信号を入れても壊れずに、そのICは3.3V動作なので3.3Vの信号を出力することになります。バッファは、入力した信号のHIGH/LOWをそのまま出力するものです。これで マイコン(5V)−>CMOS−EYE(3.3V) への変換がされたことになります。
※GNDを省略してます。
このようなICは、各社から色々な製品が出ていますので、「5V入力トレラントの3.3V駆動のバッファ」という条件で探して入手可能なものを使用してください。
CMOS−EYEのSRAMへのアクセス速度は30nS前後ですが、このバッファを経由すると信号が遅延しますので、アクセス時間が変わります(増えてしまいます)。バッファICの信号遅延時間+30nSがアクセス時間となります。
■マイコン(5V)<−CMOS−EYE(3.3V) へ入力する場合
マイコンへの入力、つまりCMOS−EYEの出力端子は
1)BUSY x 1
2)TX(マイコン側はRX) x 1
があります。
まず、使用するマイコンのデータシートを見て、電気特性(外国産の場合はElectrical Characteristics)を確認します。
これは、某マイコンの電気特性を見たところです。ここで、VIHというのが「HIGHと検知する電圧値」です。ここで5V駆動していたとすると、下限値(Min)が0.6x5V=3.0V、上限値(Max)が5V+0.5V=5.5Vとなります。よって、CMOS−EYEから出る3.3Vは、3.0V〜5.5Vの間なので一応HIGHと認識されることになります。よって直結しても動く可能性はあります。
但し、このように、データの確認だけで直結する場合には、その他の回路の影響や、電源の影響で上手く信号が伝わらない可能性も若干ありますので、十分に信号が伝えられているかを確認してください。
また、CMOS−EYEのIOは3.3Vとなっていますが、動作中はHIGHの電圧が3V付近にまで下がる場合もありますので、VIHの下限値(Min)は3Vより十分低くないと安心して使うことはできません。
ちなみに、この例マイコンの電源電圧は、上の表からVcc=2.7-5.5Vなので、マイコンの電圧を5Vより低い電圧(出来れば3.3V)にすれば問題は解決します。電圧が可変なマイコンには、電圧を下げると最高動作クロックも下がってしまうものがありますので注意して下さい。例えば、市販の5V駆動のマイコンボードを持っていて、CPUのデータシートだけ見て電源電圧を3.3Vにしたりすると、マイコンボードのクロックが早すぎて動かなくなる、ということもありえます。
もし、マイコンのVIHの下限値(Min)が3V近辺以上であった場合や、安定して動かしたい場合は、「5V出力トレラントで、オープンドレイン出力の、3.3V駆動のバッファ」を間に入れることで3.3V信号−>5Vにすることができます。
※GNDを省略してます。抵抗は1k〜10kΩ。
これに該当するもので、こちらで確認しているのはTI社のSN74LVC3G07xxxや東芝製のTC74LCX07xxxなどがあります。しかし、どちらも面実装のパッケージ(普通のICよりも小さい)なので、面実装のICしか見当たらない場合はピッチ変換基板を使う必要があります。
ピッチ変換基板。ICをこの上に載せて、ピンセットなどで位置を微調整し、セロテープで固定してハンダ付けします。固定する前にはパッド(ICの足を載せる部分)にもICにもハンダはつけません。パッドを一つ一つハンダ付けするのではなく、全体にハンダ付けして、ハンダ吸い取り線などで余分なハンダを除くと上手くできます。終わったら、端子間がブリッジしていないかどうかをルーペなどでよく確認します。ルーペは電子部品店などで売ってます。
■マイコン(5V)とCMOS−EYE(3.3V)間を入出力する場合
入出力端子には
1) データバス x 8
があります。
双方向に、複数のIO間の電圧変換を行うには、専用の特殊なICが必要です。これらは「2電源レベルシフタ」などの名称のものがあり、入力の状態か出力の状態かを指示する必要がありす。これらのキーワードで、入手可能なICを探して、データシートを十分検討してください。
こちらで確認したものに、TIのSN74LVC4245A、SN74LVCC3245Aや、東芝のTC74LVXC3245などがあります。
これらも、面実装のパッケージしかないので、上のようにピッチ変換基板が必要です。
※GND等を省略してます。
−もくじへ戻る−
<撮影した画像をPCで確認する方法>
CMOS−EYEで撮影した画像は、シリアル接続の命令100を使えばPCなどでモニタに表示することができます。この場合はPC側に、シリアル通信でデータを送受信したり受け取ったデータを画面に表示したりするプログラムが必要です。
浅草ギ研では、PCアプリをあまり作ったことが無い方の為に、 CMOS−EYE Viewer というWindowsアプリを作りました。ご自由にダウンロードしてください。あくまでサンプルとして作っておりますので、CMOS−EYEにはこのソフトの費用が含まれていないことをご了承下さい(改造・改良などはお受けできません。)。
尚、このソフトウェアは.NET2005環境で作っておりますので、あらかじめ、.NET2005環境をインストールしてください。WinXPの場合には、既にインストールされている場合もありますので確認してください。ある特定の言語だけでしたらマイクロソフトのホームページより無償でダウンロードできます。この方法は「VC#2005
Express Edition を使ってみる」に詳しく書いてあります。
■CMOS−EYE Viewer ダウンロード (解凍してexeファイルを起動してください)
■CMOS−EYE Viewer ソースプログラムのダウンロード (VC#2005で作成)
※右クリックで対象を保存してください。
※当サイトに掲載された実行ファイル、ソースコードは自己責任により取り扱いください。
その結果発生した被害、損害等に関して当方は一切の責任を負い兼ねます。
CMOS−EYE Viewer の画面
(使い方)
1)まず、CMOS−EYEが動作する状況にします。シリアル接続だけの場合は、アドレスバスや、M0−M2端子が設定されているか確認してください。詳しくは上の「シリアル接続」の使い方と「バス接続の使い方」を参照してください。
2)PCのCOM1が使用可能かを確認して、CMOS−EYEとPCを付属のケーブルで接続してください。COM1以外のポートを使いたい場合は、ソースプログラムの中の、コンストラクタ内のSerialPort1のPortNameプロパティを変更してビルドしてください。
3)CMOS−EYE Viewerを起動します。
4)撮影されている画像を見る場合は、ID、画像モード、アドレス を指定して、「画像読み取り」ボタンをクリックしてください。
5)CMOS−EYEからデータが送られてきます。この間は、CMOS−EYEがBUSYとなり、LEDが点灯します。データ転送が終了したらLEDは消灯します。
6)データ受信が終了したら、そのデータがイメージに変換されて、画面に出ます。カラーの場合は、RGBそれぞれの濃度も表示されます。受信終了後は、PC側の受信バッファ容量がポップアップで表示されますので「OK」を押してください。正常受信の場合は、受信バッファ容量=0で終了します。
7)ついでに撮影ボタンも作っておきました。PCからの撮影指示は本来の使い方ではありませんが、試し撮りなどをしたい場合はココを押してください。
(ソースプログラムについて)
Viewerを改良したい場合や、他のシリアル命令も動かしてみたい場合には、ソースプログラムを参照願います。解凍すると、こちらで作成したフォルダの内容全部が入っていますが、環境によってはそのまま動かせない可能性もありますのでご注意下さい。プログラムは Form1.cs
だけがこちらで作ったファイルです。フォームデザイナを使用していませんので、適当なWindowsアプリのプロジェクトを作り、Form1.cs
の内容だけをコピー&ペーストすれば問題なく動くと思います。
−もくじへ戻る−
<画像処理の勉強について>
(参考書籍)
読むだけでわかる数学再入門(上) 今井博著 山海堂 ISBN4-381-02192-4
ディジタル画像処理の基礎と応用 酒井幸市著 CQ出版 ISBN4-7898-3707-6
画像処理のシステムを作るのが始めてという方も多いかと思いまが、画像処理の初歩の本でも数学記号が沢山出てくるので、まずはそこで挫折してしまう可能性があります。画像処理の前に、数学を忘れてしまっている方はあらかじめ少し勉強しておいた方が良いでしょう。お勧めの書籍として上に紹介した「読むだけでわかる数学再入門(上)」があります。このページで紹介しているような画像処理は、方程式・行列・三角関数を理解していれば作れるプログラムです。ちなみに画像処理本でよくでてくるシグマ記号は行列です。
画像処理の本はいろいろ出ていますが、多くは理論が先行で、数学(特に記号)に精通していないと読み解くことは難しいでしょう。上で紹介している「ディジタル画像処理の基礎と応用」は、PC上での画像処理プログラミングの解説本ですが、サンプルプログラムが充実しているので、プログラムが書ける方であれば、画像処理の理論を読んでわからなくてもサンプルプログラムで解読するということもできますのでお勧めです。付録のCD−ROMの中にもサンプルプログラムが沢山入っています。
−もくじへ戻る−
<接続例とサンプルプログラム>
・IOの5V変換ボード(オプション)の紹介
・H8/tinyのサンプルプログラム
■H8TinyマイコンボードとCMOS-EYEのバス接続及びシリアル接続例
■H8TinyマイコンボードとCMOS-EYEで、色の記憶と抽出、位置判定
■H8TinyマイコンボードとCMOS-EYEでニ値化画像処理のサンプルプログラム
■H8TinyマイコンボードとCMOS-EYEで線化画像処理のサンプルプログラム
■H8TinyマイコンボードとCMOS-EYEで動体検知のサンプルプログラム
・SH2のサンプルプログラム
■SH2(SH7144F)マイコンボードとCMOS-EYEのバス接続、及びシリアル接続例、及び基本関数例
■SH2(SH7144F)とCMOS-EYEで、色の記憶と抽出、位置判定判定のサンプルプログラム
■SH2(SH7144F)とCMOS-EYEで、ニ値化画像処理のサンプルプログラム
■SH2(SH7144F)とCMOS-EYEで、線化画像処理のサンプルプログラム
■SH2(SH7144F)とCMOS-EYEで動体検知のサンプルプログラム
・ATmega128(AVR)のサンプルプログラム
■ATmega128マイコンボードとCMOS-EYEのバス接続、及びシリアル接続例、及び基本関数例
■ATmega128マイコンボードとCMOS-EYEで、色の記憶と抽出、位置判定判定のサンプルプログラム
■ATmega128マイコンボードとCMOS-EYEで、二値化画像処理のサンプルプログラム
■ATmega128マイコンボードとCMOS-EYEで、線化画像処理のサンプルプログラム
■ATmega128マイコンボードとCMOS-EYEで動体検知のサンプルプログラム
−もくじへ戻る−
<Q&A>
<動作しない系>
Q:電源を入れてもLEDが点滅しない。
A:CMOS-EYEは電源を起動後、セルフチェックを行い、内部に問題がなければ3回点滅します。 上位コンピュータと接続しない状態で、CMOS-EYEに電源を入れただけでもLEDが点滅しない場合は故障の可能性があります。
逆に、LEDが3回点滅した場合に、その後の操作で意図しない動きをした場合は、上位コンピュータとの接続やユーザー側で 作成しているプログラム、環境設定の問題の可能性が高いので、まずそちらを重点的に確認してください。
Q:起動後、LEDが点いたままになる。
A:センサのコネクタの接触が悪い。
A:CMOS-EYE起動中に、SHATTER端子がLOWになっている。 SHATTER端子は内部でプルアップされていますので、なにも接続しない場合、又は接続している上位コンピュータ
の端子が「入力」に設定されている場合はHIGHと認識します。ST端子に接続したマイコンのIOがLOWになっていないか確認して下さい(この場合は撮影しづつける=LEDが点きっ放しになります)。
Q:STをLOW又はシリアル命令で撮影を実行しても、LEDは点灯するが画像が撮れない。
A:撮影中にCE端子をLOWにしていると、CMOS-EYEはマイコンが何かの作業をしていると判断してSRAMに書き込みを行いません。CEがHIGHになっているか確認して下さい。
<設定・操作系>
Q:指定したSRAMのアドレスに読み書きできない
A:SRAMのアドレスは19ビットあります。上位コンピュータで 使っているアドレス指定用の変数の型が19ビット以上であるか
確認してください。マイコンでC言語で開発している場合は、 コンパイラの種類や設定により、型があってないと途中で変数の値が
変わったりします。
A:SRAMの読み書き前にCEをLOWにしているか確認して下さい。
A:撮影は約70〜100mSかかります。ST端子で撮影もしくはシリアル命令で撮影後、この間はSRAMにはアクセスできません。BSY端子を監視して撮影終了後にアクセスしてください。
Q:SHATTER端子をHIGH->LOW->HIGHにしても撮影されない
A:LOWの時間が非常に短いと、CMOS-EYEの方でシャッターを検知できない場合があります。 LOWの時間は最低3uS必要です。
Q:シリアル通信命令だけを使っている場合に、画像が取れない
A:M0,M1,M2,CE,OE,WEピンは必ず設定する必要があります。各端子を、GNDでLow又は、プルアップ抵抗経由3.3VでHighに設定してください。プルアップ抵抗は5〜10kオームを推奨。
Q:IDが変更できない。
A:IDは起動時に設定されます。IDのDIPスイッチを切り替えるときは、必ず電源を切って下さい。
Q:撮影モードが設定できない。160x120又は320x240モードを指定しているのに80x60になってしまう。又は、カラーにしているのに白黒になる。又は、160x120カラーモードにしているのに、160x240(19200)番地ごとに80x60の画面が入ってしまう。
A:CMOS-EYEは起動に3秒ほどかかります。バス接続の時、マイコン側のプログラムで、M0-M1の設定をCMOS-EYE起動修了前に行うと、M0-M1の設定がおかしくなる場合があります。M0-M1の設定はCMOS-EYEが起動終了後に行ってください。大抵は、プログラムの先頭に3秒ほどのウェイトを書けば問題なく設定ができます。
A:モード設定には時間が掛かります。特に、M1とM0を変更した後は200mSほど待たないと設定が反映されないことがあります。
<通信系>
Q:BUSY中(計算中など)に、シリアル命令を送るとどうなるか?
A:後から送られた命令はスタックされ、現在行っている計算処理などが終了次第実行されます。しかし、この場合、後から命令を送ると、計算中であるにも
かかわらずに、BUSYがHIGH(BUSUランプ消灯)になる場合があります。基本的には、マスタ側でBUSYを監視してBUSY中にはシリアル命令を送らないか、
あらかじめ計算にかかる時間を予測・計測しておいて、前に送った命令が終了した後に、次の命令を送るようにしてください。
<画面が写らない、ズレる、変な画像になる系>
Q:画面が真っ白になる。
A:センサのコネクタの接触が悪い可能性があります。
Q:画面がズレる。チラチラが多く入る。
A:電源にノイズが多いか、電源の出力不足の可能性がありますので、電源や環境のノイズ対策を行ってください。
A:アドレス指定が合っているか確認してください。
Q:画面がズレたりズレなかったり、カラーになったり白黒になったりする。
A:ST端子でシャッターをきる場合、高速で何度も入り切りをすると設定が変わる場合があります。 例えば、上位コンピュータをJATGやICEなどでデバックしていて各端子が高速でHigh/Low/ハイインピーダンス状態になったり、
ST端子に単純にプッシュスイッチをつけてチャタリングが発生している場合が考えられます。
A:マイコンとCMOS-EYEを接続していて、マイコン側のプログラムを書き換えると、カラーモードなのに白黒になる場合があります(確率は非常に高い)。この場合は、CMOS-EYEの電源を切り入りすると直ります。
A:プログラムの作り方によっては、上位コンピュータとCMOS-EYEの電源を入れる順番で設定が変わる可能性があります。
CMOS-EYE起動中は、SHATTER端子はかならずLOWにならないようにし(HIGH入力又はハイインピーダンス)
、接続している上位コンピュータの各端子が、変化しないようにしてください。CMOS-EYEの電源だけを入り切りして問題が解決する場合は
このパターンの可能性が高いです。
Q:右側縦1ラインがズレる
A:上位ホストコンピュータとのアドレスバスの相性でまれにこのような現象が起きます。ハード的な対策(配線を短くするなど)を取るしかありませんが、ハードの変更ができない場合は
右縦1ラインを無視してください。
Q:4分割されたように画面がズレる
A:SRAMに書き込んだアドレスと、見ているアドレスが違います。アドレス指定を確認してください。また、モードが違う場合もこのように表示されます。
Q:上の方に小さい画面が二個でる
A:小さい解像度で撮影し、大きい解像度で画面を確認するとこうなります。解像度モードの設定を確認してください。 例)80x60で撮影した画面を、間違って160x120で確認(表示)してしまった。
Q:数行ごとに間引いたような画面になる。
A:大きい解像度で撮影し、小さい解像度で画面を確認するとこうなります。解像度モードの設定を確認してください。 例)160x120で撮影した画面を、間違って80x60で確認(表示)してしまった。
Q:カラーを指定しているのにRGB3つの領域に同じデータが入ってしまう(グレーになる)
A:CMOS-EYE起動時にシリアル通信を行っていたり、シャッター操作をしていると、まれに設定が変わる場合があります。このときはCMOS-EYEの電源を一度切って、立ち上げなおしてください。また、マイコンとCMOS−EYEを接続していて、マイコン側のプログラムを書き換えると、高い確率でこの現象がおきます。この場合はCMOS-EYEの電源を切り入りすると直ります。
Q:画面が真っ黒になる。
A:見ているアドレスが間違っていないか確認してください。
A:このQ&A全体を確認しても尚、画面が真っ黒であれば故障の可能性があります。
Q:色が違う
A:カメラの方で色合いを自動調整しますが、 画面の多くの部分がある一色である場合は全体の色が調整される場合があります。また、
対象物が光るものであった場合も同様です。この場合は、AWBをオフにして下さい(シリアル命令の102を参照。)
Q:周りにぼんやりと白く見える
A:逆光や、上下左右方向からレンズに対してライトをあてると レンズが光って白くなることがあります。ひさしをつけることで回避できます。
<内蔵プログラム系>
Q:シリアル命令の四角形書きこみを行うと、四角ではなく、縦線が無数に入る。
A:座標(x1、y1)(x2、y2)の値が間違っている、例えば、(x1、y1)の方が(x2、y2)よりも右又は下の座標を指定してしまうとこのような現象になります。値を再度確認してください。
Q:平均色記憶命令で、RGBの結果が0となってしまう。
A:調査領域の左上が(x1,y1)で、右下が(x2,y2)です。これが逆、例えばx1の方がx2よりも大きくなると、結果は0で終了します。
Q:平均色相記憶命令で、色相の結果が255となってしまう。
A:調査領域の左上が(x1,y1)で、右下が(x2,y2)です。これが逆、例えばx1の方がx2よりも大きくなると、結果は255で終了します。
ちなみに、色相は通常は最大値は180となります。(角度/2の値が出るので)
Q:色領域判定で、明らかに対象の色があるのに、座標が(0,0)(0,0)になってしまう。
A:上限値と下限値を逆にしてしまうと、どのような場合でも(0,0)(0,0)になります。データを確認してください。
例えば、間違って下限値を120、上限値を50などとするとこのようになります。
Q:色相領域抽出で、指定した色相が上手く抽出できない。又は写っている形状の周囲部に点線状でしか抽出できない。
A:色相が合っているかどうか、まず、平均色相記憶命令で確認してください。色相の誤差を小さくしている場合は、指定した色相と対象物が少しでもズレると、
対象物の周りだけしか検知しない場合があります。色相領域判定(xyで座標を求める命令)では問題ありませんが、例えば、赤っぽい丸などを抽出しようとする場合、
色相がズレていると赤丸の周囲だけ点線状に抽出する場合があります。色相誤差を甘くすると問題ありません。
Q:色相抽出や色相範囲判定の時に、なぜ彩度も必要なのか?
A:色相は色を角度で表します。これは明暗には左右されません。よって、真っ黒に見える場所でも、画素データを計算すると、ある色相になってしまう場合があります。
彩度は、色がはっきりしているか、逆に言うと黒っぽかったり白っぽかったりしていないか(もしくはちょうど灰色)を判定できます。よって、彩度も計算することで、見た目で色が
ついているところだけを抽出することが出来ます。
Q:色相関係の命令は非常に時間がかかるが、早くならないか?
A:色相の計算には、浮動小数点、三角関数など、CMOS-EYEに搭載できるような小規模マイコンには不得意な計算が必要です。CMOS-EYEのシリアル命令は簡易的なものなので、これらの計算は
最適化されておりません。対策としては、非常に速いCPUをバス接続し、最適な計算ロジックを自作する必要があります。 または、あまり早くないCPUでも、浮動小数点を使わずに、三角関数を計算ではなくテーブルで近似値を取ることにより早くなると考えられます。
−もくじへ戻る−
<故障/不具合と思ったら?>
故障のお問い合わせの中で、配線ミスや設定ミスなどが多くあります。故障と思う前にもう一度、配線、電源、設定などを十分確認することをお勧めします。また、使い方もいろいろあり、この説明ページも長いですので、見落としていることがないか、再度、十分にこのページを見直してください。
万が一、初期不良の場合は新品交換とさせていただきます。
故障かどうかの確認を、浅草ギ研で行うことも可能です。こちらで確認できるのは、CMOS−EYE単体だけです。十分にご確認頂いた上でも故障や不具合と思った場合は、まずは浅草ギ研にメールでお問い合わせ下さい。その後は、まずは着払いでお送り頂き、初期不良であった場合は新品をお送り致します。もし、確認の上、不具合が発見できずに正常動作が確認された場合は確認手数料(2000円前後)と送料を申し受ける場合があります。
有限会社 浅草ギ研
CMOS−EYE お問い合わせ係り
<ご質問について>
ご質問については、このページを良くお読みになった上で、メールにてお問い合わせ下さい。お電話でのお問い合わせは受け付けておりません。回答には3日〜一週間程の時間を要する場合がありますのであらかじめご了承下さい。
個別のマイコンプログラミングや電子回路についてはお答えできません。
|
|
|