AccelStepperライブラリについて。
先の記事にも書いたけど、これを使うと複数のモーターを同時に回せる。
ここからダウンロードする。
https://github.com/adafruit/AccelStepper
※画面右の「Download ZIP」から落とす。
追記)こっちからのが最新版がダウンロードできるみたい。
http://www.airspayce.com/mikem/arduino/AccelStepper/
こんな感じで使ってる。
**********
001 #include <AccelStepper.h>
002 AccelStepper stepperX(1, 2, 5);
003 int posX = 3600;
004 void setup() {
005 stepperX.setMaxSpeed(3000);
006 stepperX.setAcceleration(1000);
007 }
008 void loop() {
009 if (stepperX.distanceToGo() == 0) {
010 posX = -posX;
011 stepperX.moveTo(posX);
012 }
013 stepperX.run();
014 }
**********
参考)Easy Driver Examples Example 3: Using a pre-built library – AccelStepper
http://www.schmalzhaus.com/EasyDriver/Examples/EasyDriverExamples.html
このライブラリが対応してるのは以下のタイプ。
**********
C:\Program Files\Arduino\libraries\AccelStepper\AccelStepper.h
**********
264 typedef enum
265 {
266 FUNCTION = 0, ///< Use the functional interface, implementing your own driver functions (internal use only)
267 DRIVER = 1, ///< Stepper Driver, 2 driver pins required
268 FULL2WIRE = 2, ///< 2 wire stepper, 2 motor pins required
269 FULL3WIRE = 3, ///< 3 wire stepper, such as HDD spindle, 3 motor pins required
270 FULL4WIRE = 4, ///< 4 wire full stepper, 4 motor pins required
271 HALF3WIRE = 6, ///< 3 wire half stepper, such as HDD spindle, 3 motor pins required
272 HALF4WIRE = 8 ///< 4 wire half stepper, 4 motor pins required
273 } MotorInterfaceType;
**********
モータードライバーの場合はこんな感じの処理をしてる。
**********
C:\Program Files\Arduino\libraries\AccelStepper\AccelStepper.cpp
**********
369 // 1 pin step function (ie for stepper drivers)
370 // This is passed the current step number (0 to 7)
371 // Subclasses can override
372 void AccelStepper::step1(long step)
373 {
374 // _pin[0] is step, _pin[1] is direction
375 setOutputPins(_direction ? 0b10 : 0b00); // Set direction first else get rogue pulses
376 setOutputPins(_direction ? 0b11 : 0b01); // step HIGH
377 // Caution 200ns setup time
378 // Delay the minimum allowed pulse width
379 delayMicroseconds(_minPulseWidth);
380 setOutputPins(_direction ? 0b10 : 0b00); // step LOW
381
382 }
**********
割り込みとかを使用せず、なんちゃって同時稼動をやってるみたい。
まぁ、あんま深くコード読んどらんけどね。
参考)バイポーラの場合
**********
C:\Program Files\Arduino\libraries\AccelStepper\AccelStepper.cpp
**********
385 // 2 pin step function
386 // This is passed the current step number (0 to 7)
387 // Subclasses can override
388 void AccelStepper::step2(long step)
389 {
390 switch (step & 0x3)
391 {
392 case 0: /* 01 */
393 setOutputPins(0b10);
394 break;
395
396 case 1: /* 11 */
397 setOutputPins(0b11);
398 break;
399
400 case 2: /* 10 */
401 setOutputPins(0b01);
402 break;
403
404 case 3: /* 00 */
405 setOutputPins(0b00);
406 break;
407 }
408 }
—
参考)ユニポーラの場合
**********
C:\Program Files\Arduino\libraries\AccelStepper\AccelStepper.cpp
**********
431 // 4 pin step function for half stepper
432 // This is passed the current step number (0 to 7)
433 // Subclasses can override
434 void AccelStepper::step4(long step)
435 {
436 switch (step & 0x3)
437 {
438 case 0: // 1010
439 setOutputPins(0b0101);
440 break;
441
442 case 1: // 0110
443 setOutputPins(0b0110);
444 break;
445
446 case 2: // 0101
447 setOutputPins(0b1010);
448 break;
449
450 case 3: // 1001
451 setOutputPins(0b1001);
452 break;
453 }
454 }
**********
関連記事)Arduino関連
https://slilabo.com/?s=arduino
コメント