2015年10月3日土曜日

スピンドルの自重補償機構




MakerFairが終わって早2か月、今更ですが、今年はブース間の間隔が広くて見やすかったです。
個人的には木製の重機が素晴らしい出来だな~と思いました。アイディアも詰まっていて、見て楽しい、動かして楽しい、と。

自分も来年のMakeには何とか・・・と思いつつも、まずはCNCZ軸の脱調問題を解決しない事には、安心して加工ができません。なので、先にスピンドルの自重補償機構を作りました。

ここのサイトによると、スピンドルは8.4lbs=3.8kgくらいとのこと。結構重い。
バランスさせるためにカウンターウェイトをあてるとすると、錘のスペースが必要ですが、
今フライスの周りは旋盤置き場、及び作業スペースになっているので、ちょっと厳しい
このサイトのように遠くまでワイヤ引っ張るもありますが、プーリーを机、天井、壁、その他に付け始めると、フライスの位置を簡単には動かせなくなるし・・・
自重補償機構はコンパクトに収めて、今のフライスの土台にそのままくっつけられるようにしたいところです。

となると、バネですか。
探してみると、良い感じの出力のコンスタントフォースばねを見つけたので、それでいく事に。

単純に4kgも吊るとモーメントが発生しやすいので張力でモーメント打ち消すようにバネはワイヤで取回して下へ配置。その分フレームはシンプル設計にしてます。


設計が終わったところで、部品加工。




次いで、仮組して土台への取付の位置を決めて、穴を加工します。
  


そして取り付けて完成~

試しにZ軸を動かしてみると、いい感じに抵抗が減ってスムースに。問題だったステッピングモータでの駆動時の異音も消えました。


これなら脱調しないでしょう(多分)、再稼働開始!


2015年7月18日土曜日

CNCで両面加工


特に締切も無く、のんびりと部品を加工している今日この頃。
この前はこんな部品に取り掛かりました。



この部品、裏表の両面から加工が必要な形状です。材料の掴み直しが入るので面倒&精度出にくいです。設計の段階で、こういうのはなるべく避けているものの、
部品を分割するとそれはそれで面倒だったり・・・、
設計上スペースが・・・
となるので幾つか出てきちゃいます。

NCフライスでの両面加工は初トライ。ですが基本的には普通のフライスと変わらない手法でやってきます。
まず基準面出し。 X方向の基準面とY方向の基準面を削っておきます。

次いで表面のみ普通に加工。



出来たらひっくり返します。
クランプする段階で部品の角度を合わせます。
ダイヤルケージで測りながら、テーブルのY送りと基準面が平行になるように微調整・・・。




角度を合わせてクランプできたら、X,Yの基準面を揃えます。
Φ10のコレットで芯出し棒を装着。わざわざSherlineのフライスをER16コレットシステムにカスタムした理由の一つが実はコレです。芯出し棒は掴みがΦ10以上のモノがほとんどなのに、デフォルトのツーリングシステムですΦ8までしかコレットで掴めないんですよね。



芯出し作業自体はCNCだと簡単に送りを微調整できて簡単でした。
Φ10なので、そこから半径分ずらした位置が基準位置になります。
これで裏面を削ると、

あれ・・・?(゜Д゜;


実は作業中にZ軸のステッピングモータが一度脱調しまして。(それで緊急停止かけた際に座標を戻し忘れたorz
以前書いたように、音が渋いような気はしていたのですが・・・。
このままだと安心して加工出来ないので、やっぱり自重補償機構つけますかね。

2015年6月20日土曜日

Sherlineフライスの加工範囲

久しぶりの書き込みです。

加速度ロガー作り終わって、そろそろMake向け作業に戻るか、と思っていたら
Makeに応募してくれていた友人から、事務局からお祈りメールが届いたと連絡がありました

<(^0^<
残念ながら今年も見に行くだけですねー。


という訳で、モチベーション下がり暫く更新の手が止まってました。
まぁ・・・元々徒然なるままに書くblogなので、更新しなきゃいけないわけでも無いのですが(笑

その間はこれまた全く別のモノ作ったりしてました。
その時、ちょっと加工面積の大きな部品を作ろうとしてフライスの加工範囲を拡張したので、それについて書こうかと。


使っているCNCのベースになっている5400シリーズのフライスは、X方向:228mm、Y方向:127mmのテーブル送りがあります。なので、200×100mmくらいまでは削れるはず、と思ったら、そんな事無かったりします。
Y方向は、元々のスピンドルの位置がZ軸の支柱から70mmくらいの位置にあるので、それ以上長いモノは奥につっかえて削ることが出来ません。



もう30mmくらい、ふところの長さがあれば、テーブルストロークもフルに使えるのに・・・。
そういえば、Sherlineは拡張用の部品をたくさん揃えているので、何かないかなーと思ってカタログを見ていたら、ちゃんとmill riser block (P/N 1297)というのが売ってました。


早速購入。

これはZ軸テーブルとスピンドルユニットの間に挟むスペーサーブロックで、取付には一旦スピンドルユニットを外す必要がありますけど、セットスクリュー1本なので楽勝です。


取付前と取付後で、スピンドルの位置が変わり、ふところが深くなっています。


これで少し大きい物が削れるようになりました。加工していたら、Z軸の送りのステッピングモータの動作音が少し変わったような?恐らくテーブルにかかるモーメントが増えたのが原因かと思います。対策として自重補償機構をつける猛者もいる様ですね。
でも音だけで動作に問題無さそうなので、とりあえず放置中。



2015年5月7日木曜日

Edisonで無線加速度計

完成しました。
EdisonのWiFiモジュールを活かして、無線で値を飛ばしてPC側でロギングする仕様。
以下次に向けた備忘録がてら。


EdisonでI2C通信

Edison Breakout BoardはADCモジュールを積んでいないので、加速度計はI2C/SPI出力のLIS3DHを使いました。今後別のモノ作る時にI2C通信のIMUも使っていきたいので、方式はI2Cを選択。
LIS3DH

I2Cクラスもmraaに用意されているので、メソッドの組み合わせでモジュールの仕様と合うように通信します。
例えばLIS3DHの通信仕様はデータシートによると
書き込み:書き込みアドレス-> レジスタ ->データ 
読み込み:書き込みアドレス->レジスタ->読み込みアドレス->データ
となっていたので、以下のようにしたら通信できます。

// アドレスの設定
i2c->address(LISadd);
 //読み込み
i2c->writeByte(whoami);
rbuff = LIS->readByte();
//書き込み
wbuff[0] = ctrl_reg1;
wbuff[1]= 0x77;
i2c->write(wbuff,2);

書き込みはwriteRegでも良さそうですが、何故かコンパイルが通らない・・・。環境の問題なんでしょうか。ちなみにw/rメソッドは呼ぶたびにアドレスが送信される仕様のようです。この時アドレス(7bit)後のRW(1bit)はw/rメソッドのどちらを使うかで、自動でつけてくれます。

Edisonでタイマ割り込み

サンプルのコードでは処理周期をsleep/usleep関数で調整してるのがほとんど。
これだと処理時間分だけサンプリング周波数がずれてしまうので、制御や信号処理の用途ではちょっと困ります・・・。

普通の組み込みマイコンなら、タイマー割り込み処理用のレジスタとか見れるんですが、
Edisonのタイマー割り込みはどこにやら。関数も mraa/upm/iotkit-comm-c といったところには無さげですが、どうやらLinuxカーネルで出来そう。





左がSleep関数で回した場合、右がカーネルのタイマー割り込みで回した場合です。1周期回す毎にインクリメントして計算した時間を1列目に出していま す。また、比較のため実時間を2列目に表示しています。左は実時間とインクリメント時間がどんどんずれていってますが、カーネルのインターバルタイマを 使った右はぴったり一致してます。細かくいうとLinuxの時間自体の精度はどうだ、という話もあるようですが、まずは良いかな。





*タイマーインターバルのやり方メモ

以下ヘッダをインクルード
    #include <sys/time.h> //インターバルタイマ
    #include <signal.h>      //割り込み登録
    ↓
割り込み処理関数の記述
    void timerInterrupt(int sigtime);
    ↓
割り込み処理の登録(インターバルタイマシグナルのSIGALRMと自前の割り込み処理関数の紐付)
    struct sigaction interrupt;
    memset(& interrupt, 0, sizeof(interrupt)); //メンバの初期化
    interrupt.sa_handler = timerInterrupt;
    interrupt.sa_flags = SA_RESTART
    sigaction(SIGALRM, &interrupt, NULL)
    ↓
インターバルタイマの設定
    struct itimerval Timer;
    memset(&Timer, 0, sizeof(Timer)); //メンバの初期化
    int samplingRate = 10*1000; //usec
    Timer.it_interval.tv_usec = samplingRate;
    Timer.it_value.tv_usec = samplingRate;
    setitimer(ITIMER_REAL, &Timer, NULL); //タイマスタート


EdisonでAPモード


加速度ロガーは屋外で用いる予定なので、Edison自体をアクセスポイントにしてPCと通信します。
本体のスイッチを2~7sec押すとAPモードで起動するので、これにEdisonのパスワードで接続するだけ。
デフォルトではEdisonのIPアドレスは192.168.42.1になっていました。
このIPアドレスでTCP/IP接続して、Edison側で掃いた値をPCで保存すれば簡易ロガーとして機能します。



あとは
側造って

電池つけて

完成です!
GWも完.orz

2015年5月2日土曜日

今更ですが、Edison Breakout Board でLチカ

ちょっとした事情で、簡易型の加速度ロガーを作る事になりました。
データが取り出しやすければ何でも良い、と言われたので、今更ですがIntelのEdisonを使ってみる事にしました。丁度GWで時間もあり、新しいモノを触るには良いタイミングですしね。


ハードウェア



というわけで、Edison Breakout Board Kitを買ってきました。Arduino互換のボードと比べて、かなり小型。手持ちのmbedと並べても遜色ない大きさです。おー。
これでWiFiが標準装備という所が良いですね~。
ただしArduino互換ボードと違って、DIPピンのロジック電圧が1.8Vのままであったり、AD変換器が無かったりします。代わりにSPIやI2Cのバスが複数空いていますので、要は必要に応じて足せば良いって事ですね。

その他諸々の仕様について調べるには、この辺の資料があれば事足りそう。

◇Edison概要
http://www.intel.com/support/edison/sb/CS-035276.htm
◇Edison本体のハードウェア仕様
http://www.intel.com/support/edison/sb/CS-035274.htm
◇Breakout Boardのハードウェア仕様
http://www.intel.com/support/edison/sb/CS-035252.htm

Breakout Boardの右側についている2つのUSBコネクタの内、上はserial-USBコンバータで、Linuxのコンソールメッセージが流れる所。下は単純なUSBポートでdeviceとして使った場合はここから電源供給とコードのコピーができる、と。
購入の際に「USBケーブル2本必要ですよ~」と注意書きに書いてありましたが、そういうことですか。全然機能が違う訳ね。


Edisonの設定と開発環境


で、ここからどうしよう(汗

良く理解している方は、好きな環境をEdisonに構築する所から始めているようですね。
機械屋さんには良く分からないので、大人しく公式ガイド通りやります。
数か月前はこれが無くて結構ややこしかったみたいですが、今はとっても丁寧。

◇Get Started
https://software.intel.com/en-us/iot/library/edison-getting-started
(2015/05/01時点)

Step1はハードウェアの準備。・・・ねじ締めまで丁寧に書いてあります。

Step2はPCの環境構築。
Windows向けのインストーラは最新版がリリースされてました。これを使うと ドライバのインストール、Edisonのファームウェアの更新、開発環境のインストール、まで一気にやってくれます。正に至れり尽くせりです。Step1通りにUSBを2本さして、インストーラを起動させればOKです。
開発環境はEclipseを選択。ただEclipseはもうPCに入ってるんですけど・・・。一応、必要な設定とか含めてbatファイルを生成してくれるそうなので、インストールしておきます。

Step3はEdisonのLinuxの設定。
ここはTeraTermを使った方が簡単です。接続先は「USB Serial Port」です。
「Intel Edison USB Composite Device」 とか「Intel Edison Virtual Com Port 」は名前はそれっぽいですが、トラップです。

Step4はWiFiの設定
ここまでやるとTCP/IP通信でもLinuxコンソールを叩くことができるので、2本差してたUSBの内、シリアル通信用のUSBは外せます。

以上でプログラムを書く準備が整いました。


Lチカ準備


Step5からStep6の始めまでで、Arduino互換ボードを使ったLチカをしています。
ただし、Breakout Boardの場合はユーザーが操作できるLEDは接続されていないので、外付けする必要があります。また、本体のIOピンがそのまま出ているので、電流が±3mAと貧弱です。直にLED駆動すると最悪足が死ぬかも?

ん~テスタでピンの電圧測って動作確認だけでも良いんですが、味気無いような・・・。
丁度、手持ちのトランジスタも見つけたので、きちんとやりますか。
駆動用の電流は3.3V/100mAのV_V3P30 からとります。それとGNDと適当なGPIOピンを配線します。電源投入してから少しの間は、GPIOピンの電圧が安定しないようなので、プルダウン抵抗も一応つけておきます。


ソフトウェア


ようやっとプログラムです。
IO周りを制御するためのライブラリは、GitHubで公開されています。
言語はC / C++ /Python /JS のどれでも行けるという素敵な仕様。

◇GitHub/intel-iot-devkit/mraa
https://github.com/intel-iot-devkit/mraa

使い方はというと、
Eclipseをbatファイルで起動して、プロジェクトサンプルからDigital outputを選ぶと

 プラットフォームチェック→IOピンの設定→1秒ごとに出力切り替え(ループ)

てな感じの丁度良いサンプルが出てきます。IOピンの設定はレジスタを直接いじらなくても、
関数で一発で設定できるので、希望のGPIOピンを表す引数を突っ込むだけです。

対応表はここ。
◇mraaピンナンバとEdisonピンマップ
http://iotdk.intel.com/docs/master/mraa/edison.html

先ほど適当に指したGPIO128のピンナンバはmraaでは13のはず。
後は説明通り、動かしてやるとLEDが点滅しました。
Hello,world!
次は当初の目的の加速度センサの接続、かな。