なんかいろいろこんぴゅーたかんけいのなぐりがき

なんか勉強しているこんぴゅーた関係のことのメモやそれ以外のことを書こうかなあ...

logs

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

arduino + pyserial + 加速度センサのためのモジュールをかいてみた

Arduinoに加速度センサをつけてその情報をUSBケーブル越しにPCに出力し、それをPythonでゲットするためのモジュールを書いてみた。

Areduino側のプログラムは下記URLのページを参考にすこし修正を加えたものを使った。
http://kousaku-kousaku.blogspot.com/2008/06/arduino_16.htmlで紹介されている加速度センサと掲載されているプログラムを少しだけいじったもの↓
元のソースと異なるのは long y_sumの入力ミスを修正したことと、
シリアル出力するときに毎回頭に"$"を出力していることくらい。


//元のソースhttp://kousaku-kousaku.blogspot.com/2008/06/arduino_16.html

//加算用の変数
long x_sum, y_sum, z_sum;
//回数の変数
int count=0;

void setup(){
Serial.begin(9600);
}

void loop(){
int x=analogRead(0);
int y=analogRead(1);
int z=analogRead(2);

//それぞれに値を足していく(合計数)
x_sum+=x;
y_sum+=y;
z_sum+=z;

//回数を+1する(カウントアップ)
count++;

//100回カウントしたら
if(count>99){
//合計数を100で割って平均値を出す
Serial.print("$");
Serial.print(x_sum/100,DEC);
Serial.print(",");
Serial.print(y_sum/100,DEC);
Serial.print(",");
Serial.println(z_sum/100,DEC);
//カウントを0に戻す
count=0;
//合計数を0に戻す
x_sum=0;
y_sum=0;
z_sum=0;
}
}


Pythonのモジュールは以下の通り。
例のごとくコメントに使用している英文はおそろしくいい加減だが気にしないこと。
モジュールの使い方はtest()を見ればだいたい分かると思われるが、すこし説明しておくと、
AccelはUSB接続のポート番号を引数にとる。
そしてget()メソッドを使用するとx,y,zのタプルを返してくる。

もうひとつの使い方は、水平なところに加速度センサをおいてset()を使い加速度のデフォルト値を取得し、
get(offset=True)またはget(True)を呼ぶと、返り値がset()で取得したデフォルト値とのオフセットが返ってくる。
setの引数はデフォルト値の取得のためのサンプリング回数で、引数を与えない場合は10回加速度を取得しその平均値をデフォルト値とする。


#!/usr/bin/python

""""""""""""""""""""""""
accel.py
""""""""""""""""""""""""
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
加速度をArduino+Pyserialで取得するためのモジュール
"""
import serial,time
class Accel():
"""
get accelarate with Arduino and Pyserial
"""
def __init__(self,port):
self.ser = serial.Serial(6)
self.buf = []
self.faile_flag = False
def list2num(self,list):
"""
list data to int data
"""
num = 0
for x in range(len(list)):
num *= 10
num += int(list[x])
return num
def splitBuf(self,data):
"""
get data from serial , and split correctly
"""
try:
index = data.index(",")
x = data[:index]
data = data[index+1:]
index = data.index(",")
y = data[:index]
z = data[index+1:data.index("\r")]
return self.list2num(x),self.list2num(y),self.list2num(z)
except ValueError:
print "ValueError","reutrn:",510
self.faile_flag = True
return 510,510,510

def get(self,offset=False):
"""
return x,y,z tauple accel
if offset flag is True and self.set was called,return ralatory accel
"""
self.buf = []
doll = False
while True:
get_num = self.ser.read(1)
self.buf.append(get_num)
if get_num == "$":
doll = True
if len(self.buf) != 1:self.buf =["$"]
if get_num == "\n" and doll:
self.ser.flushInput()
if not offset:
return self.splitBuf(self.buf[1:])
else:
x,y,z = self.splitBuf(self.buf[1:])
return x-self.setx,y-self.sety,z-self.setz
def set(self,times=10):
"""
this function is used before you call get(offset=True).
"""
self.setx = self.sety = self.setz = 0
for i in range(times):
x,y,z = self.get()
self.setx+=x;self.sety+=y;self.setz+=z
self.setx /= times
self.sety /= times
self.setz /= times



def test():
"""
test this module
"""
a = Accel(6)
a.set(5)
while True:
print a.get(offset=True)
time.sleep(0.3)

if __name__ == "__main__":
test()


スポンサーサイト

トラックバックURL

http://ilovevim.blog42.fc2.com/tb.php/115-fbe5aba4

この記事へのトラックバック

この記事へのコメント

コメント投稿フォーム

Paging Navigation

Navigations, etc.

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。