2015-07-03 3 views
0

Я работаю над управлением двумя моторными реле через ардуино. Настройка такова:Управление ретрансляторами двигателей через Arduino с использованием прототипов

Каждое реле управляется простой настройкой переключателя. Когда переключатель замкнут, реле активно. Когда переключатель разомкнут, реле неактивно.

Я решил дать protothreads, так как я хочу, чтобы два переключателя управляли двигателями в параллеле. Для этого я написал следующий код:

#include <pt.h> 

#define yMaxLimitLeft 8 //these are the limit switches that control the relays 
#define yMaxLimitRight 9 //these are the limit switches that control the relays 
#define leftRelay 4 
#define rightRelay 5 

static struct pt pt1, pt2; // each protothread needs one of these 



void setup() { 
    Serial.begin(9600); 
    PT_INIT(&pt1); // initialise the two 
    PT_INIT(&pt2); // protothread variables 
    pinMode(leftRelay, OUTPUT); //set pins  
    pinMode(rightRelay, OUTPUT); 
    pinMode(yMaxLimitLeft,INPUT); 
    pinMode(yMaxLimitRight,INPUT); 

} 

void loop() { 

    digitalWrite(leftRelay, HIGH);//enable relays 
    digitalWrite(rightRelay, HIGH);//enable relays 
    runLeft(&pt1); //protothreads that controls relay number 1 
    runRight(&pt2); //protothreads that controls relay number 2 

} 

///////////////////////////////////////////////////////////////////////////// 
// This function controls the left relay 
static int runLeft(struct pt *pt) { 

    PT_BEGIN(pt); 

    while(1){ 

    PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitLeft)==HIGH); //wait until the switch is closed 
    Serial.println("left off"); 
     digitalWrite(leftRelay, LOW);//disable relay 

     } 

    PT_END(pt); 
} 


//this function controls the right relay 
static int runRight(struct pt *pt) { 
    PT_BEGIN(pt); 

    while(1){ 


    PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitRight)==HIGH); //wait until the switch is closed 
    Serial.println("Right off"); 
    digitalWrite(rightRelay, LOW);//disable relay 

    } 


    PT_END(pt); 
} 

Проблема заключается в следующем. Пока я нажимаю только один переключатель, соответствующее реле отвечает. Однако, когда я нажимаю оба переключателя, срабатывает только одно реле (предположительно тот, который был вызван как можно раньше).

Как исправить код, чтобы при одновременном удерживании обоих переключателей оба реле реагировали одновременно?

Большое спасибо за ваше время и помощь заранее

ответ

0

До тех пор, как предикат в PT_WAIT_UNTIL (т.е. digitalRead(yMaxLimitLeft)==HIGH) истинно, то выполнение будет застрял в этом время цикла.

Код, вероятно, станет легче рассуждать, если loop()только несет ответственность за поддержание прототипов. Если мы переведем начальное включение реле в setup(), runLeft/Right может быть переписано, чтобы содержать все логика, связанная с определенным переключателем + реле. В этом случае второй оператор PT_WAIT_UNTIL может использоваться для ожидания повторного открытия коммутатора.

#include <pt.h> 

#define yMaxLimitLeft 8 //these are the limit switches that control the relays 
#define yMaxLimitRight 9 //these are the limit switches that control the relays 
#define leftRelay 4 
#define rightRelay 5 

static struct pt pt1, pt2; // each protothread needs one of these 



void setup() { 
    Serial.begin(9600); 
    PT_INIT(&pt1); // initialise the two 
    PT_INIT(&pt2); // protothread variables 
    pinMode(leftRelay, OUTPUT); //set pins  
    pinMode(rightRelay, OUTPUT); 
    pinMode(yMaxLimitLeft,INPUT); 
    pinMode(yMaxLimitRight,INPUT);  

    digitalWrite(leftRelay, HIGH);//enable relays 
    digitalWrite(rightRelay, HIGH);//enable relays 

} 

void loop() { 

    runLeft(&pt1); //protothreads that controls relay number 1 
    runRight(&pt2); //protothreads that controls relay number 2 

} 

///////////////////////////////////////////////////////////////////////////// 
// This function controls the left relay 
static int runLeft(struct pt *pt) { 

    PT_BEGIN(pt); 

    while(1) { 

    PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitLeft)==HIGH); //wait until the switch is closed 
    Serial.println("left off"); 
    digitalWrite(leftRelay, LOW);//disable relay 

    PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitLeft)==LOW); //wait until the switch opens again 
    digitalWrite(leftRelay, HIGH);//enable relay 

    } 

    PT_END(pt); 
} 


//this function controls the right relay 
static int runRight(struct pt *pt) { 
    PT_BEGIN(pt); 

    while(1){ 

     PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitRight)==HIGH); //wait until the switch is closed 
     Serial.println("Right off"); 
     digitalWrite(rightRelay, LOW);//disable relay 

     PT_WAIT_UNTIL(pt, digitalRead(yMaxLimitRight)==LOW); //wait until the switch opens again 
     digitalWrite(rightRelay, HIGH);//enable relay 
    } 


    PT_END(pt); 
} 
Смежные вопросы