[SOLUCIONADO] problema con arduino, c# y motor stepper

Hola, soy nuevo en el foro.

Tengo que crear una interfaz por la que envie los datos de habilitar el motor e introducirle la velocidad, los grados que girara y el sentido de giro, ya sea izquierda o derecha. La velocidad y los grados los indico con dos scrolls bars y habilitar el motor y el sentido de giro con botones.
Una vez introducido todo esto pulso el botón enviar para mandarle esos datos al arduino.

Bien, mi problema esta aqui. No se como mandar todos los datos a la vez ni como recibirlos en arduino e interpretarlos.

public partial class Form1 : Form
    {
        bool estadoLed = false;
        public Form1()
        {
            InitializeComponent();
        }
        string[] datos = new string[3];
        //List<string> datos = new List<string>(3);
        private void botonLed_Click(object sender, EventArgs e)
        {
            estadomotor = !estadomotor;
            if (estadoLed == true)
            {
                label.Text = "ON";
                //serialPort.Write("1");
                datos[0] = "1";
            }
            else
            {
                label.Text = "OFF";
                //serialPort.Write("0");
                datos[0] = "0";
            }
            // estadomotor = (!estadomotor == true) ? datos[0]=("1") : datos[0]=("0");
            //(estadomotor == true) ? label.Text = "ON" : label.Text = "OFF";
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }

        private void VelocidadMotor_Scroll(object sender, EventArgs e)
        {
            textBox.Text = VelocidadMotor.Value.ToString();
        }

        private void label1_Click(object sender, EventArgs e)
        {

        }

        private void botonEnviar_Click(object sender, EventArgs e)
        {

        }

        private void botonAbrirPuerto_Click(object sender, EventArgs e)
        {
            serialPort.Open();
            labelEstadoCOM.Text = "Puerto Abierto";
        }

        private void botonCerrarPuerto_Click(object sender, EventArgs e)
        {
            serialPort.Close();
            labelEstadoCOM.Text = "Puerto Cerrado";
        }

        private void textBox1_TextChanged_1(object sender, EventArgs e)
        {

        }

        private void label_Click(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            //serialPort.Write("I");
            //d = "I";
            //RotarIzquierda.Enabled = false;
            //RotarDerecha.Enabled = true;
            //pictureBox1.Visible = true;
            //pictureBox2.Visible = false;
            datos[1] = ("I");

            RotarIzquierda.Enabled = true;
            pictureBox1.Visible = false;
            pictureBox2.Visible = true;

        }


        private void Rotar1_Click(object sender, EventArgs e)
        {

        }

        private void pictureBox1_Click(object sender, EventArgs e)
        {

        }

        private void RotarDerecha_Click(object sender, EventArgs e)
        {
            //serialPort.Write("D");
            //d = "D";
            //RotarIzquierda.Enabled = true;
            // RotarDerecha.Enabled=false;
            //pictureBox1.Visible = false;
            //pictureBox2.Visible = true;
            datos[1] = "D";

            RotarDerecha.Enabled = true;
            pictureBox1.Visible = false;
            pictureBox2.Visible = true;
        }

        private void Rotacion_Scroll(object sender, EventArgs e)
        {
            textBox1.Text = Rotacion.Value.ToString();
        }

        private void Reset_Click(object sender, EventArgs e)
        {
            textBox1.Text = "0";
        }

        private void button1_Click_1(object sender, EventArgs e)
        {
            // string n = "";
            //int t = 0;
            //t = Convert.ToInt16(textBox1.Text);
            //if (t > 0)
            //{
            //  if (t < 10)
            //{
            //  n = "00" + t;
            //}
            //else if( t >=10 && t < 100)
            //{
            //  n = "0" + t;
            //}
            //else
            //{
            //  n = Convert.ToString(t);
            //}
            //}
            //serialPort.Write(n);

            //string m = "";
            //int k = 0;
            //k = Convert.ToInt16(textBox.Text);
            //if (k > 0)
            //{
            //  if (k< 10)
            //{
            //  m = "00" + t;
            //}
            //else if (k >= 10 && k < 100)
            //{
            //  m = "0" + k;
            //}
            //else
            //{
            //  m= Convert.ToString(k);
            //}
            //}

            //serialPort.Write(m);
            //string s =w+":" +d+":"+n +":"+ m;
            //serialPort.WriteLine(w);
            //serialPort.WriteLine(d);
            //serialPort.WriteLine(n);
            //serialPort.WriteLine(m);

            /////////////////////////////////////////

            //Lectura de datos del panel
            //String panel_input = Textbox.textbox;
            int velocity = 0;
            velocity = Convert.ToInt32(textBox1.Text);
            int degree = 0;
            degree = Convert.ToInt32(textBox.Text);
            //Control de flujo
            if (velocity >= 10 && velocity <= 100)
            {
                datos[2] = ("0" + velocity);
            }
            else if(velocity<10)
            {
                datos[2] = ("00" + velocity);
            }
            else
            {
                datos[2] = Convert.ToString(velocity);
            }
           

            if (degree >= 10 && degree <= 100)
            {
                datos[3] = ("0" + degree);
            }
            else if(degree<10)
            {
                datos[3] = ("00" + degree);
            }
            else
            {
                datos[3] = Convert.ToString(degree);
            }
           
        

        //Envío de datos
        //serialPort
                serialPort.WriteLine(datos[0]);
                serialPort.WriteLine(datos[1]);
                serialPort.WriteLine(datos[2]);
                serialPort.WriteLine(datos[3]);
        }
    }
}

este es el codigo escrito en visual studio que he hecho. Las partes que estan con comentarios es codigo que ya he intentado y no ha funcionado, lo mando por si alguien lo ve mejor asi, pero si es mas lio lo quito.

aqui el codigo de arduino que tengo

int steps = 9;       // pin step 9
int direccion = 8;   // pin direccion 8
int x;

int datos [3];
void setup(){
  Serial.begin(9600);
  pinMode(steps, OUTPUT); 
  pinMode(direccion, OUTPUT); 
}

void loop(){
 // List<String> datos = new List<String>();
  while(Serial.available()>0){
   datos[0]=Serial.read();
   datos[1]=Serial.read();
   datos[2]=Serial.read();
   datos[3]=Serial.read();

  int hab=datos[0];
  int giro=datos[1];
  int vel=datos[2];
  int stp=datos[3];
   
     if(hab=='1'){

    
   // int c=Serial.read();
    if(giro=='I'){
      
     for(x=0;x<=stp;x++){
      digitalWrite(direccion,HIGH);
      digitalWrite(steps,HIGH);
      delayMicroseconds(500);
      digitalWrite(steps,LOW);
      delayMicroseconds(vel*10);
     }
  
    }
    else if(hab=='D'){
      for(x=0;x<=stp;x++){
       
      digitalWrite(direccion,LOW);
      digitalWrite(steps,HIGH);
      delayMicroseconds(500);
      digitalWrite(steps,LOW);
      delayMicroseconds(vel*10);
  
     }
   }
  }
  
  delay(1000);
 
 }

}

el motor lo controlo con un drv8825

muchas gracias a todo aquel que me intente echar una mano.
Como se puede apreciar soy novato en esto de arduino y c#.
Si algo no se entiende bien preguntarme o indicarme que debo cambiar en este post.

Hola:

Te dejo documentación que he hecho con C# y Arduino que puedes ver aquí.

[TUTORIAL] Encender y apagar un Led con Arduino y Visual Studio.

[TUTORIAL] Lecturas de entradas digitales con Arduino y Visual Studio .net.

Lo que buscas sobre leer datos al puerto serie a la vez con C#, puse ejemplos claros sobre este lenguaje y Arduino.

¿Alguna otra pregunta?

Ni estoy por encima de ti, ni estás por encima de mi, simplemente, te acompaño. Tengo ganas de seguirte, como dice Jack el destripador: Vayamos por parte.

Preparo Visual Studio y hago la interfaz desde cero.

Hay cosas como estas que haz puesto, que no es necesario.

    string[] datos = new string[3];
        //List<string> datos = new List<string>(3);

Especifíca el tipo de motor que usas, motor dc universal, motor PAP, servomotor. Como dice que quieres que indique los grados, no se que pensar. Hasta hice una prueba con un servo.

Te pongo un ejemplo.
Captura.PNG

Código C#:

using System;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports; // No olvidar.
using System.Drawing;
using System.Drawing.Drawing2D;

namespace ServoArduino_01_cs
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button_0_Click(object sender, EventArgs e)
        {
            int pasos_0;
            int.TryParse(button_0.Tag.ToString(), out pasos_0);
            trackBar1.Value = pasos_0;
        }

        private void button_45_Click(object sender, EventArgs e)
        {
            int pasos_45;
            int.TryParse(button_45.Tag.ToString(), out pasos_45);
            trackBar1.Value = pasos_45;
        }

        private void button_90_Click(object sender, EventArgs e)
        {
            int pasos_90;
            int.TryParse(button_90.Tag.ToString(), out pasos_90);
            trackBar1.Value = pasos_90;
        }

        private void button_135_Click(object sender, EventArgs e)
        {
            int pasos_135;
            int.TryParse(button_135.Tag.ToString(), out pasos_135);
            trackBar1.Value = pasos_135;
        }

        private void button_180_Click(object sender, EventArgs e)
        {
            int pasos_180;
            int.TryParse(button_180.Tag.ToString(), out pasos_180);
            trackBar1.Value = pasos_180;
        }

        #region Conectar puerto.
        private void Form1_Load(object sender, EventArgs e)
        {
            button_0.Tag = 0;
            button_45.Tag = 45;
            button_90.Tag = 90;
            button_135.Tag = 135;
            button_180.Tag = 180;

            // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
            try
            {
                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
            }

            catch
            {
                MessageBox.Show("No encuentra ningún puerto físico ni virtual.", "Aviso:",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }

            // Añado los puertos disponible en el PC con SerialPort.GetPortNames() al comboBox_Puerto.
            comboBox_Puerto.DataSource = SerialPort.GetPortNames();

            // // Añade puertos disponibles físicos  y virtuales.
            serialPort1.PortName = comboBox_Puerto.Text.ToString();
        }

        // Detecta USB o puerto serie virtual cuando lo conecta y desconecta del cable.
        protected override void WndProc(ref Message USB)
        {
            if (USB.Msg == 0x219)
            {
                comboBox_Puerto.DataSource = SerialPort.GetPortNames();
            }

            base.WndProc(ref USB); // Detecta si hay cambios en el usb y si los hay los refleja.
        }

        private void button_Conectar_Click(object sender, EventArgs e)
        {
            try
            {
                serialPort1.PortName = comboBox_Puerto.Text.ToString(); // Puerto seleccionado previamente.
                serialPort1.Open(); // Abrir puerto.
                comboBox_Puerto.Enabled = false;
                button_Conectar.Enabled = false;
                button_Desconectar.Enabled = true;
                // Botones grados.
                button_0.Enabled = true;
                button_45.Enabled = true;
                button_90.Enabled = true;
                button_135.Enabled = true;
                button_180.Enabled = true;
                trackBar1.Enabled = true;
                progressBar1.Enabled = true;
            }

            catch
            {
                MessageBox.Show("El puerto no existe.", "Aviso:",
                MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void button_Desconectar_Click(object sender, EventArgs e)
        {
            serialPort1.Close(); // Cerrar puerto.
            comboBox_Puerto.Enabled = true;
            button_Conectar.Enabled = true;
            button_Desconectar.Enabled = false;
            // Botones grados.
            button_0.Enabled = false;
            button_45.Enabled = false;
            button_90.Enabled = false;
            button_135.Enabled = false;
            button_180.Enabled = false;
            trackBar1.Enabled = false;
            progressBar1.Enabled = false;
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (serialPort1.IsOpen) // ¿El puerto está abierto?
            {
                serialPort1.Close(); // Cerrar puerto.
            }
        }
        #endregion

        private void trackBar1_ValueChanged(object sender, EventArgs e)
        {
            string valor = trackBar1.Value.ToString();
            byte[] mBuffer = Encoding.ASCII.GetBytes(valor);
            serialPort1.Write(mBuffer, 0, mBuffer.Length);
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            // Crear brocha sólida.
            SolidBrush fondoNegro = new SolidBrush(Color.Black);

            // Crear localización y tamaño del eclipse.
            int x = 0;
            int y = 0;
            int anchura = 100;
            int altura = 100;

            // Dibujamos un círculo negro.
            e.Graphics.FillEllipse(fondoNegro, x, y, anchura, altura);

            Pen pen = new Pen(Color.Gray, 8);
            pen.StartCap = LineCap.ArrowAnchor;
            pen.EndCap = LineCap.RoundAnchor;
            e.Graphics.DrawLine(pen, 50, 0, 50, 50);
        }
    }
}

Código Arduino:

#include <Servo.h>
//Creamos una variable servo para poder usar las funciones con ella.
Servo miservo;
int valor = 0;
int angulo;
int x;

void setup()
{
  Serial.begin(115200); // Velocidad en baudios y configuraciçon de inicio.
  //Definimos el pin al que ira conectado el servo.
  miservo.attach(6); Como salida, el pin 6 con uso de PWM.
  //Movemos el servo al centro
  miservo.write(90);  // Coloca el servo en su posición central.
}
void loop() {


  if (Serial.available() > 0) // Espera entrada de datos de 0 a 180.
  {
    valor = Serial.read(); // Los datos leidos se almacena en la variable valor.
    if (valor > 0)
    {
      x = valor;
    }
  }
  else if ((x >= 0) && (x <= 180))
  {
    angulo = x;
    miservo.write(angulo); // Envía los comando finales de 0 a 180 al servo.
  }



  /*
    long angulo;
    if (Serial.available() > 0)
    {
      angulo = Serial.parseInt();
      if ((angulo >= 0) && (angulo <= 180))
      {
        miservo.write(angulo);
        delay(15);
      }
    }
  */
}

Saludos.

PD: A la próxima pon una captura del programa C# que haz hecho para tener mejor idea.

Captura.PNG

Hola, muchisimas gracias por contestar! mañana mismo pongo una captura del programa que he diseñado, pero va por el estilo de la imagen que has subido. Los datos de velocidad y grados los introduzco de dos trackbars y los muestro por sus respectivas textbox que solo habilito para lectura.
El motor que utilizo es un nema17 tipico de impresora 3d alimentado con 12v y manejado con un drv8825.

Buenas:

Pues cuando puedas, nos vemos. Quiero ver tu diseño del formulario en C#, luego te apoyo. Necesito cualquier dato del motor. Lo más normal es usar label, pero es tu diseño.

Ya contarás que datos envía desde Arduino al puerto serie. Tengo que saber cada detalle para ser más eficiente.

Saludos.

Hola otra vez, este es el diseño que he hecho.

Primero se abre el puerto con los botones de bajo a la izquierda.
Una vez hecho esto, se le da ON al motor y luego le indicas ya los grados la velocidad de 0 a 100 y el sentido al que se quiere girar, y todos esos datos se deben enviar a la vez al darle enviar.

He conseguido que el motor de una vuelta solo enviando desde el botón izquierda o derecha, pero sin poder indicarle los grados o la velocidad, pero esa misma orden no consigo mandarla desde el botón de enviar.

Perdón, pero no consigo que se vea la imagen, decidme por favor como solucionarlo y lo hare enseguida. He metido el enlace de imgur dentro de los corchetes para insertala pero no se ve.

vale, he vuelto a empezar de cero y creo que de esta forma puede ser mas sencillo

Imgur

este es mi nueva interfaz
ahora le introduzco los valores sin las trackbars, pero la funcionalidad debe ser la misma

el codigo en c# si que ha cambiado bastante y yo creo que ahi no hay problema, pero nunca viene mal que alguien lo revise.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace nuevomotor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void buttonAbrir_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                serialPort1.PortName = textBoxPuerto.Text;
                serialPort1.Open();
                labelEstadoPuerto.Text = "ABIERTO";
                labelEstadoPuerto.ForeColor = Color.Green;
            }
            else
            {
                MessageBox.Show("El puerto : " + serialPort1.PortName + "  ya está abierto!");
            }
        }

        private void buttonCerrar_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                labelEstadoPuerto.Text = "CERRADO";
                labelEstadoPuerto.ForeColor = Color.Red;
            }
            else
            {
                MessageBox.Show("El puerto : " + serialPort1.PortName + "  ya está cerrado!");
            }
        }

        private void buttonOn_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("ON");
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void buttonOff_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("OFF");
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void radioButtonCW_CheckedChanged(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                if (radioButtonCW.Checked)
                {
                    serialPort1.WriteLine("CW");
                }
                else if (radioButtonCCW.Checked)
                {
                    serialPort1.WriteLine("CCW");
                }
            }

            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void buttonAplicar_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("periodo"+textBoxPeriodo.Text);
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void textBoxPeriodo_TextChanged(object sender, EventArgs e)
        {

        }

        private void buttonAplicar2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("steps"+ textBoxSteps.Text);
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }
    }
}

Ahora en vez de enviar todo de una vez lo envio separado.
En los botones de aplicar he escrito que mande las palabras steps (pasos del motor) y periodo(velocidad) para poder detectarlo en el arduino que es donde creo que está el problema.

este es el codigo de arduino

#define stp 9
#define dir 8
#define led 13

 bool on = false;
 bool cw = true;
 int periodo = 250;
 int steps=200;
 int x;
void setup() {
  pinMode(stp, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  String str = "";

  while (Serial.available())
  {
    char c = Serial.read();
    str += c;
  }

  if (str != "")
  {
    if (str.indexOf("ON") == 0)
    {
      digitalWrite(on, HIGH);
      digitalWrite(led, HIGH);
    }
    else if (str.indexOf("OFF") == 0)
    {
      digitalWrite(on, LOW);
      digitalWrite(led, LOW);
    }
    else if (str.indexOf("CW") == 0)
      cw = true;
    else if (str.indexOf("CCW") == 0)
      cw = false;
    else if (str.indexOf("periodo"==0))
      //periodo = str.readStringUntil('p').toInt();
      //periodo=Serial.readStringUntil('p').toInt();
      periodo=str.toInt();
    else if(str.indexOf("steps"==0));
      //steps=str.readStringUntil('s').toInt();
      //steps=Serial.readStringUntil('s').toInt();
      steps=str.toInt();
      }
    else
     str = "";
    
    if(on==true)
    {
     if(cw==true)
     {
      for(x=0;x<=steps;x++)
      {
        digitalWrite(dir,HIGH);
        digitalWrite(stp,HIGH);
        delayMicroseconds(periodo);
        digitalWrite(stp,LOW);
        delayMicroseconds(periodo);  
      }
      }
      else if(cw==false)
      {
        for(x=0;x<=steps;x++)
        {
          digitalWrite(dir,LOW);
          digitalWrite(stp,HIGH);
          delayMicroseconds(periodo);
          digitalWrite(stp,LOW);
          delayMicroseconds(periodo); 
        }
        }
      }
    

  

  delay(100);
}

he puesto que vaya detectando palabras de la string que se mande según sea y se vayan almacenando.

Pero para leer el periodo y los steps no se si lo estoy haciendo bien. Quiero que lea el número y lo separe de la palabra para convertirlo en int y guardarlo en su respectiva variable.
También puede que haya otro fallo por el codigo que haga que el motor no se mueva aunque compile bien.

He subido este nuevo codigo porque creo que es mas sencillo de entender.
Gracias a todo el que quiera ayudar.

PD: Sigo sin conseguir insertar las imagenes. Lo siento.

Buenas:

Estás en proceso de diseño de la interfaz, me gusta más el primero y partes del segundo. Es más intuitivo el cambio de giro del motor con la fecla en curvo. Más entendible. La parte de configuración del puerto me gusta más el segundo. Puedes buscar un equilibrio ya que estás diseñando primero antes de programar.

Interfaz 1:
I04He0q.png

Interfaz 2:
I04He0q_2.png

Vayamos por parte.

Fijándonos en la Interfaz 2, haz puesto botones ON y OFF, a parte de eso dos radioButtons. Ya que todavía estamos en etapa de diseño. ¿Por qué no usas dos botones nada más que diga IZQUIERDA Y OTRO DERECHA?
O solamente ponge <-- y -->, también en modo iconos de las flechas que los puedes hacer.

Lo de las flechitas para indicar el sentido de giro se hace al final, que es cuando se pule y el programa terminado. El diseño de los componentes o controles en el formulario si hay que diseñarlo bien de entrada. Aún estás a tiempo.

Cuando puedas, indica el timo de motor que estás usando, cantidad de cables y como lo estás conectando. Tengo que saberlo todo.

Saludos.

I04He0q.png

I04He0q_2.png

Vale, buenas noticias. Esta ya casi acabado, lo único donde fallo es en los pasos que gira el motor.

He conseguido controlar ya la velocidad de giro, pero aun no que el motor de media vuelta, un cuarto o 3/4, y no se por que ya que estoy usando el mismo método para introducirle los datos.

voy a dejar solo esas partes, ya que lo demás funciona perfectamente.

////periodo=velocidad
private void buttonAplicar_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("periodo"+textBoxPeriodo.Text);
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

 ///steps=giro del motor

private void buttonAplicar2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("steps"+textBoxSteps.Text);
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }
#define stp 9
#define dir 8
#define led 13

bool on = false;
bool cw = true;
int periodo = 500;
int steps = 200;
int x;

void setup() {
  pinMode(stp, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  String str = "";

  while (Serial.available())
  {
    char c = Serial.read();
    str += c;
  }

  if (str != "")
  {
    if (str.indexOf("ON") == 0)
    {
      on = true;
      digitalWrite(led, HIGH);
    }
    else if (str.indexOf("OFF") == 0)
    {
      on = false;
      digitalWrite(led, LOW);
    }
    else if (str.indexOf("CW") == 0)
      cw = true;
    else if (str.indexOf("CCW") == 0)
      cw = false;
    else if (str.indexOf("periodo" == 0))
      periodo = (str.substring(7, str.length() - 1)).toInt();
    else if(str.indexOf("steps"==0))
      steps = (str.substring(5, str.length() - 1)).toInt();  
  }
  

  digitalWrite(dir, cw ? HIGH : LOW);

  if (on == true)
    for (x = 0; x < steps; x++)
    {
      digitalWrite(stp, HIGH);
      delay(periodo);
      digitalWrite(stp, LOW);
      delay(periodo);
    }


  delay(100);
}

Ahora no recibe la orden y no se por que.
También querría que una vez hecha la orden no la volviera a repetir.
Ahora que por defecto tiene que haga 200 pasos los hace una y otra vez. Cuando bajo de 200 en el valor predefinido tampoco me funciona.

Lee un post más atrás. El mio, claro. :wink:

Otra vez, muchas gracias por tomarte tu tiempo y contestar.
Perdona pero no se a que te refieres con el timo del motor.
Es un motor bipolar conectado con 4 cables


esta es la conexion en la protoboard.

Buenas campeón:

Me da la impresión que usas el NEMA17, 4 hilos.

Ver zoom.

De todos los motores que hay, puedes indicar cual estás usando exactamente.

¿Cómo se llama el controlador del motor PAP que usa con Arduino?

Saludos.

El controlador es un pololu drv8825
El motor mañana aseguro pero casi seguro que es el de 2,2 A

Buenas:

PArece que es este.

Hay que saber cuantos punto de giro tiene ese motor PAP, para reflejarlo en C#.

Te es pero mañana. :wink:

Saludos.

Buenas, mi motor es SM42HT47-1684AFC.V2
Soporta 1.6A no 2.2 A. Ayer me equivoque porque lo dije de memoria.

sm42ht47-1684afcv2-stepper-nema17-bcn3d.jpg

sm42ht47-1684afcv2-stepper-nema17-bcn3d.jpg

Hola, este es el problema que me está ocurriendo desde ayer.
Con del mismo método estoy enviando los datos de periodo y steps.
Pues bien, el periodo si que guarda los cambios, pero los steps no.
En los dos casos veo como arduino recibe los datos, pero solo modifica el de periodo, mientras que si cambio el de steps deja de funcionar.
He hecho pruebas con el monitor serie para que veais que ocurre.

2018_04_25_09_35_39_nuevomotor_Arduino_1.8.5.png

2018_04_25_09_40_23_COM13_Arduino_Genuino_Mega_or_Mega_2560_.png

aqui los codigos de esas partes para que veais que es igual.

 else if (str.indexOf("periodo" == 0))
      periodo = (str.substring(7, str.length() - 1)).toInt();
    else if (str.indexOf("steps" == 0))
      steps = (str.substring(5, str.length() - 1)).toInt();  
  }
private void buttonAplicar_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("periodo"+textBoxPeriodo.Text);
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }


private void buttonAplicar2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("steps"+textBoxSteps.Text);
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

2018_04_25_09_35_39_nuevomotor_Arduino_1.8.5.png

2018_04_25_09_40_23_COM13_Arduino_Genuino_Mega_or_Mega_2560_.png

Hola a todos otra vez, traigo buenas noticias.

Ya funciona todo perfectamente.

Voy a dejar los codigos para que veais como esta hecho.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace nuevomotor
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }

        private void buttonAbrir_Click(object sender, EventArgs e)
        {
            if (!serialPort1.IsOpen)
            {
                serialPort1.PortName = textBoxPuerto.Text;
                serialPort1.Open();
                labelEstadoPuerto.Text = "ABIERTO";
                labelEstadoPuerto.ForeColor = Color.Green;
            }
            else
            {
                MessageBox.Show("El puerto : " + serialPort1.PortName + "  ya está abierto!");
            }
        }

        private void buttonCerrar_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                serialPort1.Close();
                labelEstadoPuerto.Text = "CERRADO";
                labelEstadoPuerto.ForeColor = Color.Red;
            }
            else
            {
                MessageBox.Show("El puerto : " + serialPort1.PortName + "  ya está cerrado!");
            }
        }

        private void buttonOn_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("ON");
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void buttonOff_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("OFF");
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void radioButtonCW_CheckedChanged(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
            {
                if (radioButtonCW.Checked)
                {
                    serialPort1.WriteLine("CW");
                }
                else if (radioButtonCCW.Checked)
                {
                    serialPort1.WriteLine("CCW");
                }
            }

            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void buttonAplicar_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("periodo"+textBoxPeriodo.Text);
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void textBoxPeriodo_TextChanged(object sender, EventArgs e)
        {

        }

        private void buttonAplicar2_Click(object sender, EventArgs e)
        {
            if (serialPort1.IsOpen)
                serialPort1.WriteLine("steps"+textBoxSteps.Text);
            else
                MessageBox.Show("EL PUERTO ESTÁ CERRADO!");
        }

        private void textBoxPuerto_TextChanged(object sender, EventArgs e)
        {

        }

        private void radioButtonCCW_CheckedChanged(object sender, EventArgs e)
        {

        }
    }
}
#define stp 9
#define dir 8
#define led 13

bool on = false;
bool cw = true;
int periodo = 10;
int steps = 500;
int x;

void setup() {
  pinMode(stp, OUTPUT);
  pinMode(dir, OUTPUT);
  pinMode(led, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  String str = "";

  while (Serial.available())
  {
    char c = Serial.read();
    str += c;
  }

  if (str != "")
  {
    if (str.indexOf("ON") == 0)
    {
      on = true;
      digitalWrite(led, HIGH);
    }
    else if (str.indexOf("OFF") == 0)
    {
      on = false;
      digitalWrite(led, LOW);
    }
    else if (str.indexOf("CW") == 0)
      cw = true;
    else if (str.indexOf("CCW") == 0)
      cw = false;
    else if (str.indexOf("periodo") == 0)
      periodo = (str.substring(7, str.length() - 1)).toInt();
    else if (str.indexOf("steps") == 0)
    {
      steps = (str.substring(5, str.length() - 1)).toInt();  

      Serial.println(steps);
    }
  }
  
  digitalWrite(dir, cw ? HIGH : LOW);

  if (on == true)
    for (x = 0; x < steps; x++)
    {
      digitalWrite(stp, HIGH);
      delay(periodo);
      digitalWrite(stp, LOW);
      delay(periodo);
    }
    on=false;
//Serial.println(periodo);

  delay(1000);
}

Acepto cualquier consejo para mejorar la interfaz.
Como las conexiones y la propia interfaz ya están puestas arriba no las vuelvo a poner.
Muchas gracias @Metaconta por tomarte tu tiempo, ojalá hubiera mas gente como tu.
Repito, acepto cualquier consejo para mejorar, pero el objetivo que quería ya lo he logrado.

Felicidades.