ちはやふる日記


光るテント『TENTO(テントウ)』 技術詳細

2017年11月19日 12:51更新

諏訪郡富士見町の森のオフィスで開催された「月夜の下のハッカソン」

このときチームのみなさん5人で開発した光るテント『TENTO(テントウ)』の技術的詳細を忘れてしまう前に備忘録として残しておきます。

わたしたちのチームでは、似たような色や形のテントが、何十張り、何百張りと立ち並ぶ人気のテント場で自分のテントに迷わず帰りつけるように、車のキーリモコンのように遠くから自分のテントを光らせる機能を実現する方法を考えました。またSNSで繋がる人たちからいいね!を貰ってテントのイルミネーションに反映させるという応援機能も考えました。

ブロック図

ブロック図

システムのブロック図。スマートフォンからBLE(Bluetooth Low Enegy)通信でテントに取り付けたLEDと通信します。スマートフォンのMESHアプリへはMESHのボタンタグやIFTTT経由でSNSから通知を送ります。これによりマッチ箱サイズのボタンタグを押して十数メートル先にあるテントのLEDを点灯させたり、インターネットで繋がったSNSサービスから応援を受け取ります。



回路図

回路図

テントに取り付けるLED制御モジュールの回路図です。BLE(Bluetooth Low Enegy)の受信はMESHのGPIO(General Purpose Input / Output)タグで行います。一方、テープLEDは約2mのテープに300個のフルカラーLEDが貼り付けられています。そして300個のLEDには各々マイコンが組み込まれており、SPI(Serial Port Interface)を介して送るコマンドで個々に明滅や色を変えることができます。そしてBLE受信部であるMESH GPIOタグとテープLEDのマイコンを繋いでシステム全体の制御をするのがARMマイコンを搭載したマイコンボードmbedになっています。mbedはC++を拡張した独自言語でプログラミングします。



MESHレシピ

MESHレシピ

MESHアプリで作成したボタンタグとGPIOタグを連携させるプログラムです。C言語やJavaのようなキャラクターベースではなく、アイコンを並べてプログラムを作成するようになっています。ボタンタグのボタンを押したり離したりするたびに、GPIOタグをトグル動作させるために、両者の間にスイッチを挟んでいます。



mbed C++ソースコード

 #include "mbed.h"
 
 #define LED_NUM 300
 #define LED_GLOBAL 31
 #define LED_FREQ 500000
 
 SPI spi(p5, p6, p7);
 DigitalIn din20(p20);
 
 int led_buf[LED_NUM];
 
 void sendData ()
 {
     int i;
     // START frame
     for (i = 0; i < 4; i ++) {
         spi.write(0);
     }
     // LED frame
     for (i = 0; i < LED_NUM; i ++) {
         spi.write((7<<5) | LED_GLOBAL);
         spi.write((led_buf[i] >> 16) & 0xff); // Blue
         spi.write((led_buf[i] >> 8) & 0xff);  // Green
         spi.write(led_buf[i] & 0xff);         // Red
     }
     // END frame
     for (i = 0; i < 4; i ++) {
         spi.write(1);
     }
 }
 
 int main()
 {
     int led_no;
     int level = 0;
     unsigned int red = 0x00;
     unsigned int green = 0xFF;
     unsigned int blue = 0x00;
 
     spi.frequency(LED_FREQ);
 
     while (1) {
         for (led_no = 0; led_no < LED_NUM; led_no ++) {
             if (led_no <= level) {
                 led_buf[led_no] = (blue << 16) | (green << 8) | (red);
             } else {
                 led_buf[led_no] = 0x00;
             }
         }
         sendData();
         while (1) { if (din20)  break; }
         wait(0.02);
         while (1) { if (!din20)  break; }
         wait(0.02);
         level+=10;
     }
 }

上記はmbedに書き込んだプログラムです。

Digital IN でボタンを 押した(1) / 離した(0) という情報を受け取って、点灯するLEDの数を10個ずつ増やしています。

フルカラーLEDだったので、もっと色を変えて、キラキラとアニメーションをするプログラムでデモをすればよかったと後から後悔しましたが、とりあえずシンプルにI/Oの値の変化を読み取り、300個のLEDのOn/Off制御をデモするプログラムになっています。


デモ動画




リンク

mbed
SONY MESH
Adafruit DotStar LEDs
Geeklog


編集

連絡先 (E-Mail)

mail address