Проблема с энкодером
- Войдите на сайт для отправки комментариев
Доброго времени суток! Я в программировании новичок и у меня такой вопрос написал скетч для проверки целостности герконов кодовой маски ( датчика положения вала). Принцип действия такой : при повороте энкодера выбераем какую кодовоую маску проверять ( на 8 , 10 или 14 герконов), далее нажимаем кнопку энкодера и запускается двигатель с магнитом на валу, при достижении 1-го геркона двигатель останавливается (выставляется позиция ноль), дальше двигатель перемещается с остановками на против каждого геркона и выводит информацию на дисплей. по окончании проверки возвращаемся в меню выбора кодовой маски. Проблема заключается в том, что энкодер не меняет своё положение при выборе кодовой маски. Если закоментировать оставшуюся часть кода энкодер работает отлично. Я так понимаю что проблема заключается в том что код доходит до кнопки иждёт когда я её нажму, а мне для начала нужно выбрать 1 из 3-х позиций. // ждем нажатие кнопки while ( D2_Read ) delay_ms(5); // вот эта кнопка
#include <CyberLib.h>
#include <LiquidCrystal_I2C.h>
#include <Wire.h>
#include <RotaryEncoder.h>
#include <Stepper_28BYJ.h>
RotaryEncoder encoder(16,17); // аналоговые входы энкодера
LiquidCrystal_I2C lcd(0x3F,16,2); // адрес, кол-во символов, кол-во строк
#define ENTER 2 // кнопка энкодера
#define PIN_1 3 // геркон 1
#define PIN_2 4 // геркон 2
#define PIN_4 5 // геркон 4
#define PIN_8 6 // геркон 8
#define NUM_CYCLES1 8 // количество циклов по 45 градусов
#define NUM_CYCLES2 10 // количество циклов по 36 градусов
#define NUM_CYCLES3 14 // количество циклов по 26 градусов
int result = 1; // переменная позиции энкодера
static int pos = 0;
const int stepsPerRevolution = 4096; // количество шагов на один оборот
Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 9,10,11,12);
void setup()
{
myStepper_28BYJ.setSpeed(3); // скорость двигателя 3 об/мин
D2_In; // pinMode(ENTER, INPUT);
D2_Inv; // инвертируем ENTER
D3_In; // pinMode(PIN_1, INPUT);
D4_In; // pinMode(PIN_2, INPUT);
D5_In; // pinMode(PIN_4, INPUT);
D6_In; // pinMode(PIN_8, INPUT);
lcd.init(); // инициализация LCD 1602
lcd.backlight(); // включаем подсветку дисплея
lcd.setCursor(0, 0); // устанавливаем курсор в начало 1-ой строки
lcd.print(" TECT MACOK "); // выводим надпись в 1-ой строке
lcd.setCursor(0, 1); // устанавливаем курсор в начало 2-ой строки
lcd.print("8; 10; 14; OTB-B"); // выводим надпись в 1-ой строке
delay_ms(3000); // ждём
}
void loop()
{
encoder.tick();
int newPos = encoder.getPosition();
if (pos < newPos) result++;
if (pos > newPos) result--;
if (result > 3) result = 1;
if (result < 1) result = 3;
if (pos != newPos) pos = newPos;
lcd.setCursor(0, 0);
lcd.print(" Please Select: ");
if (result == 1)
{
lcd.setCursor(0, 1);
lcd.print(" 8 ");
}
if (result == 2)
{
lcd.setCursor(0, 1);
lcd.print(" 10 ");
}
if (result == 3)
{
lcd.setCursor(0, 1);
lcd.print(" 14 ");
}
// ждем нажатие кнопки
while ( D2_Read ) delay_ms(5);
lcd.setCursor(0, 0);
lcd.print("POZICIONIROVANIE");
// делаем шажки пока не упремся в геркон
while ( !D3_Read +D4_Read + D5_Read + D6_Read)
{
myStepper_28BYJ.step( 1 );
}
lcd.setCursor(0, 0);
lcd.print(" Otvod 1 ");
lcd.setCursor(0, 1);
lcd.print("Gerkon=1 ");
delay_ms(2000);
switch(result)
{
case 1:
for(byte x=0; x<NUM_CYCLES1; x++)
{
lcd.setCursor(0, 0);
lcd.print(" Otvod ");
lcd.print(x+1);
lcd.print(" "); // магнит отправился к X геркону
lcd.setCursor(0, 1);
lcd.print("Gerkon=");
byte g=(D6_Read*8 + D5_Read*4 + D4_Read*2 + D3_Read);
lcd.print(g);
lcd.print(" ");
myStepper_28BYJ.step( -(long) 45 * stepsPerRevolution / 360 );
delay_ms(2000);
}
break;
case 2:
for(byte x=0; x<NUM_CYCLES2; x++)
{
lcd.setCursor(0, 0);
lcd.print(" Otvod ");
lcd.print(x+1);
lcd.print(" "); // магнит отправился к X геркону
lcd.setCursor(0, 1);
lcd.print("Gerkon=");
byte g=(D6_Read*8 + D5_Read*4 + D4_Read*2 + D3_Read);
lcd.print(g);
lcd.print(" ");
myStepper_28BYJ.step( -(long) 36 * stepsPerRevolution / 360 );
delay_ms(2000);
}
break;
case 3:
for(byte x=0; x<NUM_CYCLES3; x++)
{
lcd.setCursor(0, 0);
lcd.print(" Otvod ");
lcd.print(x+1);
lcd.print(" "); // магнит отправился к X геркону
lcd.setCursor(0, 1);
lcd.print("Gerkon=");
byte g=(D6_Read*8 + D5_Read*4 + D4_Read*2 + D3_Read);
lcd.print(g);
lcd.print(" ");
myStepper_28BYJ.step( -(long) 26 * stepsPerRevolution / 360 );
delay_ms(2000);
}
break;
}
}
#include <CyberLib.h> #include <LiquidCrystal_I2C.h> #include <Wire.h> #include <RotaryEncoder.h> #include <Stepper_28BYJ.h> RotaryEncoder encoder(16,17); // аналоговые входы энкодера LiquidCrystal_I2C lcd(0x3F,16,2); // адрес, кол-во символов, кол-во строк #define ENTER 2 // кнопка энкодера #define PIN_1 3 // геркон 1 #define PIN_2 4 // геркон 2 #define PIN_4 5 // геркон 4 #define PIN_8 6 // геркон 8 #define NUM_CYCLES1 8 // количество циклов по 45 градусов #define NUM_CYCLES2 10 // количество циклов по 36 градусов #define NUM_CYCLES3 14 // количество циклов по 26 градусов int result = 1; // переменная позиции энкодера static int pos = 0; const int stepsPerRevolution = 4096; // количество шагов на один оборот Stepper_28BYJ myStepper_28BYJ(stepsPerRevolution, 9,10,11,12); void setup() { myStepper_28BYJ.setSpeed(3); // скорость двигателя 3 об/мин D2_In; // pinMode(ENTER, INPUT); D2_Inv; // инвертируем ENTER D3_In; // pinMode(PIN_1, INPUT); D4_In; // pinMode(PIN_2, INPUT); D5_In; // pinMode(PIN_4, INPUT); D6_In; // pinMode(PIN_8, INPUT); lcd.init(); // инициализация LCD 1602 lcd.backlight(); // включаем подсветку дисплея lcd.setCursor(0, 0); // устанавливаем курсор в начало 1-ой строки lcd.print(" TECT MACOK "); // выводим надпись в 1-ой строке lcd.setCursor(0, 1); // устанавливаем курсор в начало 2-ой строки lcd.print("8; 10; 14; OTB-B"); // выводим надпись в 1-ой строке delay_ms(3000); // ждём } void loop() { encoder.tick(); int newPos = encoder.getPosition(); if (pos < newPos) result++; if (pos > newPos) result--; if (result > 3) result = 1; if (result < 1) result = 3; if (pos != newPos) pos = newPos; lcd.setCursor(0, 0); lcd.print(" Please Select: "); if (result == 1) { lcd.setCursor(0, 1); lcd.print(" 8 "); } if (result == 2) { lcd.setCursor(0, 1); lcd.print(" 10 "); } if (result == 3) { lcd.setCursor(0, 1); lcd.print(" 14 "); } // ждем нажатие кнопки while ( D2_Read ) delay_ms(5); lcd.setCursor(0, 0); lcd.print("POZICIONIROVANIE"); // делаем шажки пока не упремся в геркон while ( !D3_Read +D4_Read + D5_Read + D6_Read) { myStepper_28BYJ.step( 1 ); } lcd.setCursor(0, 0); lcd.print(" Otvod 1 "); lcd.setCursor(0, 1); lcd.print("Gerkon=1 "); delay_ms(2000); switch(result) { case 1: for(byte x=0; x<NUM_CYCLES1; x++) { lcd.setCursor(0, 0); lcd.print(" Otvod "); lcd.print(x+1); lcd.print(" "); // магнит отправился к X геркону lcd.setCursor(0, 1); lcd.print("Gerkon="); byte g=(D6_Read*8 + D5_Read*4 + D4_Read*2 + D3_Read); lcd.print(g); lcd.print(" "); myStepper_28BYJ.step( -(long) 45 * stepsPerRevolution / 360 ); delay_ms(2000); } break; case 2: for(byte x=0; x<NUM_CYCLES2; x++) { lcd.setCursor(0, 0); lcd.print(" Otvod "); lcd.print(x+1); lcd.print(" "); // магнит отправился к X геркону lcd.setCursor(0, 1); lcd.print("Gerkon="); byte g=(D6_Read*8 + D5_Read*4 + D4_Read*2 + D3_Read); lcd.print(g); lcd.print(" "); myStepper_28BYJ.step( -(long) 36 * stepsPerRevolution / 360 ); delay_ms(2000); } break; case 3: for(byte x=0; x<NUM_CYCLES3; x++) { lcd.setCursor(0, 0); lcd.print(" Otvod "); lcd.print(x+1); lcd.print(" "); // магнит отправился к X геркону lcd.setCursor(0, 1); lcd.print("Gerkon="); byte g=(D6_Read*8 + D5_Read*4 + D4_Read*2 + D3_Read); lcd.print(g); lcd.print(" "); myStepper_28BYJ.step( -(long) 26 * stepsPerRevolution / 360 ); delay_ms(2000); } break; } }