<   2011年 03月 ( 3 )   > この月の画像一覧

ついに、WiiBoardに手がとどいたよ。
sudo apt-get install wminput lswm
で出来た/usr/lib/libcwiid.so.1には、バグがあったみたい。
ソースから、やり直してみた。
sudo apt-get install git
sudo apt-get install automake
sudo apt-get install flex
sudo apt-get install bison
sudo apt-get install libgtk2.0-dev
sudo apt-get install python-dev
してから
git clone https://github.com/abstrakraft/cwiid.git
cd ./cwiid
aclocal
autoconf
./configure
make
sudo make install
だけど、libcwiid.so.1が置き換えられないみたい。
よくわからないから、プログラムと同じフォルダに
libcwiid/libcwiid.so.1.0をコピーして使ってみた。

wiiリモコンと同じで
hcitool scanでバランスボードのIDをてにいれる。
データの使い方は
http://abstrakraft.org/cwiid/ticket/63
のweighdemo.py を参考にした。
プログラムを起動したらボードの裏にある電池の側の赤いボタンを押す。

<こちらにCwiidFFIのモジュール載せときました。>
http://gaziya.exblog.jp/15643259/
+++++++++++++++++++++++++++++++

#!usr/bin/env ruby

require 'rubygems'
require 'ffi'

module CwiidFFI
extend FFI::Library
ffi_lib './libcwiid.so.1.0'

class BalanceCal < FFI::Struct
layout :right_top, [:uint16,3],
:right_bottom, [:uint16,3],
:left_top, [:uint16,3],
:left_bottom, [:uint16,3]
end

class CwiidIrSrc < FFI::Struct
layout :valid, :char,
:pos, [:uint16, 2],
:size, :uint8
end

class BalanceState < FFI::Struct
layout :right_top, :uint16,
:right_bottom, :uint16,
:left_top, :uint16,
:left_bottom, :uint16
end

class CwiidState < FFI::Struct
layout :rpt_mode, :uint8,
:led, :uint8,
:rumble, :uint8,
:battery, :uint8,
:buttons, :uint16,
:acc, [:uint8, 3],
:ir_src, [CwiidIrSrc, 4],
:ext_type, :int,
:ext, BalanceState,
:error, :int
end

attach_function :str2ba,[:string,:pointer],:int
attach_function :cwiid_open,[:pointer,:int],:pointer
attach_function :cwiid_close,[:pointer],:int
attach_function :cwiid_set_led,[:pointer,:int],:int
attach_function :cwiid_get_balance_cal,[:pointer,BalanceCal],:int
attach_function :cwiid_set_rpt_mode,[:pointer,:uint8],:int
attach_function :cwiid_get_state, [:pointer, CwiidState], :int
end

def calc_weight(state,cals)
weight = 0
[:right_top,:right_bottom,:left_top,:left_bottom].each do |sensor|
reading = state[:ext][sensor]
cal = cals[sensor]
if reading < cal[1]
weight += 1700 * (reading - cal[0]) / (cal[1] -cal[0])
else
weight += 1700 * (reading - cal[1]) / (cal[2] -cal[1]) + 1700
end
end
weight
end

address = "00:26:59:39:A0:38"
bdaddr = FFI::MemoryPointer.new(:pointer)
CwiidFFI::str2ba(address, bdaddr)
puts "Put Wiimote in discoverable mode now (press red button)..."
wiimote = CwiidFFI::cwiid_open(bdaddr,0)
balance_cal = CwiidFFI::BalanceCal.new
CwiidFFI::cwiid_get_balance_cal(wiimote,balance_cal)
CwiidFFI::cwiid_set_rpt_mode(wiimote,0x02 | 0x40)
cwiid_state = CwiidFFI::CwiidState.new
CwiidFFI::cwiid_set_led(wiimote,0x01)
100.times do
CwiidFFI::cwiid_get_state(wiimote,cwiid_state)
puts ":buttons => %d" % cwiid_state[:buttons]
puts ":right_top => %d" % cwiid_state[:ext][:right_top]
puts ":right_bottom => %d" % cwiid_state[:ext][:right_bottom]
puts ":left_top => %d" % cwiid_state[:ext][:left_top]
puts ":left_bottom => %d" % cwiid_state[:ext][:left_bottom]
puts "Weight: %dKg.." % (calc_weight(cwiid_state,balance_cal) / 100)
puts "#########################################"
sleep 1
end
CwiidFFI::cwiid_close(wiimote)
[PR]
by gaziya | 2011-03-31 22:51
ruby/ffiを試した。
ruby1.8を使っているので
sudo gem1.8 install ffi --version "= 0.6.3"
すでに
sudo apt-get install wminput lswm
をしているので/usr/lib/のlibcwiid.so.1をつかう。
hcitool scanでリモコンのIDをてにいれる。
僕の場合は 00:24:44:A1:1D:76 だった。
もうちょっとで、wiiバランスボードができそうだ。
cwiid.hには、
int cwiid_get_balance_cal(struct wiimote *wiimote,struct balance_cal *balance_cal);
があるので、なんとかなりそうだが、ちょっと、煮詰まってる。
そこでとりあえず、リモコンのバイブとLEDの点滅のプログラムを作った。

<こちらにCwiidFFIのモジュール載せときました。>
http://gaziya.exblog.jp/15643259/
+++++++++++++++++++++++++++++++

#!usr/bin/env ruby

require 'rubygems'
require 'ffi'

module CwiidFFI
extend FFI::Library
ffi_lib 'libcwiid.so.1'

CWIID_LED1_ON = 0x01
CWIID_LED2_ON = 0x02
CWIID_LED3_ON = 0x04
CWIID_LED4_ON = 0x08

attach_function :str2ba,[:pointer,:pointer],:pointer
attach_function :cwiid_open,[:pointer,:int],:pointer
attach_function :cwiid_close,[:pointer],:int
attach_function :cwiid_set_rumble,[:pointer,:int],:int
attach_function :cwiid_set_led,[:pointer,:int],:int
end

address = "00:24:44:A1:1D:76"
bdaddr_t = FFI::MemoryPointer.new(:pointer,1)
CwiidFFI::str2ba(address, bdaddr_t)
puts "Put Wiimote in discoverable mode now (press 1+2)..."
wiimote_t = CwiidFFI::cwiid_open(bdaddr_t,0)

CwiidFFI::cwiid_set_rumble(wiimote_t,1)
CwiidFFI::cwiid_set_led(wiimote_t,CwiidFFI::CWIID_LED1_ON)
sleep 1
CwiidFFI::cwiid_set_rumble(wiimote_t,0)
CwiidFFI::cwiid_set_led(wiimote_t,CwiidFFI::CWIID_LED2_ON)
sleep 1
CwiidFFI::cwiid_set_led(wiimote_t,CwiidFFI::CWIID_LED3_ON)
sleep 1
CwiidFFI::cwiid_set_led(wiimote_t,CwiidFFI::CWIID_LED4_ON)
sleep 1
CwiidFFI::cwiid_set_led(wiimote_t,CwiidFFI::CWIID_LED1_ON | CwiidFFI::CWIID_LED3_ON)
sleep 1
CwiidFFI::cwiid_set_led(wiimote_t,0)
sleep 1
CwiidFFI::cwiid_set_led(wiimote_t,0x0f)
sleep 1

CwiidFFI::cwiid_close(wiimote_t)
[PR]
by gaziya | 2011-03-26 11:08
wiiボードを使いたくて、ネットを探してみた。
なかなか、欲しい情報に出会えない。
とりあえず、ステップアップの為にwiiリモコンを使ってみた。
参考ページは
http://www.covia.jp/net/bbs/viewtopic.php?f=9&t=419
まず、
sudo apt-get install wminput lswm
たぶん、これでいいと思う。
いろいろ、試したから自信はないが、そんなに遠くないと思う。
参考ページの中で、
sudo modprobe uinput
を、すると書いてあったが、VirtualBoxのUbuntu10.10では必要ないみたい。
VirtualBoxを使っている場合は、VirtualBoxのメニューのデバイス => USBデバイスで、
Bluetoothデバイスのチェックをしておいてください。
ちなみに、これをチェックすると、Bluetoothマウスが不安定になるので、
USBマウスの方がいいかな。
wminputをマウス代りに使うとマウスポインターが動かない。
だけど、ジョイパットの代りなら十分だ。
今回のプログラムは、起動したら、rootのパスワードを入れて、
wiiリモコンの1と2のボタンを同時押し。
その後は、wiiリモコンの十字キーで移動。
homeキーで終了。

#!usr/bin/env ruby

require 'rubygems'
require 'sdl'

class EventHandle
def initialize(hash)
struct = Struct.new(:event,:const,:method)
@handle = {}
hash.each do |key,value|
event,const = key
if const
if event == SDL::Event::KeyDown || event == SDL::Event::KeyUp
@handle[struct.new(event,const,:sym)] = value
elsif event == SDL::Event::MouseButtonDown || event == SDL::Event::MouseButtonUp
@handle[struct.new(event,const,:button)] = value
end
else
@handle[struct.new(event)] = value
end
end
end

def match?(key,event)
if key.const
event.kind_of?(key.event) && key.const == event.method(key.method).call
else
event.kind_of?(key.event)
end
end

def handling(event)
@handle.each do |key,value|
return value.call(event) if match?(key,event)
end
nil
end
end

class Phase
def initialize(screen)
@screen = screen
@item = SDL::Surface.new(SDL::SWSURFACE,30,30,@screen)
@item.draw_rect(0,0,@item.w,@item.h,[0,200,0],true)
@x,@y,@dx,@dy = 150,150,0,0
@scale = 5
@handle = EventHandle.new(
[SDL::Event::KeyDown,SDL::Key::LEFT] => proc{@dx -= 1},
[SDL::Event::KeyDown,SDL::Key::RIGHT] => proc{@dx += 1},
[SDL::Event::KeyUp,SDL::Key::LEFT] => proc{@dx += 1},
[SDL::Event::KeyUp,SDL::Key::RIGHT] => proc{@dx -= 1},
[SDL::Event::KeyDown,SDL::Key::UP] => proc{@dy -= 1},
[SDL::Event::KeyDown,SDL::Key::DOWN] => proc{@dy += 1},
[SDL::Event::KeyUp,SDL::Key::UP] => proc{@dy += 1},
[SDL::Event::KeyUp,SDL::Key::DOWN] => proc{@dy -= 1},
SDL::Event::Quit => proc{quit},
[SDL::Event::KeyDown,SDL::Key::ESCAPE] => proc{quit}
)
end

def update
@x += @dx * @scale
@y += @dy * @scale
if @x < 0
@x = @screen.w
elsif @x >= @screen.w
@x = 0
end
if @y < 0
@y = @screen.h
elsif @y >= @screen.h
@y = 0
end
@screen.draw_rect(0,0,@screen.w,@screen.h,[50,50,50],true)
@screen.put(@item,@x,@y)
end

def quit
system("sudo pkill wminput")
exit
end

def run
loop do
update
@screen.flip
while event=SDL::Event.poll
@handle.handling(event)
end
SDL.delay(10)
end
end
end

wmconf = <<EOF
Wiimote.Up = KEY_UP
Wiimote.Down = KEY_DOWN
Wiimote.Left = KEY_LEFT
Wiimote.Right = KEY_RIGHT
Wiimote.Home = KEY_ESC
EOF
system("echo '#{wmconf}' > /tmp/wmconf")
#system("sudo modprobe uinput")
system("sudo wminput -c /tmp/wmconf -d &")
puts "Put Wiimote in discoverable mode now (press 1+2)..."
SDL.init(SDL::INIT_EVERYTHING)
screen = SDL::Screen.open(350,350,16,SDL::SWSURFACE)
Phase.new(screen).run
[PR]
by gaziya | 2011-03-03 23:09