2016年6月11日土曜日

FPGAでLチカ

FPGAでLチカというタイトルをネットで見る時がある。
マイコンやFPGAの動作確認等の目的でLEDを点滅させることをLチカと言うが、「FPGAでLチカ」と言う場合にどういうやり方がFPGAらしいのか、あるいは、FPGAならではと言えるんだろうか?と考えてみた。

まずは思いつくのは、

reg [xx:0] cnt;

always @(posedge clk)
begin
  cnt <= cnt + 1;
end

assign LED = cnt[**];

見たいな感じでクロックでカウンタを回して、カウンタの上位の方の、LEDの点滅が視認できる程度で変化するビットでLEDを駆動する方法だろうか。でも、これだと当たり前すぎて面白くない。

あるいは、FPGAにソフトマクロのCPUを載せて、

while (1) {
   LEDport = 1;
   msleep(n);
   LEDport = 0;
   msleep(n);
}

のようなプログラムを実行させてLチカする方法もあるだろう。また、リアルタイムOSを動作させてタスクを定期的に起床させてそのタスクでLEDを点滅させるという方法もあるだろう。
でも、これらの方法はFPGAでLチカというよりはマイコンでLチカだし、FPGAならではの方法とは言い難い。

こういうのはどうだろう。

FPGAの出力をCRで遅らせて、FPGAに戻しそれを反転してまたCRに戻す。CR発振回路だ。
FPGA側のRTLは以下のような記述になる。

assign CR_out = ~CR_in;
assign LED = CR_in;

LEDの点滅周期はCとRの時定数で決まる。
この方法はアナログちっくで、ソフトウェアでは実現できない。でも、CとRという外付け部品が必要になるのでFPGAならではの方法とはちょっと言えないかも知れない。

で、最後にこういうのを思いついた。
FPGA内にリングオシレータを実装する方法だ。

この方法の場合、CR等の外付け部品は勿論のこと、クロック源の水晶発振器さえも不要でFPGAの内部リソースのみで実現できる。LEDの点滅周期は直列になっているバッファと配線を含むパスの伝搬時間の2倍の時間となる。
RTL記述は例えば以下のように書けるだろう。

wire [LENGTH-1:0] ring;

assign ring = {ring[LENGTH-2:0], ~ring[LENGTH-1]};
assign LED = ring[LENGTH-1];

あるいは、バッファのプリミティブセルをインスタンスして、

wire [LENGTH-1:0] ring;

BUFFER BUFFER[LENGTH-1:0] (
    .A({ring[LENGTH-2:0], ~ring[LENGTH-1]),
    .Z(ring)
);

assign LED = ring[LENGTH-1];

しかしながら、これらの記述では旨くいかない。回路合成で最適化されて1つのバッファのみの回路になるか、または、エラーになるかだ。実際に試してみたところLatticeの場合が前者でXilinxのISEの場合は後者だった。
そこで、トランスペアレントラッチとして記述し、実動作ではゲートを開きっぱなしにすることにした。

wire [LENGTH-1:0] ring;

assign ring = (~EN)? {ring[LENGTH-2:0],~ring[LENGTH-1]}:ring;
assign LED = ring[LENGTH-1];

このようにringをラッチと見せかけることで合成ツールに最適化されなくなった。

この回路を以前自作した MY FPGA BOARDのFPGA (Lattice XO2 7000HE)に実装してみた。
実際のRTL記述は以下のようにした。 7000HEはSLICE内のregisterの数が6864個なのでringの長さは6864にしている。また、ENはinputとしてPINに出しているが、実際は何も接続せずPINの属性をPULLDOWNにしてLに固定している。

リソースの使用率はきっちり100%になった。


physical view
全てのSLICEのregisterが数珠つなぎになっている筈だ。

SLICEの中身を見てみると…

ラッチが生成されているのが判る。

FPGAに書いて動かしてみた。
D3を点滅信号で駆動しているが、肉眼では視認できない。点滅周期が速すぎるようだ。

オシロスコープで信号を見てみたところ、約90KHzの信号が出力されていた。

そこで、ringの段数を減らす代わりに分周器を入れてringで生成したクロックを分周してLEDを駆動するようにしてみた。

registerが4個未使用になってしまった。

で、FPGAに書いて動かしてみた。今度は視認出来るほどの点滅周期になった。

オシロスコープで測ると約2.7Hzだった。

水晶発振器等の外付けのクロック源を使わず、FPGAのSLICEだけを使ってLチカ出来た。
他にも方法があるだろうか? しかし、上に書いた全ての方法がFPGAで実現可能であり、この多様性というか懐の深さがFPGAならではと言えるのかも知れない。

最高周波数は?
ringオシレータの周波数はゲートの段数によって決まる。。。ということは段数を最小にした場合、どの位の周波数になるんだろう? ということで試してみた。

周波数は約580MHzとなった。


このringオシレータの周波数はFPGA内部素子の遅延に依存しているので、コア電圧や温度の変動の影響を受ける筈で安定度は余り期待は出来ないかも知れない。が、手軽にFPGA内の全てのSLICEを活性化できるので、FPGAボード等を作った場合の電源の供給能力の評価や、FPGAの診断等に応用できるかも知れない。

ということで、久しぶりにFPGAを触るのでリハビリを兼ねてこんなことをやってみたのだった。




2016年6月5日日曜日

CNC4030 19 (チューブ式ポンプの製作 8)

耐久性確認のためにポンプを25時間動作させてみた。
このポンプの故障の仕方で一番恐れているのはチューブが摩耗して穴が空いて冷却液(LLC)が液漏れを起こすシチュエーションだ。それだけは避けたい。避けられない場合は漏洩した液が周囲に飛散したり、台の上が液まみれにならないような対策をしておく必要がある。

動作前のチューブの状態は以下の通りで傷等は無い。






このチューブでこれまでに数時間ポンプを動かしているが摩耗痕などもなくまぁまぁ綺麗だ。

ポンプは水を貼ったモップ用バケツに以下のように設置して連続動作させた。

印加電圧は最初の14時間が24V、その後の10時間が12V、最後の1時間を24Vとした。
途中電圧を下げたのは、深夜だったので動作音を下げるためだ。
モーターの定格は300[rpm]@24Vなので、(300 x 60 x 15 + 150 x 60 x 10) = 360000回転したことになる。(回転数は電圧と直線比例の関係にあると仮定して12V時の回転数を150[rpm]とした。) また、ローラーは6個あるのでチューブは216万回ローラーでシゴカれている筈だ。

運転開始時200mA台だった電流値が12時間経過したころから増え始め最後の方では400mA〜500mA位になっていた。何らかの要因でモーター負荷が重くなったようだ。


25時間経過後のチューブの状態は以下のようになっていた。ローラーや壁との接触面がテカっている。




また、ローラーや壁にも同様のテカリが発生していた。


触ってみると粘性があり水の漏出によるものでは無いようだ。摩擦熱でゴム表面が溶けたか変質したようだ。ローラーは指で弾くと滑らかに回転するのでベアリングの焼付け等は起きていない。

チューブの方に戻って細かく見ていくと、以下のような小さい裂傷が無数できていた。




このチューブゴムの肉厚は1.5mmあり、また、現実的にポンプを24時間動かし続けることは無いのでこの程度の傷で直ぐに液漏れに至ることは無いだろうが、消耗品と捉えて定期的に新品に交換したほうが良さそうだ。


モーターコントローラ
ポンプを連続運転している間、その隣でモーターコントローラを作っていた。

モータードライバはTB6643KQ、コントローラは世界最小クラスかもしれないFPGAボードを使うことにした。このFPGAにはCAN IPを実装して動かすところまではできていたので、これに今回のモーター用のPWM回路を追加して使う。モーターの回転数はボリューム(摺動抵抗)で行う。これをI2C I/FのA/Dコンバータ経由でFPGAで読み取る。ボリュームの設定位置に依らずCAN I/F経由で回転数や回転方向を任意に設定できるようにもするつもりだ。

こ、、、これでやっとFPGAに戻ってこれる。。。(涙)  かな?

上の写真は部品取り付けが完了した段階で配線はこれからだ。
が、今日はこれまで。今日は体調が悪い。わしゃ疲れた。


2016年5月29日日曜日

CNC4030 18 (チューブ式ポンプの製作 7)

もうひとつ別のギヤードモーターを注文していたのがやっと届いた。
モーター自体は4300[rpm]@DC24Vだが、ギヤで300[rpm]に減速している。

これでポンプをうごかしてみたところ、音も静かでトルクもあり動作電流は小さい。これまで試したモーターの中でこれが一番良いのでこれを使うことにした。
2mm厚のアルミで取り付けパネルを作った。

ポンプの底面にも2mm厚のパネルを付け、モーターと以下のように合体させた。



動作の様子
動作時の音は小さい。また、動作電流も200mA台と少ない。

30分ほど連続運転してみたが問題なさそうだ。
耐久性確認という意味では短すぎるのでもっと長時間動作させてみる必要がある。
どうすっかなー


2016年5月22日日曜日

CNC4030 17 (チューブ式ポンプの製作 6)

Z軸の調整をしそこねてプローブの電極を壊してしまった。
AutoZeroを実行するときに速く終わらせたいので、刃先をプローブの極近傍までマニュアル操作で下げるのだが、止めそこねてしまったのだった。

ただし、こういう状況を想定して電極中央部は減肉して曲がりやすくしておいた。

従って、これは意図した通りの壊れ方だ。
電極は新たに作りなおした。


さて、ポンプの方だが、ローラは中心部を真鍮パイプにし、軸は3mmのネジとしてきたが、これだと真鍮パイプがネジに当る音が意外とうるさいことが判ったので、ベアリングを使うことにした。

このベアリングは内径がΦ3mm、外径がΦ7mm、幅が3mmという寸法の物だ。
ローラの中心にΦ7mmの穴を空け、Φ7mmのアルミパイプを両サイドからベアリングで挟む形ではめ込んだ。また、ローラの幅(高さ)を19.5mmまで広げることにした。
これに合わせて壁の部分も作りなおす必要があるが、これはこれまで試行錯誤の残骸が多数たまってしまったのでそれらを再利用(貼りあわせた上で余分な分を削る)することにした。
また、今回チューブも変更した。YoutubeのPeristatic Pumpの制作事例を見ると、皆さん、ゴム製と思われるチューブを使われているようだ。私がこれまで使っていたのはシリコンチューブだが、これは伸縮性に欠けるところがあり、私もゴムチューブに変えようと思って例によってAmazon等で探してみたのだが見つからなかった。そしたら、なんと家から歩いて5分のいつもMDFを買っているホームセンターで見つけた。

油に耐性のあるものとか、色々な径とか種類も多数扱っていた。正に、ラッキー!

で、もろもろの変更をした結果以下のようになった。

チューブコネクタはΦ7mmのアルミパイプとΦ5mmのアルミパイプを接着して作った。



ゴムチューブの接続部分
接着剤で接着しているが、念の為にさらに針金で絞めている。


動作させてみた。

モーターは定格 5000 [rpm] @ DC24V のギヤードモーターを使ったが、これをDC5Vで動かしてみている。 ローラーの真鍮パイプとネジがぶつかる音はしなくなった。また、これまではこの電圧ではポンプ動作しなかったが、ベアリングとゴムチューブの効果だろうかちゃんと機能するようになった。やった。
また、DC12Vで動かした場合は以下のようであった。

ちょっと音がうるさいな。

CNC4030のポンプ用電源はDC24なので、モーターはPWM駆動にして回転数を可変にしようと考えている。やっと、先が見えたような気がするがどうかなー。。。 あと、要確認なのはチューブの耐久性か。




2016年5月14日土曜日

CNC4030 16 (チューブ式ポンプの製作 5)

今、挑戦しているチューブ式ポンプの英語名はPeristatic Pumpと言うらしい。youtubeでPeristatic pumpで検索すると製品や自作品の動画が多数出てくる。
https://www.youtube.com/results?search_query=Peristaltic+Pump
多くの方が色々なやり方で自作されているようだ。それらの動画を見るとローラーは2〜3個の物が殆どのようだ。家の子のように6個の物は見当たらない。実際、ローラーが6個もあるとそれを駆動するためのモーターもかなりトルクのあるものが必要なようだ。電気ドリルくらいのトルクと回転数であれば輸液してくれるのだが… バッテリーがヘタってしまったジャンクの電動ドライバーがあったので、中のモーターやギヤが流用できないか分解してみた。電動ドライバーは遊星ギヤ機構が使われているのだが、シャフト部の形状が特殊なため流用できず、DCモーターのみを外して使ってみた。結果はトルク不足で使えなかった。その他にAmazonで幾つかDCモーターを購入してみている。先日は下の写真の奴を購入してみた。

ところが、届いた商品は下の写真のモーターでシャフト長や先端の形状の他、ギヤボックスの寸法等が商品説明や写真と違うものだった。銘板シールも貼られていない。


この商品はAmazonのマーケットプレイスで購入したので出店者に注文した商品を送ってほしい旨メールで連絡したら、商品の返品不要で購入代金を返金したいのだがよろしいか?との回答だった。ただ、モーターを通電して動かしてみたところ、かなりトルクがあるし、シャフトも先端を切断すれば使えるかなという感じだったのでこの商品を受け入れることにし、返金不要と返信した。
で、このモーターでのポンプ駆動を色々と試行錯誤してみたのだが、トルクはあるのだが回転数が足りない。また、かなり強めに負荷をかけて回転させたりしているうちに遂にはギヤボックス内部の歯車が壊れてしまった。現在、別のモーターを発注して到着待ちの状態だ。例によってAmazonのマーケットプレースからの購入だが出店者は上記モーターのとは違う出店者だ。CNC4030を入手してから、エンドミルや材料、部品等をAmazonで購入している。多くがマーケットプレイスでの購入なのだが、どうもマーケットプレイスはハズレ業者が多い気がする。2ヶ月位前にテスターのリード線を注文して、発送しましたとの連絡メールを受けたのだが、それから待てど暮らせど物が来ない。中国からの発送かもしれないと思って2週間位待ったのだが届かないので出店者に商品が届かないと連絡したら、商品が行方不明ですとのことで返金手続きされてしまった。また、先日はΦ5mmの - Φ5mmカプラを購入したのだが、送られてきたのはΦ5mm - Φ8mmのカプラだった。


これまた、出店者に注文した商品と違うと連絡したら、在庫が無いので送った商品は返品不要で代金を返金しますとの返事で、返金手続きをされてしまった。もー、がっちょ〜〜〜んってな感じだ。
さーて、私は得をしたんだろうか損をしたんだろうか? 図らずもΦ5mm - Φ8mmのカプラが手元に残った訳だが、欲しかったΦ5mm-Φ5mmのカプラはまだ購入出来ていないし、そのせいもあって作業は捗らないし、でもΦ5mm - Φ8mmのカプラはタダで手に入ったし。。。でも、今のところ使い道は無いし。。。うーむ、悩む。
メカ部品関係は別の通販サイトで購入したほうがいいのかもな−。ただ、優良な出店者もあるんだよな。名前を書くと宣伝になっちゃうので書かないが、エンドミルを購入している出店者はそれ以外の品揃えも豊富で、この出店者は国内から発送する場合と中国からの発送する場合があるようで、国内発送の場合、商品によっては通常配達で注文したのに、お急ぎ便よりも速いんじゃねーか?という勢いで夜発注したのに翌日の昼には注文通りの商品が届く。こういう出店者ばかりだといいんだが。


ERROR: Failed to spawn fakeroot worker to run ...

なにかと忙しくてなかなか趣味の時間を確保できない。 ...orz  家の開発機のOSはLinux Mintなのだが、最近バージョンを22に更新したところ、myCNC用のpetalinuxをビルドできなくなってしまった。ビルドの途中で ERROR: Failed to spawn ...