在網路上看到用拆下來的光碟機零件做cnc 雕刻或畫圖,自已也想來做看看
之前有花了55元台幣買了一個arduino nano 剛好可以拿來用
開始到處收集光碟機拆開
移開電路版
看到步進馬達座,上頭就是雷射讀取頭與發射頭(燒錄機才會有)
拆下雷射頭後,步進馬達座就可以拿來用了,雷射頭之後也可以拿來用
2台步進馬達的接線都是4條接線,但因都沒零件編號,只能用測試法加上電錶來猜正確的接線及控制方式
第一個馬達,原本在上頭有軟排fpc 線,但我沒fpc 接頭可用,就直接銲4條線在馬達上
因只有4條線,所以一定是兩兩一組,這個用電錶量一下電阻,就可以查出來
結果是紅線-黄線是一組,黑線-黑線是一組
接下來就是要測試如何正確的驅動及送出正確的控制信號
手上還有一個uln2003 給arduino 用的馬達驅動版,因此要先想辦法拿來用,
因步進馬達種類不少,驅動方式也不一樣,因此先查了一下4線馬達可能是那一種類型
確定它是雙極BIPOLAR馬達,驅動方式大部份都是用橋式電晶體接法,或是用IC L293D
上圖是網路上找的單極-雙極的不同電路驅動方式,單極較簡單,雙極因要改變正負電位所以電路較複雜
http://elabz.com/driving-a-bipolar-stepper-motor-with-arduino-and-uln2803ag/
但也找到有人用uln2803 來驅動雙極
因此就要先試著用uln2003 來驅動看看
找到這件版子的電路圖如下
ULN2003 驅動板電路圖
馬達4條線1組接2,3 接頭,1組接4,5接頭, 接上去後上傳程式測試,結果是無法動作
但有感覺馬達有很小的震動感覺,但無法正常快速的推動,查了一下原因
原來是ULN2003 的輸出電流是SINK 型,也就是當輸入端為低電位時,可以有最高600ma電流流入,但輸出為高電位時就無法輸出這麼高的電流,所以就無法推動馬達
有查到有人用uln2003 來做 , 原理是用類似提升電阻的方式由vcc 接一個22ohm電阻到馬達端,如此可以由此電阻來提供電流推動
一開始因為我懶得再接電阻,想說上頭己有470ohm 電阻,說不定推得動,於是我先把右邊4顆led 接線直接上錫短路先試看看
測試結果還是推不動,看來只有再並4個22ohm電阻上去試了
用麵包接5v接4個22ohm電阻,再接到馬達4條線
測試結果是有感覺馬達震動聲音出現了,但還是推不動,無法正常移動
而且22ohm電阻發熱,測量運作電流, 到達340ma,因為電阻是1/8w的,跑久了會燒掉
測試失敗,但手上現沒L293D的ic,只能先用手上材料測試
看來只好用8個電晶體,組成2組橋式驅動線圈
參考http://www.kerrywong.com/2010/03/22/a-simple-dual-h-bridge/
用8個電晶體組成H橋式驅動,電組用1K 的
總算測試成功驅動,用下面的程式碼可以來回走動了接下來是把2個馬達組成X,Y 軸加以固定
int inA1 = 8; // input 1 of the stepper
int inA2 = 9; // input 2 of the stepper
int inB1 = 10; // input 3 of the stepper
int inB2 = 11; // input 4 of the stepper
int stepDelay = 15; // Delay between steps in milliseconds
void setup() {
pinMode(inA1, OUTPUT);
pinMode(inA2, OUTPUT);
pinMode(inB1, OUTPUT);
pinMode(inB2, OUTPUT);
}
void step1() {
digitalWrite(inA1, LOW);
digitalWrite(inA2, HIGH);
digitalWrite(inB1, HIGH);
digitalWrite(inB2, LOW);
delay(stepDelay);
}
void step2() {
digitalWrite(inA1, LOW);
digitalWrite(inA2, HIGH);
digitalWrite(inB1, LOW);
digitalWrite(inB2, HIGH);
delay(stepDelay);
}
void step3() {
digitalWrite(inA1, HIGH);
digitalWrite(inA2, LOW);
digitalWrite(inB1, LOW);
digitalWrite(inB2, HIGH);
delay(stepDelay);
}
void step4() {
digitalWrite(inA1, HIGH);
digitalWrite(inA2, LOW);
digitalWrite(inB1, HIGH);
digitalWrite(inB2, LOW);
delay(stepDelay);
}
void stopMotor() {
digitalWrite(inA1, LOW);
digitalWrite(inA2, LOW);
digitalWrite(inB1, LOW);
digitalWrite(inB2, LOW);
}
// the loop routine runs over and over again forever:
void loop() {
int x=1;
x=0;
for (int i=0; i<=50; i++)
{
step1();
step2();
step3();
step4();
}
stopMotor();
delay(500);
for (int i=0; i<=50; i++){
step4();
step3();
step2();
step1();
}
stopMotor();
delay(500);
}
沒有留言:
張貼留言