Подключение энкодера

Здравствуйте, имеется энкодер
Autonics E40H8-2048-6-L-5 (документация https://docs.google.com/viewerng/viewer?url=http://z.compel.ru/item-pdf/42817991afce7d3c958170f4caae38af/pf/autonics~e40.pdf). Требуется подключить его к wirenboard.

Что я сделал уже. Запитал энкодер от БП 5V, плюс на коричневый провод, минус на синий. Дальше подключил черный тонкий провод к input входу A1 wirenboard. И ничего не заработало (в веб интерфейсе wirenboard есть возможность смотреть есть сигнал на входе или нет. он постоянно включался и выключался очень быстро, но энкодер оставался в неподвижном положении). Подозреваю, что надо что-то еще подключить.

Черный толстый провод это земля? его надо подключать в ground wirenboard или в ground блока питания?

Разобрался. Запитал энкодер от wirenboard (от 5вольтового выхода и земли), подключил черный тонкий провод в A1 и теперь получаю 0 1. Но есть проблема, данные приходят с задержкой (если сразу много крутить энкодер). А надо чуть ли не тик в тик.
Читаю с помощью python, mqtt. Есть ли способ читать быстрее?
Код python:

import paho.mqtt.client as mqtt
class Encoder:
def init(self, address):
self.ticks = 0
self.address = address

def start(self):
    self.client = mqtt.Client()
    self.client.on_connect = self.onconnect
    self.client.on_message = self.onmessage
    self.client.connect('localhost', 1883, 60)
    self.client.subscribe(self.address)
    self.client.loop_start()

def stop(self):
    self.client.loop_stop()
    self.client.unsubscribe(self.address)


def onconnect(self, client, userdata, flags, rc):
    if rc == 0:
        self.connected = True
    else:
        raise ValueError('Can not connect to encoder')

def onmessage(self, client, userdata, message):
    if message.payload == "1":
        self.ticks += 1

def getticks(self):
    return self.ticks

def wait(self, count):
    while self.ticks < count:
        pass

Какое именно временное разрешение вам нужно?

Энкодер стоит на вале двигателя. За раз надо будет крутиться двигатель где то на 25 тиков энкодера. Погрешность 1-2 тика нормально.
1 мс нереально, как я понимаю?
Какое максимальное разрешение я смогу получить? и как?

Задача нестандартная, поэтому решается сложно. Нужны будут серьёзные знания ОС и навыки программирования.
Прецеденты, впрочем, были.

Два самых простых варианта:

  1. Берёте ядерный модуль lirc_pwm, активируете его на GPIO, соответствующем A1_IN, собираете данные в виде: “нолик 100мкс, единичка 120мкс, нолик 70мкс”, и т.д.
    Начать можно здесь..
    Вместо пересборки Device Tree для активации драйвера на ножке можно воспользоваться device tree overlay (смотреть в сторону исходников wb-hwconf-manager, команда wb-hwconf-helper load-overlay"

  2. Можете через ядерный интерфейс epoll в пользовательской программе получать прерывания и с ними работать.
    Можно даже на Python, хотя лучше на C.

Для python делаете

from WB_IO import GPIO
...
GPIO.setup()
GPIO.wait_for_edge()
...

примеры можно поискать у нас на гитхабе

ещё пример тут: https://github.com/contactless/wiegand-linux

В обоих случаях нужно отключить GPIO от драйвера wb-homa-gpio

На С или на Python не важно, могу переписать, если понадобится.
Правильно ли я понимаю, что:

  1. отключение GPIO от драйвера wb-homa-gpio = service wb-homa-gpio stop ?
  2. Используя второй вариант, в setup я передаю первым параметром число 126, соответствующее согласно таблице http://contactless.ru/wiki/index.php/Wiren_Board_5.8:Список_GPIO входу A1 (in)?
  3. Надо ли при работе со вторым вариантом export’тить или, наоборот, unexport’тить 126 gpio согласно статье http://contactless.ru/wiki/index.php/Работа_с_GPIO?

лучше убрать соответствующий вход из /etc/wb-homa-gpio.conf и перезагрузить wb-homa-gpio

да[quote=“vicgerrard2604, post:7, topic:984”]
3. Надо ли при работе со вторым вариантом export’тить или, наоборот, unexport’тить 126 gpio согласно статье
[/quote]

надо делать export, setup() из пункта выше это делает сам.

Это оказалось не так, на самом деле число 6.

Попробовал, не хватает скорости. Решил попробовать через /dev/mem считывать согласно второй части этой статье http://www.black-swift.com/wiki/index.php?title=Working_with_GPIOs_(C/C%2B%2B)
Какой базовый адрес (GPIO_ADDR) мне использовать? При это gpio так же остается равным 6?

Попробуйте на C, покажите код, расскажите как вы понимаете, что не хватает скорости.

Этот “способ” зависит от конкретного процессора, и там не только GPIO_ADDR зависит от процессора, но и всё осталоьное. Возможны спецэффекты. Помогать не буду, если всё равно решите сами так делать, то читайте MCIMX28RM.pdf