いよいよ本番の組み立て作業に入ります。まずはY軸からになります。テーブルの下にリニアガイド、ボールネジを取り付けます。
続きを読む
モータマウント用の支柱
今回の自作NCフライス盤で唯一自分で素材から加工する部分があります。「それで自作なの?」と疑問に思う人もいるかと思いますが、自作NCフライスといった時に様々なケースがあります。市販品のフライス盤を改造してNCフライスにする場合、オリジナルマインドの組み立てキットを自作と呼ぶ人もいます。今回の私のフライス盤は設計は完全オリジナル。組み立ても自分。自分で加工出来ない部品を外注に出しているので堂々と自作と呼んで良いでしょう。
で、作る部品ですがY軸とZ軸のモータマウント用の支柱です。旋盤で加工します。材質はアルミ(A2017)でもS45Cでも良かったのですがかっこつけてステンレス(SUS304)にしてみました。
自作CNCフライス盤 アルミテーブルのネジ切り
部品が揃ったので本格的に組み立てに入ります。まずはテーブルを組み立てます。テーブルはアルミ材を使っています。
購入先はこちら。エヌアイシ・オートテック直販サイト
ベーシックフレーム AFS-4080-8を使っています。最初はテーブルもSS400でと考えましたが重量が重くなりすぎてステッピングモータでは動かなくなるかもしれないとアルミにしました。剛性が不足したら交換すればいいやと考えてます。ここいらはこちらのサイトを参考にさせて頂きました。CNCを作ろう
CNCフライス盤 Z軸の仮組
CNCフライス 部品入荷
発注していた部品が納品されました。納品された部品は一個づつ丁寧に梱包されてました。納期は3週間ほど。ただ、一個図面と違う寸法の物があって、それのやり直しで部品全部が揃うのは結局一ヶ月かな。材質はSS400です。軽くする為に一部分はアルミにしようかと考えましたが色々考えて今回は重量と剛性、安定性を優先し全てSS400にしました。部品だけで重量は100kgを超えています。ボールネジ、リニアガイドを入れた総重量は122kgです。設置する現場で組み立てるので1人で設置できますが、完成品でこの重量だったら手が出せません。今回完全自作にした理由もそこにあります。
フレーム部分とテーブルを仮組したところです。穴の位置とか間違ってないか確認のため「こんな大きさになるんだな〜」ということを確認です。
CNCフライス盤の自作
フライス盤の自作を開始します。主要スペックは以下の通り
・全軸リニアガイド(CPC製)
・全軸ボールネジ NSKコンパクトFAシリーズ USS1005N1D(C3等級)
・スピンドル:最大18,000rpm、350W コレットER16
・ストローク:X軸:320mm、Y軸:304mm、Z軸:80mm
・テーブルサイズ:320mm x 522mm
・完成予想重量:約120kg
主要部品の加工は自分では出来ないので図面を書いて外注しました。材質はSS400、クロメートメッキ仕上げ。来週納品予定です。
図面はこちら(PDF)。
ヒゲゼンマイの作り方
オリジナルマインド大賞 受賞!
オリジナルマインド大賞受賞しちゃいました。
http://www.originalmind.co.jp/cultural_exhibition/2012/index.php
PIC16F678 I2C通信(スレーブ)
スレーブ(受信)側のプログラムです。マスターが悪いのか、スレーブが悪いのかその判定が出来ずに苦しみましたがなんとか動きました。CCS-Cコンパイラを使っています。
ヘッダファイル
#include <16F687.h> #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOPROTECT //Code not protected from reading #FUSES BROWNOUT //Reset when brownout detected #FUSES NOMCLR //Master Clear pin used for I/O #FUSES NOCPD //No EE protection #FUSES NOPUT //No Power Up Timer #use delay(clock=4000000) #use i2c(Slave,Fast,sda=PIN_B4,scl=PIN_B6,address=0x10,FORCE_HW)
Cファイル
#include "C:\Documents and Settings\Owner\My Documents\PCW\MKB-33(i2c 7seg)\i2c_7segLED_4.h" //7セグLEDの桁 #define H1 PIN_B7 #define H2 PIN_A2 #define M1 PIN_A5 #define M2 PIN_A1 #define S1 PIN_A4 #define S2 PIN_A0 #byte ANSEL = 0x11E #byte ANSELH = 0x11F #byte CM2CON0 =0x11A #byte CM2CON1 =0x11B int const LED7SEG[10] = {252,96,218,242,102,182,190,228,254,246}; int Data1,Data2,Data3; #INT_SSP void ssp_interupt (){ int state; state=i2c_isr_state(); if(state < 0x80) { //state=0はADRESS if(state == 1) Data1 =i2c_read(); //1つ目のDATA if(state == 2) Data2 =i2c_read(); //2つ目のDATA if(state == 3) Data3 =i2c_read(); //3つ目のDATA } } void set7segLED(int pin, int number){ output_high(pin); output_c(LED7SEG[number]); delay_us(10); output_low(pin); output_c(0); } void main() { int hour1,hour2,min1,min2,sec1,sec2; //c port 全ピン出力モードへ set_tris_c(0x00); CM2CON0 = 0x00; CM2CON1 = 0x00; ANSEL = 0x00; ANSELH = 0x00; set_tris_b(0x50);//B4 と B6 をインプットへ output_float(PIN_B4); output_float(PIN_B6); enable_interrupts(INT_SSP); //SSP割り込みを許可 enable_interrupts(GLOBAL); //全ての割り込みを許可 output_low(H1); output_low(H2); output_low(M1); output_low(M2); output_low(S1); output_low(S2); while(1){ hour1 = Data1/10; hour2 = Data1 - hour1 * 10; min1 = Data2/10; min2 = Data2 - min1 * 10; sec1 = Data3/10; sec2 = Data3 - sec1 * 10; set7segLED(H1,hour1); set7segLED(H2,hour2); set7segLED(M1,min1); set7segLED(M2,min2); set7segLED(S1,sec1); set7segLED(S2,sec2); } }
3つの8バイトのデータを受信して6個の7セグLEDに表示をするプログラムです。前の記事で紹介したCポートを全ピン出力モードにする部分も含まれています。0〜99までのデータを受信するとの前提の設計です。書籍やサイトでは次の様にpollを使った例が出ていたのですがこれだと最初のデータとしてアドレスを受信してその後のデータを受信してくれませんでした。mainの中のループで以下の様に書いてみました。
if(i2c_poll()){ Data1 = i2c_read(); Data2 = i2c_read(); Data3 = i2c_read(); }
これでは受信ができずに割り込み処理を使って動くプログラムが書けました。i2c_pollを使った書き方は古いスタイルなのでしょうか?
以下のサイトを参考にさせて頂きました。
http://www.freeml.com/picfun/6468/
http://homepage1.nifty.com/rikiya/software/316PICI2C.htm
PIC16F678のI2C通信(マスター)
PIC16F678同士をI2C通信で接続するテストです。ちょっとはまった部分もありましたので記事にします。CCSのCコンパイラを使っています。
ヘッダファイル
#include #device adc=8 #FUSES NOWDT //No Watch Dog Timer #FUSES INTRC_IO //Internal RC Osc, no CLKOUT #FUSES NOPROTECT //Code not protected from reading #FUSES BROWNOUT //Reset when brownout detected #FUSES NOMCLR //Master Clear pin used for I/O #FUSES NOCPD //No EE protection #FUSES NOPUT //No Power Up Timer #FUSES IESO //Internal External Switch Over mode enabled #FUSES FCMEN //Fail-safe clock monitor enabled #use delay(clock=4000000) #use i2c(Master,Fast,sda=PIN_B4,scl=PIN_B6)
クロックは4MHz。なぜか20MHzに上げると動作しませんでした。
B4とB6を使ってクロックとデータを送信しています。プルアップの抵抗(5kΩ)をつけた回路。PIN_A0には動作確認のためLEDを付けています。
Cファイル
#include "C:\Documents and Settings\Owner\My Documents\PCW\MKB-33(i2c 7seg)\i2c_7seg_master16F687.h" void main() { int h,m,s; // output_float(PIN_B4); // output_float(PIN_B6); h = 0; m = 0; s = 0; while(1){ output_high(PIN_A0); i2c_start();//start condition i2c_write(0x10);//address send delay_us(100); i2c_write(h);//send data 8bytes delay_us(100); i2c_write(m); delay_us(100); i2c_write(s); delay_us(100); i2c_stop(); delay_ms(50); output_low(PIN_A0); delay_ms(20); s++; if (s>60){ s = 0; m++; if (m>60){ m = 0; h++; if (h>99) h = 0; } } } }
output_float(PIN_B4)が必要と書いてある記事や本がほとんどでしたが書かなくても動いてます。ストップウォッチのように3つの数字(秒、分、時)を出力します。delayで動いているので正確な時間では当然ありません。