Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Как работает Rotary Encoder и как его использовать с Arduino

<основной класс="главный сайт" id="главный">

В этом уроке мы узнаем, как работает поворотный энкодер и как его использовать с Arduino. Вы можете посмотреть следующее видео или прочитать письменное руководство ниже.

Обзор

Энкодер — это тип датчика положения, который используется для определения углового положения вращающегося вала. Он генерирует электрический сигнал, аналоговый или цифровой, в зависимости от вращательного движения.

Существует множество различных типов поворотных энкодеров, которые классифицируются либо по выходному сигналу, либо по технологии датчиков. Конкретный энкодер, который мы будем использовать в этом руководстве, представляет собой инкрементный энкодер и самый простой датчик положения для измерения вращения.

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

Как работает поворотный энкодер

Давайте поближе познакомимся с энкодером и посмотрим на принцип его работы. Вот как генерируются прямоугольные импульсы:Энкодер имеет диск с равномерно расположенными контактными зонами, которые подключены к общему контакту C и двум другим отдельным контактным контактам A и B, как показано ниже.

Когда диск начнет шаг за шагом вращаться, контакты A и B начнут соприкасаться с общим контактом, и соответственно будут сгенерированы два выходных сигнала прямоугольной формы.

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

Мы можем заметить, что два выходных сигнала сдвинуты по фазе на 90 градусов относительно друг друга. Если энкодер вращается по часовой стрелке, выход A будет впереди выхода B.

Таким образом, если мы считаем шаги каждый раз, когда сигнал изменяется с высокого на низкий или с низкого на высокий, мы можем заметить, что в это время два выходных сигнала имеют противоположные значения. И наоборот, если энкодер вращается против часовой стрелки, выходные сигналы имеют одинаковые значения. Учитывая это, мы можем легко запрограммировать наш контроллер на считывание положения энкодера и направления вращения.

Пример поворотного кодировщика Arduino

Давайте сделаем практический пример, используя Arduino. Конкретный модуль, который я буду использовать в этом примере, поставляется на коммутационной плате и имеет пять контактов. Первый контакт — это выход A, второй контакт — это выход B, третий контакт — это контакт кнопки, и, конечно же, два других контакта — это контакт VCC и GND.

Мы можем подключить выходные контакты к любому цифровому выводу платы Arduino.

Компоненты, необходимые для этого руководства по Arduino, можно получить по ссылкам ниже:

Исходный код

Вот код Arduino:

/*     Arduino Rotary Encoder Tutorial
 *      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *  
 */
 
 #define outputA 6
 #define outputB 7

 int counter = 0; 
 int aState;
 int aLastState;  

 void setup() { 
   pinMode (outputA,INPUT);
   pinMode (outputB,INPUT);
   
   Serial.begin (9600);
   // Reads the initial state of the outputA
   aLastState = digitalRead(outputA);   
 } 

 void loop() { 
   aState = digitalRead(outputA); // Reads the "current" state of the outputA
   // If the previous and the current state of the outputA are different, that means a Pulse has occured
   if (aState != aLastState){     
     // If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
     if (digitalRead(outputB) != aState) { 
       counter ++;
     } else {
       counter --;
     }
     Serial.print("Position: ");
     Serial.println(counter);
   } 
   aLastState = aState; // Updates the previous state of the outputA with the current state
 }Code language: Arduino (arduino)

Описание кода: Итак, сначала нам нужно определить контакты, к которым подключен наш энкодер, и определить некоторые переменные, необходимые для программы. В разделе настройки нам нужно определить два контакта как входы, запустить последовательную связь для печати результатов на последовательном мониторе, а также прочитать начальное значение выхода A и поместить значение в переменную aLastState.

Затем в секции цикла мы снова читаем вывод A, но теперь мы помещаем значение в переменную aState. Таким образом, если мы вращаем энкодер и генерируется импульс, эти два значения будут различаться, и первое утверждение «если» станет истинным. Сразу после этого вторым оператором if мы определяем направление вращения. Если состояние выхода B отличается от состояния выхода A, счетчик будет увеличен на единицу, иначе он будет уменьшен. В конце, после вывода результатов на последовательный монитор, нам нужно обновить переменную aLastState с помощью переменной aState.

Это все, что нам нужно для этого примера. Если загрузить код, запустить последовательный монитор и начать вращать энкодер, мы начнем получать значения в последовательном мониторе. Конкретный модуль, который у меня есть, делает 30 тактов за каждый полный цикл.

Подробнее:Ультразвуковой датчик HC-SR04 и Arduino — полное руководство

Пример 2. Управление шаговым двигателем с помощью энкодера

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

Вот исходный код этого примера:

/*     Stepper Motor using a Rotary Encoder
 *      
 *  by Dejan Nedelkovski, www.HowToMechatronics.com
 *  
 */

 #include <LiquidCrystal.h> // includes the LiquidCrystal Library 
 LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7) 

// defines pins numbers
 #define stepPin 8 
 #define dirPin  9
 #define outputA 10
 #define outputB 11

 int counter = 0;
 int angle = 0; 
 int aState;
 int aLastState;  
 
void setup() {
  // Sets the two pins as Outputs
  pinMode(stepPin,OUTPUT); 
  pinMode(dirPin,OUTPUT);
  pinMode (outputA,INPUT);
  pinMode (outputB,INPUT);
  
  aLastState = digitalRead(outputA);
  lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display } 

}
void loop() {

  aState = digitalRead(outputA);
  
  if (aState != aLastState){     
     if (digitalRead(outputB) != aState) { 
       counter ++;
       angle ++;
       rotateCW();  
     }
     else {
       counter--;
       angle --;
       rotateCCW(); 
     }
     if (counter >=30 ) {
      counter =0;
     }
     
     lcd.clear();
     lcd.print("Position: ");
     lcd.print(int(angle*(-1.8)));
     lcd.print("deg"); 
     lcd.setCursor(0,0);
     
   }
  aLastState = aState;
}

void rotateCW() {
  digitalWrite(dirPin,LOW);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000); 
}
void rotateCCW() {
  digitalWrite(dirPin,HIGH);
    digitalWrite(stepPin,HIGH);
    delayMicroseconds(2000);
    digitalWrite(stepPin,LOW);
    delayMicroseconds(2000);   
}
Code language: Arduino (arduino)

Не стесняйтесь задавать любые вопросы в разделе комментариев ниже.


Производственный процесс

  1. Очередь C# с примерами:что такое очередь C# и как ее использовать?
  2. Управление серводвигателем с помощью Arduino и MPU6050
  3. Простое измерительное колесо с поворотным энкодером, сделанное своими руками
  4. u-blox LEA-6H 02 GPS-модуль с Arduino и Python
  5. Как читать температуру и влажность на Blynk с DHT11
  6. Насколько легко использовать термистор ?!
  7. Как создавать музыку с помощью Arduino
  8. Как использовать NMEA-0183 с Arduino
  9. Как использовать Modbus с Arduino
  10. Распознавание речи с помощью Arduino и BitVoicer Server