PSoC 手ならい

本当にメモ的だけど、Cypress PSoCのuniversal digital block(UDB)を使って何か作ってみようかと思ったので。学習の過程をメモする。

学習環境

秋月でPSOC 4200 prototyping kit (600円)を2枚購入。隣に置いてあったPSOC5LPが搭載されたキットは2000円弱と高いが、せっかくなのでこれも購入。

4200 prototyping kit はとっても安いが、USBから書き込むためには、ターゲットに uart経由で書き込むブートローダーが書き込まれている必要があり、結局SWDから書き込みツールが欲しくなるが、実はPSOC5LPのキットが高い書き込みツールの代わりになるそうで、買っておいてよかった。性能的にはPSOC5LPは私には無駄ですが。

PSoC Creator 4.2 をPCにインストールする。4200 prototyping kit に書き込まれているLチカ+UARTブートローダーのプログラムもダウンロードする。

こちらを参考に(というか指示通りに)、Lチカコードをいじくって、UARTブートローダーを使って書き込み(最初マニュアルでスイッチを押しながらUSBに接続してブートローダーに入れる必要があることを理解しておらず、悩む)、プログラムの動作を見る。

PWMのクロックを100kHz にしたりデューティーを変えたりしてLEDの調光をして遊ぶ。超簡単。

今日はここまで。

1枚目は書いたプログラムの動作を ロジアナで 観察しようと思うのでピンヘッダーを適当につけようかと思う。

ミニ旋盤 CNC化(3)

最後に、ミニ旋盤CNCの方にも中華手パを付けてダイアルぐるぐるできるようにしました。

aliexpress などで安く売っている手パを付けます。

フライスの方はもう何年も前に中華手パを付けて動かしていましたので、簡単だな、と思っていたのですが、PC周りでいろいろとてこずりました。

まず、ミニ旋盤のコントロールをするPCに手パを付けるにはプリンタポートの増設が必要なのですが、expressPCIのカードを買ってきて差したら認識されず(lspci -v で見てパラレルポートが見えていない)。

すでに動いているPCのほうについている同じ型のカードを差しても、認識できませんでしたので、どうもマザーボード不良?のようでいろいろ粘ってみたのですが、最終的にはamazonで売っている安いマザーボードで交換しました。PCは何年も前に組みかけて途中ほったらかしになっていたのを使っているので、マザーボードだけ交換しようとしても同じ規格(LGA1150のmicroATX)のマザーがもう売っていないという。。。

今のCPU、今のメモリで組みなおしたほうが良いようにも思うんですが、意地になって前ので動くようにします。

それから、入手した手パも説明が(当たり前なのか?)ごくごくあっさりしたもので、結局ふたを開けて中を見る羽目になったのと、プリンターポートへの結線についても、Webに明確に書いてある記事が見つからず、かといって数年前に作ったものをばらして配線を確認するのもめんどくさく、うだうだしてました。

紆余曲折の末動くようになった配線は下記の通り。

  • DB25 pin    function   wire_color remarks
  • 1  pilot lamp LED+  green/black    (strobe-)
  • 2    phaseA green
  • 3  phase B    white
  • 4 x  not   yellow
  • 5 y  not   yellow/black
  • 6 z   not  brown
  • 7 4   not brown/black
  • 8    X1  scale1 not  gray
  • 9    X10 scale2 not  gray/black
  • 10  X100  not orange
  • 12  5 pink
  • 13  6 pink/black
  • 15 estop   blue (C)    
  • 18-25 GND 0V に接続
  • 0V — blue/black (CN)  Estop common
  • 0V   orange/black       common selectors
  • 0V  black  encoder power ground
  • 0V  LED-    white/black
  • +5V from USB 
  • +5V  red  encoder power

LEDはプリンタポートのstrobe から点灯させる設定ですが、3.3Vしか出ていない拡張用プリンタポートでは点きません。not というのはスイッチでGNDに接続することで選択などをしているので、プリンタポートにとっては負論理ということです。

今回購入した中華手パはenable SWというのが付いていてこれの意味がわからなかったのですが、これを押しながら操作しないと無効ということの様子。commonがこのスイッチを必ず通るようになっているので、まさに押さないと何も伝わりません。

CNC化されたミニ旋盤全景。

まあ、一応完成ということでひと段落です。(塩ビのマウントプレートはやはり不適切なので、後で作り直しますが)

ミニ旋盤 CNC化(2)

スピンドルの制御をlinuxcncからしようとして、あれこれやっていましたが、旋盤本体のコントローラーについているボリュームで速度制御をするのと、linuxcncから指示した速度に制御するのを両立するのに苦労しています。最初はlinuxcncからのPWM出力をLPFして、本体のボリュームからのアナログ指示出力とORをとればよいと思ったんですが、コントローラーの入力のインピーダンスの関係か、PWM出力を最大に絞ってもスピンドルが相変わらず回転していたり、回転数の安定性が低かったりとあまりうまくいきませんでした。

現在の構想は、arduinoを使って、linuxcncから出力されたPWM出力と、本体コントローラーのボリュームのアナログ電圧を両方読み取り、デジタル的にORを計算して指示値をDA出力しようというものです。

手持ちでArduinoに使われているatmega328pはあるので、これでワンチップArduinoを作ります。

ワンチップarduinoは、こちらの情報を参考にして、board をatmega328 on a breadboard (8MHz internal clock)としてコンパイルし、バイナリーファイルを出力(.hexファイル)。それを、Atmel Ice を使ってICSP接続したターゲットにAtmel Studio 7 で書き込みを行います。

Atmega328p のヒューズは、CKDIV8 を入れているとクロックが1MHz になってしまいますのでこれは外しておく必要がありますので注意。

arduino で走らせるプログラムは、linuxcncからのpwm パルスの読み取りを行い、ボリュームからanalog 入力を読み込み、比較して大きいほうを出力として採用してanalogWrite()でPWM出力を出すのを繰り返すだけです。pwm パルスは0.1sec 内には来ているのが前提でプログラムを書きました。

フィルターしてきれいなanalog output を作りたいので、PWMの周期をいじくって16kHz 周期のPWMを作り、10kohm + 10uFのフィルターを通しました。ひょっとしたらopampで受けてやる必要があるかもしれませんが、つないで試して様子を見ることにします。

デバッグのため、一応TTL serial I/Oも実装して、状況を57600bpsでレポートさせつつ、低回転時にスピンドルを止めたりしやすいようにプログラムをいじるつもりで。

作成したボードはこちら。

ICSPのコネクターの取り付けを間違えて、もう一列増やしてごまかす。
Atmega328のデータシートの読み込み不足でTTL serial のTX,RXが思ってたのと逆だったり、ミスが多い。

ワンチップArduino作ったら1日終わっちゃった。。。旋盤につないで試すところまでいかず。

9/30 旋盤に実際につないで試してみましたところ、良好。ボリュームを回すとスピンドルを回せて、linuxcnc から制御をかけたら、その通り動く。やはりデジタル制御はよい。凝ってフィルターをかけてもよいけど、とりあえずそこまでしなくてもよさそう。

pwm 値(0-255)と実際のスピンドルのrpm の関係を測定してみた。

pwmrpm
970
36350
1261220
2412380

70rpm とかは定格外なので、ちゃんと回ってませんが。ほぼ比例しているので問題なし。

10/1 スピンドルの制御はとりあえず良さそうなので、制御プログラムにメジアンフィルター+アベレージフィルターを入れてさらに安定な回転数になるようにしてみました。

そのうえで、コントロールボックスの中に追加した制御回路を収納して完成としました。

マウント用台座は3Dプリンターで手軽に造形

stepconfで再び設定をいじくります。ねじ切りなどを考えると軸をそれなりの速さで動かせる必要はありそうなので、脱調しない速さを探ります。

X軸のモーターは2GTベルトが滑ってしまうため、2mm/sec 程度の速さが限界でした。

Z軸のモーターは、モータートルクは十分ですが、パルスの応答が30us程度が限界のため、減速をしていることもあり、10mm/sec程度の速さが限界でした。

旋盤のGコードに不慣れなので、切削は相変わらずマニュアル的にやっていますが、徐々に慣れていきたいと思います。

手始めにlinuxcnc のG76 threading cycle の練習ということで、P1.0 のとP0.5のねじを塩ビ管に切ってみました。こんなに簡単にねじが作れていいのか!というぐらい簡単でした。

一番右側のは斜剣バイトで掘ったので鈍ったねじになってます。

ミニ旋盤 CNC化(1)

デジタルノギスDROをつけたりしてあれこれ使ってきたミニ旋盤(PSL400VD)。

ふとCNC化したくなりましたので、してみました。

フライスと同様に、linuxcncで中華なブレイクアウトボードを介して中華なモータードライバーで 中華なステッピングモーターを うごかすという貧乏人構成です。

PSL400VDはなぜか回転計がついていませんでしたので、スピンドルの回転とインデックスを読めるようにもしました。

スピンドルは、PWMで制御をかけようと思っていますが、まだそこは完全にはできていませんが中途の状況を記します。

1.Z軸

旋盤のねじ切り用にいろいろとギアが取り付けられていますが、全部取っ払って親ねじをプーリーを介してNEMA23のモーター(定格2.8A)で駆動をするようにします。トルクが足りるか不安でしたので、プーリーはモーター側を16歯、親ねじ側を40歯として減速をするようにもしました。

モーターのマウントは、ギアセットを取り付けるためにあったM8の取り付けねじを利用して5mm厚のアルミプレートをフライスで切って取り付け、NEMA23モーター自体は3Dプリンターで出力したマウントブロックを使ってアルミプレートに取り付けました。タイミングベルトのテンションを調整する必要がありますので、3Dプリンターで造形したマウントブロックの取付穴は長穴にしておきました。

プーリーは、市販のXL037用を購入しましたが、親ねじのシャフト穴径の12mmに合わせるようにしたのと、プーリーの厚みを減らす必要があったのと、さらに、キー溝の加工も必要でした。キー溝は悩んだ挙句やすり1本で現物合わせで加工しましたがこまめに確認しながらやったのがよかったようです。プーリーの厚みを減らすのは当然旋盤でやります。

モーター側のプーリーは8mmの穴に拡げ、M4のイモネジ穴を掘って固定しました。ドリルで穴をあけただけでは8mmのシャフトにうまくはめあいが取れませんでしたので、今回リーマーを買いましたが、なんで今まで持っていなかったのか!と後悔。

ベルトの歯数は一応ミスミのページなどの解説をみて計算して決めました。

とこんな感じでZ軸のモーターを付けました。

2. X軸

X軸の方は、ケチって秋月でずいぶん前に買って引き出しの肥やしになっていたプーリー付きのステッピングモーター(NEMA17互換?)を使いました。

こちらは、3DプリンターでおなじみのGT2ベルト、プーリーを使って、これまで手回しハンドルが付いていたところにプーリーを取り付け駆動します。モーター側は20歯、ハンドル側は40歯にしてこちらも減速してみました。

マウントプレートは、 ハンドルの軸受け部分 に7mm厚程度の円盤形状の部分がありますので、そこに塩ビ板をはめ込み、そこに3Dプリンターで造形したマウント基台をねじ止めするZ軸と同様の構造です。ただ、X軸の方は、モーターの場所を選ぶと思いましたので、ちょっと検討した形状にしてみました。

40歯プーリーを試しにはめてみたら穴形状が悪くこじってしまいプーリーが傷物に・・・この構成だとダイアルのインジケーターもそのまま使えるので見やすいのはよさそう。

塩ビ板のベースプレートは、後でアルミで作り変えるかもしれませんが当座これで。

3. コントローラー

コントローラーは、linuxcnc でパラレルポートに制御信号を出力し、前にNEMA23モーターを買ったときに一緒についてきたブレイクアウトボード(DB25-1205)を介してこちらもまた一緒についてきたモータードライバー(DQ542MA)を駆動します。

モーターの電源はこれまた中華な24V電源(15A)が3Dプリンターを作ったときに勢い余って買ったものが残っていましたのでそれを使います。

このブレイクアウトボード、反応があまり速くなくって、40マイクロ秒程度のステップを出すのが限界っぽい(もう少しチューニングができる要素もありますが)。まあ、その限界内で全く旋盤作業には問題がないのでよしとします。

ステップの速さは、ブレイクアウトの出力をオシロで観測しながら最適値を探ります。

コンパクトな制御系を組みたいので、24V電源、モータードライバー2個、ブレイクアウトボードをくっつけるための部品を3Dプリンターで作りました。

小汚い配線ですが動けばいいんだ!カバーはちゃんと動いたらもちろん付けますよ。

ブレイクアウトボードには、ほかにはスピンドルからの回転数、インデックスパルスの入力もつなぎます。

linuxcnc の設定は、stepconf ウィザードを使ってやりました。

このウィザードでモーターのテストもできるので、特に困ったこともありません。

この機種の場合、Z軸の親ねじは1.5mm ピッチ、X軸のねじは1mm ピッチでした。また、適当なモーターの配線をしていたら、両軸とも方向が逆向きでしたので、X軸、Z軸ともDIRをinvertの設定にして対応しました。

stepconfウィザードでは、ねじのバックラッシ補正の値を入れることができませんので、それは動かしてみて補正量を計測して、.iniファイルの各軸にBACKLASH=0.22などと記載すれば補正が入るようになりました。

私の機械では、Z軸のバックラッシは0.4mm X軸のバックラッシは0.22mmでした。もう少し渋く調整すべきところかと思います。

DROで様子を見ながらいじくってみましたが、Z軸は親ねじとのカップリングにガタがあるのが問題になりそう(位置決め精度が悪い)で、かっちり固定できるように工夫が必要かもしれません。

4. スピンドルインデックス、回転計

そもそも旋盤をCNC化するのは、素人でもねじ加工を楽にしたいなということが原点にありますので、スピンドルのインデックスをとることはmustです。

私はこちらのページを参考にさせていただき、エンコーダーをつけてみました。

エンコーダーホイールは、先のページのプロファイルと同じですが、レーザーカッターは持っていませんので、私は3Dプリンターでホイールを造形しました。インデックスと回転(60パルス/回転)のエンコーダーはオムロンのEE-SX460-P1がジャンク箱に転がっていましたのでそれを2個旋盤に取り付けるマウンターをこれまた3Dプリンターで造形しました。

位置決めはちょっと難しかったですが、linuxcnc のhalscopeを使って信号を観測しながら位置合わせをしました。

Z軸とスピンドルインデックス周り。

まあまあすっきりまとまったように思います。

stepconfの設定の時に追加できるUIでスピンドルの回転数もしっかり読めてます。

同期動作はこちらの通り試してみようと思ってますがまだです。

Prusa i3 mk3 MMU2 をつくる その2

MMU2を作ったんですが、作業をリビングの広場でやってたら、家の者にいやーな顔をされましたので、工房の方に移しました。

今のMMU2は設置スペースが結構必要です。

プリンターから40cm離せ、とかガイドに書いてあり、そんな広いフリースペースある人いないんじゃ?という気がします。

我が家の工房に無理やり移設。

うーん。場所が足りない。これでもフィラメントを戻したときの余長が出るので、複数のフィラメントのあまりが絡みそうで、ちょっと良くないんですよね。

絡まないようにするための”Wallet” というのをつくるとよい、ようなので、現在絶賛部品プリント中。