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

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

これだけだとマックイーンとの接着ができないので以下のアイテムを追加購入。
できたのがこちら
作ってみた感想
紙の土台だと工作もしやすいので良き。例えばサーボモータ乗っけて腕をつけるとかできそうかなと。
Redefining the school
上記リンク先の発泡どんぶりそのままだとデコレーションしづらい(油性ペン使えない)ので以下のアイテムを使うことにした。紙製かつ100円で環境にも優しいらしいので工作にはもってこい。
これだけだとマックイーンとの接着ができないので以下のアイテムを追加購入。
紙の土台だと工作もしやすいので良き。例えばサーボモータ乗っけて腕をつけるとかできそうかなと。
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
上記エラーはこの認証が通らなかったことを意味するのですが、事前の鍵情報の書き込みをしてない限りそれはあり得ません。
ではなぜ起こったのか?それは「書き込みが完了する前にタグをリーダから離してしまった」からです。書き込みが完了するまでは以下のようにしっかりとタグを読み込ませておかないと認証が失敗してしまうので気を付けてください。
sudo timedatectl set-timezone Asia/Tokyo
みなさん明けましておめでとうございます。今年もどうぞよろしくお願いします。
さて新年最初のアソビワークショップ、昨年のやり残しからスタートしました。
まずは思い出すところから。確かLEDストリングライトをmicrobitで制御して好みのライトパターンを作っていた。
正月明けだけど過去の写真や記憶を辿りながら再現していく。
このわいわい感がたまらない。思い描いたものと違った物になるのもまたよし。失敗から学ぶことの方が多い。新年早々遊びながらも学んでるなー!
袋の下まで光らせたかったけどそこは上手くできなかった、とのこと。
こちらはたくさんのLEDをつけた弊害でどうやらとっても着づらかった模様笑
大まかに4つに分類することができる。
MLの使い方 | タスク/活用段階 | MLアルゴリズム | インプット | アウトプット | 参考リンク |
意思決定 | HLS設計空間探索 | 決定木、多項式回帰 など | ハード指令e.g. 初期状態、終了条件 | ハイパーパラメータの品質(例:初期状態、終了条件など | |
ロジック合成 | DNN | RTL記述 | ワークフローとオプティマイザーの選択 | ||
マスク合成 | 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 | デバイスパラメータ | 設計制約の充足性 |
そもそもの勾配の定義から振り返ろう。以下のような関数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)とするとたとえばこんな感じ?
以下のサーベイ論文より気になった部分を抽出する。
Machine Learning for Electronic Design Automation: A
Survey
通常の高位合成プロセスはC/C++/SystemC→HLS→HDL→実装→ビット列変換 となる。しかしながらHDL以降が非常に時間がかかるためいちいちHDL以降のプロセスを経た最適解探索はやってられない。
そこでこのプロセス効率化をどうにかできないか?というのがモチベーション。
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、ランダムフォレストを組み合わせたアンサンブルモデルを提案して推定をおこなっている。
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倍近い高速化を実現した。
これまでのアプローチは焼きなまし法や遺伝的アルゴリズムといった古典的なアルゴリズムが適用されているがこれらは「探索」に重きを置いている。昨今では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は二つの段階に分かれている
Machine-learning based simulated annealer method for high level synthesis design space exploration [pdf] Anushree Mahapatra and Benjamin Carrion Schafer. ESLsyn 2014
FSAでは決定技を利用してSAの性能を向上させている。
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モデルを構築した。
やりたいこと
使用機材
マイクロビット v2
https://www.switch-science.com/catalog/6600/
磁気スイッチ
ワニ口クリップ(赤黒黄それぞれ一つずつ)
抵抗器(1kΩ)
回路図
実際に作ったのがこちら
動作確認
プログラム
#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
参考リンク