2013年8月29日木曜日

HAL Configuration

INIファイル

LinuxCNCの実行に必要なINIファイルは、stepconfで作成したパラレルポート用として使用していたものをPaspberry Pi用に変更しています。

Latency-Testを実行してジッタを確認することが基本ですが、適当な過負荷をどうすればよいのか思いつかず、他に何もしないでlatency-testだけを実行して見たところ、[EMCMOT]セクションのBASE_PERIODオプションは、50μSくらいまでは設定できそうです。しかし、実際にLinuxCNCを実行すると、DISPLAYに関する処理に問題がでるようで、Unexpected realtime delayが発生してしまったり、大きめのファイルを開くと表示の途中で止まってしまったり、関係ありそうなオプションを変更してもうまく動作しないので色々試した結果、100μSとしています。

作成しておいたrpi-my-mill.halは、[HAL]セクションのHALFILEオプションで指定します。[EMC]セクションのMACHINEオプションにrpi-my-millとありますが、これは単なる名称です。

ホームスイッチについては、共用する場合の例がマニュアルには見つからず少々悩みました。各軸の[AXIS_n]セクションの、HOME_IS_SHAREDオプションをに設定しスイッチが閉じている時のHommingはエラーとなるようにします。これをやらないと、ある軸のスイッチが閉じている状態で他の軸のHommingが実行された場合にスイッチの開閉を検出できないため異常な動作になってしまいます。さらに、軸共通のホームスイッチ入力を使用する場合の設定として[AXIS_n]セクションのHOME_OFFSETオプションを使用してホーム位置を少し移動させることでHomming動作を実行した軸のスイッチはオープンになるようにしています。これは、HOMEオプションでも同じことが可能かと思います。

変更しませんでしたが、いくつかのセクションにあるCYCLE_TIMEオプションなどのタイミングに関係するものは調整の必要があるのかもしれないし、パフォーマンスの向上が望めるのかもしれません。

INIファイルは以下の通りです。

2013年8月27日火曜日

Milling


試しに切削して見ました。といってもMDFにです。基板を切削するともう少し綺麗ですが、My CNCはこんな程度の実力です。



ちなみに、送りはX、Y軸が4mm、今考えるとなぜそうしたのかZ軸が3mmの寸切りネジにジュラコンスペーサー、モーターは48ステップで1−2相ドライブ、スピンドルは5000回転くらいで中華Vカッターを使用、という機械ど素人が作ったものです。

2013年8月25日日曜日

PPPOEDOWN 

Bフレッツがこんな状態で現在まともに使えておりません。



なので、次に行けず。

2013年8月23日金曜日

HAL Configuration


GPIOコンポーネントを使うためにHALを構成する必要があり、そのためのHAL,INIファイルの説明をします。で、まずは、HALファイル。

最初から作るととても大変になりそうで、Eagle2HALというのもありますが、できるだけ簡単にしたいので、今まで使用していた、パラレルポート用に作ったものを元にして修正することにしました。

もともとは、Stepper Configuration Wizard、を実行して作成したもので、ポートの入出力関係、アップデートのための関数部分を変更すれば良い、ということで、内容は、
追加、変更した部分は、
  • loadrtでhal_rpi_gpioをロード、3行。
  • addfでwrite-gpioとread-gpioをbase、servoスレッドに登録、7、13行。
  • setpで反転する出力を指定、15,16行。
  • netで入出力ピンをstepgenに接続、18〜26行。
です。各軸のスッテプパルスの設定、steplen = 1、stepspace = 0、dirholddirsetup = 58000、dirsetup = 58000は、このままで問題ないようです。入力は1本にしたので、homeスイッチは全軸共通にします。

2013年8月21日水曜日

HAL Component

その3、halrun


出来上がったHAL Componentをターミナルコマンド、halrunで試してみます。
  • ssh -C -Y rpi@xxx.xxx.xxx.xxxで、Raspberry Piに接続。ユーザー名: rpi、パスワード: linuxcnc
  • halrunを起動。
  • loadrt hal_rpi_gpio、で HAL Componentをロード。
で、こんな感じ、
Linux rpi-linuxcnc 3.2.27-xenomai-ro+ #8 PREEMPT Tue May 21 08:22:46
 SGT 2013 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
rpi@rpi-linuxcnc:~$ halrun
halcmd: loadrt hal_rpi_gpio
halcmd: 

  • HALコマンド: show pinでpinの情報を表示
halcmd: show pin
Component Pins:

Owner   Type  Dir         Value  Name
     6  bit   IN          FALSE  rpi-gpio.pin.0.out
     6  bit   IN          FALSE  rpi-gpio.pin.1.out
     6  bit   IN          FALSE  rpi-gpio.pin.2.out
     6  bit   IN          FALSE  rpi-gpio.pin.3.out
     6  bit   IN          FALSE  rpi-gpio.pin.4.out
     6  bit   IN          FALSE  rpi-gpio.pin.5.out
     6  bit   IN          FALSE  rpi-gpio.pin.6.out
     6  bit   OUT         FALSE  rpi-gpio.pin.in


halcmd: 
HAL Componentの名称から、「hal_」が除かれ、「_」は「-」になって、ピリオド、compで配列として定義した、pin.#.out[7]、の部分は、pin.[0-6].out、となります。

  • 次にパラメータ: show param
halcmd: show param
Parameters:

Owner   Type  Dir         Value  Name
     6  u32   RO     0x00000000  rpi-gpio.clrbits
     6  bit   RW          FALSE  rpi-gpio.out.0.inv
     6  bit   RW          FALSE  rpi-gpio.out.1.inv
     6  bit   RW          FALSE  rpi-gpio.out.2.inv
     6  bit   RW          FALSE  rpi-gpio.out.3.inv
     6  bit   RW          FALSE  rpi-gpio.out.4.inv
     6  bit   RW          FALSE  rpi-gpio.out.5.inv
     6  bit   RW          FALSE  rpi-gpio.out.6.inv
     6  s32   RO              0  rpi-gpio.read-gpio.time
     6  s32   RW              0  rpi-gpio.read-gpio.tmax
     6  u32   RO     0x00000000  rpi-gpio.setbits
     6  s32   RO              0  rpi-gpio.write-gpio.time
     6  s32   RW              0  rpi-gpio.write-gpio.tmax


halcmd:
.time、.tmaxはデバック用とのこと。

  • 最後にfunction: show funct
halcmd: show funct
Exported Functions:

Owner   CodeAddr  Arg       FP   Users  Name
 00006  4008997c  404610b8  NO       0   rpi-gpio.read-gpio
 00006  400899b0  404610b8  NO       0   rpi-gpio.write-gpiohalcmd: 


halcmd: 
というふうに確認することができます。

2013年8月20日火曜日

HAL Component

その2、ソースコード


全体像を簡単に説明。

picncのhal_picnc_jr.compを元にさせていただき、ソースコード中のハイライトした部分を必要に応じて追加、変更しています。マニュアルにはごく単純な例題しかないので、正しい記述になっているのか不明です。BCM2835のレジスタ定義等をしているヘッダーファイル、hal_picnc.mini.hもそのまま利用させていただいてます。

マクロを使って記述した関数は、
  1. EXTRA_SETUP() - GPIOのメモリへのマップ、各ピンの入出力設定。
  2. EXTRA_CLEANUP() - マップ開放、各ピンを入力に設定。
  3. FUNCTION(read_gpio) - GPIO4を入力に使用。
  4. FUNCTION(write_gpio) - GPIO17、18、21、22、23、24、25を出力に使用。
3と4をINIファイルでbaseおよびservoスレッドに登録します。1と2は自動的に呼ばれます。

このコード(ファイル名は、hal_rpi_gpio.compとしました。)を、RPi上でcompコマンドによって、コンパイル、インストールして使用します。

2013年8月19日月曜日

HAL Component

まとめを少々、その1。

LinuxCNCでハードウェアをドライブするために必要な部分、HAL Componentを作成する必要があります。マニュアルには、Cで書くと冗長で退屈な作業になるみたいな事が書いてあって、代わりに、HAL Component Generatorを使うとありました。

基本、C言語の構文ですが、独自のパラメータやマクロ的なものを使用することで簡単になるかんじで、filename.compを書いて、compコマンドでコンパイル、インストールします。

sudo comp --install filename.comp

でコンパイル、インストール。

comp filename.comp

として、filename.cを生成、などができます。


さて、Componentの記述についてどうすればという事で、まずは、picncのコード、LinuxCNCのマニュアルを参考に、
  • component
  • description
  • pin
  • param
  • variable
  • option
  • function
  • license
  • auther
 のパラメータの定義が必要でなようで、さらに、
  • EXTRA_SETUP()
  • EXTRA_CLEANUP()
  • FUNCTION()
 といった、マクロを使う必要が有りそうという事がわかりました。

パラメータ部の構文

使用したもののみ説明します。


component HALNAME (DOC);

コンポーネントの名称を定義。 

description DOC;

使い方等の説明を記述。

pin PINDIRECTION TYPE HALNAME ([SIZE]|[MAXSIZE: CONDSIZE]) (if CONDITION) (= STARTVALUE) (DOC) ;

入出力を定義。入出力の方向、bit, signed, unsigned、またはfloatの型、名称などを指定します。配列として定義することも可能。


param PARAMDIRECTION TYPE HALNAME ([SIZE]|[MAXSIZE: CONDSIZE]) (if CONDITION) (= STARTVALUE) (DOC) ;
 
パラメータ、r(ead)、w(rite)、またはrwの指定、bit, signed, unsigned、またはfloatの型、名称などを指定。
 option OPT (VALUE);

singleton yes; - RPiにはGPIOは1個だけなので、インスタンスは1個を指定。

option extra_setup; - GPIOの入出力を設定。

option extra_cleanup; - GPIOの初期化。すべて入力に戻す。

function HALNAME (fp | nofp) (DOC);

ファンクションが1個だけの時は名前を省略できるようです。GPIOの入出力を設定するための関数。

license LICENSE;

ライセンスを記述。

auther AUTHOR;

作成者の記述。


以上の順序は特になく、最後に「;;」をつけてパラメータ部を区切ります。

続く・・・

2013年8月18日日曜日

Homing


All HomeボタンでHome位置に移動させてMDIコマンドでX60、Y60、Z-10に移動、Unhomeallを実行してからもう一度All Homeした時の動画です。





問題なさそう。

2013年8月17日土曜日

インターフェイスボード


よく考えずに作ったらこんな感じになってしまいました〜



一応、Opto Isolatorでアイソレーションして、どうせ大した速度ではないからアイソレータ出力そのままでいいいやと適当に作ったところ、ステッパー信号を作成しているCPLDの入力の立ち下がりががあまりに緩やかになってしまい、うまく動かない対策としてバッファを追加するはめになってしまいました。

ひとまず動作的には問題ないようです。

Analog Devices社のADuMシリーズなどのディジタルアイソレータが使いやすそうで魅力的ですが、すべて手持ちの部品のみで作る目的なのでこんなことになりました。

部品は使い回しで、最終的にはこんな回路で行こうかと。


LinuxCNCの設定では、ホームスイッチとか、テーブルの移動方向とか、ほんと混乱してしまいました。

2013年8月3日土曜日

LinuxCNC AXIS on RPi


Raspberry PiでLinuxCNCのAXISを走らせるとこんな感じ。

 


ssh -C -X xxx.xxx.xxx.xxxで、T5600のノートより接続。 mini GUIだとはるかに軽快になるけど、リアルタイムに何か問題がありそうで、時々接続が固まり描画のアップデートが失われGPIO出力も止まってしまいます。

超遅いのが残念だけど、AXISでいこう。


X軸のGPIO出力。