Linuxでwiimoteを使う。
サンプルをすこしいじって、ドラムをたたくように振るとランブルするプログラムを作成。
Debian(sid)使用。
windowsより扱いやすい感じです。
test.c
#include <stdarg.h> #include <stdio.h> #include <stdlib.h> #include <cwiid.h> #define toggle_bit(bf,b) \ (bf) = ((bf) & b) \ ? ((bf) & ~(b)) \ : ((bf) | (b)) void set_rpt_mode(cwiid_wiimote_t *wiimote, unsigned char rpt_mode); cwiid_err_t err; void err(cwiid_wiimote_t *wiimote, const char *s, va_list ap) { if (wiimote) printf("%d:", cwiid_get_id(wiimote)); else printf("-1:"); vprintf(s, ap); printf("\n"); } int main(int argc, char *argv[]) { cwiid_wiimote_t *wiimote; // wiimote handle struct cwiid_state state; // wiimote state bdaddr_t bdaddr; // bluetooth device address unsigned char mesg = 0; unsigned char led_state = 0; unsigned char rpt_mode = 0; unsigned char rumble = 0; int beat = 0; int cnt = 0; cwiid_set_err(err); /* Connect to address given on command-line, if present */ if(argc > 1){ str2ba(argv[1], &bdaddr); } else{ bdaddr = *BDADDR_ANY; } /* Connect to the wiimote */ printf("Put Wiimote in discoverable mode now (press 1+2)...\n"); if(!(wiimote = cwiid_open(&bdaddr, 0))){ fprintf(stderr, "Unable to connect to wiimote\n"); exit(EXIT_FAILURE); } printf("### beatbox ###\n"); /* set ACC rpt mode */ toggle_bit(rpt_mode, CWIID_RPT_ACC); set_rpt_mode(wiimote, rpt_mode); while(1){ /* get acc state */ if (cwiid_get_state(wiimote, &state)) { fprintf(stderr, "Error getting state\n"); } if(beat==0 && state.acc[CWIID_Z]>200){ printf("beat %d!!\n", cnt++); beat = 1; /* rumble 100ms */ toggle_bit(rumble, 1); if (cwiid_set_rumble(wiimote, rumble)) { fprintf(stderr, "Error setting rumble\n"); } if (cwiid_set_led(wiimote, 0x0f)) { fprintf(stderr, "Error setting LEDs \n"); } usleep(100000); toggle_bit(rumble, 1); if (cwiid_set_rumble(wiimote, rumble)) { fprintf(stderr, "Error setting rumble\n"); } if (cwiid_set_led(wiimote, 0x00)) { fprintf(stderr, "Error setting LEDs \n"); } } if(beat==1 && state.acc[CWIID_Z]<140){ beat = 0; } usleep(1000); } if(cwiid_close(wiimote)){ fprintf(stderr, "Error on wiimote disconnect\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } void set_rpt_mode(cwiid_wiimote_t *wiimote, unsigned char rpt_mode) { if(cwiid_set_rpt_mode(wiimote, rpt_mode)){ fprintf(stderr, "Error setting report mode\n"); } }
SOURCES = test LDLIBS += -lcwiid $(SOURCES): $(SOURCES).c $(CC) $< $(LDLIBS) -o $@