月曜日, 10月 21, 2019

micro:bit 想定 ニッケル水素電池チェッカーを作ろう! 準備編

(追記)

 前の投稿の通り,micro:bit の「アナログ出力」とはPWMのことで,以下回路は修正が必要。気が向いたら直します...

(追記終わり)

家にたくさんあるニッケル水素電池を活用したい。でも,結構古いものもあるので,選別,リフレッシュも兼ねて,容量の確認,つまり放電を行う小物を作ってみようと思い立った。

マイコンを使って,電圧を読みながら放電電流を調整すれば,過放電も防げる。


ついでに充電も考えてみた。


部品をそろえるまで,テストプログラムを作ってみた。放電専用

[A] を押すと,目標放電電流を10mAあげる。
[B] を押すと,10mA下げる。

充電で,micro:bit から取り出す場合,100mAが限度なんで注意。まずはその制限はなし。

デバッグ用に,USBに現在の値をかき出すようにしてみた。

input.onButtonPressed(Button.B, function () {
    if (Target_mA < 200) {
        Target_mA = Target_mA + 10
    }
})
input.onButtonPressed(Button.A, function () {
    if (Target_mA > 0) {
        Target_mA = Target_mA - 10
    }
})
serial.onDataReceived(serial.delimiters(Delimiters.Hash), function () {
})
let P2_VCONT = 0
let P1_VDET = 0
let P0_VBAT = 0
let Target_mA = 0
let step_time = 1000
let next_time = step_time + input.runningTime()
serial.redirect(
    SerialPin.USB_TX,
    SerialPin.USB_RX,
    BaudRate.BaudRate9600
)
pins.analogWritePin(AnalogPin.P2, 0)
basic.forever(function () {
    P0_VBAT = pins.analogReadPin(AnalogPin.P0)
    P1_VDET = pins.analogReadPin(AnalogPin.P1)
    if (input.runningTime() > next_time) {
        next_time = next_time + step_time
        serial.writeLine("P0_VBAT: " + convertToText(P0_VBAT) + " means " + P0_VBAT / 1023 * 3.3 + "V")
        serial.writeLine("P1_VDET: " + convertToText(P1_VDET) + " means " + P1_VDET / 1023 * 3.3 / 3 * 1000 + "mA")
        serial.writeLine("P2_VCONT: " + convertToText(P2_VCONT))
        serial.writeLine("Target_mA: " + convertToText(Target_mA))
        serial.writeLine("----")
        basic.clearScreen()
        for (let i = 4 - Math.round(P0_VBAT / 1023 * 4); i <= 4; i++) {
            led.plot(0, i)
            led.plot(1, i)
        }
        basic.pause(100)
        for (let i = 4 - Math.round(Target_mA / 200 * 4); i <= 4; i++) {
            led.plot(3, i)
            basic.pause(100)
        }
    }
    if (Target_mA > P1_VDET / 1023 * 3.3 / 3 * 1000) {
        if (P2_VCONT < 1023) {
            P2_VCONT += 1
            pins.analogWritePin(AnalogPin.P2, P2_VCONT)
        }
    }
    if (Target_mA < P1_VDET / 1023 * 3.3 / 3 * 1000) {
        if (P2_VCONT > 0) {
            P2_VCONT += 0 - 1
            pins.analogWritePin(AnalogPin.P2, P2_VCONT)
        }
    }
})

0 件のコメント: