搜尋此網誌

2016年1月20日 星期三

用cd-rom 拆的零件做cnc 控制-1




網路上看到用拆下來的光碟機零件做cnc 雕刻或畫圖,自已也想來做看看
之前有花了55元台幣買了一個arduino nano 剛好可以拿來用
開始到處收集光碟機拆開


移開電路版

 看到步進馬達座,上頭就是雷射讀取頭與發射頭(燒錄機才會有)

 拆下雷射頭後,步進馬達座就可以拿來用了,雷射頭之後也可以拿來用


拆了4台,結果2台是步進馬達(stepper motor),2台是直流馬達(dc motor)但有配合轉軸編碼器做控制,因步進馬達較好控制,因此x,y軸還是用步進馬來控制,直流馬達就只做畫筆頭的控制

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 來驅動雙極


 另一種電路驅動,而且改成只用2條控制線來改變方向,
 因此就要先試著用uln2003 來驅動看看

 先分析一下手上這片驅動版,原始的接法是用在單極5線的步進馬達上,用的電組為470,上頭有一組5接線插座,右邊一條接頭接到vcc,因此只能用其它4 條
找到這件版子的電路圖如下
  
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組橋式驅動線圈
用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);

}