ROBOBASIC講座(低電圧検出ルーチン)
今回は電源電圧の検出についてです。前回出てきたADポートの6番がそれに割り当ててあります。電圧が下がると暴走を始めるので、組み込んでおきたいルーチンですよね。しかし私は、この辺り全然試していないので、以下に上げた参考資料をもとにまとめたものです。
《参考資料》
- ロボットのいる生活。
ROBOZAK(ROBONOVA-I)用低電圧検知回路を作りました。 しかし・・・ - RoboZak奮戦記
電源検出電圧の実測値と計算値 - 週刊ロボザックお助け掲示板
低電圧とプログラム暴走の関係 - Overall Template Program (コード下記:1)
- action_auto.bas (コード下記:2)
- HERO'S Downloadの
ATmega128/128L日本語翻訳データシート - ROBONOVA-I 日本語マニュアル
《ROBONOVA-Iのマニュアルでは》
ハイテックのサイトからダウンロードできるROBONOVA-I 日本語マニュアルのP95に「(7) LOW-VOLTAGE WARNING設定方法」という項目があります。ここには以下のように書いてあります。
《個体差がある》
avalonさんは151くらい(1、3)、fkさんは155くらい(3) 、Overall Template Programでは148、action_auto.basでは160でチェックしていて、個体差があるようです。あと、ADアダプタと、バッテリでも値が異なるようです(2)。
《電圧を求める式は》
ATmega128/128Lのデータシート(6)のA/D変換器の項目(p153〜)を読んでみたけど難しいですねavalonさんが(1)と(3)の中で、電圧とAD(6)の値の関係は「Overall Template Program」のrobot_voltageに式が書いてありますが、少し間違っており、以下のようにおっしゃられています。
----------------------------------
式は恐らくこうだと思います。
Value = (Voltage/基準電圧 × 1/2) × 256 - 1
→ 5.8V / 5 × 1/2 × 256 - 1 ≒ 147
※256はADポートの分解能
※-1は0〜255までなので
※1/2は分圧回路・・・精度はここまでないと思います。
※基準電圧は約5Vですが、これが下がるとValueが大きくなってしまいます。
----------------------------------
《robo_voltageを使う場合は》以前、ハイテックにあったテンプレートについて(1)で書きましたが、Overall Template Programにあるrobo_voltageのルーチン(以下)はENDIFがないので、このままでは変なことが起きてしまうかもしれませんので、このルーチンを使う場合は、ENDIFを書き加えて下さいね。
それから毎回呼ぶ必要もないなぁという場合は、例えば以下のように動かす前だけチェックするようにしてもいいのかもしれません。
IF RR<>0 THEN GOSUB robot_voltage
ON RR GOTO MAIN,K1......
.....
IF A<>0 THEN GOSUB robot_voltage
ON A GOTO MAIN,K1......
.....
あと、好みですが、例えば以下の様にアレンジすると、電圧が下がると点減回数が増えるようにできますね。
CONST kLED=52
CONST kLowVolt=155
CONST kStopVolt=151
A=AD(6)
IF A<kStopVolt THEN
END
ELSEIF A<kLowVolt THEN
FOR v=A TO kLowVolt
OUT kLED, 1
DELAY 200
OUT kLED, 0
DELAY 200
NEXT v
ENDIF
RETURN
《電圧検出用ルーチン》
いちおうハイテックさんのページにあったコードの中にあった、電圧検出用ルーチンを書いておきます。
1, Overall Template Programより
'================================================
robot_voltage: ' [ 10 x Value / 256 = Voltage]
DIM v AS BYTE
A = AD(6)
IF A < 148 THEN ' 5.8v
FOR v = 0 TO 2
OUT 52,1
DELAY 200
OUT 52,0
DELAY 200
NEXT v
RETURN
2, action_auto.basより
'================================================
robot_voltage: ' [ 10 x Value / 256 = Voltage]
A = AD(6)
TEMPO 230
IF A < 160 THEN MUSIC "G" ' 6.25 Volt
RETURN
----------------
にほんブログ村
| 固定リンク
「ROBOBASIC講座」カテゴリの記事
- 制限の勧め(2008.10.09)
- IF文の中のIF文(2008.10.31)
- ROBOBASIC講座(IN, OUT, BYTEIN, BYTEOUT)(2008.03.25)
- ROBOBASIC講座(解りやすく?修正しやすく?カッコ良く?スマートに書くためには)(2008.03.28)
- ROBOBASIC講座(AD, RCIN)(2008.03.28)
「工作・改造・解析」カテゴリの記事
- Maker Faire Tokyo 2014 に行ってきました(2014.12.14)
- ワイヤーストリッピングゲージ(2014.06.26)
- Arduino関連の本を買いました(2013.09.04)
- LCDオシロスコープキット(4)(2009.10.07)
- LCDオシロスコープキット(3)(2009.10.05)
コメント
この話題とは直接関係ないですが、ATmega128LのA/Dコンバータは本来10bitの分解能なので、本当はもっと細かくデータ取れるハズなんですよねー(×4倍)
roboBASICのByte型で扱いたいんで落としている様な気がします。
それから、また脱線しますが、ちょっと面白い情報が手に入りました。近いうちにブログに書きます。(笑)
投稿: avalon | 2008年4月 6日 (日) 05時45分
はい、面白い情報楽しみにしてま〜す
って、avalonさんの情報はいつも面白いから、どれがその情報なのか区別がつかないかも。。。(笑)
投稿: micono | 2008年4月 6日 (日) 14時49分