Espruino:Примеры/Измеритель напряжения и силы тока: различия между версиями
Myagkij (обсуждение | вклад) Нет описания правки |
Нет описания правки |
||
(не показаны 3 промежуточные версии 2 участников) | |||
Строка 5: | Строка 5: | ||
=Измеритель напряжения и силы тока <ref>[https://www.espruino.com/Power+Meter www.espruino.com - Power Meter]</ref>= | =Измеритель напряжения и силы тока <ref>[https://www.espruino.com/Power+Meter www.espruino.com - Power Meter]</ref>= | ||
[ | [[File:Power_Meter.jpg|center]] | ||
Иногда (особенно при разработке проектов, питаемых от батареи) очень полезно иметь возможность видеть, сколько энергии использует ваше устройство – и в текущий момент, и в течение некоторого промежутка времени. | Иногда (особенно при разработке проектов, питаемых от батареи) очень полезно иметь возможность видеть, сколько энергии использует ваше устройство – и в текущий момент, и в течение некоторого промежутка времени. | ||
Порой для этого достаточно | Порой для этого достаточно [[мультиметр]]а или чего-то более узконаправленного вроде [https://www.nordicsemi.com/Software-and-tools/Development-Tools/Power-Profiler-Kit PPK от Nordic], но в то же время всегда хорошо иметь под рукой инструмент, который «просто работает» (некоторые [[мультиметр]]ы дают ненадежные результаты). | ||
В этом руководстве я как раз расскажу вам, как сделать такой измерительный инструмент при помощи [https://www.espruino.com/Pixl.js Pixl.js]. Его точность будет составлять около 10 мкА, что отлично подходит для тестирования других Espruino-устройств. | В этом руководстве я как раз расскажу вам, как сделать такой измерительный инструмент при помощи [https://www.espruino.com/Pixl.js Pixl.js]. Его точность будет составлять ''около 10 мкА'', что отлично подходит для тестирования других [[Espruino-устройств]]. | ||
== Вам понадобятся == | == Вам понадобятся == | ||
Строка 24: | Строка 24: | ||
Подключите [https://www.espruino.com/INA226 INA226] как показано в таблице ниже: | Подключите [https://www.espruino.com/INA226 INA226] как показано в таблице ниже: | ||
{| class="wikitable" style="margin:0 auto" | |||
|- | |||
! [[INA226]] !! [[Pixl.js]] | |||
|- | |||
| VCC || 3.3v | |||
|- | |||
| GND || GND | |||
|- | |||
| SDA || A0 (но это может быть любой GPIO-контакт) | |||
|- | |||
| SCL || A1 (но это может быть любой GPIO-контакт) | |||
|- | |||
| ALE || A2 (но это может быть любой GPIO-контакт) | |||
|- | |||
| VBS || IN- | |||
|- | |||
| IN- || Источник напряжения (см. ниже) | |||
|- | |||
| IN+ || Не подключен | |||
|} | |||
Теперь подключите устройство, которое надо запитать, к большим терминалам '''GND''' и '''IN+''' в верхней части [[INA226]]. Чтобы упростить подключение, я использую клеммник и [[JST-коннектор]]. | |||
Кроме того, контакт IN- должен быть подключен к источнику напряжения, которым вы планируете питать устройство. | Я бы также порекомендовал подключить между контактами '''GND''' и '''IN+''' большой [[конденсатор]] (на [[220 мкФ]] или выше). Это выровняет все перепады напряжения, которым может подвергнуться ваше устройство, что позволяет получить более аккуратные данные. | ||
* Если вы планируете использовать это на чём-то вроде [https://www.espruino.com/Puck.js Puck.js], я бы порекомендовал 3.3v. | |||
Кроме того, контакт '''IN-''' должен быть подключен к источнику напряжения, которым вы планируете питать устройство. | |||
* Если вы планируете использовать это на чём-то вроде [https://www.espruino.com/Puck.js Puck.js], я бы порекомендовал '''3.3v'''. | |||
* В противном случае устройства со встроенным регулятором напряжения могут воспользоваться Vin-контактом Pixl.js, который дает 5 вольт, или питанием от литий-ионной батареи (которая у [https://www.espruino.com/Pixl.js+Multicolour многоцветного Pixl.js] встроенная). | * В противном случае устройства со встроенным регулятором напряжения могут воспользоваться Vin-контактом Pixl.js, который дает 5 вольт, или питанием от литий-ионной батареи (которая у [https://www.espruino.com/Pixl.js+Multicolour многоцветного Pixl.js] встроенная). | ||
Строка 59: | Строка 62: | ||
В большинстве случаев это нормально, но это также значит, что из-за этого модуль чуть хуже измеряет очень маленькие величины. Я отпаял этот резистор и заменил его на 1-омовый резистор (это снижает максимальную планку измеряемого диапазона, но улучшает точность при измерении более маленьких показателей). | В большинстве случаев это нормально, но это также значит, что из-за этого модуль чуть хуже измеряет очень маленькие величины. Я отпаял этот резистор и заменил его на 1-омовый резистор (это снижает максимальную планку измеряемого диапазона, но улучшает точность при измерении более маленьких показателей). | ||
Если вы не хотите отпаивать резистор, просто поменяйте строчку shunt:1 на shunt:0.1. | Если вы не хотите отпаивать [[резистор]], просто поменяйте строчку '''shunt:1''' на '''shunt:0.1'''. | ||
== Код == | == Код == | ||
<syntaxhighlight lang="javascript | <syntaxhighlight lang="javascript"> | ||
// Только для многоцветного Pixl.js (настройка подсветки): | // Только для многоцветного Pixl.js (настройка подсветки): | ||
var NC = require("nodeconfeu2018"); | var NC = require("nodeconfeu2018"); | ||
Строка 159: | Строка 162: | ||
После загрузки вы можете обнаружить, что даже при отсутствии подключенного устройства на дисплее всё равно будут показываться какие-то цифры. | После загрузки вы можете обнаружить, что даже при отсутствии подключенного устройства на дисплее всё равно будут показываться какие-то цифры. | ||
В результатах всегда будет какой-то шум, но вы также можете обнаружить, что конденсатор, добавленный между IN+ и GND, тянет электроэнергию и искажает результат (у электролитических конденсаторов, как правило, приемлемое внутреннее сопротивление). | В результатах всегда будет какой-то шум, но вы также можете обнаружить, что конденсатор, добавленный между '''IN+''' и '''GND''', тянет электроэнергию и искажает результат (у электролитических конденсаторов, как правило, приемлемое внутреннее сопротивление). | ||
В этом случае я бы порекомендовал раскомментировать строчку с калибровкой (// calibration) и настроить её так, чтобы ваш прибор давал «0», когда к нему ничего не подключено. | В этом случае я бы порекомендовал раскомментировать строчку с калибровкой ('''// calibration''') и настроить её так, чтобы ваш прибор давал '''«0»''', когда к нему ничего не подключено. | ||
=См.также= | =См.также= | ||
=Внешние ссылки= | =Внешние ссылки= | ||
Строка 171: | Строка 174: | ||
<references /> | <references /> | ||
{{Навигационная таблица/Espruino | {{Навигационная таблица/Портал/Espruino}} | ||
Текущая версия от 15:06, 20 мая 2023
Измеритель напряжения и силы тока [1]
Иногда (особенно при разработке проектов, питаемых от батареи) очень полезно иметь возможность видеть, сколько энергии использует ваше устройство – и в текущий момент, и в течение некоторого промежутка времени.
Порой для этого достаточно мультиметра или чего-то более узконаправленного вроде PPK от Nordic, но в то же время всегда хорошо иметь под рукой инструмент, который «просто работает» (некоторые мультиметры дают ненадежные результаты).
В этом руководстве я как раз расскажу вам, как сделать такой измерительный инструмент при помощи Pixl.js. Его точность будет составлять около 10 мкА, что отлично подходит для тестирования других Espruino-устройств.
Вам понадобятся
- Обычный или многоцветный Pixl.js
- Микросхема для измерения силы тока и напряжения INA226
- Большой конденсатор (220 мкФ или больше)
На фото выше используется многоцветный Pixl.js, поскольку в него встроены литий-полимерная батарея и зарядное устройство, что позволяет не ковыряться с питанием, а просто включить устройство и начать делать проект.
Подсоединение
Подключите INA226 как показано в таблице ниже:
INA226 | Pixl.js |
---|---|
VCC | 3.3v |
GND | GND |
SDA | A0 (но это может быть любой GPIO-контакт) |
SCL | A1 (но это может быть любой GPIO-контакт) |
ALE | A2 (но это может быть любой GPIO-контакт) |
VBS | IN- |
IN- | Источник напряжения (см. ниже) |
IN+ | Не подключен |
Теперь подключите устройство, которое надо запитать, к большим терминалам GND и IN+ в верхней части INA226. Чтобы упростить подключение, я использую клеммник и JST-коннектор.
Я бы также порекомендовал подключить между контактами GND и IN+ большой конденсатор (на 220 мкФ или выше). Это выровняет все перепады напряжения, которым может подвергнуться ваше устройство, что позволяет получить более аккуратные данные.
Кроме того, контакт IN- должен быть подключен к источнику напряжения, которым вы планируете питать устройство.
- Если вы планируете использовать это на чём-то вроде Puck.js, я бы порекомендовал 3.3v.
- В противном случае устройства со встроенным регулятором напряжения могут воспользоваться Vin-контактом Pixl.js, который дает 5 вольт, или питанием от литий-ионной батареи (которая у многоцветного Pixl.js встроенная).
Я также добавил в проект переключатель, чтобы у меня была возможность переключаться между 3.3-вольтовым питанием и литий-полимерной батареей (около 4 вольт). В этом случае вам нужно быть осторожнее и переключаться только тогда, когда устройство выключено, поскольку переключение с литий-полимерной батареи на 3.3-вольтовое напряжение заставляет конденсатор на IN+ разрядиться в 3.3-вольтвую шину.
От чего зависит измеряемый диапазон
Большинство модулей INA226 оснащены шунтирующим сопротивлением на 0.1 Ом.
В большинстве случаев это нормально, но это также значит, что из-за этого модуль чуть хуже измеряет очень маленькие величины. Я отпаял этот резистор и заменил его на 1-омовый резистор (это снижает максимальную планку измеряемого диапазона, но улучшает точность при измерении более маленьких показателей).
Если вы не хотите отпаивать резистор, просто поменяйте строчку shunt:1 на shunt:0.1.
Код
// Только для многоцветного Pixl.js (настройка подсветки):
var NC = require("nodeconfeu2018");
function bl(R,G,B) {
NC.backlight([B,G,R,B,G,R,B,G,R,B,G,R]);
}
bl(10,20,0);
// Для всех устройств.
// Показываем сообщение о загрузке.
E.showMessage("Загрузка...");
require("Font7x11Numeric7Seg").add(Graphics);
// Настраиваем I2C.
var i2c = new I2C();
i2c.setup({sda:A0, scl:A1});
var IRQ = A2;
// Инициализируем INA226.
var INA226 = require("INA226");
var ina = new INA226(i2c, {
average:512, // то, сколько отсчетов будет использовано
// для расчёта среднего значения
// (1024 – это около 1 считывания в секунду)
shunt:1, // значение шунтирующего сопротивления
maxCurrent: 0.1 // максимальная ожидаемая сила тока для измерения
// (чем ниже, тем точнее замер)
});
// Теперь можно просто считывать данные.
var lastData = ina.read();
// Наблюдаем за выводом тока.
setWatch(function(e) {
lastData = ina.read();
plotData(lastData);
}, IRQ, {repeat:true,edge:"falling"});
var history = new Float32Array(128);
var historyLen = 0;
function scaleCurrent(v) {
if (Math.abs(v)>0.2) return {v:v.toFixed(2),s:"A"};
if (Math.abs(v)>0.002) return {v:(v*1000).toFixed(1),s:"mA"};
if (Math.abs(v)>0.0002) return {v:(v*1000).toFixed(2),s:"mA"};
if (Math.abs(v)>0.00009) return {v:(v*1000000).toFixed(1),s:"uA"};
return {v:(v*1000000).toFixed(2),s:"uA"};
}
function plotData(d) {
// d.current += 6/1000000; // калибровка
g.clear();
var x= 48, y=22;
g.setFont("7x11Numeric7Seg",2).setFontAlign(1,1);
g.drawString(d.vbus.toFixed(2),x,y);
g.setFont("4x6").setFontAlign(1,-1);
g.drawString("Volts",x,y+1);
x=127;
var current = scaleCurrent(-d.current);
g.setFont("7x11Numeric7Seg",2).setFontAlign(1,1);
g.drawString(current.v,x,y);
g.setFont("4x6").setFontAlign(1,-1);
history.set(new Float32Array(history.buffer,4));
history[history.length-1] = -d.current;
historyLen++;
if (historyLen>history.length) historyLen=history.length;
var avr = scaleCurrent((E.sum(history)/historyLen));
g.drawString(current.s+", "+avr.v+" "+avr.s+" avr",x,y+1);
require("graph").drawLine(g, history, {
miny: 0,
//axes : true,
//xlabel : null,
//gridy : 20,
x:8,y:30,
width:120,height:32
});
g.setFont("4x6").setFontAlign(0,0,1);
g.drawString("Clear",2,50);
g.flip();
}
setWatch(function() {
history.fill(0);
historyLen = 0;
},BTN4,{repeat:true});
Калибровка
После загрузки вы можете обнаружить, что даже при отсутствии подключенного устройства на дисплее всё равно будут показываться какие-то цифры.
В результатах всегда будет какой-то шум, но вы также можете обнаружить, что конденсатор, добавленный между IN+ и GND, тянет электроэнергию и искажает результат (у электролитических конденсаторов, как правило, приемлемое внутреннее сопротивление).
В этом случае я бы порекомендовал раскомментировать строчку с калибровкой (// calibration) и настроить её так, чтобы ваш прибор давал «0», когда к нему ничего не подключено.
См.также
Внешние ссылки