2014-git-work/arduino/catchrobo2012/catchrobo2012.ino

91 lines
2.4 KiB
Arduino
Raw Normal View History

2012-08-30 08:46:59 +09:00
#include <Servo.h>
#include <Wire.h>
#include <WiiNun.h>
#include "Motor.h"
#define PIN_LED 13
#define PIN_MOTOR_HORIZON_1 5
#define PIN_MOTOR_HORIZON_2 4
#define PIN_MOTOR_VERTICAL_1 6
#define PIN_MOTOR_VERTICAL_2 7
#define PIN_SERVO_BASE 9
2012-08-30 23:08:43 +09:00
#define PIN_SERVO_CATCHER 10
2012-08-30 08:46:59 +09:00
#define PIN_PWR A3
#define PIN_GND A2
Servo base;
Servo catcher;
WiiNun wiiNun;
Motor horMotor;
Motor verMotor;
void setup(){
pinMode(PIN_PWR, OUTPUT);
pinMode(PIN_GND, OUTPUT);
digitalWrite(PIN_PWR, HIGH);
digitalWrite(PIN_GND, LOW);
delay(100);
2012-08-30 09:06:11 +09:00
// Serial.begin(19200);
2012-08-30 08:46:59 +09:00
wiiNun.begin();
base.attach(PIN_SERVO_BASE);
catcher.attach(PIN_SERVO_CATCHER);
2012-08-30 23:08:43 +09:00
pinMode(PIN_LED, OUTPUT);
2012-08-30 08:46:59 +09:00
horMotor.attach(PIN_MOTOR_HORIZON_1, PIN_MOTOR_HORIZON_2);
verMotor.attach(PIN_MOTOR_VERTICAL_1, PIN_MOTOR_VERTICAL_2);
}
void loop(){
2012-08-30 09:06:11 +09:00
// ヌンチャクを読む
2012-08-30 08:46:59 +09:00
wiiNun.get();
byte joyx = wiiNun.data[0];
byte joyy = wiiNun.data[1];
byte accx = wiiNun.data[2];
byte accy = wiiNun.data[3];
byte accz = wiiNun.data[4];
byte zbut = ((~wiiNun.data[5] >> 0) & 1);
byte cbut = ((~wiiNun.data[5] >> 1) & 1);
2012-08-30 09:06:11 +09:00
if((wiiNun.data[5] >> 2) & 1) accx += 2;
if((wiiNun.data[5] >> 3) & 1) accx += 1;
if((wiiNun.data[5] >> 4) & 1) accy += 2;
if((wiiNun.data[5] >> 5) & 1) accy += 1;
if((wiiNun.data[5] >> 6) & 1) accz += 2;
if((wiiNun.data[5] >> 7) & 1) accz += 1;
// ヌンチャクおわり
2012-08-30 08:46:59 +09:00
2012-08-30 09:06:11 +09:00
char x = (char)(joyx-0x7F); // スティックの中心を0にする
char y = (char)(joyy-0x7F); // スティックの中心を0にする
2012-08-30 08:46:59 +09:00
// char ax = (char)(accx-0x7F);
2012-08-30 09:06:11 +09:00
char ay = (char)(accy-0x7F); // 水平状態を0にする
2012-08-30 08:46:59 +09:00
2012-08-30 23:08:43 +09:00
static byte baseDeg = 90;
2012-08-30 08:46:59 +09:00
if(zbut){ // zボタン押しながら
digitalWrite(PIN_LED, HIGH);
if(y>0x1F) baseDeg = 180 - atan2(y, x)*180/PI; // 台座をスティックの角度にする
if(baseDeg < 10) baseDeg = 10;
else if(baseDeg > 170) baseDeg = 170;
2012-08-30 09:14:41 +09:00
}else{ // zボタン離しながら
2012-08-30 09:06:11 +09:00
digitalWrite(PIN_LED, LOW);
2012-08-30 23:08:43 +09:00
horMotor.speed(y*2);
2012-08-30 08:46:59 +09:00
baseDeg += x/32; // 台座をxに応じて相対移動
}
2012-08-30 23:08:43 +09:00
base.write(baseDeg);
2012-08-30 08:46:59 +09:00
2012-08-30 09:06:11 +09:00
if(0);
else if(ay > +0x20) verMotor.mode(GO);
else if(ay > +0x10) verMotor.speed(+0xCC);
else if(ay < -0x20) verMotor.mode(BACK);
2012-08-30 23:08:43 +09:00
else if(ay < -0x10) verMotor.speed(-0xCC);
else verMotor.mode(STOP);
2012-08-30 08:46:59 +09:00
2012-08-30 23:08:43 +09:00
byte catcherDeg = 100;
2012-08-30 09:06:11 +09:00
if(cbut){ // cボタン押すとキャッチャーを離す
2012-08-30 23:08:43 +09:00
catcherDeg = 30;
2012-08-30 08:46:59 +09:00
}
catcher.write(catcherDeg);
2012-08-30 23:08:43 +09:00
delay(50);
}