ラベル physical computing の投稿を表示しています。 すべての投稿を表示
ラベル physical computing の投稿を表示しています。 すべての投稿を表示

2010-07-18

[Japanino] Japanino と Wii リモコンで、ネットワークランプ

久々にやる気が出たので、ネットワークランプを作ってみた。
ブレッドボードにプスプスやるのは学生のとき以来だなぁ。



ネットワークランプ自体の作り方は、「Arduinoをはじめよう」を参照してください。

変更点は、RGBの値の設定をフィード中のキーワードの数ではなく、Wiiリモコンから変更できるようにしたことです。

Processingを使って作成しました。ProcessingでWiiリモコンを接続するために使うライブラリ(wrj4P5)の使い方は、WiiリモコンとP5を参考にしました。

Arduino側のスケッチはほとんど変更していません。変更なしでもOKです。たまに青いLEDが光るので、それをなくしたかったのだけど、よくわからなかった。

ブレッドボード上の回路は本に載っているものそのままです。
こんな感じ。

Arduino (Japanino) network lamp
Arduino (Japanino) network lamp posted by (C)matty

動作の説明(Wiiリモコンの操作方法):
2ボタンを押すと、REDのLEDが明るくなる。
1ボタンを押すと、REDのLEDが暗くなる。
Rightボタンを押すと、3つのLEDの明るさを右にシフトする。
Leftボタンを押すと、3つのLEDの明るさを左にシフトする。
Homeボタンを押すと、すべての明るさを0にリセットする。

オリジナルのソースコードはココ Networked Lamp Example Code



Processingのソースを置いておきますのでやってみたい方はお試しください。


import processing.serial.*;
import lll.wrj4P5.*;

Wrj4P5 wii;

int interval = 10; // retrieve feed every 60 seconds;
int lastTime; // the last time we fetched the content

int LED_red = 0;
int LED_green = 0;
int LED_blue = 0;

int light = 0; // light level measured by the lamp

Serial port;
color c;
String cs;

String buffer = ""; // Accumulates characters coming from arduino

PFont font;

void setup() {
size(640,480);
frameRate(2); // we don't need fast updates

font = loadFont("HelveticaNeue-Bold-32.vlw");
fill(255);
textFont(font, 32);
// IMPORTANT NOTE:
// The first serial port retrieved by Serial.list()
// should be your arduino. If not, uncomment the next
// line by deleting the // before it, and re-run the
// sketch to see a list of serial ports. Then, change
// the 0 in between [ and ] to the number of the port
// that your arduino is connected to.
//println(Serial.list());
String arduinoPort = Serial.list()[0];
port = new Serial(this, arduinoPort, 9600); // connect to arduino

lastTime = 0;

// Wiiリモコンの設定
wii=new Wrj4P5(this);
wii.connect();
}

void buttonPressed(RimokonEvent evt, int rid) {
if (evt.wasPressed(RimokonEvent.TWO))
{
println("2");
LED_red += 16;
}
if (evt.wasPressed(RimokonEvent.ONE))
{
println("1");
LED_red -= 16;
}
if (evt.wasPressed(RimokonEvent.B)) println("B");
if (evt.wasPressed(RimokonEvent.A)) println("A");
if (evt.wasPressed(RimokonEvent.MINUS)) println("Minus");
if (evt.wasPressed(RimokonEvent.HOME))
{ // 値をリセット
println("Home");
LED_red = 0;
LED_green = 0;
LED_blue = 0;
}
if (evt.wasPressed(RimokonEvent.LEFT))
{
println("Left");

int tmp = LED_red;
LED_red = LED_green;
LED_green = LED_blue;
LED_blue = tmp;
}
if (evt.wasPressed(RimokonEvent.RIGHT))
{
println("Right");

int tmp = LED_blue;
LED_blue = LED_green;
LED_green = LED_red;
LED_red = tmp;
}
if (evt.wasPressed(RimokonEvent.DOWN)) println("Down");
if (evt.wasPressed(RimokonEvent.UP)) println("Up");
if (evt.wasPressed(RimokonEvent.PLUS)) println("Plus");
}

void draw() {
background( c );
int n = (interval - ((millis()-lastTime)/1000));

// Build a colour based on the 3 values
c = color(LED_red, LED_green, LED_blue);
cs = "#" + hex(c,6); // Prepare a string to be sent to arduino

text("Japanino Wii Remote Lamp", 10,40);

// Wiiリモコンとの接続が完了したら画面で知らせる
if(false != wii.rimokon.isConnected())
{
text("Wii Remote is connected !", 10, 100);
}

text("Next update in "+ n + " seconds",10,450);
// text("mac" ,10,200);
text("R " ,10,200);
text(" " + LED_red, 130, 200);
rect(200,172, LED_red, 28);

text("G ",10,240);
text(" " + LED_green, 130, 240);
rect(200,212, LED_green, 28);

text("B" ,10,280);
text(" " + LED_blue, 130, 280);
rect(200,252, LED_blue, 28);

// write the colour string to the screen
text("sending", 10, 340);
text(cs, 200,340);

text("light level", 10, 380);
rect(200, 352,light/10.23,28); // this turns 1023 into 100

if (n <= 0) {
lastTime = millis();
}

port.write(cs); // send data to arduino

if (port.available() > 0) { // check if there is data waiting
int inByte = port.read(); // read one byte
if (inByte != 10) { // if byte is not newline
buffer = buffer + char(inByte); // just add it to the buffer
}
else {

// newline reached, let's process the data
if (buffer.length() > 1) { // make sure there is enough data

// chop off the last character, it's a carriage return
// (a carriage return is the character at the end of a
// line of text)
buffer = buffer.substring(0,buffer.length() -1);

// turn the buffer from string into an integer number
light = int(buffer);

// clean the buffer for the next read cycle
buffer = "";

// We're likely falling behind in taking readings
// from arduino. So let's clear the backlog of
// incoming sensor readings so the next reading is
// up-to-date.
port.clear();
}
}
}

}

2010-05-30

[Japanino] 大人の科学で第1歩

大人の科学の付録で遊んでみました。
karaageさんのJapaninoでいろいろやってるのを見てやってみました。
■[動画][電波]大人の科学の付録8bitマイコン「Japanino」で小室さん復帰を祝ってPOVで「Get Wild」
さらに応用編まで。やるなぁ。後編の準備もしてたみたいなので期待大だな。
■[電波][動画]大人の科学の付録8bitマイコン「Japanino」とデジタル一眼レフを使って微速度撮影に挑戦してみよう(前編)

僕の方はこんな感じでした。
この付録はLEDが7個ついた棒があって、結構楽しめるかも。
小さなスピーカーもあって、音も出るみたい。
Arduinoのラジコン計画も1年以上放置してしまっていて、だめだなぁ。



今日はラスクをたくさん食べたので、
RUSK という文字列を表示してみました。
一人で撮影は難しくて変な方向からになってしまいました。
ソースコードはこんな感じです。
サンプルから、ビットマップ設定する箇所のの値を換えただけ。


// Japanino POV by Musashinodenpa

#define LEDPIN 7 // どのピンからLEDをつなぐか
#define SWPIN 6 // スイッチをつなぐピン

// ビットマップ(画像)を定義(ココでRUSKと設定。1の所が点灯します。
// 首を右に傾けてみると何となく見えるかも。)
byte bitmap[] = {
0b00000000,
0b01111111,
0b00001001,
0b00001001,
0b01110110,
0b00000000,
0b00000000,
0b00111111,
0b01000000,
0b00111111,
0b00000000,
0b00000000,
0b01000110,
0b01001001,
0b00110001,
0b00000000,
0b00000000,
0b01111111,
0b00001100,
0b01110011,
0b00000000,
0b10000000 // 最後の行は0b10000000(つまり目印)
};


unsigned char pos = 0; // 現在のビットマップ中の位置
unsigned char i = 0;


void setup() {
// LEDが接続されたピンを出力に設定します
for(char pin = LEDPIN; pin < LEDPIN + 7; pin++) {
pinMode(pin, OUTPUT);
}
pinMode(SWPIN, INPUT); // スイッチのピンを入力に
digitalWrite(SWPIN, HIGH); // 内蔵プルアップ有効
}

void loop() {

if(digitalRead(SWPIN) == LOW) { // スイッチがオンならば1回描画

delay(6); // すぐ始めると詰まって見えるのでちょっと待つ
pos = 0;

while(bitmap[++pos] != 0b10000000) { // ビットマップの端まで繰り返し
for(i = 0; i < 7; i++) { // ビットマップの高さの分だけ繰り返し
// ビットマップデータから1ビットを取り出してピンの状態に反映
digitalWrite(LEDPIN + 6 - i, (bitmap[pos] >> i) & 0b00000001);
}
delay(1); // LEDが光っている時間
}

for(i = LEDPIN; i < LEDPIN + 7; i++) { // 全ドット、消灯
digitalWrite(i, LOW);
}
}
}


結局今回も arudino IDE が起動せず。(フィジカルコンピューティング第1歩
root でログインして作業しました。どこかに設定ファイルがあるはずなんだけど、よくわからない。。

大人の科学マガジン Vol.27(8ビットマイコン)
大人の科学マガジン編集部
学習研究社 ( 2010-05-12 )
ISBN: 9784056058185
おすすめ度:アマゾンおすすめ度


ちなみに、動画は iPhone 3GS 標準のビデオで撮って、
dropbox にポイッと sync して、
mac miniで dropbox から再生確認して YouTube にアップロード。
そうすると、twitterfeed によって、ブログ更新が勝手につぶやかれる。
誰か見てくれるかどうかはわからないけど、簡単だなぁ。

2009-08-13

フィジカルコンピューティング第2歩

以下、フィジカルコンピューティング手前の内容です。

Wiiリモコンで動かすラジコンカーまでいくつかのステップに分けて実施しようと思います。

1. リモコンからの入力の取得
2. 車の制御
3. リモコンと車の通信(有線:PC仲介あり)
4. リモコンと車の通信(無線:PC仲介あり)
(できないかも:5. リモコンと車の通信(無線:PC無し))

[PC] 今回は1の途中まで。
Wiiリモコンの信号を受信できる部品があるのかよくわからなかったので、まずはJavaでリモコンの出力を可視化してみました。

使用したJavaのライブラリは以下です。
・WiiRemoteJ:
 参考記事:WiiリモコンからTwitterにPostしてみた
・bulecove:WiiRemoteJで使用するbluetooth関係のライブラリ。

とりあえず必要な入力は、以下の3つ。
操作方法はマリオカートに準ずる予定。ジャンプはなし。
・アクセル:2ボタン。
・ブレーキ(リバース):1ボタン。
・ハンドル:リモコンを横に持って時計回り、反時計回りに回転させる。



おっ、必要な信号は来てるっぽい。
加速度のグラフはサンプルそのものです。
車速的なものとアクセルブレーキの操作状態を表示する小さなウィンドウは自作しました。

Arduino は付属のケーブルでシリアル通信可能ということなので、Java ( on Mac ) でシリアル信号に変換してArduino で受信してやれば、有線での制御はできそうな気がする。

2に行くには、部品の手配が必要だなぁ。どうしましょう。
Wiiリモコン使うより加速度センサとボタンスイッチを買った方が早い気もするし。

2009-08-02

事前調査1

ざっと調べただけで、似たイメージのものを見つけてしまいました。
僕の場合は、マリオカートWii用のハンドルで操作するのが希望なので操作系が違う。

■ラジコン
とりあえずこれに似たものを作りたいと思います。
何が要るのだろうか。。
なんか難易度が高そうなので、Stepを踏んでいきたいと思います。



■走行ログ
GPSで受信した位置をSDカードなんかに残してみたら旅行の後とかおもしろいんじゃないかと思ったのですが、サーキットで加速度を取っているクールな動画を見つけてしまったのでおまけでリンク。みんな楽しそうだなぁ。

【ニコニコ動画】WiiリモートとArduinoでデータロガーを作ってみた

フィジカルコンピューティング第1歩

岡崎市の花火大会からびしょ濡れになって帰ってくると、遥かイタリアからのお届けものがありました。

Made in Italy のマイコン Arduino Duemilanove 328 がスイッチサイエンスさんより届きました。

B001VG2RYOArduino Duemilanove 328
スイッチサイエンス

by G-Tools


先駆けて始めたkaraageさんは、この記事のように(
[電波]5188円で始めるフィジカルコンピューティング 最終回 〜テルミンつくってみるミン まとめの巻〜
)、もうだいぶ進んでしまっているので、マイペースでやっていきたいと思います。

[PC] フィジカルコンピューティング
まずは今日の成果。とりあえず部品がなにも無いので、LED点滅のみ。デジタル入出力の13番と対応してるらしいLラベル付きのLEDを点滅させてみました。サンプルは1000ミリ秒間隔でしたが、変えてみない時が済まないので、100ミリ秒間隔に変更しました。

爆音で夜空に広がる花火を見たあとで、静寂の中のかすかに輝くLEDの点滅を眺める。
感動は後者の方が大きかったかな。
自分で作った料理が、何故か美味しく感じるような感覚に似ているかも。

YouTubeに動画もあげてみました。動画の投稿も簡単だなぁ。。



■Mac mini で環境構築したのですが、IDE動かすのに1カ所はまったのでメモしておきます。
Macmini型番: MB463J/A
CPU: Intel Core 2 Duo
OS: Mac OS X 10.5.7
ハードウェア:Arduino Duemilanove 328
ソフトウェアIDE、ドライバ:Arduino 0016 (Arduinoからダウンロード)

・ドライバインストール後、ソフトウェアIDE(Arduino 16.app)が起動しない。
 Arduino 16.app の「情報を見る」画面で、「32ビットモードで開く」を選択する必要あり。
 この記事(Mac版Arduino IDEがlibrxtxSerial.jnilibが見つからないエラーで起動しないのを対処[橋本商会])を参考に32bitモードに設定。
・上記をやらずに、一度起動してしまうと、後から上記設定をしても起動せず、以下のメッセージが出る(arduino cannot run because it could not create a folder to store your settings)。
 記事修正20090816: Arduino 16.app と同じフォルダにできるdataフォルダを消して再起動すると起動できるようです。ただし、毎回消さないと起動しません。パーミッションに問題がありそう。管理者権限のあるユーザを使用しているのだけれど、なぜだろう。ちなみに、Processing言語の開発環境も同様のメッセージで立ち上がりません。

 記事修正20100615: Arduinoの設定ファイルが保存されているディレクトリのパーミッションが root になっているのが原因だったようです。ターミナルを使用して、以下のように権限を変更したところ、起動できるようになりました。


user$ cd ~/Library/Arduino/
user$ ls -la
drwxr-xr-x 3 root user 102 6 15 21:35 .
drwx------+ 43 user user 1462 6 15 21:35 ..
-rw-r--r-- 1 root user 1916 6 15 22:29 preferences.txt
user$ cd ..
user$ sudo chown -R user:user Arduino/ # root となっている所を user(あなたのユーザ名)に変更します。管理者権限で実行するため、sudo コマンドを使用しています。
Password: # root パスワードを聞かれますので、入力します。
user$ cd Arduino
user$ ls -la
drwxr-xr-x 3 user user 102 6 15 21:35 .
drwx------+ 43 user user 1462 6 15 21:35 ..
-rw-r--r-- 1 user user 1821 6 15 22:43 preferences.txt
# 変わっているのがわかると思います。


[PC] 今後の計画
ちょっと興味を持ち始めていた、Google Earthを調べていたら、こんな記事を発見。
バランスWiiボードでGoogleストリートビューを操作するJSONP API (blog.katsuma.tv)

こりゃすごい。

というわけで、夏休みは
「Wii リモコンで操作する Arduino ラジコンカーを作るぞ」
をテーマに研究してみたいと思いつきました。
まずはできるかどうか調べなきゃなぁ。