For the purposes of my project, I decided a few steps would be required:
1) Connection would need to be made to the balance board from a computer
2) The sensors would need to have their data sent to the computer
3) Combine the 4 sensors of the balance board into a single weight amount
4) Data needs to be uploaded to Google Docs.
These specific instructions are for Ubuntu 11.4.
Before starting the project, you need to install all required packages. Ubuntu makes this extremely simple with the adt-get command. The entire list of packages you need is as follows:
sudo apt-get install autoconf autogen automake gcc bluetooth libbluetooth3-dev libgtk2.0-dev pkg-config python2.7-dev flex bison git-core libbluetooth-dev python-pygame python-tk
At this point, I like to make a new directory to store all of the necessary files. In order to interface with the Wii Remote and Balance Board, I am using an excellent python library called cwiid (pronounced Seaweed) The code for this is stored in a git repository, and needs to be compiled.
mkdir ~/wii cd ~/wii git clone http://github.com/abstrakraft/cwiid.git cd cwiid aclocal autoconf ./configure make sudo make install cd python sudo python setup.py install git clone git://github.com/videntity/python-omhe.git cd python-omhe sudo python setup.py install
With all of this installed, you are ready to start programming using the Wii Remote or Balance Board. Even if you do not want to program for the Wii Hardware, you can use the included program wmgui to see in real time what you are doing with the Wii Remote. Before I get into the actual code, I want to add the ability to save data to a Google Document Spreadsheet. In order to do this I chose to again make a new directory, then downloaded the latest library available from here. Once it is downloaded, installation is as simple as:
sudo python setup.py install
For my actual program, I combined code available from Matt Cutts and the demo from cwiid With some slight modifications. My final code was:
#!/usr/bin/python
import sys
sys.path.insert(0, '/home/anthony/wii/svn/trunk/python/build/lib.linux-i686-2.5/')
import cwiid
import sys
import time
import gdata.spreadsheet.service
def main():
print 'Put Wiimote in discoverable mode now (press 1+2)...'
global wiimote
#if there is a MAC address provided, use it, otherwise make a new connection
if len(sys.argv) > 1:
wiimote = cwiid.Wiimote(sys.argv[1])
else:
wiimote = cwiid.Wiimote()
wiimote.rpt_mode = cwiid.RPT_BALANCE | cwiid.RPT_BTN
wiimote.request_status()
if wiimote.state['ext_type'] != cwiid.EXT_BALANCE:
print 'This program only supports the Wii Balance Board'
wiimote.close()
return -1
balance_calibration = wiimote.get_balance_cal()
named_calibration = { 'right_top': balance_calibration[0],
'right_bottom': balance_calibration[1],
'left_top': balance_calibration[2],
'left_bottom': balance_calibration[3],
}
exit = False
while not exit:
print "Type q to quit, or anything else to report your weight"
c = sys.stdin.read(1)
if c == 'q':
exit = True
wiimote.request_status()
logweight(calcweight(wiimote.state['balance'], named_calibration))
return 0
def calcweight( readings, calibrations ):
weight = 0
for sensor in ('right_top', 'right_bottom', 'left_top', 'left_bottom'):
reading = readings[sensor]
calibration = calibrations[sensor]
if reading > calibration[2]:
print "Warning, %s reading above upper calibration value" % sensor
if reading < calibration[1]:
weight += 1700 * (reading - calibration[0]) / (calibration[1] - calibration[0])
else:
weight += 1700 * (reading - calibration[1]) / (calibration[2] - calibration[1]) + 1700
return ((weight / 100.0) * 2.2)
def logweight(weight):
#replace with your google username, password, and the spreadsheet key available from the spreadsheet URL
email = 'username@gmail.com'
password = 'password'
spreadsheet_key = '6BsFAFER464657d0NlFQdlc0WH45thYUjiaGg2U1E'
worksheet_id = 'od6'
spr_client = gdata.spreadsheet.service.SpreadsheetsService()
spr_client.email = email
spr_client.password = password
spr_client.source = 'Weight Logger'
spr_client.ProgrammaticLogin()
#Dict keys are the lowercase versions of your column headers
dict = {}
dict['date'] = time.strftime('%m/%d/%Y')
dict['time'] = time.strftime('%H:%M:%S')
dict['weight'] = weight
entry = spr_client.InsertRow(dict, spreadsheet_key, worksheet_id)
if isinstance(entry, gdata.spreadsheet.SpreadsheetsList):
print "Insert row succeeded."
else:
print "Insert row failed."
if __name__ == "__main__":
sys.exit(main())
This code could easily be modified to achieve many different functions. For example, instead of entering any character to take your weight, it could be changed to take a name, so that multiple users can track their weights. Or maybe you want to set a timer so you don't have to hit a key on your keyboard to save your weight. The possibilities are endless.
Wii Weights: An Internet Enabled Scale Using the Wii and Linux ... bwiiboard.blogspot.com
ReplyDelete