WiiのヌンチャクをArduinoで使ってみる(その2)Processingで表示
- 2018/04/28
- 23:54
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.

ライブラリーも変更したものを使ってみました。
And I change the library.
https://github.com/GabrielBianconi/arduino-nunchuk
結線 Connections
前回と同じです。
It’s same to previous article.

結果 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();
}
それでは今回はこの辺で失礼します!ありがとうございます。
スポンサードリンク