2012年05月26日

dealextremeの電子パーツ

dealextreme で扱っている 電子パーツが増えてきている。(コンパチ品ばかりだが) Arduino関係 まで扱うようになっている。

お買い得なものや 日本で手に入りにくいものもあるので、ピックアップしてみよう。

お買い得なもの

日本で手に入りにくいもの

これぐらいにしておこう。電子パーツと言いながら、コネクタとか スイッチばかりになってしまった。こういうのは、実際安いし種類も豊富にある。探してみると掘り出しものが見つかるかも知れない。

追記: ミニミニバナナ

EAGLEの45°回転

    ナビゲーションスイッチ MT-008A は、(反時計回りに)45 °回転して マウントする。このライブラリを作ろうとしていたのだが、どうやって 45 °回転した PAD を作ろうか悩んでいた。-- i アイコンでの 設定で、回転角があるのだが、ふと 45 と入れてみたら見事に回転した。(使っているのは、EAGLE-5.7)

    なんだ、EAGLE でも 45 °回転した部品は作れるのか ... と嬉々としてライブラリを作ってみた。座標を計算するのが面倒なのだが、なんとか 出来上がった。 出来上がってから、部品も回転できるのでは?... と思いついてやってみたら、できた。 45 °どころか任意の回転ができるようだ。

    90 °単位しかダメだとばかり思っていた。

    ところで、MT-008A は、ユニバーサル基板にマウント可能かも。作ったライブラリをじっくりみると ... 位置決め用の でっぱり? が、2.54mm ピッチ。三連の真ん中さえ絶縁して引き出せれば なんとかなりそうだ。
posted by すz at 12:29| Comment(0) | TrackBack(0) | 日記

2012年05月24日

JTAGツールとSYNCBB

前記事で MPSSE についてちょっと調べてみたわけだが ... 自分のツールで対応してみたいというのが理由だった。だが、結局は 機能が増えるわけではなく、性能が改善されるだけだ。それはそれで興味深くはあるのだが ... 後回しでも良いだろう。

MPSSE はちょっと置いておいて ... 他のことを考えてみよう。

一般に JTAG Cable は、けっこう高価だ。自作なんかも 行われているわけで、JTAGkey clone が人気がある。ただ、これにしても 部品も揃えないといけないし、それなりにはコストがかかる。なにより作るのが面倒で、お試しでちょっと使うには敷居が高い。

であれば...

  • AE-UM232R を使って、配線だけで 広範囲な電圧(1.8V-5V)に対応。ただし遅い
     -- VCCIO を ターゲットから貰えば良い。配線だけで済むが、接続の手順というものがあるかも。
  • UM232H を使って、3.3V 固定なものの 配線だけで高速に 使える。
     -- UM232H は、3.3V 専用。またシリアルの設定のままだと基本 MPSSE は使えない

こういう風になれば、少しは敷居が下がるのではないだろうか?

    SYNCBB でも FT2232H で 3.87 Mbps までは出た。MPSSE の 1/5 ぐらいの性能だが、常に最高性能を出せるとは限らないわけで、使い物にはなるはず。FT232R だと 随分(ひとけた)落ちると思うが、お試し用と割り切れば悪くないはず。

でも、なかなかこうならないのは、ツールの対応が進まないからだと思う。それについて考察してみる。

OpenOCD

    まずはこれ。FT232R のドライバは標準ではない。誰かパッチを作っていないか調べてみると ...

    なんとあった。
    FT232R based JTAG with OpenOCD patch

    これである。ただし、

    I do not have FT232R. I just feel this might be interesting.

    なんてことが書いてあって、ちょっと心もとない。コード自体はしっかりしているようなので、まぁこれベースで 改造していけば、使えそうな感じはする。ちなみに、OpenOCD-0.5.0 に対してパッチを当ててみたら 2 ヶ所だけ reject された。手で直すのは簡単ではあった。

    ちょっと見た範囲では、ピンアサインがいまいち

    * Bit 7 (0x80): unused.
    * Bit 6 (0x40): /SYSRST output.
    * Bit 5 (0x20): unused.
    * Bit 4 (0x10): /TRST output.
    * Bit 3 (0x08): TMS output. (CTS)
    * Bit 2 (0x04): TDO input. (RTS)
    * Bit 1 (0x02): TDI output. (RXD)
    * Bit 0 (0x01): TCK output. (TXD)

    Bit2 が RTS だから もともと出力。これに TDO を割り当ててしまうと 出力がぶつかり、配線だけで 使うわけにいかなくなる。ピンアサインについては、後で検討してみよう。

UrJTAG

    OpenOCD ほどではないが、次ぐらい? に有名なツール。これのパッチ があるのかどうか 調べてみたが見つからなかった。

    対応するのにどれぐらい大変なのか? ちょっと見てみた。

    まず、UrJTAG は、FT245 ベースの USB-Blaster と FT2232(MPSSE) ベースの各種 Cable に対応している。ドライバは二段構成で ftd2xx , libftdi に対応した 下位ドライバ2 種類と、上位ドライバの構造をしている。

    で、FT2232 ドライバは 2000行ほどあるのだが、各種 Cable に対応している部分が 半分を占める。Cable を1つだけにすると 1000 行弱で、それをベースに すれば、それほどは難しくないかも知れない。USB-Blaster のコードもあり 500行ぐらいとさらに小さい。でも FT2232 ドライバベースの方が良さそうな気がする。

    ただ、ちょっと問題がある。下位ドライバで FT_SetBitMode して SYNCBB(Synchronous BitBang) モードにしたいわけだが、そのときに Direction の パラメータが必要なのだ。MPSSE だと read/write で Direction を変更できるから良いのだが ... SYNCBB だと なにか API を追加しないといけなさそう。

cblsrv-0.1_ft2232

  • Amontec JTAGkey-Tiny (FT2232) を Xilinx iMPACTから使う

    URL はここ。どれだけ知られているのか分からないのだが、JTAGkey clone を iMPACT から直接使えるようにするもの。ただ、Linux では使えないし、MinGW の環境でビルドできなくなっている。そのままでは、(私が)いじるのには向いていない。

    ところで cblsrv は、ネットワーク経由で iMPACT から司令を受けて JTAG の処理をする サーバ。で、司令がどういうものか ... ちょっと見てみたところ、どうも JTAG の STATE 設定 と TDI へ bit ストリームを送り込む (+ TDO から受け取ったストリームを 返す) 構造のようだ。

    ちょうど JTAG のツールを作っているところだから、上位レイヤーと自作のコードを くっつけた方が (私には)扱いやすそうな感じ。いっそのこと 上位レイヤーのロジックをコピーして re-write しても良いかも知れない。

というわけだ。このなかでは パッチが既にある OpenOCD の改造が 一番敷居が低い。ピンアサインを決めるだけなのかも知れない。( 作った人は FT232R は持っていないものの、ピンアサインは MPSSE に準じているところから見て FT2232X でデバッグ済みのような気がする。)

なら、まずはピンアサイン。avrdude-serjtag で基本のアサインは 2 つある。やはり TXD/RXD は空けておきたいから
 
TMS = D7/RI
TCK = D5/DSR
TDI = D6/DCD
TDO = D3/CTS

これが基本か。 あとは 2 pin だが、

/SYSRST = D4/DTR
/TRST = D2/RTS

これで良いのじゃないか?

あと、JTAGkey clone では、SYSRST は双方向 が基本みたいだが、このピンアサインだと 出力専用 にせざるをえない。(これで良いのだろうか?)

cblsrv の調査

    どんなコマンドがあるか調べてみた。

    MSG_COMMANDS:
    CMD_DONE
    CMD_SET_CABLE_OPTION
    CMD_GET_CABLE_OPTION
    CMD_IS_CONNECTED
    CMD_READ
    CMD_WRITE
    CMD_SET_PIN
    CMD_PULSE_PIN
    CMD_START_OPERATION (open みたいなもの)
    CMD_NAVIGATE_TAP (from to の STATE遷移)
    CMD_WAIT_TIME (sleep)
    CMD_WAIT_TCK (N 個のクロック送出)
    MSG_GET_INFO:
    MSG_SET_CABLE_MODE:

    MSG_CLOSE_CABLE:
    MSG_CHECK_SERVER:
    MSG_0x06:

    これで全部。MSG_XXX で、ひとつのコネクション。違う MSG を送るたびに一旦コネクションを切る。MSG_COMMANDS だけは、他のと違って CMD_XX がひとつのコネクションのなかで連続して発行される。

    まず重要なのが、 CMD_NAVIGATE_TAP -- 簡単なものだとしても JTAG のレイヤーを 持っていないといけない。

    CMD_WRITE は、TDI ストリームを送り込む司令で、CMD_READ は、最後の CMD_WRITE に対する TDO ストリーム を返す。常に read しておかないといけないので、ちょっと嫌らしい。

    MSG_GET_INFO/MSG_SET_CABLE_MODE は対になっていて、ケーブル名 や ケーブルタイプ , port , speed を GET/SET する。

    CMD_SET_CABLE_OPTION/CMD_GET_CABLE_OPTION は、オプション名 に値(文字列) を読み書きするもの。これも 汎用的すぎてちょっと嫌なかんじ。

    cblsrv 自体は、C++ だが、クラスを使ってなくて、C に変更するのは容易。これを書き換えていくというのは、ひとつの手なんだが、書き方が自分の趣味に合わない。MSG_XX や CMD_XX に対して関数が割り当てられていて、case 文 と処理するコードが離れている。関数作る分だけ冗長だし、流れを読みにくい。

    やっぱり、re-write したいような ...

自作のツール

  • rtavr_tools-0.10.tar.gz

    一応 作っているものの最新版。ただし 前記事の MPSSE 対応とか この記事に関係するところをいじっている最中。あと、ちゃんと書いておくと もともと汎用的なものは目指していない。自分が使う範囲で便利なものを目標としている。
posted by すz at 20:06| Comment(0) | TrackBack(0) | artemis

2012年05月23日

MPSSEめも

いままで作ってきた コードは、Synchronous BitBang(以下 SYNCBB) Mode を使っている。FT2232H でも FT232H でも SYNCBB は持っているので、コードはそのまま使えるのだ。

遅いという問題はあるが、実用上さほど問題になることはないと思っている 。FT2232H とか使ったら それなりに高速になる。ただ、UM232H とか安価な モジュールも出てきたし MPSSE を使ってみたいような気もしている。MPSSE は、JTAG ケーブルで良く使われているが、実際どういう機能なのか知りたくも思っていた。まずは、どのように使うものなのか調べていこう。

初期化:

    SYNCBB も MPSSE も FT_SetBitMode() を使ってモード設定する。だから、FT_SetBitMode() するまでの手順は、どちらも共通なのだ。

    FT_SetBitMode() で MPSSE モードにした後は、送受信するデータの意味が SYNCBB とは違う。

  • AN108: Command Processor for MPSSE and MCU Host Bus Emulation Modes

    このドキュメントがその詳細。初期化に必要そうなコマンドをちょっと抜粋しておこう。

  • GPIO の設定と読み出し (初期値の設定)
    MPSSI で使う TCK/TDI/TDO/TMS を含めて ADBUS/ACBUS (BDBUS/BCBUS) の設定と読みだしが出来る。


    Set Data bits LowByte 0x80 Value Direction
    Set Data bits HighByte 0x82 Value Direction
    Read Data bits LowByte 0x81
    Read Data bits HighByte 0x83

    LowByte は、ADBUS の Bit番号に対応し、HighByte は ACBUS の Bit番号に対応する。
    また、ADBUS の bit0 - bit3 は、 デバイスにかかわらず TCK/TDI/TDO/TMS が割り当てられる。Direction は 各bit の値が、1 で出力 0 で入力。

      ここで注意点がある。RS232C のモードだと TXD/RXD/RTS/CTS に割り当てられている。bit2 TDO はデバイスからの出力 だが、RS232C でも RTS でホストからの出力でぶつかるのだ。

      なので、一般的には シリアルに割り当てないように EEPROM の設定が必要になる。

  • クロックレートの設定
    FT_SetBaudRate とは別に クロックレートの設定をしなければならない。

    Clock 30MHz 0x8A
    Clock 6MHz 0x8B (default)
    Set TCK/SK divisor 0x86 ValueL ValueH

    0x8A/0x8B は、FT2232D にはない モードで ベースクロック値を変更する。0x86 の Value はこのクロックに対して分周する値(-1)。bit clock を 1 MHz に設定したければ、5 を設定する。30 MHz にした場合は、29。

    この説明は、正確ではないがだいたいこんなもの。

    GPIOの設定 の周期が、この設定で変わるのかどうかは不明。

  • ループバックの設定
    デバッグの初期にしか必要ないと思えるのだが、TDI と TDO を内部でつなげるモード。

    Loopback Enable 0x84
    Loopback Disable 0x85

    ひょっとしたら 初期化で Disable にしないといけないかも。

  • 2232D にない機能
    2232D にない機能は、無視してよいかと思ったのだが、気になるものがあるので、追記


    Enable 3 Phase Data Clocking 0x8C
    Disable 3 Phase Data Clocking 0x8D

    他にもあるが、とりあえず。

データの入出力

    データの出力方法に様々なパターンがあるのだが、JTAG で使いそうなものだけピックアップ。

    Clock Data Bytes Out on +ve clock edge LSB First (no read)
    0x18 LengthL LengthH byte1 .... ByteN
    Clock Data Bytes In on -ve clock edge LBS FIrst (no write)
    0x2C LengthL LengthH
    Clock Data Bytes In and Out (Out +ve / In -ve)
    0x3C LengthL LengthH byte1 .... ByteN

    Clock Data Bits Out on +ve clock edge LSB First (no read)
    0x1A Length byte1
    Clock Data Bits In on -ve clock edge LBS FIrst (no write)
    0x2E Length
    Clock Data Bits In and Out (Out +ve / In -ve)
    0x3E Length byte1

    -ve clock edge とは TCKの 立下り(↓)だと思えるが、説明はないようだ。8bit 単位でない操作は、bit mode を使う。それぞれの mode は、Out/In を行うかどうかで 3 通りがある。 byte mode に設定できる Lehgth は 1 〜 65535。bit mode は、1 〜 7 。

    基本はこの 6 種類で済むはずだが ... ルールがあるのでそれについて

    bit0 : -ve CLK on write
    bit1 : 0 byte mode / 1 bit mode
    bit2 : -ve CLK on read
    bit3 : 0 MSB First / 1 LSB first
    bit4 : DO write TDI
    bit5 : DO read TDO
    bit6 : DO write TMS
    bit7 : 0

    ピックアップした 6 つは、

    0 x x x 1 1 x 0

    のパターンが基本。ただし no read の場合は、bit2 は 0/1 どちらでも良いのかも知れない。 あと 出力は TMS 入力は TDO というパターンがある。TDI/TMS とも write に設定するとどうなるのか? ... 説明は見つけられていない。

rtavr_tools とのマッピング

    rtavr_tools での CABLE ドライバのインターフェイスは、次のように決めている。

    open
    close
    delay bitclock ベースの遅延
    put_tdi_bits TDI ストリームの出力 , Read あり/なし
    put_tms_tdi_bits TDI+TMS ストリームの出力 , Read あり/なし
    setup_port TCK/TDI/TMS の値を設定。
    setup_gpio INIT/PROG/M1/M2 と名付けた GPIO の状態設定
    get_gpio      INIT/PROG/M1/M2 と名付けた GPIO の状態取得
    set_bitclock bitclock の設定

  • put_tdi_bits

    上に書いてないが、最後のビットだけ TMS を H にするオプションがあり、JTAG では良く使われる。

    コマンドの組立てを考えると...

    MPSSE_PUT_BYTES (MPSSE_PUT_GET_BYTES read あり)
    :
    MPSSE_PUT_BITS (MPSSE_PUT_GET_BITS read あり)
    (TMS_HIGH オプションの場合 の追加)
    MPSSE_SET_LOW
    MPSSE_PUT_BITS (MPSSE_PUT_GET_BITS read あり)
    MPSSE_SET_LOW

    こんな感じになる。ただし、bit 数によっては、MPSSE_PUT_BYTES / MPSSE_PUT_BITS のどちらかがない場合がある。read なしの場合は、単に一気に 送れば良いのであまり問題でないのだが ...

    read ありでは、read データを解析しないといけない。MPSSE_GET_PUT_BYTES / MPSSE_GET_PUT_BITS がどういう組み合わせになっていようが、綺麗なビットマップになる。TMS_HIGH オプションがあると 1 bit 分のデータがそれにくっつく。... これぐらいだったら、BitBang 用として作ったものをベースに改造すればいけそうだ。

  • put_tms_tdi_bits

    これは、JTAG の ステートを変更する 時に使っている。操作するビット数はあまり多くない(最大 10bit)が、jtag の API がステート + TDI ストリーム という構造なので、put_tdi_bits と同じような頻度で使われることになる。

    もともとの仕様は、read あり になっているのだが ... どう実装するのが良いのだろう?

    (bit 数分のくり返し)
    MPSSE_SET_LOW (TMS が 変化する場合のみ)
    MPSSE_PUT_GET_BITS (1bit 分)
    MPSSE_SET_LOW (TMS を最後の状態に戻す)


    read の結果には MPSSE_SET_LOW は関係せず、1 バイト 1bit と決まるから、解析は難しくない。

    これで一応仕様を満たすことにするが ... 実は read ありは使っていない。read が入らなければ、write が連続で出ることになり、レイテンシは無視できる。BitBang だと write した分は、かならず read が入る。たぶんこの理由で、MPSSE の方が速くなりそう。

      ところで、JTAG の ステート変更では、TMS のみを TCK で出力するパターンを使う。そうであれば、TMS を変化させる コマンドを使った方が効率が良い。

      ただ、API まで変えるつもりはないので、TDI が全部 0 のとき TMS を変化させるコードにする .. とか最適化のひとつと考えておく。

  • delay
    クロックを発行しつつ delay する というコード。MPSSE_GET_BITS を必要クロック分発行すれば良さそう。ただし、実装する必要はなくオプション。

    実装されていなければ、put_tdi_bits で代替する。

  • setup_port / setup_gpio / get_gpio

    BitBang 用のコードをベースにすることで、簡単につくれる。

    ちなみに、INIT/PROG/M1/M2 は、Xilinx の信号線をベースに決めている。どのように操作するかは、

    (cbl->setup_gpio)(cbl, CABLE_GPIO_PROG, -1);
    (cbl->setup_gpio)(cbl, CABLE_GPIO_M2, 1);
    (cbl->setup_gpio)(cbl, CABLE_GPIO_M1, 0);
    (cbl->setup_gpio)(cbl, CABLE_GPIO_PROG, 0);
    (cbl->setup_gpio)(cbl, CABLE_GPIO_PROG, -1);
    (cbl->setup_port)(cbl, 1, 0, 0); // TMS = 1, TDI = 0, TCK = 0;

    こんな風に固定にしている。-1 は HI-Z (入力) 、あと config ファイルでの割り当てがなければなにもしない。それに加えて論理を逆にする config の設定がある。

(おまけ)I2C の考察

    I2C のコードはますます作る気はないが、メモ。

    MPSSE_SET_LOW/MPSSE_SET_HIGH は、アトミックに 方向を切り替えられる。だから L または HI-Z (入力) という操作は簡単にできる。読み込みの MPSSE_GET_LOW/MPSSE_GET_HIGH も期待通り同期してくれるだろうから、似非 I2C マスターのコードは簡単そうだ。

    似非 と書いたのは、ちゃんと作ると SCL を H にしたい場合は H になったことを確認しないといけないから。読み込みの結果によってループするようなコードにすると、USB は極端に遅くなる。だから、応答性能 の保証がないデバイス相手だと、ちょっと面倒なことになりそう。

    対策としては、遅くなるのを覚悟で、H になったことを確認する (1)。このパターンだと すごく遅くなるだけでなく、AVR USI を使うときに AVR も止まるという弊害がある。

    もうひとつは、delay をちゃんと計算する(2) 。AVR USI 相手 だと、割り込みが起きる フレームの最初のところだけ遅くして、あとは 普通にするとか。たぶん このやりかたが適切だろう。
posted by すz at 21:45| Comment(0) | TrackBack(0) | artemis

2012年05月19日

昇圧 DC-DC コンバータ覚書

前の記事に関係あるが、ステッピングモータ SPG20-1362を使うなら、15V 近い電源が必要になる。これをどうしたら良いかちょっと考察。

MC34063A

    汎用の DC-DC コンバータだと MC34063A がある。これは、昇圧にも使うことが出来て 5V → 12V なんかでも使える。あまり凝らないのなら、これで作るのも良いだろう。

    以前に書いたのだが、この MC34063A の派生版のような IC で M5291FP というのがある。日本語の PDF もあって、細かい説明が書かれていて参考になる。ググるキーワードは、RJJ03D0805 。現在も ルネサスのサイト から ダウンロードできる。

    4.8V (NiMH x4) を入力として 13V 0.5A を作りたいとして、ちょっと検討してみよう。

    まず 部品として、
  • 表面実装用(SMD) インダクタ (27uH , 3.1A) 4個 100円 
  • 表面実装用ショットキーバリアダイオード SS2040FL (40V , 2A) 20個 300円
    を使うことにする。

      Ton/Toff = ( Vout + Vf - Vin ) / ( Vin - Vsat )
       Vf は、ダイオードの 順方向電圧
      Vsat は、トランジスタの飽和電圧

    こういう式がある。Vin から上げたい電圧:Vin が Ton:Toff になるということか。

    ダイオードの 順方向電圧 は電流を流せば増える。0.5 V と見積もっておく。Vsat は、M5291FP のデータシートでは、外付け Tr を使わないなら 0.6V だそうだ。あと電流検出抵抗 Rsc の分がある これは Vin から 0.3V 引いておくことにしよう。

      Ton/Toff = ( 13 + 0.6 - 4.5 ) / ( 4.5 - 0.5 )
      = 2.275

    結果はこうなった。Ton は結構長い。

      Ipk = 2 x Iout x (1 + Ton/Toff)

    次にこういう式がある。電流は 線形で増えていくから ピークは平均の 2 倍。で、平均電流と出力電流の関係は、Iout x (1 + Ton/Toff) 。Toff の時間に 線形に減っていく電流の面積。こういうこと?

      Ipk = 2 x 0.5 + (1 + 2.275)
      = 3.275 (A)

    13V で 0.5A 流したいなら Ipk は 3.275 になる。インダクタの定格をちょっとオーバするが気にしない。

      Lmin = (Vin - Vsat)/Ipk * Ton
      1/Ton = (Vin - Vsat)/Ipk / Lmin
      Ton = Lmin * Ipk / (Vin - Vsat)

    Ipk はこの式で使い、Ton(MAX) を出す。

      Ton = 27u * 3.275 / ( 4.5 - 0.6)
      = 22.7 (us)
      Toff = 22.7 /2.275
      = 10.0 (us)

    計算した Ton + Toff から周波数を計算すると 30.6 kHz になった。

    これで良いの? という気がするのだが ... 5V → 12V 1A の回路例で 10uH なのに 50kHZ に周波数を設定している。0.5A なら 20uH で50kHZ 前後のはずだから だいたい合っているような ...

    効率はどうなるのだろう?

      出力は、13V x 0.5A
      入力は、Vin (4.8V) x ( 0.5A + 1/2 Ipk x Ton/(Ton + Toff) )
      で計算してみた。0.5A 足しているのは、昇圧は Vin に 上乗せするような計算になっていたから。理由ははっきりわからないが、こうしとかないと辻褄が合わなさそう。

      計算すると 82% ... 理論値みたいなものだし、実際はそんなはずはないか ...

    ところで、Ipk と 定格の関係。ダイオードなんかは、定格は平均電流。ダイオードの定格は 2.0A だが、大丈夫なんだろう。インダクタは、10% インダクタンスが減るときの 電流値で、実はもうすこし流せるようだ。これも問題ない。問題は、MC34063A自体。1.5A と書いてはあるのだが、ピークなのか平均なのか?

    ピークなら Ipk = 3.275 (A) だから全然ダメ。だが平均は、

      1/2 Ipk x Ton/(Ton + Toff)
       = 1.14 (A)

    だからいけることになる。

    どっちだろうか? それはやってみれば分かる。ただ、やってみるには、Rsc として 0.1 Ωが必要。... これの入手に難がある。

  • コスモ電子: 酸化金属皮膜抵抗 1W

    とかあるところにはあるようだ。

  • MCR25JZHFLR100 0.1Ω 3225
  • MCR50JZHFLR100 0.1Ω 5125

    デジキーならこのあたり。

    MC34063A の互換品には、NJM2360ADがある。 あと、100均の シガープラグ の 5V アダプタでも使われているのは有名。

    発振周波数設定用のコンデンサの値

      Ct (pF) = 40 x Ton (us)

    だそうだ。1000p ぐらい。


Tiny13A

    上の計算で、周波数や Duty比は分かった。なら Tiny13A とかの PWM でも良さそうなものだ。ADC があるから 電圧を測定できる。出力電圧を上回ったら スイッチングをやめれば良い。

    追加部品は、Nch MOSFET。

  • シングルNchチップMOSFET FD6612A (30V , 8.4A) 10個 200円 売り切れ
  • シングルNchチップMOSFET FD5680 (60V , 8A) 5 個 200円
  • DMS3016SSS SO-8 シングル(デジキー)
  • DMG3420U SOT-23 (デジキー)
  • DMG3415U SOT-23 (デジキー)
  • IRLML6246 SOT-23 (デジキー)

    沢山書いたが、FD6612A,FD5680 は VGS が高く 4.8V をそのまま AVR の電源にしないといけないという制限になる。 DMS3016SSS はデジキーで買えるものだが、置き換えが可能。はなからデジキーから買うつもりなら SOT-23 の DMG3420U も良いかも。

    ... というわけで、Nch の MOSFET の選択もなかなか面倒。

Tiny85/Tiny45

    Tiny85/Tiny45 だと もっと高度なことが出来る。やってみたいのは、コンパレータを使った電流モード制御の追加。

    電流測定用 抵抗として 0.1Ωを用意して、Nch MOSFET と GNDの間に入れる。あと、比較用に 0.3V を 分圧して作る。分圧の元は VCC (4.8V) でも良い。

    制御は、3A 流れることがあれば、Ton を短くする。毎周期 3A 流れた時点で Off にするというのは 厳しいので、3A 以上流れないように Ton を調整するわけだ。

    ピンアサイン案:

    ~RESET 1 8 VCC
    ADC3 2 7 ADC1 (SCK) voltage
    L 電流検出 ADC2 3 6 PWM (MISO)
    GND 4 5 (0.3V)基準電圧 (MOSI)

    #5 は、AIN0 だが、AREF でもある。こちらに 基準となる電圧を入れたほうが融通が利きそうだ。AIN1 は、ADC0-3 と置き換えることができる。Tiny85/Tiny45 は、差動入力 ADC2-ADC3 が使えるので、応用の可能性を考慮して、電流検出は #3 ADC2 にする。
posted by すz at 02:31| Comment(0) | TrackBack(0) | 日記

倒立振子ロボットめも

メモたんく』の ぱんと氏 のところで倒立振子ロボットを作っているのを見つけた。興味深いのでメモしておこう。

オリジナルは、『からくり小僧』の iCHIRO 氏の LIBRA-ZERO/ONE 。こちらの記事も合わせて見ている。

モーター + 車輪:

    まず、モーターは、ギア付きの ステッピングモータ SPG20-1362。 (ぱんと氏は) これに、タミヤの 楽しい工作シリーズ No.96 オフロードタイヤセット を直接付けている。

      記事をみていると、 オフロードタイヤセットの(ホイールではなくて)タイヤが外れる? -- みたいなことが書いてあった。iCHIRO 氏は 同じシリーズの ナロータイヤセットを使っている。ただ、ちゃんとセットアップできれば オフロードタイヤセットの方が良いようなことも書いてあった。

      ... なかなか タイヤの選択も難しいらしい。

    いままでにも、倒立振子ロボットに興味を持ったことはあるのだが、駆動部のトルクと速度をどうするのが良いのか分からなかったので、パスしていた。なるほど、SPG20-1362 が具合が良いのか。-- この組み合わせで 倒立振子ロボットとして実績があるというのは 心強い。

モータ用電源

    モータの駆動電圧は 15V 近いようだ。オリジナルの LIBRA-ZERO/ONE では PIC の PWM で 昇圧 DC-DC コンバータを自作している。

    キーになる要素をメモすると ..

    表面実装用(SMD) インダクタ (27uH, 3.1A) を使用し、PWM周波数は、200KHz位。出力電圧14.4Vで 電流0.4A (5.76Wの出力) 。入力は約4.8Vで2.0A (約60%位の効率)

    この DC-DC コンバータは I2C デバイスとして実装されているとのこと。

その他の部品

    (ぱんと氏は) センサに、小型圧電振動ジャイロモジュールを使っている。

      iCHIRO氏も 使っているのは ジャイロセンサ 秋月の旧製品? 。それはともかく、ジャイロセンサは、角加速度を検出するものではなく、角速度。ふうむ Gセンサは使わないものなのか。

    モータドライバは、何だろう? ユニポーラ型だそうだから、表面実装用トランジスタアレイTD62083AFNG とかで十分? 8ch だから これで 2 個のモータを制御できるし。

モーターを回すだけでも 電源の問題もあるし、なかなかに手応えがありそうだ。その上で 倒立振子 としての制御 、さらに 自由に動かすための制御 がある。

駆動系を作るのは比較的簡単そうで、動かすのに頭を使う。なかなか良さそうなテーマだ。 実際に動かすのも狭い場所で楽しめそうだし、その面でも良い。

部品についても、良い物が結構安く手に入るようになってきた。良い時代になったものだ。

その他のメモ

SPG20-1362

    今は、SPG20-1332 と 2 種類がある。以前は SPG20-332 というのが売られていたのだが、性能が上がってコンパクトになったのが、SPG20-1332 。1332 は、1 ステップ 0.75°で遅い。1362 は、1 ステップ 1°で若干高速で こちらの方が 倒立振子 として向いているそうだ。

      (参考) からくり小僧:ステッピングモータ(SPG20-1362)を使ってみた

      これを見ると、高速回転ではトルクが低下していく。グラフを見ると 600 pps ぐらいで半分。とりあえず 限界を 720 pps と仮定すると 2 回転/秒 (= 0.083sec/60°)。55mm のタイヤなら 35cm /sec 。このときの トルクは 25 mN・m ぐらい ... 1N・m = 10.2 kg・cm だそうだから 0.25 kg・cm ?

      無理やりサーボモータで使われる単位にしてみたが ... 速度はサーボモータ並みだけれども トルクは(小型のものと比べても)はるかに(一桁) 小さい感じ。

    データシートを見ると 2W と書いてある。抵抗は 68Ω。電流を流しつづけたときに 14.4 ^2 / 68 = 3.0W だから こんなもの? 電流的には 14.4 / 68 = 210mA (最大) 。0.4 A 流せれば 2 個駆動できる。

DC-DC コンバータ

    AVRで再実装するとして、PWM は 8MHz が使えるから オリジナルと同じ条件。200kHz だと 40 ステップ。ステッピングモータの駆動専用だから、スイッチングの ON/OFF 制御だけでも良さそうな。

    Nch MOSFET は、平均 2A は 流せないといけないが、どういうのが良いのだろう?

    20V耐圧の SOT-23 品を使うとか ... デジキーになってしまうが、DMG3420U,DMG3415U , IRLML6246 とか。-- Pch版が 秋月にあるもの を選んでみた。
    これらだと、AVR を 3.3V で使うことにしてもちゃんとスイッチングできる。秋月にあるのは、VGS が高いので、4.8V のバッテリーをそのまま電源しないといけない。

    あるいは、秋月で手に入る SO-8 パッケージ シングルの FD5680 (60V , 8A) を取り敢えず使うことにしておいて、デジキーで 手に入る DMS3016SSS に置き換え可能にするとか。

    それはともかく、モータ専用で凝らないなら Tiny13A 程度でも作れそう。

タイヤ

    楽しい工作シリーズだと、

      No.96 オフロードタイヤセット
      No.145 ナロータイヤセット
      No.111 スポーツタイヤ
      No.193 スリムタイヤセット
      No.194 ピンスパイクタイヤセット

    と各種ある。直径 55mm 前後 が安心だが、もうすこし小径でも良いらしい 。他のメーカだと MYU-004 あたりが使えるかも知れない。

(不完全)パーツリスト

SPG20 モーターの代替

    SPG20-1362 のようなギア付きのステッピングモータは、入手が難しい。秋月で安く手に入るから良いが、いずれは在庫がなくなるだろう。手に入らないようになるとすれば .. どうするのが良いのだろう?

    だいたいの性能は、最大 2 回転/秒(120RPM) で トルクは 0.25 kg・cm 程度。( 静止トルクはこの 4 倍ぐらい)。120RPM ぐらいまでで これ以上のトルクがあるものを探せば良い。

    ダブルギヤボックス

      4つのギア比を設定できる。その中に 114.7:1 のギア比があり 115 RPM / 0.8 kg・cm だそうだ。

      車軸の位置は 2 通りあるが、114.7:1 のとき 車軸の位置は外側になるので、問題なさそう。

    ツインモータギアボックス

      227 RPM / 0.42 kg・cm 。少々早く トルクが少ない。

      車軸の位置が良さそう。

    このあたりの ギアボックスが 速度・トルクの面で使えそう。これが使える以上他のものを探す必要はないぐらいに思える。モータは最大 3V 。逆回転が必要なので、フルブリッジ(モータドライバ)も必要。

    問題は回転速度検出だが、中間のギアが露出しているのだから、ストライプ状に塗って、反射型フォトリフレクタ を使えば良さそうな気がする。ただしノウハウがないので どうやるのが適切なのかは分からない。

    あと、DC モータなので、(電圧ではなく)電流をモニタしていれば、回転数は分かるのではないか? 10000 RPM というと 166 Hz 。この値か その 2倍の周波数で 電流が変化するに違いない。

    モータドライバは、秋月で扱っている BD6211F-E2 が良さそう。正転・逆転 ができて、PWM での 速度制御もできるようだ。ボリュームを使った 電圧での回転制御すら可能で なかなか興味深い。

    (参考) モーター性能比較表

      上記のギアボックスは、FA-130 モータを使用している。このモータは ミニ四駆でも使われているので、高性能モータが いろいろ存在する。モータ置き換えも考慮に入れた方が良さそう。

ステッピングモータ制御覚書

    Wikipedia にも 項目があり 制御の仕方の説明がある。

    回し方の基本方式は、一相励磁 と 二相励磁。二相励磁は、2 個のコイルに同時に電流を流すやりかたで、トルクが強いらしい。なら基本はこれ?

      一-二相励磁 というのもある。二相励磁のタイミングを変えて 一相励磁の状態が間にある感じ? なめらかになるだけで、トルクは変わらない?

    回し方の原理は簡単だが、負荷が大きすぎたり、パルス周波数が高すぎると脱調する。脱調しないように制御することが重要。

    負荷が小さければ、電圧は高くなくて良いはず。5V でも 制御の実験はできるかも知れない。DC-DC コンバータ自体が怪しげなら、5V でとりあえず制御の基本コードを作るという方針でも良いかもしれない。

    さて、脱調しないようにするには、回転のスタートとストップで 加速度が一定になるような 制御が必要。ものには慣性があるから 当然だ。また、どこまでも速度を上げられるわけではないから、ある速度に達したら その速度を維持する。

    基本はこういうことだが、倒立振子だから扱うものは基本的に加速度。定めた加速度を発生させるような 機能になっていないといけなさそう。

    それを守った上で、目標の速度にしたりすれば良い? あとは移動距離。方向転換とかは、移動距離をベースにした制御?
posted by すz at 00:06| Comment(0) | TrackBack(0) | 日記

2012年05月14日

ACT8796

興味深い電源IC を見つけたのでメモ。

    Android Tablet に使われている電源用IC として Active-Semi の IC がある。

    ここ を見ると各プロセッサー向けにカスタマイズした電源ICを提供しているようだ。

    所有している Tablet の Novo7 Paladin は、JZ4770 という MIPS の チップを採用しているが、それ用の ACT8600 というチップを使っている。これの データシートがダウンロードできるので見てみた。

    なんと 1つの昇圧 DC-DC コンバータ(OTG 用 5Vに使う)、3つの降圧DC-DC コンバータ(3.3V , core電圧 , DRAM 電源?)、5 つの LDO(レギュレータ) を持っていてさらに バッテリー(1セル)の充電まで出来る。すべての電源をこれだけで管理できて、結構すごいと思ったのだが、Tablet の中に入っているもので、電子工作には無関係。単独で入手もできそうにない。

    では、入手可能で データシートも入手できるものはないかと探したら、1つ見つかった。それが ACT8796 。パッケージは、QFN24 (0.75mmピッチ) で 敷居は高いものの電子工作で一応使える範疇。

    チップ自体は、taobao で入手できる。値段はいろいろあって どれが妥当なのか 判別しがたいが 10個 42元(600円ぐらい?)のところ がある。

    さて、このチップの機能は 3 つの降圧DC-DC コンバータと 3つの LDO 。そして、(LDO も含め)それぞれの出力を、I2C で設定できるようだ。AVR と組み合わせて 実験用の 電源にするとか ... バッテリー駆動の なにかを作るときの電源にするとか ... なにか有用な使い方があるかも。

PowTech PT1502

    ついでに電源用 IC PT1502 のメモ

    これも taobao で購入可能 + データシートあり。

    こちらは、バッテリー充電 機能に加えて 降圧 DC-DC コンバータ + LDO 2 つ。I2Cなどはない。充電関係では、AC アダプタ , USB を区別できる。あと Power-on 回路。AVR とかをバッテリーで 制御するには便利かも。 降圧 DC-DC コンバータ は 1.2V とか core 電圧向きで、ARM とか FPGA/CPLD でも使えそう。

    降圧 DC-DC コンバータの電圧は、FB の分圧抵抗で決める。LDO1 は 3.0V 固定。LDO2 は、(ピン設定で) 2.5/2.8/3.0/3.3V から選べる 。

      PowTech PTxx を買うなら、taobao の この店が 良さそう。PT1502 だけでなく、1セル充電IC(PT6181) , LED 向け昇圧IC(PT4181) , 降圧 DC-DC(PT1281 等) を扱っている。ただ、値段が 安すぎで 不安 -- なにか誤解しているかも。

posted by すz at 23:26| Comment(0) | TrackBack(0) | 日記