alchemistarkの日記

やったことのメモ

ボタン部分

作成する箱の厚み、価格等を考慮してあえて照光式押しボタンではなく
格ゲー等に使われている丸ボタンを採用。

セイミツさんのスケルトンのやつにしたよ。
http://www.seimitsu.co.jp/newpage4.html#30ネジ

ていうか照光式でない長方形ボタンは無いのか。マジで。
押しボタンはマイクロスイッチではないが、格ゲーとかで分かる通り精密な操作に十分に耐える。

以前家庭用スティックからボタンを外して自作コン作ったことがあるのだが、その時と同じ寸法で箱設計したら
セイミツさんのボタン、長かったよ…箱接着した後で気付いたよ…
慌てて延長した。手間が…


自分の作ったやつの寸法
コントローラー自体の設計はもうあちこちでやり尽くされているのでこだわるならそちらを。
こちらはあくまでプレイできりゃいいって考えです。
http://cdn-ak.f.st-hatena.com/images/fotolife/a/alchemistark/20140224/20140224140305_original.png?1393218255

ボタンの上下の間隔がちょっと広すぎたかも。押しにくい。
ボタンが上下に長いって大事だな…分かってて妥協したんだけどさ…*1

あと内部空間に30mm以上の高さが必要です。30mmでも圧着端子とか使うときは端子を曲げないとダメです。ハンダ直付けならいけるかも。


お皿左に置いてやっとプレイ安定した…
これなら大丈夫…かな?
https://drive.google.com/file/d/0BwYJ4gOcMYIpNjFpMk9hdm5qWUE/edit?usp=sharing



鍵盤についてはまた考えよう。諦めたら丸ボタンのままで。

*1:これで問題なくプレイできてたら(スケルトンとか使わずに)安い丸ボタンを使えば大幅なコストダウンになる

ターンテーブル追記

次の記事は箱とかボタンとか組み立ててからだと思ってたのだが、ターンテーブルを仮組みして接続した時点で問題発覚。
前回ワンショットの時間が短いんじゃないかと長めの設定(0.33sec)をしたのだが、見事に裏目に出た。
お皿を高速で擦ると1方向に入りっぱなしになる。ワンショット中に次の入力が~の繰り返しが起きているのだろう。
反対方向の入力でリセットされないんだ…そうなんだ… なんか勝手にそう思い込んでいた…

とりあえず対処案としては単純にワンショットの時間を減らす、パルスの検出頻度を減らす、反対方向でリセットされるようにできないか考える
の3つのどれかかな。ちょっと考えてみる。ていうかCLR端子でリセットするの忘れてるんじゃねこれ

----------------------------


CLR端子に前段の出力を入れて、逆方向検出中はクリアするようにしてみた。
多少マシになったが、やはり高速でこするとうまく動かない。何が悪いんだ…

https://docs.google.com/file/d/0BwYJ4gOcMYIpRlJCdjFvQU16ems/edit

動画取ってみた これはひどい


逆方向の入力とはいえ連続パルスをそのまま叩き込んでるのが悪いんだろうか…?
かといって整形できないぞこれ。

逆回転中にしかCLRはLにならないので大丈夫と思ってたんだが、(その間のAとBは共にLなのでCLRの立ち上がり時には何も起きないはず)
擦ったらBとCLRが同時に立ち上がったりしてる…んだろうか?

74HC123を74HC423に変更すれば済む気がしてきたが非常にめんどくさい。(423はCLRの立ち上がり時にパルスを出さない)

あとCLR端子を使う関係でORゲートをXORゲートに変更した方が配線が減る。
ああめんどくさい。


だいぶ心折れてる。
見ただけで分からないので実装するしかないんだけど、基板3枚目とか本当に辛い。
ブレッドボードはあるけど、どうしてもどうせ実装するんだしと思ってしまう。


----------------------------

配線をもう一度考え直したら負論理をORでまとめようとしてた。アホか。
上にXORゲートって書いてるけどそれも間違ってる。Lに対するORだからNAND…でもなくて出力もLパルスだからANDでいいはず。

まとめるのを諦めて片方の74HC74からのみ出力をCLR端子に接続。*1
おお、動いた動いた。
微妙におかしな動きをしている気もするが、コンボも繋がってるし…ううむどうなんだこれ。
とりあえずこのまま作って、完成品でちゃんとプレイしてみよう。

https://drive.google.com/file/d/0BwYJ4gOcMYIpeEprcXljampRaWs/edit?usp=sharing

動画撮り直した。

*1:検出回数が半分になるのでその間に余計な事が起きる可能性はなくもない

ターンテーブル制作 失敗→成功?

あちこちから先人の知恵を拝借してみたものの、うまくいかなかった。動いた!!
とりあえず記録だけ残す。

引用元は多々あるが、まず偉大なる先人としてこちらの方。

フルシロコン

見つけられなかっただけかもしれないが、私の知る限り専用コントローラーの基板を使わずに基板製作をし、記録に残しているのはこの方だけです。
他にいらっしゃったら参考にするので教えて下さい。

上記サイトでは74HC423を使っているのだが、私には残念ながらデータシートを眺めても74HC423を使う(のとその下段に74HC123を使う)理由が分からなかった。
一応公開されている回路図通りに制作すれば動作はするのだが、ワンショットの時間が非常に短い。計算してみると0.116秒程度。個人的にはその3倍は必要じゃないかと思う。
74HC123について調べてみると、ワンショットの時間はt(s)=R(Ω)C(F)らしいので220kΩ*1.5μF=330000μsec(=0.33s)といったところだろうか?*1


と、それだけ試してみればよかったのかもしれないが、他の方法を探してみた。
どうも423と123が多段になってるのが気になる。
恐らく変化状態の保持だとは思うのだけど。


変化状態の保持ならフリップフロップだろと思って調べたら結構あっさり見つかった。

デジタル・ダイアル 回路説明

こちらのページのアップ・ダウン判定回路がロータリーエンコーダの回転方向検出回路だ。
情けないが動作がよく理解できなかったのでこちらの回路をそのまま使わせて頂くことにする。
丸パクリなら423を使う回路と同じだが、こちらの方が外部部品を使わなくて済む。

あとこのアップ・ダウン判定回路はパルスの立ち上がりでしか回転方向を検知しないので、同じ回路をもう1つ準備して立ち下がりでも検出するように変更する。
後は両方の出力をORでまとめておく。*2

ここまでは簡易回路シミュレータで動作を確認した。
f:id:alchemistark:20140208001532p:plain

この出力は検知した回数分のパルスを出してしまうので、これをそのままボタン入力にするとパルス分連打したことになってしまう。灼熱も余裕だ。
それでは困るので74HC123を通す。つまりこれ以降はみんな同じ。

このクソ長い前振りからできた回路図がこちら。
言うまでもないとは思うけどA、B入力にはロータリーエンコーダのパルス出力をそれぞれ接続。

f:id:alchemistark:20140207022453p:plain

石5個もあるしたすき掛けばかりでジャンプ配線が捗る。
そして冒頭の通り動作しなかった。

修正点求む。

配線ミスを多々発見したので直したらそれっぽい動作した。
ただ回路図にミスがあります。最終的な出力が逆転しているっぽいので、74HC123の出力を隣のピンに変えてください。*3

*1:0.5sぐらいの方がいいかも?

*2:なお、ロータリエンコーダの分解能が十分にある場合は不要。秋月のロータリーエンコーダとかみたいに24パルスしか無いとかだと必要かもしれないと思って追加した。不要の場合は石3個になる。

*3:5→4 13→12

アクセサリー作った

去年の話なんですけどね。

ループタイ作りたくなったのでちょっと小物を作った、という記録。
ループタイの紐や金具とかは既成品です。近隣の手芸店等で手に入ります。

作った時に写真とかmakeboothに上げてたのですが、こちらにも置いておきます。
http://makebooth.com/i/Vaxqc

f:id:alchemistark:20120909020043j:plainf:id:alchemistark:20140202205229j:plain

見たまんまなのですが、円形の板を削り出し、その上に削った文字やらを貼り付けてます。
最初どうやって掘り込もうかとかアホなこと考えてたので本当にどうかと思う。
それでもだいぶ時間かかったので不器用です。

取り付ける金具変えたらループタイ以外にもできるし、こんな感じのデザインのものなら結構簡単に作れそうというのが分かったのが収穫。

LR2でローカルライバルを表示させる方法について

LR2で複数プレイヤーがプレイしていて、そのプレイヤー間でスコア比較ができないかやってみた。

・LR2IRは使わない
・スコアの参照元はLR2files\Database\Score内の各スコア

LR2IRでライバルを表示させる時にLR2files\Rival内にライバルスコアが取得されているが、このDBのテーブル構成を真似てデータを作成してみたらとりあえず成功。
ただどう使ってるか分からなくて無視した箇所がいくつか。


手順としては、LR2files\Database\Score内の各スコアDBのscoreテーブルからカラム名を合わせながら必要なデータのテーブルを作成する。
具体的にはこう

sqlite_rival.query

CREATE TABLE rival as SELECT
	hash,
	clear as r_clear,
	totalnotes as r_totalnotes,
	maxcombo as r_maxcombo,
	perfect as r_perfect,
	great as r_great,
	good as r_good,
	bad as r_bad,
	poor as r_poor,
	minbp as r_minbp,
	0 as r_option,	/* 参照元がわからない */
	strftime('%s', 'now') as r_lastupdate /* 日付はとりあえず今にしておく */
FROM score;

drop table player;
drop table score;

r_optionに何が入ってるのか分からなかったのだが、いくつか覗いてみたデータではすべて0だったのでとりあえず0を入れた。*1
これでrivalテーブルが作成されるので、元からあったplayerテーブルとscoreテーブルを削除すれば完成。

後は適当にlr2folderを作成して読み込めばとりあえず表示される。
動作に問題があるかもしれないが、無理やり動かしてるので勘弁してほしい。仕様も知らないし。

lr2folderの#MAXTRACKSにはどうやらLR2IDが入るようなのだが、これはLR2IRを通してないデータなのでIDが存在しない。
特にチェックとかされてるわけではないようなので、適当な数値を入れておこう。
起動画面では6桁ほど見えているので6桁ギリギリの数値を入れておけば重複する可能性は低いかもしれない。(テスト作成したIDが70805だったのでまず重複しないだろう)
.dbファイルの名前をMAXTRACKSに入力したIDと同じにして、Rivalフォルダに投げ入れておくのを忘れないように。

あと当然だがこれは作成時のスコアのコピーなので、ライバルがスコアを更新したら再度作り直す必要がある。
一連の作業を行うバッチファイルでも書いておけばいいと思う。

rival.bat

@echo off

rem //LR2のスコアデータをライバルデータに変換します。

rem //フォルダパスを変数に格納

setlocal enabledelayedexpansion 

set dbfolder=LR2files\Database\Score\
set rival=LR2files\Rival\

rem //LR2IDが6桁あるようなので(?)ケツの方を使う
set no=999900

rem //このバッチが存在するフォルダをカレントに

pushd %0\..
cls

for %%A IN (%dbfolder%*.db) do (

	rem //ゴリ押しでLR2folderを作る
	copy /y %%A %rival%!no!.db
	sqlite3.exe %rival%!no!.db < sqlite_rival.query

	echo #COMMAND __RIVAL__> %%~nA.lr2folder
	echo #MAXTRACKS !no!>> %%~nA.lr2folder
	echo #CATEGORY ライバルフォルダ>> %%~nA.lr2folder
	echo #TITLE %%~nA>> %%~nA.lr2folder
	echo #INFORMATION_A>> %%~nA.lr2folder
	echo #INFORMATION_B>> %%~nA.lr2folder
	
	set /a no=no+1
)

exit

こんな感じに。

試すにしてもデータはバックアップを取った上で自己責任でお願いします。

*1:playerテーブルにoptionというカラムがあったが、これか? 結局何が入ってるのかは分からないが