#include <math.h> #include <Wire.h> #include <WiiChuck.h> #include <TVout.h> #include <stdio.h> #include "notedefs.h" #include "lib3d.h" #define SETUP_WIDTH 120 #define WIDTH 119 // visible width... #define HEIGHT 96 #define SOUND_OUT_PIN 2 #define MAX_ROLL 15 // nunchuck max roll #define MAX_PITCH 90 // nunchuck max pitch TVout cTV; WiiChuck cChuck = WiiChuck(); Scene3D cScene; int iLeftY = HEIGHT / 2; int iRightY = HEIGHT / 2; int angleStart, currentAngle; int tillerStart = 0; double angle; #define CUBE 20 void setup() { cChuck.begin(); cChuck.update(); cChuck.calibrateJoy(); cTV.begin(_PAL,SETUP_WIDTH,HEIGHT); //for devices with only 1k sram(m168) use TV.begin(_PAL,128,56) cTV.clear_screen(); cScene.CreateScene(WIDTH,HEIGHT,&cTV); cScene.AddCube(0,0,0,CUBE); } void loop() { char buffer[20]; int iRoll; float fRollAngle; int iPitch; float fPitchAngle; cTV.delay_frame(1); cChuck.update(); cTV.clear_screen(); iRoll = cChuck.readRoll(); fRollAngle = (PI * iRoll)/MAX_ROLL; iPitch = cChuck.readPitch(); fPitchAngle = (PI * iPitch)/MAX_PITCH; sprintf(buffer,"%d %d",iRoll,iPitch); cTV.print_str(0,0,buffer); // cTV.draw_line(0,iLeftY - iRoll, WIDTH, iLeftY + iRoll, 1); cScene.SetHAngle(fRollAngle); cScene.SetVAngle(fPitchAngle); cScene.UpdateDisplay(); if (iRoll > MAX_ROLL) { cTV.tone( NOTE_D4 ); } else if (iRoll < -MAX_ROLL) { cTV.tone( NOTE_B4 ); } else { cTV.noTone(); } /* Serial.print(", "); Serial.print(chuck.readPitch()); Serial.print(", "); Serial.print((int)chuck.readAccelX()); Serial.print(", "); Serial.print((int)chuck.readAccelY()); Serial.print(", "); Serial.print((int)chuck.readAccelZ()); // Serial.print(", "); // Serial.print((int)chuck.readJoyX()); // Serial.print(", "); // Serial.print((int)chuck.readJoyY()); Serial.println(); */ }
3 thoughts on “Nunchuck 3D”