Nゲージ 踏切センサー

作成中のNゲージ用踏切。
区間に列車の進入と退出を検知するためのセンサーを作った。
踏切センサー

このセンサーの出力をPICマイコンで判定し、音と、遮断機用のPICの入力にさせるつもり。

ただ・・センサーを作ったといっても、赤外線LEDとフォトトランジスタに抵抗をくっつけただけなのだが・・

Nゲージ 踏切の製作(その3) センサー

Nゲージ 踏切の製作(その3) センサー

Nゲージ 踏切の製作(その3) センサー

踏切を動かすためのセンサー。
レールを切って流れる電流を検知する方式、車輪にスイッチを踏ませる方式、光を遮光して検知する方法などいくつかある。

PWMのコントローラを作りたいと思っているので、なるべくレールは切り刻みたくないのでこの方式はパス。

車輪にスイッチを踏ませる方式の場合、自作するとリン青銅板などで作るパネの強さによっては脱線のおそれがある。
トミックスからはTCSワンタッチ装着センサー(5558 税抜き本体価格1,300円)が発売されているが、1踏切あたり4個のセンサー(上り進入、上り退出、下り進入、下り退出)を設置するとなるとセンサーだけでなんと5,200円。
ちょっと財布には厳しい。

ということで、遮光式のセンサーを自作することにした。

可視光センサーだと部屋を暗くして運転を楽しめないとか問題もありそうなので、赤外線センサーにした。
・・レイアウトの近くで赤外線ストーブなどはつけないと思うので。

赤外線LEDやフォトトランジスタにもいろいろな大きさのものがある。
Nゲージレイアウト上においてもあまり違和感がない大きさということで、表面実装用の赤外線LEDとフォトトランジスタを使用することにした。

光を出す側の表面実装赤外線LED(OSI5LAS1C1A)の大きさは3.5mm×2.5mm。
光を受ける側の表面実装フォトトランジスタ(PS1101W)の大きさは3.0mm×2.0mm。

この大きさだと踏切の周りにあるキューピクルと一緒においても違和感はないと思う。

それぞれのチップは高さの低いピンソケットをさかさまにして、その足にはんだ付け。
レイアウト上にはピンヘッダを立てておいて、これにチップをつけたピンソケットをさすことにした。

センサーはピンヘッダに取り付け
表面実装用のチップは高さの低いピンソケットをさかさまにして、その足にはんだ付け。

レイアウト上にはピンヘッダを立てて、これにチップをつけたピンソケットをさす。

2ピンずつに切りだし。

表面実装赤外線LEDとフォトトランジスタ
上段はφ5の赤外線LEDとφ5のフォトトランジスタ。こちらを使うとちょっと大きめ。
中段は表面実装チップをハンダづけしたピンソケット。こちらを使うことにした。
下段はレイアウト上におくピンヘッダ。

当初は、ジャンパピンに表面実装チップをつければ、いかにも踏切周りにあるキューピクルそのものに見えるかなと思ったが、ジャンパピンはピンをショートさせるもの。
つまり、中は導通があるので、チップへの配線は外につける必要があり、加工が面倒そうなので、ピンソケットを使用した。

表面実装赤外線LEDの大きさ
左から、ジャンパピン。
次が、赤外線LED。
その次がフォトトランジスタ。
ちなみにピンの上部にハンダづけしているので、チップとピンソケットのあいだに空間があるが、これは実際に取り付けるときに微調整するつもり。

ブレッドボード上で試してみることにした。
ブレッドボード上でテスト
ブレッドボードの大きさに制約があるので、やたらチップと車両がくっついているが、本当はもっと離しても大丈夫。

踏切の音声を鳴らしたり、LEDを点灯させる部分のPICマイコンは、入力端子がLOになったら起動する(アクティブ・ロー)ようにしてある。

なので、センサーにかかっていないときはHIの状態。LEDをつなぐと点灯する状態。

ブレッドボード上でテスト
車両は、センサーにかかっていない状態。
緑のリード線のところに見えるLEDは点灯中。

センサーにかかったら、LOの状態になってLEDは消灯する状態。

ブレッドボード上でテスト
車両は、センサーにかかっている状態。
緑のリード線のところに見えるLEDは消灯。

OKでした。

このセンサーを4組作って、いったんPICマイコンで踏切を動作させるのか停止させるの判定をさせ、その出力をLOかHIかで音声部、遮断機部のPICの入力端子につなげばOK・・のはず。

ここの回路は簡単で、発光部は赤外線LED1個と抵抗1個、受光部はフォトトランジスタ1個と抵抗1個。

表面実装赤外線LED 10個で150円くらい。
表面実装フォトトランジスタ 10個で200円くらい。
330オームくらいの抵抗は100個で100円、4.7kくらいの抵抗も100個で100円くらい。
(ちなみに、今回使ったのはLED側は330Ω、フォトとランジスタ側は4.7kΩ)

ピンソケット、ピンヘッダ等もそれぞれ50円くらいのもので、センサー10個分はできる。

と、いうことで、センサー部は10組作って、650円くらいでしょうか。

(電源部除く・・市販のセンサー買っても必要ですし・・)



MPLAB X IDEで、はまる・・(3)

MPLAB 8からMPLAB X IDEに移行し、ついでに今後はC言語じゃ~ということで・・ドツボにはまっている状態。

今回は、いよいよ解決編。

最終的にわかってきたのは、「c言語でビルドした.hexファイルをPICKit3で書き込んだ際、ベリファイで失敗する」ということ。

PICKit3が言うには、命令アドレスには5番地に飛ぶ命令が欲しいらしい。

ならば、リンカのオプションを調べてメインルーチンを5番地に配置すればいいのか?
などと、考え始めていたが、ふと思った。

ベリファイで失敗するなら、ベリファイしなけりゃいいじゃん

PICKit3 Programmerでベリファイのオプションを外して書き込んだら、書き込みは正常に終わった。
その後、PICから読みだして1画面に表示された部分を、.hexを読み込んだ時点のハードコピーと見比べたら「だいたい同じような感じ」。ということで目視によるベリファイはOK!?

まだ動作は確認していないけど、これでMPLAB X IDEとc言語に移行してもいいのかな。

大量に同じPICを作るんじゃなく、1~2個作ってその動作をみて、100%動作をチェックするんだから、ベリファイしなくても失敗してりゃ動かないのですぐわかるだろう。

MPLAB X IDEのProject Propertiesの画面で、PICKit3の設定に関する項目を見てベリファイの設定がどうなるのかみてみた。

PicKit3の設定
ベリファイの省略の設定はできないみたい。

PICKit3はベリファイに失敗したら、何かほかのものを書き込んでるみたいだから、やはりベリファイは省略して正常終了させる必要がある。
(イレースしたあとに確認しても何か入っている。なに書いてんだろう。)

やはり、今後も書き込みはPICKit3 ProgrammerやIPEのお世話になる必要があるみたい。

さて、
書き込んだものはちゃんと動くんでしょうか。

MPLAB X IDEで、はまる・・(1)
MPLAB X IDEで、はまる・・(2)

MPLAB X IDEで、はまる・・(2)

MPLAB 8からMPLAB X IDEに移行し、ついでに今後はC言語じゃ~ということで・・ドツボにはまっている状態。

MPLAB X IDE

ビルドして、PICKit3、ICPS書き込みアダプターキット経由でPICに書き込もうとしているのだが、

The following memory area(s) will be programmed:
program memory: start address = 0x0, end address = 0x26
configuration memory

Programming…
program memory
Address: 0 Expected Value: 280f Received Value: 2805
Failed to program device

という感じで、書き込みができない。

で、「MPLAB X IDEで、はまる・・(1)」のようにしてひとまず、PICKit3が正常に動作し、ターゲットとなるPICも正常に書き込めることは確認した。

できあがった.hexファイルを以前のようにPICKit3 Programmerで書き込もうとしてもエラーになる。

試しに、以前作った.hexファイルをMPLAX Xを使って書き込んでみるとちゃんと書き込める。
つまり、MPLAB XからはちゃんとPICKit3を制御できているようだ。

ならば、以前のアセンデラのソースをMPLAB Xでアセンブルから処理したらどうなるのか試してみた。
結果は、書き込めなかった。

コンペア
何が悪いのかと、MPLAB 8で作成した.hexとMPLAB Xで作成した.hexファイルをコンペアしてみた。

MPLAB 8でアセンブルした.hexファイルの先頭
:020000040000FA
:020000000528D1
:0800080009008316FF2390009C

MPLAB Xでアセンブルした.hexファイルの先頭
:020000040000FA
:020000000528D1
:040002000034003492
:0800080009008316FF2390009C

どうやら、:04というレコードが余分に出力されているようだ。
で、04てなんなんだ!?
調べたら、拡張リニアアドレスレコードらしい。

MPLAB 8での手順を思い出したら、プロジェクトをMakeするときに、
「Absolute or Relocatable?」というダイアログがでていたような。
そこで、Absoluteを指定したような。

Absoluteモードの指定

じゃ、MPLAB Xはどこで指定するんじゃと探してみたら、プロジェクトのプロパティ設定画面にあった。

左上のペインからプロジェクト名を選択して右クリックするか、ダッシュボードの工具のアイコンをクリックするとプロパティ設定画面が表示される。

build in absolute mode
mpasm(Global Options)を選択すると、
Build in absolute modeという項目があるので、この項目をチェック。

リビルドすると出力された.hexファイルには04というレコードはなくなっていた。

これを書き込むと、ちゃんと書き込めた。

64bit対応としてアナウンスされているMPLAB X IDEからPICKit3経由で書き込みに問題がないことは確認できたので、今後はPICKit3 Programmerは卒業かも。

・・余談ですが、
当たり前といえば、当たり前かもしれませんが、エクスプローラーで、プロジェクトのフォルダにアクセスしている状態だと、ビルドでクリーンするときに失敗します。

で話を戻して、C言語で作成した.hexファイルをみてみても04というレコードはなかった。
これじゃないみたい。

 

じゃ、コンパイラの問題か?

今回使ってみたのがXC8コンパイラv1.21のFree版。
これを使って、MPLAB 8でビルドして出来上がった.hexをMPLIB Xでビルドしたものとコンペアしたら同じだった。

ならば、コンパイラを変えてみようとHI-TECH PICC(v9.81)を使ってみたが、こちらでやっても書き込みはできなかった。

そもそも、PICに応じたconfigが設定できているのか?
物理的に書き込めない状況ではないなら、論理的。
PICに書き込めないコード等があるのか?

PICを使うときは、そのデータシートをみてconfigの定義をおこなっていた。

実際には、そのPICに対応したファイルをincludeして、__CONFIGを記述。

#include p16fxxx.inc
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_ON & _MCLRE_OFF & 等々

c言語でも同じようにp16fxxx.hというファイルが用意されているので、
このファイルをinclude・・・しなくても、xc.hをincludeしておけばいいらしい。

#include <xc.h>
#pragma config CPD = OFF
#pragma config CP = OFF

などと、定義していく。

#pragma configで値を定義するときにはヘッダファイルにどういう名前で定義されているかをp16fxxx.hから探す必要があるのか・・

Config Bitsについては旧バージョンではメニューの「Configure」のなかにあって、Output to fileという項目を選ぶとファイルに出力することができたが。

Config Bitsの設定

configuration bits
メニューから、「Window」「PIC Memory Views」「Configuration Bits」を選択

configuration bits設定
Configuration Bitsのウインドウが表示される。
ここには、フィールド名と設定できるオプションの説明などが表示されている。

セレクトボックスがあって、設定する値を変更することができる。

画面下に表示された「Generate Source Code to Output」というボタンを押すと生成されたソースが表示される。

configuration bits設定ソース生成
いちいちファイルに出力しなくても、そのままコピペできる。

と、いうことで特にヘッダファイルは探し出さなくてもいいみたい。

ちなみに、「PIC Memory Views」の機能にはほかにもいくつかある。

program memory
Program Memory

生成されたプラグラムのコードが先頭からディスアセンブルされたコードと一緒に表示されているようだ。

そこで、みっけ。

そもそも今回、コンパイルした.hexをPICに書き込もうとしたときに出たエラーメッセージは、
program memory
Address: 0 Expected Value: 280f Received Value: 2805
Failed to program device

アドレス0番地、280fかと思ってたら2805だもんなぁってことみたい。

program memoryを見ると、0番地はOpcodeが280fで、0xf番地へのGOTO命令。
で、要求されている2805は5番地へのGOTO命令。

0番地はPICが動作を開始するアドレスで、4番地には割り込み開始時のアドレス。
アセンブラでは割り込みの4番地の後の5番地にメインルーチンを置いて、0番地には動き始めたらGOTO 5番地のメインルーチン。(2805)
などとなっていることが多いと思うのだが・・

ここらで頭がこんがらがってくる。

IDE上で見る限り、Program Memoryの先頭の0番地は280fとなっている。
書き込み時には 280fを要求したが、Received Valueは2805だったということらしい。
じゃ、だれが2805を返してきたんだ!?

一旦、MPLAB X IDEから離れて、再びPICKit3 Programmerで試してみる。

  • 現在のPICの中身をEraseで消す
  • c言語で生成した.hexをインポートする
  • 画面に表示されたProgmam Memoryの先頭(インポートしたファイの中身)は280Fになっている
  • 書き込みを行う
  • エラーになる
    Progmamming failed at Program Memory address 0x000000
  • Readで読み込んでみると先頭は2805になって、そのあとも中身が違っている

PICKit3で書き込みができていなかった

なにか別モノが書き込まれたみたい。

要は、ソースは280f・・だったのに、書かれたのは2805・・ということでベリファイでエラーになったようだ。

じゃぁ、PICがおかしいのかと思って、以前アセンブラで作ったのと、今回c言語で作ったのを何度か入れ替えながら書き込みを試したが、どうやらc言語で作ったものは書けないけど、アセンブラで作ったものは問題なく書けるようだ。

もしかしたら、PiCKit3のバグ!?
c言語で書き込めないから、申し訳ないので自分自身のモジュールでも書き込んでいるのか!?

ちなみに、今使っているPICKit3のバージョンは、
Application Version 3.10.00
Device File Version 1.62.15
OS Firmware Version 2.00.05

現時点の最新バージョン。

なんとなく、絞り込まれたきた感じはするが・・どうすりゃ、解決するんだ!?

MPLAB X IDEで、はまる・・(1)
MPLAB X IDEで、はまる・・(3)

MPLAB X IDEで、はまる・・(1)

PICマイコンを開発するワークベンチ、MPLAB IDE。
MPLAB X IDEを使って、C言語で開発してみようとして・・ドツボにはまっている状態。

解決の糸口が見えないので、そもそもどこに原因があるのかを最初から検証してみることにした。

なぜ、MPLAB Xにするのか。
従来のIDEは、MPLAB 8 IDE。
これは、すでにv8.92で開発が終了し、MPLAB X IDEに移行している古いバージョン。
業務用にバリバリ開発するわけではないので、別に古いバージョンでも構わないのだが、気になるのが、マイクロチップ社のホームページでの分類。

MPLAB IDEは、「32-bit Windows」用に分類されている。
一方、MPLAB X IDEはWindows用、Mac用、Linux用があるが、Windows版は「x86/x64」用となっている。

私がメインで使っているのが64bitのWindows7ということで、ちょっとひっかかる。

ProgrammerとしてPiCKit3を使用しているが、64bitのWindows7にMPLAB 8 IDEをインストールしても64bit用のUSBドライバはあるようで、MPLAB 8からも、PICKit3 ProgrammerからもPicKit3を認識してちゃんとPICに書きこむことはできる。

メーカーとしても正式に動作確認していないので32bit用としてしかアナウンスしていないのか、どこか動作しない部分があるのかは不明だが、いずれにしても使い慣れているからといってすでに開発が終了している32bit用に固執するより、これからもバージョンアップされるだろう64bit対応版のMPLAB Xに移行する時期かなぁということでMPLAB Xに移行することにした。

これからは、c言語にしたいのは、入力、出力ともになるべく多くできるPICを使いたい要件があるが、複合条件の判定部はアセンブラよりc言語のほうが机上デバッグも確実にできるかなぁという思いから。

・・が、いざ試してみるとmain関数が空の状態になってもPICに書き込むときにエラーになる。
何が悪いんじゃ~

PICKitは、MPLAB 8で作ったものの書き込みに使用しても問題なく動作しているが、設定を確認する意味で、最初から手順の検証しなおし。

MPLAB 8にPICKit3を接続

MPLAB 8 PICKIT3 接続エラー

PICKit3を繋いでおいて、MPLAB 8を起動。
メニューから「Programmer」「Select Programmer」「PICKit3」を選択する。

PICKit 3 detected
Connecting to PICKit 3…
PK3Err0033: 4 byte expected, 0 byte received

Failed to properly connect to PICKi3 3
と出力されて接続できない。

PICKit3には、PICKit自身にOSをインストールした上でPICKit3 Programmerを使ってPICに読み書きができるモードとMPLABから制御するMPLABモードがある。
PICKit3がMPLABモードになっていないとMPLABから接続時にエラーとなる。

PICKit3 Programmerでモード切り替え

PICKit3 Programmerを起動してみると、ちゃんとPICKit3に接続できる。
つまり、MPLAB modeではない。

PICKit3 Programmerから接続
メニューから、「Tools」「Revert to MPLAB mode」を選択すると、MPLAB 8からPICKit3に接続できるようになる。

MPLAB 8 に接続
PICKit3をMPLABモードにして再度MPLAB 8から接続を試みると、
PICKit 3 Connected.
というメッセージが出力され、接続されたことがわかる。

が、
PK3Err0045: You must connect to a target device to use PICkit
3.
というメッセージもでてる。

ICPS書き込みアダプターキット

PICKit3の先にはターゲットとなるPICをICPS書き込みアダプターキットや実際の回路(写真ではブレッドボードに回路を組んでます)におくことになるが、この回路上には電源を持っておく必要がある。

ちょっとした回路で消費電力も少ない場合はPCからPICKit3経由でPICに電源が供給できる。

なもんで、PCから電源を供給する設定

電源設定
メニューから「Programmer」「Select Programmer」でPICKit3が選択されていることを確認し、「Programmer」「Settings」を選択する。

電源供給と電圧設定
PICKit3 Settingsのダイアログが表示されたら、
Powerタブを開いて「Power target circutt from PICKit3」にチェックを入れ、VoltageでターゲットのPICに対応した電圧を指定する。

ダイアログを閉じてOUTPUT画面に戻ると、
Device ID Revision = 0000000b
と出力されて接続ができた模様。

ちなみに、MPLABでプロジェクトを開いていない状態でPICKit3の電源の設定をしようとしたら、3.3Vまでしか設定できないようになっていた。

5Vを使用するPICを指定したプロジェクトを開いて試すと、5V以上も設定できるようになっていた。

このプロジェクトを閉じたあとも・・なぜかはわからぬが、5V以上の設定ができるようになっていた。

だけど・・
MPLABにPICKit3をつなげば、ターゲット回路上でデバッグができたりする・・らしい?
が..、注意書きもあった。

Vddには100μ以上のコンデンサをつけてはいけない、とか、MCLRにコンデンサをつけてはいけない、とかPGC、PGDにはプルアップ抵抗をつけてはいけない、とか・・、とか。
6個くらい注意書きがあった。
8ピンくらいのPICではこの制限から逃れるため別のピンを使おうなんてできないし。

仕事で複雑なものを作るわけではないので、ICPS書き込みアダプターキットで書き込んで、PICを取り外してターゲットボード上にもっていくという面倒な手法をとっていた。

PICの足が悪くなるくらい付け替えを行わないようちゃんと机上デバッグをガンバロー。
ちなみに、Win32対応というのが気になって、複雑なIDEよりも単機能なPICKit3 Programmerなほうがトラブルがあっても解決がしやすいかなということで書き込みはおのずからPICKit3 Programmerを使用していた。

今回、念のため、MPLAB 8でもちゃんと書き込めるのか再度試してみたが、一応書き込にも問題はなかったようだ。

で、PICKit3 Programmerの再設定

再びPICKit3 Programmer

MPLAB modeになっているPICKit3をPICKit3 Programmerに接続すると、

The PICKit 3 in MPLAB mode Use the Tools menu to download an OS compatible with this application.

というメッセージがでる。

PICKit3にOSインストール

PICKit OS ダウンロード
「Tools」「Download PICKit Operating System」を選択する。

デフォルトだと、PICKit3 Programmerをインストールしたディレクトリが表示され、ここに「PK3OSV~.hex」ファイルがあるはずなので、これを選択するとOSがインストールされる。

・・ということを再度確認しなおし、実際に作った.hexファイルを書き込んだりして、PICKit3は正常に書き込み動作ができること、試験に使っているPICも正常に読み書きできることを確認した。

MPLAB X IDEで、はまる・・(2)
MPLAB X IDEで、はまる・・(3)

1 2