NRS-1を使って左右交互連などを使う

 アーケードゲームによってはゲーム中に左右などを交互に連射することにより、いろいろと良い事があったりします。有名なところではワンダーボーイ モンスターランドやファイナルファイトでしょうか。
 以前から販売しているNRS-1という連射基板と、同じく販売を開始したNCN-2という板コネを使うと簡単に左右交互連などを使うことが出来るようになります。

モンスターランドの場合

 モンスターランドの場合、ゲーム中に特定のポイントを通るとゴールドが出現するのですが、その際に交互にレバーを入力していると多めにゴールドが出現します。人力でやるとかなり大変なのですが、こちらをNRS-1とNCN-2を使用すると簡単に実現出来ます。


 必要な物

  • NRS-1
  • NCN-2
  • 56ピンエッジコネクタ(CR7E-56DA-3.96Eなど)
  • JST NHの10ピンハウジング, コンタクト(メーカーページ)
  • 適当な電線
  • JAMMAの5ボタンまで配線してあるハーネス


 適当な電線+JST NH10ピンですが、NRS-1用として販売しているCPS1等接続用ケーブルを切って使うのが一番簡単かもしれません。
 上記した物を使って以下のような配線を行います。

  • NCN-2に56ピンエッジコネクタを半田付け(半田付け例)
  • NCN-2の1P SHOT4, 1P SHOT5を電線で短絡します。
  • NRS-1のOUTPUTコネクタの1P SHOT4を1P LEFTに、1P SHOT5を1P RIGHTに接続

 こちらは実際に配線を行った写真を見た方が分かりやすいかもしれません。

 上記配線を行って基板 -> NRS-1 -> NCN-1 -> JAMMAハーネスと接続します。その後に以下の設定をNRS-1に行います。

  • SHOT4を30連
  • SHOT5を30連裏(INVERT LED点灯状態)

 この設定を行うとSHOT4かSHOT5を押すと左右を交互に連射することになります。


 ゴールドが出てくる箇所を通るときに上記ボタンを押しながら通ると多めにゴールドが出てくるようになります。が、ちょっと癖があるため、入力方法などはちょっと考えないといけません。

  • A = 1 = アタック
  • B = 2 = ジャンプ
  • D = 4 = 左右交互30連

などと設定すると良いかもしれません。

ファイナルファイトの場合

 ファイナルファイトの場合、アイテムが出てくる樽などを壊す時に左右や上下にレバーを高速に入れていると、ダイヤモンドや金塊などの高得点アイテムが出現します(錬金と言ってました)。残機数は標準設定ではある数以上増えないため、点数にあんまり意味は無いのですが、左右からドラム缶が転がってくるところで錬金を行うと点数アイテムがたくさん出てくるためかなり気持ち良いです。上から落ちてくるシャンデリアや敵が樽などを壊す際も左右や上下にレバーを高速に入れていると錬金出来ます。


 用意する物などはモンスターランドの場合と同じで、配線も同じで問題ありませんが、ファイナルファイトの場合は上下の連射の方が遊びやすいかと思います。NRS-1の設定内容も同じです。
 ファイナルファイトの場合、

  • A = 1(30連) = アタック30連射
  • B = 2 = ジャンプ
  • C = 1+2(30連) = 必殺技ボタン
  • D = 4 = 上下交互30連

上記のような設定で遊んでいます。
 ボタンの配置などは遊びやすいように変更してください。


 これら以外にも左右や上下に連射が出来ると何かラクが出来たりするゲームがありますので、そのようなゲームにも使えるかと思います。

エッジコネクタを基板に半田付け

 エッジコネクタを基板に半田付けすることがたまにあったりします。こうやるとある程度ラクに出来るかな、という方法を書いておきます。
 エッジコネクタのピンを曲げてしまうと結構簡単に半田付け出来ます。


 そのまま半田付けしようとすると基板との隙間が大きいため、結構めんどくさいことになります。ここは思い切ってエッジコネクタのピンを下記写真みたいに曲げます。

 写真は不揃いですが、綺麗に合わせると半田付け後の見た目がちょっと良くなります。
 上記状態にした後に基板を挟み込み、1ピンだけを半田付けします。

 その状態で横から見て水平になっているか、を確認しながら調整を行います。

 水平になっていることが確認できたら、全てのピンを半田付けします。写真はなんか上下ズレてますが、大体あってます。

 半田は多めに使って、全体に半田がまわるぐらいまで気持ち長めにハンダコテを当てると良いかもしれません。


 ピン数が多いのでちょっと時間が掛かりますが、簡単に半田付け出来ます。

簡易型電流プローブNYA-01 | NYA manufacturingを使ってみたよ

 twitterのプロモーションで、消費電流の変化をオシロスコープで波形として見る商品が流れてきたので買ってみて使っています。
 たぶんこのツイート

だったと思いました。


 抵抗に電流が流れると抵抗値に応じて電圧が発生(V=I*R)しますが、それを利用して電流を電圧に変換しているはずです。使っているICは性能などからdigikeyで探してみて、たぶんMAX4376では無いかな、と思っています。
 4,5pinに抵抗20mΩを付けて1Aの電流を流すと抵抗値両端の電圧は
20mΩ*1A=20mV
として見えて、上記MAX4376のゲイン50倍の物を使うとこれが50倍されるので
20mV*50=1000mV=1V
の電圧として見えるようになります。そちらをオシロスコープで見ると波形として消費電流を見ることが出来ます。


 ちょこちょこと使っていたのですが、試しにみんな大好きダライアス外伝の基板を動かした時に、+5Vの消費電流がどう変化しているか、が見えるような動画をtwitterに投稿してみました。

 大体2.6A程度で、こちらはクランプメーターとほぼ同じ値になりました。結構大きく電流値は変化していることや、VSync(16.6ms)に同期して変化していることなどがなんとなく分かるのでVSyncをトリガにして波形を見た方が良かったかなとか。消費電流は大きく変わりますので、パスコンなどをきちんと入れましょう。


 VSyncをトリガにして波形を撮り直して、こちらの方が見やすいので追加しておきます。

 ch1が黄色で消費電流値、ch2が青でVSyncです。ch1のXY軸の設定は同じでXが50mA/divでYが5ms/divです。


 こういう電流を見るためのプローブも売っていますが結構高いので、約2000円でここまで見られれば良い物だと思います。
 電流を視覚的に見ることが出来ると、低消費電流の物がどのように電流を消費してどのくらい電池が保つか、などの計算が出来たり、数日に1回だけ起こる不具合があり、それがあるデバイスに過電流が流れて壊れる場合などに過電流が起こった時にオシロのトリガを掛けて、全体を止めてメールを送って…などというデバッグに使ったりしています。


 電圧も電流も何事もそうですが、見えない物が見えるようになるといろいろと分からなかったことが分かるようになったりすることもあります。こういう事象をある程度簡単に安く見ることが出来るようになり、良い時代になったなと。

テキストエディタで編集して表面に付けたシルクを裏面に

 タイトルそのままです。kicadの変更をGUI+マウスではなく、エディタなどでファイルを直接行うと楽な場合があるので簡単な例を。
 Pcbnewで表面のシルクを付けて、裏面にも同じ内容で同じ位置に置きたい場合。マウスで再度入力するのもありですが、エディタを使って編集すると短時間で作業を行えます。


 まず、kicadを全て閉じてプロジェクトを保存しているディレクトリを丸々コピーします。念のために。
 次にプロジェクトを保存しているディレクトリを見て、プロジェクト名+.kicad_pcbというファイルを探して適当なエディタで開きます。
 すでに入力した表面のシルク文字を探してみます。そうすると(gr_text ...)という記述で内容と場所などが記載されています。

 裏面シルクにコピーしたい内容をすべてコピーし、F.SilkSをB.Silksに変更、さらに裏面の場合はミラー文字にしないと反転してしまうので(justify mirror)を追加します。
 vimだとcommand modeでshift+vで範囲選択して、:を押してs/F.SilkS/B.SilkS/で置換して、さらに同じように範囲選択して:を押してs/)))$/)) (justify mirror))/で置換出来ます。簡単。

 上記変換を行ってからPcbnewで開くと表面のシルクが裏面にコピーされていたら変更完了です。


 kicadはテキストファイルで保存されるので編集が簡単です。ある部品を等間隔で並べたい、という時にはperlrubypythonなどで編集するようなスクリプトを書くとラク出来るかもしれません。
 で。そういうのはkicadで出来るのでは無いか、と思って調べたらpythonでscriptを書くと色々と出来るようになっています。"kicad python scripting"とかでググるといろいろと出来ます。ので何か書こうかなと思ってます。

cygwinのruby + fiddleでFT232RLのBit-Bang modeを使う

 いろいろと作業をしていると、ある決まった変化をする信号を出力したくなることがあります。たぶん。そういうときにFTDIのFT232RLというチップを使うと便利です。
 Windowsの場合、C#のライブラリを使ってプログラム書いてもそれなりに簡単に書くことが出来ますが、cygwinrubyで動かせるようになるとよりお手軽かな、と思って試してみたところ問題無く動かせましたので、簡単にメモとして残しておきます。


 FT232RLの実装された基板は秋月電子で販売されているFT232RL USBシリアル変換モジュールキット: 半導体 秋月電子通商-電子部品・ネット通販を使用しています。実験で使用する場合、同じく秋月電子などで販売されているブレッドボードを使うと簡単に実験することが出来ます。


 ruby 2.0から、*.dllや*.soなどのダイナミックリンクライブラリを扱うためのライブラリとしてfiddleが使えるようになっています。こちらを使ってftd2xx.dllを使用するためのコードを作成します。

require 'fiddle/import'

module FiddleFTD2xx
  extend Fiddle::Importer
  dlload "ftd2xx.dll"

  extern "unsigned int FT_Open(int, void*)"
  extern "unsigned int FT_Close(void*)"
  extern "unsigned int FT_SetBaudRate(void*, unsigned int)"
  extern "unsigned int FT_SetBitMode(void*, unsigned char, unsigned char)"
  extern "unsigned int FT_GetBitMode(void*, unsigned char*)"
  extern "unsigned int FT_Write(void*, void*, unsigned int, void*)"
end

class FTD2xx
  attr_reader :handle, :write_length

  def initialize
    @handle = Fiddle::Pointer.malloc(Fiddle::SIZEOF_VOIDP)
    @write_length = Fiddle::Pointer.malloc(Fiddle::SIZEOF_INT)
  end

  def open(idevice)
    FiddleFTD2xx.FT_Open(idevice, @handle)
  end

  def close
    FiddleFTD2xx.FT_Close(@handle.ptr)
  end

  def baudrate=(rate)
    FiddleFTD2xx.FT_SetBaudRate(@handle.ptr, rate)
  end

  def setBitMode(ucmask, ucmode)
    FiddleFTD2xx.FT_SetBitMode(@handle.ptr, ucmask, ucmode)
  end

  def getBitMode
    mode = Fiddle::Pointer.malloc(Fiddle::SIZEOF_CHAR)
    FiddleFTD2xx.FT_GetBitMode(@handle.ptr, mode)
    return mode.to_i
  end

  def write(data)
    write_data = [data].pack("C*")
    FiddleFTD2xx.FT_Write(@handle.ptr, write_data, 1, @write_length)
  end
end

 とりあえず必要な関数だけしか書いていません。必要に応じてftd2xx.hを見て追加しています。
 こちらをftd2xx.rbとして保存し、以下のようなソースコードで呼び出してBit-Bang modeでI/Oを制御することが出来ます。

require 'ftd2xx'

ftd2xx = FTD2xx.new

ftd2xx.open(0)
ftd2xx.setBitMode(0xff, 0x0)
ftd2xx.setBitMode(0xff, 0x1)

wait_time = 0.1

1.upto(10) {
  0.upto(6) { |i|
    data = 1 << i
    ftd2xx.write(data)
    sleep wait_time
  }
  7.downto(1) { |i|
    data = 1 << i
    ftd2xx.write(data)
    sleep wait_time
  }
}

ftd2xx.write(0)
ftd2xx.close

 FT232RLのD0~D7に抵抗とLEDを付けて、上記プログラムを実行すると以下のようにLEDが点滅します。

 こんな感じで簡単に信号を変化させることができるので、ちょっと思い付いたことや簡単なICの制御などに使用すると便利です。

レイフォースで連射が不安定になる原因について

 NRS-1という連射基板を作ったのですが、その際にレイフォースの連射が不安定になるということを知り、なぜそうなるのかを調べて原因が分かりましたので簡単に記載しておきます。


 原因はレイフォースは入力を取り込むタイミングが処理内容により変わり、従来のシンクロ連射回路でボタンの更新をするタイミングと入力を取り込むタイミングがほぼ同じタイミングになり、安定してON->OFF->ON->OFF...と取り込めなくなるため、でした。


 簡単にタイミングチャートっぽいのを踏まえて書くと、デモ画面や普通に背景などの処理がある程度ある場合は

 上記のようにボタンの更新タイミングと、入力を取り込むタイミングが異なるため問題無くON->OFF->ON->OFF...とボタン入力が変化します。


 3面冒頭の雑魚が出てくるシーンでは処理が軽くなり、ボタン入力が下記のようになります。

 ボタンの更新タイミングはVSYNCの立ち上がりのため変わりませんが、入力を取り込むタイミングが前後するためON->OFF->ON->OFF...とならず、ON->ON->OFF->ON->OFF...などのようになってしまい、規則正しく入力を行うことが出来なくなります。
 そのためある特定の場面で連射が効かなくなるようになってしまいます。


 NRS-1ではその他基板に関しても調査を行い、問題が無いであろうタイミングで入力の更新を行っています。そのためレイフォースでも連射が途切れるようなことはありません。
 従来のシンクロ連射回路でもタイミングを変更することにより問題無く動作するようになるのではないかと思われます。

起動しなくなったタイトーF3システムマザーボード

 以前から調子が悪く、起動したりしなかったりしていたF3基板が全く起動しなくなってしまいました。ROMを別のマザーボードに差し替えたところ動いたのでマザーボードの故障。
 詳しい方に聞いてみたところ、マザーボード側コネクタの半田が浮いて接触不良に良くなるよ、と教えてもらったので再半田したところ直りました。
 見た目全然問題無さそうでも接触していないようです。この手のコネクタは良く接触不良を起こしますが、見た目で分からないのが厳しい。


 再半田したのは下記画像の4つのコネクタ。念のために全部再半田してあります。かなりのピン数ですが、気長にやればいつかは終わります。