2012年8月26日日曜日

登山用GPSナビゲータプロジェクト構想


私の趣味のひとつに登山があります。
連休を利用して久住(管理人は福岡市在住)あたりに行きます。
一人でキャンプして、朝早くからのぼり、温泉に入って帰るというのが定番コースです。

お盆休みは平治岳(ひいじだけ)に登ってきました。
写真を何枚かアップしておきます。

で、今回の山行きで新しいプロジェクトの構想が。

いつも一人で登り、かつ変なコースが好きということで、よく道に迷います。一歩間違えば遭難です。今回も何度も道を間違え、けっこうな目に会いました。
下の地図で太い赤は今回予定していたコース、細い青は実際に歩いたコースです。赤丸で囲んだ4箇所で分岐点を間違えています。特に1番目の分岐(赤丸のいちばんうえのやつ)は1時間以上のロスとなり、大損害でした。もともと歩きに行っているわけですから身の危険さえなければどうこう言うことでもないのですが、道を間違えると精神的なダメージがでかいです。
ちゃんと地図を見るか、事前の準備をちゃんとしていけばよいのですが、めんどくさいのと、いったん歩き出すとついつい行くとこまで行ってしまう性格で。


ということで、間違いをなくすためと、危険を避けるために、コースの分岐点が近づいたら知らせてくれるGPSナビゲータを作ることを思い立ちました。

構想は、

  • 国土地理院の1/25,000地図を元にチェックポイントの座標を決め
  • その値をフラッシュROMに記録し
  • チェックポイントに近づくとBeepを発する
これがボトムライン。そして可能であれば、

  • あらかじめ予定コースをベクトル情報として記録し
  • コース上にいるときは10秒おきくらいに「ピッ!」と鳴る
  • コースから外れると「ピー!」とアラームを発する
  • 精度は最低でも10mくらい
  • 分岐点の50m以内に近づくと分岐を知らせるbeep音が出始め
  • 近づいていくにしたがってピッチか間隔が変わる
  • 歩いたログが残る
さらに
  • 予定コースを簡単に作れるWindows用のソフト作成
というところまで行ければ行きたいと思います。

GPSそのものはつるしのモジュールが結構な性能になってますし、PICでコントロールした例もいくつかあるようです。シリアル通信ということで新しい取り組みであり、スキルアップにもつながりそうです。
まずは部品の入手ですね。
一次試作を秋までに。全体の完成を年内目標で進めたいと思います。



ということで、今回の山行きの写真など~

お世話になったキャンプ場
(くじゅうエイドステーションさん)

鳴子川沿いを登ります

こんな標識をよく見落とす私^^; 

はしご場なんかもあります 

これが平治岳
(北側から) 

山頂です
誰もいない代わりにトンボがたくさん飛んでました 

平治岳山頂から三股山、硫黄山方面
下は坊がつる盆地

こんな標識はさすがに間違えません 

下山路
もののけ姫の世界、みどりの洪水 

道に迷って時間をロスしたので滝には行けませんでした 

キャンプ場
ハンモックでのんびり 

適当ですが、料理もします 

買ったもの


またつまらぬものを買ってしまった。

スイッチ20個。モーメンタム、多分1回路。仕事の買い物で寄ったカホパーツセンターにて。
5こ100円だったもので^^;


ロータリースイッチ
前も買ったような気が....最後の一袋だったもので。最後のひとつには弱いんです。
2個で100円。これもカホ。


先丸ペンチ
これも仕事の買い物で寄ったダイソーにて。
これが100円とか。すごい世の中です。



スターリングエンジンwwwww
急に(笑)興味が出てきたもので。
ジュンク堂で1,260円。図書券でエンジンが買えるとは。
製作実験記事をアップする予定。


みら太のエアコンスイッチの自動ON/OFF その10 最終回

完成しました。

その9のトラブルは、コンプレッサー用の電磁クラッチに通電する回路のヒューズが切れていたためでした。
何でそんなことになったのか、はっきりとは分かりませんが、ちょうどリレーがONするタイミングとブレーキを離すタイミングが重なって電磁クラッチが瞬間的にON/OFFし、その際に発生したサージのためではないかと思われます。
ヒューズは完全に消し飛んでましたし、リレーの接点は軽く溶着したようです。これが起動しなおしてもLEDが点いてた(つまりリレーがONしたまま→溶着)原因のようです。

原因を考えていく段階で改めて電装の回路図を見てみると、あらら、エアコンのスイッチに直列に10Aものヒューズがはいっているじゃないですか。こここんなに電流流れてたんだ。わたしはエアコンスイッチはロジックのスイッチだけで、電磁クラッチの電流はどっかのリレーかサイリスタでコントロールされているのだと思い込んでました。
今ついてるリレーは Y14H-1C-5DS で0.5A/24VDC の規格です。これでは容量がぜんぜん足りてません。溶着するのも当たり前です。

...ということで、リレーを大容量のものに変更しました。5A/30VDCなので余裕のはずです。



リレーを変更して再度テストすると。....完璧です。期待したとおりのON/OFF動作をしてくれます。
これは便利だ! もうスタート時にエアコンのスイッチを切り忘れて後ろから煽られることもなくなりそうです。
しばらく走ってテストをした後に、エアコンのONタイミングを4速から3速に変えました。2速まで落とすとやや発進加速が厳しくなりますのでちょうどよいところかと。ということで、最終的なタイヤの回転パルスとエンジンの回転パルスの比のスレッショルドは0.5としました。
ブレーキの踏み込み時間による瞬間的なON/OFF発生の対策をする必要がある気もしますが、考えた結果もうしばらく様子を見ることにしました。電磁クラッチのサージは設計時に対策してあるはずですので、今回のトラブルはリレーの容量不足も関係したのかもしれないと思ったのです。もちろん瞬間的なON/OFFは電磁クラッチにとってもコンプレッサーにとってもよいことではないと思いますが、頻発するものではないですし。ということで問題がおきるまで放置^^;


さて、やっと出来たぞ~と思いながらニコニコして走っていると、また問題発生です。
まず、燃費計がうまく動いていません。タイヤの回転パルスが検出できていないようです。さらに、しばらく走っているとやはりエンジンの警告灯が点灯します。
タイヤの回転パルスは、大元の信号を燃費計と今回取り付けた基板で分割しています。エアコンコントロールの基板がうまく動いていることから考えて、パルスそのものはちゃんと来ているようです。また、エアコンコントロール基板をはずすと燃費計がちゃんと動くことから、おそらくエアコンコントロール基板側の入力インピーダンスが低いのでしょう。...つまり、回路図のトランジスタ(信号が弱かったのであとから付け加えたやつ)のベース抵抗560Ωが小さすぎるということかと。
ここはプルアップしているピンの電位をグランドに落としてやればよいだけなので、もっとこの抵抗は大きくてもよいはずです。
エンジン警告灯はちょっと厄介ですね。これもエアコンコントロール基板をはずすと消灯しますので、この基板が原因であることは間違いありません。さらには基板がエアコンをON/OFFし始めないと点灯しないことから考えると、う~ん、どうもリレーが入っている場所がよくないようです。
そんな目で電装の回路図を見てみます。(ここから先は推測です) 今、リレーは34番のACSWのラインを入り切りしています。つまり、ダッシュボードにあるスイッチをONしたままプレッシャースイッチ(エアコンのガス漏れを検知する圧力スイッチ)を入れたり切ったりしているのと同じことです。ここをコンピュータが異常と感知しているのではないかとおもわれます。
どうやってこれを異常とみなしているのかはよく分かりません。正常動作しているときは34番(ACSW)と55番(BLSW)両方に12Vが入るはずですが、コントローラーが34番を切ったときには55番のみにしか12Vがかかりませんので、その辺を見ているのかもしれません。
対策としては「ダッシュボードのエアコンスイッチを入り切りしているのとまったく同じ状態」を作るという方法があると考えています。つまり、55番と電源ラインの2回路を同時にリレーでON/OFFするということです。こうすればコンピューターから見てダッシュボードのスイッチが切られたのか、リレーが切ったのかの区別はつかないはずです。幸い、今回取り替えたリレーは2回路ですので、配線さえしてやれば実現は出来ます。ただ、この配線が厄介です。エアコンスイッチの裏の配線にアクセスするためにはダッシュボードをほとんど全外ししなければいけません。
これはもう少し涼しくなってからの作業とします。

なんだか不完全燃焼ですが、とりあえず動いたのでこれはこれで完成としたいと思います。
一応まだエアコンを使う季節のうちに完成したので良しとしましょう。

ソースは、ON/OFFのスレッショルドを変更しただけなので再掲載はしません。

2012年8月25日土曜日

買ったもの

ピンヘッダ 200 本
買いすぎ。なんに使うんだろう。


ピンソケット。適当に。
いつか使うだろうということで。



ジャンパピン 250個 wwwwwwwwww
2.54mm Mini Jumper Connector - Black (50-Piece Pack) @USD$ 1.40 5セット



バックライトつきキャラクタLCDモジュール。
在庫が少なくなってきたので。
16 x 2 Character LCD Display Module with Blue Backlight  @USD$ 4.70 2こ


一列のピンソケット。
やっぱりなんかに使うだろうということで。
カホパーツセンターで。値段忘れた。



2012年8月14日火曜日

みら太のエアコンスイッチの自動ON/OFF その9


フットブレーキを踏んだかどうかの判定を加え、条件判断までのプログラムを行いました。
ソースは一番下。
とりあえずこれで動くものになったということで、机上で軽くテストした後にみら太に搭載。

まずハンドルの下カバーをあけて、フットブレーキの検出線を取り付けます。いろいろと線が這い回っていますが気にせずに。昔取り付けた燃費計と、相安定マルチバイブレータで作った可変間欠ワイパーコントロール基板です。そのうちに紹介したいと思います。



スイッチは押されていない状態でON、押すとOFFという逆のロジックになっています。



コールド側(下流側)に線を割り込ませます。
この部分はブレーキを踏んでいないときは0V、踏むとランプ負荷につながり12Vとなります。


で、肝心のエアコンスイッチの線。
スイッチの裏まで到達するにはダッシュボード全体をはずす必要がありますが、面倒なので手探りで線を探して見ました。
候補が2本あったのですが、一か八かで切った線で正解だった(コンプレッサーが切れて、ボタンのLEDも消灯した)ようですのでそこから引き出しました。


エンジンをかけると、最初の5分間は何の制御もしません(ソース参照)。これは、エンジンをかけた直後は車の中が暑くなっている場合が多いということで、とにかくONにしとけというプログラムになっているためです。

んで、エンジンをかけて5分経過するとちゃんとスイッチが切れました。そこで、ブレーキを踏んでみると....おお!数秒後にちゃんとエアコンスイッチが入ります。で、ブレーキを離すと....エアコンが直ちに切れます。ということで、ブレーキの部分はちゃんと動いているようです。

次にシフト検出による制御に移ります。これは実際に走らなければいけません
期待と不安の中でスタートしました。
我が家から通りに出るには交差点をクランク状に二度曲がる必要があり、その間はのろのろ運転です。当然ブレーキも踏みます。
ということで、この間はエアコンは切れたままです。とりあえず1速2速のあたりでの誤動作はないようです。さて、ブレーキで減速して左右確認をしつつ大通りに出ようとしたところで、

「パチン」といやな音がしました。

あれ、と思いながらもそのまま通りに出てしばらく走り、4速に入りましたが、いつまでたってもエアコンがONしません。おかしいなと思って車を道端に寄せ、基板を見てみます。停車中はサイドブレーキを引いており、フットブレーキを踏んでいませんのでエアコンのスイッチは切れているのが正常です。その通り、確認用のLEDは点灯しています(つまりエアコンは切れている)。
先ほどの「パチン」も気になりましたが、おそらくはバグだろうと楽観的に考えて、再起動させてみることに。いったんエンジンを切って、再び始動します。

あれ?


なぜかLEDがついています。
始動後の5分間は消えていなければいけない確認用LEDがなぜかついています。
おかしいなと思い基板上のコネクタを抜き差しして再起動を繰り返していると、3回目でようやくLEDが消えました。
「やっぱり車の中はノイズが多いからな~」とか思いながら、とりあえず戻って原因を探すことに。
そうこうしているうちに車内が暑くなったのでとりあえず直結してエアコンを入れようとジャンパ線をエアコンスイッチ直結に差し替えました。

あれ?

エアコンのスイッチが入りません。スイッチのLEDがつきません、エンジンの回転数も変わりません、冷たい風も出てきません。
まずい。何かやった......... やはりさっきの「パチン」か?
背中を汗が流れたのは車内が暑かったからだけではありませんでした。


                                            その10に続く




以下ソース
//ファイル名 AirConCtrl-16F648A_LCD.c
//作成日 2012.08.11
//作成者 Ryuichi
//バージョン 1.0
//コンパイラ CCSC
//PIC PIC16F648A
//クロック 4MHz internal oscillator
//概要
// みら太のエアコンを自動ON/OFFするために、タイヤの回転パルス、エンジン回転数パルス等を
// LCDに表示させて何速に入っているかを推測するためのデータを取る
//使用ポート
// RA0-3: LCD data 用 data04-data07
// RA4: RS
// RA6: R/W
// RA7: E
// RB1-2: Jumper Switch 2bit
// RB3: リレー出力 B3_High で接点OFF
// RB4: Engine Pulse 0V->12V
// RB5: Wheel Pulse 5V->0V
// RB6: Brake ON-High

#include <16F648A.h>
#fuses NOWDT,PUT,NOMCLR,NOBROWNOUT,NOLVP,NOCPD,NOPROTECT,INTRC_IO

#use delay(clock=4000000) //クロック周波数設定
#use fast_io(B)
#use fast_io(A)

#define mode 0x00 //PortA all out put
#define input_x input_A //Use portA for controling LCD
#define output_x output_A
#define set_tris_x set_tris_A
#define stb PIN_A7 //define stb
#define rs PIN_A4 //define rs

//#define initial_delay_sec 18000 //300sec=5min
#define initial_delay_sec 180
#define on_delay_counts 9 //3sec

#define threshold 0.5 //determin ON/OFF condition

#include <LCD002.C>

float engine_pulse=0; //エンジン回転パルス用のカウンタ
float wheel_pulse=0; //タイヤ回転パルス用のカウンタ

int TMR0_countup=0; //counting interrupt of TMR0
long delay_timer0=0;//エンジンかけてしばらくコントロールしないためのタイマー
int delay_timer_counter=0; //On delay

short engine_pulse_ready=1; //RBの割り込みを見分けるためのフラグ
short wheel_pulse_ready=1; //同様
short foot_brake_on=0; //同様
short aircon_enable=0; //ON条件を満たしているかどうかのフラグ

void availability_test(void);

/* 割り込みを使うには以下の書式を使う必要がある。 #int_**** で割り込みソースを指定し
  その直後に割り込み処理を記述する。 リセット処理等は必要ない模様。*/

#int_timer0 //タイマ0用の割り込み処理
timer0_interval()
{

TMR0_countup++; //number of 64msec
if(delay_timer0<initial_delay_sec) delay_timer0++; //for delayed on 5min=18000counts

if(TMR0_countup>20){ //だいたい0.33秒

lcd_cmd(0x02); //カーソル原点
//パルス数書き込み
printf(lcd_data,"%3.0fEn %3.0fWl",engine_pulse, wheel_pulse);

lcd_cmd(0xC0); //改行して
//タイヤ回転パルスとエンジン回転パルスの比を表示
printf(lcd_data,"%3.3fWl/En %5lu",wheel_pulse/engine_pulse, delay_timer0);

//シフトが4速以上であるか、またはブレーキをかけているかを判定し、条件を満たす場合は
//設定時間経過後にエアコンスイッチを入れる
//条件が外れた場合には最大0.3秒以内にスイッチを切る
if(delay_timer0 == initial_delay_sec)
{
availability_test();

if(aircon_enable)
{
delay_timer_counter++;
if(delay_timer_counter > on_delay_counts) OUTPUT_LOW(PIN_B3);
}
else
{
OUTPUT_HIGH(PIN_B3);
delay_timer_counter=0;
}
}

engine_pulse=0; //カウンタリセット
wheel_pulse=0;
TMR0_countup=0; //reset counter 周期計測用のカウンタリセット
}
}

#int_RB //ピン変化割り込み(ここでエンジンとタイヤのパルスカウントとブレーキの状態を調べる)
RB_interruption()
{

//16F648のRBはピンごとの割り込みではなく、どのピンの変化でもこのルーチンに落ちるので、
//ここの割り込みを区別するためにこのようなややこしいことをする

if(wheel_pulse_ready && INPUT(PIN_B5)==0) //まずタイヤの回転パルス
{
wheel_pulse=wheel_pulse+1;
wheel_pulse_ready=0;
break;
}

else if(wheel_pulse_ready==0 && INPUT(PIN_B5))
{
wheel_pulse_ready=1;
break;
}

else if(engine_pulse_ready && INPUT(PIN_B4)) //次にエンジン回転パルス
{
engine_pulse=engine_pulse+1;
engine_pulse_ready=0;
break;
}

else if(engine_pulse_ready==0 && INPUT(PIN_B4)==0)
{
engine_pulse_ready=1;
break;
}

else if(foot_brake_on==0 && INPUT(PIN_B6)) //最後にブレーキを踏んでるかどうか
{ //これは割り込み使う必要ないんだけど
foot_brake_on=1;
break;
}

else if(foot_brake_on && INPUT(PIN_B6)==0)
{
foot_brake_on=0;
}
}


main()
{

SETUP_OSCILLATOR(OSC_4MHZ);

delay_ms(1000); //保険のため待ち

SET_TRIS_b(0x76);
OUTPUT_B(0); //最初はONのままで、条件が整うのを待つ

SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_64); //timer0 set up ~64msec
SET_TIMER0(0x0);

ENABLE_INTERRUPTS(INT_TIMER0); //各割り込みの許可
ENABLE_INTERRUPTS(INT_RB);

lcd_init(); //LCD初期化
lcd_clear();
printf(lcd_data,"Start");

ENABLE_INTERRUPTS(GLOBAL); //割り込み受付開始

while(1)
{

}

}

void availability_test(void) //条件判定用のサブルーチン
{
//シフトが設定値よりも上にあるか
if((wheel_pulse/engine_pulse) > threshold)
{
aircon_enable=1;
break;
}

//ブレーキを踏んでいるか
else if(foot_brake_on)
{
aircon_enable=1;
break;
}

//どちらでもなければ条件を満たしていない
else aircon_enable=0;
}

2012年8月11日土曜日

みら太のエアコンスイッチの自動ON/OFF その8

その7の信号計測でようやく自分が相手にする信号を確認(笑)したので、それに合わせて回路を変更。


 タイヤ回転パルスの電圧が 2.6V くらいしかなかったのでトランジスタを入れて5Vでプルアップしたピンを信号でGNDにおとすようにしました。当然ロジックは反転します。

んで、最終的な基板はこんな感じ。実態配線図とはかけ離れたものになりました。LCDケーブルもノイズがのり気味だったので思い切り短くしました。これで動作は非常に安定しました。


で、次は割り込みのプログラムです。
今回使ったPIC16F648はRBポートの全ピンでピン状態変化割り込みをかけることができるのですが、どのピンに変化が生じたかはわかりません。個々に調べる必要があります。

とりあえず、次に進むためにはタイヤの回転パルスとエンジンの回転パルスの比を調べてギアが何速に入っているかを調べる必要がありますので、そこまでのプログラムを書きました。
こんな感じ。(LCDのモジュールは変更がないので省略) コンパイラはCCS-Cです。

//ファイル名 AirConCtrl-16F648A_LCD.c
//作成日 2012.08.11
//作成者 Ryuichi
//バージョン 1.0
//コンパイラ CCSC
//PIC PIC16F648A
//クロック 4MHz internal oscillator
//概要
// みら太のエアコンを自動ON/OFFするために、タイヤの回転パルス、エンジン回転数パルス等を
// LCDに表示させて何速に入っているかを推測するためのデータを取る
//使用ポート
// RA0-3: LCD data 用 data04-data07
// RA4: RS
// RA6: R/W
// RA7: E
// RB1-2: Jumper Switch 2bit
// RB3: リレー出力 B3_High で接点OFF
// RB4: Engine Pulse 0V->12V
// RB5: Wheel Pulse 5V->0V
// RB6: Brake ON-High

#include <16F648A.h>
#fuses NOWDT,PUT,NOMCLR,NOBROWNOUT,NOLVP,NOCPD,NOPROTECT,INTRC_IO

#use delay(clock=4000000) //クロック周波数設定
#use fast_io(B)
#use fast_io(A)

#define mode 0x00 //PortA all out put
#define input_x input_A //Use portA for controling LCD
#define output_x output_A
#define set_tris_x set_tris_A
#define stb PIN_A7 //define stb
#define rs PIN_A4 //define rs

#include <LCD002.C>

float engine_pulse=0; //エンジン回転パルス用のカウンタ
float wheel_pulse=0; //タイヤ回転パルス用のカウンタ

int TMR0_countup=0; //counting interrupt of TMR0

short engine_pulse_ready=1; //RBの割り込みを見分けるためのフラグ
short wheel_pulse_ready=1; //同様

/* 割り込みを使うには以下の書式を使う必要がある。 #int_**** で割り込みソースを指定し
  その直後に割り込み処理を記述する。 リセット処理等は必要ない模様。*/

#int_timer0 //タイマ0用の割り込み処理
timer0_interval()
{

TMR0_countup++; //number of 64msec

if(TMR0_countup>60){ //だいたい1秒

lcd_cmd(0x02); //カーソル原点
//パルス数書き込み
printf(lcd_data,"%3.0fEn %3.0fWl",engine_pulse, wheel_pulse);

lcd_cmd(0xC0); //改行して
//タイヤ回転パルスとエンジン回転パルスの比を表示
printf(lcd_data,"%3.3fWl/En",wheel_pulse/engine_pulse);

engine_pulse=0; //カウンタリセット
wheel_pulse=0;

OUTPUT_TOGGLE(PIN_B3); //relay on/off ダミー
TMR0_countup=0; //reset counter 1秒計測用のカウンタリセット
}
}

#int_RB //ピン変化割り込み(ここでエンジンとタイヤのパルスカウントとブレーキの状態を調べる)
RB_interruption()
{
//16F648のRBはピンごとの割り込みではなく、どのピンの変化でもこのルーチンに落ちるので、
//ここの割り込みを区別するためにこのようなややこしいことをする
if(wheel_pulse_ready && INPUT(PIN_B5)==0)
{
wheel_pulse=wheel_pulse+1;
wheel_pulse_ready=0;
break;
}

else if(wheel_pulse_ready==0 && INPUT(PIN_B5))
{
wheel_pulse_ready=1;
break;
}

else if(engine_pulse_ready && INPUT(PIN_B4))
{
engine_pulse=engine_pulse+1;
engine_pulse_ready=0;
break;
}

else if(engine_pulse_ready==0 && INPUT(PIN_B4)==0)
{
engine_pulse_ready=1;
}
}


main(void)
{

SETUP_OSCILLATOR(OSC_4MHZ);

delay_ms(1000); //保険のため待ち

SET_TRIS_b(0x76);
OUTPUT_B(0);

SETUP_TIMER_0(RTCC_INTERNAL | RTCC_DIV_64); //timer0 set up ~64msec
SET_TIMER0(0x0);

ENABLE_INTERRUPTS(INT_TIMER0); //各割り込みの許可
ENABLE_INTERRUPTS(INT_RB);

lcd_init(); //LCD初期化
lcd_clear();
printf(lcd_data,"Start");

ENABLE_INTERRUPTS(GLOBAL); //割り込み受付開始

while(1){ //割り込み待ち

}

}

ソースが汚いのはいつものことなので気にしません ^^)

さて、いよいよ基板をみら太につないで実験です。

まずはアイドリング状態でエンジン回転パルスを見ます。 En がだいたい1秒くらいの間に検出したエンジン回転パルス数、Wl は同じ時間のタイヤの回転パルス(この写真では停車してますので 0です)。
そしてWl/En がタイヤの回転パルスとエンジン回転数の比です。目論見では、これがギアごとに一定の値になるはず。


では走ってみましょう。下は2速。


3速


4速


ということで、思惑通りに比が変化していきます。そして、これらの値は若干のばらつきはあるものの以下のようになることが分かりました。

後退: 0.08
1速: 0.18
2速: 0.29
3速: 0.45
4速: 0.60
5速: 0.79

これで狙い通りギアの位置を計算で知ることが出来ました。
値から見ると、比の値が0.5あたりがエアコンコンプレッサの始動を許可するかどうかの切り替えポイントになりそうです。

次はいよいよフットブレーキ検出を含めて、エアコンコンプレッサON/OFFの部分のプログラミング、そして実際に走りながらの調整です。
あともう一息。

みら太のエアコンスイッチの自動ON/OFF その7

いろいろと予想と違うことが判明。
すでに端子を引き出していた燃料ポンプの信号を見て「ppで12V、逆ロジック、上髭あり」と勝手に思っていたのですが、取り付けテストのために信号線を引き出して、オシロをあてたらあらびっくり、ぜんぜん違います。

まずタイヤの回転信号。こんな感じです。


10km/h くらいの低速で走ったときの信号です。電圧がppで2.56Vしかありません。これでは検出不可能です。スピードを上げてもパルスの幅が細くなって単位時間当たりのパルス数が増えていくだけです。
んで、エンジンの回転信号はというと.... こちらはppで13.4V と思惑通りなんですが、髭なんてありません。きれいな矩形波です。



なんかいろいろとこのままではまずいです。しかもどちらもロジック逆だし。
ということで、仕切りなおし。

2012年8月10日金曜日

買ったもの

今回はちゃんとした購入
秋葉原の aitendoさん の通販です

小型キャラクタ液晶。1個 350円。




LEDドットマトリクス(0.8"/8×8/red)[SZ410788K] 

何の変哲もないドットマトリクスLED 赤 カソードコモン。データシートはここ。 1個 100円。 4つ買った。




怪しいモジュール。 おそらくMDか何かのリモコン。 6個で 100円 だったのでつい。


LCDモジュール(24×2)[SC242A]

● タイプ:キャラクタディスプレイモジュール
● 型名:SC242A
● 表示文字数:24文字×2行
● 内蔵コントローラLSI: S6A0069
● ドライブー方法:1/5bias,1/16duty
● Power Supply for Logic(Vdd-Vss): 5.0V
● Power Supply for LCD(Vdd-V0):17.0V 
● Input Voltage(Vin): -0.3V to Vdd
● 作動環境温度:-10°C to -60°C
● モジュールサイズ:118.0 x 36.0 x 13.5mm
● ビューリングエリアサイズ:93.5 x 15.80mm
● アクティブエリアサイズ:88.3×11.5mm
● 文字サイズ:3.20 x 5.55mm
● 文字ピッチ:3.70 x 5.95mm
● ドットサイズ:0.55 x 0.65mm
● ドットピッチ:0.60 x 0.70
● バックライト:LED(黄色)、ガラス色:緑色
● 質量:55g 

手元のLCDモジュールは全部16x2文字なので、大きいものも何かに使うかなと。
バックライト黄色だったんだ。500円。 コントローラーのデータシートはこちら
まあ、普通のLCDですな。





買ったもの

またつまらぬものを買ってしまった。

2-Pin Cable Wire Terminal Connectors - Green (20-Piece Pack / 5.0mm)

得意のDealExtremeです。
コネクタ探してるんだけど、なかなかいいものがありません。お店で買うと高いし。ということでねじ止め式のターミナルを買ってみました。
ユニバーサル基板に載せられるし、並べれば数も調節できるし、ということで使ってみたいと思います。20個で $3.9



Semi Aluminum Tin Suction Sucker Desoldering Pump - Silver + Blue

これもDealExtreme
半田吸い取り器ですな。半田付けミスの多い私には必須の道具です。今使っているやつがたまに詰まるので予備機として購入。 $3.6 ということは 300円以下です。安い。




Common Use Axial Schottky / Fast Recovery / Fast Switching / Rectifier Diodes (220-Piece Pack)



ダイオードのアソートパック(笑
何に使うんだろう。
中身は
20 x 1N4004 Rectifier diodes
20 x 1N4001 Rectifier diodes
20 x 1N5399 Rectifier diode
20 x 1N4007 Rectifier diodes
50 x 1N4148 Fast switching diodes
10 x 1N5408 Rectifier diodes
20 x 1N5819 Schottky barrier diodes
10 x 1N5822 Schottky barrier diodes
20 x FR107 Fast recovery diodes
20 x FR104 Fast recovery diodes
10 x FR207 Fast recovery diodes


2012年8月5日日曜日

みら太のエアコンスイッチの自動ON/OFF その6


遅々とした歩みで進めております本プロジェクトですが、ようやくハードウェアのめどが立ちました。
基板もいろいろ修正やら追加やらして、こんな感じです。
液晶のコントラスト調整用の半固定抵抗(回路図にはありません)、動作確認用のLEDと電流制限抵抗(回路図にはありません)、LEDを消すためのジャンパ(かいr ....略)。


回路も恥ずかしい間違い(プルアップ抵抗の位置が違うとか)がありましたので修正しておきます。

みら太のエンジン回転パルスをオシロで拾ってみたところ、回転パルスが12V→0Vに落ちた後、0V-12Vに戻るときに盛大なオーバーシュートがあるのを発見しました。おおよそ8Vくらい。なんちゅう大きさやねん。
ということで、数μsecの短時間とはいえPICの絶対定格を軽く超えますので対策しました。入力のところにダイオードを入れてオーバーシュートを電源にお返ししています。ツェナーダイオードが入っているのは、それしか手元になかったためで意味はありません。Vfは0.6V位だったのでこれでPICのダメージを防ぐことができるのではないかと思います。

さてと、ようやくプログラムです。
前にも書いたとおり、エアコンスイッチをコントロールするために「みら太が何速で走っているのか」を計算します。そのためにタイヤの回転数と、エンジンの回転数を調べます。みら太はマニュアルなので、この二つの値の比はシフト位置によって一定のはずです。
タイヤの回転数と、エンジンの回転数はいずれも車載コンピュータから信号が出ていて、みら太はすでに燃費計とタコメータ(いずれもDIY後付)にその信号を使っています。これをPICの割り込みで計数します。で。計数した結果を表示させるためにLCDがついているというわけです。ということで、このLCDは実験の際には必要ですが、シフト位置を決める定数が分かり、プログラムに組み込まれた後は不要ということになります。

さて、まずはLCDをテスト的に動かします。回路図のPICは628ですが、628が見当たらなかったのでは648Aを使いました。メモリ量が違うくらいでほとんど同じマイコンです。

でソース


//ファイル名 AirConCtrl-16F648A_LCD.c
//作成日 2012.08.05
//作成者 Ryuichi
//バージョン 1.0
//コンパイラ CCSC
//PIC PIC16F648A
//クロック 4MHz internal oscillator
//概要
// みら太のエアコンを自動ON/OFFするために、タイヤの回転パルス、エンジン回転数パルス等を
// LCDに表示させて何速に入っているかを推測するためのデータを取る
//使用ポート
// RA0-3: LCD data 用 data04-data07
// RA4: RS
// RA6: R/W
// RA7: E
// RB1-2: Jumper Switch 2bit
// RB3: リレー出力 High で接点OFF
// RB4: Engine Pulse-0V
// RB5: Wheel Pulse-0V
// RB6: Brake ON-High

#include <16F648A.h>
#fuses NOWDT,PUT,NOMCLR,NOBROWNOUT,NOLVP,NOCPD,NOPROTECT,INTRC_IO

#use delay(clock=4000000)
#use fast_io(B)
#use fast_io(A)

#define mode 0x00 //PortA all out put
#define input_x input_A //Use portA for controling LCD
#define output_x output_A
#define set_tris_x set_tris_A
#define stb PIN_A7 //define stb
#define rs PIN_A4 //define rs

#include <LCD002.C>

main(void)
{

int count=0;

SETUP_OSCILLATOR(OSC_4MHZ);
SET_TRIS_b(0x76);
OUTPUT_B(0);

lcd_init();
lcd_clear();


ここから下は何か表示させればよいので適当

while(1){
DELAY_MS(500);
lcd_cmd(0x80);
printf(lcd_data,"%5urpm",count*1);
count=count+1;
printf(lcd_data,"%5urpm",count*1);
count=count+1;
lcd_cmd(0xC0);
printf(lcd_data,"%5urpm",count*1);
count=count+1;
printf(lcd_data,"%5urpm",count*1);
count=count+1;

//OUTPUT_TOGGLE(PIN_B3);

}

}



LCDの表示ライブラリは、dataピンの接続が違っているので、後閑さんのを一部手直し。
ビットシフトが二度手間っぽい動きをしていますが、そこはご愛嬌。


/**********************************************
*  液晶表示器制御ライブラリ
*  内蔵関数は以下
*    lcd_init()    ----- 初期化
*    lcd_cmd(cmd)  ----- コマンド出力
*    lcd_data(chr) ----- 1文字表示出力
*    lcd_clear()   ----- 全消去
************************************************/
// RA0-3: LCD data 用 data04-data07
// RA4: RS
// RA6: R/W
// RA7: E

/********* データ出力サブ関数 **************/
void lcd_out(int code, int flag)
{
output_x(code >> 4);
if (flag == 0)
output_high(rs); //表示データの場合
else
output_low(rs); //コマンドデータの場合
delay_cycles(1); //NOP
output_high(stb); //strobe out
delay_cycles(2); //NOP
output_low(stb); //reset strobe
}
/******** 1文字表示関数 **********/
void lcd_data(int asci)
{
lcd_out(asci, 0); //上位4ビット出力
lcd_out(asci<<4, 0); //下位4ビット出力
delay_us(50); //50μsec待ち
}
/******** コマンド出力関数 ********/
void lcd_cmd(int cmd)
{
lcd_out(cmd, 1); //上位4ビット出力
lcd_out(cmd<<4, 1); //下位4ビット出力
delay_ms(2); //2msec待ち
}
/********** 全消去関数 *********/
void lcd_clear()
{
lcd_cmd(0x01); //初期化コマンド出力
delay_ms(15); //15msec待ち
}
/******** 初期化関数 *********/
void lcd_init()
{
set_tris_x(mode); //モードセット
delay_ms(15);
lcd_out(0x30, 1); //8bit mode set
delay_ms(5);
lcd_out(0x30, 1); //8bit mode set
delay_ms(1);
lcd_out(0x30, 1); //8bit mode set
delay_ms(1);
lcd_out(0x20, 1); //4bit mode set
delay_ms(1);
lcd_cmd(0x2E); //DL=0 4bit mode
lcd_cmd(0x08); //display off C=D=B=0
lcd_cmd(0x0D); //display on C=D=1 B=0
lcd_cmd(0x06); //entry I/D=1 S=0
lcd_cmd(0x02); //cursor home
}



で、とりあえず表示はしました。
リレー出力の確認のためにLEDをつけたりして。

あれ、rpm がrwm になってる。....まあいいや。

次はPIN割り込み周りのプログラムです。

買ったもの


 へんなもの買った。
旋盤にもフライス盤にもボール盤にもグラインダーにもジグソーにもなるという優れものの家庭用工作機械、といった風情。
アリババで見つけてて、ずっと気になっていたのですが、今回思い切って買ってみました。総量込みで $150 くらいでした。

箱はこんな感じ。届いたときは中がぐっちゃぐちゃでした。


整理した中身

マニュアル すべて中国語 (‘Д‘)


 一冊は工作の手ほどきっぽい


こっちの組み立てマニュアルを見ながら、というかしゃしんを見ながら漢字の意味を何とか想像して組み立て実施。

 モーター(12V)とチャックなどをつけるモジュールをベルトでつなぐ。モーターちゃちい。
なんか「合格」のシールが貼ってあるけど、いったい何に合格したんだろう。

 まずは一番使いそうなボール盤を作ることに。
XYテーブルを組んで、

支柱(アルミ製)を立てて、

こんな感じで出来上がり。たぶん。


一応穴あけはできます。が、全体がきこきこしているというか、なんとも頼りない動きです。
まあ、手持ちよりは位置がちゃんと出るかな。というくらい。
支柱以外のパーツはプラスチックのため精度が出ていません。レゴでつくったみたいです。

....ボール盤にショックを受けたので、まだ旋盤に組み直すのはやっていません。
XYテーブルにステッピングモーターを組み込んで超小型NC加工機にすることを夢見ていたのですが、これはひどい。
ひょっとして金をドブに捨てたのか。