Подключение бытовых весов к компьютеру

24 февраля 2015 3562 просмотров


Рис. Авторская схема, резисторы тензодатчиков задают частоту генератора.

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

Авторский текст(без купюр).

У Заказчика встала задача подключения дешевых (450 руб.) китайских бытовых напольных (для ванных комнат и прочего) весов к РС (к моноблоку настенному).

Начинаю исследовать:

  1. Торговые и медицинские весы имеют разъем USB или RS232, но жутко дорогие (порядка 20 тысяч руб.), видимо из-за сертификации.
  2. Бытовые китайские напольные весы, коих в магазинах 1000 моделей, не имеют разъема USB. Одна модель имеет на хрен не нужный мне bluetooth. И единственная немецкая модель «Beaurer F480 USB» имеет таки USB, но не работает в режиме off-line (сначала взвеситесь, затем втыкаете кабель USB и считываете показания с флеш весов в РС).
  3. Можно было бы купить специализированную микросхему весов HX711 и микропроцессор с USB выходом. Но тогда нужно разрабатывать две программы - одну для РС, другую для микропроцессора и пытаться сопрячь их через USB. Для начинающего пейсателя это не так просто, особенно под Windows. Да еще нужно делать плату для этих микросхем, каку-никаку обвязку, соединять их по i2c - тоже непросто.
  4. На ум приходит попытаться сгенерить аудиосигнал простой аналоговой схемой после тензодатчика и передать его в РС через аудиовход. А затем взять просто взять спектр сигнала, определить точную частоту первой гармоники и преобразовать по таблице к килограммы. Есть надежда, что термостабильности элементов схемы хватит для получения точности 1 КГ при диапазоне 20-100 КГ.

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


Рис. Болгарская схема ставшая основой будущего проекта


Рис. Спектр входного сигнала, в болгарском варианте, сигнал треугольный, показания 29-33кг. Хорошо видно, что первая гармоника меняет свою частоту при изменении веса

На фото видны кучки палочек. Нам важна только первая кучка - это и есть анализ спектра сигнала. Остальные кучки просто повторяются - так работает БПФ.
В кучке идут палочки по возрастанию, а потом по убыванию, то есть зеркальный спектр. Нас интересует основная частота - центральная палочка с максимальной амплитудой, поэтому я и нахожу ее очень простым способом:
В зависимости от формы сигнала (треугольный, прямоугольный) в кучке палочки расположены по разному, но главная частота - частота основного тона - первая гармоника - всегда одна и одинакова.
Если Вы будете свистеть, что дает почти идеальную синусоиду, то вместо кучки должна быть ТОЛЬКО ОДНА линия. Но из за того, что мы допускаем огрубления для БЫСТРОТЫ Преобразования Фурье (малый размер буфера, малая частота дискретизации, искажения при оцифровке...), то все равно будут видны какие то боковые лепестки, хотя и малой амплитуды.

Принцип работы авторской схемы.

На мост подается двуполярный прямоугольный сигнал +-3 Вольта (4 элемента ААА), а не постоянное напряжение +6В.
На приложенных рисунках, которые я условно назвал «Болгарская схема» и «Моя схема» - три ОУ.

  • ОУ1  - в режиме интегратора, раз в обратной связи только конденсатор (можно и убрать навесной конденсатор, тем не менее это все равно будет интегратор, так как будет работать собственная ёмкость ОУ.)
  • ОУ2 - в режиме компаратора - он делает из пилы или треугольника прямоугольники. У болгар стоит резистор 330 Ом в ООС для гистерезиса, но я его пока замкнул накоротко, мне достаточно. Более того, болгары рекомендуют для высокой точности измерения ставить не простой ОУ, а быстродействующий или лучше специализированный компаратор.
  • ОУ3 не в режиме компаратора, а дифференциального усилителя. Болгары опять же советуют ставить не ОУ, а специализированный ДУ, так как не нужно подбирать точно резисторы для подавления синфазных помех. Но в моей схеме для достижения сильной девиации и начальной генерации ДУ сильно разбалансирован (резисторы 58 КОм и 56 КОм неравные указаны на картинке), так что сигнал на выходе компаратора не меандр, а имеет начальную (при нулевом весе) скважность 20:1.

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

Теперь обратите внимание на патент "частотный преобразователь …..." и вырезанную из него картинку частотный преобразователь - тут не используется дифференциальный усилитель.

Я эту схему также собирал. Тоже работает, просто без усилителя девиация меньше, но кому то и этого достаточно.
Возможно, сделать схему можно, наверное, и на одном ОУ или таймере NE555 - не знаю... Смысл простой - при разбалансе моста - изменяется частота, но нужно обязательно иметь термостабильность схемы. Отсюда куча патентов и статей на эту схему.
Болгары указали, что все работы по РАЗВЕРТЫВАЮЩИМ ПРЕОБРАЗОВАТЕЛЯМ начались с нашей отечественной книжки 70х. Не знаю откуда наши выдумали эти схемы - может быть изобрели, я не изучал этот вопрос.

Алгоритм работы прорграмного обеспечения

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

  • Каждая кучка это мощность сигнала на определенной частоте.
  • Если бы была подана синусоида, то была бы ТОЛЬКО ОДНА линия, соответствующая ее частоте.

Хотя из за того, что мы допускаем определённые огрубления для БЫСТРОТЫ Преобразования Фурье (малый размер буфера, малая частота дискретизации, неидеальность АЦП в аудиокарте), то даже при идеальной синусоиде на входе, все равно на некотором расстоянии будут видны убывающие линии - гармоники сигнала на кратных частотах.

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


Рис. Спектр входного сигнала, в авторском варианте, сигнал прямоугольный, показания 49-51кг.

То есть программа спектрального анализа легко определяет гармонику с максимальной амплитудой, а ее номер пропорционален нагрузке на датчики.


Рис. Сигнал приходящий на компьютер, частота меняется в зависимости от загруженности весов.

Проект под студию 2010 вроде не требует ничего кроме WinMM.Lib - она вроде стандартна и входила раньше в MS SDK. (Одной библиотеки мало придется ставить весь пакет. комментарий zival)

Программа вычисления спектра сигнала по алгоритму БПФ (FFT).

Основной алгоритм программы:

// - заполняем буфер сигналом с микрофона,
// - делаем БПФ (FFT),
// - заполняем массив apt[].y отсчетами спектра,
// - ищем максимальное значение (основную частоту сигнала). Так как каждая гармоника лежит в соответствующей ячейке массива, то номер ячейки пропорционален весу предмета.
// - далее можно преобразовать этот номер в килограммы (по таблице или по формуле, как угодно). Здесь пока печатается только номер.

        Max=0;
        for( i=1; i<iRange ; i++)
        {
        apt[i].y = (int)   100* ( (pfResBuf[i])/32768);    копируем данные из буфера FFT в массив.
        MoveToEx(hdc, i*2 , 100, NULL); LineTo(hdc, i*2, 100 - apt[i].y );  - рисуем вертикальную палочку - отсчет спектра - амплитуду гармоники
        if (apt[i].y > Max ) Max = apt[i].y; // Нашли максимальное значение в спектре, то есть первую гармонику
        }
       
        for( i=1; i<iRange ; i++) if (apt[i].y == Max) Max=i; // Определили  номер ячейки массива где лежит максимальное значение спектра. Этот номер пропорционален весу! Его можно даже сделать равным весу, но я думаю, что схема у меня нелинейная по сравнению с болгарской, поэтому нужно будет преобразовывать по формуле или таблице.)
   
        _itoa (Max, p, 10); TextOut(hdc, 50, 50, p, strlen(p)); // Печать значений пропорциональных весу...