Superb Garbages 2

千野純一(chinorin)のはてなダイアリーの続きです。

Minecraft統合版で半自動釣りマシーンを使った自動釣りスケッチ@M5Stack Basic

  • 気まぐれに。
  • M5Stack Basic@Arduino IDE用、Bluetooth接続の仮想マウスとしてWindows10に接続し、設定した秒数(0.5秒刻み)ごとに右クリックをしてくれるスケッチを雑に書いたので置いときます。Minecraft統合版において、半自動釣り装置を使って釣り放置をするとき用に作ったものです。スコープとか関数とか行き当たりばったりでとにかくテキトーです。動きゃいいのよ動きゃ。
  • M5シリーズはM5Stack Basicしか持ってないので他ので動くかどうかはわかりませんがボタンが3個ついてるやつならたぶん動くんじゃないかという予感はする。で、ホスト側もWindows10の統合版しかテストしてないからわからんが、とにかくBluetooth(ver4.0以降)が繋がって、右クリックがアイテムを使う操作ならばいけるんじゃないかな? PS4とかどうなんだろう。
  • M5Stackのボードマネージャを入れたArduino IDEと、それからESP32用のライブラリ BLE-Mouse が必要です。導入方法は、前者はM5Stack関係のマニュアル的な文書に書いてある。後者もぐぐればどっかに書いてあると思うけど、簡単に説明すると、例えば、
    1. リンク先の「↓Code▼」って書いてある緑のボタン → Download ZIP をクリックして任意の場所にファイルをダウンロード
    2. Arduino IDEの「スケッチ → ライブラリをインクルード → .ZIP形式のライブラリをインストール」で先ほどダウンロードしたファイルを指定
  • ⋯で入るかな? 入ってれば スケッチ → ライブラリをインクルード の中の「提供されたライブラリ」の項目に「ESP32 BLE Mouse」というのが出てるはずだけどこういうの探すのけっこうめんどいんだよね。とりあえずコンパイルしてみればいいんじゃないかな⋯。
  • 例によって著作権は主張しませんがご利用は自己責任で。
// For M5Stack Basic @ Arduino IDE,
//   a sketch of right click regularly ("AUTO FISHING" in Minecraft BE)
// "BLE-Mouse" library and Bluetooth(ver4.0 or layer) are required.
// Written by Chinorin. No Rights Reserved.

#include <M5Stack.h>
#include <BleMouse.h>
BleMouse bleMouse("[ESP32/M5]AUTO FISHING","Chinorin");
bool blestate=false,fishswitch=false;
unsigned long starttime;
float castingsec=5.5;

void setup() {
	M5.begin();
	bleMouse.begin();
	M5.Power.begin();
	bleMouse.begin();

	M5.Lcd.setBrightness(100);
	M5.Lcd.fillScreen(BLACK);

	M5.Lcd.setTextColor(WHITE);
	M5.Lcd.setTextSize(3);
	M5.Lcd.setCursor(10,10);
	M5.Lcd.print("=AUTO FISHING=");
	M5.Lcd.setCursor(10,35);
	M5.Lcd.print("RightClick Tool");

	bledisp();
	castingsecdisp(castingsec);
	menudisp();
	starttime=millis();
}

void menudisp(){
	M5.Lcd.setTextSize(2);
	M5.Lcd.setCursor(0,225);
	if(blestate){
		M5.Lcd.setTextColor(WHITE);
		M5.Lcd.print("START/STOP");
	} else {
		M5.Lcd.setTextColor(DARKGREY);
		M5.Lcd.print("START/STOP");
	}
	M5.Lcd.setCursor(120,225);
	M5.Lcd.setTextColor(WHITE);
	M5.Lcd.print(" -0.5    +0.5");

	M5.Lcd.setTextSize(3);
}

void bledisp(){
	M5.Lcd.fillRect(0,85,320,30,BLACK);
	M5.Lcd.setCursor(10,85);
	if(blestate){
		M5.Lcd.setTextColor(YELLOW);
		M5.Lcd.print("CONNECT");
		M5.Lcd.setTextSize(1);
		M5.Lcd.setCursor(10,107);
		M5.Lcd.setTextSize(3);
	} else {
		M5.Lcd.setTextColor(RED);
		M5.Lcd.print("DISCONNECT");
	}
}

const int py=170;
const int psize=20;

void progress_erase(){
	M5.Lcd.fillRect(0,py,320,psize,BLACK);
}

void progress(int val){
	M5.Lcd.progressBar(0,py,320,psize,val);
}

void castingsecdisp(float sec){
	int a,b=0;
	M5.Lcd.fillRect(0,135,320,22,BLACK);
	M5.Lcd.setCursor(10,135);
	a=sec;
	if(a<sec) b=5;
	M5.Lcd.setTextColor(WHITE);
	M5.Lcd.printf("Interval: %d.%d sec",a,b);
}

void casting(){
	bleMouse.press(MOUSE_RIGHT);
	delay(100);
	bleMouse.release(MOUSE_RIGHT);
}

void loop() {
	M5.update();

	if(M5.BtnA.wasPressed()){

		if(fishswitch){
			fishswitch=false;
			progress_erase();
		} else {
			fishswitch=true;
			casting();
			starttime=millis();
		}

	} else if(M5.BtnB.wasPressed()){
		if(castingsec>0.5){
			castingsec-=0.5;
		}
		castingsecdisp(castingsec);
	} else if(M5.BtnC.wasPressed()){
		if(castingsec<20.0){
			castingsec+=0.5;
		}
		castingsecdisp(castingsec);
	}

	if(blestate != bleMouse.isConnected()){
		blestate = !blestate;
		bledisp();
		menudisp();
	}

	if(fishswitch){
		unsigned long now=millis()-starttime,next=castingsec*1000;
		progress(now*100/next);
		if( next <= now ){
			casting();
			starttime=millis();
			progress_erase();

		}
	} else {
		delay(1);
	}
}
  • 精査してないけど定義するだけして使ってない変数とかあるかも。w そんなんプログラムあるあるだろ。いいんだよ動きゃ。
  • スケッチをコンパイルして転送したら、まずはホスト側(例えばWindows)のBluetoothの設定で [ESP32/M5]AUTO FISHING というデバイスとペアリングしてください。するとM5Stack側で DISCONNECT だった表示が CONNECT になります。
  • その状態で、Minecraft内で釣り竿を持って、釣り施設の所定の位置にカーソルを合わせ、そんでM5StackのAボタン(一番左のボタン)を押すと自動釣りがスタートします。まず1回右クリック操作が入り(念のためクリック操作自体に0.1秒かけてます)、その後設定秒数だけ待ってふたたび右クリック。その繰り返しです。もう一度Aボタンを押すと停止します。
  • 再スタートもAボタンです。再スタート時もまず最初に右クリック操作が行われることに注意してください。現在動いてるか止まってるかは青いプログレスバーを見てください。
  • BボタンとCボタンで設定秒数を0.5秒刻みで増減します。最少0.5秒、最大20秒です。この操作はいつでも(自動釣りが動いてる間でも)できます。[入れ食いIII]の釣り竿を持っている場合は5~5.5秒くらいがおすすめです。それ以外の場合はいい感じに調整してください。
  • たまに、プログレスバーは動いてるのに釣りができていない(右クリックできない)場合があります。そのときはM5Stackをリセットすると直ります。ご存じでしょうが左側面の赤いボタンです。

 

  • ちなみにその赤いボタンを素早く2回押すと電源オフなんだけど、しばらくその方法がわかんなくて、電源落としたいときはわざわざバッテリー(下の段)抜いてた。普通長押しじゃんよ⋯⋯という。でもSeeeduino XIAOもリセットパッドを素早く2回導通みたいな操作があるので、中国ではわりとメジャーなやり方なのだろうか。
  • しかし、しかしだよ。こんなのを適当に作ってみたはいいけれど、マイコンに標準搭載されたディスプレイに状況を表示しながら右クリックを送信なんて、そもそもマイコン使う意味ねーじゃねーかとひととおりできあがってから思いましたとさ。だってこんなのWindowsのソフトとして作ればいいんだし⋯。
  • まあ、ESP32のBluetooth周りの習作ということで。いやそれにしても接続やら何やらBLE-Mouseが自動的にぜんぶやってくれるから俺なんもしてないしブツブツ⋯。
  • そんでESP32用のスケッチのコンパイルって遅いねえ。ライブラリ探すのになんでそんなに時間かかるのか知らんけど、そんなことやってないでまず最初にSyntaxをざっと見てくんねえかな。めっちゃ待ったのに「カッコ閉じてません」で止まるの切ないのよ。

 

  • そんで肝心の自動釣り設備の話ですけど、ええと、どうしたらいいかな。まず地面から3~4ブロック上くらいのいい感じの場所にチェストを⋯⋯
  • もうめんどくさくなった。所長氏の動画を貼っておく。所員氏の給料のために見てあげて。

  • 当然いろんな作り方があるんだけど、自分の場合は何が釣れたのかわからないのが嫌なので、一番下のチェストの代わりにホッパーとかドロッパーとかをごにょごにょやって、チェストの奥側で釣れたものが浮き上がってきて正面のチェストに入るのが見える、という仕組みにしたりします。浮かせる方法はソウルサンド+水でもいいけど、ガラスで埋めた3x3の空間の真ん中に下からドロッパーで吐き出すってのもなかなかオツなものだ。で、一番上で水を流してホッパーで回収。