单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
上一页
2/2
下一页
楼主: eagler8
打印上一主题下一主题

【Arduino】168种传感器系列实验(170)---L293D四路电机驱动板

[复制链接]
41#
ID:513258发表于 2020-11-12 19:38|只看该作者
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百七十:L293D四路电机驱动板 motor control shield 马达板
  4.   Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

  5.   1、安装库:百度搜索“AFMotor库”— 下载 — 拷贝到Arduino-libraries 文件夹中
  6.   2、实验之六:连接每转48步(7.5度)的步进电机,电机端口2#(M3和M4)
  7. */

  8. #include< AFMotor.h>

  9. // Connect a stepper motor with 48 steps per revolution (7.5 degree)
  10. // to motor port #2 (M3 and M4)
  11. AF_Stepper motor(48, 2);

  12. void setup() {
  13.   Serial.begin(9600);         // set up Serial library at 9600 bps
  14.   Serial.println("Stepper test! 测试步进电机!");

  15.   motor.setSpeed(10);  // 10 rpm
  16. }

  17. void loop() {
  18.   Serial.println("Single coil steps 单线圈步");
  19.   motor.step(100, FORWARD, SINGLE);
  20.   motor.step(100, BACKWARD, SINGLE);

  21.   Serial.println("Double coil steps 双线圈步");
  22.   motor.step(100, FORWARD, DOUBLE);
  23.   motor.step(100, BACKWARD, DOUBLE);

  24.   Serial.println("Interleave coil steps 交错线圈台阶");
  25.   motor.step(100, FORWARD, INTERLEAVE);
  26.   motor.step(100, BACKWARD, INTERLEAVE);

  27.   Serial.println("Micrsostep steps 微步前进");
  28.   motor.step(100, FORWARD, MICROSTEP);
  29.   motor.step(100, BACKWARD, MICROSTEP);
  30. }
复制代码


42#
ID:513258发表于 2020-11-12 19:41|只看该作者

43#
ID:513258发表于 2020-11-12 20:26|只看该作者
使用Arduino AFMotor驱动四只直流电机

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百七十:L293D四路电机驱动板 motor control shield 马达板
  4.   Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

  5.   1、安装库:百度搜索“AFMotor库”— 下载 — 拷贝到Arduino-libraries 文件夹中
  6.   2、实验之七:使用Arduino AFMotor驱动四只直流电机
  7. */

  8. #include< AFMotor.h> // 本程序中使用AFMotor库

  9. AF_DCMotor motor1(1); // 这4条语句的作用是建立4个直流电机对象,它们的名称分别是:motor1/2/3/4.
  10. AF_DCMotor motor2(2); // 这四条语句括号中的数字代表各个电机对象所连接在AFMotor扩展板的电机端口号码。
  11. AF_DCMotor motor3(3); // AF_DCMotor motor1(1); 代表motor1对象连接在AFMotor扩展板的M1端口上。
  12. AF_DCMotor motor4(4); // AFMotor电机扩展板最多可以驱动4个直流电机,最少可以驱动1个直流电机。

  13. void setup() {
  14.   motor1.setSpeed(200); // 这4条语句的作用是通过setSpped库函数设置电机运行速度。
  15.   motor2.setSpeed(200); // setSpped库函数中的参数是运行速度参数。
  16.   motor3.setSpeed(200); // 运行速度参数允许范围是0~255。
  17.   motor4.setSpeed(200); // 速度参数越大,运转速度越快。参数为0时电机停止转动。

  18.   motor1.run(RELEASE); // 这4条语句的作用是让4个电机在启动时停止转动
  19.   motor2.run(RELEASE); // run库函数允许使用的关键字参数有RELEASE、FORWARD、BACKWARD
  20.   motor3.run(RELEASE); // 使用关键字RELEASE作为参数使用时,run库函数将会让扩展板停止提供电机运转动力
  21.   motor4.run(RELEASE); // 电机旋转一旦失去动力就会自然的停止转动。
  22. }

  23. void loop() {
  24.   motor1.run(FORWARD); // 这4条语句的作用是利用run库函数控制4个电机"正向"旋转。
  25.   motor2.run(FORWARD); // 这里所谓的“正向”旋转只是一种说法,假如您发现电机旋转方向和您所要的“正向”不一致。
  26.   motor3.run(FORWARD); // 您可以将电机的两个引线从扩展板上断开,然后交换顺序再接到扩展板接口上
  27.   motor4.run(FORWARD); // 这时您会看到同样使用FORWARD关键字作为run库函数的参数,电机的旋转方向却反过来了。

  28.   for (int i = 0; i< = 255; i++) { // 这里使用for循环语句控制4个电机速度由停止逐步加速,最终电机运转达到最大速度。
  29.    motor1.setSpeed(i);       // 在for循环语句的作用下,setSpeed库函数的速度参数i由0逐渐增大,最终达到255。
  30.    motor2.setSpeed(i);       // 因此电机运行速度也是由停止逐渐加速,最终达到最大速度。
  31.    motor3.setSpeed(i);       // 对于一些模型电机来说,当速度参数小于一定数值以后就不能转动了。也就是说,也许您的电机
  32.    motor4.setSpeed(i);       // 在速度参数在小于某一个速度参数数值的时候就无法转动了。这属于正常现象。
  33.    delay(10);             // 具体这个最小值是多少,对于不同的电机来说是不同的。有的可能是50也有的可能是100。
  34.   }                     // 换句话说,很可能您的某一个直流电机在速度参数小于50的情况下就无法转动了。
  35.   // 也可能您的另一个直流电机在参数100以下的情况下就无法转动了。

  36.   for (int i = 255; i >= 0; i--) { // 这里使用for循环语句控制4个电机由最大旋转速度逐步减速最终停止旋转。
  37.    motor1.setSpeed(i);       // 这一系列语句的操作与上一段for循环语句类似。唯一区别是上一段for循环控制速度参数i由0涨到255
  38.    motor2.setSpeed(i);       // 而这一段语句控制速度参数i由255减小到0。同样您可能会发现当速度参数没有减小到零的时候,电机就已经
  39.    motor3.setSpeed(i);       // 停止旋转了。这其中的原因在上一段for循环语句中已经介绍了。不在这里赘述了。
  40.    motor4.setSpeed(i);
  41.    delay(10);
  42.   }

  43.   motor1.run(BACKWARD); // 这4条语句的作用是利用run库函数控制4个电机"反向"旋转。
  44.   motor2.run(BACKWARD); // 同样的,这里所谓的“反向”旋转也只是一种说法。这部分程序内容
  45.   motor3.run(BACKWARD); // 与本程序33-36行中的内容十分类似。唯一区别就是使用了“BACKWARD”
  46.   motor4.run(BACKWARD); // 关键字参数来通过库函数run控制电机“反向”旋转。

  47.   for (int i = 0; i< = 255; i++) { // 利用for循环语句控制速度参数i由小到大
  48.    motor1.setSpeed(i);       // 电机也会以“反向”旋转的方式由停止逐步达到最大速度
  49.    motor2.setSpeed(i);
  50.    motor3.setSpeed(i);
  51.    motor4.setSpeed(i);
  52.    delay(10);
  53.   }

  54.   for (int i = 255; i >= 0; i--) { // 利用for循环语句控制速度参数i由大到小
  55.    motor1.setSpeed(i);       // 电机也会以“反向”旋转的方式由最大速度逐步减小到停止
  56.    motor2.setSpeed(i);
  57.    motor3.setSpeed(i);
  58.    motor4.setSpeed(i);
  59.    delay(10);
  60.   }

  61.   motor1.run(RELEASE);   // 这四条语句作用是使用关键字RELEASE作为run函数的参数。
  62.   motor2.run(RELEASE);   // 在这种情况下,AFMotor扩展板将会停止为电机旋转提供动力。
  63.   motor3.run(RELEASE);   // 电机也就会自然的停止转动。
  64.   motor4.run(RELEASE);   // 本段程序后面的delay(1000)的作用就是让4个电机保持无旋转动力状态1秒钟

  65.   delay(1000);
  66. }
复制代码



44#
ID:513258发表于 2020-11-13 08:07|只看该作者
Arduino AFMotor 电机扩展板实验场景图



45#
ID:513258发表于 2020-11-13 08:59|只看该作者
附录:AFMotor.h库文件
目录—adafruit/Adafruit-Motor-Shield-library
链接—https://github.com/adafruit/Adaf ... ob/master/AFMotor.h

  1. // Adafruit Motor shield library
  2. // copyright Adafruit Industries LLC, 2009
  3. // this code is public domain, enjoy!

  4. /*
  5. * Usage Notes:
  6. * For PIC32, all features work properly with the following two exceptions:
  7. *
  8. * 1) Because the PIC32 only has 5 PWM outputs, and the AFMotor shield needs 6
  9. *   to completely operate (four for motor outputs and two for RC servos), the
  10. *   M1 motor output will not have PWM ability when used with a PIC32 board.
  11. *   However, there is a very simple workaround. If you need to drive a stepper
  12. *   or DC motor with PWM on motor output M1, you can use the PWM output on pin
  13. *   9 or pin 10 (normally use for RC servo outputs on Arduino, not needed for
  14. *   RC servo outputs on PIC32) to drive the PWM input for M1 by simply putting
  15. *   a jumber from pin 9 to pin 11 or pin 10 to pin 11. Then uncomment one of the
  16. *   two #defines below to activate the PWM on either pin 9 or pin 10. You will
  17. *   then have a fully functional microstepping for 2 stepper motors, or four
  18. *   DC motor outputs with PWM.
  19. *
  20. * 2) There is a conflict between RC Servo outputs on pins 9 and pins 10 and
  21. *   the operation of DC motors and stepper motors as of 9/2012. This issue
  22. *   will get fixed in future MPIDE releases, but at the present time it means
  23. *   that the Motor Party example will NOT work properly. Any time you attach
  24. *   an RC servo to pins 9 or pins 10, ALL PWM outputs on the whole board will
  25. *   stop working. Thus no steppers or DC motors.
  26. *
  27. */
  28. //< BPS> 09/15/2012 Modified for use with chipKIT boards


  29. #ifndef _AFMotor_h_
  30. #define _AFMotor_h_

  31. #include< inttypes.h>
  32. #if defined(__AVR__)
  33.    #include< avr/io.h>

  34.    //#define MOTORDEBUG 1

  35.    #define MICROSTEPS 16                 // 8 or 16

  36.    #define MOTOR12_64KHZ _BV(CS20)         // no prescale
  37.    #define MOTOR12_8KHZ _BV(CS21)           // divide by 8
  38.    #define MOTOR12_2KHZ _BV(CS21) | _BV(CS20)  // divide by 32
  39.    #define MOTOR12_1KHZ _BV(CS22)           // divide by 64

  40.    #define MOTOR34_64KHZ _BV(CS00)         // no prescale
  41.    #define MOTOR34_8KHZ _BV(CS01)           // divide by 8
  42.    #define MOTOR34_1KHZ _BV(CS01) | _BV(CS00)  // divide by 64
  43.   
  44.    #define DC_MOTOR_PWM_RATE   MOTOR34_8KHZ   // PWM rate for DC motors
  45.    #define STEPPER1_PWM_RATE   MOTOR12_64KHZ   // PWM rate for stepper 1
  46.    #define STEPPER2_PWM_RATE   MOTOR34_64KHZ   // PWM rate for stepper 2
  47.   
  48. #elif defined(__PIC32MX__)
  49.    //#define MOTORDEBUG 1
  50.   
  51.    // Uncomment the one of following lines if you have put a jumper from
  52.    // either pin 9 to pin 11 or pin 10 to pin 11 on your Motor Shield.
  53.    // Either will enable PWM for M1
  54.    //#define PIC32_USE_PIN9_FOR_M1_PWM
  55.    //#define PIC32_USE_PIN10_FOR_M1_PWM

  56.    #define MICROSTEPS 16     // 8 or 16

  57.    // For PIC32 Timers, define prescale settings by PWM frequency
  58.    #define MOTOR12_312KHZ  0   // 1:1, actual frequency 312KHz
  59.    #define MOTOR12_156KHZ  1   // 1:2, actual frequency 156KHz
  60.    #define MOTOR12_64KHZ   2   // 1:4, actual frequency 78KHz
  61.    #define MOTOR12_39KHZ   3   // 1:8, acutal frequency 39KHz
  62.    #define MOTOR12_19KHZ   4   // 1:16, actual frequency 19KHz
  63.    #define MOTOR12_8KHZ   5   // 1:32, actual frequency 9.7KHz
  64.    #define MOTOR12_4_8KHZ  6   // 1:64, actual frequency 4.8KHz
  65.    #define MOTOR12_2KHZ   7   // 1:256, actual frequency 1.2KHz
  66.    #define MOTOR12_1KHZ   7   // 1:256, actual frequency 1.2KHz

  67.    #define MOTOR34_312KHZ  0   // 1:1, actual frequency 312KHz
  68.    #define MOTOR34_156KHZ  1   // 1:2, actual frequency 156KHz
  69.    #define MOTOR34_64KHZ   2   // 1:4, actual frequency 78KHz
  70.    #define MOTOR34_39KHZ   3   // 1:8, acutal frequency 39KHz
  71.    #define MOTOR34_19KHZ   4   // 1:16, actual frequency 19KHz
  72.    #define MOTOR34_8KHZ   5   // 1:32, actual frequency 9.7KHz
  73.    #define MOTOR34_4_8KHZ  6   // 1:64, actual frequency 4.8KHz
  74.    #define MOTOR34_2KHZ   7   // 1:256, actual frequency 1.2KHz
  75.    #define MOTOR34_1KHZ   7   // 1:256, actual frequency 1.2KHz
  76.   
  77.    // PWM rate for DC motors.
  78.    #define DC_MOTOR_PWM_RATE   MOTOR34_39KHZ
  79.    // Note: for PIC32, both of these must be set to the same value
  80.    // since there's only one timebase for all 4 PWM outputs
  81.    #define STEPPER1_PWM_RATE   MOTOR12_39KHZ
  82.    #define STEPPER2_PWM_RATE   MOTOR34_39KHZ
  83.   
  84. #endif

  85. // Bit positions in the 74HCT595 shift register output
  86. #define MOTOR1_A 2
  87. #define MOTOR1_B 3
  88. #define MOTOR2_A 1
  89. #define MOTOR2_B 4
  90. #define MOTOR4_A 0
  91. #define MOTOR4_B 6
  92. #define MOTOR3_A 5
  93. #define MOTOR3_B 7

  94. // Constants that the user passes in to the motor calls
  95. #define FORWARD 1
  96. #define BACKWARD 2
  97. #define BRAKE 3
  98. #define RELEASE 4

  99. // Constants that the user passes in to the stepper calls
  100. #define SINGLE 1
  101. #define DOUBLE 2
  102. #define INTERLEAVE 3
  103. #define MICROSTEP 4

  104. /*
  105. #define LATCH 4
  106. #define LATCH_DDR DDRB
  107. #define LATCH_PORT PORTB
  108. #define CLK_PORT PORTD
  109. #define CLK_DDR DDRD
  110. #define CLK 4
  111. #define ENABLE_PORT PORTD
  112. #define ENABLE_DDR DDRD
  113. #define ENABLE 7
  114. #define SER 0
  115. #define SER_DDR DDRB
  116. #define SER_PORT PORTB
  117. */

  118. // Arduino pin names for interface to 74HCT595 latch
  119. #define MOTORLATCH 12
  120. #define MOTORCLK 4
  121. #define MOTORENABLE 7
  122. #define MOTORDATA 8

  123. class AFMotorController
  124. {
  125.   public:
  126.    AFMotorController(void);
  127.    void enable(void);
  128.    friend class AF_DCMotor;
  129.    void latch_tx(void);
  130.    uint8_t TimerInitalized;
  131. };

  132. class AF_DCMotor
  133. {
  134. public:
  135.   AF_DCMotor(uint8_t motornum, uint8_t freq = DC_MOTOR_PWM_RATE);
  136.   void run(uint8_t);
  137.   void setSpeed(uint8_t);

  138. private:
  139.   uint8_t motornum, pwmfreq;
  140. };

  141. class AF_Stepper {
  142. public:
  143.   AF_Stepper(uint16_t, uint8_t);
  144.   void step(uint16_t steps, uint8_t dir,  uint8_t style = SINGLE);
  145.   void setSpeed(uint16_t);
  146.   uint8_t onestep(uint8_t dir, uint8_t style);
  147.   void release(void);
  148.   uint16_t revsteps; // # steps per revolution
  149.   uint8_t steppernum;
  150.   uint32_t usperstep, steppingcounter;
  151. private:
  152.   uint8_t currentstep;

  153. };

  154. uint8_t getlatchstate(void);

  155. #endif
复制代码




46#
ID:513258发表于 2020-11-13 09:04|只看该作者

附录:AFMotor.cpp库文件
目录—adafruit/Adafruit-Motor-Shield-library
链接—https://github.com/adafruit/Adaf ... /master/AFMotor.cpp


  1. // Adafruit Motor shield library
  2. // copyright Adafruit Industries LLC, 2009
  3. // this code is public domain, enjoy!


  4. #if (ARDUINO >= 100)
  5.   #include "Arduino.h"
  6. #else
  7.   #if defined(__AVR__)
  8.    #include< avr/io.h>
  9.   #endif
  10.   #include "WProgram.h"
  11. #endif

  12. #include "AFMotor.h"



  13. static uint8_t latch_state;

  14. #if (MICROSTEPS == 8)
  15. uint8_t microstepcurve[] = {0, 50, 98, 142, 180, 212, 236, 250, 255};
  16. #elif (MICROSTEPS == 16)
  17. uint8_t microstepcurve[] = {0, 25, 50, 74, 98, 120, 141, 162, 180, 197, 212, 225, 236, 244, 250, 253, 255};
  18. #endif

  19. AFMotorController::AFMotorController(void) {
  20.    TimerInitalized = false;
  21. }

  22. void AFMotorController::enable(void) {
  23.   // setup the latch
  24.   /*
  25.   LATCH_DDR |= _BV(LATCH);
  26.   ENABLE_DDR |= _BV(ENABLE);
  27.   CLK_DDR |= _BV(CLK);
  28.   SER_DDR |= _BV(SER);
  29.   */
  30.   pinMode(MOTORLATCH, OUTPUT);
  31.   pinMode(MOTORENABLE, OUTPUT);
  32.   pinMode(MOTORDATA, OUTPUT);
  33.   pinMode(MOTORCLK, OUTPUT);

  34.   latch_state = 0;

  35.   latch_tx();  // "reset"

  36.   //ENABLE_PORT& = ~_BV(ENABLE); // enable the chip outputs!
  37.   digitalWrite(MOTORENABLE, LOW);
  38. }


  39. void AFMotorController::latch_tx(void) {
  40.   uint8_t i;

  41.   //LATCH_PORT& = ~_BV(LATCH);
  42.   digitalWrite(MOTORLATCH, LOW);

  43.   //SER_PORT& = ~_BV(SER);
  44.   digitalWrite(MOTORDATA, LOW);

  45.   for (i=0; i<8; i++) {
  46.    //CLK_PORT& = ~_BV(CLK);
  47.    digitalWrite(MOTORCLK, LOW);

  48.    if (latch_state& _BV(7-i)) {
  49.      //SER_PORT |= _BV(SER);
  50.      digitalWrite(MOTORDATA, HIGH);
  51.    } else {
  52.      //SER_PORT& = ~_BV(SER);
  53.      digitalWrite(MOTORDATA, LOW);
  54.    }
  55.    //CLK_PORT |= _BV(CLK);
  56.    digitalWrite(MOTORCLK, HIGH);
  57.   }
  58.   //LATCH_PORT |= _BV(LATCH);
  59.   digitalWrite(MOTORLATCH, HIGH);
  60. }

  61. static AFMotorController MC;

  62. /******************************************
  63.            MOTORS
  64. ******************************************/
  65. inline void initPWM1(uint8_t freq) {
  66. #if defined(__AVR_ATmega8__) || \
  67.    defined(__AVR_ATmega48__) || \
  68.    defined(__AVR_ATmega88__) || \
  69.    defined(__AVR_ATmega168__) || \
  70.    defined(__AVR_ATmega328P__)
  71.    // use PWM from timer2A on PB3 (Arduino pin #11)
  72.    TCCR2A |= _BV(COM2A1) | _BV(WGM20) | _BV(WGM21); // fast PWM, turn on oc2a
  73.    TCCR2B = freq& 0x7;
  74.    OCR2A = 0;
  75. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  76.    // on arduino mega, pin 11 is now PB5 (OC1A)
  77.    TCCR1A |= _BV(COM1A1) | _BV(WGM10); // fast PWM, turn on oc1a
  78.    TCCR1B = (freq& 0x7) | _BV(WGM12);
  79.    OCR1A = 0;
  80. #elif defined(__PIC32MX__)
  81.    #if defined(PIC32_USE_PIN9_FOR_M1_PWM)
  82.        // Make sure that pin 11 is an input, since we have tied together 9 and 11
  83.        pinMode(9, OUTPUT);
  84.        pinMode(11, INPUT);
  85.        if (!MC.TimerInitalized)
  86.        {   // Set up Timer2 for 80MHz counting fro 0 to 256
  87.          T2CON = 0x8000 | ((freq& 0x07)<< 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
  88.          TMR2 = 0x0000;
  89.          PR2 = 0x0100;
  90.          MC.TimerInitalized = true;
  91.        }
  92.        // Setup OC4 (pin 9) in PWM mode, with Timer2 as timebase
  93.        OC4CON = 0x8006;   // OC32 = 0, OCTSEL=0, OCM=6
  94.        OC4RS = 0x0000;
  95.        OC4R = 0x0000;
  96.    #elif defined(PIC32_USE_PIN10_FOR_M1_PWM)
  97.        // Make sure that pin 11 is an input, since we have tied together 9 and 11
  98.        pinMode(10, OUTPUT);
  99.        pinMode(11, INPUT);
  100.        if (!MC.TimerInitalized)
  101.        {   // Set up Timer2 for 80MHz counting fro 0 to 256
  102.          T2CON = 0x8000 | ((freq& 0x07)<< 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
  103.          TMR2 = 0x0000;
  104.          PR2 = 0x0100;
  105.          MC.TimerInitalized = true;
  106.        }
  107.        // Setup OC5 (pin 10) in PWM mode, with Timer2 as timebase
  108.        OC5CON = 0x8006;   // OC32 = 0, OCTSEL=0, OCM=6
  109.        OC5RS = 0x0000;
  110.        OC5R = 0x0000;
  111.    #else
  112.        // If we are not using PWM for pin 11, then just do digital
  113.        digitalWrite(11, LOW);
  114.    #endif
  115. #else
  116.    #error "This chip is not supported!"
  117. #endif
  118.    #if !defined(PIC32_USE_PIN9_FOR_M1_PWM)&& !defined(PIC32_USE_PIN10_FOR_M1_PWM)
  119.        pinMode(11, OUTPUT);
  120.    #endif
  121. }

  122. inline void setPWM1(uint8_t s) {
  123. #if defined(__AVR_ATmega8__) || \
  124.    defined(__AVR_ATmega48__) || \
  125.    defined(__AVR_ATmega88__) || \
  126.    defined(__AVR_ATmega168__) || \
  127.    defined(__AVR_ATmega328P__)
  128.    // use PWM from timer2A on PB3 (Arduino pin #11)
  129.    OCR2A = s;
  130. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  131.    // on arduino mega, pin 11 is now PB5 (OC1A)
  132.    OCR1A = s;
  133. #elif defined(__PIC32MX__)
  134.    #if defined(PIC32_USE_PIN9_FOR_M1_PWM)
  135.        // Set the OC4 (pin 9) PMW duty cycle from 0 to 255
  136.        OC4RS = s;
  137.    #elif defined(PIC32_USE_PIN10_FOR_M1_PWM)
  138.        // Set the OC5 (pin 10) PMW duty cycle from 0 to 255
  139.        OC5RS = s;
  140.    #else
  141.        // If we are not doing PWM output for M1, then just use on/off
  142.        if (s > 127)
  143.        {
  144.          digitalWrite(11, HIGH);
  145.        }
  146.        else
  147.        {
  148.          digitalWrite(11, LOW);
  149.        }
  150.    #endif
  151. #else
  152.    #error "This chip is not supported!"
  153. #endif
  154. }

  155. inline void initPWM2(uint8_t freq) {
  156. #if defined(__AVR_ATmega8__) || \
  157.    defined(__AVR_ATmega48__) || \
  158.    defined(__AVR_ATmega88__) || \
  159.    defined(__AVR_ATmega168__) || \
  160.    defined(__AVR_ATmega328P__)
  161.    // use PWM from timer2B (pin 3)
  162.    TCCR2A |= _BV(COM2B1) | _BV(WGM20) | _BV(WGM21); // fast PWM, turn on oc2b
  163.    TCCR2B = freq& 0x7;
  164.    OCR2B = 0;
  165. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  166.    // on arduino mega, pin 3 is now PE5 (OC3C)
  167.    TCCR3A |= _BV(COM1C1) | _BV(WGM10); // fast PWM, turn on oc3c
  168.    TCCR3B = (freq& 0x7) | _BV(WGM12);
  169.    OCR3C = 0;
  170. #elif defined(__PIC32MX__)
  171.    if (!MC.TimerInitalized)
  172.    {   // Set up Timer2 for 80MHz counting fro 0 to 256
  173.        T2CON = 0x8000 | ((freq& 0x07)<< 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
  174.        TMR2 = 0x0000;
  175.        PR2 = 0x0100;
  176.        MC.TimerInitalized = true;
  177.    }
  178.    // Setup OC1 (pin3) in PWM mode, with Timer2 as timebase
  179.    OC1CON = 0x8006;   // OC32 = 0, OCTSEL=0, OCM=6
  180.    OC1RS = 0x0000;
  181.    OC1R = 0x0000;
  182. #else
  183.    #error "This chip is not supported!"
  184. #endif

  185.    pinMode(3, OUTPUT);
  186. }

  187. inline void setPWM2(uint8_t s) {
  188. #if defined(__AVR_ATmega8__) || \
  189.    defined(__AVR_ATmega48__) || \
  190.    defined(__AVR_ATmega88__) || \
  191.    defined(__AVR_ATmega168__) || \
  192.    defined(__AVR_ATmega328P__)
  193.    // use PWM from timer2A on PB3 (Arduino pin #11)
  194.    OCR2B = s;
  195. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  196.    // on arduino mega, pin 11 is now PB5 (OC1A)
  197.    OCR3C = s;
  198. #elif defined(__PIC32MX__)
  199.    // Set the OC1 (pin3) PMW duty cycle from 0 to 255
  200.    OC1RS = s;
  201. #else
  202.    #error "This chip is not supported!"
  203. #endif
  204. }

  205. inline void initPWM3(uint8_t freq) {
  206. #if defined(__AVR_ATmega8__) || \
  207.    defined(__AVR_ATmega48__) || \
  208.    defined(__AVR_ATmega88__) || \
  209.    defined(__AVR_ATmega168__) || \
  210.    defined(__AVR_ATmega328P__)
  211.    // use PWM from timer0A / PD6 (pin 6)
  212.    TCCR0A |= _BV(COM0A1) | _BV(WGM00) | _BV(WGM01); // fast PWM, turn on OC0A
  213.    //TCCR0B = freq& 0x7;
  214.    OCR0A = 0;
  215. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  216.    // on arduino mega, pin 6 is now PH3 (OC4A)
  217.    TCCR4A |= _BV(COM1A1) | _BV(WGM10); // fast PWM, turn on oc4a
  218.    TCCR4B = (freq& 0x7) | _BV(WGM12);
  219.    //TCCR4B = 1 | _BV(WGM12);
  220.    OCR4A = 0;
  221. #elif defined(__PIC32MX__)
  222.    if (!MC.TimerInitalized)
  223.    {   // Set up Timer2 for 80MHz counting fro 0 to 256
  224.        T2CON = 0x8000 | ((freq& 0x07)<< 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
  225.        TMR2 = 0x0000;
  226.        PR2 = 0x0100;
  227.        MC.TimerInitalized = true;
  228.    }
  229.    // Setup OC3 (pin 6) in PWM mode, with Timer2 as timebase
  230.    OC3CON = 0x8006;   // OC32 = 0, OCTSEL=0, OCM=6
  231.    OC3RS = 0x0000;
  232.    OC3R = 0x0000;
  233. #else
  234.    #error "This chip is not supported!"
  235. #endif
  236.    pinMode(6, OUTPUT);
  237. }

  238. inline void setPWM3(uint8_t s) {
  239. #if defined(__AVR_ATmega8__) || \
  240.    defined(__AVR_ATmega48__) || \
  241.    defined(__AVR_ATmega88__) || \
  242.    defined(__AVR_ATmega168__) || \
  243.    defined(__AVR_ATmega328P__)
  244.    // use PWM from timer0A on PB3 (Arduino pin #6)
  245.    OCR0A = s;
  246. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  247.    // on arduino mega, pin 6 is now PH3 (OC4A)
  248.    OCR4A = s;
  249. #elif defined(__PIC32MX__)
  250.    // Set the OC3 (pin 6) PMW duty cycle from 0 to 255
  251.    OC3RS = s;
  252. #else
  253.    #error "This chip is not supported!"
  254. #endif
  255. }



  256. inline void initPWM4(uint8_t freq) {
  257. #if defined(__AVR_ATmega8__) || \
  258.    defined(__AVR_ATmega48__) || \
  259.    defined(__AVR_ATmega88__) || \
  260.    defined(__AVR_ATmega168__) || \
  261.    defined(__AVR_ATmega328P__)
  262.    // use PWM from timer0B / PD5 (pin 5)
  263.    TCCR0A |= _BV(COM0B1) | _BV(WGM00) | _BV(WGM01); // fast PWM, turn on oc0a
  264.    //TCCR0B = freq& 0x7;
  265.    OCR0B = 0;
  266. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  267.    // on arduino mega, pin 5 is now PE3 (OC3A)
  268.    TCCR3A |= _BV(COM1A1) | _BV(WGM10); // fast PWM, turn on oc3a
  269.    TCCR3B = (freq& 0x7) | _BV(WGM12);
  270.    //TCCR4B = 1 | _BV(WGM12);
  271.    OCR3A = 0;
  272. #elif defined(__PIC32MX__)
  273.    if (!MC.TimerInitalized)
  274.    {   // Set up Timer2 for 80MHz counting fro 0 to 256
  275.        T2CON = 0x8000 | ((freq& 0x07)<< 4); // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=<freq>, T32=0, TCS=0; // ON=1, FRZ=0, SIDL=0, TGATE=0, TCKPS=0, T32=0, TCS=0
  276.        TMR2 = 0x0000;
  277.        PR2 = 0x0100;
  278.        MC.TimerInitalized = true;
  279.    }
  280.    // Setup OC2 (pin 5) in PWM mode, with Timer2 as timebase
  281.    OC2CON = 0x8006;   // OC32 = 0, OCTSEL=0, OCM=6
  282.    OC2RS = 0x0000;
  283.    OC2R = 0x0000;
  284. #else
  285.    #error "This chip is not supported!"
  286. #endif
  287.    pinMode(5, OUTPUT);
  288. }

  289. inline void setPWM4(uint8_t s) {
  290. #if defined(__AVR_ATmega8__) || \
  291.    defined(__AVR_ATmega48__) || \
  292.    defined(__AVR_ATmega88__) || \
  293.    defined(__AVR_ATmega168__) || \
  294.    defined(__AVR_ATmega328P__)
  295.    // use PWM from timer0A on PB3 (Arduino pin #6)
  296.    OCR0B = s;
  297. #elif defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  298.    // on arduino mega, pin 6 is now PH3 (OC4A)
  299.    OCR3A = s;
  300. #elif defined(__PIC32MX__)
  301.    // Set the OC2 (pin 5) PMW duty cycle from 0 to 255
  302.    OC2RS = s;
  303. #else
  304.    #error "This chip is not supported!"
  305. #endif
  306. }

  307. AF_DCMotor::AF_DCMotor(uint8_t num, uint8_t freq) {
  308.   motornum = num;
  309.   pwmfreq = freq;

  310.   MC.enable();

  311.   switch (num) {
  312.   case 1:
  313.    latch_state& = ~_BV(MOTOR1_A)& ~_BV(MOTOR1_B); // set both motor pins to 0
  314.    MC.latch_tx();
  315.    initPWM1(freq);
  316.    break;
  317.   case 2:
  318.    latch_state& = ~_BV(MOTOR2_A)& ~_BV(MOTOR2_B); // set both motor pins to 0
  319.    MC.latch_tx();
  320.    initPWM2(freq);
  321.    break;
  322.   case 3:
  323.    latch_state& = ~_BV(MOTOR3_A)& ~_BV(MOTOR3_B); // set both motor pins to 0
  324.    MC.latch_tx();
  325.    initPWM3(freq);
  326.    break;
  327.   case 4:
  328.    latch_state& = ~_BV(MOTOR4_A)& ~_BV(MOTOR4_B); // set both motor pins to 0
  329.    MC.latch_tx();
  330.    initPWM4(freq);
  331.    break;
  332.   }
  333. }

  334. void AF_DCMotor::run(uint8_t cmd) {
  335.   uint8_t a, b;
  336.   switch (motornum) {
  337.   case 1:
  338.    a = MOTOR1_A; b = MOTOR1_B; break;
  339.   case 2:
  340.    a = MOTOR2_A; b = MOTOR2_B; break;
  341.   case 3:
  342.    a = MOTOR3_A; b = MOTOR3_B; break;
  343.   case 4:
  344.    a = MOTOR4_A; b = MOTOR4_B; break;
  345.   default:
  346.    return;
  347.   }
  348.   
  349.   switch (cmd) {
  350.   case FORWARD:
  351.    latch_state |= _BV(a);
  352.    latch_state& = ~_BV(b);
  353.    MC.latch_tx();
  354.    break;
  355.   case BACKWARD:
  356.    latch_state& = ~_BV(a);
  357.    latch_state |= _BV(b);
  358.    MC.latch_tx();
  359.    break;
  360.   case RELEASE:
  361.    latch_state& = ~_BV(a);     // A and B both low
  362.    latch_state& = ~_BV(b);
  363.    MC.latch_tx();
  364.    break;
  365.   }
  366. }

  367. void AF_DCMotor::setSpeed(uint8_t speed) {
  368.   switch (motornum) {
  369.   case 1:
  370.    setPWM1(speed); break;
  371.   case 2:
  372.    setPWM2(speed); break;
  373.   case 3:
  374.    setPWM3(speed); break;
  375.   case 4:
  376.    setPWM4(speed); break;
  377.   }
  378. }

  379. /******************************************
  380.            STEPPERS
  381. ******************************************/

  382. AF_Stepper::AF_Stepper(uint16_t steps, uint8_t num) {
  383.   MC.enable();

  384.   revsteps = steps;
  385.   steppernum = num;
  386.   currentstep = 0;

  387.   if (steppernum == 1) {
  388.    latch_state& = ~_BV(MOTOR1_A)& ~_BV(MOTOR1_B)&
  389.      ~_BV(MOTOR2_A)& ~_BV(MOTOR2_B); // all motor pins to 0
  390.    MC.latch_tx();
  391.   
  392.    // enable both H bridges
  393.    pinMode(11, OUTPUT);
  394.    pinMode(3, OUTPUT);
  395.    digitalWrite(11, HIGH);
  396.    digitalWrite(3, HIGH);

  397.    // use PWM for microstepping support
  398.    initPWM1(STEPPER1_PWM_RATE);
  399.    initPWM2(STEPPER1_PWM_RATE);
  400.    setPWM1(255);
  401.    setPWM2(255);

  402.   } else if (steppernum == 2) {
  403.    latch_state& = ~_BV(MOTOR3_A)& ~_BV(MOTOR3_B)&
  404.      ~_BV(MOTOR4_A)& ~_BV(MOTOR4_B); // all motor pins to 0
  405.    MC.latch_tx();

  406.    // enable both H bridges
  407.    pinMode(5, OUTPUT);
  408.    pinMode(6, OUTPUT);
  409.    digitalWrite(5, HIGH);
  410.    digitalWrite(6, HIGH);

  411.    // use PWM for microstepping support
  412.    // use PWM for microstepping support
  413.    initPWM3(STEPPER2_PWM_RATE);
  414.    initPWM4(STEPPER2_PWM_RATE);
  415.    setPWM3(255);
  416.    setPWM4(255);
  417.   }
  418. }

  419. void AF_Stepper::setSpeed(uint16_t rpm) {
  420.   usperstep = 60000000 / ((uint32_t)revsteps * (uint32_t)rpm);
  421.   steppingcounter = 0;
  422. }

  423. void AF_Stepper::release(void) {
  424.   if (steppernum == 1) {
  425.    latch_state& = ~_BV(MOTOR1_A)& ~_BV(MOTOR1_B)&
  426.      ~_BV(MOTOR2_A)& ~_BV(MOTOR2_B); // all motor pins to 0
  427.    MC.latch_tx();
  428.   } else if (steppernum == 2) {
  429.    latch_state& = ~_BV(MOTOR3_A)& ~_BV(MOTOR3_B)&
  430.      ~_BV(MOTOR4_A)& ~_BV(MOTOR4_B); // all motor pins to 0
  431.    MC.latch_tx();
  432.   }
  433. }

  434. void AF_Stepper::step(uint16_t steps, uint8_t dir,  uint8_t style) {
  435.   uint32_t uspers = usperstep;
  436.   uint8_t ret = 0;

  437.   if (style == INTERLEAVE) {
  438.    uspers /= 2;
  439.   }
  440. else if (style == MICROSTEP) {
  441.    uspers /= MICROSTEPS;
  442.    steps *= MICROSTEPS;
  443. #ifdef MOTORDEBUG
  444.    Serial.print("steps = "); Serial.println(steps, DEC);
  445. #endif
  446.   }

  447.   while (steps--) {
  448.    ret = onestep(dir, style);
  449.    delay(uspers/1000); // in ms
  450.    steppingcounter += (uspers % 1000);
  451.    if (steppingcounter >= 1000) {
  452.      delay(1);
  453.      steppingcounter -= 1000;
  454.    }
  455.   }
  456.   if (style == MICROSTEP) {
  457.    while ((ret != 0)&& (ret != MICROSTEPS)) {
  458.      ret = onestep(dir, style);
  459.      delay(uspers/1000); // in ms
  460.      steppingcounter += (uspers % 1000);
  461.      if (steppingcounter >= 1000) {
  462.      delay(1);
  463.      steppingcounter -= 1000;
  464.      }
  465.    }
  466.   }
  467. }

  468. uint8_t AF_Stepper::onestep(uint8_t dir, uint8_t style) {
  469.   uint8_t a, b, c, d;
  470.   uint8_t ocrb, ocra;

  471.   ocra = ocrb = 255;

  472.   if (steppernum == 1) {
  473.    a = _BV(MOTOR1_A);
  474.    b = _BV(MOTOR2_A);
  475.    c = _BV(MOTOR1_B);
  476.    d = _BV(MOTOR2_B);
  477.   } else if (steppernum == 2) {
  478.    a = _BV(MOTOR3_A);
  479.    b = _BV(MOTOR4_A);
  480.    c = _BV(MOTOR3_B);
  481.    d = _BV(MOTOR4_B);
  482.   } else {
  483.    return 0;
  484.   }

  485.   // next determine what sort of stepping procedure we're up to
  486.   if (style == SINGLE) {
  487.    if ((currentstep/(MICROSTEPS/2)) % 2) { // we're at an odd step, weird
  488.      if (dir == FORWARD) {
  489.      currentstep += MICROSTEPS/2;
  490.      }
  491.      else {
  492.      currentstep -= MICROSTEPS/2;
  493.      }
  494.    } else {         // go to the next even step
  495.      if (dir == FORWARD) {
  496.      currentstep += MICROSTEPS;
  497.      }
  498.      else {
  499.      currentstep -= MICROSTEPS;
  500.      }
  501.    }
  502.   } else if (style == DOUBLE) {
  503.    if (! (currentstep/(MICROSTEPS/2) % 2)) { // we're at an even step, weird
  504.      if (dir == FORWARD) {
  505.      currentstep += MICROSTEPS/2;
  506.      } else {
  507.      currentstep -= MICROSTEPS/2;
  508.      }
  509.    } else {         // go to the next odd step
  510.      if (dir == FORWARD) {
  511.      currentstep += MICROSTEPS;
  512.      } else {
  513.      currentstep -= MICROSTEPS;
  514.      }
  515.    }
  516.   } else if (style == INTERLEAVE) {
  517.    if (dir == FORWARD) {
  518.      currentstep += MICROSTEPS/2;
  519.    } else {
  520.      currentstep -= MICROSTEPS/2;
  521.    }
  522.   }

  523.   if (style == MICROSTEP) {
  524.    if (dir == FORWARD) {
  525.      currentstep++;
  526.    } else {
  527.      // BACKWARDS
  528.      currentstep--;
  529.    }

  530.    currentstep += MICROSTEPS*4;
  531.    currentstep %= MICROSTEPS*4;

  532.    ocra = ocrb = 0;
  533.    if ( (currentstep >= 0)&& (currentstep< MICROSTEPS)) {
  534.      ocra = microstepcurve[MICROSTEPS - currentstep];
  535.      ocrb = microstepcurve[currentstep];
  536.    } else if  ( (currentstep >= MICROSTEPS)&& (currentstep< MICROSTEPS*2)) {
  537.      ocra = microstepcurve[currentstep - MICROSTEPS];
  538.      ocrb = microstepcurve[MICROSTEPS*2 - currentstep];
  539.    } else if  ( (currentstep >= MICROSTEPS*2)&& (currentstep< MICROSTEPS*3)) {
  540.      ocra = microstepcurve[MICROSTEPS*3 - currentstep];
  541.      ocrb = microstepcurve[currentstep - MICROSTEPS*2];
  542.    } else if  ( (currentstep >= MICROSTEPS*3)&& (currentstep< MICROSTEPS*4)) {
  543.      ocra = microstepcurve[currentstep - MICROSTEPS*3];
  544.      ocrb = microstepcurve[MICROSTEPS*4 - currentstep];
  545.    }
  546.   }

  547.   currentstep += MICROSTEPS*4;
  548.   currentstep %= MICROSTEPS*4;

  549. #ifdef MOTORDEBUG
  550.   Serial.print("current step: "); Serial.println(currentstep, DEC);
  551.   Serial.print(" pwmA = "); Serial.print(ocra, DEC);
  552.   Serial.print(" pwmB = "); Serial.println(ocrb, DEC);
  553. #endif

  554.   if (steppernum == 1) {
  555.    setPWM1(ocra);
  556.    setPWM2(ocrb);
  557.   } else if (steppernum == 2) {
  558.    setPWM3(ocra);
  559.    setPWM4(ocrb);
  560.   }


  561.   // release all
  562.   latch_state& = ~a& ~b& ~c& ~d; // all motor pins to 0

  563.   //Serial.println(step, DEC);
  564.   if (style == MICROSTEP) {
  565.    if ((currentstep >= 0)&& (currentstep< MICROSTEPS))
  566.      latch_state |= a | b;
  567.    if ((currentstep >= MICROSTEPS)&& (currentstep< MICROSTEPS*2))
  568.      latch_state |= b | c;
  569.    if ((currentstep >= MICROSTEPS*2)&& (currentstep< MICROSTEPS*3))
  570.      latch_state |= c | d;
  571.    if ((currentstep >= MICROSTEPS*3)&& (currentstep< MICROSTEPS*4))
  572.      latch_state |= d | a;
  573.   } else {
  574.    switch (currentstep/(MICROSTEPS/2)) {
  575.    case 0:
  576.      latch_state |= a; // energize coil 1 only
  577.      break;
  578.    case 1:
  579.      latch_state |= a | b; // energize coil 1+2
  580.      break;
  581.    case 2:
  582.      latch_state |= b; // energize coil 2 only
  583.      break;
  584.    case 3:
  585.      latch_state |= b | c; // energize coil 2+3
  586.      break;
  587.    case 4:
  588.      latch_state |= c; // energize coil 3 only
  589.      break;
  590.    case 5:
  591.      latch_state |= c | d; // energize coil 3+4
  592.      break;
  593.    case 6:
  594.      latch_state |= d; // energize coil 4 only
  595.      break;
  596.    case 7:
  597.      latch_state |= d | a; // energize coil 1+4
  598.      break;
  599.    }
  600.   }


  601.   MC.latch_tx();
  602.   return currentstep;
  603. }
复制代码



47#
ID:513258发表于 2020-11-13 09:51|只看该作者
补充实验

  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百七十:L293D四路电机驱动板 motor control shield 马达板
  4.   Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

  5.   1、安装库:IDE—工具—管理库—搜索“Servo”—安装
  6.   2、实验之八:测试M1M2电机
  7. */

  8. #include< AFMotor.h>

  9. AF_DCMotor motor1(1);
  10. AF_DCMotor motor2(2);

  11. void setup() {
  12.   Serial.begin(9600);
  13.   Serial.println("测试M1M2电机!");

  14.   // turn on motor
  15.   motor1.setSpeed(200);
  16.   motor2.setSpeed(200);

  17.   motor1.run(RELEASE);
  18.   motor2.run(RELEASE);
  19. }

  20. void loop() {
  21.   uint8_t i;

  22.   Serial.println("正转");

  23.   motor1.run(FORWARD);
  24.   motor2.run(FORWARD);
  25.   for (i = 0; i< 255; i++) {
  26.    motor1.setSpeed(i);
  27.    motor2.setSpeed(i);
  28.    delay(10);
  29.   }

  30.   for (i = 255; i != 0; i--) {
  31.    motor1.setSpeed(i);
  32.    motor2.setSpeed(i);
  33.    delay(10);
  34.   }

  35.   Serial.println("反转");

  36.   motor1.run(BACKWARD);
  37.   motor2.run(BACKWARD);

  38.   for (i = 0; i< 255; i++) {
  39.    motor1.setSpeed(i);
  40.    motor2.setSpeed(i);
  41.    delay(10);
  42.   }

  43.   for (i = 255; i != 0; i--) {
  44.    motor1.setSpeed(i);
  45.    motor2.setSpeed(i);
  46.    delay(10);
  47.   }

  48.   Serial.println("断电一秒");
  49.   motor1.run(RELEASE);
  50.   motor2.run(RELEASE);
  51.   delay(1000);
  52. }
复制代码



48#
ID:513258发表于 2020-11-13 10:40|只看该作者

49#
ID:513258发表于 2020-11-13 11:01|只看该作者
太极创客团队制作的B站视频,相当不错的视频教程

B站太极创客官方站:https://space.bilibili.com/10358 ... _765f7570696e666f.2





50#
ID:513258发表于 2020-11-13 11:05|只看该作者
Arduino AFMotor电机扩展板(上)
https://www.bilibili.com/video/BV1vb411q7xz?p=1

Arduino AFMotor电机扩展板(下)
https://www.bilibili.com/video/BV1vb411q7xz?p=2
51#
ID:513258发表于 2020-11-13 13:22|只看该作者
AFMotor电机驱动扩展板使用图形编程
【mind+用户库】第三方库方案

先下载安装Mind+(目前版本V1.6.5 RC3.0)
链接(自行替换.):mindplus点cc/download.html





52#
ID:513258发表于 2020-11-13 13:38|只看该作者
打开Mind+,进入“扩展”



53#
ID:513258发表于 2020-11-13 13:42|只看该作者
进入“用户库”



54#
ID:513258发表于 2020-11-13 13:45|只看该作者
在用户库中搜索“hockel”即可



55#
ID:513258发表于 2020-11-13 13:48|只看该作者
添加的 AFMotor模块



56#
ID:513258发表于 2020-11-13 14:04|只看该作者
AFMotor电机驱动扩展板积木列表



57#
ID:513258发表于 2020-11-13 16:54|只看该作者
用图形编程驱动四只直流电机



58#
ID:513258发表于 2020-11-13 16:55|只看该作者

59#
ID:513258发表于 2020-11-13 17:38|只看该作者
  1. /*
  2.   【Arduino】168种传感器模块系列实验(资料+代码+图形+仿真)
  3.   实验一百七十:L293D四路电机驱动板 motor control shield 马达板
  4.   Adafruit Motor Shield模块 Arduino AFMotor 电机扩展板

  5.   1、安装库:百度搜索“AFMotor库”— 下载 — 拷贝到Arduino-libraries 文件夹中
  6.   2、实验之九:测试M1M2M3M4电机前进与后退
  7. */

  8. #include< AFMotor.h>

  9. // 创建对象
  10. AF_DCMotor motor1(1);
  11. AF_DCMotor motor2(2);
  12. AF_DCMotor motor3(3);
  13. AF_DCMotor motor4(4);


  14. // 主程序开始
  15. void setup() {

  16. }
  17. void loop() {
  18.   motor1.setSpeed(200);
  19.   motor1.run(FORWARD);
  20.   motor2.setSpeed(200);
  21.   motor2.run(FORWARD);
  22.   motor3.setSpeed(200);
  23.   motor3.run(FORWARD);
  24.   motor4.setSpeed(200);
  25.   motor4.run(FORWARD);
  26.   delay(2000);
  27.   
  28.   motor1.setSpeed(0);
  29.   motor1.run(RELEASE);
  30.   motor2.setSpeed(0);
  31.   motor2.run(RELEASE);
  32.   motor3.setSpeed(0);
  33.   motor3.run(RELEASE);
  34.   motor4.setSpeed(0);
  35.   motor4.run(RELEASE);
  36.   delay(1000);
  37.   
  38.   motor1.setSpeed(200);
  39.   motor1.run(BACKWARD);
  40.   motor2.setSpeed(200);
  41.   motor2.run(BACKWARD);
  42.   motor3.setSpeed(200);
  43.   motor3.run(BACKWARD);
  44.   motor4.setSpeed(200);
  45.   motor4.run(BACKWARD);
  46.   delay(2000);
  47.   
  48.   motor1.setSpeed(0);
  49.   motor1.run(RELEASE);
  50.   motor2.setSpeed(0);
  51.   motor2.run(RELEASE);
  52.   motor3.setSpeed(0);
  53.   motor3.run(RELEASE);
  54.   motor4.setSpeed(0);
  55.   motor4.run(RELEASE);
  56.   delay(1000);
  57. }
复制代码


60#
ID:513258发表于 2020-12-29 20:38|只看该作者

实验开源仿真编程(linkboy V4.1)



61#
ID:513258发表于 2020-12-30 17:06|只看该作者
用这款电机驱动扩展板做了一辆麦克纳姆轮小车






62#
ID:513258发表于 2020-12-30 18:04|只看该作者
麦克纳姆轮车子运动模式图





63#
ID:513258发表于 2020-12-30 18:06|只看该作者
实验仿真编程(linkboy V4.1)之二




64#
ID:513258发表于 2020-12-30 18:16|只看该作者
使用
AFMotor电机扩展板的麦克纳姆轮小车(视频)



https://v.youku.com/v_show/id_XNTAzNDYyMzE1Mg==.html?spm=a2hzp.8253869.0.0





手机版|小黑屋|51黑电子论坛|51黑电子论坛6群QQ管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网