記事一覧

WiiのヌンチャクをArduinoで使ってみる(その2)Processingで表示

I connected Wii Nunchaku to Arduino (No.2) Processing



RoboTakaoです。ようこそ「極力ローコスト ロボット製作 ブログ」にお越しくださいました。
Hello everyone! I’m RoboTakao. Welcome to my robot blog.

先日WiiのヌンチャクをArduinoに接続してみました。

I posted the article about connection Wii Nunchaku and Arduino.

今回はProcessingでキューブを動かしてみたいと思います。
In this time, I move a cube on Processing.

nunchaku07.jpg

ライブラリーも変更したものを使ってみました。

And I change the library.
https://github.com/GabrielBianconi/arduino-nunchuk

結線 Connections
前回と同じです。
It’s same to previous article.

nunchaku03.png

結果 Results
ヌンチャクを傾けるとキューブを回転させて、ジョイスティックで位置を動かすことができます。



Arduinoのスケッチ


#include
#include

ArduinoNunchuk nunchuk = ArduinoNunchuk();

void setup()
{
Serial.begin(9600);
nunchuk.init();
}

void loop()
{
nunchuk.update();

Serial.print("s,");
Serial.print(nunchuk.accelX, DEC);
Serial.print(',');
Serial.print(nunchuk.accelY, DEC);
Serial.print(',');
Serial.print(nunchuk.accelZ, DEC);
Serial.print(',');
Serial.print(nunchuk.analogX, DEC);
Serial.print(',');
Serial.print(nunchuk.analogY, DEC);
Serial.print(',');
// Serial.print(nunchuk.zButton, DEC);
// Serial.print(',');
// Serial.print(nunchuk.cButton, DEC);
// Serial.print(',');

delay(50);
}


Processingのスケッチ


import processing.serial.*;

Serial myPort; // Create object from Serial class
String datline;

// 加速度センサの前回の値と今回の値をミックスする比率
// 前回の値は使用せず今回の値のみを使用するのであれば1.0に設定
final float ratio = 0.5;

// 前回のx軸とy軸とy軸の値(初期値は0)
float xAxisValueLast = 0;
float yAxisValueLast = 0;
float zAxisValueLast = 0;

float xAxisValue;
float yAxisValue;
float zAxisValue;

int Xaxis = 0;
int Yaxis = 0;

void setup() {
size(800, 800, P3D);
frameRate(30);
noStroke();
colorMode(RGB, 1);


// Serial Port
myPort = new Serial(this, "/dev/cu.usbserial-A104WMBI", 9600);
}

void draw() {
background(0.5);

pushMatrix();

translate(width / 2 + Xaxis, height / 2 - Yaxis, -30);

char datline_c;
datline = "";
int i=0;

while(i < 6){
if ( myPort.available() > 0){
datline_c = myPort.readChar();
if(datline_c=='s'){
i=0;
datline = "";
}
if(datline_c==',') i++;
datline = datline + datline_c;
}
print();
}

int[] splitdata = int(datline.split(","));

println(datline);

println(splitdata[1]);
println(splitdata[2]);
println(splitdata[3]);
println(splitdata[4]);
println(splitdata[5]);

xAxisValue = (float(splitdata[1])-512);
yAxisValue = (float(splitdata[2])-512);
zAxisValue = (float(splitdata[3])-512);
Xaxis = (int(splitdata[4])-125)*2;
Yaxis = (int(splitdata[5])-125)*2;

println(xAxisValue);
println(yAxisValue);
println(zAxisValue);
println(Xaxis);
println(Yaxis);

// 前回の値と今回の値の割合を変えてスムージングする
// 前回の値の割合を大きくすると、滑らかになる代わりに変化が遅くなり
// 今回の値の割合を大きくすると、ノイズを拾いやすくなる代わりに変化が早くなる
float xAxisValueSmoothed = xAxisValue * ratio + xAxisValueLast * (1.0 - ratio);
float yAxisValueSmoothed = yAxisValue * ratio + yAxisValueLast * (1.0 - ratio);
float zAxisValueSmoothed = zAxisValue * ratio + zAxisValueLast * (1.0 - ratio);

// 前回の値としてスムージングした値をセット
xAxisValueLast = xAxisValueSmoothed;
yAxisValueLast = yAxisValueSmoothed;
zAxisValueLast = zAxisValueSmoothed;

// スムージングした値をsinθの値とする
float xAxisSinTheta = xAxisValueSmoothed;
float yAxisSinTheta = yAxisValueSmoothed;
float zAxisSinTheta = zAxisValueSmoothed;

// マウスの代わりに加速度センサの値でコントロール
rotateZ(asin(xAxisSinTheta/zAxisSinTheta));
rotateX(asin(yAxisSinTheta/zAxisSinTheta));

scale(100);

beginShape(QUADS);

fill(0, 1, 1);
vertex(-1, 1, 1);
fill(1, 1, 1);
vertex( 1, 1, 1);
fill(1, 0, 1);
vertex( 1, -1, 1);
fill(0, 0, 1);
vertex(-1, -1, 1);

fill(1, 1, 1);
vertex( 1, 1, 1);
fill(1, 1, 0);
vertex( 1, 1, -1);
fill(1, 0, 0);
vertex( 1, -1, -1);
fill(1, 0, 1);
vertex( 1, -1, 1);

fill(1, 1, 0);
vertex( 1, 1, -1);
fill(0, 1, 0);
vertex(-1, 1, -1);
fill(0, 0, 0);
vertex(-1, -1, -1);
fill(1, 0, 0);
vertex( 1, -1, -1);

fill(0, 1, 0);
vertex(-1, 1, -1);
fill(0, 1, 1);
vertex(-1, 1, 1);
fill(0, 0, 1);
vertex(-1, -1, 1);
fill(0, 0, 0);
vertex(-1, -1, -1);

fill(0, 1, 0);
vertex(-1, 1, -1);
fill(1, 1, 0);
vertex( 1, 1, -1);
fill(1, 1, 1);
vertex( 1, 1, 1);
fill(0, 1, 1);
vertex(-1, 1, 1);

fill(0, 0, 0);
vertex(-1, -1, -1);
fill(1, 0, 0);
vertex( 1, -1, -1);
fill(1, 0, 1);
vertex( 1, -1, 1);
fill(0, 0, 1);
vertex(-1, -1, 1);

endShape();
popMatrix();
}


それでは今回はこの辺で失礼します!ありがとうございます。

コメント

コメントの投稿

非公開コメント

プロフィール

RoboTakao

Author:RoboTakao
みなさんご訪問ありがとうございます。ロボット作りたいけどお小遣いそんなにないし、簡単でローコストでロボットを作るための私のプロジェクトを紹介します。

ウェブサイトもありますのでそちらもよろしくお願いします。
http://robotakao.jp/