От 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);
}
}
@Bkukuk62, 👍0
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()
у вас есть посторонний блок кода с кучей случайных скобок.
Вам нужно решить, где в вашей программе это должно находиться, и переместить его туда, удалив лишние скобки.
- Считывание нескольких поворотных энкодеров
- Выводы прерываний Arduino Mega 2560 и отображение портов с помощью поворотного энкодера
- Захват прерывания на обоих фронтах, когда он установлен на RISING или FALLING
- Проблема прерывания библиотеки MPU6050 Arduino Jeff Rowberg
- Точность синхронизации Arduino nano
- Как выбрать входной контакт 600 кГц, разделить его на 4 и сгенерировать низкочастотный сигнал на выходном контакте Arduino
- Проблема с использованием Arduino Mega Timer2 с прерыванием PinChange
- DS3231 с Arduino Nano для точной синхронизации
Мне могла бы понадобиться немного больше помощи. Я действительно новичок в кодировании. Спасибо., @Bkukuk62
Я не могу вам помочь. Только вы знаете, где вам нужен этот фрагмент кода., @Majenko