某FG〇でFPが貯まりまくって画面を連打する必要に駆られたので作ってみました
もちろんネ〇祭でも大活躍する予定です
#fgo #M5Stack
— もけ@ムギ㌠ (@coppercele) October 9, 2020
M5Stackでタブレットクリッカーを作るhttps://t.co/GkQcz3ytyS pic.twitter.com/MXMF80jrqf
#M5Stack がんばえ~#FGO
— もけ@ムギ㌠ (@coppercele) October 2, 2020
M5Stackでタブレットクリッカーを作るhttps://t.co/GkQcz3ytyS pic.twitter.com/PMfV7NDy7r
##使用するもの##
M5Stack Basic - スイッチサイエンス
https://www.switch-science.com/catalog/3647/
Arduino互換なESP32がケースに入っててボタンとディスプレイとバッテリーがついててIOも豊富でWifiとBluetoothも使える欲張りセット
今から電子工作始めるならこれで良くない?
バリエーションによって9軸センサがついてたりするけどbasicは一番基本的な奴
リレータッチボード
リレータッチボード(ドライバ有り) - スイッチサイエンス
https://www.switch-science.com/catalog/2455/
マイコンに繋いでデジタルピンをHIGHにするだけで画面をタッチしたことになる優れもの
ネットで見たアルミホイルを使う方法など試してみたけど全然安定しないので結局これに落ち着いた
デュポンコネクタセット
Amazon.co.jp: waves 2550/QIコネクタ/デュポンコネクタ セット 計310個: おもちゃ
https://www.amazon.co.jp/dp/B07MZRSQVL/
普通のジャンパケーブルでもいいけど自由に長さとオスメスを決められるので便利
電源も赤黒を2口コネクタでまとめると使い勝手が良い
ジャンパケーブルって使ってくると端子の根本で断線するのでそれを修理することもできる
シリコンワイヤ
Amazonで1500円~2000円で売ってる奴
被覆がシリコンで出来ててフニャフニャなので画面に設置するとき便利
圧着ペンチ
Amazon | アイウィス(IWISS) 精密同時圧着ペンチ ラチェット式 オープンバレル端子 0.08〜1.0mm2極小・小・中型端子対応 SN-2549 [並行輸入品] | DIY・工具・ガーデン
https://www.amazon.co.jp/dp/B00W4WRZPU/
エンジニアの定番圧着ペンチを使ってたけど厚みがないので1端子カシメるのに2回挟まないといけなかった
これは厚みがあるから1回で済むのでありがたい
両面テープ
ダイソーで買った奴ですが同じようなものなら何でもいいと思います
ハードウェアの作成
前述のリレータッチボードにピンヘッダをハンダ付けします
シリコンケーブルにメスの3Pデュポンコネクタと逆側には1Pオスのコネクタをつけます
三つ編みにするとケーブルの癖が相殺されて使いやすくなりました
M5Stackに接続する
M5Stackボトムの接続端子にケーブルを接続します
リレータッチボードは5V駆動ですが上部分のIOは5VとGNDが隣り合っていないので注意しましょう
あとサイドは5VとGNDに近いので35,36に接続したくなりますが「入力専用」なので避けます(ありがちミス)
上側は素直に繋ぎましょう
スケッチを書く
基本的にはGPIO21と26をHIGHLOW繰り返してるだけです
片方だけ接続しても動作します
#include <M5Stack.h>
// タッチの間隔ms
int milli = 500;
// スイッチ連打状態かのフラグ
bool state = false;
void drawScreen() {
// 画面描画 一回画面を真っ黒に塗ってから更新する
M5.Lcd.fillScreen(BLACK);
// 間隔を表示
M5.Lcd.setCursor(0,0);
M5.Lcd.printf("%4dms",milli);
// 画面下部の表示
M5.Lcd.setCursor(0,220);
M5.Lcd.printf(" - %s +", state ? "OFF" : "ON ");
}
void Task1(void *pvParameters) {
while(1) {
// 中央ボタンがフラグを書き換える
if(state) {
// タッチ
digitalWrite(26, HIGH);
delay(50);
// リリース
digitalWrite(26, LOW);
delay(milli / 2);
// 2個目
digitalWrite(21, HIGH);
delay(50);
digitalWrite(21, LOW);
delay(milli / 2);
}
delay(1);
}
}
void setup() {
Serial.begin(115200);
M5.begin();
M5.Lcd.setRotation(1);
M5.Lcd.setTextSize(2);
M5.Lcd.setBrightness(64);
pinMode(26, OUTPUT);
pinMode(21, OUTPUT);
digitalWrite(26, LOW);
digitalWrite(21, LOW);
drawScreen();
// loop()でdelay()を使うとボタンの状態が取れないので別スレッドでタッチ処理する
xTaskCreatePinnedToCore(Task1,"Task1", 4096, NULL, 3, NULL, 1);
}
void loop() {
M5.update();
if ( M5.BtnA.wasPressed() ) {
// 左ボタン タッチ間隔を短くする
milli -= 50;
if (milli <= 0) {
milli = 50;
}
drawScreen();
}
if ( M5.BtnB.wasPressed() ) {
// 中央ボタン 連打ONOFFを切り替える
state = !state;
drawScreen();
}
if ( M5.BtnC.wasPressed() ) {
// 右ボタン タッチ間隔を長くする
milli += 50;
drawScreen();
}
delay(1);
}
画面を連打する
準備が終わったらタップする場所に両面テープでパッドを貼り付けて中央ボタンを押すと連打が始まります
左右ボタンを押すと連打間隔が変わります
ちなみにフレポ召喚は間隔を2000msにしたらちょうどよかったです
#fgo #M5Stack
— もけ@ムギ㌠ (@coppercele) October 9, 2020
M5Stackでタブレットクリッカーを作るhttps://t.co/GkQcz3ytyS pic.twitter.com/MXMF80jrqf
UiFlowで作成する
C言語書いて書き込むのはハードルが高いのでもうちょっとお手軽なUiFlowで
書き直してみました(UiFlowのハードルが低いとは言ってない)
UiFlowとはブラウザ上のブロックプログラミングで
M5Stackシリーズのプログラムを作れるイケてるサイトです
使い方はググってください(丸投げ)
M5Stack Core2で作ってますがBasicでも種類を変更して
digital writeのGPIOを変更すれば使えると思います
ブロックを並べなくても以下のコードをファイルに保存してUiFlowから読み込めばそのまま使えるはずです
Clicker.m5f
{"components":[{"id":"_coretwoscreen","createTime":1667031315752,"name":"screen","x":0,"y":0,"width":320,"height":240,"backgroundColor":"#000000","backgroundImage":"","size":0,"type":"screen"},{"id":"____buttonA","createTime":1667031315752,"name":"ButtonA","buttonIndex":0,"x":35,"y":216,"width":64,"height":24,"text":"ButtonA","visibility":false,"type":"button"},{"id":"____buttonB","createTime":1667031315752,"name":"ButtonB","buttonIndex":1,"x":125,"y":216,"width":64,"height":24,"text":"ButtonB","visibility":false,"type":"button"},{"id":"____buttonC","createTime":1667031315752,"name":"ButtonC","buttonIndex":2,"x":215,"y":216,"width":64,"height":24,"text":"ButtonC","visibility":false,"type":"button"},{"id":"!XG@7wsoFel*7j^n","createTime":1667042945373,"isCoreTwo":true,"isPaper":false,"name":"period","x":58,"y":0,"color":"#ffffff","text":"500","font":"FONT_MONT_30","rotation":0,"type":"label","layer":7},{"id":"T8^XQWAn`6-Mi+OX","createTime":1667042982610,"isCoreTwo":true,"isPaper":false,"name":"label0","x":120,"y":0,"color":"#ffffff","text":"ms","font":"FONT_MONT_30","rotation":0,"type":"label","layer":11},{"id":"FTs+vzg`9AIzRk=Y","createTime":1667043002312,"isCoreTwo":true,"isPaper":false,"name":"label1","x":52,"y":210,"color":"#ffffff","text":"-","font":"FONT_MONT_30","rotation":0,"type":"label","layer":14},{"id":"@ELFGD^jJn1#M9q*","createTime":1667043028221,"isCoreTwo":true,"isPaper":false,"name":"onoff","x":137,"y":210,"color":"#ffffff","text":"ON","font":"FONT_MONT_30","rotation":0,"type":"label","layer":18},{"id":"OzM19aznZ!xp7Zgk","createTime":1667043050128,"isCoreTwo":true,"isPaper":false,"name":"label2","x":253,"y":210,"color":"#ffffff","text":"+","font":"FONT_MONT_30","rotation":0,"type":"label","layer":20}],"type":"core2","versions":"Beta","units":[],"hats":[],"blockly":"<variables><variable id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</variable><variable id=\"Bd=v|*jUef6mW|m{@(PZ\">flag</variable></variables><block type=\"basic_on_setup\" id=\"setup_block\" deletable=\"false\" x=\"170\" y=\"-110\"><next><block type=\"variables_set\" id=\"wtJ.[_V:=Jy!4M^5Y!mG\"><field name=\"VAR\" id=\"Bd=v|*jUef6mW|m{@(PZ\">flag</field><value name=\"VALUE\"><block type=\"logic_boolean\" id=\"EZvg9ns+/n8w#-mu,/H3\"><field name=\"BOOL\">FALSE</field></block></value><next><block type=\"math_change\" id=\"CpXV/U2wv2f6f8}ZT}U?\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field><value name=\"DELTA\"><shadow type=\"math_number\" id=\"8r)9:0;g7~G@FaVOZUsq\"><field name=\"NUM\">500</field></shadow></value><next><block type=\"timer_setStart\" id=\"c2_pjsN#DA*(TVpC|;f;\"><field name=\"start_name\">timer1</field><field name=\"mode\">0x00</field><value name=\"period\"><shadow type=\"math_number\" id=\"qnl5s1eF[s|ds8?~c:{t\"><field name=\"NUM\">500</field></shadow></value><next><block type=\"pins_digital_write\" id=\"k_*L3ePU_*:--M,Sf?)e\"><value name=\"PIN\"><shadow type=\"math_number\" id=\"0NEl/b9Ki,Ox%:SkTf3S\"><field name=\"NUM\">26</field></shadow></value><value name=\"VALUE\"><shadow type=\"math_number\" id=\"ZGjWkGa!kLc[Z3GG-KRs\"><field name=\"NUM\">0</field></shadow></value><next><block type=\"pins_digital_write\" id=\"/4aqF%(~N6]!)m;@zt;8\"><value name=\"PIN\"><shadow type=\"math_number\" id=\"f@|F,rpnCnTBnBfF7H9c\"><field name=\"NUM\">14</field></shadow></value><value name=\"VALUE\"><shadow type=\"math_number\" id=\"qSg4S-xz}$;xRC++~[87\"><field name=\"NUM\">0</field></shadow></value></block></next></block></next></block></next></block></next></block></next></block><block type=\"button_callback\" id=\"mVE|i^qfq{D1!X8t,{L?\" x=\"650\" y=\"-130\"><field name=\"BUTTON\">A</field><field name=\"EVENT\">wasPressed</field><statement name=\"FUNC\"><block type=\"controls_if\" id=\"LY!mdab3BDy2[F%w#5sK\"><value name=\"IF0\"><block type=\"logic_compare\" id=\"ti|/?O^7B9pLluvzM[,)\"><field name=\"OP\">GT</field><value name=\"A\"><block type=\"variables_get\" id=\"8X`An2pETPiNZWFy_hT[\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"suyn-:w+m1V`+lAtv]}Z\"><field name=\"NUM\">100</field></block></value></block></value><statement name=\"DO0\"><block type=\"variables_set\" id=\"H=7(By1^F=vxHX-Bj_dh\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field><value name=\"VALUE\"><block type=\"math_arithmetic\" id=\"|mm1(:o%zrYhyUGxP0Kw\"><field name=\"OP\">MINUS</field><value name=\"A\"><block type=\"variables_get\" id=\"_!5)1U2KQ*7lLcd9fdFf\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"tdJ:Y*hmhfL57=ky?82C\"><field name=\"NUM\">50</field></block></value></block></value><next><block type=\"label_set_text\" id=\"CET/#*uTojBi2?zxJ%:+\"><field name=\"COMPONENT\">period</field><value name=\"TEXT\"><shadow type=\"text\" id=\"gs_%N@m8c-)$*g`ZrqJQ\"><field name=\"TEXT\">Hello M5</field></shadow><block type=\"variables_get\" id=\"6Q|LnqFrcDNzp6?CXSTx\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field></block></value><next><block type=\"timer_setTimerAttr\" id=\"CGSDfe!`MH4Lqt,xWdI7\"><field name=\"start_name\">timer1</field><field name=\"mode\">0x00</field><value name=\"period\"><shadow type=\"math_number\" id=\"dXK,I:OdOFs8%`x3.y8}\"><field name=\"NUM\">100</field></shadow><block type=\"variables_get\" id=\"rdI_;.98rZc6a[7;{R9q\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field></block></value></block></next></block></next></block></statement></block></statement></block><block type=\"button_callback\" id=\"QJ?XbSp?b2jh;#qa^$1_\" x=\"650\" y=\"110\"><field name=\"BUTTON\">B</field><field name=\"EVENT\">wasPressed</field><statement name=\"FUNC\"><block type=\"controls_ifelse\" id=\"jpHuk16T,kP`Sd;ppXiF\"><value name=\"IF0\"><block type=\"variables_get\" id=\"}rm}I$R=Jj~,Sj%Ad.i2\"><field name=\"VAR\" id=\"Bd=v|*jUef6mW|m{@(PZ\">flag</field></block></value><statement name=\"DO0\"><block type=\"variables_set\" id=\"dViu;dMHj]iWMhz?Va-/\"><field name=\"VAR\" id=\"Bd=v|*jUef6mW|m{@(PZ\">flag</field><value name=\"VALUE\"><block type=\"logic_boolean\" id=\"q89u,HS!$^JG,6E?39OH\"><field name=\"BOOL\">FALSE</field></block></value><next><block type=\"label_set_text\" id=\"{+|80InV=4?|l]`CffNJ\"><field name=\"COMPONENT\">onoff</field><value name=\"TEXT\"><shadow type=\"text\" id=\"Uq_X|hqhD$;jla{ZoC_K\"><field name=\"TEXT\">ON</field></shadow></value></block></next></block></statement><statement name=\"ELSE\"><block type=\"variables_set\" id=\"I)*@HY#ejfcNIvjRb}6G\"><field name=\"VAR\" id=\"Bd=v|*jUef6mW|m{@(PZ\">flag</field><value name=\"VALUE\"><block type=\"logic_boolean\" id=\"8IL-jR]#]ia/IEcD)2Lc\"><field name=\"BOOL\">TRUE</field></block></value><next><block type=\"label_set_text\" id=\"^MH:lNA?v^ynIX0_TFh/\"><field name=\"COMPONENT\">onoff</field><value name=\"TEXT\"><shadow type=\"text\" id=\"E.kIr!rs0-[}zMyF/.$$\"><field name=\"TEXT\">OFF</field></shadow></value></block></next></block></statement></block></statement></block><block type=\"timer_callback\" id=\"19`vgKdmReFP0qX01psO\" x=\"170\" y=\"150\"><field name=\"name\">timer1</field><statement name=\"FUNC\"><block type=\"controls_if\" id=\"Wa[z9idUuD}F(b*+/j+G\"><value name=\"IF0\"><block type=\"variables_get\" id=\"w9Rb39a=~d,oe,ekxt^r\"><field name=\"VAR\" id=\"Bd=v|*jUef6mW|m{@(PZ\">flag</field></block></value><statement name=\"DO0\"><block type=\"pins_digital_write\" id=\"GWlr_]ugrQ$IKy-*|p8,\"><value name=\"PIN\"><shadow type=\"math_number\" id=\"sE2ivug#VpIfDQ3ZQd4M\"><field name=\"NUM\">26</field></shadow></value><value name=\"VALUE\"><shadow type=\"math_number\" id=\"$}{[IOE_`{.+h7}GX?yz\"><field name=\"NUM\">1</field></shadow></value><next><block type=\"timer_delay_ms\" id=\"4dKMgT~dQ=p}6+H,PJ?O\"><value name=\"DELAY\"><shadow type=\"math_number\" id=\"Gv$vXNL3)jmk2=+=(uL;\"><field name=\"NUM\">50</field></shadow></value><next><block type=\"pins_digital_write\" id=\"7{`*{kV(#}Zut8uwpeRz\"><value name=\"PIN\"><shadow type=\"math_number\" id=\"~=Hc5Rx7veYmLse`-)qW\"><field name=\"NUM\">26</field></shadow></value><value name=\"VALUE\"><shadow type=\"math_number\" id=\"zg4PRVL~K41zSZX*o.;)\"><field name=\"NUM\">0</field></shadow></value><next><block type=\"timer_delay_ms\" id=\"Oe.+7~UUzBt;]$bWK!5/\"><value name=\"DELAY\"><shadow type=\"math_number\" id=\"Vd$NyZ$G?AbmEnDY^}kV\"><field name=\"NUM\">1</field></shadow><block type=\"convent_int\" id=\"-2-W%N?}ik6$Nnm@4jz=\"><value name=\"VALUE\"><block type=\"math_arithmetic\" id=\",%z:mQIRD542^H*JiZ,A\"><field name=\"OP\">DIVIDE</field><value name=\"A\"><block type=\"variables_get\" id=\"gz=vZ^#]9~d^TlR#,F;S\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"b+P[u`UVCh0+YcT*@rb4\"><field name=\"NUM\">2</field></block></value></block></value></block></value><next><block type=\"pins_digital_write\" id=\")Y7Ni`txoY(|0MCd7`JF\"><value name=\"PIN\"><shadow type=\"math_number\" id=\"8|MGSEfZX++Y1T%.iaqk\"><field name=\"NUM\">14</field></shadow></value><value name=\"VALUE\"><shadow type=\"math_number\" id=\"Su.SODC9!_h$DE!m=m%d\"><field name=\"NUM\">1</field></shadow></value><next><block type=\"timer_delay_ms\" id=\"[-lM.F]HJO_{1#!jh8{t\"><value name=\"DELAY\"><shadow type=\"math_number\" id=\"J4;^3`tB)RDy?YpP#tHL\"><field name=\"NUM\">50</field></shadow></value><next><block type=\"pins_digital_write\" id=\"9aFO852wdF8ggz?2YO(M\"><value name=\"PIN\"><shadow type=\"math_number\" id=\"]]61^X(!6?gWK.B4GVBq\"><field name=\"NUM\">14</field></shadow></value><value name=\"VALUE\"><shadow type=\"math_number\" id=\"kyn/g|US{@~jlg`x=3LO\"><field name=\"NUM\">0</field></shadow></value></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block></statement></block><block type=\"button_callback\" id=\"=qVcHb*++`yVNt:XuUc,\" x=\"650\" y=\"370\"><field name=\"BUTTON\">C</field><field name=\"EVENT\">wasPressed</field><statement name=\"FUNC\"><block type=\"variables_set\" id=\"8hF-uu,b`uY,gziMBWek\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field><value name=\"VALUE\"><block type=\"math_arithmetic\" id=\")lkItx;HREN_WPq%_t~7\"><field name=\"OP\">ADD</field><value name=\"A\"><block type=\"variables_get\" id=\",m#xdnWkd}s`6%pYj*I8\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field></block></value><value name=\"B\"><block type=\"math_number\" id=\"Ie):StcU6ped,cyDbwQs\"><field name=\"NUM\">50</field></block></value></block></value><next><block type=\"label_set_text\" id=\"3-COu*dG4v?/wX9#7uR1\"><field name=\"COMPONENT\">period</field><value name=\"TEXT\"><shadow type=\"text\"><field name=\"TEXT\">Hello M5</field></shadow><block type=\"variables_get\" id=\"8s)~KvQ^U298b.3{dgtm\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field></block></value><next><block type=\"timer_setTimerAttr\" id=\"x_kM(DIKc~vKD.Dvc=%a\"><field name=\"start_name\">timer1</field><field name=\"mode\">0x00</field><value name=\"period\"><shadow type=\"math_number\"><field name=\"NUM\">100</field></shadow><block type=\"variables_get\" id=\",Al)`w#xPT)yv(Lo?g(E\"><field name=\"VAR\" id=\"uZ5fJ5}*aZN*BJqOGa,u\">time</field></block></value></block></next></block></next></block></statement></block>","Blockly.Remotes":[],"Blockly.RemotePlus":[{"id":"__title","blockId":"","createTime":1667110802984,"name":"M5RemoteTitle","dragAndDrop":false,"resizable":false,"options":{"minWidth":1,"minHeight":1,"maxWidth":6,"maxHeight":10,"defaultWidth":2,"defaultHeight":1},"w":2,"h":1,"bgColor":"#0080FF","color":"#fff","fontsize":"M","label":"M5Remote","interval":3000,"code":"","event":"","dataSource":"none","ezdataToken":"gUonuat2DuUtOlTzhoJqEGqJIQHdggjo","topic":"","needShadow":false,"type":"title","x":0,"y":0}],"modules":[],"cbIdList_":[],"eventCBIdList_":[],"apikey":"5EF8511D","uuid":"1fea7486-3e70-4fb3-a2ab-527170f629f2"}