M5StickCのキャプチャ実験

f:id:nicotakuya:20210226153653j:plain
M5StickCのキャプチャ

M5StickCのキャプチャできないか試してみました。まだ実験中です。
こちらの記事を参考にさせて頂きました。
raspberrypi.mongonta.com
これによると、ライブラリの「In_eSPI_Setup.h」というファイルを修正すると、「readPixel」が使えるようになるとのこと。readPixelは指定座標の画面のカラーコードを読み取るための関数です。
具体的な手順は以下のとおり。
「C:\Users\(ユーザー名)\Documents\Arduino\libraries\M5StickC\src\utility」フォルダの中にある「In_eSPI_Setup.h」をテキストエディタで開いて、次の2点を修正します。

f:id:nicotakuya:20210226151729p:plain
修正1

(修正1)「TFT_SDA_READ」の左側にある「//」を削除する。

f:id:nicotakuya:20210226151808p:plain
修正2

(修正2)「SPI_READ_FREQUENCY」の値を変更する。適切な値がわかりませんが「4000000」にしました。ビットレートが大きいと通信に失敗するようです。

↓が実験用のプログラムです。M5StickCに書き込むArduinoのスケッチです。Aボタン(M5ボタン)が押されたら、画面のデータをシリアルポートから出力します。

// capture
#include <M5StickC.h>

void capture(void){
  unsigned int color;
  int x,y;

  if(digitalRead(M5_BUTTON_HOME) == HIGH)return;
  while(digitalRead(M5_BUTTON_HOME) == LOW);

  for(y=0; y<80; y++){
    for(x=0; x<160; x++){
        color = M5.Lcd.readPixel(x,y);
        Serial.write((unsigned char)(color & 0xff));
        Serial.write((unsigned char)(color >> 8));
        Serial.flush();  // シリアル出力完了を待つ
    }  
  }  
}

void setup() {
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.setTextSize(3);
  M5.Lcd.setTextColor(RED);
  M5.Lcd.print("HELLO WORLD");
  M5.Lcd.setTextColor(BLUE);
  M5.Lcd.print("HELLO WORLD");
  M5.Lcd.setTextColor(GREEN);
  M5.Lcd.print("HELLO WORLD");
}

void loop() {
  capture();
}

そして、
↓がパソコン側の受信用のプログラムです。HSP3(Windows)で動きます。シリアルポートから受信した内容を画面に描画します。

//---------------------------------------------------------
//  for HSP 3   by takuya matsubara
// ・M5StickCのキャプチャを受信
//---------------------------------------------------------
#include "hspext.as"

#define LEDWIDTH  160	//width pixel
#define LEDHEIGHT 80	//height pixel
#define OFFSETX 0
#define OFFSETY 0
#define DOTSZ 3
#define BAUDRATE 115200

sdim livebuf,LEDWIDTH*LEDHEIGHT
screen 0,800,512,0,0,0
dispw = DOTSZ*LEDWIDTH
disph = DOTSZ*LEDHEIGHT
flag_comm =0
objsize 70,25
pos 0,400
button gosub "Open",*connect
pos 70*3+10,400
print "COMM"
pos 70*3+50,400
comnum=0
combox comnum,150,"com\ncom1\ncom2\ncom3\ncom4\ncom5\ncom6\ncom7\ncom8\ncom9\ncom10\n"
pos 70*6,400
button gosub "Save BMP",*savegrp

x1=OFFSETX
y1=OFFSETY
ptr=0
colordata=0
repeat
	if(flag_comm==0){
		wait 1
	}else{
		//recv
		repeat
			comgetc btn	//recv 1byte
			if(stat != 0){
				if(ptr==0):colordata = btn
				if(ptr==1):colordata = (btn<<8)+colordata
				ptr = (ptr+1) \ 2
				if(ptr==0){
					red  = (colordata >> (5+6)) & $1f	//32諧調
					green= (colordata >> 5) & $3f	//64諧調
					blue = colordata & $1f	//32諧調
					x2 = x1+DOTSZ-1
					y2 = y1+DOTSZ-1
					red = red*255/$1f
					green = green*255/$3f
					blue = blue*255/$1f

					//暗いので2倍にする(原因不明)
					red*=2
					green*=2
					blue*=2
					if red>255:red=255
					if green>255:green=255
					if blue>255:blue=255
					color red,green,blue
					boxf x1,y1,x2,y2
					
					x1 += DOTSZ
					if(x1 >= ((DOTSZ*LEDWIDTH)+OFFSETX)){
						x1=OFFSETX
						y1+=DOTSZ
						if(y1 >= ((DOTSZ*LEDHEIGHT)+OFFSETY)){
							y1 = OFFSETY
						}
					}
				}
			}else{
				redraw 1
				wait 1	//no data
				redraw 0
			}
		loop
	}
loop	
end

//-------------
*savegrp
gosub *connect_close
dialog "bmp",17,"BMPファイル"
if stat==0:return
filename=refstr
screen 1,LEDWIDTH*DOTSZ,LEDHEIGHT*DOTSZ
gsel 1,1
pos 0,0
gcopy 0,0,0,LEDWIDTH*DOTSZ,LEDHEIGHT*DOTSZ
bmpsave filename
gsel 1,-1
gsel 0,0
return
	
*connect_open
	if(flag_comm = 0){
		comopen comnum,"baud="+str(BAUDRATE)+" parity=N data=8 stop=1"
		if stat : dialog "COM"+comnum+"は使えません" : end
		flag_comm=1

		repeat
			comgetc btn	//recv 1byte
			if(stat == 0):break
		loop
		ptr=0
		x1=OFFSETX
		y1=OFFSETY
	}
	return

*connect_close
	if(flag_comm = 1){
		comclose
		flag_comm=0
	}
	return

*connect
	if(flag_comm =0){
		gosub *connect_open
		title "OPEN COMM"+str(comnum)
		wait 150	//必須
	}else{
		gosub *connect_close
		title "CLOSE COMM"
	}
	return

M5StickCをパソコンのUSBポートに接続してある状態で上記のプログラムを実行します。

f:id:nicotakuya:20210226151149p:plain
実行結果

画面の「OPEN」ボタンを押してシリアルポートの回線を開きます。M5StickCのAボタン(M5ボタン)を押すと、画像データが転送されます。通信速度は115200bpsです。
未解決の問題ですが、受信したカラーコードはすべて、想定の半分になってしまいます。ここままだと画像が暗くなってしまうので、受信した直後に2倍にして描画しています。各色ずつ1bit足りないので、16bitカラーではなく、13bitカラーになっていると思います。

ファミコン用マルチタップの自作version2

f:id:nicotakuya:20210225183004j:plain

マルチタップversion1

上の写真が以前作ったファミコン用マルチタップです。今のところ、くにおくんの大運動会で使うしか意味のない周辺機器です。

作ったのは良いんですが、ファミコン用パッドが入手できなかったので、このようにスーファミ用パッドを変換して接続してました。これがちょっと無駄に感じます。

 

f:id:nicotakuya:20210225183133j:plain

マルチタップversion2(動作未確認)

そこで、新バージョンでは、基板に最初からスーファミのコネクタを取り付けてみました。ただ、このコネクタを付けると、今度はdsub 15pinが付けられなくなります。2種類組み立てたらいいんじゃないでしょうか。もしくは裏側にハンダ付けするか。

 

f:id:nicotakuya:20200717031158j:plain

スーファミ用コネクタ

スーファミ用のコネクタです。基板取り付け用。

 

f:id:nicotakuya:20210225183349j:plain

14x4cm基板

基板サイズは14x4にして、秋月製のユニバーサル基板を底に付けられるようにしました。

以下のページでCADデータを公開中です。動作未確認なので、ご注意ください。

sites.google.com

洞窟物語

f:id:nicotakuya:20210221145122p:plain

メガドラ洞窟物語?!

AliExpressでメガドライブ版の「洞窟物語(Cave Story)」が売っていました。「洞窟物語」というのは、2004年12月から公開されているフリーのアクションゲームです。有料版もあります。インディーズのゲームって、なぜかメトロイドヴァニアに傾倒しているのですが、その源流ですね。

このメガドラ版は非合法なソフトなわけですが、検索したらGitHubにソースがありました。

 

f:id:nicotakuya:20210221131910p:plain

メガドライブ洞窟物語(Cave Strory)

GitHub内のライセンス表記より。

上から2番目にある「NXEngine」とは洞窟物語のクローンです。ゲームエンジンではありません。これはオープンソースで開発しているおかげで、いろいろな機種に移植されてます。作ったのは本家のPixelさんではなく、Caitlin Shawさんという人のようです。

 

気になるのは上から三番目。「グラフィック、ストーリー、キャラクター」のライセンスが書かれていません(Studio Pixelになってます)

改変はOKなのか?

再配布はOKなのか?

という点が不明のままです。これは大丈夫なのか、、、?

 

そして、去年、わりと衝撃的だったニュースがこちら↓。

automaton-media.com

 

恥ずかしながら、自分はこれ見るまで「洞窟物語は本家がオープンソース」だと誤解してました。まさか第三者勝手にオープンソースにしてただけだったとは。

今回、申し立てしたのがWiiウェア/3DS/Switch版の洞窟物語を作っているNicalis社。問題の「Cave Story Engine 2」は改造Switch(SXOS)で動いていたので、営業妨害に当たりますね。改造Switchを持ってる時点でダメですが。あと、作った側が「逆コンパイルした(リバースエンジニアリングした)」と正直に告白していたのもアウトな気がします。

Cave Story Engine 「2」ってことは、「1」はNXEngineのことでしょうか? NXEngineは、開発手法が不明で、どこまで合法なのかわからないです。目コピーとは思えないほど出来が良いので、こちらもリバースエンジニアリングしてる可能性が高いです。となると、これはオリジナルの改変ですね。あと、グラフィックの素材は本物を流用しています。ここでも洞窟物語の再配布・改変がアリか/ナシか」という問題に突き当たります。洞窟物語のフリー版は今でもStudio PixelVECTORからダウンロードできますが、ライセンスについては何も書いてありません。先のGitHubのライセンスが空白だったのは、これが理由です。

もし、Nicalis社がNXEngineに申し立てをした場合、10年ほど築き上げた洞窟物語のクローンがすべて崩壊してしまいます。事態が大きくなりすぎです。

、、、これ以上の話は自分の手に余るので、詳しい人にお任せしたいです。

 

あと、「洞窟物語」で検索して、出てきたページがこちら。

http://909.xii.jp/blog/2011/11/03/

驚いたのは、まず作者のPixelさんが学生時代に作ったゲームがクオリティ高すぎること。そして、1999年時点で洞窟物語アルファ版があったこと。開発におよそ5年費やしたこと。2~3年作ってから、それを捨てて、丸ごと作り直したこと。病気のこと。「洞窟物語」はフリーゲームとは思えないくらい作り込みが尋常ではありませんが、その理由を推測することができます。

作り直しによってボツになったゲーム(https://www.youtube.com/watch?v=PRJcxyVgoug)って、動きが良いし、どこが悪いのかわからないのですが、Pixelさんからすると、全ボツに値するようです。それだけ目標が高かったということですね。公開までのラストの1年間はお仲間の意見を聞いて、バランス調整と改良をしてますが、こういう謙虚で実直な姿勢を保てるところが凄い。普通のアマチュアならアッという間に挫折します。

ゲームを作ってて、それが面白くないという事態に直面した場合、どうにかして面白くしないといけないのですが、ここにうまい回答は存在しません。虎の巻みたいなものがあったら読みたいですが。大体は面白くできないまま終わります。アマチュアなら、自分一人が喜べばいいだけですが、プロなら他人が喜ばないと意味がありません。Pixelさんの場合は、最初からプロ意識が高くて、どうにかして面白くする方法を探り当てたということでしょうか。実際、Pixelさんはプロに転向して、「ケロブラスター」をリリースしています。

f:id:nicotakuya:20210222004217j:plain

「ケロブラスター」

ケロブラスターは驚くほど安いので買ってみました。

ハイパーショットの動作テスト

ファミコン用コントローラ「ハイパーショット」を動作テストした様子を動画にしてみました。


HyperShot用プログラムの自作(Famicom Homebrew)

 

ハイパーショットって対応ソフトは

・「ハイパーオリンピック

・「ハイパースポーツ」

の2本だけでしょうか? 「コナミックスポーツ」は未対応ですよね。

 

f:id:nicotakuya:20210131132939j:plain

ハイパーショットを分解

配線を調べるため、手持ちのハイパーショットを分解してみました。 ICのたぐいは一切入っていません。なので、外部端子用のケーブルと、ゲーム用のボタンさえあれば自作できます。

自作のゲーム・カートリッジ基板

f:id:nicotakuya:20201210100429j:plain

2年間で作ったカートリッジ基板

趣味で作ったカートリッジ基板がこちら。ファミコン用、スーファミ用、メガドラ用、PCエンジン用、ゲームボーイ用ですPC-6001用はまだです。PC–6001mkII本体の修理を人に頼んだきりです。

今までは同人ゴロがうっとおしかったので、ファミコンネタを封印してました。

2年前にふとしたきっかけで、スーファミのカートリッジを作ってみました。知識ゼロの状態からスタートです。今だと、大量の資料がパブリックドメイン化されていますし、開発ツールは無料ですし、プリント基板はお金のある限り作れます。昔ほどハードルは高くありません。

心配な点は、基板作りは法的に大丈夫なのかということと、違法コピーに使われるんじゃないかということです。扱うゲームハードは20年以上経過したものに限定しています。違法コピーについては、モラルに期待するしかありません。自分の場合は費用が何万円もかかるので、コスト的にわりに合わないんじゃないかと思います。

自分が作ったCADデータやプログラムは趣味のページでフリーで公開していますオープンソースなので、至らない部分があったら改良して欲しいです。

 

ファミコン

https://sites.google.com/site/yugenkaisyanico/diy-fc-cartridge2

 

スーパーファミコン

https://sites.google.com/site/yugenkaisyanico/diy-sfc-cartridge2

 

メガドライブ

https://sites.google.com/site/yugenkaisyanico/diy-megadrive-cartridge

 

PCエンジン(まだ途中)

https://sites.google.com/site/yugenkaisyanico/diy-pce-card

 

ゲームボーイ(まだ途中)

https://sites.google.com/site/yugenkaisyanico/diy-gb-cartridge