Le moteur qui déplace la tête de lecture dans un lecteur de disquette/DVD est un moteur pas à pas de type bi-polaire (4 fils).
Il lui faut 20 pas par tour (20 Steps Per Revolution).
Le brochage est le suivant A+ A- B+ B-.
Résistance A+/A- == B+/B- = 10 Ohms
L’Arduino n’est pas capable d’alimenter directement un moteur sur ses pins, il faut utiliser un circuit intermédiaire « de puissance ».
Le circuit uln2803a (version octal du 2003a) peut être utilisé.
Un uln2803 contient 8 transistors darlington. Il permet de piloter 8 circuits jusqu’à 500ma et 50v.
Ce circuit fonctionne en collecteur ouvert. Il connecte la sortie à la masse quand le signal est « on » et à un état « flottant » (haute résistance quand le signal est « off » ( ce qui permet aux résistances d’élever la tension de sortie à 5v)
Il a les avantages suivants :
- très économique (2$ les 10 sur ebay),
- très simple à utiliser,
- capable de piloter 2 moteurs bipolaires avec un circuit,
- contient des diodes anti-retour,
- peut être commandé simplement via le port // d’un pc
- est pris en charge par LinuxCnc 😉
Inconvénient :
- nécessite une résistance de pull-up (22 Ohms) pour ce type de moteur
- peu efficient notamment à cause de ces résistances
pour en savoir plus : http://www.chicoree.fr/w/ULN2803
L293D
économique
Code Arduino (Uno/nano) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
//declare variables for the motor pins int motorPin1 = 8; int motorPin2 = 9; int motorPin3 = 10; int motorPin4 = 11; int motorSpeed = 22000; //variable to set stepper speed int count = 0; // count of steps made int countsperrev = 30; // number of steps per full revolution // bi-polar stepper motor sequence (4 leads) // AABB // +-+- int lookup[8] = { B01010, B01011, B01001, B01101, B00101, B00111, B00110, B01110 }; ////////////////////////////////////////////////////////////////////////////// void setup() { //declare the motor pins as outputs pinMode(motorPin1, OUTPUT); pinMode(motorPin2, OUTPUT); pinMode(motorPin3, OUTPUT); pinMode(motorPin4, OUTPUT); Serial.begin(9600); } ////////////////////////////////////////////////////////////////////////////// void loop(){ if(count < countsperrev ) clockwise(); else if (count == countsperrev * 2) count = 0; else anticlockwise(); count++; } ////////////////////////////////////////////////////////////////////////////// //set pins to ULN2003 high in sequence from 1 to 4 //delay "motorSpeed" between each pin setting (to determine speed) void anticlockwise() { for(int i = 0; i < 8; i++) { setOutput(i); delayMicroseconds(motorSpeed); } } void clockwise() { for(int i = 7; i >= 0; i--) { setOutput(i); delayMicroseconds(motorSpeed); } } void setOutput(int out) { digitalWrite(motorPin1, bitRead(lookup[out], 0)); digitalWrite(motorPin2, bitRead(lookup[out], 1)); digitalWrite(motorPin3, bitRead(lookup[out], 2)); digitalWrite(motorPin4, bitRead(lookup[out], 3)); } |
Configuration de Linuxcnc :
Fichier .hal :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 |
# .Hal File to drive stepper motors with a ULN2003 or similar IC # If you make changes to this file, they will be # overwritten when you run stepconf again loadrt trivkins loadrt [EMCMOT]EMCMOT base_period_nsec=[EMCMOT]BASE_PERIOD servo_period_nsec=[EMCMOT]SERVO_PERIOD num_joints=[TRAJ]AXES loadrt probe_parport loadrt hal_parport cfg="0x378 out" setp parport.0.reset-time 5000 # loadrt type : # 7 = 1000, 0001, 0111, 1110 # 8 = 1010, 1001, 0101, 0110 loadrt stepgen step_type=8,8,8 addf parport.0.read base-thread addf stepgen.make-pulses base-thread addf parport.0.write base-thread addf parport.0.reset base-thread addf stepgen.capture-position servo-thread addf motion-command-handler servo-thread addf motion-controller servo-thread addf stepgen.update-freq servo-thread net spindle-cmd <= motion.spindle-speed-out #################### Parallel Port Pins: ### X: net xpa => parport.0.pin-02-out net xpb => parport.0.pin-03-out net xpc => parport.0.pin-04-out net xpd => parport.0.pin-05-out ### Y: net ypa => parport.0.pin-06-out net ypb => parport.0.pin-07-out net ypc => parport.0.pin-08-out net ypd => parport.0.pin-09-out ### Z: net zpa => parport.0.pin-01-out net zpb => parport.0.pin-14-out net zpc => parport.0.pin-16-out net zpd => parport.0.pin-17-out #################### X AXIS 0 setp stepgen.0.position-scale 300 setp stepgen.0.steplen 100 setp stepgen.0.maxaccel [AXIS_0]STEPGEN_MAXACCEL net xpos-cmd axis.0.motor-pos-cmd => stepgen.0.position-cmd #uncommented?? net xpos-fb stepgen.0.position-fb => axis.0.motor-pos-fb net xpa <= stepgen.0.phase-A net xpb <= stepgen.0.phase-B net xpc <= stepgen.0.phase-C net xpd <= stepgen.0.phase-D net xenable axis.0.amp-enable-out => stepgen.0.enable setp stepgen.0.dirdelay 80 #################### Y AXIS 1 setp stepgen.1.position-scale 960 setp stepgen.1.steplen 100 setp stepgen.1.maxaccel [AXIS_1]STEPGEN_MAXACCEL net ypos-cmd axis.1.motor-pos-cmd => stepgen.1.position-cmd net ypos-fb stepgen.1.position-fb => axis.1.motor-pos-fb net ypa <= stepgen.1.phase-A net ypb <= stepgen.1.phase-B net ypc <= stepgen.1.phase-C net ypd <= stepgen.1.phase-D net yenable axis.1.amp-enable-out => stepgen.1.enable setp stepgen.1.dirdelay 80 #################### Z AXIS 2 setp stepgen.2.position-scale 400 setp stepgen.2.steplen 100 setp stepgen.2.maxaccel [AXIS_2]STEPGEN_MAXACCEL net zpos-cmd axis.2.motor-pos-cmd => stepgen.2.position-cmd net zpos-fb stepgen.2.position-fb => axis.2.motor-pos-fb net zpa <= stepgen.2.phase-A net zpb <= stepgen.2.phase-B net zpc <= stepgen.2.phase-C net zpd <= stepgen.2.phase-D net zenable axis.2.amp-enable-out => stepgen.2.enable setp stepgen.2.dirdelay 80 #################### net estop-out <= iocontrol.0.user-enable-out net estop-out => iocontrol.0.emc-enable-in loadusr -W hal_manualtoolchange net tool-change iocontrol.0.tool-change => hal_manualtoolchange.change net tool-changed iocontrol.0.tool-changed <= hal_manualtoolchange.changed net tool-number iocontrol.0.tool-prep-number => hal_manualtoolchange.number net tool-prepare-loopback iocontrol.0.tool-prepare => iocontrol.0.tool-prepared |
- pin 1 : marron
- pin 2 : rouge
- pin 3 : orange
- pin 4 : rose
- pin 5 : jaune
- pin 6 :
liens :
http://elabz.com/driving-a-bipolar-stepper-motor-with-arduino-and-uln2803ag/
http://www.youtube.com/watch?v=Mqldmk8tv94
http://arduino.cc/en/Tutorial/MotorKnob