HX711 и Дэбильная(!!!) библиотека

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Всем доброго времени суток!

С точки зрения знатоков своего дела, моя проблема не так сложа, я это понимаю, но до знатока, очевидно, не дотягиваю. Суть вот в чём - мне нужно было (да и сейчас нужно) снимать показания напряжения на высокоточном реостате, соответственно, с точностью выше, чем 1/1024 на 10-битном встроенном АЦП ардуино уно. Я нашёл хороший (ха-ха-ха) АЦП - HX711 (https://voltiq.ru/shop/hx711-weighing-pressure-sensor/) и купил его. На сайте https://github.com/queuetue/Q2-HX711-Arduino-Library я нашёл для управления сим чудом наипростейшую библиотеку (пробовал и другие для 711-й, но они сложнее, а проблема одна и та же). 

Итак, вот моя схема подключения (вольтметры для того, чтобы убедиться, что напряжение на реостате меняется, притом плавно и верно):А вот код, по которому я пытаюсь управлять сим:

#include <Q2HX711.h>

const byte hx711_data_pin = 2;
const byte hx711_clock_pin = 3;

Q2HX711 hx711(hx711_data_pin, hx711_clock_pin);

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.println(hx711.read());
  delay(100);
}

Всё бы хорошо, но функция hx711.read() выдаёт (по описанию же автора) "Длинное целое число" (авт. "Returns a long integer that is the current value of the HX711"), которое а что это за число-то? Подключил я вольтметр, значт, параллельно и открыл монитор порта; кручу реостат: показание вольтметра меняются от 0 до 4 вольт на протяжении всего периода кручения, а вот "какое-то многозначное число" колеблется в пределах 8388194(движок выкручен в 0 град.) - 8055454(движок в районе середины) - 8388247 (движок выкручен на 300 град. (макс.)).

Итого у меня три вопроса - что за числа (хотя я понимаю что это 2 в степени 23), почему код возвращает именно их, и как же мне вывести реальные показания напряжения на экран и использовать их в дальнейшем, в чём и была начальная цель?

P.S. Может, этот АЦП не предназначен для моих целей? Хотя АЦП ведь он и есть АЦП, и у него нет конкретной принадлежности к конкретной решаемой задаче (или нет?).

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ромуальд VII пишет:
показание вольтметра меняются от 0 до 4 вольт
Нижнего по рисунку? Фига-се! А теперь открываем даташит и читаем сколько там можно подавать по максимуму - в зависимости от установленного усиления либо 20, либо 40 милливольт! Надеюсь, HX711 ещё жив.

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Это здорово, что вы знаете технический английский. Только делать-то что?

HX711 же выдаёт опорные 4 вольта, а зачем тогда, раз максимум приёма это 0,04В?

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

Модуль должен быть благодарен за то, что на него только 4В подали, а не 220. Так нет, выпендривается гад.

 

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

ООООООООООЙЙЙЙЙ, да понял я, что даташит неправильно перевёл; обязательно издеваться?

Выходит, что в цепь реостата нужно поставить такой резистор, чтобы реостат вызывал падение напряжения от 0 до 40мВ? Тогда оно заработает как я хочу?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ромуальд VII пишет:

Это здорово, что вы знаете технический английский. Только делать-то что?

Изучать технический английский и правильно выбирать компоненты.

У этого АЦП ахренительный усилитель, чтобы считывать микровольтовые напряжения и выдавать их в диапазоне 0-5В. Он для тензодатчиков, а не для реостатов.

Так что ищите другой АЦП, адекватный Вашей задаче.

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Спсибо за ответ!

ADS1115 подойдёт?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Не знаю Вашей задачи, потому ничего сказать не могу.

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

Для неизвестно какой задачи? Подойдет! Инфа - сотка.

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Как бы эммм, я написал цель в самом начале темы - "Суть вот в чём - мне нужно было (да и сейчас нужно) снимать показания напряжения на высокоточном реостате, соответственно, с точностью выше, чем 1/1024 на 10-битном встроенном АЦП ардуино уно" (пусть никто не обижается, но читайте внимательнее :) )

А если конкретнее, то мне нужно с точностью до минуты вычислить угол поворота движка реостата.

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Я по этой же схеме атыкал реостат прямо в аналоговый вход ардуины, но получал точность до 0,29 градуса. Нужно АБСОЛЮТНО ТО ЖЕ САМОЕ, только через внешний ацп.

Так вот, если HX711 не совсем подходит, ADS1115 подойдёт?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ромуальд VII пишет:

Так вот, если HX711 не совсем подходит, ADS1115 подойдёт?

Блин, но Я же говорю, откуда мне знать? Вы же не пишете задачу полностью. Вам что нужно, один раз измерить или постоянно измерять? Если постоянно, то как часто? Например, ADS1115 умеет делать от 8 до 860 замеров в секунду. А, например, Ваш HX711 умеет гораздо чаще. ADS1115  - 16-тиразрядный, а HX71 - 24-разрядный. Вам хватит точности 16 разрядов? Откуда мне-то знать? Хрен его знает, чего Вам надо.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Что-то новенькое. Раньше причиной всех бед, вплоть до ошибок компиляции, было то, что ардуина китайская. Теперь вот уже простейшая, из нескольких строк, библиотека стала "дэбильной". Всё вокруг - сплошная подстава. Одни мы не дэбильные и не китайские.

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Тогда распишу совсем подробно:

Есть высокоточный потенциометр на 10кОм (советский, такой, с допуском 0,1%, на 5 поворотов; дали в институте). Необходимо максимально точно снять с него его падение напряжения и пересчитать в угол поворота вала с точностью, хотя бы, до минуты, после чего повернуть его на требуемую величину и оставить в покое; то есть, количество замеров в секунду может быть равно и единице, но лучше с частотой 10 герц (просто удобнее так).

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

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

"Function | Description

------------| -------------
**read** | Returns a long integer that is the current value of the HX711"
ПЕРЕВОД: 
Функция | Описание
---------- | -------------
**читать**| Возвращает длинное целое число, являющееся текущим значением HX711

Длинное целое число, понимаете?? И всё - никаких описаний, что за число; я понял что это в итоге, но как-то не сразу.

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

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

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

А что может быть непонятного в long int, если знать, что это тип переменной? В институте таких не давали ни разу или это художественный институт?

Мне вот более интересно, зачем с пятиоборотного резистора снимать угол, чтобы он хоть что-то полезное означал... Разве что перемещение по оси вычислять...

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Дело не в long int и других типах переменных; дело в классах, которые широко используются и до осознания существования которых я ещё не дошёл. С++ это моя личная инициатива, в институте у нас был матлаб (царство ему, и так далее), который мне очень понравился (после школьного паскаля-то), но на котором далеко не уедешь, к сожалению.

А о цели (чему я ни капельки не удивлён) вы догадались с певрой попытки, что называется. Эта "махинация" бужет использоваться в моём, так сказать, изобретении, но это секрет :)

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, это уже ближе к делу.

Итак, Вам нужет угол поворота вала с точность до угловой минуты. Всего у нас минут 360*60 = 21600. Стало быть Вам нужна точность до 1/21600 = 0,000046. При этом 1 LSB составляет 1/65536 = 0,000015. Таким образом, этот ЦАП подойдёт, если он обеспечивает точность  3LSB. Смотрим даташит.

Offset error -  ±3 LSB
Long-term Offset drift -  ±1 LSB
Offset power-supply rejection - 1 LSB/V
Offset channel match - 3 LSB

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

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ромуальд VII пишет:

в описании написал фразу -

"Function | Description

------------| -------------
**read** | Returns a long integer that is the current value of the HX711"
ПЕРЕВОД: 
Функция | Описание
---------- | -------------
**читать**| Возвращает длинное целое число, являющееся текущим значением HX711

Длинное целое число, понимаете?? И всё - никаких описаний, что за число; 

Вы не обижайтесь, но любому, даже совсем малоопытному, специалисту понятно что такое "длинное целое число", так что речь скорее о "дэбильном" читателе. Не обижайтесь, я по-доброму, с дружеской улыбкой.

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Да вы знаете, я уже после вашего сообщения о 20-40 милливольтах считаю себя дэбильным читателем :D

Если позволите, ещё один вопрос - правильно ли я понимаю, что на входы А0 - А1,А2,А3 АЦП ADS1115 можно поавать разность потенциалов до 6 с копейками вольт?

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

Не каждый резистор выдержит долгое постоянное елозенье (а вычисление позиции зачастую именно это и означает)... Зашумит, показанья начнут скакать туды-сюды...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Только теоретически. Ни на один вход нельзя подавать меньше, чем -0,3В и больше, чем "напряжение питания" + 0,3 В

Так что всё зависит от напряжения питания.

Ромуальд VII
Offline
Зарегистрирован: 21.07.2018

Большое спасибо всем за вашу помощь!

nik182
Offline
Зарегистрирован: 04.05.2015

Очень рекомендую для этой задачи MCP3551. Главное достоинство - внешний Uref. Если на него и на резистор подавать одно и тоже напряжение то результат оцифровки не будет зависить от плавания напряжения питания. Точность можно получить до 5 знака.