Этот штангенциркуль я купил себе давным давно на ебее. Ну работал я им как все нормальные люди, а потом случайно наткнулся на 4-х пиновый разъем спрятанный под крышечкой. Ну и разумеется у меня возникло желание узнать для чего всё это надо. Как в последствии оказалось через этот интерфейс штангенциркуль непрерывно посылает результаты своих измерений. Вооружившись паяльником и осциллографом я стал раскуривать протокол по которому наш девайс шлёт данные. И вот что из этого получилось.

Интерфейс у него состоит из 4-х проводников. Питание (1.5в), клок, данные, земля. Разумеется нам надо три последних, ибо полтора вольта питания нам ни к чему. Изобретать свой разъем мне было лениво, и я взял паяльник и просто подпаялся к контактным площадкам.  Распиновка разъема моего штангенциркуля такая:

Если у вас немного другой штангенциркуль, то лучше самому проверить осциллографом где какой сигнал. А то мало ли чего там китайцы намудрили, я например встречал в сети другие распиновки. Ну а если нет осциллографа то методом научного тыка. Землю легко найти просто прозвонив по очереди каждый из четырёх контактов и минусовой контакт к которому подключается батарейка. И когда будете паять проводки то лучше вытащить её на всякий случай. Ну вот казалось бы теперь остается только подключить его к контроллеру, и с аппаратной частью на этом всё. Ан нет! Есть проблемка с логическими уровнями. Максимум что может выдать штангенциркуль с его крохотной батареечкой это полтора вольта. До логической единицы явно не дотягивает. Поэтому я решил усилить логическую единицу до пяти вольт при помощи несложной схемки на двух транзисторах:

Конечно данная схема инвертирует сигнал, но нас это мало волнует т.к. прошивку мы пишем сами и учесть в ней инверсию сигнала совсем не сложно. Использовать мегу32 для такого проекта слишком жирно. Хватит и обычной тини2313 с тактированием от кварца. Если затактировать от встроенного RC генератора, то могут возникнуть проблемы с передачей данных через UART. При изменении температуры или напряжения питания, частота этого генератора будет плавать и соответственно данные будут передаваться в компьютер с ошибками. В моей версии я использовал обычный COM порт. При желании можно выкинуть весь преобразователь RS-232 <-> UART на микросхеме max232 и поставить вместо него USB <-> UART. Например, вот такой у меня уже давно работает в отладчике JTAG ICE. Теперь с аппаратной частью покончено и настало время поговорить о протоколе по которому штангенциркуль выдает данные. По началу он взорвал мне мозг, а потом оказалось что всё очень просто. Для начала посмотрим на осциллограмму:

Не трудно догадаться что верхний сигнал это данные, а нижний тактовый сигнал.  Паузы через каждые 4 бита ввели меня в заблуждение, я аццки затупил и не догадался что это самый обычный SPI!  И в результате сам того не осознавая замутил программную реализацию этого интерфейса :-)  Такие посылки данных штангенциркуль выдает 4 раза в секунду. Каждая посылка состоит из 3 байт. Сначала передается младший байт. Внутри байта порядок следования бит тоже начинается с младшего. Первым приходит младший бит а затем страшие.  Первые два байта содержат непосредственно данные об измерениях в сотых долях миллиметра. Третий байт содержит бит-признак отрицательного числа. На осциллограмме штангенциркуль передает число 6,75 мм. Как получить это число: Для начала вспомним, что считанные данные нужно инвертировать . В результате  из считанного 00111010 10111111 11111111 получаем 11000101 01000000 00000000. Старший байт сразу можно отбросить, так как его  4-й бит сброшен, а значит результат измерений положительный. Вспоминаем, что порядок байт и бит внутри них обратный. Переворачиваем и получаем 00000010 10100011. Теперь переводим это в десятичную систему счисления и получаем число 675. Делим его на сто и получаем результат в миллиметрах. По идее можно уже в виде этих трех байт передавать результаты в комп, и заставить его расшифровывать их, но я пошел дальше и сделал вывод в нормальном виде. Результаты измерений можно просматривать в любой терминальной программе хоть в Hyper Terminal. Нужно только поставить правильный номер COM порта и выбрать скорость 9600. Стоит отметить что выдача результатов измерения происходит не постоянно, а только когда результат нового измерения отличается от предыдущего. Для более удобного просмотра результатов измерений был написан небольшой софт. По идее, он готов показать всё что приходит в порт. Сам порт нужно предварительно выбрать в окне настроек которое вызывается щелчком по главному окну программы:

Ну а для тех кому мало картинок и фотографий то вот еще небольшой ролик показывающий как оно работает:

А зачем это вообще нужно? Хм… хороший вопрос ! Я делал это just for fun, ну а на практике такое может пригодится например в самодельных станках с ЧПУ, ну или еще где-нибудь где нужно цифровое измерение чего либо. Варианты применения, вопросы и предложения принимаются в комментариях.

Скачать исходник прошивки+программу