23
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

M5Stackでタブレットクリッカーを作る

Last updated at Posted at 2020-05-10

某FG〇でFPが貯まりまくって画面を連打する必要に駆られたので作ってみました
もちろんネ〇祭でも大活躍する予定です

##使用するもの##

M5Stack
image.png

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円で売ってる奴
被覆がシリコンで出来ててフニャフニャなので画面に設置するとき便利

image.png

圧着ペンチ
Amazon | アイウィス(IWISS) 精密同時圧着ペンチ ラチェット式 オープンバレル端子 0.08〜1.0mm2極小・小・中型端子対応 SN-2549 [並行輸入品] | DIY・工具・ガーデン
https://www.amazon.co.jp/dp/B00W4WRZPU/

エンジニアの定番圧着ペンチを使ってたけど厚みがないので1端子カシメるのに2回挟まないといけなかった
これは厚みがあるから1回で済むのでありがたい

両面テープ
ダイソーで買った奴ですが同じようなものなら何でもいいと思います
image.png

ハードウェアの作成

前述のリレータッチボードにピンヘッダをハンダ付けします

シリコンケーブルにメスの3Pデュポンコネクタと逆側には1Pオスのコネクタをつけます
三つ編みにするとケーブルの癖が相殺されて使いやすくなりました

image.png

M5Stackに接続する

M5Stackボトムの接続端子にケーブルを接続します
リレータッチボードは5V駆動ですが上部分のIOは5VとGNDが隣り合っていないので注意しましょう
あとサイドは5VとGNDに近いので35,36に接続したくなりますが「入力専用」なので避けます(ありがちミス)

上側は素直に繋ぎましょう

image.png

スケッチを書く

基本的には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にしたらちょうどよかったです

UiFlowで作成する

C言語書いて書き込むのはハードルが高いのでもうちょっとお手軽なUiFlowで
書き直してみました(UiFlowのハードルが低いとは言ってない)

UiFlowとはブラウザ上のブロックプログラミングで
M5Stackシリーズのプログラムを作れるイケてるサイトです

使い方はググってください(丸投げ)

image.png

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"}

23
12
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
23
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?