2024年4月7日日曜日

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。
右側の縦に2つ並んでいるスイッチはZ方向の上下動のスイッチ、その左のひし形に配置されているスイッチはX/Y方向の前後動のスイッチだ。右上のスイッチはABORTスイッチで押下するとプログラムモードの動作を中止出来る。 左上のスイッチはリミットスイッチを一時的にOFFにするスイッチだ。 スピンドルがリミットスイッチが働く限界まで移動するとFPGAのロジックで強制的にモーターを止めるようにしてあるが、この状態になるとモータードライバのENをソフトで解除し手動でパルスモーターを回転させてリミットスイッチがOFFになる場所まで戻す必要があった。 このスイッチを押下するとリミットスイッチを切り離すので、スイッチ操作でスピンドルを安全な位置まで戻すことが出来る。実際使ってみると非常に便利で原点の位置決めも容易になった。


GUIアプリだが、スピンドルの軌跡をグラフィックスで描画するつもりだがその描画の部分のコードを書き始めた。 今回は昨日実機で描画したデータをグラフィックス描画させてみた。まだ配列のデータ列から描画しているだけだが、最終的にはガーバーデータの座標値かあるいはFPGAのモーター制御部のPCNT値で描画することになる。

2024年4月6日土曜日

自作CPUで遊ぶ 24

電源はCN4030のコントローラのやつを外して使うことにした。このコントローラはあまり分解したくなかったがしゃーない。 また、この電源は24V単出力なので別途5V用の電源も実装した。
これまではスピンドルモーターに鉛筆を括り付けて描画に使用していたが、圧をかけると傾いたりズレたりするので専用のペンを自作した。 φ4の真鍮パイプにボールペンの芯とスプリングを入れた。これでコレットチャックに装着できるようになった。 また、スプリングが入っているので描画面にテンションを掛けながら描くことが出来る。
前回のデータを描画させてみた。
こんどは旨く行った。やはり電源の容量不足が原因だったようだ。

 次は3倍の描画速度で描かせてみた。
これもOK!!   ウェーイ  \(^_^)/

2024年3月31日日曜日

自作CPUで遊ぶ 23

昔、DDS IPを作りその応用としてFUNCTION GENERATORを作った。その時に出力をオシロスコープにつないで幾つかのリサージュ図形を描画させたが、その一つに下図のような図形もあった。 そのデータがまだ残っていたので、これを変換してCNCで描画させてみたのだがうまく動かない。
スピンドルの動きを見ると図形通りに動いていない。 パルス生成部から出力されるPCNT値を抽出して表計算ソフトで散布図を描かせてみた。 UARTを追加してZumi32のソフトからprintfで値をダンプできるようにしたおかげでこのようなことは容易にできる。 描画結果は合っているので、FPGA部分は問題なさそうだ。
色々調べた結果、どうも電源の容量が足りていないようだ。 もっと容量の大きい電源に交換しなくては。。 


 ちょっとまだ速い気もするが、上記と平行してGUIアプリの画面を作り始めている。
なんかまだ機能を入れ忘れている気もしているのだが。。。

今作っているCNCの動作モードとしてはプログラムモードとマニュアルモードがある。前者はガーバープログラムを実行するモード、後者は手動でスピンドルの位置などを操作するモードだ。 画面の左側はプログラムモード用だ。ガーバープログラムは複数を登録できるようにする。最上段のChoice部で実行するプログラムを選択する。 選択されたプログラムの内容はその下のエディタ部に表示される。ここで編集も可能だ。最下部のボタン類でプログラムをロードしたり、編集したり、編集したものをファイルに出力したり、実行したり、中止したり出来る。 
画面の右側は主にマニュアルモード用だ。 最上部のEM STOPは非常停止用ボタンだ。その下の黒い部分はスピンドルの軌跡を描画する。その下のX lmt, ... はリミットスイッチ等の状態表示だ。このアプリはwxWidgets ライブライを使っているが、wxWidgetsにはLED表示器のようなのがないのでcheck boxで代用している。果たして旨く行くかどうか。。  その下の左側はX, Y, Zの移動量と速度、及び各軸の原点設定用のボタンだ。X/Y/Zボタンをクリックするとその時の各軸の位値が原点に設定される。ORIGINボタンをクリックすると3軸が同時に原点設定される。 右側のX+, X-, ...はスピンドルの位置を手動で移動させるためのボタンだ。ボタンを押下している間その方向に移動する。 最下部のModeボタンはプログラムモードとマニュアルモードを切り替える。Goto Zをクリックするとスピンドルを原点に移動する。Auto ZはZ軸の自動原点設定用ボタンだ。Spindleはスピンドルの回転のON/OFFを設定する。PumpはポンプのON/OFFを設定する。 
パルスモータの加速度やDI/DOの極性設定などは常時表示させる必要はないので別ダイアログで操作させるつもりだ。
このアプリはZYBOのPetalinux上で動かす。PetalinuxはSimpleframe bufferでX Windowも動くようになっているのでZYBOのHDMI出力にモニタをつないで表示させることも出来るし、別PCからssh -Xログインして別PC上のXサーバーに表示することも出来る。

… と、まぁこんな感じで構想しているのだが、うまく行くかな?

その前に電源をなんとかせねば。

2024年3月24日日曜日

自作CPUで遊ぶ 22

今使用しているモータードライバはDM556Dというものだが、このドライバはMicro Stepが 800 [pulse/rev] 〜 40000 [pulse/rev]の範囲で設定できる。
Micro Stepが大きければ大きいほどパルス当たりの移動量が小さくなり分解能が上がるが、軸の移動速度とは反比例の関係になるので最高移動速度が下がってしまう。また、最高速度はパルスモーターの回転数の上限とも関係する。Micro Stepが800, 1600, 3200, 6400の場合の上限値を実機で探ってみたところ以下のような結果になった。但し、この値は無負荷(切削していない)状態の値なので、実負荷では下がる可能性がある。
3200以上のMicro Stepの場合の最高移動速度が遅く感じたので今回は1600を設定することにした。 
次に以下のプログラムをzumi32で走らせ、移動速度を色々と変えてX方向150mm, Y方向50mmの矩形を描画してみた。
X方向 60000 [pulse/sec]、Y方向 56000 [pulse/sec]の場合

実際に切削する場合はもっと遅い速度で動かすことになる。 X方向が脱調しているように見える部分もあるが描画した矩形の寸法はほぼ150mm×50mmだった。

2024年3月10日日曜日

自作CPUで遊ぶ 21

コロナに感染してしまった。 ... orz 
最初は妻が発熱の症状になり、二日後に私も発熱した。発熱の具合としては私のほうが重く40℃超まで上がった。全身は痛むし・ガタガタ震えるほど悪寒はするしで非常にシンドかった。熱は3日目位から下がり今は平熱に戻っている。鼻水や喉の痛みや疲労感があり、頭が少しクラクラしているが回復して来ている。 5日間の休養期間も終わったので月曜からは仕事に復帰できそうだ。


さて、CNCだが当初は下図のように*_en信号で動作のON/OFFを制御するようにしていた。
この方法だけだとX/Y軸を同時に加減速制御しながら正確にパルス数のパルスを発生させるのが面倒なので、生成するパルス数( = 移動量)と起動パルスを与えて動作するモードも追加することにした。また、手動送りで移動させる場合などは前者の方法が向いているので両方の制御方法に対応させることにした。前者が手動送り用、今回追加するのがプログラム動作用だ。
以下はプログラム動作モードをシミュレーションした結果だ。 スピンドルがP0(x0,y0)からP1(x1,y1)への移動指示が来た場合ソフトウェアはこれをX, Y各軸の移動量に変換しその値を設定してkickすることになるがこれをシミュレートした。 この例ではXの移動量(= パルス数)を1000、Yのそれを3000とした。P0→P1への送り速度を1000000、加速度を100とした。(テキトーな値) これからX/Y各軸の設定値を図のように求めた。
波形最下部のXY-AXIS speedはX/Y各軸の速度をテストベンチで合成(y = sqrt(X速度^2 + Y速度^2))した結果だ。 以下は加速部の拡大。X/Y軸の加速期間は一致しており、定速時の速度は設定値に一致している。
以下は減速部の拡大。X/Y軸の減速期間はほぼ一致しており、停止時の総パルス数(*_pcnt)は設定値(*_pnum)に一致している。
以下は手動送り動作をシミュレートした結果。 速度や加速度などのパラメータは上記のままで、x_feedを1にしてX軸のみを動作させている。x_feedが1になると加速し、設定速度に達すると定速動作に以降しx_feedが0になると減速して停止する。総パルス数は加速開始から減速終了(停止)までなので、この動作の場合はx_feedが1の期間よりも余分にパルスが発生(移動する)ことになる。
上記以外にもRTLに若干の変更を加えた。具体的にはzumi32のプログラムのデバッグ効率を上げるためにUARTを追加した。これをZYNQ-PSのUART0と接続した。
これでzumi32側のプログラムからのデバッグメッセージをPS側(Petalinux)で見ることができる。 以下はプログラムの例だ。1秒周期のタイマー割り込みの割り込みハンドラ内からprintf関数を使って"Hello World 数字\r\n"文字列を送信させている。 このprintfは30〜40年くらい前にスクラッチから作成したもので最終的にsend_str()をコールする。(引数は表示する文字列) 浮動少数型には対応していないが今回のようなデバッグ用途には十分使える。
Petalinux側はminicomを動かした。
正常にメッセージを受信している。

2024年2月25日日曜日

自作CPUで遊ぶ 20

本体からのリミットスイッチケーブルのコネクタの接触不良が見つかったり色々とトラブルったが最終的に動かすことができた。
まだRTLの作り込みは必要だが、これでソフトウェアの実装作業に入れる。

2024年2月18日日曜日

自作CPUで遊ぶ 19

前回からの続き、 PMODコネクタで余っている信号はヘッダコネクタに出しておくことにした。それとリレーの接点と端子台間の配線は太いのに変えた。
この基板は脳内で回路設計しながら作ったので、PMODの信号との接続関係の確認も兼ねて回路図を起こした。そして、この回路図の情報を元にVivadoのプロジェクトを変更してDI/DOが制御できるようにした。
DI/DOをUターン接続し、DOの出力がDIからリードできるか確認した。結果はOK、問題なし。
これで漸くコイツを動かしながらのプログラム開発に進められそうだ。
今回作ったコントローラはここに置く。
スピンドルモータのコントローラはまだ接続しない。X/Y/Z 3軸の制御が出来るようになってから接続するつもりだ。 その時はちゃんとした筐体に収納するつもりだ。

2024年2月4日日曜日

自作CPUで遊ぶ 18

先週につづき、リミットスイッチ等の接点入力5回路とポンプ等を制御するための接点出力5回路を追加した。接点出力は手持ちのジャンク品の5Vリレーを使った。
リレー接点と端子台間の配線も他と同じエナメル線を使ったが、ポンプを駆動することを考えるともっと太くしたほうが良かったかも知れない。。。ここは修正しよう。
制御信号はZYBOのPMODコネクタに接続しているがまだ13本余っている。表示器やCNCペンダント的なものも使えるようにしたいのだがそれには足りない。 ・・・シリアルI/Fにするか。

2024年1月28日日曜日

自作CPUで遊ぶ 17

以前、デバッグ用コントローラを組み立てたが未完成だったので今日はその続きをした。
パルスモータドライバはDM556Dという中華製ドライバを使っているが、分解して基板を確認したところ制御信号はEL6N137というフォトカプラで受けている。
ネットでこのフォトカプラの仕様を調べると、LEDはVF=1.4V (typ)@IF=10mAだった。Zynqで直接10mA引くのはできないのでNPNトランジスタを介してドライブしている。 手持ちで2SC1815が大量にあったのでそれを使った。回路はユニバーサル基板に実装した。ZYBOのPMODコネクタは全部inchピッチになっているので写真のように横付けする感じ良い感じに接続できた。GNDを強化したかったのでウラ面に銅箔テープを貼ってGND電位にしている。トランジスタのベース抵抗やコレクタ部の電流制限抵抗はチップ抵抗を使った。パスコンは4つのPMODコネクタの3.3V-GND間に10uFと0.1uFを入れた。また各トランジスタのコレクタ部に0.1uFを入れておいた。
あと、X/Y/Z各軸のリミットスイッチと非常停止スイッチ、ゼロ調整プローブ用入力の回路も入れなければならない。

2024年1月14日日曜日

自作CPUで遊ぶ 16

あっという間に年が明けて2024年になってしまった。 
昨年は定年を迎えたり実父が亡くなったりと自分にとっては色々と節目の年だった。
2024年はどんな年になるだろうか。 
今年は何とかブログの更新頻度を上げていければと考えている。

前回はロジック部の実装を行った。
今回はZyboのpetalinux上でzumi32用のプログラムをコンパイルし、zumi32側にダウンロードして動作させるまでの実装と確認をした。zumi32側の命令メモリとデータメモリは下図のようにAXI I/F経由でARMからもアクセスできるようにしている。
petalinuxではこの空間をuioでアクセス出来るようにした。以下はプログラムローダのuioでマッピングしている部分だ。
C言語で書かれたzumi32用プログラムはコンパイルしてelfを生成後、objedumpでtextセグメントdataセグメントをそれぞれ抽出してダウンロード用のデータファイルに変換する。 Makefileで一連の処理を行う。
生成された.codeと.dataをプログラムローダでzumi32側のメモリにロードする。
以下のようなLチカプログラムを書いて、コンパイル〜ダウンロード&実行してみた。
無事動作した。

2023年12月17日日曜日

自作CPUで遊ぶ 15

さてさて、 petalinuxの方は何とか環境ができたのでロジック部の作業に戻った。 vivadoのブロックデザインは以下のようにした。右下のmycnc_topがCNC制御用のブロックで、これはIP化せずRTLを読み込ませている。
mycnc_topは以下のような構成にした。zumi32用の命令メモリとデータメモリの他にzynqとzumi32間のデータ交換用共有メモリももたせる。これらのメモリはZynqからもzumi32からもアクセスできる。また、Zynq、zumi32相互に割り込みを発生できるようにした。データ交換用メモリはDRAMの方が良いかなとも思ったが、まずはBRAMでやってみることにした。
現状、AXI側、zumi32側のアドレスマップは以下のようになっている。
と、今日はここで時間切れになってしまった。 

自作CPUで遊ぶ 25

まだ制御ソフトが完成していないので今まではスピンドルを移動するために一々簡単なプログラムを書いて移動させていたのだが、非常に面倒なのでCNCペンダント的なものを作ることにした。 右側の縦に2つ並んでいるスイッチ...