first commit
This commit is contained in:
2
libraries/Motor_Driver_Library/README.md
Executable file
2
libraries/Motor_Driver_Library/README.md
Executable file
@@ -0,0 +1,2 @@
|
||||
# MotorDriver
|
||||
Library for Arduino Motor Driver V1
|
||||
18
libraries/Motor_Driver_Library/examples/basicDriver/basicDriver.ino
Executable file
18
libraries/Motor_Driver_Library/examples/basicDriver/basicDriver.ino
Executable file
@@ -0,0 +1,18 @@
|
||||
#include <MotorDriver.h>
|
||||
|
||||
|
||||
MotorDriver m;
|
||||
|
||||
|
||||
void setup()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void loop()
|
||||
{
|
||||
m.motor(1,FORWARD,255);
|
||||
m.motor(4,FORWARD,255);
|
||||
|
||||
}
|
||||
0
libraries/Motor_Driver_Library/keywords.txt
Executable file
0
libraries/Motor_Driver_Library/keywords.txt
Executable file
10
libraries/Motor_Driver_Library/library.properties
Executable file
10
libraries/Motor_Driver_Library/library.properties
Executable file
@@ -0,0 +1,10 @@
|
||||
name=Motor Driver Library
|
||||
version= 1.0.0
|
||||
author= CuriosityGym <explore@curiositygym.com>
|
||||
maintainer= Rupin <rupin@curiositygym.com>
|
||||
sentence=Motor Driver Library for Arduino Shields with L293D and 74HC595
|
||||
paragraph=Though The Old Adafruit Motor Shield has been discontinued, a lot of Chinese sellers continue to manufacture this Shield at a low cost, and it is a good Shield for running a small robotics class. This library allows you to access and control all motor channels.
|
||||
category=Device Control
|
||||
url=https://github.com/CuriosityGym/motordriver
|
||||
architectures=avr
|
||||
includes=MotorDriver.h
|
||||
195
libraries/Motor_Driver_Library/src/MotorDriver.cpp
Executable file
195
libraries/Motor_Driver_Library/src/MotorDriver.cpp
Executable file
@@ -0,0 +1,195 @@
|
||||
#include "Arduino.h"
|
||||
#include "MotorDriver.h"
|
||||
|
||||
MotorDriver::MotorDriver()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void MotorDriver::motor(int nMotor, int command, int speed)
|
||||
{
|
||||
int motorA, motorB;
|
||||
|
||||
if (nMotor >= 1 && nMotor <= 4)
|
||||
{
|
||||
switch (nMotor)
|
||||
{
|
||||
case 1:
|
||||
motorA = MOTOR1_A;
|
||||
motorB = MOTOR1_B;
|
||||
break;
|
||||
case 2:
|
||||
motorA = MOTOR2_A;
|
||||
motorB = MOTOR2_B;
|
||||
break;
|
||||
case 3:
|
||||
motorA = MOTOR3_A;
|
||||
motorB = MOTOR3_B;
|
||||
break;
|
||||
case 4:
|
||||
motorA = MOTOR4_A;
|
||||
motorB = MOTOR4_B;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
switch (command)
|
||||
{
|
||||
case FORWARD:
|
||||
motor_output (motorA, HIGH, speed);
|
||||
motor_output (motorB, LOW, -1); // -1: no PWM set
|
||||
break;
|
||||
case BACKWARD:
|
||||
motor_output (motorA, LOW, speed);
|
||||
motor_output (motorB, HIGH, -1); // -1: no PWM set
|
||||
break;
|
||||
case BRAKE:
|
||||
// The AdaFruit library didn't implement a brake.
|
||||
// The L293D motor driver ic doesn't have a good
|
||||
// brake anyway.
|
||||
// It uses transistors inside, and not mosfets.
|
||||
// Some use a software break, by using a short
|
||||
// reverse voltage.
|
||||
// This brake will try to brake, by enabling
|
||||
// the output and by pulling both outputs to ground.
|
||||
// But it isn't a good break.
|
||||
motor_output (motorA, LOW, 255); // 255: fully on.
|
||||
motor_output (motorB, LOW, -1); // -1: no PWM set
|
||||
break;
|
||||
case RELEASE:
|
||||
motor_output (motorA, LOW, 0); // 0: output floating.
|
||||
motor_output (motorB, LOW, -1); // -1: no PWM set
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------
|
||||
// motor_output
|
||||
//
|
||||
// The function motor_ouput uses the motor driver to
|
||||
// drive normal outputs like lights, relays, solenoids,
|
||||
// DC motors (but not in reverse).
|
||||
//
|
||||
// It is also used as an internal helper function
|
||||
// for the motor() function.
|
||||
//
|
||||
// The high_low variable should be set 'HIGH'
|
||||
// to drive lights, etc.
|
||||
// It can be set 'LOW', to switch it off,
|
||||
// but also a 'speed' of 0 will switch it off.
|
||||
//
|
||||
// The 'speed' sets the PWM for 0...255, and is for
|
||||
// both pins of the motor output.
|
||||
// For example, if motor 3 side 'A' is used to for a
|
||||
// dimmed light at 50% (speed is 128), also the
|
||||
// motor 3 side 'B' output will be dimmed for 50%.
|
||||
// Set to 0 for completelty off (high impedance).
|
||||
// Set to 255 for fully on.
|
||||
// Special settings for the PWM speed:
|
||||
// Set to -1 for not setting the PWM at all.
|
||||
//
|
||||
void MotorDriver :: motor_output (int output, int high_low, int speed)
|
||||
{
|
||||
int motorPWM;
|
||||
|
||||
switch (output)
|
||||
{
|
||||
case MOTOR1_A:
|
||||
case MOTOR1_B:
|
||||
motorPWM = MOTOR1_PWM;
|
||||
break;
|
||||
case MOTOR2_A:
|
||||
case MOTOR2_B:
|
||||
motorPWM = MOTOR2_PWM;
|
||||
break;
|
||||
case MOTOR3_A:
|
||||
case MOTOR3_B:
|
||||
motorPWM = MOTOR3_PWM;
|
||||
break;
|
||||
case MOTOR4_A:
|
||||
case MOTOR4_B:
|
||||
motorPWM = MOTOR4_PWM;
|
||||
break;
|
||||
default:
|
||||
// Use speed as error flag, -3333 = invalid output.
|
||||
speed = -3333;
|
||||
break;
|
||||
}
|
||||
|
||||
if (speed != -3333)
|
||||
{
|
||||
// Set the direction with the shift register
|
||||
// on the MotorShield, even if the speed = -1.
|
||||
// In that case the direction will be set, but
|
||||
// not the PWM.
|
||||
shiftWrite(output, high_low);
|
||||
|
||||
// set PWM only if it is valid
|
||||
if (speed >= 0 && speed <= 255)
|
||||
{
|
||||
analogWrite(motorPWM, speed);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------
|
||||
// shiftWrite
|
||||
//
|
||||
// The parameters are just like digitalWrite().
|
||||
//
|
||||
// The output is the pin 0...7 (the pin behind
|
||||
// the shift register).
|
||||
// The second parameter is HIGH or LOW.
|
||||
//
|
||||
// There is no initialization function.
|
||||
// Initialization is automatically done at the first
|
||||
// time it is used.
|
||||
//
|
||||
void MotorDriver:: shiftWrite(int output, int high_low)
|
||||
{
|
||||
static int latch_copy;
|
||||
static int shift_register_initialized = false;
|
||||
|
||||
// Do the initialization on the fly,
|
||||
// at the first time it is used.
|
||||
if (!shift_register_initialized)
|
||||
{
|
||||
// Set pins for shift register to output
|
||||
pinMode(MOTORLATCH, OUTPUT);
|
||||
pinMode(MOTORENABLE, OUTPUT);
|
||||
pinMode(MOTORDATA, OUTPUT);
|
||||
pinMode(MOTORCLK, OUTPUT);
|
||||
|
||||
// Set pins for shift register to default value (low);
|
||||
digitalWrite(MOTORDATA, LOW);
|
||||
digitalWrite(MOTORLATCH, LOW);
|
||||
digitalWrite(MOTORCLK, LOW);
|
||||
// Enable the shift register, set Enable pin Low.
|
||||
digitalWrite(MOTORENABLE, LOW);
|
||||
|
||||
// start with all outputs (of the shift register) low
|
||||
latch_copy = 0;
|
||||
|
||||
shift_register_initialized = true;
|
||||
}
|
||||
|
||||
// The defines HIGH and LOW are 1 and 0.
|
||||
// So this is valid.
|
||||
bitWrite(latch_copy, output, high_low);
|
||||
|
||||
// Use the default Arduino 'shiftOut()' function to
|
||||
// shift the bits with the MOTORCLK as clock pulse.
|
||||
// The 74HC595 shiftregister wants the MSB first.
|
||||
// After that, generate a latch pulse with MOTORLATCH.
|
||||
shiftOut(MOTORDATA, MOTORCLK, MSBFIRST, latch_copy);
|
||||
delayMicroseconds(5); // For safety, not really needed.
|
||||
digitalWrite(MOTORLATCH, HIGH);
|
||||
delayMicroseconds(5); // For safety, not really needed.
|
||||
digitalWrite(MOTORLATCH, LOW);
|
||||
}
|
||||
56
libraries/Motor_Driver_Library/src/MotorDriver.h
Executable file
56
libraries/Motor_Driver_Library/src/MotorDriver.h
Executable file
@@ -0,0 +1,56 @@
|
||||
|
||||
#include "Arduino.h"
|
||||
|
||||
#ifndef MotorDriver_h
|
||||
|
||||
#define MotorDriver_h
|
||||
#define MOTORLATCH 12
|
||||
#define MOTORCLK 4
|
||||
#define MOTORENABLE 7
|
||||
#define MOTORDATA 8
|
||||
|
||||
// 8-bit bus after the 74HC595 shift register
|
||||
// (not Arduino pins)
|
||||
// These are used to set the direction of the bridge driver.
|
||||
#define MOTOR1_A 2
|
||||
#define MOTOR1_B 3
|
||||
#define MOTOR2_A 1
|
||||
#define MOTOR2_B 4
|
||||
#define MOTOR3_A 5
|
||||
#define MOTOR3_B 7
|
||||
#define MOTOR4_A 0
|
||||
#define MOTOR4_B 6
|
||||
|
||||
// Arduino pins for the PWM signals.
|
||||
#define MOTOR1_PWM 11
|
||||
#define MOTOR2_PWM 3
|
||||
#define MOTOR3_PWM 6
|
||||
#define MOTOR4_PWM 5
|
||||
#define SERVO1_PWM 10
|
||||
#define SERVO2_PWM 9
|
||||
|
||||
// Codes for the motor function.
|
||||
#define FORWARD 1
|
||||
#define BACKWARD 2
|
||||
#define BRAKE 3
|
||||
#define RELEASE 4
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class MotorDriver
|
||||
{
|
||||
|
||||
public:
|
||||
MotorDriver();
|
||||
void motor(int nMotor, int command, int speed);
|
||||
private:
|
||||
void shiftWrite(int output, int high_low);
|
||||
void motor_output (int output, int high_low, int speed);
|
||||
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
Reference in New Issue
Block a user