Запуск шагового двигателя от CD-ROM посредством PIC16F84a и L293D

Нашел старый неисправный CD-ROM. Выбросить жалко, решил «поковырять» шаговый двигатель, перемещающий лазер. В общем демонтировал блок с шаговым двигателем и кареткой с лазером.

Получилось вот что:IMG_0952

Из подручных средств чем можно оживить данный девайс нашел следующее:

  • микроконтроллер PIC16F84A;
  • драйвер L293D:
  • диоды 1N4003 — 8 шт.
  • макетная плата MB-102

Почитав даташит на LM293D, нашел схемку:

L293D-circuits

Совместил драйвер с микроконтроллером и получил следующую схему:

step_motor

Кнопка нужна для изменения направления вращения. При нажатой кнопке двигатель крутится по часовой стрелке, отпустил — против часовой.

Набросал программку для микроконтроллера:

 list        p=16f84a
            __config    03ff1h
status      equ         03h
portb       equ         06h
trisb       equ         06h
Reg_1       equ         21h
Reg_2       equ         22h
Reg_3       equ         23h       
 
            org         0
            bsf         status,5
            clrf        trisb
            bcf         status,5
            movlw       .0
          
left        btfsc       portb,5
            goto        right
            
            bsf         portb,4
            call        delay
            bcf         portb,4
            call        delay
            
            bsf         portb,3
            call        delay
            bcf         portb,3
            call        delay
            
            bsf         portb,2
            call        delay
            bcf         portb,2
            call        delay
            
            bsf         portb,1
            call        delay
            bcf         portb,1
            call        delay
            
            goto        left
            
right       bsf         portb,1
            call        delay
            bcf         portb,1
            call        delay
            
            bsf         portb,2
            call        delay
            bcf         portb,2
            call        delay
            
            bsf         portb,3
            call        delay
            bcf         portb,3
            call        delay
            
            bsf         portb,4
            call        delay
            bcf         portb,4
            call        delay
    
            bcf         portb,5
          
            goto        left

; задержка 0.01 сек.           
delay       movlw       .251
            movwf       Reg_1
            movlw       .13
            movwf       Reg_2
            decfsz      Reg_1,F
            goto        $-1
            decfsz      Reg_2,F
            goto        $-3
            nop
            nop
            return
            
            end

Что в итоге получилось:

IMG_0953

Вот и все. Двигатель вращается, будем думать, что с этим делать дальше.