2014年7月27日日曜日

「作る」の未来

本日、浜松の鴨江アートセンターで開催されたドキュメンタリー「Maker」の上映会に行ってきました。
上映時間は1時間ほど。70人くらいは集まっていたのではないでしょうか。
今日はFablab浜松の立ち上げということもあり、会場全体いい感じに盛り上がっていたと思います。


このドキュメンタリーでは、人はそもそも一人一人が何かを作ることが好きなはずで、3Dプリンタなどの技術のおかげで、昔のように再び個々人が自分の好きなものを作るような時代になるはずだ、ということを主張しています。
企業によって工場での大規模な製造でモノが作られるようになったのはせいぜいここ数十年のこと。人々が単調な工場労働で大量に同じものを作る時代をやや揶揄しながら、最近のMakers Movementに対して「作る」ことが民主化され始めている、という表現をしています。

「民主化」というと、日本では政治的な意味をすぐに思い浮かべますが、英語ではもうちょっとニュアンスが違うのでしょう。
特定の人たちしか出来なかったことが、誰でも出来るように解放されることが、このドキュメンタリーの中で語られる「民主化」の意味なのだと思います。
そして私にとって、このドキュメンタリーで最も重要なキーワードは「民主化」だと感じたのです。


ここで登場した「作る」人たちは本当に生き生きとしています。
ザリガニのオーケストラとか何だか意味不明だけど、バカバカしくて面白い。そういった思いつきでいろいろ作ってしまおうという熱気は、企業の商品開発計画では絶対に作り出せないものです。
そういう意味で、Makers Movementが徹底的に個人の楽しみであるということが、とても重要だと思うのです。さらに「作る」ことがナンセンス化してくることによって、アートにますます近づいていくようにも思えます。

何回か書いていますが、私たちは最後には一人一人が独立したアーティストであるべきなのです。
「作る」の民主化は、人々が自由に何かを作れるようになるという可能性の未来ということだけでなく、一人一人がアーティストとしての矜持を持った個人であらねばならないという厳しい現実を突き付けるかもしれません。

あるいは、もしかしたら「作る」人たちは、実際の人間のごく一部であり、本当に何かを作りたい個人が「作る」人として活躍できるような未来になるのかもしれません。
いくら誰でも作れる未来になっても、本当に作ろうと思う人たちは一握りであるとするなら、Makers Movementはもっと社会的な効率性とか役割分担とかそういう議論とシンクロしていく必要があるでしょう。

実際には私も、誰もが作りたい人、ではないかもしれないと思っています。
それでも、作りたいけれど才能が無いから諦めている、という人たちは作りたい人予備軍であり、作りたい人は意外と多いのかもしれない、という全く別の可能性もあります。


まだまだ、Makers Movementの結末は誰にも分かりません。
それでも彼の地アメリカでは、多くの作る人が頑張っています。この映画でそれを垣間みて、未来がまた楽しみになってきました。




wa

2014年7月20日日曜日

加速度センサに挑戦

またまた電子工作ネタです。

ただいま試作中の電子吹奏楽器"Magic Flute"に加速度センサを取り付けました。
加速度センサは回路的にはI2Cバスにただ繋ぐだけ。あとは、Raspberry Pi上で動くプログラムからこのセンサにアクセスすれば、加速度情報が得られます。

下の写真が今回の試作品の回路に組み込んだ加速度センサです。





ところで加速度センサとは一体何を検出するものでしょうか。
もちろん加速度センサでは加速度が検出できるわけですが、日々の生活で加速度といって思いつくことは少ないかもしれません。
せいぜい思いつくのは自動車の急発進検出くらいでしょうか。ちょっと非日常となると自動車で事故った瞬間にも大きな加速度が検出出来ますね。

ところで一般相対性理論によると重力は加速度と等価です。つまり加速時センサはそのまま、重力センサとなるのです。3つの次元にこのセンサを配置すれば、物体の傾きが計測できます。
また、重力がない状態、つまり自由落下状態であることも検知できます。

実際、加速度センサのマニュアルを読むと、X軸、Y軸、Z軸の加速度(重力方向との角度)を検出出来るだけでなく、センサがパルス上の加速度を検出し、シングルタップ、ダブルタップとして検出するとか、非常に大きな加速度が検出された場合の設定とか、自由落下状態の検出などが機能として入っています。
自由落下というと人工衛星の落下くらいしか想像できないと思いますが、もっと短時間なら普通にモノを落としたときも自由落下状態になります。例えば、ハードディスクを衝撃から守るためにこの加速度センサの自由落下検出が使われているようです。


さて、MagicFluteでは、このセンサを傾き検出に使います。
今のところ、傾きでビブラートの深さを変化させようと考えています。笛を吹いているとき、笛の角度が水平になっているとほぼノンビブラート、笛をほとんど垂直にするとビブラートが一番深くなります。
このような吹き方が演奏者にとって感覚的に合うものかは、実際にプログラムを作って試奏してから検討しようと思っています。

今回もRaspberry Piでこの加速度センサADXL345を使うときの、デバイスをアクセスする部分のプログラムを紹介しましょう。
正直、プログラムを使ってもらうように披露するというより、間違っている部分を指摘してもらうつもりでプログラムは公開しております。
内容は全く保証しないので、ご承知おき願います。



//-------------------------------------------------------------------------
//   ADXL345 (Acceleration Sencer : I2c Device)
//-------------------------------------------------------------------------
// for Acceleration Sencer
#define ACCEL_SNCR_PWR_CTRL   0x2d
#define ACCEL_SNCR_DATA_FORMAT  0x31
//-------------------------------------------------------------------------
void accessADXL345( void )
{
 int  address = ACCEL_SENSOR_ADDRESS;  // I2C
 
 // Set Address
 if (ioctl(i2cDscript, I2CSLAVE_, address) < 0){
  printf("Unable to get bus access to talk to slave(ACCEL)\n");
  exit(1);
 }
}
//-------------------------------------------------------------------------
void initADXL345( void )
{
 // Start Access
 accessADXL345();
 writeI2c(ACCEL_SNCR_PWR_CTRL,0x08);   // Start Measurement
 writeI2c(ACCEL_SNCR_DATA_FORMAT,0x04);  // Left Justified
}
//-------------------------------------------------------------------------
void getAccel( signed short* value )
{
 unsigned short tmp;
 
 accessADXL345();
 tmp = readI2c(0x32);
 tmp |= readI2c(0x33) << 8;
 *value = (signed short)tmp;

 tmp = readI2c(0x34);
 tmp |= readI2c(0x35) << 8;
 *(value+1) = (signed short)tmp;

 tmp = readI2c(0x36);
 tmp |= readI2c(0x37) << 8;
 *(value+2) = (signed short)tmp;
}

2014年7月13日日曜日

日本人という遺伝子

最近社会が劣化しているとしか思えないような事件がたくさん起きています。(佐村河内、小保方、ヤジ議員そして号泣議員・・・などなど)
そこには何かを起こすアヤしい人の存在があるのですが、そのアヤしい人をうまく扱えないばかりか、そういう人に翻弄されている組織という構図も垣間見えます。何しろ、問題なのはそのような事件に際し、組織の幹部の人たちが事件を適切に処理できないことです。
今回はやや抽象的なテーマですが、昨今の社会の劣化と、日本人が本来もっている遺伝子とどういう関係があるのだろうか、と自分なりに考えてみたいと思います。


日本は何千年という間、海に守られ、国そのものが存亡の危機に瀕することがほとんどありませんでした。
多くの人が指摘するところですが、このような環境において、純粋な実力主義よりも形式や権威を重んじ、上下関係をはっきりさせる独自の文化が形成されたものと思われます。

このような集団の場合、トップに大変決断力があり、強引豪快な力を持っていると、その力は人数以上に倍加され、集団が大変なパワーを発揮します。
ところが、外部環境が安穏としてくると、過激な改革者よりも実務者がトップに立つようになり、ロジックで人が動かない分だけ、むしろ組織のパフォーマンスは大きく下がるような気がするのです。

勝手な推論ですが、日本の軍隊は日清日露戦争時代、まさに列強に追いつけ追い越せというスローガンの元、明治維新を生き抜いた豪快なリーダーに率いられ、すごい力を発揮したのではないかと思います。
ところが、それから40年経つ頃には、日本の軍部はそのような実力者ではなく、実務者や実力のない強弁家に侵されていきます。以前こんな本を読みましたが、太平洋戦争では単に物資の力の差だけではなく、日本軍の組織力自体がだいぶ弱っていたように見受けられます。
それは今、日本の企業を覆う閉塞感にとても似ているのです。

本当に日本人は本質論より感情的で感覚的なその場の議論が好きなように見えます。あるいは、本質論を話し合うべき場所に、そういう人材が揃っていないように見えます。
私の思うに、日本以外の先進諸国は絶えず戦争と戦乱に明け暮れていたため、組織や民族全体の遺伝子が、本質論を語るべき場にそれを語るにふさわしい人が集まるような仕組みを作り上げているような気がします。
日本では数千年の間、そのような必要がなかったため、組織を常にそのような状態にもっていく仕組みがとても弱いのです。

私は日本人の「本質論」嫌いには本当に閉口するのですが、それが民族の構成員に刻まれている遺伝子だとすると、仕方がないとあきらめるほかはありません。
そう考えると、明治維新のときのように、そして戦後の復興のときのように、新しく日本をゼロから作り直すような機会が訪れ、そこに実力者が強引に人々を引っ張っていく、そういう社会が到来するのを待つしかないのかもしれません。


今後日本が、明治維新や太平洋戦争での敗戦のような大きな挫折を味わうのでしょうか。
私のような素人が思うには、それは国債暴落やそれに伴うハイパーインフレではないかとついつい考えてしまいます。
ハイパーインフレがおこれば、相対的に今お金を持っている高齢者が貧乏になり、お金で保っていた権威が消滅します。このようなときに始めて、年齢性別無関係に力のある人が世の中に出てくる可能性が見えてきます。

本当にそんなことが起こったら社会へのインパクトは相当に大きく、かなりの人々の人生を狂わせることになるのは確かでしょうが、それでもこの閉塞感をグレートリセットして、もう一度日本が再生するにはそれしか手がないのではないかと思ったりするわけです。

2014年7月5日土曜日

Adafruit 8×8 LEDをRaspberry Piで使ってみた

今回は完全に電子工作マニアブログと化しています。

Adafruitの8×8のLED Matrixを購入。I2Cでコントロールするデバイスです。
商品はこちら

この部品のI2Cのコマンドを叩くためのマニュアルを探したのですが、Arduino用のサンプルコードしか見つかりません。
そこで、そのコードを見ながら、自分のRaspberry Pi環境にかなり強引に移植してみました。内容は全然保証しません。もし変なところを見つけたら教えて下さい。

このコードで、LEDを使ってひらがなの「ま」という文字を出してみたのが以下の写真。



ということで、サンプルコードを以下に示します。
mainのプログラムから、initAda88() を呼んだ後、writeMark() を呼べばいろいろなパターンを書けます。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sched.h>
#include <errno.h>
#include <getopt.h>
#include <fcntl.h>

#include <linux/i2c-dev.h>

#include <sys/ioctl.h>
#include <unistd.h>
#include <math.h>

 #define  I2CSLAVE_ I2C_SLAVE

//-------------------------------------------------------------------------
//   Variables
//-------------------------------------------------------------------------
static int i2cDscript;       // file discripter

//-------------------------------------------------------------------------
//   Constants
//-------------------------------------------------------------------------
static unsigned char LED_ADA88_ADDRESS = 0x70;

//-------------------------------------------------------------------------
//   I2c Device Access Functions
//-------------------------------------------------------------------------
void initI2c( void )
{
    const char *fileName = "/dev/i2c-1"; // I2C Drive File name
 
 // Pressure Sensor
    printf("***** start i2c *****\n");
 
    // Open I2C port with Read/Write Attribute
    if ((i2cDscript = open(fileName, O_RDWR)) < 0){
        printf("Faild to open i2c port\n");
        exit(1);
    }
}

//-------------------------------------------------------------------------
//   Adafruit LED 8*8 matrix (I2c Device)
//-------------------------------------------------------------------------
#define HT16K33_BLINK_CMD 0x80
#define HT16K33_BLINK_DISPLAYON 0x01
#define HT16K33_BLINK_OFF 0
#define HT16K33_BLINK_2HZ  1
#define HT16K33_BLINK_1HZ  2
#define HT16K33_BLINK_HALFHZ  3
#define HT16K33_CMD_BRIGHTNESS 0xE0
#define MATRIX_MAX 8

//-------------------------------------------------------------------------
void accessAda88( void )
{
 int  address = LED_ADA88_ADDRESS;  // I2C
 
 // Set Address
 if (ioctl(i2cDscript, I2CSLAVE_, address) < 0){
  printf("Unable to get bus access to talk to slave(LED Matrix)\n");
  exit(1);
 }
}
//-------------------------------------------------------------------------
void writeAda88( unsigned char* bitPtn )
{
 unsigned char buf[MATRIX_MAX*2+1];
 int  i;
 
 buf[0] = 0;         // Commands for performing a ranging
 for ( i=0; i<MATRIX_MAX; i++ ){
  buf[i*2+1] = *(bitPtn+i);
  buf[i*2+2] = 0;
 }
 
 if ((write(i2cDscript, buf, MATRIX_MAX*2+1)) != MATRIX_MAX*2+1) { // Write commands to the i2c port
  printf("Error writing to i2c slave(LED)\n");
  exit(1);
 }
}
//-------------------------------------------------------------------------
void initAda88( void )
{
 unsigned char bitPtnClr[MATRIX_MAX] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
 unsigned char cmd;
 
 accessAda88();
 cmd = 0x21;
 if ((write(i2cDscript, &cmd, 1)) != 1) {   // Write commands to the i2c port
  printf("Error writing to i2c slave(LED)\n");
  exit(1);
 }

 cmd = HT16K33_BLINK_CMD|HT16K33_BLINK_DISPLAYON|(HT16K33_BLINK_OFF<<1);
 if ((write(i2cDscript, &cmd, 1)) != 1) {   // Write commands to the i2c port
  printf("Error writing to i2c slave(LED)\n");
  exit(1);
 }

 cmd = HT16K33_CMD_BRIGHTNESS | 0x0f;
 if ((write(i2cDscript, &cmd, 1)) != 1) {   // Write commands to the i2c port
  printf("Error writing to i2c slave(LED)\n");
  exit(1);
 }

 writeAda88(bitPtnClr);  // Clear All LEDs
}
//-------------------------------------------------------------------------
void writePattern( unsigned char* bitPtn )
{
 accessAda88();
 writeAda88(bitPtn);
}
//-------------------------------------------------------------------------
void writeMark( int type )
{
 unsigned char bitPtn[2][MATRIX_MAX] = {
  {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}, // nothing
  {0x04,0x1f,0x04,0x1f,0x04,0x0f,0x15,0x22} // MA
 };
 writePattern(bitPtn[type]);
}