Copiando códigos he conseguido que un motor paso a paso (descarte impresora), manejado a través de un Arduino Uno y un EasyDriver mostrara en una LCD 20x4 los cambios de velocidad efectuados por un potenciómetro cómo así el sentido de rotación (o parada) activado por interruptores. Cómo soy lego en estas lides quisiera saber si es perfectible para hacerlo más preciso y/o eficiente. Desde ya muchas gracias. He puesto un video en YouTube.
// Modificación de código para agregar LCD 20x4 display (controlado por I2C) del
// Example5 code for Brian Schmalz's Easy Driver Example
// http://www.schmalzhaus.com/EasyDriver/EasyDriverExamples.html
// Stepper motor: unipolar Sanyo 103-546 as bipolar 1,8 deg/step (200 steps 1 rev)(from old printer)
// CAP 20/11/2018
#include <AccelStepper.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); // Set the LCD I2C address
// Define the stepper and the pins it will use
AccelStepper stepper1(AccelStepper::DRIVER, 9, 8);
// Define our three input button pins
#define LEFT_PIN 4
#define STOP_PIN 3
#define RIGHT_PIN 2
// Define our analog pot input pin
#define SPEED_PIN 0
// Define our maximum and minimum speed in steps per second (scale pot to these)
#define MAX_SPEED 1600 // to be modified in function of stepper kind
#define MIN_SPEED 0.1
void setup() {
// The only AccelStepper value we have to set here is the max speeed, which is higher than we'll ever go
stepper1.setMaxSpeed(10000.0);
// Set up the three button inputs, with pullups
pinMode(LEFT_PIN, INPUT_PULLUP);
pinMode(STOP_PIN, INPUT_PULLUP);
pinMode(RIGHT_PIN, INPUT_PULLUP);
lcd.begin(20,4); //initialize the lcd
lcd.clear();
lcd.setCursor(3, 0); // Move the cursor to 4th position on 1st line
lcd.print(" Sanyo 180");
lcd.setCursor(0, 1); // Move the cursor to 1th position on 2nd line
lcd.print("Rot:");
lcd.setCursor(0, 2); // Move the cursor to 1th position on 3rd line
lcd.print("Speed RPM:");
lcd.setCursor(15,3); // Move the cursor to 16th position on 4th line
lcd.print("CAP"); // as usual myself
}
void loop() {
static float current_speed = 0.0; // Holds current motor speed in steps/second
static int analog_read_counter = 1000; // Counts down to 0 to fire analog read
static char sign = 0; // Holds -1, 1 or 0 to turn the motor on/off and control direction
static int analog_value = 0; // Holds raw analog value.
// If a switch is pushed down (low), set the sign value appropriately
if (digitalRead(LEFT_PIN) == 0) {
sign = 1;
lcd.setCursor(7, 1); // Move the cursor to 6th position on 2nd line
lcd.print("<<CCW<<"); // Print CW direction
}
else if (digitalRead(RIGHT_PIN) == 0) {
sign = -1;
lcd.setCursor(7, 1); // Move the cursor to 6th position on 2nd line
lcd.print(">>>CW>>"); // Print CW direction
}
else if (digitalRead(STOP_PIN) == 0) {
sign = 0;
lcd.setCursor(7, 1); // Move the cursor to 6th position on 2nd line
lcd.print("Stopped"); // Print Stopped
}
// We only want to read the pot every so often (because it takes a long time we don't
// want to do it every time through the main loop).
if (analog_read_counter > 0) {
analog_read_counter--;
}
else {
analog_read_counter = 3000;
// Now read the pot (from 0 to 1023)
analog_value = analogRead(SPEED_PIN);
// Give the stepper a chance to step if it needs to
stepper1.runSpeed();
// And scale the pot's value from min to max speeds
current_speed = sign * (((analog_value/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED);
// Update the stepper to run at this new speed
stepper1.setSpeed(current_speed);
float velo = (current_speed/20*6); // value '20' to be modified by stepper kind (steps seconds for 1 rev x 60")
lcd.setCursor(12, 2);
lcd.print(String(velo,0)+" ");
}
// This will run the stepper at a constant speed
stepper1.runSpeed();
}


