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();
}
}
}

}

0 件のコメント: