Подключение цифрового штангенциркуля

iamviscount
Offline
Зарегистрирован: 23.07.2013

Здравствуйте!

Несколько дней назад в руки попался цифровой штангенциркуль с разъемом для вывода измерений. Решил подключить его к компьютеру через аналог платы Arduino (полностью совместимую). Штангенциркуль посылает данные в виде 2-х 24-битов, с паузой между ними в 110 микросекунд. График сигнала выглядит следующим:

Подключил штангенциркуль таким образом:

В скетч залил следующий код:

#define F_CPU 16000000UL
#define CLOCK 2
#define DATA 4
#define TIMEOUT 200

volatile int bit_number = 0;
volatile unsigned long abs_value = 0;
volatile unsigned long rel_value = 0;
volatile unsigned long last_interrupt = 0;
volatile unsigned long present_interrupt = 0;

void setup()
{
  Serial.begin(115200);
  pinMode(CLOCK, INPUT);
  pinMode(DATA, INPUT);
  attachInterrupt(0, int0_interrupter, RISING);
  Serial.println("Connected.");
}

void int0_interrupter()
{
  last_interrupt = present_interrupt;
  present_interrupt = micros();
  if(bit_number <= 23)
  {
    if((~PIND) & (1 << DATA))
    {
      abs_value |= (1 << bit_number);
    }
  }
  else
  {
    if((~PIND) & (1 << DATA))
    {
      rel_value |= (1 << bit_number);
    }
  }
  bit_number++;
}

void loop()
{
  if(bit_number == 48)
  {
    Serial.print(abs_value);
    Serial.print(" - ");
    Serial.println(rel_value);
    abs_value = 0;
    rel_value = 0;
    bit_number = 0;
  }
  else
  {
    if((present_interrupt - last_interrupt) >= TIMEOUT)
    {
      abs_value = 0;
      rel_value = 0;
      bit_number = 0;
    }
  }
}

В итоге, Arduino ловит совершенно невменяемые данные. Подозреваю, что не выходит попасть на стартовый бит.

Уважаемые, знатоки, укажите пожалуйста на ошибки, либо посоветуйте в какую сторону "копать".

maksim
Offline
Зарегистрирован: 12.02.2012

iamviscount пишет:

Подключил штангенциркуль таким образом:

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

Может плюсовой вывод на разъеме не просто так присутствует, который у вас подключен в никуда, а нужен что бы питать сей интерфейс.

http://habrahabr.ru/post/133088/

 

Michal
Michal аватар
Offline
Зарегистрирован: 26.04.2013

на сколько знаю ко всяиким цифровым ШЦ есть родная прога для считывания показаний

iamviscount
Offline
Зарегистрирован: 23.07.2013

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

В своей же схеме, для согласования логических уровней использовал триггер Шмитта - CD74ACT14E. Он на выходе дает четкие импульсы в 4,8 Вольта. Контакт "Питание +" не использовал, т.к. штангенциркуль питается от своей батареи SR44. Мои подозрения - Arduino не успевает считывать данные. Такое возможно?

maksim
Offline
Зарегистрирован: 12.02.2012

iamviscount пишет:

В своей же схеме, для согласования логических уровней использовал триггер Шмитта - CD74ACT14E.

С чего бы вдруг триггер Шмитта вам должен согласовывать уровни??? Для согласования можно поствить пару ОУ, но никак не триггер Шмитта.

iamviscount пишет:

Мои подозрения - Arduino не успевает считывать данные. Такое возможно?

Нет не может.

iamviscount пишет:

Контакт "Питание +" не использовал, т.к. штангенциркуль питается от своей батареи SR44. 

Перечитайте еще раз сообщение #1 и не поленитесь перейти по ссылке, прочитать статью и перейти по ссылке на которую ссылается автор и почитайте как проще всего правильно согласовать уровни дуины со штангенциркулем http://www.instructables.com/id/Reading-Digital-Callipers-with-an-Arduino-USB/?ALLSTEPS.

 

iamviscount
Offline
Зарегистрирован: 23.07.2013

Однако ж поднимает логическую "1" до оптимальной для Arduino. Единственное, иногда появляется "хвост" у тактового сигнала (CLK), длинной около 100 микросекунд и амплитудой до 2 Вольт. Но подобный глюк нахожу и на контакте самого штангенциркуля (разумеется с соответствующей амплитудой - около 0,5 Вольта).