Espruino:Примеры/Измеритель напряжения и силы тока: различия между версиями
Myagkij (обсуждение | вклад) (Новая страница: «{{Espruino/Панель перехода}} {{Перевод от Сubewriter}} {{Myagkij-редактор}} =<ref>[ www.espruino.com - ]</ref>= <syntaxhighligh...») |
Myagkij (обсуждение | вклад) Нет описания правки |
||
Строка 3: | Строка 3: | ||
{{Myagkij-редактор}} | {{Myagkij-редактор}} | ||
=<ref>[ www.espruino.com - ]</ref>= | =Измеритель напряжения и силы тока <ref>[https://www.espruino.com/Power+Meter www.espruino.com - Power Meter]</ref>= | ||
[Картинка] | |||
Иногда (особенно при разработке проектов, питаемых от батареи) очень полезно иметь возможность видеть, сколько энергии использует ваше устройство – и в текущий момент, и в течение некоторого промежутка времени. | |||
Порой для этого достаточно мультиметра или чего-то более узконаправленного вроде [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 Обычный] или [https://www.espruino.com/Pixl.js+Multicolour многоцветный] Pixl.js | |||
* [https://www.espruino.com/INA226 Микросхема для измерения силы тока и напряжения INA226] | |||
* Большой конденсатор (220 мкФ или больше) | |||
На фото выше используется [https://www.espruino.com/Pixl.js+Multicolour многоцветный Pixl.js], поскольку в него встроены литий-полимерная батарея и зарядное устройство, что позволяет не ковыряться с питанием, а просто включить устройство и начать делать проект. | |||
== Подсоединение == | |||
Подключите [https://www.espruino.com/INA226 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- должен быть подключен к источнику напряжения, которым вы планируете питать устройство. | |||
* Если вы планируете использовать это на чём-то вроде [https://www.espruino.com/Puck.js Puck.js], я бы порекомендовал 3.3v. | |||
* В противном случае устройства со встроенным регулятором напряжения могут воспользоваться Vin-контактом Pixl.js, который дает 5 вольт, или питанием от литий-ионной батареи (которая у [https://www.espruino.com/Pixl.js+Multicolour многоцветного Pixl.js] встроенная). | |||
Я также добавил в проект переключатель, чтобы у меня была возможность переключаться между 3.3-вольтовым питанием и литий-полимерной батареей (около 4 вольт). В этом случае вам нужно быть осторожнее и переключаться только тогда, когда устройство выключено, поскольку переключение с литий-полимерной батареи на 3.3-вольтовое напряжение заставляет конденсатор на IN+ разрядиться в 3.3-вольтвую шину. | |||
== От чего зависит измеряемый диапазон == | |||
Большинство [https://www.espruino.com/INA226 модулей INA226] оснащены шунтирующим сопротивлением на 0.1 Ом. | |||
В большинстве случаев это нормально, но это также значит, что из-за этого модуль чуть хуже измеряет очень маленькие величины. Я отпаял этот резистор и заменил его на 1-омовый резистор (это снижает максимальную планку измеряемого диапазона, но улучшает точность при измерении более маленьких показателей). | |||
Если вы не хотите отпаивать резистор, просто поменяйте строчку shunt:1 на shunt:0.1. | |||
== Код == | |||
<syntaxhighlight lang="javascript" enclose="div"> | <syntaxhighlight lang="javascript" enclose="div"> | ||
// Только для многоцветного 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}); | |||
</syntaxhighlight> | </syntaxhighlight> | ||
== Калибровка == | |||
После загрузки вы можете обнаружить, что даже при отсутствии подключенного устройства на дисплее всё равно будут показываться какие-то цифры. | |||
В результатах всегда будет какой-то шум, но вы также можете обнаружить, что конденсатор, добавленный между IN+ и GND, тянет электроэнергию и искажает результат (у электролитических конденсаторов, как правило, приемлемое внутреннее сопротивление). | |||
В этом случае я бы порекомендовал раскомментировать строчку с калибровкой (// calibration) и настроить её так, чтобы ваш прибор давал «0», когда к нему ничего не подключено. | |||
=См.также= | =См.также= |
Версия от 18:55, 1 марта 2021
Измеритель напряжения и силы тока [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», когда к нему ничего не подключено.
См.также
Внешние ссылки