2012年06月29日
紆余曲折している燃料計。
メーターの一部をイジって変換した電圧を入力する事も考えましたが、どうせなら抵抗値を与えたいと思ってます。
4月の初めにデジタルポテンショを購入してますが、SPI通信が今ひとつ理解できず、棚上げ状態でした。
しかししばらくぶりに検索してみると、arduinoで超簡単に制御できるようです。凄いぜarduino。
これで1台のarduinoで水温計と燃料計が制御出来ちゃうんだもの、ついニヤニヤしちゃいます。
今考え中なのは燃料計の表示の刻みについて。エロ2000は残量1目盛りで点灯しますが、R2はもっと早くから。このポイントと1/2の値を合わせ込んだら結構まともな表示になりそうです。
とりあえず、明日は水温計の動作確認です。
Posted at 2012/06/29 22:25:07 | |
トラックバック(0) | 日記
2012年06月26日
先ほどのメータ用のプログラムに使うデータのお話しです。
R2のメータ(実際はふうれい氏のステラだけど)は50℃で水温の青表示が消灯しますから
低温側で使うのは50℃から上での抵抗値。
高温側は120℃もあれば超危険ですが、サラダ油を温めたら150℃になっちゃったので
温度降下の安定し始めた140℃から下での抵抗値を測定。
デジタル温度計(0.1℃単位、但し誤差±1℃)を使って、温度センサーの抵抗値を、概ね
1℃刻みで(200Ω以下は0.1Ω刻み)テスターにて確認です。
この測定結果をエクセルに入力しグラフにしますが、誤差により凸凹があります。
なので、近似曲線(今回は6次で下16桁。)を求めて、この近似式から抵抗値を算出。
これを温度毎の抵抗値としました。
次はECUが受け取っている方法を考えます。
R2の場合は、20℃と80℃でのECUとセンサー間の電圧が分かっています。
一般的にセンサーの片側はアースに接続、片側はプルアップ抵抗とECUに接続されてます。
なので、センサー用電源を測定して(今回は5V)、下記の計算式でプルアップ抵抗値が
分かります。抵抗値は2kΩとか2.2kΩ刻みが決まってますので、一番近いものでOK。
センサー⇔ECU間電圧 = 5V×センサー抵抗値÷(センサー抵抗値+プルアップ抵抗値)
※式は変形してね。
ということで、センサー抵抗・基準電圧・プルアップ抵抗が分かれば、あとは温度に応じた
表示の設定を考えます。
エロ2000メーターの場合は1~7段階ですが、1段階目は消えません。なので、2段階目を
50℃以上とし、7段階目は危険な温度の手前115℃に設定します。ということで、私は‥
1段目:50℃未満
2段目:50°以上70℃未満
3段目:70℃以上80℃未満
4段目:80℃以上90℃未満
5段目:90℃以上100℃未満
6段目:100℃以上115℃未満
7段目:115℃以上
としました。
R2のエンジンは概ね90℃以下で安定しているようですから(これも、ふうれい氏)
まぁ普段は中央にいてくれると思います。もちろん任意で選べますが、メーターの反応は
とても遅いので、こんなものでいいかなーという感じです。
温度を決めたら、温度に応じたセンサーECU間の電圧を計算します。またその電圧を
AD変換した値(電圧÷(5V÷1024)、整数値)で決めてやります。
この値を前回のseg1~7に入れてやれば必要な信号がArduinoで生成されます。
はしょって書いてますが、まぁこんな感じです。
あとはー
6段階になったらブザーやライトの警告表示も簡単に設定できますよね。
もちろん7セグ表示などで0.1℃刻みの温度を表示することも可能ですが、高温域では
現状ではそこまでの分解能はありません。この場合はAD変換用の基準電圧を3Vとかに
すればOKです。
Posted at 2012/06/26 18:05:41 | |
トラックバック(0) | 日記
2012年06月26日
エロ2000用のプログラムを書いてみました。
プログラムよりもR2の温度センサーの特性を確認するほうが
はるかに面倒。また受け側の設計も調査する必要があります。
今回はArduino用です。もちろんPICでもできますが、書き方が
違うので、こちらのほうが分かりやすいかな?と。
温度センサーの値(電圧)を読み込んでそれに応じたパルスを
生成しているだけの簡単なプログラムです。Hi:0.033秒で固定、
Lo:0.1~1.2秒に変化させます(0.1秒刻み)。
実際にはAD変換時間等で誤差がありますが、今回は無問題。
コメントが多いのでごちゃごちゃしてますが、黒文字の箇所が
プログラムです。またvid loop() {以降が本体で、それより上は
もろもろの設定です。seg1~7の箇所に直接値を入れてもOK
ですが、まぁ変更しやすいかな?と。
メーターの表示速度が早ければ温度上昇・下降に応じて比較
する値をズラせばチラつかなくて良いです。エロ2000メーターは
反応がとてつもなく遅いので、これでOkでしょう。
/////////////////////////////////////////
//S2000メーターの水温計表示用プログラム//
/////////////////////////////////////////
//ピン設定
//A0にセンサー⇔ECUの間から分岐して入力
#define tout 2 //2ピンをメーターへ入力する
#define LED 13 //基盤上のLEDをチェック用に点滅する
//定数設定
//★★seg1~7 の値に、温度センサーの対応するAD変換値を入力する
int seg1 = xxx; //これ以下で表示1コマ(最小表示、この値は実際には使われない)
int seg2 = xxx; //これ以上で表示2コマ
int seg3 = xxx; //これ以上で表示3コマ
int seg4 = xxx; //これ以上で表示4コマ
int seg5 = xxx; //これ以上で表示5コマ
int seg6 = xxx; //これ以上で表示6コマ
int seg7 = xxx; //これ以上で表示7コマ(最大表示)
int tdata; //AD変換値
void setup() {
pinMode(tout, OUTPUT); //2番ピンを出力に設定
pinMode(LED, OUTPUT); //13番ピンを出力に設定
}
void loop() {
digitalWrite(tout, HIGH); //最初に出力をHiにする
digitalWrite(LED, HIGH); //基盤のLEDをHiにする
delay(33); //Hi時間待つ
tdata = analogRead(0); //電圧を0段~1023段階でデータ化して格納する
//AD変換値を比較してLo時間を設定する
if(tdata <= seg7){
tcnt = 1;
}else if(tdata <= seg6){
tcnt = 2;
}else if(tdata <= seg5){
tcnt = 3;
}else if(tdata <= seg4){
tcnt = 5;
}else if(tdata <= seg3){
tcnt = 10;
}else if(tdata <= seg2){
tcnt = 11;
}else{
tcnt = 12; }
digitalWrite(tout, LOW); //出力をにする
digitalWrite(LED, LOW); //出力をにする
//比較結果により0.1秒のLo時間を繰り返す
while(tcnt > 0){ //カウント(tcnt)が1より大きい場合にwhile{ }の中を繰り返す
delay(100); //Lo時間待つ
tcnt -- ; //カウント(tcnt)-1
}
}
Posted at 2012/06/26 12:38:51 | |
トラックバック(0) | 日記
2012年06月26日
忙しくなるのは7月からのハズだったのですが、なぜか今日から。
また23~0時帰宅モードの発動です。
しふたーを全数送り出せて本当によかったです。
現在、Arduinoでサーボモータを動かす勉強中。
作例は多いので、簡単ぽいです。動作条件とか決めるのが
楽しみですね。ネットブックで開発できちゃうのは素敵。
仕事が忙しい時には通勤中のお遊びが大切かと。
Posted at 2012/06/26 00:23:00 | |
トラックバック(0) | 日記
2012年06月25日
昨夜のエロ2000メータ作業です。
これまで水温計を一生懸命動かそうとしてましたが、ピクりとも動きません。
壊れたメータ買っちゃったかなぁーとか思いましたが。
なんてことはない‥
接続ミスでした。。。
メーターの正しいピンに接続しデータを入力すると正しく動きました。
まるまる2か月近くのロス、やってることが阿呆です。
あとは燃料計用の抵抗値を置き換えればひとまず完成っぽいですね。
Posted at 2012/06/25 11:40:51 | |
トラックバック(0) | 日記