#include <LiquidCrystal_I2C.h>
#include <ErriezSerialTerminal.h>
char newlineChar = '\n';
// Separator character between commands and arguments
char delimiterChar = '_';
// Create serial terminal object
SerialTerminal term(newlineChar, delimiterChar);
LiquidCrystal_I2C lcd(0x27, 20, 4);
int enablePins[4] = {22,23,24,25};
int directionPins[4] = {26,27,28,29};
int stepperPins[4] = {30,31,32,33};
#define swClk 2
#define swDir 3
#define swBtn 4
int xSteps;
int ySteps;
int zSteps;
int eSteps;
void updateLcd()
{
char tmp[20*4];
lcd.clear();
lcd.setCursor(0, 0);
sprintf(tmp, "X:%d,Y:%d,Z:%d,E:%d",xSteps,ySteps,zSteps,eSteps);
lcd.print(tmp);
}
void testStepper(int stepper, int direction, int steps, int stepDelay)
{
digitalWrite(directionPins[stepper], direction);
int infoMathType=0;
if(direction==0)
{
infoMathType=1;
}
else {
infoMathType=-1;
}
for(int step=0; step<steps; step++)
{
switch(stepper)
{
case 0:
xSteps+=infoMathType;
break;
case 1:
ySteps+=infoMathType;
break;
case 2:
zSteps+=infoMathType;
break;
case 3:
eSteps+=infoMathType;
break;
}
digitalWrite(enablePins[stepper], HIGH);
digitalWrite(stepperPins[stepper], HIGH);
delayMicroseconds(stepDelay/2);
digitalWrite(stepperPins[stepper], LOW);
delayMicroseconds(stepDelay/2);
digitalWrite(enablePins[stepper], LOW);
}
}
void message()
{
char *arg;
int x,y;
arg = term.getNext();
x=atoi(arg);
arg = term.getNext();
y=atoi(arg);
arg = term.getNext();
lcd.setCursor(x,y);
lcd.print(arg);
}
void moveMotor()
{
char *arg;
int mot = 0;
int dir = 0;
int steps = 0;
int del = 0;
// Get first argument
arg = term.getNext();
mot=atoi(arg);
arg = term.getNext();
dir=atoi(arg);
arg = term.getNext();
steps=atoi(arg);
arg = term.getNext();
del=atoi(arg);
testStepper(mot, dir, steps, del);
char tmp[1024];
sprintf(tmp, "M%d_D%d_S%d_W%d", mot, dir, steps, del);
Serial.println(tmp);
}
void setup() {
lcd.init();
Serial.begin(115200);
Serial.println(F("COMMAND_LINE:"));
lcd.backlight();
lcd.setCursor(4, 0);
lcd.print("Hello World!");
term.addCommand("step", moveMotor);
term.addCommand("msg", message);
pinMode(swClk, INPUT);
pinMode(swDir, INPUT);
pinMode(swBtn, INPUT);
// put your setup code here, to run once:
for(int pin=0; pin<4; pin++)
{
pinMode(enablePins[pin], OUTPUT);
}
for(int pin=0; pin<4; pin++)
{
pinMode(directionPins[pin], OUTPUT);
}
for(int pin=0; pin<4; pin++)
{
pinMode(stepperPins[pin], OUTPUT);
}
//testStepper(0, 1, 100, 10);
}
void loop() {
// put your main code here, to run repeatedly:
if(digitalRead(swClk) == LOW)
{
testStepper(0, digitalRead(swDir), 1, 1);
updateLcd();
}
term.readSerial();
}
mega:SCL
mega:SDA
mega:AREF
mega:GND.1
mega:13
mega:12
mega:11
mega:10
mega:9
mega:8
mega:7
mega:6
mega:5
mega:4
mega:3
mega:2
mega:1
mega:0
mega:14
mega:15
mega:16
mega:17
mega:18
mega:19
mega:20
mega:21
mega:5V.1
mega:5V.2
mega:22
mega:23
mega:24
mega:25
mega:26
mega:27
mega:28
mega:29
mega:30
mega:31
mega:32
mega:33
mega:34
mega:35
mega:36
mega:37
mega:38
mega:39
mega:40
mega:41
mega:42
mega:43
mega:44
mega:45
mega:46
mega:47
mega:48
mega:49
mega:50
mega:51
mega:52
mega:53
mega:GND.4
mega:GND.5
mega:IOREF
mega:RESET
mega:3.3V
mega:5V
mega:GND.2
mega:GND.3
mega:VIN
mega:A0
mega:A1
mega:A2
mega:A3
mega:A4
mega:A5
mega:A6
mega:A7
mega:A8
mega:A9
mega:A10
mega:A11
mega:A12
mega:A13
mega:A14
mega:A15
encoder1:CLK
encoder1:DT
encoder1:SW
encoder1:VCC
encoder1:GND
drv1:ENABLE
drv1:MS1
drv1:MS2
drv1:MS3
drv1:RESET
drv1:SLEEP
drv1:STEP
drv1:DIR
drv1:GND.1
drv1:VDD
drv1:1B
drv1:1A
drv1:2A
drv1:2B
drv1:GND.2
drv1:VMOT
vcc1:VCC
gnd1:GND
stepper1:A-
stepper1:A+
stepper1:B+
stepper1:B-
drv2:ENABLE
drv2:MS1
drv2:MS2
drv2:MS3
drv2:RESET
drv2:SLEEP
drv2:STEP
drv2:DIR
drv2:GND.1
drv2:VDD
drv2:1B
drv2:1A
drv2:2A
drv2:2B
drv2:GND.2
drv2:VMOT
vcc2:VCC
gnd2:GND
stepper2:A-
stepper2:A+
stepper2:B+
stepper2:B-
drv3:ENABLE
drv3:MS1
drv3:MS2
drv3:MS3
drv3:RESET
drv3:SLEEP
drv3:STEP
drv3:DIR
drv3:GND.1
drv3:VDD
drv3:1B
drv3:1A
drv3:2A
drv3:2B
drv3:GND.2
drv3:VMOT
vcc3:VCC
gnd3:GND
stepper3:A-
stepper3:A+
stepper3:B+
stepper3:B-
drv4:ENABLE
drv4:MS1
drv4:MS2
drv4:MS3
drv4:RESET
drv4:SLEEP
drv4:STEP
drv4:DIR
drv4:GND.1
drv4:VDD
drv4:1B
drv4:1A
drv4:2A
drv4:2B
drv4:GND.2
drv4:VMOT
vcc4:VCC
gnd4:GND
stepper4:A-
stepper4:A+
stepper4:B+
stepper4:B-
lcd1:GND
lcd1:VCC
lcd1:SDA
lcd1:SCL
bz1:1
bz1:2
bz2:1
bz2:2
bz3:1
bz3:2
bz4:1
bz4:2
pot1:VCC
pot1:SIG
pot1:GND