fc2ブログ
        

カメラモジュール奮闘記-USBデバイスFT232HでCPLDからPCへデータを送ってみた-


最終的には、カメラ→CPLD→USB→PCの予定ですが、とりあえずCPLDから正確にデータが送れるのか?!ということで、CPLD→USB→PCで通信ができるか試してみました。

前回も紹介しましたがCPLDはMAXII、USBデバイスはFT232H、両者は同期FIFOで通信をします。

接続様子


PICとCameraは今後のことを考えて繋いでいるだけです。今回は関係ありません。

データシートより、同期FIFOモードにおいて、FT232HとCPLDは以下のタイミングで通信をする必要があります。


今回はPCへ書き込むだけなのでWrite Timingをみます。


TXEはFT232Hの状態を示す信号、'1'の時はビジー、'0'の時はWrite可能な状態です。
WRはFT232Hへ書き込みを命令する信号、'0'にすると同時にデータも送ります。
図より、TXEが'0'になったあと1クロック空けてWRを'0'にしなければならないようです。

これを実現するロジックを設計し、CPLDへ書き込みました。


今回は、送信毎にカウントアップされるデータ"CNT"を送信してみました。

データの受信側(PC)のソフトです。適当に作りました。
FTDIのドライバFTD2XXを使っています。


カメラから画像を30枚送ったと仮定して、それと同じ量のデータ約18[Mbyte]を送信。
約0.5秒で受信できました。平均約36[Mbyte/s]で、USBメモリ並みです。

2[byte]を1[pixel]として、受信データを画像に起こしてみました。


”CNT"は0,1,2...255,0,1,2...255...と256回で1周期、1[pixel]は2[byte]、画像の横幅は640[pixel]なので
640/256*2=5、パターンは5回繰り返されることになります。
どうやらちゃんと受信できているようです。

バイナリエディタでも確認しました。


さて、次はカメラからのデータをCPLDを通してFT232Hへ渡すことになるのですが、ここがなかなか難しかったです。

課題は2つありました。
1. カメラのデータ送信クロック24[MHz]から、FT232Hのデータ受信クロック60[MHz]への変換
2. カメラからはひっきり無にデータが送られてくるから、FT232Hがビジーの時にデータを退避する場所の確保

1.については、カメラからデータを受け取るごとにフラグを立てて、次のFT232Hのクロックでデータを送信してみたり。リングバッファを構成してみたり・・・10種類近くの手を打ってみましたが思うようにいかず。。。
受信はできるんですけどデータが壊れてしまうんです。。。
調べてみるとかなり難易度が高い技だということがわかりました。

2.についてですが、実験からFT232Hは256byte受け取るごとにビジー状態になることがわかりました。
ビジー状態の長さは毎回変わります。
その間にカメラからのデータをRAM等に退避するのですが、長さが予想できない程ばらついているのでRAMの大きさを安易に決められません。

(そして、非同期FIFOや別のモードにすれば解決はできるけど、今回欲しい転送速度は同期FIFO以外では得られないという厳しい現実・・・)

以上より、クロック周波数の変換ができない。退避データの大きさが予測でないということになりました・・・

色々考えましたが、カメラのデータを一度全部RAM等に保存して、あとからPCに送ろうと思います。
たぶんそれが最もシンプルです。

RAMはPCのメモリに使われているSDRAMが安くて高速なので使いたいです。
(まだ、SDRAMがどんなものかもしらないのでなんとも言えませんが)

これからそのデータシートを読もうと思っていますが・・・
そういえば、未だにカメラからちゃんとしたデータが送られてくるのか確認していませんよね・・・w

というころで、ひとまず同期FIFOではなく、非同期FIFOで先ほどの2つの問題を解決して、それでデータをPCに送り、ちゃんとカメラが動くかどうか確認しようと考えています。
(ただし、その場合十分な転送速度が得られないので、カメラの動作クロックを遅くしなければいけません)

被写体が止まっているのなら、非同期FIFOでのんびりデータを送ればいいんですけどね・・・

引きこもり機と人間がバトってるワンシーンは動きが大きいので、30fpsで撮影して、データを同期FIFOで高速に送りたいのです・・・




にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

USBデバイスの作り方

今回いろいろ調べものをしていて、USBデバイスの作り方のまとまった情報が無くて不便に感じたので、紹介します。

□なぜUSBデバイスなのか

PCとマイコンを通信させて何かしたいってことありますよね。
PCからサーボを動かしたり、文字を送ってLCDに表示したりしている方は良くみかけます。
そういうときに便利なのがUSARTと呼ばれる通信方法で、大半の人がUSARTを使っています。
プロトコルが非常にシンプルで多くのマイコンがサポートしているので、まず通信したいときはこれを使うのが良いです。

でもこれ、PCにD-subポートが必要なんです。



最近のPCにはD-subポートが無いかわりにUSBポートがあるので、USART-USB変換機(USB-D-sub変換ケーブル)が必要になります。
USBとUSARTはプロトコルも端子数も違うのでケーブルは必須です。


USBケーブルでPCと自作デバイスをダイレクトにつなげたいですよね。

まあwケーブルはそんなにこだわる部分ではないのですが、USARTのもう一つの欠点は通信速度なのです。
PICを使うとしたら大体1.5Mbps190kbps(一秒間に190,000ビット)= 23.75[kbyte] が限界です。

文字や数字データを送りたい場合には全然問題のない速度ですが、画像データの場合はどうでしょうか。
サイズ640*480[pixel]で1[pixel]が2[byte]の画像を送るとしたら640*480*2=614.4[kbyte]
一枚送るのに約25秒かかります。

2年ほど前からアマチュアの間で液晶制御が流行りはじめましたが、マイコンのメモリが少なくて画像一枚表示するのが精いっぱい。
動画も再生したいけど、マイコンの外に記憶媒体をつけて制御するのは面倒で諦めた人も多いと思います。

デジタル回路を勉強し始めたときってドットマトリクスLED制御で心おどりますよね。
あれがカラーでできたらどれだけ凄いかと思った時期が私にもありました。

私はそのためにSTM32マイコンやFATファイルシステム、SDカードの制御等を勉強して半年がかりで動画再生にこぎつけました。

まあ、これはスタンドアローンで動いてなんぼのものなので、これでいいのですが、今後も大量のデータをやりとりするのにわざわざデータをSDカードに保存して、マイコンで読み込んで、というのでは色々禿ます髪が無くなります。

そこでマイコンをPCにダイレクトに繋いで大量のデータを高速にやりとりしようぜ!USARTじゃ遅いからUSBでやろうぜ!というのが今回思い立った理由です。

□USBとは

USBとはUSBの通信プロトコルとか何なのか。

通信自体は今回選ぶICが勝手にやってくれるので、自分たちが抑えるべきは始めに書いてあるスピードの種類くらいです。難しく考える必要はありません。

スピードにはハイスピード、フルスピード、ロースピードの3種類があります。
それぞれ最大480、12、1.5[Mbps]で通信できます。
USBの規格にはUSB1.1、USB2.0があり、USB2.0のみがハイスピードに対応しています。

先ほどの画像を毎秒30枚送って動画を再生したければ、最低147[Mbps]必要なのでハイスピードが必須です。
USBをサポートするICにはフルスピード以下しかサポートしていないものが多いので注意が必要です。

□デバイス

USARTの場合、Windowsが専用の通信ソフトやAPIを提供してくれているので、PC側では簡単なプログラムやソフトを使えば通信できます。
しかしUSBの場合そのようなものはないので、最悪自分でドライバを書く必要があります。
今回はドライバを書かなくても使えるもの、具体的には仮想COMポート(USART)として扱えたり、専用のAPI(メーカが用意した通信のための命令や関数)が提供されているものを紹介します。

○Arduino(マイコン)

こいつはゲテ物です。
マイコン-PC間はUSBのケーブルだけですが、マイコン内部に先述の’USART-USB変換機 ’が内蔵されているので、USBの皮をかぶったUSARTです。
もちろんPC側でもUSARTとして認識されるので、USARTとまったく同じ方法で使えます。
通信速度もUSARTと同等、とりあえずUSB接続ならいいという人はこれが簡単なのでおすすめ。
Arduino自体も非常に使い易いので、手軽にマイコンを使いたい人には一押しです。

USBマウス程度の通信量ならこれで十分ですが、私的にはUSBデバイスを作ったことにはなりません。
USBデバイスなんだよ!って言えば大概の人は騙せますがw




○USB内蔵マイコン

H8とかAVR、dsPICを使ったことないのでその辺は知りませんが、USBを内蔵したPICマイコンがあります。
170円と非常に安価なのが特徴です。
こいつは先述のゲテ物と本物の顔両方を持ちます。
USART、USBどちらとしても使えるということです。

しかし、USBとして使う場合はPICのライブラリやPC側のドライバを用意しなければなりません。
あとリンクにはUSB2.0対応と書いてありますが、フルスピード以下しか対応していません。
もうゲンナリしますね。苦労して環境を準備してハイスピードで通信できると思ったら、フルスピード以下。
そういう意味でこいつもゲテ物w



○FT232H

ガチでハイスピードを使って手軽にUSB機器を開発したい!という人はこれ。
今一番熱いUSBデバイスです。

USB2.0、ハイスピードに対応しています。
FTDI社のデバイスドライバやAPIが使えるので、PCに接続するだけでUSBデバイスとして認識され、PC側の通信プログラムもAPIを使って容易に記述できます。

ただ、FT232H自体は先述のArduinoやUSBマイコンのようにプログラマブルではないので、例えばセンサからのデータが欲しい、モータを制御したい等の場合は、別途マイコン等が必要です。
FT232HはマイコンとPCの間を仲介する形になります。

それじゃマイコンとFT232Hの間の通信はどうなるの?って話になるのですが、大丈夫。
マイコン-FT232H間はSPI、I2C、FIFO、JTAG、Bit-Bang、FSI等をサポートしています。
特にFIFO、Bit-Bangあたりを使えば非常に高速に通信が可能です。

各通信方法についてはデータシートを参照願います。(多すぎて紹介できないw)

データシート

□FT232Hの使い方

PCに接続します。
Ver2.08.14最新FTDIドライバからドライバをダウンロード、デバイスマネージャ等からインストールしてください。

FT_Prog_v2.4.zipをダウンロード、展開して”FT_PROG.exe”を実行
FT232HのEEPROMを書き換えるアプリケーションです。通信方法等を設定できます。
EEPROMなので一度設定したらリセットしない限り保持されます。
使い方はFT_Prog モードの変更方法を参照。

PC側の通信ソフトはC#で作れます。WindowsならVisualStudioで作れば良いと思います。
APIのインストールや使い方はFT245RL用DLLの使い方(中野氏)を参考にしてください。
APIの使い方D2XX Programmer's Guideを上手く噛み砕いて説明されています。

(電子工作したいだけなのに、PC側のソフトを作るのはちょっと・・・って人のためにAcknowrich系のソフトを作ろうかなと思っていまが、先述の通り通信の種類が多いので、一部に限定、もしくは公開しないかもです・・・)

マイコン-FT232H間の通信方法はデータシートをみてください。
こういう説明書は図が多いので、英語だからぱっと見て諦めなくても案外なんとなくでいきます!w

ピンアサインはデータシートと説明書を参考にしてください。

ページ数は多いですがピンアサインとタイミングチャートあたり4ページ程度をみればオッケーです。

あと、大まかな通信方法は先述の”FT_PROG.exe”でEEPROMをいじることで設定できますが、細かい部分はソフトウェア的(通信時にPCからコマンドを送る)に設定する必要があります。
その辺に注意して進めればいいと思います。

私自身今日FT232Hと同期式FIFOで通信が確立できたところなので、とりあえず提供できる情報はこの辺までです。
ちなみに実測の平均通信速度は約294[Mbps]≒36[Mbyte/s]、PCの状態に左右されるのでハイスピードの最大速度480[Mbps]には及びませんが、640*480[pixel]、30[fps]のカメラからリアルタイムでPCにデータ保存したい私にとっては十分でした。



にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

マシンガン撮影カメラ製作記-CPLDライターの製作-

⊂二二( ^ω^)二⊃ぶーん

この動画に病みつきの回路師です。

さてさて

さっそく購入したCPLDライターでMAXII(CPLD)へ書き込みをしようとしたのですが、うまくいかず試行錯誤していました。


このライターを接続した際に、PCにLTP(プリンタポート)として認識されないと、書き込みソフト側でライターとして認識されないのですが、ただの”USB印刷ポート”としてしか認識されず。。。

どうやらちゃんとしたUSB-プリンタポート変換ケーブルが必要だということがわかったのですが、調べるうちにケーブルを買うよりもUSB接続型のCPLDライター(USB-Blaster)を自作した方が安いことが判明

純正のUSB-Blasterは数万円する代物ですが、自作すると400円程度で済む上に純正品に対して性能が劣らないという非常にすばらしい情報を発見

さっそくhshsしながら秋月に注文をかけて部品が到着


部品の配置


はんだ付け


完成


この空いているソケットにはPIC18F14k50というマイコンが入るのですが
そのライターがないので、PICkit2を購入
ライターのためのライターとかややこしいwww


組み立て


完成


PICkit2の書き込みソフトをインストールしてPIC18F14k50へデータを書き込み


書き込み成功


PIC18F14k50をセット
これにてCPLDライターは完成


さっそく動かしてみる
PCへ接続するとデバイスマネージャにUSB-Blasterの文字が


Alteta純正のドライバ(Quartusに同封されてるもの)をインストール


しばらく待つと・・・


キタ――(゚∀゚)――!!


完了と同時にLEDが点きます


USBデバイスを自作したのは今回が初なのでちょっと興奮しましたw

CPLDへ書き込みをするソフトQuartus側でもちゃんと表示されました
ちなみにQuartusIIのバージョンは10.0です最新版の11.1では何故か認識されませんでした


あとは実際にMAXII(CPLD)に書き込みができるか試さないとですね!





にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

マシンガン撮影カメラ製作記-その4-

こんばんわー、最近コミュ害に悩む回路師です。

コミュ害っていうほど深刻じゃないんですけど、しばらく生身の人間と接していないので、久しぶりに外部の人と話したら言葉がでなくて焦りました(汗)

そんなことはさておきw

カメラの部品が届きましたよ。

MAXIIからのデータをUSBへ変換するFT232H
USB2.0の高い転送速度(480Mbps)で動作します


カメラデータからFT232H用のデータを生成するMAXIIとそのライター
MAXIIは最大300MHzのオシレータを搭載、今回は使いませんがそれくらい高速ということです
ライターは1000円、たぶん市販品で一番やすいしコンパクト
両者ともオプティマイズで購入


ライターとPCを繋げるUSB-プリンタ変換ケーブル
先のライターもそうですがFPGAやCPLDの書き込みには
プリンタポートが一般的に使われるのでポートがないPCには必要です


組み立てました、FT232H



MAXIIとライター


まずは、それぞれを接続するところからです。
カメラ→MAXII→ FT232H→ PC

そしたらMAXIIのロジック部分を設計して組み込んでいこうと思います。
ロジックの記述は前に授業で習ったVHDLがいいのかな。



にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

カメラモジュール奮闘記-その3-

カメラが使えそうだということがわかってきたので、カメラから流れてくるデータの保存方法を考えました。

以前書いたこの回路


久ぶりに見たら無駄だらけで吐き気がしたんですw

こんな面倒なことをしないでもっと簡単にならないかと思い、世の中の記憶媒体やら通信方式やらについて、3日間こもりっきりで調べていました。

今までカメラのデータをRAMに保存して、それをPCに取り込んでということを考えていたのですが、そもそもそれが面倒な考え方でした。

カメラから出るデータをそのままPCに流し込めばいいんですよ。
そうすれば撮影効率も大幅にアップしますし。
そのアイディアは前からあったんですが、RS232Cじゃ速度が足りないしUSBを使うのは難しそうだし・・・で断念していました。

でも探してみると案外でてくるものです。

FT232H(1ch)高速USBシリアル変換モジュールキット

I2C、SPI、FIFO等をUSBへ変換してくれるICです。

カメラモジュールは1ピクセルのデータ16ビットを上位と下位8ビットずつに分けて、8ビットパラレル(24MHz)で出力するようになっています。
そして、FT232HはFIFOモードにすると8ビットパラレル(60MHz)の信号を読み込みUSBに変換してくれます。

つまりFT232Hでカメラモジュールの信号をそのままUSBへ変換できるのです。

配線イメージ


しかし、実際はそのまま変換というのは無理で、FT232Hから出力される同期クロック周波数60MHzにカメラデータの出力周波数24Hzを合わせなければいけません。

さらに、このモードだとFT232HはいわばカメラとPCを繋ぐパイプのようなものなので、例えばPCが別の処理をしていて、ちょっと今はデータをうけとれないよぉ//ってなったときに
カメラからどんどんデータはくるわ、PCにはデータを拒否されるわでFT232Hはデータを破棄せざるを得なくなります。

実はそんなときのためにFT232Hから、ちょwwおまwwwまてよwwwwという信号がカメラに向けてでるようになっているので、それを見るようにしないといけません。

そこでカメラとFT232Hの間にロジックデバイスMAXIIをいれます。

このMAXIIに先ほどの転送レートとデータ破棄の問題を解決してもらいます。

(実際、USBシリアル変換モジュールとロジックデバイスが一緒になっているキットは結構出回っているのでそのマネごとに近いです。ただ自分で作った方がかなり安く済みます。)

配線イメージ


これで転送レートの変換とPCの受け取り状態はみれるようになりました。

しかし、このままだとPCが受け取れない分のデータの保存場所がないので、外付けRAM等必要です。
まあ、受け取れない状態がどれだけ発生するのか検討がつかないので、とりあえずこのまま作ってみます。

そもそも60MHzの受け取り体制に24MHzでデータを送るんですから、うけとれないよぉ//にはならないかもしれないし。

そんなわけで、今FT232HとMAXIIを注文して待っているところです。



にほんブログ村 その他趣味ブログ 趣味の工作へ にほんブログ村 その他趣味ブログ ビデオ撮影・編集へ

プロフィール

回路師

Author:回路師
趣味がロボットと動画製作です。
便利な機械やあほなマシンの動画を投稿しています.

最新記事
最新コメント
カテゴリ
電子工作キット








月別アーカイブ
書籍






Twitter
リンク
RSSリンクの表示
ソーシャル

検索フォーム