凯风自北来 发表于 2015-7-16 18:46:10

如何缩短程序上传的时间

本帖最后由 凯风自北来 于 2015-7-17 09:51 编辑

标题党,见谅!
问题是这样的:我正在做步进电机的实验,想通过改变程序里的参数值随时改变电机转速,但是每改变一次参数值都要重新编译上传,而上传的过程中电机会停转。我希望在改变参数时电机不停转,或者说停转时间短到察觉不到,应该怎么做呢?如果不能缩短程序上传时间,是否还有其他方法呢?

这样在串口监视器里发送参数为什么不可以呢
#include <AccelStepper.h>
AccelStepper stepper1(1, 9, 8);
intvelocity1;
int pos1=1600;
void setup()
{Serial.begin(9600);
   

}


void loop() {
   if (Serial.available() > 0)
    {
   velocity1 = Serial.read();}
    stepper1.setMaxSpeed(velocity1);
   stepper1.setAcceleration(1000);
   stepper1.moveTo(-pos1);// put your main code here, to run repeatedly:
   stepper1.run();
}

seagatecm 发表于 2015-7-16 19:04:07

把参数用串口传过去,不要写死在代码里。

A丶XING 发表于 2015-7-16 20:48:38

用Serial输入字符通过串口控制电机

凯风自北来 发表于 2015-7-16 20:52:47

seagatecm 发表于 2015-7-16 19:04 static/image/common/back.gif
把参数用串口传过去,不要写死在代码里。

这样在串口监视器里发送参数为什么不可以呢#include <AccelStepper.h>
AccelStepper stepper1(1, 9, 8);
intvelocity1;
int pos1=1600;
void setup()
{Serial.begin(9600);
   

}


void loop() {
   if (Serial.available() > 0)
    {
   velocity1 = Serial.read();}
    stepper1.setMaxSpeed(velocity1);
   stepper1.setAcceleration(1000);
   stepper1.moveTo(-pos1);// put your main code here, to run repeatedly:
   stepper1.run();
}

凯风自北来 发表于 2015-7-16 21:02:10

A丶XING 发表于 2015-7-16 20:48 static/image/common/back.gif
用Serial输入字符通过串口控制电机

请问我这么写是哪里出错了么

Super169 发表于 2015-7-16 21:32:22

簡單的話, 用 Serial.parseInt() 去讀取數值, 之後再清空 serial buffer, 例如: while(Serial.available()) Serial.read();

164335413 发表于 2015-7-17 09:36:09

如果你用arduino自带的串口工具发送数据,产生意想不到的效果,因为发送的指令是以字符的形式。
即使时你发送的数字,arduino读进去的数据也是ascii码,
改变步进电机的速度也就是改变脉冲的频率。
你在读出串口的字符时最好加一些处理,让它变成数值。

凯风自北来 发表于 2015-7-18 14:38:05

seagatecm 发表于 2015-7-16 19:04 static/image/common/back.gif
把参数用串口传过去,不要写死在代码里。

这样搞了感觉还是有点慢,能延迟再短点吗

凯风自北来 发表于 2015-7-18 14:39:18

Super169 发表于 2015-7-16 21:32 static/image/common/back.gif
簡單的話, 用 Serial.parseInt() 去讀取數值, 之後再清空 serial buffer, 例如: while(Serial.available()) ...

请问这个还需要完善吗#include <AccelStepper.h>
AccelStepper stepper1(1, 9, 8); unsigned longpos1 = 16000;
int velocity1;               
void setup()
{ Serial.begin(9600);
//Serial.flush();
}
void loop()
{
if (Serial.available() ) {
velocity1=Serial.parseInt();
Serial.println(velocity1);}
   stepper1.setMaxSpeed(velocity1);
   stepper1.setAcceleration(1000);
   stepper1.moveTo(-pos1);
stepper1.run();
}

凯风自北来 发表于 2015-7-18 14:44:07

Super169 发表于 2015-7-16 21:32 static/image/common/back.gif
簡單的話, 用 Serial.parseInt() 去讀取數值, 之後再清空 serial buffer, 例如: while(Serial.available()) ...

这个确实很方便随时调整电机的速度,但是如果一个控制板连两个独立运行的电机的话,想只改变其中一个的速度而另一个照常运行,这个程序的模式是不是就不行了呢?重新在串口里输入数值的话电机都要停顿吧

Super169 发表于 2015-7-20 00:00:48

凯风自北来 发表于 2015-7-18 14:44 static/image/common/back.gif
这个确实很方便随时调整电机的速度,但是如果一个控制板连两个独立运行的电机的话,想只改变其中一个的速 ...

不會有問題的, 你可以連續讀兩個數 (即執行 Serial.parseInt 兩次).
如果你只輸入一個數, 第二個會是 0.所以最好用數值為 0 代表不變.
當你想改變第二個為 123 時, 就事入:0123
也許這樣會做成不能設定為 0, 但電機一般有最少數值的.基本上 1 的速度也可看成是停了, 你把 1 當成 0 去設定說可以.
即是如果想把 第一個停了, 第二個設定 123, 就輸入:1 123
如果只想把第二個停了, 就輸入: 0 1
用類似的方法, 要控制多少個也不是問題.

asdfcgdc 发表于 2015-7-20 10:18:50

好心不行吧:(

凯风自北来 发表于 2015-7-20 10:40:22

Super169 发表于 2015-7-20 00:00 static/image/common/back.gif
不會有問題的, 你可以連續讀兩個數 (即執行 Serial.parseInt 兩次).
如果你只輸入一個數, 第二個會是 0. ...

还是有停顿啊#include <AccelStepper.h>
AccelStepper stepper1(1, 9, 8);
AccelStepper stepper2(1, 7, 6);
String inString = "";
unsigned longpos1 = 1600000;
unsigned longpos2 = 1600000;
float velocity1;      
float velocity2;      
void setup()
{ Serial.begin(9600);
//Serial.flush();
}
void loop()
{
while (Serial.available() > 0) {
int inChar = Serial.read();
if ((char)inChar == 'A') {
do {
inChar = Serial.read();
inString += (char)inChar;
} while (isDigit(inChar));
velocity1=Serial.parseFloat();
inString = "";
}
if ((char)inChar == 'B') {
do {
inChar = Serial.read();
inString += (char)inChar;
} while (isDigit(inChar));
velocity2=Serial.parseFloat();
inString = "";
}}
// Serial.println(velocity1);}
   stepper1.setMaxSpeed(velocity1);
   stepper1.setAcceleration(1000);
   stepper2.setMaxSpeed(velocity2);
   stepper2.setAcceleration(1000);
   stepper1.moveTo(-pos1);
   stepper2.moveTo(pos2);
   stepper1.run();
   stepper2.run();
   /*inString = "";
delay(200);*/
}

Super169 发表于 2015-7-20 11:36:13

不明白你說的 停顿 是什麼意思, 在那裡停顿?

凯风自北来 发表于 2015-7-20 14:37:02

Super169 发表于 2015-7-20 11:36 static/image/common/back.gif
不明白你說的 停顿 是什麼意思, 在那裡停顿?

重新发送程序的时候到控制板的时候会停顿一秒左右
页: [1] 2
查看完整版本: 如何缩短程序上传的时间