馬鹿↓
制作の裏側
PCと連動して動くスタンガンはどう制作したかの話。
スタンガンはUSBから電源を取ってるので威力は大したこと無いが、それでも全く電気を知らない人が扱うのは危ないので手順レベルでの詳細は書かない。
勿論一切の責任は取れない。
全体
まずありふれた冷陰極管インバータ+コッククロフト・ウォルトン回路のスタンガンを作る。
マイコンはシリアル通信でPCとコマンドを受け取り、コマンドの内容に応じてMOSFETをオンオフさせてスタンガンを駆動させる。
一方PC側はゲームのエミュレータからシリアル通信を実行させるため、まずエミュレータからSocket通信で自作のソフトウェアにメッセージを送る。
自作のソフトウェアはSocketサーバー兼シリアル通信のインターフェースだ。
仕組みはいたって単純だが、色々な機能を並列に動かしているので結構めんどくさい。
スタンガン制作
スタンガン制作は電子工作においてありふれたテーマなのでここでは詳細は省く。
冷陰極管インバータで直流5Vを交流600V程度に変換し、さらにそれを15段のコッククロフト・ウォルトン(以下CW)回路で昇圧する。
冷陰極管インバータは秋月電子でも取り扱いがあるが、こいつがかなり貧弱でろくな電流が取り出せなかった。
そこでaitendoのインバータを採用。
http://www.aitendo.com/product/1733
これは使える代物だった。
また、CW回路に用いる高耐圧のコンデンサも微妙に入手性が悪いのだが、いい感じの値段と在庫がaitendoに揃っている。
http://www.aitendo.com/product/11256
CW回路のコンデンサは入力電圧の二倍の耐圧が必要かつ、容量が威力に直結するので、ここは3kV4700pFのものを採用。
冷陰極管の入力部にパワーMOSFET(P-ch)のドレインを繋げば完成だ。
スタンガン制御部
マイコンはLPC11U35を採用。高電圧を扱うので、うっかりぶっ壊しても痛くないよう安いものを選んだ。
こいつの使い方は過去記事を参照。
マイコンの動作電圧が3.3Vで、スタンガンには5vを供給するので、
スイッチング用のP-MOSFETとは別にレベル変換用のN-MOSFETを使う。
マイコンの制御ピンを0にすればスタンガンがオンになる。
ただしスタンガンに全ての電流を持っていかれると制御不能に陥るので、
おまじないがてら5vとGNDの間に大きめのコンデンサを挿しておいた。無いよかマシだろ多分。
エミュレータからソケットを飛ばす方法も過去記事参照。
シリアル通信は.NET環境なら簡単に使えるので、さくっとコードを追加する。
static void Main(string[] args)
{
SerialPort serial = new SerialPort();
TcpListener tcp;
const int PORT = 22222;
IPAddress IP = IPAddress.Parse("127.0.0.1");
//スタンガンのささってるシリアルポートを選ぶ
Console.WriteLine("select serial port index.");
var names = SerialPort.GetPortNames();
int idx = 0;
foreach (var item in names)
{
Console.WriteLine($"{idx++}...{item}");
}
//シリアル開ける
var num = int.Parse(Console.ReadLine());
if (num < names.Length)
{
serial.PortName = names[num];
serial.BaudRate = 9600;
serial.Open();
}
//127.0.0.1に22222のソケットサーバを建てる
tcp = new TcpListener(IP, PORT);
//受付開始
Console.Write("Waiting for a connection... ");
tcp.Start();
var cli = tcp.AcceptTcpClient(); //ここで止まる BizHawk起動で先に行く
Console.WriteLine("Connected!");
//読み込みループ
var nstr = cli.GetStream();
try
{
while (cli.Connected)
{
byte[] buf = new byte[1024];
var cnt = nstr.Read(buf, 0, 1024);
var str = Encoding.UTF8.GetString(buf, 0, cnt);
Console.WriteLine($"Received : {str}");
serial.Write(str); //とりあえず丸投げ
Console.Write(serial.ReadExisting());
}
}
catch (Exception ex)
{
//USBが引っこ抜けたりすると例外吐いてここに来る
//…ので、キャッチだけして見なかったことにする
}
if (serial.IsOpen) serial.Close();
}
あとはマイコンに「受け取ったメッセージごとに一定時間出力ピンをオンにする」プログラム書けば出来上がり。
これでキミも今日からフルシンクロだ!