たくさん書き込むとお腹パンパンに——見ただけで使用量が分かるUSBメモリー
CDやDVDといった記録メディアが姿を消しつつある一方、今なお活躍の場が多いUSBメモリー。私はLinuxのインストールメディア作成や、機器のデータ移行でよく使用しています。
しかし、気づけば容量がいっぱいになっていて、いざ使おうと思ったときに不要なデータを整理する羽目になることも……。そこで、「ひと目で使用量が分かるUSBメモリーがあれば良いのでは?」と思い立ちました。普段使いするので、せっかくならかわいいデザインにしたいものです。かわいくて実用的なUSBメモリーづくりに挑戦しました。
保存したデータの分だけお腹が膨らむ!
これが完成したUSBメモリーです。3Dプリンターで製作しました。ペンギンが上を向いた姿の、かわいらしいデザインです。くちばしがUSBコネクターのプラグになっています。
デスクに並べやすいよう、立つようにしました。
使い方はとても簡単です。ペンギンが仰向けになるようにPCのUSBポートに差し込みます。PCのデータをたくさん食べさせてあげるのです。
ペンギンがPCに突撃するみたいで面白いですね。
そして普通のUSBメモリーと同じようにデータを保存します。PCに接続するとエクスプローラーで普通のUSBメモリーとして認識されるので、ドラッグアンドドロップで簡単にデータの移動ができます。試しに約10MBのデータを保存してみましょう。
USBドライブとして認識されました。
デバイス名は「Penguin Memory」となっています。
すると、データサイズに応じてペンギンのお腹が膨らみます。
お腹に10MBのデータが入っている様子です。
逆にUSBメモリーからデータを削除するとお腹はへこみます。
腹ペコなようですね。
お腹のサイズは電源を切っても保持されるので、PCからUSBメモリーを抜いてもそのままの状態です。これでPCに接続しなくても、ひと目でUSBメモリーの容量が分かります。
お腹が膨らむ仕組み
システム構成は以下のようになっています。主な構成部品はサーボモーターとマイコン、microSDカードです。
ペンギンのお腹にはサーボモーターが入っています。お腹は頭を軸にしてパカパカ開くような機構になっており、サーボモーターの角度に応じて動きます。
目の位置がちょうど回転軸になっています。
サーボモーターのホーンが横向きだとへこみ、縦向きだと膨らんで見えます。サーボモーターの角度は維持されるので、電源を切っても(PCから抜いても)お腹の状態はそのままというわけです。
サーボモーターの微妙な角度調整が肝です。
そして、サーボモーターを動かすために、中にはマイコンが入っています。マイコンの選定に悩みましたが、USBメモリーそのものを小型化できるよう、サイズが20mm程度の「Seeeduino XIAO」を使用しました。
約1000円で購入できます。
マイコンのみでは、少ないデータしか保存できません。USBメモリーとしてのストレージ機能はmicroSDカードに持たせています。このmicroSDカードをマイコンで読み取り、その容量によってサーボモーターの角度=お腹の膨らみ具合を決めているのです。
使用するmicroSDカードで最大容量が決まります。
マイコンで制御できるUSBメモリーの作り方
この作品のユニークな点は、直接PCと接続しているのはマイコンでありながら、SDカードのストレージを通常のUSBメモリーのように機能させている点です。
電子工作でマイコンからSDカードを制御することは多々あります。しかし、マイコンをUSBポートでPCと接続しても、SDカードに読み書きできるのはマイコンだけで、PCから直接SDカードの中身をのぞくことはできません。よくある電子工作では、マイコンからSDカードの画像を読み出したり、マイコンのログをSDカードに記録したりという使い方が多いはずです。
USBメモリーではなく、マイコンとして認識されます。
それでは、どうすれば良いのでしょうか? この問題を解決するポイントは、まず「マイコンをUSBメモリーとして認識させる」ことです。私はAdafruit_TinyUSBライブラリを使用してそれを実現しました。
Adafruit_TinyUSBライブラリは、「Arduino」や「CircuitPython」でUSBデバイスやホストの機能を実装するために使用できます。例えば、以下のようなことができます。
- USB HID(Human Interface Device)
・キーボードやマウスのエミュレーション
・ゲームコントローラーとして認識させる - USB Mass Storage(MSC)
・マイコンをUSBメモリーとして認識させる - USB CDC(Communications Device Class)
・仮想シリアルポートを作成(Serial のようにPCと通信) - USB MIDI
・マイコンをMIDIデバイス化し、PCやDAWと連携
今回のケースでは、まさしくUSB Mass Storageが最適です。この機能では、記憶域としてマイコン内蔵のフラッシュメモリーだけでなく、SDカードも指定できます。以下のようなコードでUSBメモリーの機能を実装できました。
#include <SD.h>
#include <Adafruit_TinyUSB.h>
Adafruit_USBD_MSC usb_msc;
Sd2Card card;
SdVolume volume;
void setup() {
usb_msc.setID("Penguin", "Memory", "1.0");
usb_msc.setReadWriteCallback(msc_read_cb, msc_write_cb, msc_flush_cb);
usb_msc.setUnitReady(false);
usb_msc.begin();
if (TinyUSBDevice.mounted()) {
TinyUSBDevice.detach();
delay(10);
TinyUSBDevice.attach();
}
card.init(SPI_HALF_SPEED, 0);
volume.init(card);
uint32_t block_count = volume.blocksPerCluster() * volume.clusterCount();
usb_msc.setCapacity(block_count, 512);
usb_msc.setUnitReady(true);
}
void loop() {
// サーボモーターを制御するコード
}
int32_t msc_read_cb(uint32_t lba, void* buffer, uint32_t bufsize) {
(void)bufsize;
return card.readBlock(lba, (uint8_t*)buffer) ? 512 : -1;
}
int32_t msc_write_cb(uint32_t lba, uint8_t* buffer, uint32_t bufsize) {
(void)bufsize;
return card.writeBlock(lba, buffer) ? 512 : -1;
}
void msc_flush_cb(void) {
// nothing to do
}
Adafruit_TinyUSBライブラリを使用し、USBメモリーとして認識さえすれば、 後はマイコン内でSDライブラリを使用してファイル数や容量をチェックし、サーボモーターの動きと連動させるだけで完成です。
UXやデザインを考える
マイコンをUSBメモリーとして実装するのには苦労しましたが、それ以上にデザインにも苦労しました。このUSBメモリーのデザインコンセプトは「データを食べてお腹いっぱいになる」です。どうすれば、そのコンセプトをユーザーにイメージしてもらえるでしょうか?
まず、USBコネクターの形状をデザインにうまく利用できないかと考えました。USBメモリーはPCからデータをもらうので、USBコネクターを口として扱うのはどうでしょう。そこでくちばし形状を連想し、鳥類の動物をベースに決めました。
どんな鳥が良いでしょうか?
次に、お腹が膨らむ機構との親和性です。動くお腹はどうしても別パーツに分離せざるを得ないため、うまくデザインしないと一体感が損なわれそうです。また、逆になじみ過ぎて膨らむ箇所に注目してもらえないと、このUSBメモリーの特徴を理解しにくくなります。
悩んでいても仕方ありません。この際、現地調査だと意気込み、この目で鳥類を観察しに動物園に行くことにしました。腹部の特徴を意識しつつ、いろんな鳥を観察していると、ペンギンは体の他の部分とお腹の色が異なっていることに気づきました。「これだ!」と思い、最終的にペンギン型のデザインに決めました。
動物園でいろんな鳥を見てきました。
丸っこい見た目は、お腹が膨らむ様子をイメージをしやすい。
ものづくりのインスピレーションを得るには、頭で考えるだけでなく、直接観察してみることがとても大切ですね。
生活にちょっとした利便性とかわいさを
このような工夫により、ペンギン型USBメモリーは見た目だけでだいたいの容量が分かるようになりました。欲を言えば、もっと細かく容量が分かると、さらに便利になることでしょう。お腹に目盛りを付けるのもありかもしれません。
腹八分目とか書くと面白いかもしれませんね。
利便性はもちろんのこと、かわいい見た目が思った以上に心を和ませてくれます。デスクにも彩りが出てきました。どんどん使ってお腹いっぱいにしてあげたいという気持ちがある一方で、あまりデータでお腹パンパンだとかわいそうにも感じますね。
かわいいは正義。
もっとカラーや容量のバリエーションを増やして、便利でかわいいUSBメモリーだらけにしたいものです。
