Доброй ночи. Сегодня притащил с работы энкодер, подключил, все работает как часы. Появилось пару коротких вопросов. 1. Mega 2560, достаточно производительности для обработки 3 энкодеров одновременно. Инкрементальный энкодер с разрешением 1000-2000? 2. Может у кого-то был опыт, каких фирм лучше использовать с демократичным ценообразованием?
Что-то я заработался, уже пора отдыхать. Тем более, что закупить комплектующие уже не успею. В лучшем случае придут в середине января. По первому вопросу, если не прокатит, буду использовать программируемые счетчики импульсов, без ардуины. Сам не разбираюсь в них, но меня убедили, что сделают. По энкодерам нашел интересную фирму Autonics, занимается пром. электроникой, очень большой ассортимент, но ни когда не сталкивался. Есть забавная фирма YUMO, забавная она тем, что заботливо позаимствовала внешний дизайн 1 в 1 с энкодеров OMRON, а судя по документации и внутренности тоже. Если скопировали хорошо, то хорошие пром. энкодеры серии OMRON E6B2, который подключал вчера. В России YUMO стоит не сильно дешевле Autonics. Но этот только в России, кому интересно погуглите, вот к примеру их творение A6B2-CWZ3E-1024.
Вдруг, кому-то будет интересно. Mega 2560 без проблем тянет 3 энкодера с разрешением 1000 импул. В режиме 1/4T, то есть с каждого энкодера получаю по 4000 импул.
а какова скорость вращения энкодеров?(какая максимальная частота сигнала) есть такая http://www.pjrc.com/teensy/td_libs_Encoder.html библиотека может еще какими ссылками поделитесь...
Извините за задержку, много работы, сейчас выпускается ТПА на ардуине. Использую Omron E6B2CWZ6C в этом проекте, до 6000 r/min. Отображение движения стола фрезерного станка. Мой энкодер с NPN открытым коллектором. Для такого чтобы заработал, пришлось включить подтягивающий резистор, в настройках. Код (Text): // then the encoder inputs pinMode(encoder1PinA, INPUT); pinMode(encoder1PinB, INPUT); // enable pullup as we are using an open collector encoder digitalWrite(encoder1PinA, HIGH); digitalWrite(encoder1PinB, HIGH); По этой ссылке энкодеры другого типа, не такие как у меня. Их ни когда не использовал, увы не знаю. Но принцип, думаю у них одинаковый. Пользовался примерами от сюда http://playground.arduino.cc/Main/RotaryEncoders Вот код взятый из ссылки выше (после заголовка Interrupt Example (the Encoder interrupts the processor). Uses both Interrupt pin). На 1 энкодер используется 2 прерывания. Код (Text): #define encoder0PinA 2 #define encoder0PinB 3 volatile unsigned int encoder0Pos = 0; void setup() { pinMode(encoder0PinA, INPUT); pinMode(encoder0PinB, INPUT); // encoder pin on interrupt 0 (pin 2) attachInterrupt(0, doEncoderA, CHANGE); // encoder pin on interrupt 1 (pin 3) attachInterrupt(1, doEncoderB, CHANGE); Serial.begin (9600); } void loop(){ //Do stuff here } void doEncoderA(){ // look for a low-to-high on channel A if (digitalRead(encoder0PinA) == HIGH) { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinB) == LOW) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } else // must be a high-to-low edge on channel A { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinB) == HIGH) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } Serial.println (encoder0Pos, DEC); // use for debugging - remember to comment out } void doEncoderB(){ // look for a low-to-high on channel B if (digitalRead(encoder0PinB) == HIGH) { // check channel A to see which way encoder is turning if (digitalRead(encoder0PinA) == HIGH) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } // Look for a high-to-low on channel B else { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinA) == LOW) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } } С ней не знаком, ни чего сказать не могу. Будут вопросы спрашивайте, интересный по ссылке энкодер, хотелось бы понять его возможности.
Да принцип у них один. Мои Omron E6B2CWZ6C 1000 им/на оборот, есть режимы T/4, T/8 (минусы данных режимов пока не обнаружил), но они дороговаты. Узнал, про такие https://www.sparkfun.com/products/9117 https://www.sparkfun.com/products/10984 Плохое разрешение импульсов на оборот, плохая точность. Но очень вкусная цена. Тот что по вашей ссылке http://www.robot-italy.com/en/amt102-v-quadrature-encoder.html Очень интересный энкодер. Возможность выбора кол-во импульсов от 48 до 2048. До 30000 r/min при 512 им/ на оборот. До 15000 r/min при 1024 им/ на оборот. До 7500 r/min при 2048 им/ на оборот. Так, что выбирайте от требований, удачи.
Добрый день! У меня оказалось в руках два энкодера Omron E6-B2-CWZ6C 1000 p/r и arduino duo. Решил их подсоединить к плате и заставить работать при помощи кода из Interrupt Example (the Encoder interrupts the processor). Uses both Interrupt pin. Но вылетает ошибка: a function-definition is not allowed here before '{' token. Как я понимаю текст программы не полный и я его должен дописать сам? Так ли это или я что-то не то делаю? PS Я фактически только начал разбираться с контроллерами и имею только некоторые базовые навыки, так что не судите строго)
День добрый. Вот код работающий на Megа 2560 именно для Вашего энкодера E6B2-CWZ6C, в режиме 1/4T. Код (Text): #define encoder0PinA 2 //keep this on and interrupt pin #define encoder0PinB 3 //keep this on and interrupt pin volatile long encoder0Pos; void setup () { Serial.begin(9600); // then the encoder inputs pinMode(encoder0PinA, INPUT); pinMode(encoder0PinB, INPUT); // enable pullup as we are using an open collector encoder digitalWrite(encoder0PinA, HIGH); digitalWrite(encoder0PinB, HIGH); // encoder pin on interrupt 0 (pin 2) attachInterrupt(0, encoderPinChangeA, CHANGE); // encoder pin on interrupt 1 (pin 3) attachInterrupt(1, encoderPinChangeB, CHANGE); encoder0Pos = 0; //reseet the encoder position to 0 } void loop() { //do stuff dependent on encoder position here //such as move a stepper motor to match encoder position //if you want to make it 1:1 ensure the encoder res matches the motor res by dividing/multiplying Serial.println(encoder0Pos); delay(100); } void encoderPinChangeA() { // look for a low-to-high on channel A if (digitalRead(encoder0PinA) == HIGH) { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinB) == LOW) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } else // must be a high-to-low edge on channel A { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinB) == HIGH) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } } void encoderPinChangeB() { // look for a low-to-high on channel B if (digitalRead(encoder0PinB) == HIGH) { // check channel A to see which way encoder is turning if (digitalRead(encoder0PinA) == HIGH) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } // Look for a high-to-low on channel B else { // check channel B to see which way encoder is turning if (digitalRead(encoder0PinA) == LOW) { encoder0Pos = encoder0Pos + 1; // CW } else { encoder0Pos = encoder0Pos - 1; // CCW } } } Due у меня нет, чтобы проверить. Но на сколько я знаю, в due изменена функция attachInterrupt, сейчас попробую найдти
Да там небольшие изменения. http://arduino.ua/ru/prog/AttachInterrupt То есть разница, что для due нужно указывать ножку, а не номер прерывания. UPD. Попробуйте код выше, поменяв в нем attachInterrupt(первый параметр - номер порта, остальное оставьте как есть)
Да чуть не забыл, будьте внимательны. Данный энкодер работает от 5 до 24 VDC. Можно ли питаться от Due у нее вроде только 3,3V. Лучше не рисковать, 1 блок на ардуину, 2 на исполнительные устройства. http://www.ia.omron.com/data_pdf/data_sheet/e6b2-c_dsheet_csm491.pdf Все, что знал рассказал, отрывали по работе, поэтому не в 1 посте. UPD. Добрался до дома, ошибся по поводу раб. характеристик, подправил сообщение. У меня отдельное питание на энкодеры, фазы идут на ардуино.
Добрый день! Прошу прощения за долгий ответ, только сегодня дошли руки подключить и проверить) Все работает, Большое Спасибо! По поводу Due - у нее есть 5 вольтовый выход. Пробовал пока по 1 подключать для проверки работоспособности. Прикрепляю схему с обозначением портов для Due http://www.robgray.com/temp/Due-pinout-WEB.png Когда буду собирать окончательно, запитаю энкодеры отдельно от контроллера, от греха подальше) Еще раз спасибо!
Не за что, тут все, помогают, чем могут. Отлично, бывает у самого, у самого 2 проекта лежат на полке руки не доходят. 1 с этими энкодерами, все не могу найти время разобрать станок и сделать механику. Не знал. Уже стоит в списке покупок. Правильно.
Я не электронщик и не программист. Может по-простому, чтоб понятно было- схема подключения и скетч Заранее спасибо.