vale, he vuelto a empezar de cero y creo que de esta forma puede ser mas sencillo
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.