Измерительная линейка

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Приветствую!

Пришла сегодня измерительная линейка, вот такая: https://ru.aliexpress.com/item/0-150-0-200-0-300-0-01/32852024126.html?spm=2114.13010708.0.0.751b33edzQ1iqL

Надумал оснастить бюджетным УЦИ школьный токарный. Всё бы хорошо, но дисплейчик у линейки мелковат, не феншуй. Перед тем, как расковыривать, интересуюсь: может, кто с подобным сталкивался/ковырял, на предмет выдаваемого с датчика сигнала? Линейка ни разу не оптическая, питание - от двух CR2032, по отзывам - работает и от одной, т.е. батареи тупо в параллель разведены.

Короче: если у кого будут любые годные мысли по поводу: стоит ли возиться, возможные подводные камни - горячо приветствую. Просто сходу не хочется из рабочего прибора сделать нерабочий :) А вот прикрутить туда семидюймовый TFT - очень хочется, в идеале.

Ы? Если получится - можно прошивку и в "Проекты" будет закинуть ;) Но пока - надо понять, что может поджидать за углом, что называется. Заранее благодарен.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Если аналогичная штангенциркулю, то код реализации здесь уже пробегал

int i;
int sign;
long value;
float result;
int clockpin = 4;
int datapin = 5;
unsigned long tempmicros;

void setup() {
  Serial.begin(9600);
  pinMode(clockpin, INPUT);
  pinMode(datapin, INPUT);
}

 void loop () {
  while (digitalRead(clockpin)==HIGH) {} //if clock is LOW wait until it turns to HIGH
  tempmicros=micros();
  while (digitalRead(clockpin)==LOW) {} //wait for the end of the HIGH pulse
  if ((micros()-tempmicros)>500) { //if the HIGH pulse was longer than 500 micros we are at the start of a new bit sequence
    decode(); //decode the bit sequence
  }
}

void decode() {
  sign=1;
  value=0;
  for (i=0;i<23;i++) {
    while (digitalRead(clockpin)==HIGH) { } //wait until clock returns to HIGH- the first bit is not needed
    while (digitalRead(clockpin)==LOW) {} //wait until clock returns to LOW
    if (digitalRead(datapin)==LOW) {
      if (i<20) {
        value|= 1<<i;
      }
      if (i==20) {
        sign=-1;
      }
    }
  }
  result=(value*sign)/100.00;
  Serial.print("Lenght: ");
  Serial.println(result,2); //print result with 2 decimals
  delay(1000);
}

Вскрывать коробку смотреть для начала питание на разъеме и останутся два сигнала

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

ua6em пишет:

Если аналогичная штангенциркулю, то код реализации здесь уже пробегал

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

Ещё раз гран мерси.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Да немае за што! Ждём ваших исследований! ВЫ первый, кто обзавелся данным девайсом

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Короче, вот что нашёл, сейчас изучаю: http://www.shumatech.com/web/21bit_protocol

Очень похоже, что и в штангенах, и в этих линейках - один протокол. интересно будет поковыряться, надо только бесхозный шнурок с USB разъёмом нужным пошукать - и можно будет поковырять. Пока для начала надо изучить информацию.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DIYMan пишет:

Короче, вот что нашёл, сейчас изучаю: http://www.shumatech.com/web/21bit_protocol

Очень похоже, что и в штангенах, и в этих линейках - один протокол. интересно будет поковыряться, надо только бесхозный шнурок с USB разъёмом нужным пошукать - и можно будет поковырять. Пока для начала надо изучить информацию.

более чем подозревал об этом )))

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Короче, ещё в 2012-м году Юрий Крушельнитский (не уверен, что правильно перевёл с латиницы) сделал проект по передаче инфы с линеек на андроид-устройства. Нарыл тестовый код опроса датчика линейки, он до тривиальности простой:

/*
 Reading Grizzly iGaging Digital Scales V2.1

 Created 19 January 2012
 Updated 03 April 2013
 by Yuriy Krushelnytskiy
 http://www.yuriystoys.com
 
 This example code is is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License. 
 */
 void tickTock();

int const clockPin = 2;

int const xDataPin = 3;
int const yDataPin = 4;
int const zDataPin = 5;

//variables that will store the readout
volatile long xCoord;
volatile long yCoord;
volatile long zCoord;

void setup() {         

  //clock pin should be set as output  
  pinMode(clockPin, OUTPUT); 
  
  //data pins should be set as inputs
  pinMode(xDataPin, INPUT);  
  pinMode(yDataPin, INPUT);  
  pinMode(zDataPin, INPUT);  
  
  //initialize serial port
  Serial.begin(9600);
}



void loop() {
  
  xCoord = 0;
  yCoord = 0;
  zCoord = 0;
  
  int bitOffset;
  
  //read the first 20 bits
  for(bitOffset = 0; bitOffset<20; bitOffset++)
  {
    tickTock();
    
    //read the pin state and shif it into the appropriate variables
    xCoord |= ((long)digitalRead(xDataPin)<<bitOffset);
    yCoord |= ((long)digitalRead(yDataPin)<<bitOffset);
    zCoord |= ((long)digitalRead(zDataPin)<<bitOffset);
    
  }
  
  tickTock();

  //read the last bit (signified the sign)
  //if it's high, fill 11 leftmost bits with "1"s
  if(digitalRead(xDataPin)==HIGH)
        xCoord |= ((long)0x7ff << 21);
        
  if(digitalRead(yDataPin)==HIGH)
        yCoord |= ((long)0x7ff << 21);
        
  if(digitalRead(zDataPin)==HIGH) 
        zCoord |= ((long)0x7ff << 21);
  
  //print the position to the serial port (for debuging purposes)
  Serial.print("X");
  Serial.print((long)xCoord);
  Serial.print(";"); 
  
  Serial.print("Y");
  Serial.print((long)yCoord); 
  Serial.print(";"); 
  
  Serial.print("Z");
  Serial.print((long)zCoord); 
  Serial.print(";"); 
  
  //give the scales time to become ready again
  delay(50);
}

inline void tickTock()
{
      //tick
    digitalWrite(clockPin, HIGH);
    
    //give the scales a few microseconds to think about it
    for(byte i = 0; i<20; i++)
    {
      __asm__("nop\n\t");
    }
  
    //tock
    digitalWrite(clockPin, LOW);
  

} 

А я думал, что задача будет поинтереснее да посложнее :) Навскидку получается, что тупо прикрутить отображение на дисплее - и всё. Я так не играю :)

З.Ы. Шучу конечно. Надо будет подумать, потестировать - и сделать платку для трёх осей, под семидюймовый TFT на контроллере SSD1963. Пока ещё порою инфы, надеюсь, будет полезно не только мне.

З.З.Ы. Похоже, приведённый выше код не подойдёт к китайским линейкам, поскольку реализует чтение по запросу (потокол Digimatic), а китайские, судя по инфе - непрерывно шлют данные сами. Так что будем отталкиваться от кода в сообщении номер 1 ;)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Пока посваливаю сюда ссылочки к прочтению, чтобы не потерять:

1. http://nut-bolt.nl/2012/reading-digital-calipers-with-an-arduino/

2. http://www.shumatech.com/support/chinese_scales.htm

3. http://www.yuriystoys.com/2012/01/reading-gtizzly-igaging-scales-with.html

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

По счастливой случайности сейчас как раз работаю над заказным проектом ЧПУ на семидюймовом дисплее, и под это дело даже есть отладочная плата. Так что полдела уже сделано, можно сказать - работа с экраном, с экранными кнопками и т.п.

Щас набросаю интерфейс, и останется только опрос датчиков ;)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Начал работу над интерфейсом, открыл репозиторий: https://github.com/Porokhnya/ArduinoDRO

Практически всё реализовано, кроме опроса собственно датчиков. Мал-мала README имеется, если что - можно всегда поспрошать у меня, что к чему. Пока всё сыровато, конечно, да и инфы мало, потихоньку будет пополняться, со временем, надеюсь, появится и проект печатки под это дело.

Если вдруг модераторы сочтут нужным переместить тему в раздел "Проекты" - буду только "за". Но! Быстрых результатов не обещаю, всё только по наличию свободного времени.

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Снял по-бырому на тапок, с освещением не айс, я не блохер всё-таки :) Если вдруг кому интересно, то видео доступно только по ссылке: https://youtu.be/s6O63MppXbc

Осталось в ближайшие пару лет разобраться с собственно датчиком :)

З.Ы. Кто подскажет бюджетные нормально выглядящие корпуса не из Китая? А то я ещё для электроники делительной головки корпус не подобрал, а ужжо новый проект - неаккуратненько :(

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Вот ещё код для опроса датчиков линеек (таки похоже, что источником тактирования всё-же служит мастер): http://www.rysium.com/rysium.docs/

Более детально - надо разбираться, с какой стороны тактирование идёт. Я так понимаю, что если отключить штатный дисплей, подать питание на датчик, посмотреть осциллом линии строба и данных и там не будет ничего - значит, тактирование задаётся мастером. Если же там будут данные - значит, тактирует чип на самой плате датчика. И, в зависимости "от" - будет понятно, какой подход к чтению применять.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DIYMan пишет:

Кто подскажет бюджетные нормально выглядящие корпуса не из Китая?

Лично я в зависимости от размера поступаю по одному из двух сценариев:

1. Печатаю на 3D-принтере.

2. Беру готовый чемодан.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

andriano пишет:

2. Беру готовый чемодан.

Интересует по второму сценарию: где берёте нормально выглядящие и не требующие продажи почки чемоданы? Всё, что есть в местных лабазах электрики - гумно, выглядящее как гумно, к сожалению.

andycat
andycat аватар
Offline
Зарегистрирован: 07.09.2017

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

sadman41
Offline
Зарегистрирован: 19.10.2016

Чем могу - помогу: http://chip-nn.ru/82.php

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Ребята, за корпуса всем спс, будет что посмотреть. Чипдип отложу на край, что называется, а вот магаз в НН - интересный, надо пошерстить.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DIYMan пишет:

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

Нет, ну у каждого свои представления о том, что прилично выглядит, и что не требует продажи внутренних органов.

Меня, например, устроил вот такой: https://www.vseinstrumenti.ru/ruchnoy_instrument/yaschik_dlya_instrumentov/dlya_ruchnogo_instrumenta/fit/yaschik-chemodan_dlya_instrumenta_alyumin._34x28x12_sm_serebristyi_fit_65610/

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Купил сегодня батарейки CR2032, вставил в китайский дисплей для линейки. Подтверждаю: работает и от одной, тупо разведены в параллель, чтобы ёмкость повысить. Напряжение питания получается 3В, думаю, можно и не париться с согласованием уровней, т.к. всё равно используется Due в логикой 3.3В. Или таки сбросить эти лишние 0.3В на шине тактирования, что думаете?

Прошивку обновил, сделал тёмную цветовую гамму (так мне наглядней; впрочем, все цвета настраиваются в CONFIG.h, как хочешь). Посмотрел, что по нажатию кнопки Zero китайский блок с дисплеем сохраняет эту уставку в EEPROM, и она подхватывается при повторных включениях. Добавил, помимо кнопки "ABS" - кнопку "ZERO" на каждую из осей, которая работает точно так же. Все надписи на кнопках - настраиваются, можно и на русском. 

С переводом mm/inch - не заморачивался, мне не нужно в инчах, навскидку, да и задача была - сделать максимально крупными цифири, а кнопки, как ни крути - места отнимают (да и не сделаешь кнопки сильно маленькими - будет неудобно попадать заскорузлыми пальцами).

Нашёл шнурок с нужным разъёмом USB mini B "папа" - можно будет на днях откусить от него кусочек, высвободить провода, подключить шнурок к китайскому блоку индикации, да и ткнуться в них: сначала мультиметром, на предмет выяснить - а где, собсна, питалово? Потом - логическим анализатором - найти шину тактирования. Ну а там, уже методом исключения - и шина данных найдётся ;)

Вот только беда - нетути в хозяйстве USB mini B "мамы", чтобы уже от линейки шнурок воткнуть и на отладочную плату завести. Надо ехать в лабаз, но ещё не факт, что в наших колхозах такое будет - бедноват выбор, очень :(

Наверное, щас закажу у китайцев, пусть будет, на всякий ;)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Пока проблем-с имею, вот тут: http://www.shumatech.com/web/21bit_protocol?page=0,1 - сказано, что контакт 4 (sic!) USB mini B подсоединён к минусу батареи. А в стандартной распиновке USB mini B контакт 4 - ведёт в никуда. Шнурок-то я распотрошил, а толку? Там, как и ожидалось, 4 провода, и контакт номер 4 - не используется; да и сам разъём неразборный без вандализма...

У китайцев заказал вот такую шляпу, там все 5 контактов разведены: https://ru.aliexpress.com/item/10pcs-MINI-USB-to-DIP-Adapter-5pin-female-connector-B-type-pcb-converter-Free-shipping-Rated/32659563719.html?spm=a2g0s.9042311.0.0.97d133edNJgRYY - это пригодится на период тестирования собственно платы.

А вот с "папой" - теперь проблемы, надо где-то добыть такой разъём разборный. Что-то на али слёту не находится - одни "мамы" :(

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Нашёл ещё одну интересную статеечку, расшарил на гугльдиске: https://drive.google.com/file/d/15zssioKCQdLr7BUuxIR3l0EZVKoYfwHo/view?usp=sharing

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Разобрал линейку. Шо я имею сказать? Сделана на свою цену, т.е. не очень: ни тебе роликов прижимных, ни-че-го: только плата с чипом, залитым компаундом, на линейку через подпружиненный скользящий разъём подаётся минус (этот проводок тут же благополучно отвалился, пришлось запаять нормально), дополнительное "подпружинивание" - тупо два куска чего-то, похожего на плотный синтепон в двух предназначенных для этого кармашках. И, собственно, всё. Провода от кабеля тупо распаяны на плату, сверху залиты жидкими соплями. Маркировок - нету, от слова "совсем".

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

Пока разбирал-собирал - показания на дисплее начали отображать какую-то запредельную муть. Кнопка Zero спасла положение, показывает норм.

По итогу - вроде ничего не убил, но лезьть туда без крайней необходимости я теперь не хочу, не на что там смотреть, одно расстройство :) Грешным делом я думал, что будет чуть поприятнее в потрохах. Но - не судьба. Зато теперь не жалко поиметь донорскую свинку - до сезона возни в мастерской ещё несколько месяцев, так что успею заказать ишшо одну, если эту убью с концами. Вторая линейка бОльшей длины - пока лежит нетронутая, во избежание :))))

Для пресекания возможных разночтений: мне микроны не ловить, достаточно до пяти соток. С чем данный показометр успешно должен справляться, по идее. Т.е. я полностью отдаю себе отчёт, с чем имею дело в разрезе точности ;)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Немного поработал над кодом - оптимизировал отрисовку, добавил всякие мелочёвые настройки. В целом стало работать поприятней, учитывая тот факт, что перерисовка одного огромного символа на экране - составляет примерно 20 мс, и если перерисовывать всё "в лоб" - то много лишнего гоняется по шине. Сейчас - перерисовываются только те разряды, которые реально поменялись, тестировал на отладочном режиме, с быстро меняющимися значениями - всё норм. В реале - так быстро значения с линейки меняться не будут, я ручками физически не успею так крутить штурвалы :)

Короче, потихоньку пилю. Сейчас уже есть возможность продублировать экранные кнопки железными, для каждой из осей - всё настраивается в прошивке. Очень надеюсь, что на последнем этапе не споткнусь, и таки с линейки будет читаться всё как надо и правильно. Но это - чуть позже посмотрим уже ;)

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Накопал тему на чипмейкере, изучаю опыт: https://www.chipmaker.ru/topic/136832/

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Мал-мала обновил на гитхабе: добавил возможность для каждой из осей поиметь экранную кнопку переключения "радиус/диаметр": при положении "радиус" - с данными ничего не происходит, при положении "диаметр" - показания тупо умножаются на 2. Это нужно, в частности, для токарного и оси Y, когда съём идёт на диаметр, и не нужно будет в уме умножать на 2 - дисплей сам покажет.

Пока, ессно, всё это дело на линейке не проверял, расставил TODO по коду для дальнейших проверок, но чисто умозрительно - вроде нигде не напорол.

ku-ku
Offline
Зарегистрирован: 14.11.2018

DIYMan пишет:
З.Ы. Кто подскажет бюджетные нормально выглядящие корпуса не из Китая?

как вариант - фанера )
Я взял себе термоконтроллер. А к нему еще твердотельное реле идет, нужно нагрузку включать, и так далее. Это куча проводов и железяк. Б-р-р-р, надо в кучу сразу собирать.

Не мудрствуя лукаво решил улучшить навыки работы в солидворксе: за пару вечеров мучений наваял себе коробочку
https://s8.hostingkartinok.com/uploads/images/2019/01/325c2344d58b3fa3a023b91f4c46eab5.jpg
https://s8.hostingkartinok.com/uploads/images/2019/01/c61d9fd173cf67a09a390d389b12e752.jpg
В паре мест не угадал. Державочки релюхи изначально предполагались не в размер, чтобы по месту допиливать.
Конструкция оказалась не идеальной, держалось плохо, пришлось клеить. И в целом - зря я заподлицо все размеры мудрил, нужно было небольшие отступы делать.
Но как вариант - вполне себе неплохо. Если при порезке программу составить правильно, чтобы туго входило - то клей ненужен вовсе. Уже был опыт.
upd: нативный вид: https://s8.hostingkartinok.com/uploads/images/2019/01/2b04afd017a44adbbb...