2014年11月14日金曜日
9 Degrees of Freedom センサスティック for UNO
9 Degrees of Freedom センサスティック for Uno
http://www.usmv.sys.okayama-u.ac.jp/~in/sampleprg/sen-10724.html を参考に
(ほとんどそのままに) Unoように 9Degrees for Freedom センサスティック用の
スケッチを作ってみた。 I.N.先生に感謝します。
//ITG-3200 & ADXL345 & HMC5883L 読み出しサンプル
//2012.12.14-17 I.N.
//2014 Nov. 14 H.I. for Arudino UNO
//#include <rxduino.h> for GR-SAKURA
#include <Wire.h>
#define delayus(t) delayMicroseconds(t)
#define delayms(t) delay(t)
//ジャイロセンサ(ITG-3200)
#define G_ADR 0x68
#define G_SMPLRT_DEV 0x15
#define G_DLPF_FS 0x16
#define G_XOUT_H 0x1D
#define G_XOUT_L 0x1E
#define G_YOUT_H 0x1F
#define G_YOUT_L 0x20
#define G_ZOUT_H 0x21
#define G_ZOUT_L 0x22
//加速度センサ(ADXL345)
#define A_ADR 0x53
#define A_POWER_CTL 0x2D
#define A_DATAX0 0x32
#define A_DATAX1 0x33
#define A_DATAY0 0x34
#define A_DATAY1 0x35
#define A_DATAZ0 0x36
#define A_DATAZ1 0x37
//地磁気センサ(HMC5883L)
#define M_ADR 0x1E
#define M_CONFIG_A 0x00
#define M_CONFIG_B 0x01
#define M_MODE 0x02
#define M_DATAX_MSB 0x03
#define M_DATAX_LSB 0x04
#define M_DATAZ_MSB 0x05
#define M_DATAZ_LSB 0x06
#define M_DATAY_MSB 0x07
#define M_DATAY_LSB 0x08
// shortを"-##### "~"+##### "へ変換
void short2dec5(short n, char *s)
{
unsigned char a;
int d;
if(n<0){
d=-n;
s[0]='-';
}else{
d=n;
s[0]='+';
}
a=(unsigned int)d/10000u;
s[1]='0'+a;
d-=(unsigned int)a*10000u;
a=(unsigned int)d/1000u;
s[2]='0'+a;
d-=(unsigned int)a*1000u;
a=(unsigned int)d/100u;
s[3]='0'+a;
d-=(unsigned int)a*100u;
a=(unsigned int)d/10u;
s[4]='0'+a;
d-=(unsigned int)a*10u;
a=d;
s[5]='0'+a;
s[6]=' ';
s[7]=0;
}
#define PIN_SW 5
#define PIN_LED0 A2
#define PIN_LED1 A3
#define PIN_LED2 5
#define PIN_LED3 6
void setup() {
pinMode(PIN_SW,INPUT); //青ボタン使用
pinMode(PIN_LED0,OUTPUT); //LED0使用
pinMode(PIN_LED1,OUTPUT); //LED1使用
pinMode(PIN_LED2,OUTPUT); //LED2使用
pinMode(PIN_LED3,OUTPUT); //LED3使用
digitalWrite(PIN_LED0,0);
digitalWrite(PIN_LED1,0);
digitalWrite(PIN_LED2,0);
digitalWrite(PIN_LED3,0);
//---Serialは外部へのデータ送信---
// Serial.begin(38400,SCI_USB0); // 仮想USB(baudrateはダミー)
//Serial.begin(115200,SCI_SCI0P2x); //IO0=RXD0, IO1=TXD0
//Serial.begin(187500,SCI_SCI0P2x); //IO0=RXD0, IO1=TXD0
Serial.begin(9600); //for Uno
// sci_str *sci;
// sci=Serial.get_handle();
// sci->crlf_rx=CRLF_NONE; //受信:改行変換なし
// sci->crlf_tx=CRLF_NONE; //送信:改行変換なし
//I2C開始
Wire.begin();
//ジャイロセンサ初期設定
Wire.beginTransmission(G_ADR);
Wire.write(G_SMPLRT_DEV);
Wire.write(0x09); //1k/(9+1)=100Hz
Wire.write(0x18|0x01); //2000deg/s, lpf=188Hz
Wire.endTransmission();
//加速度センサ初期設定
Wire.beginTransmission(A_ADR);
Wire.write(A_POWER_CTL);
Wire.write(0x00);
Wire.endTransmission();
Wire.beginTransmission(A_ADR);
Wire.write(A_POWER_CTL);
Wire.write(0x10);
Wire.endTransmission();
Wire.beginTransmission(A_ADR);
Wire.write(A_POWER_CTL);
Wire.write(0x08);
Wire.endTransmission();
//地磁気センサ初期設定
Wire.beginTransmission(M_ADR);
Wire.write(M_CONFIG_A);
Wire.write(0x18); //average=1, rate=75[Hz]
Wire.write(0x20); //gain=1.3Ga
Wire.endTransmission();
Wire.beginTransmission(M_ADR);
Wire.write(M_MODE);
Wire.write(0x01); //mode=single
Wire.endTransmission();
delayms(100);
digitalWrite(PIN_LED0,1);
}
unsigned char dat[18];
short d[9];
unsigned int dt,t0;
void loop() {
char ss[8];
int i;
digitalWrite(PIN_LED1, 1);
t0=micros();
//ジャイロ読み出し
Wire.beginTransmission(G_ADR);
Wire.write(G_XOUT_H);
Wire.endTransmission();
Wire.requestFrom(G_ADR,6);
while(Wire.available()<6);
for(i=0;i<6;i++){
dat[i]=Wire.read();
}
d[0]=(dat[0]*0x100)|dat[1];
d[1]=(dat[2]*0x100)|dat[3];
d[2]=(dat[4]*0x100)|dat[5];
//加速度読み出し
Wire.beginTransmission(A_ADR);
Wire.write(A_DATAX0);
Wire.endTransmission();
Wire.requestFrom(A_ADR,6);
while(Wire.available()<6);
for(i=6;i<12;i++){
dat[i]=Wire.read();
}
d[3]=(dat[ 7]*0x100)|dat[ 6];
d[4]=(dat[ 9]*0x100)|dat[ 8];
d[5]=(dat[11]*0x100)|dat[10];
//地磁気読み出し
Wire.beginTransmission(M_ADR);
Wire.write(M_DATAX_MSB);
Wire.endTransmission();
Wire.requestFrom(M_ADR,6);
while(Wire.available()<6);
for(i=12;i<18;i++) {
dat[i]=Wire.read();
}
d[6]=(dat[12]*0x100)|dat[13];
d[7]=(dat[14]*0x100)|dat[15];
d[8]=(dat[16]*0x100)|dat[17];
Wire.beginTransmission(M_ADR);
Wire.write(M_MODE);
Wire.write(0x01); //mode=single
Wire.endTransmission();
//データ出力
for(int i=0;i<9;i++){
short2dec5(d[i],ss);
Serial.print(ss);
if(i==2 || i==5) Serial.print("|");
}
Serial.print("\r\n");
digitalWrite(PIN_LED1,0);
//ここまでで約4ms on GR-SAKURA
//時間待ち
do{
dt=micros()-t0;
}while(dt<10000);
t0+=10000;
}
2014年11月12日水曜日
QZQSMをデコードするプログラムをPythonで作ってみた。
QZQSMをデコードするプログラムをPythonで作ってみた。
#GPS QZSS robot car using QZPOD for QZSS scramble
import serial
import time
def main():
con=serial.Serial('/dev/ttyACM1', 19200, timeout=10)
print con.portstr
a='QSM'
while 1:
str=con.readline()
if a in str:
b=str.split(',')
c=b[2]
d=c.split('07DE')
e=d[1]
teamNo=e[0:2]
X_div=e[2:4]
Xwidth=e[4:6]
Y_div=e[6:8]
Ywidth=e[8:10]
NumberTarget=e[10:12]
Stx=e[12:14]
Sty=e[14:16]
T1x=e[16:18]
T1y=e[18:20]
T2x=e[20:22]
T2y=e[22:24]
T3x=e[24:26]
T3y=e[26:28]
print(e)
print('->', teamNo, X_div ,Y_div ,Xwidth ,Ywidth,NumberTarget,'-',Stx,Sty,'-', T1x,T1y, '-',T2x,T2y,'-',T3x,T3y)
# con.write(str)
if __name__ == '__main__':
main()
#GPS QZSS robot car using QZPOD for QZSS scramble
import serial
import time
def main():
con=serial.Serial('/dev/ttyACM1', 19200, timeout=10)
print con.portstr
a='QSM'
while 1:
str=con.readline()
if a in str:
b=str.split(',')
c=b[2]
d=c.split('07DE')
e=d[1]
teamNo=e[0:2]
X_div=e[2:4]
Xwidth=e[4:6]
Y_div=e[6:8]
Ywidth=e[8:10]
NumberTarget=e[10:12]
Stx=e[12:14]
Sty=e[14:16]
T1x=e[16:18]
T1y=e[18:20]
T2x=e[20:22]
T2y=e[22:24]
T3x=e[24:26]
T3y=e[26:28]
print(e)
print('->', teamNo, X_div ,Y_div ,Xwidth ,Ywidth,NumberTarget,'-',Stx,Sty,'-', T1x,T1y, '-',T2x,T2y,'-',T3x,T3y)
# con.write(str)
if __name__ == '__main__':
main()
2014年11月7日金曜日
検索した店舗の位置を地図にKmlで表示する。(その1「コンビニ編」)
検索した店舗の位置を地図にKmlで表示する。(その1「コンビニ編」)
「Text 第6章 pp.44-50の課題をArcGIS に代わりにGoogle Earthで実行」
手順)
1.
コンビニエンスストアの住所検索
「熊本県八代市 コンビニ」 を検索する。
2.
コンビニデータをCSVデータに変換する
(1)iタウンページの検索結果をExcelにコピペ(コピー&ペースト)する。
(2)「データ」の「区切り位置」を使って、店舗名と住所をそれぞれ、別のセルに保管する。
(3)フィルタや置換を使いながら、店舗名と住所を同じ行に並べる。
(4)データをCSVデータとしてファイル名を付けて保存する。
3.
住所データから 緯度経度データに変換する。
(1)CSVアドレスマッチングサービスを利用する
を利用する。
(2)出力結果をメモ帳で開いて確認
(3)Exel開いて、整理番号,場所の名前,説明,経度,緯度,標高
の順に並べる。
4.
CSVデータに入っている緯度経度を利用して kmlで矢印位置を 表示させる。
CSVからkmlの変換サイトを利用
5.
今日の出力結果をメモ帳に貼付けて、保存します。ファイル名は、shop3AC00名前.kml とします。提出フォルダに提出してください。
次回への課題1 (あらかじめ準備しておくと、早く終われます。)
出席番号と同じ都道府県番号
ただし、48番 福岡県北九州市 49番 神奈川県横浜市 とします。
次回への課題2 特定種類の施設の位置をkmlで表示させなさい(例えば、動物園、美術館、スタバの位置など。表示数が50個以上のモノを探す。)
登録:
投稿 (Atom)