/*
Pulse Settings:
1600 Steps(Pulse) per Revolution
*/
#include <Keypad.h>
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { 5, 4, 3, 2 }; // Pins connected to C1, C2, C3, C4
uint8_t rowPins[ROWS] = { 9, 8, 7, 6 }; // Pins connected to R1, R2, R3, R4
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
int dirPin = 10;
int pulsePin = 11;
char key;
int pulse_width = 500; // set pulse width (speed)
unsigned int time = 60; // set rotational time in second (60s = 1m)
unsigned int forward_time_1mm = (time * 1000)/800;
unsigned int forward_time_2mm = (time * 1000)/1600;
unsigned int forward_time_3mm = (time * 1000)/2400;
unsigned int forward_time_10mm = (time * 1000)/8000;
unsigned int forward_time_20mm = (time * 1000)/16000;
unsigned int forward_time_50mm = (time * 1000)/40000;
unsigned int reverse_time_10mm = (time * 1000)/8000;
unsigned int reverse_time_20mm = (time * 1000)/16000;
unsigned int reverse_time_50mm = (time * 1000)/40000;
void setup() {
Serial.begin(9600);
pinMode(dirPin, OUTPUT);
pinMode(pulsePin, OUTPUT);
digitalWrite(dirPin, LOW);
delay(100);
}
void loop() {
key = keypad.getKey();
if (key != NO_KEY) {
Serial.println(key);
switch(key){
case '1':
forwardAt1mm();
break;
case '2':
forwardAt2mm();
break;
case '3':
forwardAt3mm();
break;
case '4':
forwardAt10mm();
break;
case '5':
forwardAt20mm();
break;
case '6':
forwardAt50mm();
break;
case '*':
reverseAt10mm();
break;
case '0':
reverseAt20mm();
break;
case '#':
reverseAt50mm();
break;
default:
// Stop the motor if any other key is pressed
digitalWrite(pulsePin, LOW);
break;
}
}
}
void forwardAt1mm(){
// Move forward at 1 mm/minute
digitalWrite(dirPin, HIGH);
for(int i=0; i<800; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//800 pulses at 60,000 milliseconds
//So, 1 pulse 60000/800 = 75 milliseconds
delay(forward_time_1mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}
void forwardAt2mm(){
// Move forward at 2 mm/minute
digitalWrite(dirPin, HIGH);
for(int i=0; i<1600; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//1600 pulses at 60,000 milliseconds
//So, 1 pulse 60000/1600 = 37.5 milliseconds
delay(forward_time_2mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}
void forwardAt3mm(){
// Move forward at 3 mm/minute
digitalWrite(dirPin, HIGH);
for(int i=0; i<2400; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//2400 pulses at 60,000 milliseconds
//So, 1 pulse 60000/2400 = 25 milliseconds
delay(forward_time_3mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}
void forwardAt10mm(){
// Move forward at 10 mm/minute
digitalWrite(dirPin, HIGH);
for(int i=0; i<8000; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//8000 pulses at 60,000 milliseconds
//So, 1 pulse 60000/8000 = 7.5 milliseconds
delay(forward_time_10mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}
void forwardAt20mm(){
// Move forward at 20 mm/minute
digitalWrite(dirPin, HIGH);
for(int i=0; i<16000; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//16000 pulses at 60,000 milliseconds
//So, 1 pulse 60000/16000 = 3.75 milliseconds
delay(forward_time_20mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}
void forwardAt50mm(){
// Move forward at 50 mm/minute
digitalWrite(dirPin, HIGH);
for(long int i=0; i<40000; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//40000 pulses at 60,000 milliseconds
//So, 1 pulse 60000/40000 = 1.5 milliseconds
delay(forward_time_50mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}
void reverseAt10mm(){
// Move backward at 10 mm/minute
digitalWrite(dirPin, LOW);
for(int i=0; i<8000; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//8000 pulses at 60,000 milliseconds
//So, 1 pulse 60000/8000 = 7.5 milliseconds
delay(reverse_time_10mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}
void reverseAt20mm(){
// Move backward at 20 mm/minute
digitalWrite(dirPin, LOW);
for(int i=0; i<16000; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//16000 pulses at 60,000 milliseconds
//So, 1 pulse 60000/16000 = 3.75 milliseconds
delay(reverse_time_20mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}
void reverseAt50mm(){
// Move backward at 50 mm/minute
digitalWrite(dirPin, LOW);
for(long int i=0; i<40000; i++){
digitalWrite(pulsePin, HIGH);
delayMicroseconds(pulse_width);
digitalWrite(pulsePin, LOW);
//40000 pulses at 60,000 milliseconds
//So, 1 pulse 60000/40000 = 1.5 milliseconds
delay(reverse_time_50mm);
key = keypad.getKey();
if(key != NO_KEY) {
if(key == '1'){
forwardAt1mm();
break;
}
else if(key == '2'){
forwardAt2mm();
break;
}
else if(key == '3'){
forwardAt3mm();
break;
}
else if(key == '4'){
forwardAt10mm();
break;
}
else if(key == '5'){
forwardAt20mm();
break;
}
else if(key == '6'){
forwardAt50mm();
break;
}
else if(key == '*'){
reverseAt10mm();
break;
}
else if(key == '0'){
reverseAt20mm();
break;
}
else if(key == '#'){
reverseAt50mm();
break;
}
else if(key == '7' || key == '8' || key == '9' || key == 'A' || key == 'B' || key == 'C' || key == 'D'){
break;
}
}
}
}