Wheel Motor

Aus www.wiki.ardumower.de
Wechseln zu: Navigation, Suche

Wheel motors caracteristics & driver

The two left and right gear motors are controlled independently (aka 'differential driving') to:

  • drive the robot forward/backward
  • steer the robot left/right

The Ardumower wheel motor features:

  • A rotation speed up to 31 rpm allows to move the robot at sufficient speed (at up to meter/sec = 31rpm/60 * PI * 0.25m = 0.4m/sec using 250mm diameter wheels)
  • A high torque (2.45Nm) guarantees that the robot can climb small hills as well (with 2 motors, 0.125 radius wheel, 31rpm = 0.4m/s, acceleration = 0.2 ( 1/2 of nomeinal speed) up to 14 degree) see calculator
  • Integrated encoders, so it can measure the rotation speed, the distance and the direction (see Odometry for more information) - Encoders are REQUIRED for Ardumower software.
  • 24V (load current ~1A)

Wiring

One pin controls the direction (forward/backward), the other pin controls the speed. One analog input pin is connected to the current sensor. The current sensor module (ACS712-05A) is connected in series with the motor.

Protector board is adviced to be used between controler and motor.

Control principal : PWM frequency

The speed of the motor is controlled by a PWM duty signal. We use the Arduino default PWM frequency (490 Hz) to control the motor drivers.

Motor controller (PID)

The speed of the motors is controlled by a software PID controller. You can monitor the quality of the motor speed control via pfodApp (Plot->Motor control):

Programming

Motor variable

   // --------- wheel motor state ----------------------------
   // wheel motor speed ( <0 backward, >0 forward); range -motorSpeedMaxRpm..motorSpeedMaxRpm
   float motorAccel  ;  // motor wheel acceleration (warning: do not set too high)
   int motorSpeedMaxRpm   ;   // motor wheel max RPM
   int motorSpeedMaxPwm  ;  // motor wheel max Pwm  (8-bit PWM=255, 10-bit PWM=1023)
   float motorPowerMax   ;    // motor wheel max power (Watt)
   PID motorLeftPID;              // motor left wheel PID controller
   PID motorRightPID;              // motor right wheel PID controller
   float motorSenseRightScale ; // motor right sense scale (mA=(ADC-zero)/scale)
   float motorSenseLeftScale ; // motor left sense scale  (mA=(ADC-zero)/scale)
   int motorRollTimeMax ;  // max. roll time (ms)
   int motorRollTimeMin  ; // min. roll time (ms)
   int motorReverseTime ;  // max. reverse time (ms)
   long motorForwTimeMax; // max. forward time (ms) / timeout
   float motorBiDirSpeedRatio1 ;   // bidir mow pattern speed ratio 1
   float motorBiDirSpeedRatio2 ;   // bidir mow pattern speed ratio 2
   bool motorRightSwapDir     ;    // inverse right motor direction? 
   bool motorLeftSwapDir      ;    // inverse left motor direction?  
   int motorLeftSpeedRpmSet ; // set speed
   int motorRightSpeedRpmSet ;
   float motorLeftPWMCurr ; // current speed
   float motorRightPWMCurr ;
   int motorRightSenseADC ;
   int motorLeftSenseADC ;
   float motorLeftSenseCurrent ;     
   float motorRightSenseCurrent ;
   float motorLeftSense ;      // motor power (range 0..MAX_MOTOR_POWER)
   float motorRightSense ;
   int motorPowerIgnoreTime; 
   int motorZeroSettleTime;     // how long (ms) to wait for motor to settle at zero speed
   int motorLeftSenseCounter ;  // motor current counter
   int motorRightSenseCounter ;
   unsigned long nextTimeMotorSense ;
   unsigned long lastSetMotorSpeedTime;
   unsigned long motorLeftZeroTimeout;
   unsigned long motorRightZeroTimeout;
   boolean rotateLeft;
   unsigned long nextTimeRotationChange;