What can make micro-maqueen looks better?マイクロマックイーンの見栄えをどうにかしたい

これの見た目どうにかならんのか?

https://www.dfrobot.com/product-1783.html

これを見たら閃いた

発砲どんぶり(お椀)で亀を作る:自由工作

上記リンク先の発泡どんぶりそのままだとデコレーションしづらい(油性ペン使えない)ので以下のアイテムを使うことにした。紙製かつ100円で環境にも優しいらしいので工作にはもってこい。

https://iyec.omni7.jp/detail/4973631533420

これだけだとマックイーンとの接着ができないので以下のアイテムを追加購入。

できたのがこちら

作ってみた感想

紙の土台だと工作もしやすいので良き。例えばサーボモータ乗っけて腕をつけるとかできそうかなと。

ArduinoでRFIDモジュール(MFRC522)を使ってタグに名前の書き込み・読み込みをする

今回使うもの

Aruduino UNO

MFRC522

使用する前のセッティング

以下の記事を参考にしてください。

非接触ICタグで遊ぼう!ArduinoでRFIDリーダRC522を使う方法

とりあえず私はこんなかんじ。無駄にマイクロビット繋げてますけど気にしないでください。

コード

ライブラリのサンプルをそのまま使います。

https://github.com/miguelbalboa/rfid/tree/master/examples

まずは書き込みから。

/*
 * Write personal data of a MIFARE RFID card using a RFID-RC522 reader
 * Uses MFRC522 - Library to use ARDUINO RFID MODULE KIT 13.56 MHZ WITH TAGS SPI W AND R BY COOQROBOT. 
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 * More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
 *
 * Hardware required:
 * Arduino
 * PCD (Proximity Coupling Device): NXP MFRC522 Contactless Reader IC
 * PICC (Proximity Integrated Circuit Card): A card or tag using the ISO 14443A interface, eg Mifare or NTAG203.
 * The reader can be found on eBay for around 5 dollars. Search for "mf-rc522" on ebay.com. 
 */

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance

void setup() {
  Serial.begin(9600);        // Initialize serial communications with the PC
  SPI.begin();               // Init SPI bus
  mfrc522.PCD_Init();        // Init MFRC522 card
  Serial.println(F("Write personal data on a MIFARE PICC "));
}

void loop() {

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  Serial.print(F("Card UID:"));    //Dump UID
  for (byte i = 0; i < mfrc522.uid.size; i++) {
    Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
    Serial.print(mfrc522.uid.uidByte[i], HEX);
  }
  Serial.print(F(" PICC type: "));   // Dump PICC type
  MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak);
  Serial.println(mfrc522.PICC_GetTypeName(piccType));

  byte buffer[34];
  byte block;
  MFRC522::StatusCode status;
  byte len;

  Serial.setTimeout(20000L) ;     // wait until 20 seconds for input from serial
  // Ask personal data: Family name
  Serial.println(F("Type Family name, ending with #"));
  len = Serial.readBytesUntil('#', (char *) buffer, 30) ; // read family name from serial
  for (byte i = len; i < 30; i++) buffer[i] = ' ';     // pad with spaces

  block = 1;
  //Serial.println(F("Authenticating using key A..."));
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("PCD_Authenticate() success: "));

  // Write block
  status = mfrc522.MIFARE_Write(block, buffer, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));

  block = 2;
  //Serial.println(F("Authenticating using key A..."));
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  // Write block
  status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));

  // Ask personal data: First name
  Serial.println(F("Type First name, ending with #"));
  len = Serial.readBytesUntil('#', (char *) buffer, 20) ; // read first name from serial
  for (byte i = len; i < 20; i++) buffer[i] = ' ';     // pad with spaces

  block = 4;
  //Serial.println(F("Authenticating using key A..."));
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  // Write block
  status = mfrc522.MIFARE_Write(block, buffer, 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));

  block = 5;
  //Serial.println(F("Authenticating using key A..."));
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, block, &key, &(mfrc522.uid));
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("PCD_Authenticate() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  // Write block
  status = mfrc522.MIFARE_Write(block, &buffer[16], 16);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("MIFARE_Write() failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }
  else Serial.println(F("MIFARE_Write() success: "));


  Serial.println(" ");
  mfrc522.PICC_HaltA(); // Halt PICC
  mfrc522.PCD_StopCrypto1();  // Stop encryption on PCD

}

すると以下のような出力がシリアルモニターに表示されます。

Type Family name, ending with #

そしたら入力欄にファーストネーム「hoge#」を打ち込みましょう。入力の最後は#で終わらせる必要があります。すると以下の出力が続きます。

PCD_Authenticate() success:
MIFARE_Write() success:
MIFARE_Write() success:
Type First name, ending with #

最後に「taro#」と打ち込めば完了です。

次に読み込み。

/*
 * Initial Author: ryand1011 (https://github.com/ryand1011)
 *
 * Reads data written by a program such as "rfid_write_personal_data.ino"
 *
 * See: https://github.com/miguelbalboa/rfid/tree/master/examples/rfid_write_personal_data
 *
 * Uses MIFARE RFID card using RFID-RC522 reader
 * Uses MFRC522 - Library
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 * More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
*/

#include <SPI.h>
#include <MFRC522.h>

#define RST_PIN         9           // Configurable, see typical pin layout above
#define SS_PIN          10          // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);   // Create MFRC522 instance

//*****************************************************************************************//
void setup() {
  Serial.begin(9600);                                           // Initialize serial communications with the PC
  SPI.begin();                                                  // Init SPI bus
  mfrc522.PCD_Init();                                              // Init MFRC522 card
  Serial.println(F("Read personal data on a MIFARE PICC:"));    //shows in serial that it is ready to read
}

//*****************************************************************************************//
void loop() {

  // Prepare key - all keys are set to FFFFFFFFFFFFh at chip delivery from the factory.
  MFRC522::MIFARE_Key key;
  for (byte i = 0; i < 6; i++) key.keyByte[i] = 0xFF;

  //some variables we need
  byte block;
  byte len;
  MFRC522::StatusCode status;

  //-------------------------------------------

  // Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }

  Serial.println(F("**Card Detected:**"));

  //-------------------------------------------

  mfrc522.PICC_DumpDetailsToSerial(&(mfrc522.uid)); //dump some details about the card

  //mfrc522.PICC_DumpToSerial(&(mfrc522.uid));      //uncomment this to see all blocks in hex

  //-------------------------------------------

  Serial.print(F("Name: "));

  byte buffer1[18];

  block = 4;
  len = 18;

  //------------------------------------------- GET FIRST NAME
  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 4, &key, &(mfrc522.uid)); //line 834 of MFRC522.cpp file
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(block, buffer1, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //PRINT FIRST NAME
  for (uint8_t i = 0; i < 16; i++)
  {
    if (buffer1[i] != 32)
    {
      Serial.write(buffer1[i]);
    }
  }
  Serial.print(" ");

  //---------------------------------------- GET LAST NAME

  byte buffer2[18];
  block = 1;

  status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, 1, &key, &(mfrc522.uid)); //line 834
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Authentication failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  status = mfrc522.MIFARE_Read(block, buffer2, &len);
  if (status != MFRC522::STATUS_OK) {
    Serial.print(F("Reading failed: "));
    Serial.println(mfrc522.GetStatusCodeName(status));
    return;
  }

  //PRINT LAST NAME
  for (uint8_t i = 0; i < 16; i++) {
    Serial.write(buffer2[i] );
  }


  //----------------------------------------

  Serial.println(F("\n**End Reading**\n"));

  delay(1000); //change value if you want to read cards faster

  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();
}
//*****************************************************************************************//

すると以下が出力されます。

**Card Detected:**
Card UID: xxxx
Card SAK: xxxx
PICC type: MIFARE 1KB
Name:
taro hoge
**End Reading**

注意点

一点はまったポイントがあるので記しておきます。書き込み時に以下のような出力が出る場合があります。

PCD_Authenticatie Failed…

MFRC522では各種操作の前に以下リンク先の205行目にあるPICC_CMD_MF_AUTH_KEY_Aを用いてタグの認証を行います。

https://github.com/miguelbalboa/rfid/blob/master/src/MFRC522.h

上記エラーはこの認証が通らなかったことを意味するのですが、事前の鍵情報の書き込みをしてない限りそれはあり得ません。

ではなぜ起こったのか?それは「書き込みが完了する前にタグをリーダから離してしまった」からです。書き込みが完了するまでは以下のようにしっかりとタグを読み込ませておかないと認証が失敗してしまうので気を付けてください。

マイクロビットを使ったクリスマスアクセサリー製作編 最終回/第39回アソビワークショップ開催報告

みなさん明けましておめでとうございます。今年もどうぞよろしくお願いします。

さて新年最初のアソビワークショップ、昨年のやり残しからスタートしました。

去年はどんなことをやってたか?

まずは思い出すところから。確かLEDストリングライトをmicrobitで制御して好みのライトパターンを作っていた。

前回のパターンを再現する

正月明けだけど過去の写真や記憶を辿りながら再現していく。

「さぁ何をしていたか思い出せるかな?」
昔(2021年)の勘を取り戻してきた!?

作品を作り上げる

このわいわい感がたまらない。思い描いたものと違った物になるのもまたよし。失敗から学ぶことの方が多い。新年早々遊びながらも学んでるなー!

「早よせんかい!」
「なかなかいい感じ??」

実際に使ってみる

袋の下まで光らせたかったけどそこは上手くできなかった、とのこと。

光るバッグ

こちらはたくさんのLEDをつけた弊害でどうやらとっても着づらかった模様笑

(内側が)光るジャケット

EDAに使用されるMLモデルの一覧

大まかに4つに分類することができる。

  • 意思決定
  • 性能予測
  • ブラックボックス最適化
  • 自動設計
MLの使い方タスク/活用段階MLアルゴリズムインプットアウトプット参考リンク
意思決定HLS設計空間探索決定木、多項式回帰 などハード指令e.g. 初期状態、終了条件ハイパーパラメータの品質(例:初期状態、終了条件など
ロジック合成DNNRTL記述ワークフローとオプティマイザーの選択
マスク合成CNNレイアウト画像
最適化手法の選択
性能予測アナログトポロジー設計CNN、ファジー などアナログスペック最良トポロジーの選択
HLS線形回帰、SVM、ランダムフォレスト、XGブースト などH LSレポート、ワークロード性質、ハードウェア性質リソース使用、タイミング など
配置とルーティングSVM、CNN、GAN、MARS、ランダムフォレスト などネットリストやレイアウト画像の特徴量ワイヤ長、ルーティング、輻輳 など
物理実装(リソグラフィーホットスポット探知、IR欠落予測)SVM、CNN、XGブースト、GAN などRTL・ゲートレベル記述、技術ライブラリ、物理実装コンフィグリソグラフィーホットスポットの存在、IR欠落、パス遅延バリエーション
検証KNN、ONN、GCN、ルール学習、SVM、CNNテスト仕様セット、低コストスペックブーリアン パス/フェール予測
デバイスサイズ決定ANNデバイスパラメータ制約充足の可能性
ブラックボックス最適化HLS設計空間探索ランダムフォレスト、ガウシアンプロセス、アンサンブルモデル などHLS設計のハード指示品質結果(レイテンシー、エリア など)
3D統合ガウシアンプロセス、NN物理設計コンフィグクロックスキュー、熱性能 など
設計自動化ロジック統合強化学習、GCNロジック関数のゲートレベルDAGエリア、レイテンシー など
配置強化学習、GCNマクロ配置ワイヤ長、輻輳 など
マスク合成GAN、CNN、決定木、辞書学習RTL・ゲートレベル記述、レイアウト画像光学近接補正(OPC)、サブ解像度アシスト機能(SRAF)の生成
デバイスサイズ決定強化学習、GCN、DNN、SVMデバイスパラメータ設計制約の充足性

What is gradient in Gradient Descent? / [勾配降下法]関数の勾配の定義を振り返る

勾配とは?

そもそもの勾配の定義から振り返ろう。以下のような関数fについて考える。

[mathjax]

$$f(x) = 3x_1^2 – 2x_1x_2 + 3x_2^2 -4x_1 -4x_2$$

このときベクトル$latex \nabla f(x)$を点xにおける関数fの勾配(gradient)という。

$$ \nabla f(x) = \left( \frac{\partial f(x)}{\partial x_1}, \frac{\partial f(x)}{\partial x_2}, \cdots, \frac{\partial f(x)}{\partial x_n} \right) \in \mathbb R^n $$

※ただし以下が成り立つ場合(これは2点を結ぶ線分の傾きから求められますよね?)

$$ f(x+d) = f(x) + \nabla f(x)^Td + o(\Vert{d}\Vert), d \in \mathbb R^n$$

この定義に基づくと上式の勾配は以下で表すことができる。

$$\nabla f(x) = \begin{pmatrix}
6x_1-2x_2-4 \\
-2x_1 + 6×2 -4 \\
\end{pmatrix}
$$

ここで勾配の定義をより直感的にするために以下の2点における勾配を考えてみる。

$$a = (0, 0)^T, \nabla f(a) = (-4, -4)^T$$
$$b = (2, 0)^T, \nabla f(b) = (8, -8)^T$$

このようにfにおける各点の勾配は接線に対して垂直なベクトルとして表される。
そして上図の各点において傾きが最大となる方向を表し、勾配と反対になる方向が降下方向となる。

つまり探索方向を勾配$latex \nabla f(x)$の逆(降下)方向に定めて探索することから「勾配降下法」と言われる所以である(と思う。)

勾配降下法の探索イメージ

初期点を(0, 0)とするとたとえばこんな感じ?

High Level Synthesis in Electronic Design Automation with Machine Learning / 電子設計自動化における高位合成と機械学習活用について

以下のサーベイ論文より気になった部分を抽出する。

Machine Learning for Electronic Design Automation: A
Survey

なぜMLが必要とされるのか?

通常の高位合成プロセスはC/C++/SystemC→HLS→HDL→実装→ビット列変換 となる。しかしながらHDL以降が非常に時間がかかるためいちいちHDL以降のプロセスを経た最適解探索はやってられない。

そこでこのプロセス効率化をどうにかできないか?というのがモチベーション。

MLによるパフォーマンス推定

論文リンク

Pyramid: Machine Learning Framework to Estimate the Optimal Timing and Resource Usage of a High-Level Synthesis Design [pdf]

活用プロセス

Step1. データセットの収集

過去のデザイン実績からFPGAデバイスのクロックタイミングなどを収集。多重共線性の影響を考慮するために重要でない特徴量を体系的に取り除く選択技術が用いられる。

カテゴリー説明
クロック周期目標クロック周期:達成したクロック周期とその不確かさ
リソースLUT、FF、DSPそしてBRAMの活用と有効性
論理指令各司令のビット幅/リソース統計
算術指令算術司令のビット幅/リソース統計
メモリーメモリのリソース使用量
多重化装置リソース使用量、入力サイズ/ビット幅
特徴量の例

Step2. 推定モデルの学習

実装後のリソース使用量とクロックタイミングを推定するための回帰モデルを学習する。推定誤差はRAEやRMSEが使われる。

HLSツールで生成されたRTLコードの最大クロック周波数、スループット、スループット対面積比などの結果を取得し、線形回帰、ニューラルネットワーク、SVM、ランダムフォレストを組み合わせたアンサンブルモデルを提案して推定をおこなっている。

HLSツールの演算遅延予測誤差低減

論文リンク

Accurate Operation Delay Prediction for FPGA HLS Using Graph Neural Networks [pdf] Ecenur Ustun, Chenhui Deng, Debjit Pal, Zhijing Li, and Zhiru Zhang. ICCAD 2020

既存のHLSツールは個々の演算遅延を単純に加算することで推定しているので実装後の最適化によってその予測は不正確になる可能性がある。そこでカスタマイズされたGNNモデルを構築することでハード化されたブロックに関するマッピングの選択を推測し、HLSの遅延予測のRMSEを72%削減することができた。

クロスプラットフォームパフォーマンスの予測

論文リンク

XPPE: Cross-Platform Performance Estimation of Hardware Accelerators Using Machine Learning [pdf] Hosein Mohammadi Makrani, Hossein Sayadi, Tinoosh Mohsenin, Setareh rafatirad, Avesta Sasan, Houman Homayoun. ASPDAC 2019

Zynqのような新たなプラットフォームも含めて各FPGAごとに任意のアプリケーションのリソース使用率を予測する。

予測器の入力はアプリケーション特性、HLSレポートと目標FPGAスペック。XPPEはNNモデルを使用してARMプロセッサを使用したときのFPGAアプリケーションのスピードアップを推定する。これにより相対的な平均二乗誤差を5.1%抑えて2倍近い高速化を実現した。

HLSレポートイメージ
https://docs.xilinx.com/r/en-US/ug1393-vitis-application-acceleration/Profile-Summary-Report

設計空間探索を支援するためのML活用

これまでのアプローチは焼きなまし法遺伝的アルゴリズムといった古典的なアルゴリズムが適用されているがこれらは「探索」に重きを置いている。昨今ではMLを用いる異なったアプローチを見ることができる。

古典的な最適化アルゴリズムを改善するML

論文リンク

Machine Learning for Design Space Exploration and Optimization of Manycore Systems [pdf] Ryan Gary Kim, Janardhan Rao Doppa and Partha Pratim Pande. ICCAD’18

STAGEはマルチコアシステムのDSE手法、SAの性能は探索プロセスの開始点に大きく依存しているという観察結果をもとにしている。設計空間のどの部分に焦点を当てるべきかを学習するMLモデルを構築して無駄な探索の時間を排除している

STAGEは二つの段階に分かれている

  • 第一段階 ローカルサーチ
    • 設計者の目標に基づいたコスト関数を用いて通常の検索を行う
  • 第二段階 メタ検索
    • ある出発点を与えられた時のローカル検索の結果を予測することを学習するために、以前のローカル検索の実行による検索軌跡を使用する

さらなるSAの性能向上

論文リンク

Machine-learning based simulated annealer method for high level synthesis design space exploration [pdf] Anushree Mahapatra and Benjamin Carrion Schafer. ESLsyn 2014

FSAでは決定技を利用してSAの性能を向上させている。

メタヒューリスティクスのハイパラ設定とML

論文リンク

Machine Leaming to Set Meta-Heuristic Specific Parameters for High-Level Synthesis Design Space Exploration [pdf] Zi Wang and Benjamin Carrion Schafer. DAC 2020

SA、GA、ACOについてハイパラの設定から結果として得られる設計品質(Average Distance to the Reference Set)と実行時間を予測するMLモデルを構築した。

Open & Close detection module with microbit and magnetic switch / Microbitと磁気スイッチを使って開閉検知モジュールを作る

やりたいこと

  • マイクロビットにポン付できるお手軽なモジュールを作りたかった
  • 手始めに開閉検知機能を持ったモジュールを量産できたらと

使用機材

マイクロビット v2

https://www.switch-science.com/catalog/6600/

磁気スイッチ

ワニ口クリップ(赤黒黄それぞれ一つずつ)

抵抗器(1kΩ)

回路図

実際に作ったのがこちら

動作確認

プログラム

Change default file name of screenshot in macOS / macOS スクリーンショットのデフォルトファイル名を変更する

#SCREEN CAPTURE
# スクリーンショットのファイル名に日付を表示する/表示しない
defaults write com.apple.screencapture include-date -bool false

# スクリーンショットをPNG形式で保存(その他のオプション:BMP、GIF、JPG、PDF、TIFF)
defaults write com.apple.screencapture type -string "png"

# スクリーンショットの保存場所
defaults write com.apple.screencapture location ~/Desktop/Screenshots

# スクリーンキャプチャのシャドウを無効にする
defaults write com.apple.screencapture disable-shadow -bool true

# ファイル名を変更する
defaults write com.apple.screencapture name [yourFilename]

# 設定変更を反映
killall SystemUIServer  

参考リンク

https://apple.stackexchange.com/questions/294548/macos-sierra-10-12-screen-captures-how-to-edit-system-files