Arduino и RS422 энкодер
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Arduino и RS422 энкодер
Попробуй увеличивать количество импульсов - там в конце блока данных будет нулевой бит, а если продолжать дальше увеличивать, то пойдёт повтор этого блока.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
Спасибо. Увеличил количество импульсов. Пока стабильно переходит в 1.
Даже время записи анализатора увеличил до 5 секунд. Нолика не заметил.
Надеюсь нормально будет. Прилагаю скрины.
Записывал 100секунд(максимальное время в анализаторе) -полёт нормальный. на втором вложил скрин монитора порта, результат преобразования даты в десятичную цифру-смотрим на длинную. Короткая-попытка превратить её в милиметры. прикладываю весь скетч. Правильно ли происходит считывание бит? (убрал гору коментов, что то тут совсем не смотриться)))
const int CLOCK_PIN = 11; // к пину 11 подключаем CLK
const int DATA_PIN = 10; // к пину 10 подключаем DO data
unsigned long sample1; //создали пременую с именем sample1 которая может содержать отчень большое число
unsigned long mm; //создали переменную mm-попытка получить градусное значение в милиметры
void setup() {
pinMode(DATA_PIN, INPUT); //назначили 10 пин как пин для выхода данных
pinMode(CLOCK_PIN, OUTPUT); //назначили 11 пин как пин для выхода данных
//give some default values- задайте значения по умолчанию
digitalWrite(CLOCK_PIN, HIGH); // при старте ардуины 11 пин установлен на высокий уровень (1)
Serial.begin(19200); //запусаем монитор порта на скорости 19200
}
void loop() {
unsigned long reading = readPosition(); //создаем переменную reading и тут-же считыываем ее значение из функции readPosition();
Serial.println(reading, DEC); //печатаем значение переменной reading в формате DEC .
delay(40); //задержка на 20 микросекунд
}
//прочитать текущее угловое положение
int readPosition() { // это функция, набор команд, в которой вычесляется значение переменной reading
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, 24); //24считывем значение и записываем его в переменную sample1
delayMicroseconds(1); // часов высок на 20 микросекунд прежде чем новый образец можно принять
unsigned long mm = sample1/223; //попытка перевести в миллиметры
Serial.println(mm, DEC); //распечатал
return sample1; //а если равны возвращаем значение sample1
}
// чтение байта данных из цифрового входа платы.
unsigned long shiftIn(const int DATA_PIN, const int CLOCK_PIN, const int bit_count) { // опять создали
unsigned long data = 0; //создали переменную data и приравняли ее к 0
for (int i=0; i<26; i++) { //24 раз записываем в 11 пин то 0 то 1 через 1 микросекунду со здвигом переменной data в лево на еденицу24
data <<= 1; //сдвигает переменную data влево на 1
digitalWrite(CLOCK_PIN, LOW); // записываем ноль
delayMicroseconds(2); //задержка на 1 микросекунду
digitalWrite(CLOCK_PIN, HIGH); // записываем ноль
delayMicroseconds(1); //задержка на 1 микросекунду
data |= digitalRead(DATA_PIN); //считываем значение с 9 пина и записывае его в переменную data со сдвигом
}
return data; //возвращает значение переменной data
}
Пы.Сы. Я сейчас смотрю цифры с монитора порта. Отключаю питание энкодера(24в), питание Arduino не отключаю. Цифры во время выключения превращаються в нули, а потом в какую то другую. Чё за хрень, энкодер как и положенно не выдаёт ничего(анализатор подтверждает), а циферки не в нолях
.
Гдето в скетче засада есть.
Даже время записи анализатора увеличил до 5 секунд. Нолика не заметил.
Надеюсь нормально будет. Прилагаю скрины.
Записывал 100секунд(максимальное время в анализаторе) -полёт нормальный. на втором вложил скрин монитора порта, результат преобразования даты в десятичную цифру-смотрим на длинную. Короткая-попытка превратить её в милиметры. прикладываю весь скетч. Правильно ли происходит считывание бит? (убрал гору коментов, что то тут совсем не смотриться)))
const int CLOCK_PIN = 11; // к пину 11 подключаем CLK
const int DATA_PIN = 10; // к пину 10 подключаем DO data
unsigned long sample1; //создали пременую с именем sample1 которая может содержать отчень большое число
unsigned long mm; //создали переменную mm-попытка получить градусное значение в милиметры
void setup() {
pinMode(DATA_PIN, INPUT); //назначили 10 пин как пин для выхода данных
pinMode(CLOCK_PIN, OUTPUT); //назначили 11 пин как пин для выхода данных
//give some default values- задайте значения по умолчанию
digitalWrite(CLOCK_PIN, HIGH); // при старте ардуины 11 пин установлен на высокий уровень (1)
Serial.begin(19200); //запусаем монитор порта на скорости 19200
}
void loop() {
unsigned long reading = readPosition(); //создаем переменную reading и тут-же считыываем ее значение из функции readPosition();
Serial.println(reading, DEC); //печатаем значение переменной reading в формате DEC .
delay(40); //задержка на 20 микросекунд
}
//прочитать текущее угловое положение
int readPosition() { // это функция, набор команд, в которой вычесляется значение переменной reading
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, 24); //24считывем значение и записываем его в переменную sample1
delayMicroseconds(1); // часов высок на 20 микросекунд прежде чем новый образец можно принять
unsigned long mm = sample1/223; //попытка перевести в миллиметры
Serial.println(mm, DEC); //распечатал
return sample1; //а если равны возвращаем значение sample1
}
// чтение байта данных из цифрового входа платы.
unsigned long shiftIn(const int DATA_PIN, const int CLOCK_PIN, const int bit_count) { // опять создали
unsigned long data = 0; //создали переменную data и приравняли ее к 0
for (int i=0; i<26; i++) { //24 раз записываем в 11 пин то 0 то 1 через 1 микросекунду со здвигом переменной data в лево на еденицу24
data <<= 1; //сдвигает переменную data влево на 1
digitalWrite(CLOCK_PIN, LOW); // записываем ноль
delayMicroseconds(2); //задержка на 1 микросекунду
digitalWrite(CLOCK_PIN, HIGH); // записываем ноль
delayMicroseconds(1); //задержка на 1 микросекунду
data |= digitalRead(DATA_PIN); //считываем значение с 9 пина и записывае его в переменную data со сдвигом
}
return data; //возвращает значение переменной data
}
Пы.Сы. Я сейчас смотрю цифры с монитора порта. Отключаю питание энкодера(24в), питание Arduino не отключаю. Цифры во время выключения превращаються в нули, а потом в какую то другую. Чё за хрень, энкодер как и положенно не выдаёт ничего(анализатор подтверждает), а циферки не в нолях
Гдето в скетче засада есть.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino и RS422 энкодер
Случайно не в 16777215 ?Кулибин1437 писал(а): Отключаю питание энкодера(24в), питание Arduino не отключаю. Цифры во время выключения превращаються в нули, а потом в какую то другую.
Последний раз редактировалось Сергей Саныч 30 янв 2019, 14:02, всего редактировалось 1 раз.
Чудес не бывает. Бывают фокусы.
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
неа, печатает в данный момент 67108863. а с питанием 39015906 при вращении энкодера-меняется.
И также 67108863-когда пин дата вытащен из ардуинки
И также 67108863-когда пин дата вытащен из ардуинки
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino и RS422 энкодер
То есть 2^26-1. А должно быть 16777215 = 2^24-1.Кулибин1437 писал(а):неа, печатает в данный момент 67108863
Подозреваю, что первый и последний биты данных последовательности надо проигнорировать.
У вас, когда включен энкодер, при вращении получаются только четные значения?
Чудес не бывает. Бывают фокусы.
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
в виду того что дата при 24 нестабильно себя вёл то в 1 то 0,между пачками импульсов, вынужден был добавить до 26. Теперь это как раз и мешает правильно считать. Каким то образом куда то игнор надо вставить последних 2 бит или первых, незнаю.
int readPosition() { // это функция, набор команд, в которой вычесляется значение переменной reading
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, 24); //24считывем значение и записываем его в переменную sample1
delayMicroseconds(1); // часов высок на 20 микросекунд прежде чем новый образец можно принять
unsigned long mm = sample1/223; //попытка перевести в миллиметры
Serial.println(mm, DEC); //распечатал
return sample1; //а если равны возвращаем значение sample1
}
// чтение байта данных из цифрового входа платы.
unsigned long shiftIn(const int DATA_PIN, const int CLOCK_PIN, const int bit_count) { // опять создали
unsigned long data = 0; //создали переменную data и приравняли ее к 0
for (int i=0; i<26; i++) { //24 раз записываем в 11 пин то 0 то 1 через 1 микросекунду со здвигом переменной data в лево на еденицу24
data <<= 1; //сдвигает переменную data влево на 1
digitalWrite(CLOCK_PIN, LOW); // записываем ноль
delayMicroseconds(2); //задержка на 1 микросекунду
digitalWrite(CLOCK_PIN, HIGH); // записываем ноль
delayMicroseconds(1); //задержка на 1 микросекунду
data |= digitalRead(DATA_PIN); //считываем значение с 9 пина и записывае его в переменную data со сдвигом
}
return data; //возвращает значение переменной data
}
нет всякие и чётные и не чётные
int readPosition() { // это функция, набор команд, в которой вычесляется значение переменной reading
unsigned long sample1 = shiftIn(DATA_PIN, CLOCK_PIN, 24); //24считывем значение и записываем его в переменную sample1
delayMicroseconds(1); // часов высок на 20 микросекунд прежде чем новый образец можно принять
unsigned long mm = sample1/223; //попытка перевести в миллиметры
Serial.println(mm, DEC); //распечатал
return sample1; //а если равны возвращаем значение sample1
}
// чтение байта данных из цифрового входа платы.
unsigned long shiftIn(const int DATA_PIN, const int CLOCK_PIN, const int bit_count) { // опять создали
unsigned long data = 0; //создали переменную data и приравняли ее к 0
for (int i=0; i<26; i++) { //24 раз записываем в 11 пин то 0 то 1 через 1 микросекунду со здвигом переменной data в лево на еденицу24
data <<= 1; //сдвигает переменную data влево на 1
digitalWrite(CLOCK_PIN, LOW); // записываем ноль
delayMicroseconds(2); //задержка на 1 микросекунду
digitalWrite(CLOCK_PIN, HIGH); // записываем ноль
delayMicroseconds(1); //задержка на 1 микросекунду
data |= digitalRead(DATA_PIN); //считываем значение с 9 пина и записывае его в переменную data со сдвигом
}
return data; //возвращает значение переменной data
}
нет всякие и чётные и не чётные
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
Это с отключенной датой или равносильно с отключенным энкодером. а это с подключенным, то есть считает.Сергей Саныч писал(а):То есть 2^26-1. А должно быть 16777215 = 2^24-1.
Правда до завершения ещё пыхтеть и пыхтеть
Надо подключить индикатор со своей програмкой и туда передавать инфу, придумать как менять коефициент для пересчёта в миллиметры, причём чтоб клиент мог сам его менять. И чтобы тайминг не перескочил за требуемые параметры
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
С этой DATA пока не всё решено, ну или с преобразованием в десятичное значение. Дело в том что, насколько я помню энкодер за оборот должен выдавать 4096 импульсов, по крайней мере заказывал такой.
А по факту разница в цифрах между оборотами таковы:
6156
6126
260098
2060
10137
6048
чегото я ещё не понимаю
Скидку наверное можно давать на неточность вращения в пределах пусть 200 единиц, а тут гораздо выше.
Почему обратил внимание. Хотел пытаться отмотать до нуля энкодер и увидел это дело...
К стати я у энкодера не применял выход DIR и MIDP(почему то так написано на нём). Что с ними делать. Может и их подключить. Это вроде как направление или ни так???
Придётся читать мануал, учи матчасть
, чтото про них написано на непонятном аглицком 
По сути мне кажется что эти сигналы не должны влиять на отчёт?
6156
6126
260098
2060
10137
6048
чегото я ещё не понимаю
Скидку наверное можно давать на неточность вращения в пределах пусть 200 единиц, а тут гораздо выше.
Почему обратил внимание. Хотел пытаться отмотать до нуля энкодер и увидел это дело...
К стати я у энкодера не применял выход DIR и MIDP(почему то так написано на нём). Что с ними делать. Может и их подключить. Это вроде как направление или ни так???
Придётся читать мануал, учи матчасть
По сути мне кажется что эти сигналы не должны влиять на отчёт?
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino и RS422 энкодер
А эта функция точно возвращает только 0 или 1? Не может ли быть мусора в старших разрядах?Кулибин1437 писал(а):data |= digitalRead(DATA_PIN);
я бы для надежности попробовал
Код: Выделить всё
data |= digitalRead(DATA_PIN) & 1;Чудес не бывает. Бывают фокусы.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino и RS422 энкодер
Пометки красным соответствуют вашему энкодеру?Кулибин1437 писал(а):по крайней мере заказывал такой
Чудес не бывает. Бывают фокусы.
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
Спасибо. Попробовал. без разницы
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
ага, опа кроме выхода не RS485 а SG=SSIСергей Саныч писал(а):Пометки красным соответствуют вашему энкодеру?
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino и RS422 энкодер
При малых (доли градуса) поворотах как меняются показания? Приведите примеры (скриншоты).
На неподвижном энкодере показания стабильны?
На неподвижном энкодере показания стабильны?
Чудес не бывает. Бывают фокусы.
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
иногда последний знак скачет, а так в основном цифра не меняется.
от нуля. минус 0,25 оборота плюс 0,25 оборота ща пробую видео закинуть и ссылку скину
у меня через флешку, интернет прям -пуля.
https://yadi.sk/i/XwXDirQyXEVfRw
DIR и MIDP- про них читал чита, так и не понял, это входы или выходы. Если правильно понял то MIDP какfя то обнулялка, то есть вход?
от нуля. минус 0,25 оборота плюс 0,25 оборота ща пробую видео закинуть и ссылку скину
у меня через флешку, интернет прям -пуля.
https://yadi.sk/i/XwXDirQyXEVfRw
DIR и MIDP- про них читал чита, так и не понял, это входы или выходы. Если правильно понял то MIDP какfя то обнулялка, то есть вход?
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino и RS422 энкодер
Попробуй задействовать контакт MidP. Высокий уровень сбрасывает энкодер в "среднюю" позицию, низкий - позволяет считать. Если сейчас он никуда не подключен, могут быть "нюансы", особенно если этот вход внутри никуда не подтянут.
Чудес не бывает. Бывают фокусы.
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
к плюсу-ничего не считает, показания не меняються.
К минусу-показания изменились(похоже действительно сбросился в какуто цифру.
зато фокус появился.
обнулил. повернул четверть оборота против часовой И по часовой полоборота
Цифры после перскакивания нуля резко меняют показания.
А вот когда смотришь на нолики и единички, их переполнение, перескакивание происходит вроде как в книжках, всё замечательн(смотрел ещё до этого)
К минусу-показания изменились(похоже действительно сбросился в какуто цифру.
зато фокус появился.
обнулил. повернул четверть оборота против часовой И по часовой полоборота
Цифры после перскакивания нуля резко меняют показания.
А вот когда смотришь на нолики и единички, их переполнение, перескакивание происходит вроде как в книжках, всё замечательн(смотрел ещё до этого)
Последний раз редактировалось Кулибин1437 31 янв 2019, 15:05, всего редактировалось 3 раза.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino и RS422 энкодер
Что-то попутано, картинки 1 и 3 идентичны, у них даже время совпадает.
И еще - в документации заявлен контроль четности, но где этот бит - не сказано.
И еще - в документации заявлен контроль четности, но где этот бит - не сказано.
Чудес не бывает. Бывают фокусы.
-
Кулибин1437
- Новичок
- Сообщения: 35
- Зарегистрирован: 11 янв 2019, 07:51
- Репутация: 0
- Настоящее имя: Эдуард
- Откуда: г.Уфа
- Контактная информация:
Re: Arduino и RS422 энкодер
а это не провод DIR c энкодера-который в воздухе висит пока что.Сергей Саныч писал(а):И еще - в документации заявлен контроль четности, но где этот бит - не сказано.
Или мне к китайцам, пытать их, куда они спрятали его, в смысле бит.
добавлю. Поймал момент перехода через обнулённую точку. Кстати второй бит слева, возможно он о направлении говорит. Я как раз менял направление, в этот момент цифры резко меняються как раз
Последний раз редактировалось Кулибин1437 31 янв 2019, 15:18, всего редактировалось 2 раза.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Arduino и RS422 энкодер
Вряд ли. Он где-то среди битов данных.Кулибин1437 писал(а):а это не провод DIR c энкодера
DIR - это направление, его, кстати, тоже надо фиксировать.
Вообще, документация достаточно мутная.
Попробуй снять несколько замеров не удаляя "лишних" битов. То есть выведи все 26. Посмотрим.
Последний раз редактировалось Сергей Саныч 31 янв 2019, 15:20, всего редактировалось 1 раз.
Чудес не бывает. Бывают фокусы.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5183
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Arduino и RS422 энкодер
Там похоже не обычное число, а код Грея...
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...