Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization Serial.Event()只运行一次(使用单个字符输入)_Serialization_Arduino - Fatal编程技术网

Serialization Serial.Event()只运行一次(使用单个字符输入)

Serialization Serial.Event()只运行一次(使用单个字符输入),serialization,arduino,Serialization,Arduino,在我的Arduino Mega 2560上,我试图运行一个电机,它可以转动一个20瓶的容器(接受int输入1-20),同时通过一个单独冷却器的PID调节温度。我对这个技术领域基本上是新手,所以请容忍我。我还为编码器设置了一个中断来跟踪小瓶的位置 void serialEvent()和void loop()是要查看的最重要的部分,但我决定将其余的代码放在那里,以备您需要查看 #include <PID_v1.h> #include <SPI.h> #

在我的Arduino Mega 2560上,我试图运行一个电机,它可以转动一个20瓶的容器(接受int输入1-20),同时通过一个单独冷却器的PID调节温度。我对这个技术领域基本上是新手,所以请容忍我。我还为编码器设置了一个中断来跟踪小瓶的位置

void serialEvent()
void loop()
是要查看的最重要的部分,但我决定将其余的代码放在那里,以备您需要查看

    #include <PID_v1.h>
    #include <SPI.h>
    #include <TMC26XStepper.h>

    #define COOL_INPUT 0
    #define PIN_OUTPUT 9

    TMC26XStepper tmc26XStepper = TMC26XStepper(200,5,7,6,500);

    int step = 6;
    int value;
    int i;
    char junk = ' ';
    volatile long enc_count = 0;
    const byte interruptPinA = 2;
    const byte interruptPinB = 3;

    //Define Variables we'll be connecting to
    int outMax = 255;
    int outMin = -145;

    double Setpoint, Input, Output;
    double heatInput, heatOutput, originalInput;

    //Specify the links and initial tuning parameters
    // AGGRESSIVE VALUES (to get to 4 deg C)
    double aggKp=8.0, aggKi=3.0, aggKd=0.15;

    // CONSERVATIVE VALUES (to hover around 4 deg C)
    double consKp=2.5, consKi = 0.0, consKd = 1.0;

    PID myPID(&Input, &Output, &Setpoint, aggKp, aggKi, aggKd, REVERSE);

    void setup()
    {
       pinMode(step, OUTPUT);
       pinMode(interruptPinA, INPUT_PULLUP);
       pinMode(interruptPinB, INPUT_PULLUP);
       attachInterrupt(digitalPinToInterrupt(interruptPinA), encoder_isr, CHANGE);
       attachInterrupt(digitalPinToInterrupt(interruptPinB), encoder_isr, CHANGE);
       //initialize the variables we're linked to
       Input = (5.0*analogRead(COOL_INPUT)*100.0) / 1024;
       Setpoint = 10.75;
       myPID.SetOutputLimits(outMin, outMax);

       //turn the PID on
       myPID.SetMode(AUTOMATIC);
       Serial.begin(115200);

       tmc26XStepper.setSpreadCycleChopper(2,24,8,6,0);
       tmc26XStepper.setMicrosteps(32);
       tmc26XStepper.setStallGuardThreshold(4,0);
       Serial.println("...started...");
       tmc26XStepper.start();

       Serial.flush();
       Serial.println("Enter vial numbers 1-20");
    }

    void loop() {
        Input = (5.0*analogRead(COOL_INPUT)*100.0) / 1024;
        // A BUNCH OF CODE FOR TEMP REGULATION
        Serial.println(Input);
        delay(150);
    }

    void serialEvent() {
       while (Serial.available() == 0) {}
       i = Serial.parseInt();
       Serial.print("position: ");
       Serial.print(i);
       Serial.print(" ");
       while (Serial.available() > 0) {
           junk = Serial.read();
       }
       if (i == 1) {
           value = 0;
       } else {
           int num = i - 1;
           value = num * 72;
       }
       while (enc_count != value) {
           digitalWrite(6, HIGH);
           delayMicroseconds(100);
           digitalWrite(6, LOW);
           delayMicroseconds(100);
           if (enc_count == 1440) {
               enc_count = 0;
           }
       }
       Serial.println(enc_count);
    }


    // INFO FOR ENCODER
    void encoder_isr() {
        static int8_t lookup_table[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
        static uint8_t enc_val = 0;

        enc_val = enc_val << 2;
        enc_val = enc_val | ((PIND & 0b1100) >> 2);

        enc_count = enc_count + lookup_table[enc_val & 0b1111];
     }
#包括
#包括
#包括
#定义COOL_输入0
#定义引脚输出9
TMC26X步进器TMC26X步进器=TMC26X步进器(200,5,7,6500);
int步=6;
int值;
int i;
字符垃圾=“”;
易失性长enc_计数=0;
常量字节中断PINA=2;
常量字节中断PINB=3;
//定义我们要连接的变量
int outMax=255;
int-outMin=-145;
双设定点,输入,输出;
双热输入、热输出、原始输入;
//指定链接和初始调整参数
//侵蚀值(达到4摄氏度)
双aggKp=8.0,aggKi=3.0,aggKd=0.15;
//保守值(在4℃左右徘徊)
双consKp=2.5,consKi=0.0,consKd=1.0;
PID myPID(输入、输出、设定点、aggKp、aggKi、aggKd、反向);
无效设置()
{
pinMode(步进,输出);
pinMode(中断PINA、输入\上拉);
pinMode(中断PINB,输入\上拉);
连接中断(数字插针中断(中断插针)、编码器\u isr、更改);
连接中断(数字插针到中断(中断PINB)、编码器\u isr、更改);
//初始化链接到的变量
输入=(5.0*analogRead(冷输入)*100.0)/1024;
设定值=10.75;
myPID.SetOutputLimits(输出最小值、输出最大值);
//打开PID
myPID.SetMode(自动);
序列号开始(115200);
TMC26X步进设置前置循环器(2,24,8,6,0);
tmc26XStepper.setMicrosteps(32);
tmc26XStepper.setStallGuardThreshold(4,0);
Serial.println(“…开始…”);
tmc26XStepper.start();
Serial.flush();
Serial.println(“输入药瓶编号1-20”);
}
void循环(){
输入=(5.0*analogRead(冷输入)*100.0)/1024;
//温度调节的一系列代码
Serial.println(输入);
延迟(150);
}
void serialEvent(){
而(Serial.available()==0){}
i=Serial.parseInt();
序列号。打印(“位置:”);
连载印刷(一);
连续打印(“”);
while(Serial.available()>0){
垃圾=Serial.read();
}
如果(i==1){
数值=0;
}否则{
int num=i-1;
数值=num*72;
}
while(enc_count!=值){
数字写入(6,高);
延迟微秒(100);
数字写入(6,低);
延迟微秒(100);
如果(enc_计数=1440){
enc_计数=0;
}
}
串行打印项次(加密计数);
}
//编码器信息
无效编码器_isr(){
静态整数查找表[]={0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,1,-1,0};
静态uint8_t enc_val=0;
enc_val=enc_val>2);
enc_count=enc_count+查找表[enc_val&0b1111];
}
所以,最初我对这两个过程分别进行了测试(小瓶位置+编码器,然后是温度调节),一切都按照预期进行。现在,我将代码融合在一起,并将小瓶位置条目存储在serialEvent()方法中,以保持温度读数的连续性,并且无论何时我决定提供输入,小瓶位置条目都可用。但是,当我输入一个值时,程序会一起停止。我可以看到我输入的数字(位置:5),但是
Serial.println(enc\u count)
永远不会被打印出来。最重要的是,温度读数停止显示读数


有什么想法吗?需要更多信息吗

如果我注释掉所有的PID和编码器行,草图看起来还可以:它打印模拟值,并回显输入的任何整数。
while(enc_count!=值){
可能需要一个超时。也许编码器永远不会达到所需的值?它不会回到
循环
,直到退出该while循环。事实证明,经过一些穴居人调试后,当我使用Arduino Mega 2560时,您指出的while循环将永远持续,但在Uno上不会。原因是,我认为引脚不是在两块板上都是相同的,因此电机无法驱动(因此编码器没有新的内容可读取)…因此循环将永远继续。因此serialEvent()函数甚至从未完成,这阻碍了整个操作。感谢您的输入,对于这一点,我有没有想过如何使用Mega 2560而不是Uno?我在Uno上使用引脚2和引脚3(显然是为了中断),在Mega上应该是一样的……但是我在阅读,有人提到你应该使用引脚25或类似的东西,而不是PWM引脚。如果我注释掉所有PID和编码器行,草图看起来还可以:它打印模拟值,并回显输入的任何整数。
while(enc_count!=值){
可能需要一个超时。也许编码器永远不会达到所需的值?它不会回到
循环
,直到退出该while循环。事实证明,经过一些穴居人调试后,当我使用Arduino Mega 2560时,您指出的while循环将永远持续,但在Uno上不会。原因是,我认为引脚不是在两块板上都是一样的,因此电机无法驱动(因此编码器没有新的可读取内容)…因此循环将永远继续。因此serialEvent()函数甚至从未完成,这会使整个操作暂停。感谢您的输入,就此而言,有什么想法吗