- 締切済み
PIC 12F629で車速ロックについてなんですが
PIC 12F629で車速ロックについてなんですが http://www.geocities.jp/yu_linus_hp/fielder/fielder_0802.htm こちらの方のHPを参考にして回路を少し変更して、フォトカプラを使用し、Pポジションをマイナスコントロールにし、サイドブレーキでアンロックするようにしたのですが、走行中にサイド(要するにドリフト)を引いた場合もアンロックしてしまいます。 これって、車速パルスを受けている間はアンロックしないようにできるのでしょうか・・・? 当方、回路はある程度わかるのですが、プログラミングは全くの初めてなので、さっぱりわからなく困っております。 どなたか、わかる方が居ましたらお願いします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- genso-cake
- ベストアンサー率65% (23/35)
動作確認できたようでよかったです。 あと、サイドを引いて停止でアンロックってのは、出来るには出来ると思います。 ただ、変更箇所が多そうなので、こっからは正直勘弁してください(^^;;) このプログラムの作者さんは結構出来る方だと思いますので、 直接、質問なさってはいかがでしょうか? 言語の勉強の件ですが、Cの方が簡単だと思います。 そのCですら、1からやるとなると大変と思いますが。 ただし、8bit系のPIC(特にPIC16やPIC12)は、 C言語との親和性がよろしくありません。 速度やコードのサイズを小さくするのだったら、やはりアセンブラです。 PIC16ならばアセンブラの命令は35個しかありません。 ですから、できあがっているプログラムを読んでいくのは、案外楽です。 はじめは、1つ1つの命令を追いかけていますが、そのうちブロックで考えられるようになります。 そして、いろいろなプログラムを読んでいくと、同じようなブロックが見えてきます。 ここまで来たら、Cでプログラムするのとあまり変わらなくなります。 実際のところ、私はCでプログラムを書いておき、 それをアセンブラに翻訳しています(人間コンパイルなんて読んでますがw) また、フローチャートくらいは書けるようになってください。 車速ロックのサイトの方も掲載されてますよね。フローチャート。 あんなちゃんとしたものでなくていいので、 どんな分岐をして、ループがどこからどこまで何回でなんてのが把握できたらOKです。 (私のフローチャートなんてめちゃくちゃですよ。記号とか規格にそってないしw) こんな感じで、プログラミングをする力をつけていってください。 その上でのポイントをいくつか・・・ (上の勉強の順に書いてあります。) ・勉強するのに使うプログラムは、かならず印刷してください。 初めのうちは、何をしているのかもすぐにはわからないはずです。 ですから、わかったことは、すぐ近くに書いておきます。 さらに、ブロックで何をしているのかも、線で囲って書き込んでいきます。 ジャンプしているところでは、矢印でジャンプ先を書いておくといいです。 また、ジャンプ先でやっていることを、矢印の根本に書いておくといいですね。 ・ノートをとる よく出てくる定石はノートに書き込む。 自分で書くときに手助けになるはずです。 ブログなんかに書いておくのもいいです。 ・何をつくるのか、はっきりさせておく 当たり前のようで、案外やってないことが多いです。 車速ロックの場合、どんなときにロックして、どんなときにアンロックするのか? 車速はどうやって調べるか?どれくらいの速度でロックするか? これを、どんどん具体化させていき、車速クロックが何クロックだったらロックする。とか、 ロック用のピンをLowにするとロックするとか、書いていきます。 また、ここをしっかりしていないと、テストをするときにテスト漏れを起こしやすいです。 長々と書きましたが、修得するためには結構長い時間かかると思います。 車速ロックのプログラムを1から組もうとしたら、1年はかかると思ってください。 でも、自分で組んだプログラムがうまく動いたときは、すごくうれしいものです。 根気よく続けて、すごいもの作ってください!!
- genso-cake
- ベストアンサー率65% (23/35)
MT車だったんですね。 ATでドリフト?って思ってたので、納得しました。 さて、おっしゃられる要求仕様なら、プログラムの変更は必要ですね。 割り込み中のP_posの読み込みを変更して、 車速パルスをカウントするようにしないといけません。 ということで、書き換えてみました。 ソースファイルの74行目から書き換えです。 ;***** Parking Position Door Unlock IntPpos btfss ChkFlag,lock ;ChkFlag(lock)=1, skip next return ; movlw d'5' ; movwf ChkCnt ; ChkCnt=5 movlw d'0' movwf TMR0 Ppos_Chk movf GPIO,w ; read GPIO movwf gpbuf ; btfsc gpbuf,p_pos ; if GPIO(p_pos)=0, skip next return ; call Timer100ms ; wait 100msec decfsz ChkCnt,f ; ChkCnt=ChkCnt-1 goto Ppos_Chk ; movf TMR0,w ; movwf tmr0_buf ; tmr0_buf=TMR0 movlw d'5' ; subwf tmr0_buf,1 ; tmr0_buf - w = tmr0_buf btfsc STATUS,0 ; if TMR0 - 5 < 0, skip next return bsf GPIO,unlock ; door unlock sw=on call IntTim500ms ; wait 500msec bcf GPIO,unlock ; door unlock sw=off bcf ChkFlag,lock ; ChkFlag(lock)=0 return ; このままだとわかりにくいと思うので、 スクリーンショットも載せておきます。 左に青丸がついているところが追加した箇所です。 ただ、テストもしてないので、十分検討してください。
補足
すいません。補足で返信したつもりだったのですが、返信できていなかったみたいです。。。 本当にありがとうございます! できました! 追加・変更箇所を追加したものを書き込みテスト走行したら 見事、作動します! 一つだけありまして、走行中にサイドを引いてもアンロックしないのはOKで、停止後サイドを引いてアンロックもOK なのですが、 走行中にサイドを引いたまま、停止した場合、車速が0になっても、そのままアンロックしません。 これって、簡単に変更できますか??? 変更できればお願いします。 いつも、本当にありがとうございます。 あと、言語を勉強しようと思っているのですが、 C言語とアセンブラどっちが楽ですか???(使うのはPICだけだとおもいます) よろしくお願いします。
- genso-cake
- ベストアンサー率65% (23/35)
補足ありがとうございます。 これで信号の論理がよくわかりました。 車速を使って判断するようにするには、 不可能ではありませんが、プログラムにかなりの変更を必要とします。 プログラムは全くの初めてということで、 しかも、もともとのソースがアセンブラなので、かなりつらいと思います。 そこで、次のような方法を提案させていただきます。 まず、ドリフト走行時にドアロックが解除ないようにするということなので、 パーキングの信号が12V、サイドブレーキの信号が0Vの時のみ ドアロックを解除するという方法はいかがでしょうか? サイドブレーキの信号を加えた理由がわからないので、これで満足されるかはわかりませんが、 信号待ちでパーキングにしたときに解除されるのを防ぐという目的ならば問題はないと思います。 この条件でよい場合、フォトカプラの出力側Trの結線を変更すれば達成できると思います。 http://www.play-hookey.com/digital/electronics/rtl_gates.html 上記のHP(英語ですが)の最後の方にNANDを得るための結線方法が書かれています。 (Trを縦に直列につなげている回路図です) 寝ぼけた頭で考えていて、間違っているかもしれないので、 実験を行っていただくことをおすすめします(汗) サイドブレーキを引いて、かつ、パーキングにしたときのみ PICの4番ピンにつながっているラインがLo(0V)になり、 それ以外はHi(5V)になってくれれば、大丈夫なはずです。
補足
度々、ありがとうございます。感謝です。 なるほどです。 こーゆーやりかたもあるんですねぇ! しかし。。。 やっぱりプログラム変更は私には無理ですかぁ^^;; なぜ、両方ほしいのかというと、 MT車(自分)とAT車(嫁)の両方に対応させたいんです・・・ AT車の方はPでアンロックでなんの問題もないんですが、 問題は自分の車のほうです・・・ MT車なので、P信号がないので上記提案はちょっと厳しいかなとおもいます。 なので、プログラム変更で対応できるみたいだったので、やってみたかったんですが、プログラム未経験ではキツイ物がありましたか・・・
- genso-cake
- ベストアンサー率65% (23/35)
車からの信号の論理が、混乱しているので確認です。 (以下の論理は、Trやカプラを入れない状態で) [シフトレバーのポジション] パーキングのとき → 12V パーキング以外 → 0V [サイドブレーキのポジション] ブレーキがかかっている → 12V ブレーキがリリース → 0V 以上の論理でよろしいでしょうか? また、PICにはI/Oピンの空きがないようですが、 どのように、シフトとサイドの信号を混ぜてますか? ワイヤードOR(それぞれの信号用Trのコレクタ同士を接続)で行われているなら、 少し配線に変更が必要になる気がします。 以上の2点、確認したいです。
補足
ありがとうございます。 現在の回路は少し変更してありますが(電源のノイズ等) 基本になっている、回路図を載せておきます。 http://www.joy.hi-ho.ne.jp/k-sekiguchi/lock.gif 素人の回路ですので、なにかヤバイところがあるかもしれません。 一応、当方の車両では問題なく作動します。 >>[シフトレバーのポジション] >>パーキングのとき → 12V >>パーキング以外 → 0V その通りです。 Pにすると12Vが流れることで、フォトカプラのLEDを点灯させ検出しています。 >>[サイドブレーキのポジション] >>ブレーキがかかっている → 12V >>ブレーキがリリース → 0V ではなく、 サイドブレーキのポジション] ブレーキがかかっている → 0V(アースに落ちる) ブレーキがリリース → 0Vというか、なし。 アースに落ちることで、フォトカプラのLEDを点灯させ、検出しています。 また、L端子は無視してください。 一応、こんな感じで全て正常に動作します。 今は、車速ロックご無条件で、サイドブレーキ or Pポジションでアンロックしてしまいますので、 車速を確認後(たとえば、5Km/h以下とは)、アンロックするようにしたいのです。 よろしくお願いします。
- genso-cake
- ベストアンサー率65% (23/35)
車の配線関連については、知識がないので、 サイドブレーキのon/offが得られるかはわかりません。 ただ、サイドブレーキ用のランプがある以上、 メーター類に信号を送っているのは確実です。 この信号が論理(ブレーキのon/offでlo/hi)ならば簡単です。 ナビ用に、サイドブレーキ信号が出ていることがあるようです。 Vitzの場合ですが、参考にてください http://minkara.carview.co.jp/userid/180001/car/331787/553222/note.aspx この信号が取れれば、あとは入出力に入れてやればよいのですが、 ピンが足らないので、PIC12F629では工夫をしないといけません。 (ワイヤードORとか) 何も考えず、18ピンくらいのPICでやるほうが無難かもしれません。
補足
ありがとうございます。 サイドブレーキの信号は取れています。 まず、作者のHPの回路ですと、パーキングポジション(+12V)の信号が C1815入り→12F629へ信号を送り、アンロックするという回路になっているのですが、それを当方が、フォトカプラを使用し、本来プラスコントロールのところを、マイナスコントロールにしてあります。 (サイドブレーキの信号は、アースに落ちる信号なので) このフォトカプラを使用した回路で無事アンロックはするのですが、 走行中にサイド(要するにドリフト)を引いたときにもアンロックしてしまうので・・・ 要するに、プログラムの書き換えで解決できるとは思うのですが。。。 プログラムが全くわかりません。。。 プログラムは、、車速パルスによってドアロックされるとスリープモードにはいり、サイドブレーキ信号を検出して、0.5秒後にドアロックを解除します。 サイドブレーキ信号を検出後、車速パルスを確認してからドアロック解除するようにプログラムを変えればいいと思うのですが、どう書いていいのかさっぱりわかりません・・・
お礼
本当に、ありがとうございました! 一応サイドの件は解決しましたので、 当分このプログラムで動かしておき、 勉強していきたいと思います。 勉強して理解して、1から自分で組んでみたいですね! とりあえず、アセンブラの方がいいということで、 早速、本を注文しましたので、本を読んでプログラムを印刷して眺めてみます! この度は、本当に助かりました! ありがとうございました!