Arduino: Pin время бездействия / активность - PullRequest
0 голосов
/ 11 января 2019

Целью следующего кода Arduino является взаимодействие с высокими и низкими сигналами, посылаемыми Raspberry Pi; Полное объяснение довольно сложное, поэтому я сэкономлю время. Сигналы, посылаемые от Pi (контакты 10 и 11), поворачивают шаговый двигатель, подключенный к приводу A4988, по часовой стрелке или против часовой стрелки. Штыри, которые диктуют это из Arduino, являются шагами и направляющими штифтами (9 и 8). Я пытаюсь включить sleepPin через 60 секунд бездействия выводов 10 и 11.

Аналогичным образом, я хочу прекратить принимать ввод с выводов 10 и 11, если они оба считывают один и тот же входной сигнал в течение более 3 секунд. Я искал способы, как включить время в скрипт Arduino, но не знаю, как его использовать в этом случае.

byte directionPin = 9;
byte stepPin = 8;
byte sleepPin = 12;

byte buttonCWpin = 10;
byte buttonCCWpin = 11;


boolean buttonCWpressed = false;
boolean buttonCCWpressed = false;
long previousMillis = 0;
long interval = 1000;


void setup() { 
//determines length of stepper movement
pinMode(directionPin, OUTPUT);
pinMode(stepPin, OUTPUT);
//moves motors clockwise or counterclockwise
pinMode(buttonCWpin, INPUT_PULLUP);
pinMode(buttonCCWpin, INPUT_PULLUP);

}

void loop() { 

 readButtons();
 actOnButtons();

}

void readButtons() {

 buttonCCWpressed = false;
 buttonCWpressed = false;


 if (digitalRead(buttonCWpin) == LOW) {
 buttonCWpressed = true;
 }
 if (digitalRead(buttonCCWpin) == LOW) {
 buttonCCWpressed = true;
 }


}

void actOnButtons() {

  if (buttonCWpressed == true) {
 digitalWrite(directionPin, LOW);
   for(int x = 0; x < 1; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(515); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(515); 
   }
 }

 if (buttonCCWpressed == true) {
 digitalWrite(directionPin, HIGH);
   for(int x = 0; x < 1; x++) {
    digitalWrite(stepPin,HIGH); 
    delayMicroseconds(515); 
    digitalWrite(stepPin,LOW); 
    delayMicroseconds(515); 
   }
 }






}

Буду признателен за любую помощь вместе с любыми советами или замечаниями.

Спасибо.

1 Ответ

0 голосов
/ 12 января 2019

Если у вас есть возможность использовать контакты 2 и 3, а не контакты 10 и 11 (например, если у вас Arduino Uno), было бы полезно работать с внешними прерываниями .

В качестве решения вашей первой проблемы, вот минимальный код, который должен поставить спящий штырь в высокий уровень после 60 секунд бездействия на оба указателя 2 и 3:

volatile long int last_activity;

void setup(){
    attachInterrupt(2, tstamp, CHANGE);
    attachInterrupt(3, tstamp, CHANGE);
    pinMode(2, INPUT); // your new CW pin
    pinMode(3, INPUT); // your new CCW pin
    pinMode(12, OUTPUT);
    digitalWrite(12, LOW);
    last_activity = millis();
}

void loop(){
    if (millis() - last_activity > 60e3) {
        digitalWrite(12, HIGH);
        // do some other things...
    }
}

void tstamp(){
    last_activity = millis();
}

Теперь для вашей второй проблемы, что именно вы подразумеваете под "перестать принимать входные сигналы с контактов 10 и 11"? Если вам нужно только проверить, что их состояние одинаково, добавление volatile long int last_common_state; в преамбуле и проверка digitalRead(2) == digitalRead(3); в теле tstamp() для обновления last_common_state должны привести вас на правильный путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...