От Uno до Mega, и где ошибка необъявленного прерывания?

Я хочу прочитать инкрементный поворотный энкодер Omron E6B2-CWZ6C с индексом (360P/R). Пара вопросов: я обнаружил, что Uno может обрабатывать только 2 контакта прерывания, и я думаю, мне нужно 3 для индекса. Что мне нужно сделать со следующим кодом, чтобы заставить его работать на Mega, который, как я полагаю, может обрабатывать 3 контакта прерывания?

Кроме того, я получаю сообщение «outAChange», не объявленное в этой области. Чего мне здесь не хватает.

Я буду использовать данные значения кодировщика для запуска NeoPixel 60 для направленной мачты/антенны.

Вот код, который я пытаюсь использовать:

// Проводные соединения для моего кодера:
// Коричневый: VCC = от 5 до 24 В постоянного тока
// Синий: 0 В (общий) = GND
// Экран: земля
// Черный: outA = цифровой контакт 2
// Белый: outB = цифровой контакт 3
// Оранжевый: outZ = цифровой контакт 4 (индекс)
// С этими соединениями outA/outB/outZ и кодом прерывания ниже
// вращение по часовой стрелке дает положительные значения счетчика энкодера

const int outA = 2;
const int outB = 3;
const int outZ = 4;

volatile long encoder = 0; // объявляем изменчивым, так как он изменен процедурами прерывания
float encoder_save = 0;

void setup(){  // устанавливаем контакты энкодера
pinMode(outA, INPUT_PULLUP);
pinMode(outB, INPUT_PULLUP);
pinMode(outZ, INPUT_PULLUP);  //Индекс

// прикрепляем прерывания к контактам
attachInterrupt(digitalPinToInterrupt(outA), outAChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(outB), outBChange, CHANGE);
attachInterrupt(digitalPinToInterrupt(outZ), outZChange, CHANGE);

// инициализируем последовательный порт
Serial.begin(57600);
}

void loop(){ 

if (encoder_save != encoder)  // печатаем только если новое значение
encoder_save = encoder;

// Если Index(Z) считывает энкодер низкого сброса до 0
if (digitalRead(outZ) == LOW)
{
  encoder = 0;
}
}

{
Serial.println((encoder * 360)/360);
}
}

// процедуры прерывания
void outAChange(){
// когда outA изменяется, outA==outB означает отрицательное направление
encoder += digitalRead(outA) == digitalRead(outB) ? -1 : 1;
if (encoder < 0)
{
  encoder = (encoder + 360); 
}
}

void outBChange(){
// когда outB меняется, outA==outB означает положительное направление
encoder += digitalRead(outA) == digitalRead(outB) ? 1 : -1;
if (encoder >= 360)
{
  encoder = (encoder - 360);
}
}

, 👍0


1 ответ


1

У вас все скобки перепутаны. Если вы пропустите свой код через автоформатер (например, тот, который включен в IDE), вы получите следующее:

// Проводные соединения для моего кодера:
// Коричневый: VCC = от 5 до 24 В постоянного тока
// Синий: 0 В (общий) = GND
// Экран: земля
// Черный: outA = цифровой контакт 2
// Белый: outB = цифровой контакт 3
// Оранжевый: outZ = цифровой контакт 4 (индекс)
// С этими соединениями outA/outB/outZ и кодом прерывания ниже
// вращение по часовой стрелке дает положительные значения счетчика энкодера

const int outA = 2;
const int outB = 3;
const int outZ = 4;

volatile long encoder = 0; // объявляем изменчивым, так как он изменен процедурами прерывания
float encoder_save = 0;

void setup() { // установка контактов энкодера
    pinMode(outA, INPUT_PULLUP);
    pinMode(outB, INPUT_PULLUP);
    pinMode(outZ, INPUT_PULLUP);  //Индекс
// прикрепляем прерывания к контактам
    attachInterrupt(digitalPinToInterrupt(outA), outAChange, CHANGE);
    attachInterrupt(digitalPinToInterrupt(outB), outBChange, CHANGE);
    attachInterrupt(digitalPinToInterrupt(outZ), outZChange, CHANGE);
// инициализируем последовательный порт
    Serial.begin(57600);
}

void loop() {
    if (encoder_save != encoder) { // печатаем только если новое значение
        encoder_save = encoder;
    }

// Если Index(Z) считывает энкодер низкого сброса до 0
    if (digitalRead(outZ) == LOW) {
        encoder = 0;
    }
}

{                                                << WHAT
    Serial.println((encoder * 360) / 360);       << IS
}                                                << THIS
}                                                << CODE?

// процедуры прерывания
void outAChange() {
// когда outA изменяется, outA==outB означает отрицательное направление
    encoder += digitalRead(outA) == digitalRead(outB) ? -1 : 1;

    if (encoder < 0) {
        encoder = (encoder + 360);
    }
}

void outBChange() {
// когда outB меняется, outA==outB означает положительное направление
    encoder += digitalRead(outA) == digitalRead(outB) ? 1 : -1;

    if (encoder >= 360) {
        encoder = (encoder - 360);
    }
}

Как видите, после завершения функции loop() у вас есть посторонний блок кода с кучей случайных скобок.

Вам нужно решить, где в вашей программе это должно находиться, и переместить его туда, удалив лишние скобки.

,

Мне могла бы понадобиться немного больше помощи. Я действительно новичок в кодировании. Спасибо., @Bkukuk62

Я не могу вам помочь. Только вы знаете, где вам нужен этот фрагмент кода., @Majenko