Оглавление:

Точечный сканер XYZ с использованием восстановленных поворотных энкодеров: 5 шагов
Точечный сканер XYZ с использованием восстановленных поворотных энкодеров: 5 шагов

Видео: Точечный сканер XYZ с использованием восстановленных поворотных энкодеров: 5 шагов

Видео: Точечный сканер XYZ с использованием восстановленных поворотных энкодеров: 5 шагов
Видео: Мраморный барельеф 3d модель STL 2024, Июль
Anonim
Сканер точки XYZ с использованием аварийных поворотных энкодеров
Сканер точки XYZ с использованием аварийных поворотных энкодеров

Приобретя на своем рабочем месте довольно большое количество выброшенных поворотных оптических энкодеров, я, наконец, решил сделать с ними что-нибудь интересное / полезное.

Недавно я купил себе дома новый 3D-принтер, и что может быть лучше 3D-сканера! Этот проект также предоставил мне прекрасную возможность использовать мой 3D-принтер для изготовления необходимых деталей.

Запасы

Оптические энкодеры и соответствующие оптические датчики

Arduino UNO

дополнительный щит для прототипирования

стальные рельсы

доступ к 3D-принтеру

Шаг 1: оптические энкодеры

Оптические энкодеры
Оптические энкодеры
Оптические энкодеры
Оптические энкодеры
Оптические энкодеры
Оптические энкодеры

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

Я использовал измеритель непрерывности, чтобы проследить схему подключения фотодатчиков.

Шаг 2: детали, напечатанные на 3D-принтере

Детали, напечатанные на 3D-принтере
Детали, напечатанные на 3D-принтере
Детали, напечатанные на 3D-принтере
Детали, напечатанные на 3D-принтере

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

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

Вы хотите, чтобы вал свободно скользил и проваливался через корпус, когда держите его вертикально, но при этом он должен оказывать на энкодер достаточное давление, чтобы не проскальзывать. Что сработало для меня, так это то, что ползун вала перекрывался с валом энкодера на 0,5 мм. Резина рогатки достаточно мягкая, чтобы деформироваться на такую величину и обеспечить хорошее сцепление с дорогой.

Шаг 3: Схема подключения

Схема подключения
Схема подключения

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

Я выбрал 5 мА для последовательно соединенных эмиттерных диодов, в этом конкретном энкодере падение напряжения на диодах составляет 3,65 В. Я использую источник питания 5 В от Arduino, что оставляет 1,35 В для резистора, при 5 мА получается 270 Ом.

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

Шаг 4: Код Arduino

Код Arduino
Код Arduino
Код Arduino
Код Arduino
Код Arduino
Код Arduino

Код нуждается в небольшом объяснении, поскольку его работа может быть не сразу очевидна, но его нужно было оптимизировать таким образом, чтобы можно было достаточно быстро обрабатывать 3 кодировщика.

Во-первых, мы хотим обработать данные направления только в том случае, если произошло изменение положения энкодера.

изменения = новое_значение ^ сохраненное значение;

Чтобы добиться большего разрешения от моих кодировщиков, мне пришлось обрабатывать как нарастающие, так и спадающие фронты.

На моей установке разрешение составляет 24 щелчка на 1 см.

Это оставляет нам несколько сценариев.

S1 - постоянный 0, а S2 переключается с 0 на 1.

S1 - постоянный 0, а S2 - от 1 до 0.

S1 - постоянная 1, а S2 - от 0 до 1.

S1 - постоянная 1, а S2 - от 1 до 0.

S2 является постоянным 0, а S1 переключается с 0 на 1.

S2 является постоянным 0, а S1 переключается с 1 на 0.

S2 - постоянная 1, а S1 переключается с 0 на 1.

S2 является постоянным 1, а S1 переключается с 1 на 0.

Эти условия лучше понятны в приведенных выше таблицах истинности, также каждое условие дает «направление», произвольно названное 0 или 1.

Графики дают нам две важные подсказки:

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

2) сама диаграмма представляет собой просто исключающее ИЛИ сигналов S1 и S2. (другая диаграмма НЕ этого).

Теперь понять код просто.

// параллельное чтение в ПОРТ // запоминаем, что соседние пары принадлежат одному и тому же состоянию кодировщика = PINB & 0x3f; // какие пины изменились, если есть diff = hold ^ state; // XOR смежных сигналов S1 и S2 для получения таблицы истинности // Самый простой способ - сделать копию текущего состояния // и сдвинуть ее вправо на один бит lookup = state >> 1; // теперь биты выровнены для XOR dir = lookup ^ state; // помните, что таблица должна быть инвертирована, если // один из входов остался постоянным, для этого нам не нужен оператор IF. В настоящее время бит желаемого направления // является правым битом каждой пары в переменной 'dir' // левый бит не имеет смысла // переменная 'diff' имеет бит, который изменил 'set' // поэтому мы либо имеем '01' или '10' // XOR с байтом 'dir' // либо инвертирует, либо нет значимый бит. dir ^ = diff; // теперь обновляем переменную удержания hold = state; // если для этого кодировщика изменился какой-либо бит if (diff & 0x03) {// определить направление if (dir & 0x01) {// на основе вашего аппаратного обеспечения и подключения ++ или - --z; } else {++ z; }} // то же самое в остальном if (diff & 0x0c) {if (dir & 0x04) {++ y; } else {--y; }} if (diff & 0x30) {if (dir & 0x10) {--x; } else {++ x; }}

Когда кнопка нажата, мы отправляем текущее значение XYZ в программу терминала.

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

Данные отправляются в виде сырых подсчетов. Вы можете посчитать и отправить данные в миллиметрах или дюймах и т. Д. Я считаю, что необработанные значения так же хороши, потому что мы можем масштабировать объект позже в программном обеспечении.

Шаг 5: Первое сканирование

Первое сканирование
Первое сканирование
Первое сканирование
Первое сканирование
Первое сканирование
Первое сканирование
Первое сканирование
Первое сканирование

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

Это обнуляет позицию как домашнюю.

Затем переместите зонд в место на цели, удерживайте его неподвижно и нажмите кнопку «снимок».

Для этого довольно большого образца я взял всего ~ 140 баллов, так что детализация конечного продукта оставляет желать лучшего.

Сохраните данные в файл. PCD и добавьте заголовок.

#. PCD v.7 - Формат файла данных облака точек ВЕРСИЯ.7 ПОЛЯ x y z РАЗМЕР 4 4 4 ТИП F F F COUNT 1 1 1 ШИРИНА (количество ваших баллов) ВЫСОТА 1 ТОЧКА ОБЗОРА 0 0 0 1 0 0 0 ОЧКОВ (количество ваших баллов)

Поместите количество очков в заголовок, это легко в любом редакторе, который предоставляет вам номера строк.

Над точками можно увидеть в freeCad, затем они экспортируются из freeCad как файл. PLY.

Откройте. PLY в MeshLab и выровняйте объект. Выполнено!!

Рекомендуемые: