電子楽器を自分で作れる「Ototo」

October 30, 2015

Ototoは、野菜や飲み物・金属の食器などを繋いで、電子楽器を簡単に作ることができるデバイスです。
http://www.ototo.fm

image-1760

入手方法

こちらの公式通販ショップから購入できます。注文してから1週間くらいで届きました。
>>オンラインショップ

オープンセサミ

外箱を開けるとこんな可愛らしい箱が。わくわくしてきます。

image-1759
image-1758
image-1757
image-1756

中身は、本体ボード1つ・ワニ口クリップたくさん・説明書1冊。

使ってみる

説明書をめくると、最初の使い方が書いてあります。単三電池2個をボードにセットし、右側の電源スイッチをON(目のアイコンがパチッと開いている方)にします。ボード手前のセンサー部分を触ると、中央のスピーカーから音が鳴ります。じゃじゃーん!

image-1755
image-1754

次に付属のワニ口クリップを使って、センサーと電気を通す物(しめじなど)を繋ぎます。スピーカー横の2つのボタンを同時押しすると、リセットがかかってチューニングされます。繋いだ物を触ると音が鳴ります。鳴らない場合は、電池を交換するかUSBケーブルを繋いでみてください。

こんな感じで、食べ物や液体、金属の食器など電気を通す物を鍵盤として使うことができました。簡単で楽しいです。

>>Processing.org

ProcessingでMidiを使うには、「MidiBus」というライブラリを使います。

Processingのメニューから、スケッチ - ライブラリのインポート - ライブラリの追加 を選択します。ライブラリ導入のウィンドウが開くので、検索窓に「midi」と入れると、「the MidiBus」という項目が表示されます。これを選択して右下のInstallボタンを押すと、ダウンロード・インストールが実行されます。

image-1753

使い方で注意するところは、MidiBusオブジェクトを実体化する時に、入出力のMIDI機器を名前で指定する必要があります。Ototoの場合は"Unknown name"と指定します。他のデバイスと重複した場合にどうなるかは不明。今回は出力機器を使わないので、3つ目のパラメータは-1としています。

noteOn()で押された瞬間、noteOff()で離された瞬間を取得できます。パラメータとして渡される「pitch」で押された鍵盤を判断しています。

import themidibus.*; //Import the libraryMidiBus myBus; // The MidiBusfloat spring = 0.05;float gravity = 0.1;float friction = -0.9;int id = 0;ArrayList balls = new ArrayList();void setup() {  //fullScreen();  size(displayWidth, displayHeight );  noStroke();  MidiBus.list();    myBus = new MidiBus(this, "Unknown name", -1 ); //ototo is "Unknown name"}void draw() {  background(0);  int numBalls = balls.size();  for (int i = 0; i < numBalls; i++) {    balls.get(i).collide();    balls.get(i).move();    balls.get(i).display();  }}void addBall(float _x, float _y, color _color) {  Ball b = new Ball( _x, _y, random(100, 200), 0, balls, _color );  balls.add( b );}// MIDI Event --------------------------------------void noteOn(int channel, int pitch, int velocity) {  // Receive a noteOn  println();  println("Note On:");  println("--------");  println("Channel:"+channel);  println("Pitch:"+pitch);  println("Velocity:"+velocity);  switch( pitch ) {  case 61 :    addBall( random(width), 0, color( 127, 127, 127 ) );    break;  case 63 :    addBall( random(width), 0, color( 255, 255, 0 ));    break;  case 66 :    addBall( random(width), 0, color(  255, 127, 0 ));    break;  case 68 :    addBall( random(width), 0, color(  255, 255, 255 ));    break;  case 70 :    addBall( random(width), 0, color(  0, 255, 0 ));    break;  }}void noteOff(int channel, int pitch, int velocity) {  // Receive a noteOff  println();  println("Note Off:");  println("--------");  println("Channel:"+channel);  println("Pitch:"+pitch);  println("Velocity:"+velocity);}void controllerChange(int channel, int number, int value) {  // Receive a controllerChange  println();  println("Controller Change:");  println("--------");  println("Channel:"+channel);  println("Number:"+number);  println("Value:"+value);}class Ball {  float x, y;  float diameter;  float vx = 0;  float vy = 0;  int id;  ArrayList others;  color ballColor;  Ball(float xin, float yin, float din, int idin, ArrayList oin, color _color ) {    x = xin;    y = yin;    diameter = din;    id = idin;    others = oin;    ballColor = _color;    id++;  }   void collide() {    int numBalls = balls.size();    for (int i = id + 1; i < numBalls; i++) {      float dx = others.get(i).x - x;      float dy = others.get(i).y - y;      float distance = sqrt(dx*dx + dy*dy);      float minDist = others.get(i).diameter/2 + diameter/2;      if (distance < minDist) {         float angle = atan2(dy, dx);        float targetX = x + cos(angle) * minDist;        float targetY = y + sin(angle) * minDist;        float ax = (targetX - others.get(i).x) * spring;        float ay = (targetY - others.get(i).y) * spring;        vx -= ax;        vy -= ay;        others.get(i).vx += ax;        others.get(i).vy += ay;      }    }  }  void move() {    vy += gravity;    x += vx;    y += vy;    if (x + diameter/2 > width) {      x = width - diameter/2;      vx *= friction;    } else if (x - diameter/2 < 0) {      x = diameter/2;      vx *= friction;    }    if (y + diameter/2 > height) {      y = height - diameter/2;      vy *= friction;    } else if (y - diameter/2 < 0) {
      y = diameter/2;
      vy *= friction;
    }
  }

  void display() {
    fill( ballColor );
    ellipse(x, y, diameter, diameter);
  }
}

こどもパソコン「IchigoJam」

July 25, 2015

IchigoJamは、テレビに繋いでプログラムを書ける小さなコンピュータです。

http://ichigojam.net/

USB-Microの5V電源、AVビデオ出力、PS/2キーボードを繋げば、すぐにBASIC言語でプログラムを始める事ができます。かつてベーマガを愛読し、友達と5インチフロッピーで自作ゲームを交換したパソコン少年のみなさん、この夏休み子供と一緒にプログラム始めませんか?


必要なもの

・IchigoJam本体 キット / 組み立て済み
・PS/2キーボード
・ビデオケーブル
・USB-Microケーブル

組み立て

キットを半田付けして組み立てます。左上から、ハンダ、ハンダゴテとコテ台、ニッパー、ペンチ、ハンダ吸い取り器。

ハンダ付けのテクニックはこちらのスライドを参考にしてみてください。
>> SFC デザイン言語WS(電子工作)第9回「ハンダ付け実習」


ハンダ付けする順番は、背の低いパーツから始めます。

R1とかCN1というのは、基盤に白く印刷されている部品の場所に対応しています。

[1] R1〜R4 抵抗

[2] IC2 マイコン(のソケット)

[3] CN1 ピンヘッダ

[4] CN1 マイクロUSB端子

[5] C1,C2 コンデンサ

[6] IC1 3端子レギュレータ

[7] LED1 赤色LED

[8] SW1 スライドスイッチ

[9] SW2 タクトスイッチ

[10] CN3,CN4 ピンソケット

[11] CN2 PS/2端子

[12] ビデオ端子


[1] 抵抗

抵抗の足を曲げる時はペンチを使って、本体から1mmくらいの場所で直角に曲げます。


[3, 4] USBマイクロコネクタとピンヘッダ
ピンヘッダをニッパーで切って、5ピン、1ピン、1ピンに分けます。


説明書と違う順番でやってしまいました。説明書の通り、基盤にピンヘッダを挿して、コネクタをハンダ付けしたほうがやりやすそうです。


[6] 3端子レギュレータ
穴に合わせてピンをグイッと広げなければいけません。


[11] PS/2端子
穴が大きいのでハンダをたくさん流し込みます。


最後にマイコンをソケットに差し込みます。マイコンのピンが外側に開いていてソケットに入りずらい場合は、 平らな面を使ってピンを内側に曲げます。


接続

IchigoJamを動作させるために必要な機器。


IchigoJamを中心に3つの方向へ接続。


最初のプログラム

テレビを外部入力のビデオに設定しておきます。本体のスライドスイッチを左へ動かすと電源が入り、ファームウェアのバージョンが表示されます。続いてOKと表示されたら、プログラムの入力を受け付ける状態です。ためしに「LED 1」と入力しエンターキーを押すと、IchigoJamに取り付けた赤LEDが点灯します。


付属のスピーカーを本体につなぐと、プログラムから音を鳴らすこともできます。「※」が画面端で跳ね返る時にビープ音が鳴っています。


まとめ

自分は小学校4年生の時に、中学校の文化祭でパソコン部の展示でBASICで作られたゲームを見て、コンピュータプログラムを自分で作れるという事を知りました。でも中学生になるまで自分のコンピュータは買ってもらえず、早く自分でプログラムしてみたいと思う日々でした。だから、IchigoJamのような製品が当時あったらなぁって思います。

IchigoJamは「こどもパソコン」とは言うものの、ScratchのようなグラフィカルなGUIはなく、普通のプログラムを書けます。最初のステップは概念の理解のために柔らかい表現を使ってもいいと思いますが、次のコードを書くトレーニングにはとてもいい道具だと思いました。

デザイン言語WS(電子工作)

July 21, 2015
SFC デザイン言語WS(電子工作)で使用した資料をまとめました。

電子工作初心者がArduinoを使って、一つの作品を作る事を目標とした授業です。
電子部品や回路の使い方から、アイデアの出し方、造形の手法などについても紹介しています。



センサー情報をdata.sparkfunに保存する

July 6, 2015

data.sparkfun.com は、電子デバイスを販売しているSparkFunが提供するクラウドストレージです。今回はそこにArduinoで集めたセンサーの情報を上げて、グラフ表示するデモを作ります。



IFTTTとArduinoで作る侵入アラーム [3]IFTTTへリクエストを送る

June 30, 2015
IFTTT と Arduinoを繋いで、「扉が開いたらブザーが鳴り、Twitterに写真付きツイートをする」というデモを作ります。

今回は Arduino から IFTTT へリクエストを送り、レシピを動作させます。

IFTTTとArduinoで作る侵入アラーム [2]Arduino の準備

IFTTT と Arduinoを繋いで、「扉が開いたらブザーが鳴り、Twitterに写真付きツイートをする」というデモを作ります。

今回は SparkFun製のWifiシールドを使って、Arduino をネットにつなぎます。

IFTTTとArduinoで作る侵入アラーム [1]IFTTTのレシピを作る

June 27, 2015


IFTTTは、TwitterやInstagramなど色々なWebサービスを連携できるWebサービスです。

そのIFTTTに、Arduino などから簡単にアクセスできる機能が追加されました。HTTP get でセンサーのデータなどを送ることができます。

今回は「Arduinoにつないだ距離センサーの値が一定以上になったら、Twitterに写真付きツイートをする」というデモを作ります。


こちらのエントリーを参考にさせていただきました。(というかほぼそのまま)
SWITCH SCIENCE MAGAZINE IFTTTにMaker Channelができました

CNCフライス盤KitMill RD300を購入

April 13, 2015

CNCフライス盤KitMill RD300を購入ました。

検討から組み立て、試運転までを書き留めておきます。


CNCフライス盤とは、回転する刃(エンドミル)がXYZの方向に動く装置(フライス盤)をコンピュータから制御する(CNC)機械です。3Dプリンタとは逆に、材料を削って立体物を作ります。

これまで、Roland MODELA MDX-40Aという機種を使わせてもらっていたのですが、自宅に作業スペースを確保したので購入する事にしました。

■用途

自分の主な使い道は、木製おもちゃの制作と電子回路の基盤製作、金属板の加工などなので、条件としては以下の通り。

・切削範囲は、幅200mm, 奥行き300mm, 高さ50mm以上。

・金属の切削ができる

・精度はそこそこでOK

加えて、その道のプロに購入を相談したところ、以下の要素を検討したほうがいいとのアドバイスをいただきました。

・回転を直線運動にする機構にボールネジを使っている事

・エンドミルを固定する器具が、セットスクリューではなくコレットチャック

・エンドミルを回すスピンドルの回転速度を変えられる事

■機種の検討
KitMill SR200

350mm(W) × 200mm(D) x 29.4mm(H)

268,000円

オリジナルマインドのスタンダードモデル。コストパフォーマンスの良さがウリ。

切削面積は十分ながら厚みがやや足りなく、泣く泣く断念。

KitMill RD300

220mm(W) × 300mm(D) x 52mm(H)

328,000円

オリジナルマインドのハイエンドモデル。切削面積は希望通り。

想定よりも価格が高い・・・。

卓上CNCフライス盤 『黒い奴』

250mm(W) x 400mm(D) x 65mm(H)

288,000円

切削範囲が広い、全軸ボールネジ、スピンドルの回転数可変、コレットチャック。しかも価格が安い、とパーフェクトな内容ながら、現在は受注していないとの事。

Sable-2015

250mm(W) x 310mm(D) x 60mm(H)

99,800円

とにかく安い。精度を気にしないのなら、これでもありか・・・?

木製おもちゃの制作だけを考えると、Sable-2015でも十分だと思ったのですが、基盤の製作や、今後の拡張性を考えて、KitMill RD300に決めました。

■購入

RD300本体の他に以下のオプションを購入。

・ボールねじオプション

・原点センサー

・速度調節プーリー

・CAMソフトウェアMeshCam

・エンドミル4本セット

・ボールミル3本セット

発注から2日程度で到着。

■組み立て

宅急便で4箱に分けて送られてきました。土台の箱はとても重く、「腰を痛めないように注意」と書いてありました。

土台の裏側に貼られたシールにシリアルナンバーが書いてあり、Webサイトに入力すると、説明書を見ることができます。

うっかり写真をツイートしたら、削除するように連絡が来ました。

部品はかなり多いので、最初に確認が必要です。

まず、Z軸のベースを組み立てます。

なんて、最初は写真を撮っていたのですが、面倒になって撮るのを止めました。こちらが、できあがったものになります。

説明書は写真付きで詳細に書かれているので分からなくなる事はなかったのですが、手順が多く完成まで3日ほどかかりました。

いよいよ試運転。ゆっくりと台座が動いています。



・・・?そんな構造だったっけ?

思い直して確認してみたら、下に敷いたダンボールが沈み込んで、Y軸が接地していたために台座が動いているようでした。あぶないあぶない。今度はちゃんとY軸が移動していますね。これでひとまず組み立ては完了です。


と思ったら、なぜか部品がこんなに余ってる・・・。大丈夫かな。


次回はCADデータから切削ルートのデータを作り、テスト切削してみます。

CNC関係の記事

CNCフライス盤KitMill RD300を購入

KitMill RD300 の切削テスト

KitMill RD300 で両面切削

8pino hello world

February 19, 2015
8pinoというTrinket/Arduino互換のマイコンボードを買ってみました。

8pinoの特徴は何と言ってもその小ささ!
23.5mm x 8mm というサイズで、回路が無い部分をカットすれば、小指の爪ほどになります。



公式サイト http://8pino.strikingly.com/
販売 https://www.switch-science.com/catalog/2108/