Hola a todos.
Hace tiempo que no posteo nada aquí, pero ahora me he animado dado que he logrado hacer funcionar el código para un pequeño proyecto que tengo. Básicamente se trata de controlar un stepper 28byj usando una pantalla Nextion como interface de control. El objetivo final es usarlo para un Startracker, una aplicación del montaje en astronomía y astrofotografía.
Al proyecto aún le falta la prueba en terreno, ya que me faltan algunas partes para el montaje, pero el control del motor ya se logra. Solo faltaría afinar en el campo las velocidades necesarias para su correcta aplicación.
Me he inspirado en un código que encontré para hacer lo mismo a través de una pantalla lcd.
Proyecto en Instructables
Os dejo el código tanto para arduino como para Nextion.
Espero que podais aportar ideas para mejorarlo, ya que seguro he cometido algunos desaciertos que un usuario más avanzado de arduino podrá encontrar. pero como dije, el código funciona.
Código para arduino:
/*
* Control de steppper por arduino usando netion como interfaz de control
*/
# include "Nextion.h"
# include <AccelStepper.h>
#define HALFSTEP 8
#define motorPin1 A1 // IN1 on the ULN2003 driver 1
#define motorPin2 A2 // IN2 on the ULN2003 driver 1
#define motorPin3 A3 // IN3 on the ULN2003 driver 1
#define motorPin4 A4 // IN4 on the ULN2003 driver 1
int speeds = 271;
int maxspeed = 1000;
int minspeed = 1;
int number;
int Runmotor;
int SpeedType;
int Dirmotor;
AccelStepper stepper(HALFSTEP, motorPin1, motorPin3, motorPin2, motorPin4);
//[page id:X,component id:X, component name: "XXX"]
NexNumber numberbox = NexNumber(0, 2, "n0");
NexButton b0 = NexButton(0, 4, "b0");
NexButton b1 = NexButton(0, 5, "b1");
NexButton b2 = NexButton(0, 6, "b2");
NexButton b3 = NexButton(0, 7, "b3");
NexButton b4 = NexButton(0, 8, "b4");
NexButton bt0 = NexButton(0, 9, "bt0");
NexButton bt1 = NexButton(0, 10, "bt1");
NexButton bt2 = NexButton(0, 13, "bt2");
char buffer[100] = {0};
NexTouch *nex_listen_list[] =
{
&b0,
&b1,
&b2,
&b3,
&b4,
&bt0,
&bt1,
&bt2,
NULL
};
// Void para el boton b0. Aumenta la velocidad del motor en 1.
void b0PopCallback(void *ptr)
{
uint32_t number;
numberbox.getValue(&number);
number++;
if (number>=1000){
number=maxspeed;
}
else if (speeds>=1){
speeds=number;
}
else if (speeds<0){
speeds=number;
speeds=speeds*-1;
}
numberbox.setValue(number);
}
// Void para el boton b1. Reduce la velocidad del motor en 1.
void b1PopCallback(void *ptr)
{
uint32_t number;
numberbox.getValue(&number);
number--;
if (number<1){
number=minspeed;
}
else if (speeds>=1){
speeds=number;
}
else if (speeds<0){
speeds=number;
speeds=speeds*-1;
}
numberbox.setValue(number);
}
// Void para el boton b2. Aumentala velocidad del motor en 10.
void b2PopCallback(void *ptr)
{
uint32_t number;
numberbox.getValue(&number);
number=number+10;
if (number>=1000){
number=maxspeed;
}
else if (speeds>=1){
speeds=number;
}
else if (speeds<0){
speeds=number;
speeds=speeds*-1;
}
numberbox.setValue(number);
}
// Void para el boton b3. Reduce la velocidad del motor en 10.
void b3PopCallback(void *ptr)
{
uint32_t number;
numberbox.getValue(&number);
number=number-10;
if (number<1 || number>65500){
number=minspeed;
}
else if (speeds>=1){
speeds=number;
}
else if (speeds<0){
speeds=number;
speeds=speeds*-1;
}
numberbox.setValue(number);
}
// Void para el boton b4. Establece-resetea la velocidad a 271.
void b4PopCallback(void *ptr)
{
uint32_t number;
numberbox.getValue(&number);
number=271;
if (speeds>=1){
speeds=number;
}
else if (speeds<0){
speeds=number;
speeds=speeds*-1;
}
numberbox.setValue(number);
}
// Void para el boton bt0. Enciende o apaga el motor controlando la variable Runmotor.
// El encendido o apagado se controla en el Voidloop.
void bt0PopCallback(void *ptr)
{
if (&bt0){
Runmotor=Runmotor+1;
nexLoop(nex_listen_list);
}
}
// Void para el boton bt1. Controla el tipo de seguimiento: Lunar o Solar.
// Los valores establecidos aqui son aleatorios(800,50). Deben establecerse correctamente.
void bt1PopCallback(void *ptr)
{
SpeedType=SpeedType+1;
if (SpeedType==1){
uint32_t number;
numberbox.getValue(&number);
number=800;
if (speeds>=1){
speeds=number;
}
else if (speeds<0){
speeds=number;
speeds=speeds*-1;
}
numberbox.setValue(number);
}
else if (SpeedType>1){
uint32_t number;
numberbox.getValue(&number);
number=50;
if (speeds>=1){
speeds=number;
}
else if (speeds<0){
speeds=number;
speeds=speeds*-1;
}
numberbox.setValue(number);
SpeedType=0;
}
}
// Void para el boton bt2. Establece el sentido de giro del motor.
void bt2PopCallback(void *ptr)
{
if (&bt2) {
Dirmotor=Dirmotor+1;
speeds=speeds*-1;
}
else if (Dirmotor>1) {
speeds=speeds*-1;
Dirmotor=0;
}
nexLoop(nex_listen_list);
}
void setup(void)
{
Serial.begin(9600);
nexInit();
b0.attachPop(b0PopCallback, &b0);
b1.attachPop(b1PopCallback, &b1);
b2.attachPop(b2PopCallback, &b2);
b3.attachPop(b3PopCallback, &b3);
b4.attachPop(b4PopCallback, &b4);
bt0.attachPop(bt0PopCallback, &bt0);
bt1.attachPop(bt1PopCallback, &bt1);
bt2.attachPop(bt2PopCallback, &bt2);
Runmotor=0;
SpeedType=0;
Dirmotor=0;
stepper.setMaxSpeed(maxspeed); //1245
stepper.setSpeed(speeds); //271.6
}
void loop(void)
{
nexLoop(nex_listen_list);
if (Runmotor==1) {
number=speeds;
stepper.setSpeed(speeds);
stepper.runSpeed();
}
else if(Runmotor>1){
Runmotor=0;
stepper.stop();
}
}
Archivo para nextion.
Y aquí algunas imágenes:
De antemano, gracias por sus aportes.