« 2010年12月 | トップページ | 2011年2月 »

2011年1月

2011年1月22日 (土)

25A流せるモータードライブ回路(パワーMOSFETを用いたHブリッジ回路)

前回の記事にある回路を設計したわけですが、実際にブレッドボード上で組み立てて、モーターの代わりにLEDを光らせようとしてみました。25Aも流せる回路で、LEDを光らすなんて少しもったいない気もしますね。

ただし、あの回路図の2SC1815はなくして、上側のFETは[LOW]もしくは[ハイ・インピーダンス]で制御しました。
PSoCと回路を接続して、PSoCはArduinoから来た指令で動きます。
PSoCとArduinoはI2Cで通信します。
Arduinoの役目は、PSoCに指令することです。PSoCの役目はArduinoの指令通りにFETのゲートの開閉をすることです。
上側のFETに接続したPSoCのピンは、オープンドレインLOWに設定しました。PSoC内のレジスタに、0を書きこむとLOWが出力され、1を書きこむとハイインピーダンスが出力されます。つまり、0を書きこめばFETのゲートが開き、1を書きこめばFETのゲートが閉じます。
下側のFETに接続したPSoCのピンは、普通のHIGHもしくはLOWです。

結果:うまくいきませんでした。ドライブすると、I2C通信ができなくなりました。モータードライブ回路とPSoCの接続を電気的に切断すると、再びI2C通信ができるようになりました。

原因:様々な調査の結果、FETの入力容量が大きいため、FETのゲートを開こうとした時にPSoCのピンからFETのゲートに流れる電流が瞬間的に大きくなり、PSoCが不安定になることが推測されました。
2SJ334のCiss(入力容量)は3300pFです。
前回の記事にある回路を見ていただければ分かるように、PSoCのピンとFETのゲートの間に挟んだ抵抗は47Ωです。電源電圧は5Vですから、最大で約100mA流れる可能性があります(実際はもっと少ないはずです)。
ピン出力は10mAに抑えるべきです。
この原因を見つけるのにとても時間がかかりました。

解決方法:
パワーMOSFETのゲートにはマイコンのピンをつながず、小さいFETを間にかまして、制御しようと思います。
トランジスタを使わず小さいFETを使う理由は、トランジスタの方がFETのほうよりも反応時間が遅いからです。
また、パワーMOSFETのゲートとマイコンの間の抵抗をもっと高い抵抗にしFETを追加せずに、済ましてしまわない理由は、パワーMOSFETのゲートとマイコンの間の抵抗をもっと高い抵抗にすると、パワーMOSFET内のコンデンサ(入力容量)を充電するまでの時間が遅くなるからです。すると、ピン出力からゲートが開くまでの時間が遅くなります。
PWM制御をするにあたって、反応時間を早くすることは大切な事です。
追加するFETは、2N7000にしようと思っています。
”パワーMOSFETのゲートドライブなどのスイッチング用途に最適です”
と書いてありますので、まさに使いたいFETです。

 

回路を検証しながら気づいたことその①
「はじめてのPSoCマイコン」の68ページ上には

⑦オープン・ドレイン・ドライブLow('0' : ハイ・インピーダンス, '1' : High出力)
⑧オープン・ドレイン・ドライブHigh('0' : Low出力, '1' : ハイ・インピーダンス)

と書いてありますが、
70ページの回路図を見ても分かるように、

⑦オープン・ドレイン・ドライブLow('0' : Low出力, '1' : ハイ・インピーダンス)
⑧オープン・ドレイン・ドライブHigh('0' : ハイ・インピーダンス, '1' : High出力)

の間違いではないでしょうか?

 

回路を検証しながら気づいたことその②
オープンドレインで出力するときの注意ですが、
PRT0DR |= 0x02;
のように出力していると、
他のピンを出力するときに、オープンドレインに設定したピンに予期せぬ出力が行われることがあります。それは PRT0DR |= 0x02; は一度読み込み(入力)をしてから、出力しているからです。
これは、内部プルアップ抵抗を設定している時も同様です(問題となるのはオープンドレインよりもプルアップの方が多いでしょう)。
僕はしばらく気づかずにいていました。

 

回路を検証しながら気づいたことその③
I2C仕様書を見ていると、予約されたスレーブアドレスがあるとのことなので、それらのアドレスは使わないようにしなければなりません。

 

Hブリッジ回路部分↓

Img_1655_2

2N7000が手元になかったので、47Ωの抵抗を470Ωの抵抗に入れ替えてみました。
すると、正常に動作しました。
よって上に書いた推測した原因は正しいことが証明されました。
470Ωの抵抗に入れ替えても正常に動作しますが、反応時間を速くするため、2N7000が届けば、2N7000を用いて製作したいと思います。

470Ωの抵抗に入れ替えて動作確認したビデオ↓

2011年1月20日 (木)

いろいろできた!?

今日、本校メディアセンター1階多目的ホールにて、SSH発表会で発表しました!!
①ロボカップジュニアとは
②サッカーロボットの紹介
③シンガポールでの試合
④次の製作予定
こんな内容をプレゼンテーションしました。
緊張しましたが、ロボット作りの楽しさは伝わったのではないでしょうか・・・?

  

さてさて、センサー類の試作がとりあえずできました。
①IRセンサー
②方位センサー
③超音波センサー
です。

①IRセンサーについて、
パルスボール対応のIRセンサーです。
・CY8C24123A-24PXI(PSoCマイコン)・・・200円(秋月電子通商)
・IRM-3638・・・210円(共立エレショップ)
この2つを使って試作しました。
デューティ比を正確に測定出来るよう、PSoC内のCounter16を2個と割り込みを用いました。
10回の結果を平均した値を結果として出力しました。
一回833μs(1.2kHz)であるため、結果は過去8msの平均だということです。IRセンサーの反応速度としては十分だと思います。
I2Cで通信できるようにしました。
メインコンピューターにはATmega328P(Arduino)を用い、PSoCはスレーブに設定したため、ArduinoからPSoCに値を返すよう命令しないといけません。
IRM-3638自体が感度がとても高いので、遠く(1.5m)まで感知でき、また、デューティ比を正確に測定出来るようにしたため、LPFを使っていたときより近距離(40cm)もボールまでの距離も正確に求めることができるようになりました。

②方位センサーについて、
HMC6352を用いました。
既製品であるため、ArduinoとI2Cで接続するだけです。
これで、0.1度単位で方位がわかるようになりました。

③超音波センサーについて、
機体が全くできていないため、32.8kHz超音波センサーの自作は中断しています(機体ができれば再開します。)
とりあえず使えるようにするために、浅草ギ研のPINGとArduinoを接続しました。さすが既製品は使いやすく、すぐに接続できました。40kHzで他の超音波センサーと干渉しても、ある程度の精度の距離は測定できます。

とりあえずロボットが動くためのセンサーはできました。
でも、まだIRセンサーについては試作だけなので8個作らなくてはいけません。
また、ロボット全体の設計・組み立てもこれからです。

次はマブチモーター380用に設計したモータードライブ回路検証をしたいと思います(以前設計したモータードライブ回路↓↓:クリックすると拡大します)ただし2SC1815は取り外し、直接PSoCのピンにつなげて、オープンコレクタで制御したいと思います。

Fet_2

動かし方↓

Fet2
略語の意味
 H:High +5.0Vのこと(モーター駆動用とは別電源)
 L:Low GNDのこと
 PWM;パルス幅変調

2011年1月16日 (日)

Arduinoブートローダ書き込み

京都ノードの日程が迫ってきたにもかかわらず、ロボットができていないので、とりあえず超音波センサー自作はやらずおいておきます。
結構精度も上がって、あと少しで完成する気はするのですが・・・残念!!時間さえあればできるのに・・・
ロボットがとりあえず動いたら再開しようと思います。

ロボットが走るためには、最低限
・IRセンサー
・方位センサー
・モーターを制御できること
が必要なので、これらを早く作りたいと思います。

モーター関係は、マブチモータとタミヤのギヤード部分をつなげるスペーサ的なものをアルミ加工して作りました。
このスペーサ的なものを作るのにけっこう時間がかかりました。
これで、モーターとギヤード部分は連結できます。
L字金具は市販の物を使えるのであとは土台のアルミ板を作らないといけません。

さて、デバッグするためには液晶は必須ですので、液晶をI2Cで表示できるようにモジュール化してみました。
液晶はロボットは付けず、ロボットが止まってる時に液晶をつなげようと思っているので、通信する線が10もあれば困ります。
そこで、ATmega328Pを一つ液晶用に犠牲にして、I2Cによって、通信線2本で液晶を制御できるようにしました。

ATmega328Pにブートローダを書き込み、
ユニバーサル基板に設置し配線して、オリジナルの通信方法を決めて、完成です。

これで、Arduinoのソフトウェアから、ATmega328Pに直接書き込めるようにもなりました。
Arduinoも書き込み機も買わなくてよくなりました。

IRセンサーを作りたかった→様子は液晶で知りたい→いちいち10本つなげるのはめんどくさい→I2Cで制御できるようにした
ということです。

まだ、パルスボール用のIRセンサーを作っていないのでがんばって作ります。
ちなみにPSoCマイコンのCounterを利用する予定です。センサー類は全部I2Cで統一したいと思っています。

2011年1月 1日 (土)

あけましておめでとうございます

昨年は大変お世話になり、ありがとうございました。

本年も京都教育大学附属高等学校電子工学部をどうぞよろしくお願い致します。

 

さて、32kHz超音波センサーについてですが、BPF(バンド・パス・フィルター:ある周波数だけ通す電子回路)の周波数帯を広くし、サンプリング周波数を高くすると、精度が良くなりました。感動しました!
+/-3mmくらいになりました!
ですが、近距離(4cm程度)については誤差が多く、謎のままです。

精度は前よりは良くなりましたが、まだゲイン(増幅器の増幅率)の自動引き上げが出来ていません。
だから、現在は測定可能距離範囲が狭ければ測定できるという状態です。例えば50cm~100cmの間だけなら正確に測れるなどです。

ゲイン(増幅率)を自動で引き上げれるようになれば、4cm~300cmくらいまで1mm単位で測定出来る超音波センサーになるはずなのですが・・・

カウンタを使い送信開始からの時間を測定し、だんだんと増幅率をCPUによって上げていけるようにする予定です。