蔵本モデルをLEDとマイコンを使って可視化するものを作りました。 基板をつなげるとLEDの発光パターンが同期していきます。 MFT2017で展示します。

概要

簡単な動作の説明入りの動画を作ったので、まずはこちらをご覧ください。

基板をつなげるとLEDの発光パターンが同期していくものを作ったというわけです。

基板一つはこんな感じです。

スモークアクリルを取るとこうなっています。

中心にはマイコン(PIC18F25K40)があり、LEDを制御しています。 裏面には電池ボックスがあり、単三電池一本で駆動可能です。

基板を接続している状態ではこんな感じです。

基板の四方にはコネクタがあり、これを通して周囲の基板と通信をしています。

同期現象

今回のテーマになっている同期現象についてですが、有名なものだとメトロノームやろうそくの炎の例があります。

64個のメトロノームの振動の同期

ろうそくの炎の振動の同期

非線形なダイナミクスを持つ複数のものが相互作用をする構造になっていると、 このように同期して振動することがあります。

蔵本モデル

蔵本モデルとは、同期現象が起こりうる非線形振動子の振る舞いを記述する数理モデルの一つです。 具体的な式は次のようなものです。

はある振動子の状態、は振動子がもつ振動子固有の角振動数(定数)、 は振動子に隣接する振動子のインデックス、は振動子の個数、は結合係数です。 振動子固有の角振動数のバラツキ具合、振動子の数、結合係数によって同期をしたり、しなかったりします。

サークルの尊敬する先輩が作った蔵本モデルのシミュレータがあるので、 そちらも見てみてください。これはブラウザで動作するシミュレータで、パラメータの変化による振る舞いの変化をみて遊べます。

Kuramoto-Model Simulator

本当の蔵本モデルはすべての振動子がすべての振動子と繋がる(グラフ理論でいうところの完全グラフ)必要があるのですが、 今回製作したKURAMOTOは隣としかつながっていません。 なので厳密には蔵本モデルではありませんが、許してください。

個人的に面白いと思う点は、各振動子は隣接する振動子の情報しか得られないのに全体が同期をするという点です。 リーダーがいて全員がそれに合わせたり、インターネットのパケットのように他のノードを経由してバケツリレー的に情報を全体に伝えているわけでもありません。 振動子は隣接する振動子だけを見て、周りに動きを合わせようとしているだけなのです。

今回は蔵本モデルにおける振動子一つを基板一枚だとして実装しました。 各振動子の状態をLEDで表示しています。

実装

構成

周囲の基板との通信は、マイコンのADCとDACを使って実現しています。 自身の状態をDACを使ってアナログ値を出力し、隣の基板はそのアナログ値をADCで読み取ります。

処理のフローは以下の通りです。

  1. 周囲の状態をADCによって取得する
  2. 先の式にしたがって自分の状態を更新する
  3. をLEDに表示する
  4. をDACから出力する

回路

基板設計はKiCadで行いました。回路図はこんな感じです。

LEDは赤緑2色入りのLEDを使っていて、LEDの上流も下流もマイコンのIOピンを使っています。 マイコンのIOピンは吐き出し吸い込みともに50mAまで大丈夫なので、この回路構成を用いることで外付けのトランジスタなどを省くことができます。 LEDは同時に一つしか点灯させないので、電流制限の抵抗も一つしか使っていません。

地味な機能ですが、リセットピンにリードスイッチをつけることで、基板に磁石をかざすだけでリセットを掛けられます。 展示をしているときに、簡単に同期を崩すためにこういう機構をつけてみました。

基板のアートワークは以下の通りです。

LEDを円形に並べているのですが、これはKiCadのPythonのスクリプトを書いて部品を並べました。 以前製作した円形や格子状に部品を並べるKiCadのPythonのスクリプトは以下の記事で紹介されています。

ロ技研ブログ:KiCadのPython scripting機能を使ってみる

おわりに

このKURAMOTOはMakerFaireTokyo2017において、ロボット技術研究会のブースで展示をします。 ぜひお立ち寄りください。

ロ技研ブログ:MakerFaireTokyo2017に出展します