100V ACスイッチ

最近なんも書いて無かったから、ちょっと書いてみるか…みたいな感じで書いておく。
100V ACをマイコンからON/OFF制御する必要が出てきてキットで作ったもの。まぁ…SSRキットを接続してサクッと出来る。制御は3V-5Vでいける。こんな感じ。

秋月 SSRキット説明書から

■ パーツ一覧

ソリッド・ステート・リレー(SSR)キット 8Aタイプ
2P ACコード(2Pプラグ/ハンダ仕上げコード)
ガラス管ヒューズ MF51NR 250V10A 20mm
管ヒューズホルダー 10A 30mm(確かこれ。100円ちょいで千石で入手)
ACアウトレット(50円くらいで千石にあるはず)
放熱板(ヒートシンク、何かあったものをつけた)
格納しておくボックス(これも、なんかあった物を使った)
ビニール線(赤白青、あったものを使った)
熱収縮チューブ(これも、あった物を使った)

■ サクッと作る

まぁ…ゲットしてきて接続するだけ。

んで完成。作るのはキットの説明に従って説明するだけ。電源は接続したら熱収縮で保護してあげる。100V感電には注意してやるくらい。ケーブルは2P ACコードが1.8mで長いから切って流用する感じで。
んで完成。そっこー出来ると思われ。

■ 動作確認

ダイソーにあった100V ACでLEDが光るという物を実験体にして使ってみることに。

マイコンにはParticle Argonを使ってNW経由でHIGH/LOWで点灯させてばっちり。

HTTP風なCoAP

そういやCoAPについて何も書いてなかったな…と思って書いておくことに。
CoAP(RFC7252)で定義されているUDPベースのプロトコルで、MQTTと同じくIoT/M2M向けの軽量版みたいな感じ。
ググればRFC/Wikipediaとかに詳しい説明があるから、そっちを見て貰った方が早いと思われ。MQTTとの比較はこんな感じ。

■ Simple Coap Library

このシンプルな実装を何年か前に作って公開している。ArduinoやPlatformIOで”CoAP”で検索すると出てくる、Simple Coap Libraryというもので。シンプルという名の通り、ライブラリのサイズ・実装も非常に軽量なものにしている。
一応動作するのは、Ardiuno物、ESP8266、ESP32、Particleといった環境での動作確認をしている。少し改造すれば、まぁ何でも動くと思われ。

Arduino libraryでCoAPで検索すると出てくる

このCoAPだけど、見事なほどまで人気が無いと個人的には思っている。MQTTとかはよく見るし、Google/AWS/AzureのIoT向けサービスもMQTTに対応している。ただ、CoAPに対応している物は数少ない。MQTT(TCP)、CoAP(UDP)とあるにも関わらず。CoAP over TCP/TLS/WebSocket(RFC 8323)という、TCP上に実装した物や、DTLS(TLSのUDP版みたいなもの)上に実装したりセキュリティには配慮していたりするのだけど。
個人的にCoAPの良いと思う点は、

・UDPで軽い
・HTTP Likeでとっつきやすい
・ノード間通信を意識している

このあたりかな。まぁ、こういう選択肢もあるよ、くらいな感じで使う感じだとは思っている。

■ サンプルコード

ESP32向けのサンプルコードはこんな感じ。githubにあるサンプルそのまんま、UDP サーバー・クライアントとして動作する。もちろん、クライアントだけで動作させてもOK。

#include <WiFi.h>
#include <WiFiUdp.h>
#include <coap-simple.h>

// WiFi接続用
const char* ssid     = "your-ssid";
const char* password = "your-password";

// デフォルトコールバック用関数
void callback_response(CoapPacket &packet, IPAddress ip, int port);

// endpoint(/light)に対するコールバック用関数
void callback_light(CoapPacket &packet, IPAddress ip, int port);

// UDPとCoAPクラスの定義
WiFiUDP udp;
Coap coap(udp);

// Lチカ用の状態
bool LEDSTATE;

// endpoint(/light)に対するコールバック用関数
// LEDのON/OFFに対応する
void callback_light(CoapPacket &packet, IPAddress ip, int port) {
  char p[packet.payloadlen + 1];
  memcpy(p, packet.payload, packet.payloadlen);
  p[packet.payloadlen] = NULL;
  
  String message(p);
  if (message.equals("0"))
    LEDSTATE = false;
  else if(message.equals("1"))
    LEDSTATE = true;

  // 状態によってLEDをON/OFFして、応答パケットを返送   
  if (LEDSTATE) {
    digitalWrite(9, HIGH) ; 
    coap.sendResponse(ip, port, packet.messageid, "1");
  } else { 
    digitalWrite(9, LOW) ; 
    coap.sendResponse(ip, port, packet.messageid, "0");
  }
}

// デフォルトのコールバック。CoAPのプロトコルをハンドリングする。
void callback_response(CoapPacket &packet, IPAddress ip, int port) {
  Serial.println("[Coap Response got]");
  
  char p[packet.payloadlen + 1];
  memcpy(p, packet.payload, packet.payloadlen);
  p[packet.payloadlen] = NULL;
  
  Serial.println(p);
}

void setup() {
  Serial.begin(9600);

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }

  // Lチカ用の状態
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
  LEDSTATE = true;
  
  // エンドポイント(/light)に対応するコールバック登録
  coap.server(callback_light, "light");

  // デフォルトのコールバックを登録
  coap.response(callback_response);

  // CoAPの起動
  coap.start();
}

void loop() {
  delay(1000);
  coap.loop();
}

URIのコールバック用の関数を登録して動かすだけ。登録以外のURLにパケットが来た場合はデフォルトコールバックが動作する(コールバックを登録していないとパケットを無視する)。例えば…

coap.server(callback_light, "light");
coap.server(callback_light_state, "light/state");
coap.server(callback_light_hogehoge, "light/hogehoge");

こんな感じで複数登録して、そのURIに来たリクエストをハンドリングすることが出来る。クライアントだけで動作させたい場合は、次の関数を用意している。

coap.get(IPAddress(XXX, XXX, XXX, XXX), 5683, "time");
coap.put(IPAddress(XXX, XXX, XXX, XXX), 5683, "light", "1");

PUT/GETに対応した関数で、[IPアドレス、ポート番号、endpoint(time/)、value(PUTする時)] を投げることが出来る。CoAPサーバー(UDPサーバ)としての動作と、クライアント単体としての動作のどちらでも動かせる感じ。
Simple CoAP Libraryという名前の通り、シンプルな動作でProxyとしての動作、DELETEや他のHTTPメソッドについては実装していない。もしその手の動作をさせたい場合は、デフォルトコールバック関数で自分でやれば良いんじゃね?基本的なPUT/GETで十分でしょ、と思っていたりする。

MQTTをこの手のデバイスで使う時は、サーバーが必要になるけど、CoAPはクライアント&サーバーとしての役割があるから、単体で動作させることが出来るというのが大きな違いかな。

TensorFlow Lite 2.1 on STM32F

TensorFlow 2.1.0がリリースされていた。最近はなぜか組込み向けでDeep Learningをする話がやってくる事があって、TensorFlow Liteを使ったりしている。

TF Liteを使ってみたことがある人は分かるだろうけど、TensorFlowのHP・ドキュメントにある通りにやっても基本的にビルドできない、サンプルが動かない、ドキュメントのリンク先は404 not foundという「一体これは何だ?動くのか?」という思いが最初に来ると思う。さらにはLayerの制限で、このモデルを作ったはいいけど、TF Lite上で動かしたらエラーで動かん…とか罠が満載で快感すら覚えてしまう。
自分もバージョンが変わる事に起きるドラスティックな変更で、これはどうすれば動くんだ?というので頭を抱えてしまう。

サクサク動いてめちゃ便利なんだけど、動かすまでが大変な沼にハマる…ということで、自分用としてもTensorflow 2.1.0で動かす手順を残しておく。ターゲットとしては次のとおり。hello_worldのサンプルを動かす。
ちなみに、本家のドキュメントのとおりArduino MKRZERO向けのサンプルのビルドをやろうとしても現時点でビルドできないからねwww ちょっと色々と修正するとArduino IDEでもビルドできるけど、デフォのサンプルだと動かないw (Arduino IDE向けのサンプルコードはこちら、もしくはAdafruitのdiffを当てる)

■ 環境
Tensorflow 2.1.0
Nucleo STM32F446RE(手元にあったもの)
VScode (PlatformIO)

ソースコード一式はこちら。PlatformIO向けに持ってきてビルドすれば動く。学習モデルはGoogle Colabで公開されている物を使うとTensorFlow Lite向けの軽量・量子化されたデータをそのまま持ってきて使える。ソースコードはNucleo向けだけど、ソースコードはそのままでarm向けなら何でもOK。
この一式を使えば、TensorFlowで学習したモデルを持ってきて、arm向けにビルドしてすぐ組込める。もちろんarm Arduinoとかでもね。一旦作っちゃえばオールOKすね。

以下は、自分で頑張ってゼロから環境を作りたい人へのメモ。

■ TensorFlow 2.1.0 Liteのプロジェクトを作る

Tensorflow Liteでは組込で必要なプロジェクトを自動で生成してくれるmakeが用意されている。一旦、Ubuntu 18.04上で作る。

pip install six==1.12.0
wget https://github.com/tensorflow/tensorflow/archive/v2.1.0.tar.gz
tar -zxvf  v2.1.0.tar.gz
cd tensorflow-2.1.0
make -f tensorflow/lite/experimental/micro/tools/make/Makefile TARGET=arduino TAGS="" generate_hello_world_arduino_library_zip
# じっと待っているとtensorflow_lite.zipが出来る。これを持ってきて利用する。
cp tensorflow/lite/experimental/micro/tools/make/gen/arduino_x86_64/prj/hello_world/tensorflow_lite.zip  $HOME

tensorflow_lite.zipを展開するとArduino向けのプロジェクトとして使える一式が出来る。他にも画像・音声認識とかのプロジェクトを生成できたりもする。
このまま使えばOKじゃん!!と思うかも知れないけど、もちろん、このままArduion IDEで取り込んでもビルドできない(TF Liteマジでふざけんなよw)。ちょっと工夫するとArduino IDEでも動かすことが出来る。実際にトラ技で書いた内容では、TensorFlow & ARDUINO MKRZERO arm-cortex M0で自作モデルを動作させて性能も出せている。
ということで、tensorflow_lite.zipをWindows/Macどちらでも持ってきて、PlatformIO向けに展開していく。

■ PIOのプロジェクトを作る

FrameworkはArduinoで適当に作っておく。mbed向けになると、前述のTF Liteのスケルトンプロジェクトをmbedとして作り直し(がんば)。

■ TF LiteをPIOにぶち込む

tensorflow_lite.zipを展開すると次のような感じになる。

これをPlatformIOのフォルダに次のような感じで展開する。

■ 推論の性能どんなもん?

推論を実行しているのはmain.cppの次の部分。
TfLiteStatus invoke_status = interpreter->Invoke();
この単体性能を測定してみると、170回/sec でまぁ使える感じの速度ですな。モデルや設定次第で数千回/secは超える。sin波を推定しているだけだから軽めというのもあるけどね。動かしてみるとこんな感じ。

■ 自前のセンサー対応モデルを組込むには?

一旦動いてしまえばカンタンな訳だけど。Google Colab上で最後に量子化して生成されたコードをsine_model_data.cppの中の配列・配列長にコピペして終わり。推論の方はinputに値を渡してInvoke、結果はoutputのTfLiteTensorから取得できる。
問題は…DropoutとかFlattenとかー…使えないのよね。対応しているオペレータはこちら。これが地味にハマるというか辛いポイントだったりする。対応してあると書いてあるオペレーターが別の資料はで未実装と書いてあったり、動くと期待してモデルに組み込んだら見事にエラーとか、ビルドもだけどトラップがねw

Ardiuno Library Manager

Arduinoで自分用のlibraryやセンサーを扱うものを使った人はとても多いと思う。というか使ったことが無い人は居ないと思うほど。
既存のlibraryを使うのもだけど、自分で作ったライブラリを公開して広く多くの人に使って、フィードバックを貰うことが出来る。ZIPファイルとして用意して個別にダウンロードしてもらうというのもアリだけど、Arduinoのlibrary群に追加することも出来る。

メニューの[スケッチ]->[ライブラリをインクルード]->[ライブラリを管理]で自分で作ったライブラリを公開することが出来る。その方法を適当に書いておく。

これは自分が公開しているCoAPライブラリ

■ ライブラリを作る

公開するまでの大まかな流れは…

1. github上でライブラリを作る。
2. Arduinoのissueにあげる。

という非常に簡単な流れになる。ライブラリは開発してrelease tagを付けておくと自動で更新されて、Arduino IDE上でも更新された物をインストール出来るようになるという便利な感じ。

まず最初にライブラリを作る。自分のgithubのであれだけど、サンプルはこんな感じで。CoAP-simple-library このlibraryはCoAPというプロトコルの基本的なPUT/GET(その他)をコールバック形式のコード表現で使える。
内容はともかく、何かライブラリを作ったら次のファイルを含めておく。

library.properties
keybords.txt
license.txt

まぁ、ぶっちゃけ仕様はここに書いてあるArduino-IDE 1.5: Library specificationとおりに、自分のライブラリに合わせて記載しておく。あとreleaseも忘れずに適当にバージョンを付けてtagを付けておく。license.txt は必要じゃないけど、MIT/Apache/BSD…etc とかライセンスを記載しておいた方が良いっすね。

■ issueを送る

ライブラリを作ったらArduinoに対してissueを送る。自分の場合はこんな感じ。わりとすぐ返事が来る。指摘された所を修正&updateすると、Arduino libraryに登録されてIDEからも検索して見つけられる。
おまけでArduino IDE以外にも、なぜかPlatformIOでもlibraryが検出できるようになっていた。

運用は全然難しくなくて、コードを修正して新バージョンにしたくなったら、github上でreleaseをするとArduino/PIOともに反映される。リードタイム的には半日以下でIDEでも新しいバージョンを見ることが出来るようになる。

■ おまけ

内容は全部英語で書くこと(当然だけど)。あと、リリースするとissueやPull Requestがあったりする。自分の場合は他のMQTT libraryもだけど、多くは「つかえねぇ」「うごかねぇ」というのが大半で、MITなOSSだからコード見れば&しらねーよ的な感じではあるけど、この辺のやりとりで英語力が鍛えられた気がする。たまに、英語のタイポ・表現ミスのPRもあったりして、何気に嬉しかったりも。あと論文とかでも使われたりとかもね、上のCoAPのやつだとちょっとググったら出てくるこの辺とか。

IoT Latency and Power consumption: Measuring the performance impact of MQTT and CoAP
Comparative Analysis of IoT Communication Protocols
MQTT i CoAP integracija Arduino uređaja sa thethigs.io cloud platformom

まぁ…折角作ったライブラリがあれば、多くの人に使ってもらってフィードバックを貰った方が間違いなく良いから、Arduino IDE library(あとPIO)に登録してみるのも良いと思われ。


Maker Faire Bay Area 2019

そういや行ってきたの書いてなかったな…と思って残しておくことに。
写真類は Maker Faire Bay Area 2019 に残して公開してあるからご自由にどうぞです。

まず…SSSSをゲットした。初めてのSSSS、大量に積み込んだハンドスピナーが影響したのだろうかw
とは言っても登場する前にダブルチェックがある位で、まぁ大したことは無かったし、国内でのフライトでも特に何を言われることも無かった。まぁ…キャリーケースの中を開けても、大量のハンドスピナーと分解されたギターが入っている位で、開けたら別の意味でビックリだっただろう。

持っていった物は大量のハンドスピナーとギター。去年のMaker Faire Tokyo、Kyotoと同じ構成で。反応はどこの国でも一緒っすね。辛かったのが、去年全部配って無くなってしまったから、今回も100個全部揃えることになった。協力してくれた皆さんあざーっした!!

整理して置いても…
乱れまくるからそのまま放置で…
フレットレスギターは初めてとの事だったけど、普通に上手かった

会場はやたら広く感じた。出展者が少なくなったのか何なのか、通路が広い(気がする)。今年で最後というのが、ジワジワと感じるものがあった。そして出展者の多くを困らせたと思うのが、凄まじいほどの雨だった。まさに土砂降りで、雰囲気的にもつらみ。屋外の人たちは残念としか言いようがない。屋外の人たちが室内に来た分、屋内展示の方は凄まじいほどの人だったと思う。

毎年沢山の人で溢れているはずが、大雨でガラガラ。
Maker向けの朝食提供 by Amazon

超巨大な物はお約束的に沢山あった。光る・デカイ・火を吹く、というのは定番みたいな感じかな。

巨大なクマの中は幻想的な雰囲気

ひたすらデカくて動いて光る
実際に潜航もしたサブマリン

紹介しきれないほど、沢山の作品があった。写真類は Maker Faire Bay Area 2019 に残して公開してあるからご自由にどうぞです。なんじゃこりゃ?みたいなのが沢山あった面白い。そして、今年もパエリアパーティでビールを大量に飲んできた。

ギャル電さんを想起した
芝生でビールを飲みながらまったりBig Face!!
なんかディジャブ感があるなー…と思ったら
去年のExploratoriumの展示でBig Faceをしていた写真が残っていた(w

晴れた時に練り歩いていた。ドコドコ良い感じね。

SONY SPRESENSEさんのブース、大手が出展しなくなった中で継続していて偉いと思った
そしてGoogleもいつもの所で。

今年でBay Areaは終わりなのかどうか、2020年もあるのかしら…雰囲気は今年で終わりか…って感じはモリモリだった。
難しいと思うのが定性的な「感動や面白い!!」ことの数値化・定量化〜お金に還元することなのかなと。個人的には文化と社会の成熟は未発達な所から、商業主義に向かって(作る・売る・仕事をするだけ儲かる)、次は精神的な部分(感動や体験、一見するとお金にならない物に価値が付く)で回って発展していくと思っている。それだけに、本当に終わってしまうなら少し残念でもある。

偶然に撮った一枚。雨上がりの芝生で、紙飛行機(世界チャンプのだと思われ)を飛ばしていたチビッコがなんか印象的になった。将来なんか面白いのでも作ってくれたらなーって思ったりもするし、出展者の一人として楽しんで貰えたらなによりかなと。
“雨降って地固まる”って言葉もあるからね。

NICT Space Hack 2019参加してきた

最近めっきりblogを書くことが無くなって、ログ的にも残してなかったから、残しておくことにする。

NICT Space HACK 2019というハッカソンが2/23-24で行われて参加してきた。
詳しくはこちら…
NICT SpaceHack 2019 ツイートまとめ #nict #spacehack
宇宙データを使ったオープンイノベーション!NICT SpaceHack2019に潜入!

大抵ハッカソンだと自分はボッチソンになる事が多いものの、今回はチームでNNNS!に入った。

大賞とオーロラ賞を頂きました。あざす。
何気にNICTに行くのは初めて…

触れるオーロラ、触ったら音と光のインタラクション。投影&音・コンセプト・プレゼン内容はおまかせして、自分はオーロラデバイスの方を作ることに。役割分担してサクッと出来るのは確かにチームだと良いっすね。

1日目の夜に実験した時のもの。何か触れるインタラクションに質問やら後で聞かれたりしたけど、原理はめちゃ簡単、導電糸を縫い込んで静電容量でタッチを検知すればOK。手持ちのグレー色の導電糸を使ったけど、白色の物を使えば”仕込んでいる感”も分からない自然な仕上がりになる。
んで、触るとLEDが反応するようにしたもの。最終的にはタッチするとOSCで投影側のoFの方に飛ばして投影&音に反映して貰ったです。

喋りながら&遊びながらやっていたら楽しくて、最終形の動画を撮るのを完全に忘れていた(w
唯一残っていた、実際にオーロラのデータを投影していた時のは良い感じ。大型なレース状のもの&プロジェクタで多層にすると更に幻想的な雰囲気になるのと、オーロラの中に人が入って動いて反応させたり、触って遊べる感が出来ると思われ。

Macbook Pro 2011の再生

メインの開発で使っているWindows10が修理に行くことになって、その間に開発が出来なくなるのはつらすぎる….ということで、Macbook Pro 2011を再生させることにした。

Macbook Airは自分ので貰ったMacbook Proを再生させて開発用でも使える化

でかいのがMacbook Pro 2011モデル。3台貰ったんだけど、どれも訳アリな感じで。
1. そもそも起動しない…
2. バッテリーが膨張してヤバい…当然起動しない。
という、そもそも動かないMacbookを再生させることにした。

というのも、一応、Corei7でメモリも8Gbyte(増強して16Gbyte)もあれば十分開発用途としても使える。とりあえずSSDに換装して、バッテリーを入れ替えれば動くんじゃ?という安直な感じだけど、やってみることにした。
ただ問題点としては、High Sierraまでしか対応していない。無理やりMojaveにも出来るといえば出来るけど、一応はHigh Sierraまではアップデートした。

結果的には3台全部復活!!サクサク動いてめちゃ良い感じになった。捨てるMacbook Pro・ゴミと思われる物でも復活できる。

このバッテリー(謹製)の盛り上がりっぷりはヤバい。中のLiPo見えているし完全にヤバい。

1.SSDに換装

何はともあれSSDに換装しよう。チョイスしたのはこの2つ。

視点は非常にイージーで安いSSD。どうせ元々死んでいたMacbookだし、256Gbyte前後もあれば十分だろうということで。OSとアプリ周辺、諸々整備して200Gbyte以上は使える領域で残るはずだし、3〜4000円のSSDを使うことにした。

2個ともHDに換装させてあげる。ちなみに、このバージョンのMacbook ProはSATA2までだから、SSDのSATA3の爆速パワーは体感出来ない。まあ、それでもHDより数倍早いから、起動も一瞬・アプリの動作・開発も普通にできている。

どちらもSATA2で使うことになっているから、Macbookから使っている時の性能は変わらない。もともと、どっちのSSDもSATA3だからね。

2. バッテリー交換

次にパンパンに膨らんだバッテリーを交換することに。ゲットしたバッテリーはこちら。

本当にこれで大丈夫か?と思ってゲットしてみたんだけど、いまの所は発熱も何もなくて普通に使えている。自分は専用のドライバは持っているから別に要らなかったけど、ドライバも2本付属してきて、特殊ネジ用のドライバを持っていない人でもこれは良いんじゃないかと思われ。

3.OS再インストール

ここまでやって気づいたことが。MacOSの再インストールどうしよう?ということだった。まずは[option] + [command] + P + RでNVRAMをリセットして再起動、WiFiに接続して最初からインストールで見事に復帰。High Sierraまでしか進化出来なかったけど、十分使えるマシンになったから大満足

drill LED Fretless guitar

I made the LED Fretless guitar for just my fun, but I want to MAKE something custom reconstruction . Now, here is my fretless guitar spec
– stratocaster type led guitar
– MCU : Particle Argon/XENON
– LED : WS2812Bx10
– Sensor : MPU-6050

I thought automatic picking guitar application is funny idea, so I tried to make the picking machine with my solenoid. Then I removed the ham pickup and manufactured the aluminum plate into an L shape, fixed it with solenoid, and embedded it in the guitar body.

Hm…subtle…verrrry subtle. And it’s need to think about the solenoid power supply, I thought that adding battery into guitar is ugly. And I remembered Paul Gilbert’s guitar playing.

Yes!! Drill!! Play the guitar using the drill(pick attached to the tip of the drill) is great idea. Paul Gilbert, you are so great!! He made the how to use the drill with guitar!!

And I decided to include the motor with pick to the guitar. Then I removed the front ham pickup and I manufactured the aluminum plate into an L shape, fixed it both sides of the motor. Guitar pick fixed to the motor axis.

Here is new guitar spec,
– stratocaster type led guitar
– MCU : Particle XENON
– LED : WS2812Bx10
– Sensor : MPU-6050
– Motor : FA-130R
– Motor Driver : TB6612FNG Dual Motor Driver

2 motors connect to motor driver through backside of pickup, motor driver include to space of the volume toggle. Motor pick machine attack to 1, 2, 5, 6 strings. The bass sound and treble is easy to play fast with motor power.
Drill motor start up with button on the pick guard it have a two mode. Picking while the pressing the button mode and picking for fixed time mode.
First of all, let’s play.

And when the button is pressed and drill is working, the LED will set to rainbow color. I think this guitar have a two playing pattern.
1. Pressed the button with one hand(right-side), other hand(left-side) play the strings.
2. Press the button just a one time motor work fixed time, while that time play the guitar normally(very fast picking with drill).
Adjust the strings height, it play with the drill working where you pressed the strings.

This guitar could play everybody!!

Maker Faire Bay Area 2019.
Maker Faire Bay Area 2019.
My playing at NT Kanazawa

This guitar can use Bluetooth/6LoWPAN with XEON, LED and Drill can work from internet or other PC, cell phone. Yes, this guitar have a remote play mode.

Fret-less guitar original sound, fast playing the guitar with drill are this guitar special set. I will use this guitar for one fo the sound make.

RISC-V QEMUで色々と動かす

RISC-V用のQEMUが公開されていて使ってみることにする。QEMU/LLVMともに開発速度が猛烈に早いから、このビルド方法は”現時点”でのビルド方法になる。 またビルドにはEC2 t3.2xlarge(8vCPU/32Gmem/30GSSD/Ubuntu 18.04)を使ってみた。1時間使っても40円弱、めちゃくちゃ安い。 自分のPC(VirtualBox: 2vCPU/4Gmem)でビルドをすると、この辺のはいつになっても終わらないから、クラウド上でビルドしてローカルに持ってくればそれでOK。サクサク時間の節約にもなる。以下、手順を踏んでトータルで1時間もあればビルドが終わって確認できるはず(多分)。

# 必要な物をざっくりインストール
sudo apt-get install gcc libc6-dev pkg-config bridge-utils uml-utilities zlib1g-dev libglib2.0-dev autoconf automake libtool libsdl1.2-dev libpixman-1-dev cmake

# qemu build
# 4.1系を使う必要あり、4.0系だとこれにハマる。
# https://github.com/sifive/freedom-e-sdk/issues/260
# 4.1.0-rc0だとパッチがかかっている。
wget https://download.qemu.org/qemu-4.1.0-rc0.tar.xz
tar xvJf qemu-4.1.0-rc0.tar.xz
cd qemu-4.1.0-rc0
./configure --target-list=riscv64-softmmu,riscv32-softmmu,riscv64-linux-user,riscv32-linux-user
make -j$(nproc)
sudo make install


次にPlatformIOを使ってqemu向けベアメタル用のelfを作る。hifive1ボードをターゲットにしてサクッとビルドするだけ。それにしてもpioはこの手の組込み向けだと最強というか、VScodeは何でも出来てしまうヤバさがステキすぎる。ちなみに、みんな大好きSiPEED向けのボードも既にpioに入っていて、kendryte210 SDKでのビルドも作れる。


これで出来たfirmware.elfをEC2側に送ってqemuですぐ動かすことが出来る。
次に折角なのでLLVMのビルドも作っておく。これは以下の手順通りsifive(hifive1)の手順があって、toolchain/llvmの手順通り流すとビルドが終わる。
https://github.com/sifive/riscv-llvm

以上で物が揃って、全部qemu risc-vエミュ上でサクッと動かせる。あとはこんな感じで。
 

qemu-system-riscv32 -nographic -machine sifive_e -kernel firmware.elf 
qemu-riscv32 hello

これで一通り、gnu-toolchain/llvm/qemu上での動作が確認できる。よくあるFedora RISC-Vも普通に動く感じ。次はQEMUのRISC-V命令セット部分をいじっていこう。

PCAで動画圧縮

最近、機械学習でsciket-learnを色々と使っていたりで、なんとなく動画をPCA次元削減して遊んでみた。元々はPCAを行ったあとにk-meansでカテゴライズをしたりする時に使ったりする訳だけど、画像を次元削減して見てみると面白いフィルターとして使えそうな。
動画は元々はMaker Faire Bay Areaで撮った1920×1080のmp4ファイルをJPEGで取り出して、ちょっと大きいから半分にサイズを減らした後、10(右下), 60(左下), 120(右上), 240(左上)次元削減している。次元が少ない方が面白い感じに。動画から切り出した写真で10・240次元削減した物はこんな感じになる。

ソースコードはこんな感じ。とっても簡単。PCAのモデルは処理が終わったら保存しておいて、別途回せるように保存している。

import cv2
from PIL import Image
import numpy as np
import pickle
from sklearn.decomposition import PCA

# 動画の読み込み
cap = cv2.VideoCapture("movie.mp4")
dataset = []

while(cap.isOpened()):
    ret, img = cap.read()
    
    if ret == True:
        # CV2ImageをPILImageに変換
        img = img[:, :, ::-1].copy()
        img = Image.fromarray(img).resize((int(960), int(540)), Image.BICUBIC)
        
        # (540, 960, 3)配列にして1次元にする
        img = np.asarray(img)
        img = img.reshape(1, img.shape[0] * img.shape[1] * img.shape[2])
        dataset.append(img[0])
    else:
        break

# PCA実行
pca = PCA(n_components=10)
pca.fit(np.array(dataset).astype(np.float64))

# モデルを保存しとく(後で使うとき用)
with open('pca.pickle', mode='wb') as fp:
    pickle.dump(pca, fp)

# 動画を作成
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
video = cv2.VideoWriter('result.mp4', fourcc, 30.0, (960, 540))

for img in dataset:
    # PCAして動画に突っ込む
    transformed = pca.transform([img])
    pilImg = Image.fromarray(255 - (transformed.dot(pca.components_).reshape([540, 960, 3])).astype(np.uint8))
    cv2Img = np.asarray(pilImg)
    video.write(cv2Img)

video.release()

画像を色々と集めてきてPCAをかけたモデルを保存して、思わずJamiroquaiのVirtual Insanityの動画をmp4で取得してきてPCAをかけた。なんとなく最初に浮かんだのがJamiroquaiだったからで、特に深い意味は無いけど。

面白いフィルターとして使えそうな気がちょっぴりしていたり。RGB成分をそれぞれ分離して、それぞれの成分毎に圧縮して掛け合わせてみても面白いかも。