ブログ移転のお知らせ / ロボチャン
ロボット製作編2008年7月8日: ロボザックのプログラムを再構築。(自律歩行への道。(続編10)) / ロボチャン
日記・その他 > 2足歩行ロボット製作編
プログラムのフローチャートは大きく変わりませんが、ハードの性能アップとシリアルポートを2箇所併用しているため、レスポンス向上によりプログラム数が少なくなると思います。
プログラム転送用シリアルポートの受信のみが解析できたので、赤外線リモコンと同じコマンドが使えることや、ゲームパッドからの操作で誤作動が発生し、2〜3回同じ動作を繰り返されるのがみられましたが、変更後はボタン操作と同じ回数やタイミングで反応しています。レスポンスは良い結果でした。
ハード面の改善でプログラムを最初から見直し、シンプルにしていきたいと思います。
※ワイヤレス送受信でのコマンド操作のプログラムの動き。
※コマンド受信後の自律歩行の動きや単純モーションについてのプログラムチャート。
プログラム転送用シリアルポートの受信のみが解析できたので、赤外線リモコンと同じコマンドが使えることや、ゲームパッドからの操作で誤作動が発生し、2〜3回同じ動作を繰り返されるのがみられましたが、変更後はボタン操作と同じ回数やタイミングで反応しています。レスポンスは良い結果でした。
ハード面の改善でプログラムを最初から見直し、シンプルにしていきたいと思います。
※ワイヤレス送受信でのコマンド操作のプログラムの動き。
※コマンド受信後の自律歩行の動きや単純モーションについてのプログラムチャート。 2008年7月8日(火) at 22:38
ロボット製作編2008年7月6日: Zig-100Bによるワイヤレス通信テストとコマンド操作のプログラムのテスト実施。 / ロボチャン
日記・その他 > 2足歩行ロボット製作編
Zig-100Bによるワイヤレス化のテストとゲームパッドを使っての操作や音声認識による操作をしてみました。
・ワイヤレスによるゲームパッド操作のテスト。
・ワイヤレスによる音声認識操作のテスト。
・ワイヤレスによるゲームパッド操作のテスト。
・ワイヤレスによる音声認識操作のテスト。
2008年7月6日(日) at 12:53
ロボット製作編2008年7月6日: 無線ユニットAKU-67からZig-100Bに変更。 / ロボチャン
日記・その他 > 2足歩行ロボット製作編
GPSで使用しているZig-100Bをロボザックにも使えるようにしました。断然、性能の違いからZig-100Bを使わないのはもったいないからです。白いケースのトレードマークがなくなってしまいますが、これでフロント部がスッキリしました。
※PCからUSBで接続されているZig-100Bと変換器(BTX026)
※ロボザックに取り付けられたZig-100Bと変換器(BTX026)
※PCからUSBで接続されているZig-100Bと変換器(BTX026)
※ロボザックに取り付けられたZig-100Bと変換器(BTX026)
2008年7月6日(日) at 09:23
ロボット製作編2008年7月5日: ロボザックへ音声認識モジュールの取付けをどうするか?(その4)。パソコンに音声認識モジュールを繋げる為のシリアルインターフェース作成。 / ロボチャン
日記・その他 > 2足歩行ロボット製作編
音声認識モジュール用のシリアルインターフェースを作成しました。ZIG-100B用のインターフェースと兼用してましたがロボットのワイヤレス操作でZIG-100Bを使おうと考えている為、音声認識用のシリアルインターフェースを新たに作成しました。(ガラクタを集めて作成していますので見栄えが悪いです。)

2008年7月5日(土) at 09:51
ロボット製作編2008年7月2日: ロボザックへの音声認識モジュール取付けをどうするか?(その3)。音声認識モジュールとワイヤレス操作の総合テスト。 / ロボチャン
日記・その他 > 2足歩行ロボット製作編
音声認識モジュールをパソコンに繋げてパソコンからワイヤレスでロボットを操作するテストをしてみました。ついでにポータブルGPSで創作中のZig-100Bも試しに音声認識モジュールとパソコン間のワイヤレス送信機として使ってみました。
ワイヤレスユニットが音声認識モジュールとロボットの間に2つあるということになります。少々ややっこしいですが、せっかくあるものなので使ってみました。単なる興味本意で意味はまったくありません。
-構成-
・音声認識モジュール
↓ ↑
・Zig−100B(ワイヤレス送信機)
↓ ↑
・パソコン(VB6で作成したプログラムで処理)
↓ ↑
・ワイヤレスユニットAKU-67
↓ ↑
・ロボザック(ロボット)
・ロボットの操作を2ヶ月ぶりに行いました。GPSの創作でご無沙汰でした。久々にロボット操作をワイヤレスユニットAKU-67で行ってみると動く気配なし。原因不明の不調で分からずじまいでしたが、電池も底を着くころに突然反応があり、チャンスとばかりにテストを実行しました。
ワイヤレスユニットAKU-67は安価なうえに電波の届く範囲は広いのですが、ちょっと送信のスピードが遅すぎ。Zig-100Bに統一をしようと思っています。
ワイヤレスユニットが音声認識モジュールとロボットの間に2つあるということになります。少々ややっこしいですが、せっかくあるものなので使ってみました。単なる興味本意で意味はまったくありません。
-構成-
・音声認識モジュール
↓ ↑
・Zig−100B(ワイヤレス送信機)
↓ ↑
・パソコン(VB6で作成したプログラムで処理)
↓ ↑
・ワイヤレスユニットAKU-67
↓ ↑
・ロボザック(ロボット)
・ロボットの操作を2ヶ月ぶりに行いました。GPSの創作でご無沙汰でした。久々にロボット操作をワイヤレスユニットAKU-67で行ってみると動く気配なし。原因不明の不調で分からずじまいでしたが、電池も底を着くころに突然反応があり、チャンスとばかりにテストを実行しました。
ワイヤレスユニットAKU-67は安価なうえに電波の届く範囲は広いのですが、ちょっと送信のスピードが遅すぎ。Zig-100Bに統一をしようと思っています。
2008年7月2日(水) at 15:43
ロボット製作編2008年6月29日: ロボザックへの音声認識モジュール取付けをどうするか?(その2)。解析完了、次のステップへ・・。 / ロボチャン
日記・その他 > 2足歩行ロボット製作編
音声認識ボードの解析が完了しました。通信シリアルチェッカーを使って受信のコードを解析してみました。
シリアルチェッカーでの戻り値(バイナリー10進)
こんにちは:133
歩け :129
さがれ :132
左へ :131
右へ :130
ダンス :135
腕立て :136
バイバイ :134
リモコン :137


解析をもとにパソコンに取込むためのプログラムを作成しています。シリアル通信で音声認識の受け渡しがほぼ完成したとこです。次は、音声認識モジュールからパソコンへコマンドを送信しパソコンからワイヤレスでロボット(ロボザック)操作をしてみます。
シリアルチェッカーでの戻り値(バイナリー10進)
こんにちは:133
歩け :129
さがれ :132
左へ :131
右へ :130
ダンス :135
腕立て :136
バイバイ :134
リモコン :137

解析をもとにパソコンに取込むためのプログラムを作成しています。シリアル通信で音声認識の受け渡しがほぼ完成したとこです。次は、音声認識モジュールからパソコンへコマンドを送信しパソコンからワイヤレスでロボット(ロボザック)操作をしてみます。
2008年6月29日(日) at 18:25
興味深いニュース:火星表面の「人の顔」 - フランス / ロボチャン
ニュース・芸能 > ロボット・科学に関する興味深いニュース。
ご無沙汰しています。体調を崩しちょっと休養していまた。
体力の衰えを感じはじめた今日この頃です。
創作活動は手付かずで報告できないのが残念です。
とは言ってもこのままほっとけないのがブログの辛いところです。今回も他人のフンドシで相撲をとらさせていただきます。
紹介できるのは興味深いニュースだけですが、ちょっと昔に話題になった火星表面の「人の顔」が立体映像で捉えられたそうです。 (2年前の記事ですね。あまりにも古い情報ですみません。)
この「人の顔」が構造物だったらと思うとワクワクしますよね。
体力の衰えを感じはじめた今日この頃です。
とは言ってもこのままほっとけないのがブログの辛いところです。今回も他人のフンドシで相撲をとらさせていただきます。
紹介できるのは興味深いニュースだけですが、ちょっと昔に話題になった火星表面の「人の顔」が立体映像で捉えられたそうです。 (2年前の記事ですね。あまりにも古い情報ですみません。)
この「人の顔」が構造物だったらと思うとワクワクしますよね。
2008年6月27日(金) at 21:12
ロボット製作編2008年6月10日: ロボザックへの音声認識モジュールの取付けをどうするか?(その1) / ロボチャン
日記・その他 > 2足歩行ロボット製作編
52号から定期購読を止め、独自の路線で創作活動してきた結果、音声認識モジュールが使えなくなってしまいました。音声認識モジュールはRZ−1のシリアルポートを使用しているからです。私が作ってきたRZ−1はシリアルのワイヤレス通信で、遠隔操作をしているため使用できないのです。再購読をしたものの使えないでは寂し過ぎます。どうにか使えないか思案したものの結局はパソコンに取込むしかなさそうです。思いがけない創作活動の追加で困惑しています。
2008年6月10日(火) at 19:54
興味深いニュース:ISSに「きぼう」船内保管室の設置完了 / ロボチャン
2008年6月6日 ロボット測位用GPS製作編(その2):Visual Basic6.0による測位表示のテストプログラム / ロボチャン
日記・その他 > 2足歩行ロボット製作編
・経緯度の測位データより座標表示させるプログラムのテストをしました。
今後は、移動体にGPSを装着させ軌跡表示をさせたいと思います。又、目標地点への移動制御として使えるか、プログラムを検討していきます。
※軌跡表示のテストは屋外でのテストになりますのでノートパソコンが必要になります。(ディスクトップしか持っていませんのでノートパソコンの調達(買うか、借りるか、貰うか)を調整中です。
今後は、移動体にGPSを装着させ軌跡表示をさせたいと思います。又、目標地点への移動制御として使えるか、プログラムを検討していきます。
※軌跡表示のテストは屋外でのテストになりますのでノートパソコンが必要になります。(ディスクトップしか持っていませんのでノートパソコンの調達(買うか、借りるか、貰うか)を調整中です。
2008年6月6日(金) at 22:20
興味深いニュース:火星に氷発見か、探査機が撮影 / ロボチャン
興味深いニュース:スペースシャトル・ディスカバリー、ISSとドッキング 星出さんらISS入り / ロボチャン
ニュース・芸能 > ロボット・科学に関する興味深いニュース。
日本の「きぼう」が打ち上げられ、今後の宇宙開発の進展がおおいに気になります。大型宇宙開発(月面基地開発や火星探査)の先駆けの一歩となる事業なのでしょう。
2008年6月3日(火) at 22:50
2008年6月1日 ロボット測位用GPS製作編(その1):Visual Basic6.0による測位表示のテストプログラム / ロボチャン
日記・その他 > 2足歩行ロボット製作編
・GPSの測位データを受信し簡易表示させるプログラムのテストです。
二足歩行の行動範囲が狭いものにはあまり意味がなさそうですが、車輪(タイヤやキャタピラ等)による移動が可能な行動範囲の広いものに付けて自律走行させるのに使えそうです。(これに関しては資金面で苦しいので直ぐには実現できそうもありません。3ヵ年計画のプランで思案中)
※ポータブルナビとしても使いますので「おでかけ、旅」のカテゴリーで紹介していきます。
・測位表示のプログラムはVisual Basic6.0で作成しています。
※下記のプログラムで使用していないコードも多くありますが、下手なプログラムでゴメンなさい。このプログラムを使って多くの方の創作活動に役立てれば幸いです。
''*************************************
'* GPSテストプログラム *
'*************************************
'
'
Option Explicit
Dim Buffer As Variant
Private Sub Command2_Click()
If MSComm1.PortOpen = True Then '(9)シリアルポートのオープン
MSComm1.PortOpen = False
End If
End Sub
Private Sub Command3_Click()
End
End Sub
'RS−232C初期化
'
Private Sub Form_Load()
Dim InString As String ' 入力文字列用バッファ。
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Form1.Caption = "測位表示テストプログラム"
Command1.Caption = "通信開始"
Command2.Caption = "通信停止"
Command3.Caption = "終了"
MSComm1.CommPort = 2 ' COM2 を使用します。
MSComm1.InputLen = 0 ' Input プロパティ使用時に、バッファ全体を読み取るように設定します。
MSComm1.Settings = "9600,N,8,1" ' 9600bps、パリティなし、データ長 8 ビット、およびストップ ビット長 1。
MSComm1.RThreshold = 1 '(7)1バイト受信毎にOnCommイベント発生
MSComm1.SThreshold = 1
End Sub
Private Sub Command1_Click() '(8)Command1のクリックイベントプロシージャ
If MSComm1.PortOpen = False Then '(9)シリアルポートのオープン
MSComm1.PortOpen = True
End If
End Sub
'終了処理
Private Sub Form_Unload(Cancel As Integer)
End
End Sub
' 指定された位置(緯度経度)で地図表示。
'Private Sub MapDisp(lat As Double, lon As Double)
' lat = lat * 3600 * 1000
' lon = lon * 3600 * 1000
'
' strlon.Text = "E " + latlon(lon)
' strlat.Text = "N " + latlon(lat)
' ProAtlasCtrl1.SetCenterCircle lat, lon
' ProAtlasCtrl1.MoveTo lat, lon, 1, 0
' ProAtlasCtrl1.DrawCenterCircle = True
'End Sub
'緯度経度のテキストデータを実数値に変換。
'
'Function ConvLonLat(data As String) As Double
'
' Dim t1 As Double, t2 As Double
'
' Dim s1 As String, s2 As String
'
' s1 = StrToken(data, ".")
' s2 = StrToken("", "")
' t1 = Val(s1)
' t2 = Val("." + s2) * 60
' ConvLonLat = (t1 \ 100) + (t1 Mod 100) / 60 + (t2 / 3600)
'
'End Function
'シリアルコミニケーションイベント処理
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive ' RThreshold プロパティで指定された数のバイトを受信しました。
Dim InString As String
Buffer = MSComm1.Input
InString = StrConv(Buffer, vbUnicode)
StringSet InString
' エラー
Case comEventBreak ' 中断信号が受信されました。
Case comEventFrame ' フレーム エラーです。
Case comEventOverrun ' データが失われました。
Case comEventRxOver ' 受信バッファがオーバーフローしました。
Case comEventRxParity ' パリティ エラーです。
Case comEventTxFull ' 送信バッファがいっぱいです。
Case comEventDCB ' デバイス コントロール ブロック (DCB)
' が取得される予期しないエラーです。
' イベント
Case comEvCD ' CD ラインの状態が変化しました。
Case comEvCTS ' CTS ラインの状態が変化しました。
Case comEvDSR ' DSR ラインの状態が変化しました。
Case comEvRing ' リング インジケータの状態が変化しました。
Case comEvSend ' 送信バッファに SThreshold プロパティで指定された
' 数のバイトが入っています。
Case comEvEOF ' 入力ストリーム内に EOF 文字が検出されました。
End Select
End Sub
'一行完成したら処理する
Private Sub StringSet(str As String)
Static gpsbuf As String
Dim c As String, n As Long
n = 1
Do
c = Mid(str, n, 1)
gpsbuf = gpsbuf + c
'Text2.Text = gpsbuf
n = n + 1
If c = Chr$(10) Then
LineCheck gpsbuf
gpsbuf = ""
End If
If c = "" Then Exit Do
Loop
End Sub
'一行チェック
Private Sub LineCheck(str As String)
Dim command As String, data(10) As String
Dim n As Integer, pos As Integer
Dim lat As Double, lon As Double
Dim Command2 As Variant
Dim gpsdtN(20) As Variant '緯度
Dim gpsnoN(20) As String
Dim gpsdtE(30) As Variant '経度
Dim gpsnoE(30) As String
Dim gpsnoNfm As String '緯度表示
Dim gpsnoEfm As String '経度表示
Dim i As Integer
Dim test1 As String
test1 = StrConv("$GPGGA", vbUnicode)
command = StrToken(str, ",")
Command2 = Mid(command, 2, 12)
Select Case Command2
Case test1
'Text1.Text = command2 'str
pos = Len(command) + 2
For n = 0 To 4
data(n) = StrToken("", ",")
pos = pos + Len(data(n)) + 1
Next
' If data(1) <> "" Or data(3) <> "" Then
' If data(2) = "N" Then lat = ConvLonLat(data(1))
' If data(4) = "E" Then lon = ConvLonLat(data(3))
' 'MapDisp lat, lon
' End If
End Select
'Printer.ScaleMode = 4
'orm1.CurrentX = 0
'Form1.CurrentY = 1000
'Form1.FontSize = 20
'Print "緯度 " & "N" & data(1)
'Print "経度 " & "E" & data(3)
'Form1.CurrentX = 0
'Form1.CurrentY = 1800
If data(1) <> "" Then
For i = 1 To Len(data(1))
gpsdtN(i) = Hex(Asc(Mid(data(1), i, 1)))
If gpsdtN(i) = "30" Then
gpsnoN(i) = "0"
ElseIf gpsdtN(i) = "31" Then gpsnoN(i) = "1"
ElseIf gpsdtN(i) = "32" Then gpsnoN(i) = "2"
ElseIf gpsdtN(i) = "33" Then gpsnoN(i) = "3"
ElseIf gpsdtN(i) = "34" Then gpsnoN(i) = "4"
ElseIf gpsdtN(i) = "35" Then gpsnoN(i) = "5"
ElseIf gpsdtN(i) = "36" Then gpsnoN(i) = "6"
ElseIf gpsdtN(i) = "37" Then gpsnoN(i) = "7"
ElseIf gpsdtN(i) = "38" Then gpsnoN(i) = "8"
ElseIf gpsdtN(i) = "39" Then gpsnoN(i) = "9"
'ElseIf gpsdtN(i) = "2E" Then gpsnoN(i) = "."
Else:
End If
Next i
gpsnoNfm = gpsnoN(1) & gpsnoN(2) & gpsnoN(3) & gpsnoN(4) & gpsnoN(5) & gpsnoN(6) & gpsnoN(7) & gpsnoN(8) & gpsnoN(9) & gpsnoN(10) _
& gpsnoN(11) & gpsnoN(12) & gpsnoN(13) & gpsnoN(14) & gpsnoN(15) & gpsnoN(16) & gpsnoN(17) & gpsnoN(18) & gpsnoN(19)
Text1.Text = Format(gpsnoNfm, "@@°@@'@@.@@")
End If
i = 0
If data(3) <> "" Then
For i = 1 To Len(data(3))
gpsdtE(i) = Hex(Asc(Mid(data(3), i, 1)))
If gpsdtE(i) = "30" Then
gpsnoE(i) = "0"
ElseIf gpsdtE(i) = "31" Then gpsnoE(i) = "1"
ElseIf gpsdtE(i) = "32" Then gpsnoE(i) = "2"
ElseIf gpsdtE(i) = "33" Then gpsnoE(i) = "3"
ElseIf gpsdtE(i) = "34" Then gpsnoE(i) = "4"
ElseIf gpsdtE(i) = "35" Then gpsnoE(i) = "5"
ElseIf gpsdtE(i) = "36" Then gpsnoE(i) = "6"
ElseIf gpsdtE(i) = "37" Then gpsnoE(i) = "7"
ElseIf gpsdtE(i) = "38" Then gpsnoE(i) = "8"
ElseIf gpsdtE(i) = "39" Then gpsnoE(i) = "9"
'ElseIf gpsdtE(i) = "2E" Then gpsnoE(i) = "."
Else:
End If
Next i
gpsnoEfm = gpsnoE(1) & gpsnoE(2) & gpsnoE(3) & gpsnoE(4) & gpsnoE(5) & gpsnoE(6) & gpsnoE(7) & gpsnoE(8) & gpsnoE(9) & gpsnoE(10) _
& gpsnoE(11) & gpsnoE(12) & gpsnoE(13) & gpsnoE(14) & gpsnoE(15) & gpsnoE(16) & gpsnoE(17) & gpsnoE(18) & gpsnoE(19) & gpsnoE(20)
Text2.Text = Format(gpsnoEfm, "@@@°@@'@@.@@")
End If
If Command2 = test1 Then Text3.Text = ""
Text3.Text = Text3.Text & Buffer
'Form1.CurrentX = 0
'Form1.CurrentY = 2200
'For i = 1 To Len(data(3))
' Print Hex(AscW(Mid(data(3), i, 1))); " ";
'Next i
'Form1.CurrentX = 0
'Form1.CurrentY = 3000
'For i = 1 To Len(data(1))
' Print Hex(AscW(Mid(data(1), i, 1))); " ";
'Next i
'Form1.CurrentX = 0
'Form1.CurrentY = 3700
'For i = 1 To Len(data(1))
' Print AscB(Mid(data(1), i, 1)); " ";
'Next i
End Sub
'文字列の切り出し
Private Function StrToken(str As String, sep As String)
Static tokenbuf As String
Dim c As String
Dim n As Integer, token As String
If str = "" Then str = tokenbuf
c = ""
n = 1
Do
c = Mid(str, n, 1)
n = n + 1
If c = sep Or c = "" Then
StrToken = token
tokenbuf = Mid(str, n)
Exit Do
End If
token = token & c
Loop
End Function
'Private Function latlon(pos As Double)
' Dim t1 As Integer, t2 As Integer, t3 As Integer, t4 As Integer
' Dim s As Long
'
'
' t1 = pos \ 3600000
' s = pos Mod 3600000
'
' t2 = s \ 60000
' s = s Mod 60000
'
' t3 = s \ 1000
' t4 = s Mod 1000
'
' latlon = Format(t1) + "." + Format(t2) + "." + Format(t3) + "." + Format(t4)
'
'End Function
・ZIG-100Bの設定方法について。(ワイヤレスシリアル送信機)
設定をするためには通信ソフト(Tera Term Pro)が必要です。このソフトはフリーのため簡単にダウンロードができます。
Tera Term (Pro) を使い下記の写真の操作段階を踏んでZIG-100Bの双方の通信速度(私の場合9800bps)に合わせ双方のDest.Addr: に相手のMy IDを入力すれば1対1(Peer to Peer)で使えます。
※設定データ送信速度が57600bpsに合わせるのを忘れずにして下さい。後、設定用コマンド「!」(半角英数字)の送信するタイミングはリセットボタンを押してから60ms以内に送信しなければなりません。この絶妙なタイミングを見計らって受信が成功するまで(私の場合は3〜8回で成功します)チャレンジしてみて下さい。
・GPSにZig-100Bを使った回路図です。
二足歩行の行動範囲が狭いものにはあまり意味がなさそうですが、車輪(タイヤやキャタピラ等)による移動が可能な行動範囲の広いものに付けて自律走行させるのに使えそうです。(これに関しては資金面で苦しいので直ぐには実現できそうもありません。3ヵ年計画のプランで思案中)
※ポータブルナビとしても使いますので「おでかけ、旅」のカテゴリーで紹介していきます。
・測位表示のプログラムはVisual Basic6.0で作成しています。
※下記のプログラムで使用していないコードも多くありますが、下手なプログラムでゴメンなさい。このプログラムを使って多くの方の創作活動に役立てれば幸いです。
''*************************************
'* GPSテストプログラム *
'*************************************
'
'
Option Explicit
Dim Buffer As Variant
Private Sub Command2_Click()
If MSComm1.PortOpen = True Then '(9)シリアルポートのオープン
MSComm1.PortOpen = False
End If
End Sub
Private Sub Command3_Click()
End
End Sub
'RS−232C初期化
'
Private Sub Form_Load()
Dim InString As String ' 入力文字列用バッファ。
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Form1.Caption = "測位表示テストプログラム"
Command1.Caption = "通信開始"
Command2.Caption = "通信停止"
Command3.Caption = "終了"
MSComm1.CommPort = 2 ' COM2 を使用します。
MSComm1.InputLen = 0 ' Input プロパティ使用時に、バッファ全体を読み取るように設定します。
MSComm1.Settings = "9600,N,8,1" ' 9600bps、パリティなし、データ長 8 ビット、およびストップ ビット長 1。
MSComm1.RThreshold = 1 '(7)1バイト受信毎にOnCommイベント発生
MSComm1.SThreshold = 1
End Sub
Private Sub Command1_Click() '(8)Command1のクリックイベントプロシージャ
If MSComm1.PortOpen = False Then '(9)シリアルポートのオープン
MSComm1.PortOpen = True
End If
End Sub
'終了処理
Private Sub Form_Unload(Cancel As Integer)
End
End Sub
' 指定された位置(緯度経度)で地図表示。
'Private Sub MapDisp(lat As Double, lon As Double)
' lat = lat * 3600 * 1000
' lon = lon * 3600 * 1000
'
' strlon.Text = "E " + latlon(lon)
' strlat.Text = "N " + latlon(lat)
' ProAtlasCtrl1.SetCenterCircle lat, lon
' ProAtlasCtrl1.MoveTo lat, lon, 1, 0
' ProAtlasCtrl1.DrawCenterCircle = True
'End Sub
'緯度経度のテキストデータを実数値に変換。
'
'Function ConvLonLat(data As String) As Double
'
' Dim t1 As Double, t2 As Double
'
' Dim s1 As String, s2 As String
'
' s1 = StrToken(data, ".")
' s2 = StrToken("", "")
' t1 = Val(s1)
' t2 = Val("." + s2) * 60
' ConvLonLat = (t1 \ 100) + (t1 Mod 100) / 60 + (t2 / 3600)
'
'End Function
'シリアルコミニケーションイベント処理
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive ' RThreshold プロパティで指定された数のバイトを受信しました。
Dim InString As String
Buffer = MSComm1.Input
InString = StrConv(Buffer, vbUnicode)
StringSet InString
' エラー
Case comEventBreak ' 中断信号が受信されました。
Case comEventFrame ' フレーム エラーです。
Case comEventOverrun ' データが失われました。
Case comEventRxOver ' 受信バッファがオーバーフローしました。
Case comEventRxParity ' パリティ エラーです。
Case comEventTxFull ' 送信バッファがいっぱいです。
Case comEventDCB ' デバイス コントロール ブロック (DCB)
' が取得される予期しないエラーです。
' イベント
Case comEvCD ' CD ラインの状態が変化しました。
Case comEvCTS ' CTS ラインの状態が変化しました。
Case comEvDSR ' DSR ラインの状態が変化しました。
Case comEvRing ' リング インジケータの状態が変化しました。
Case comEvSend ' 送信バッファに SThreshold プロパティで指定された
' 数のバイトが入っています。
Case comEvEOF ' 入力ストリーム内に EOF 文字が検出されました。
End Select
End Sub
'一行完成したら処理する
Private Sub StringSet(str As String)
Static gpsbuf As String
Dim c As String, n As Long
n = 1
Do
c = Mid(str, n, 1)
gpsbuf = gpsbuf + c
'Text2.Text = gpsbuf
n = n + 1
If c = Chr$(10) Then
LineCheck gpsbuf
gpsbuf = ""
End If
If c = "" Then Exit Do
Loop
End Sub
'一行チェック
Private Sub LineCheck(str As String)
Dim command As String, data(10) As String
Dim n As Integer, pos As Integer
Dim lat As Double, lon As Double
Dim Command2 As Variant
Dim gpsdtN(20) As Variant '緯度
Dim gpsnoN(20) As String
Dim gpsdtE(30) As Variant '経度
Dim gpsnoE(30) As String
Dim gpsnoNfm As String '緯度表示
Dim gpsnoEfm As String '経度表示
Dim i As Integer
Dim test1 As String
test1 = StrConv("$GPGGA", vbUnicode)
command = StrToken(str, ",")
Command2 = Mid(command, 2, 12)
Select Case Command2
Case test1
'Text1.Text = command2 'str
pos = Len(command) + 2
For n = 0 To 4
data(n) = StrToken("", ",")
pos = pos + Len(data(n)) + 1
Next
' If data(1) <> "" Or data(3) <> "" Then
' If data(2) = "N" Then lat = ConvLonLat(data(1))
' If data(4) = "E" Then lon = ConvLonLat(data(3))
' 'MapDisp lat, lon
' End If
End Select
'Printer.ScaleMode = 4
'orm1.CurrentX = 0
'Form1.CurrentY = 1000
'Form1.FontSize = 20
'Print "緯度 " & "N" & data(1)
'Print "経度 " & "E" & data(3)
'Form1.CurrentX = 0
'Form1.CurrentY = 1800
If data(1) <> "" Then
For i = 1 To Len(data(1))
gpsdtN(i) = Hex(Asc(Mid(data(1), i, 1)))
If gpsdtN(i) = "30" Then
gpsnoN(i) = "0"
ElseIf gpsdtN(i) = "31" Then gpsnoN(i) = "1"
ElseIf gpsdtN(i) = "32" Then gpsnoN(i) = "2"
ElseIf gpsdtN(i) = "33" Then gpsnoN(i) = "3"
ElseIf gpsdtN(i) = "34" Then gpsnoN(i) = "4"
ElseIf gpsdtN(i) = "35" Then gpsnoN(i) = "5"
ElseIf gpsdtN(i) = "36" Then gpsnoN(i) = "6"
ElseIf gpsdtN(i) = "37" Then gpsnoN(i) = "7"
ElseIf gpsdtN(i) = "38" Then gpsnoN(i) = "8"
ElseIf gpsdtN(i) = "39" Then gpsnoN(i) = "9"
'ElseIf gpsdtN(i) = "2E" Then gpsnoN(i) = "."
Else:
End If
Next i
gpsnoNfm = gpsnoN(1) & gpsnoN(2) & gpsnoN(3) & gpsnoN(4) & gpsnoN(5) & gpsnoN(6) & gpsnoN(7) & gpsnoN(8) & gpsnoN(9) & gpsnoN(10) _
& gpsnoN(11) & gpsnoN(12) & gpsnoN(13) & gpsnoN(14) & gpsnoN(15) & gpsnoN(16) & gpsnoN(17) & gpsnoN(18) & gpsnoN(19)
Text1.Text = Format(gpsnoNfm, "@@°@@'@@.@@")
End If
i = 0
If data(3) <> "" Then
For i = 1 To Len(data(3))
gpsdtE(i) = Hex(Asc(Mid(data(3), i, 1)))
If gpsdtE(i) = "30" Then
gpsnoE(i) = "0"
ElseIf gpsdtE(i) = "31" Then gpsnoE(i) = "1"
ElseIf gpsdtE(i) = "32" Then gpsnoE(i) = "2"
ElseIf gpsdtE(i) = "33" Then gpsnoE(i) = "3"
ElseIf gpsdtE(i) = "34" Then gpsnoE(i) = "4"
ElseIf gpsdtE(i) = "35" Then gpsnoE(i) = "5"
ElseIf gpsdtE(i) = "36" Then gpsnoE(i) = "6"
ElseIf gpsdtE(i) = "37" Then gpsnoE(i) = "7"
ElseIf gpsdtE(i) = "38" Then gpsnoE(i) = "8"
ElseIf gpsdtE(i) = "39" Then gpsnoE(i) = "9"
'ElseIf gpsdtE(i) = "2E" Then gpsnoE(i) = "."
Else:
End If
Next i
gpsnoEfm = gpsnoE(1) & gpsnoE(2) & gpsnoE(3) & gpsnoE(4) & gpsnoE(5) & gpsnoE(6) & gpsnoE(7) & gpsnoE(8) & gpsnoE(9) & gpsnoE(10) _
& gpsnoE(11) & gpsnoE(12) & gpsnoE(13) & gpsnoE(14) & gpsnoE(15) & gpsnoE(16) & gpsnoE(17) & gpsnoE(18) & gpsnoE(19) & gpsnoE(20)
Text2.Text = Format(gpsnoEfm, "@@@°@@'@@.@@")
End If
If Command2 = test1 Then Text3.Text = ""
Text3.Text = Text3.Text & Buffer
'Form1.CurrentX = 0
'Form1.CurrentY = 2200
'For i = 1 To Len(data(3))
' Print Hex(AscW(Mid(data(3), i, 1))); " ";
'Next i
'Form1.CurrentX = 0
'Form1.CurrentY = 3000
'For i = 1 To Len(data(1))
' Print Hex(AscW(Mid(data(1), i, 1))); " ";
'Next i
'Form1.CurrentX = 0
'Form1.CurrentY = 3700
'For i = 1 To Len(data(1))
' Print AscB(Mid(data(1), i, 1)); " ";
'Next i
End Sub
'文字列の切り出し
Private Function StrToken(str As String, sep As String)
Static tokenbuf As String
Dim c As String
Dim n As Integer, token As String
If str = "" Then str = tokenbuf
c = ""
n = 1
Do
c = Mid(str, n, 1)
n = n + 1
If c = sep Or c = "" Then
StrToken = token
tokenbuf = Mid(str, n)
Exit Do
End If
token = token & c
Loop
End Function
'Private Function latlon(pos As Double)
' Dim t1 As Integer, t2 As Integer, t3 As Integer, t4 As Integer
' Dim s As Long
'
'
' t1 = pos \ 3600000
' s = pos Mod 3600000
'
' t2 = s \ 60000
' s = s Mod 60000
'
' t3 = s \ 1000
' t4 = s Mod 1000
'
' latlon = Format(t1) + "." + Format(t2) + "." + Format(t3) + "." + Format(t4)
'
'End Function
・ZIG-100Bの設定方法について。(ワイヤレスシリアル送信機)
設定をするためには通信ソフト(Tera Term Pro)が必要です。このソフトはフリーのため簡単にダウンロードができます。
Tera Term (Pro) を使い下記の写真の操作段階を踏んでZIG-100Bの双方の通信速度(私の場合9800bps)に合わせ双方のDest.Addr: に相手のMy IDを入力すれば1対1(Peer to Peer)で使えます。
※設定データ送信速度が57600bpsに合わせるのを忘れずにして下さい。後、設定用コマンド「!」(半角英数字)の送信するタイミングはリセットボタンを押してから60ms以内に送信しなければなりません。この絶妙なタイミングを見計らって受信が成功するまで(私の場合は3〜8回で成功します)チャレンジしてみて下さい。
・GPSにZig-100Bを使った回路図です。
2008年6月1日(日) at 10:33
ロボット製作編2008年5月25日: 『週刊 ロボザック』 の定期購読の再開! / ロボチャン
日記・その他 > 2足歩行ロボット製作編
音声認識ボードが出るのは知っていましたが、股関節の動作パーツが登場するとは知りませんでした。定期購読を再開し、レベルアップした二足歩行を完成させたいと思います。
71号から再開、明日、書店に申し込みに行ってきます
2008年5月25日(日) at 22:36
2008年5月25日 ポータブルナビ製作編その4:GPSとZig-100Bの電源ボードのスリム化 / ロボチャン
おでかけ・旅 > ポータブルナビの製作編
GPS電源ボードのスリム化とパソコン側のZig-100Bの電源をUSBの5Vから供給をすることによりACアダプターが不必要になり更にスリム化ができました。
※スリム化実施の前
※スリム化実施の後(かなりスッキリしたのが分かります。)
※スリム化実施の前の写真にACアダプター本体が写っていませんが、コネクターの電源ケーブルがUSB・RS232C変換機から出ているのが分かると思います。
※Zig-100Bはロボットにも使えますが、使用中のAKU-67の方が送信距離が長いです。しかし、データ送信量とスピードは断然Zig-100Bが上です(GPSの様なデータ量が多いものに適すると思います)。ロボットのコマンド送信程度であればAKU-67で充分と思いますが・・・それに安いし面倒な設定もありません。
コマンド送信のレスポンスにどれだけこだわるかですが、私の場合は格闘ロボットの様な敏速な反応は必要としませんから不便(遅い)と思ったことはありません。ただ、送信距離が長くれば長い程、好ましいという感じです。
※スリム化実施の前の写真にACアダプター本体が写っていませんが、コネクターの電源ケーブルがUSB・RS232C変換機から出ているのが分かると思います。
※Zig-100Bはロボットにも使えますが、使用中のAKU-67の方が送信距離が長いです。しかし、データ送信量とスピードは断然Zig-100Bが上です(GPSの様なデータ量が多いものに適すると思います)。ロボットのコマンド送信程度であればAKU-67で充分と思いますが・・・それに安いし面倒な設定もありません。
コマンド送信のレスポンスにどれだけこだわるかですが、私の場合は格闘ロボットの様な敏速な反応は必要としませんから不便(遅い)と思ったことはありません。ただ、送信距離が長くれば長い程、好ましいという感じです。
2008年5月25日(日) at 05:00
2008年5月20日 ポータブルナビ製作編その3:GPSとパソコンをワイヤレス化 / ロボチャン
おでかけ・旅 > ポータブルナビの製作編
一時は通信が無理とあきらめていましたが、調整2日目でアッサリ通信ができました。原因は簡単なミス(RS232Cインターフェイスを使用した事が原因です。電圧レベルが一緒なので使う必要がないということです。)。GPSとZig-100BのTxD、RxDを直接繋ぐことで使用できました。
テスト中の動画です。
テスト中の動画です。
2008年5月20日(火) at 22:58
2008年5月19日 ポータブルナビ製作編その2:GPSとパソコンをワイヤレス化 / ロボチャン
おでかけ・旅 > ポータブルナビの製作編
ZIG-100BによるRS232Cのワイヤレス通信ができる状態になりました。しかし、文字化けでうまくいきません。
通信スピードの設定を9800bpsに統一はしたもののダメ。通信はできるが文字化けの原因究明に時間が掛かりそう。
(今回の原因はお手上げかもしれません。ワイヤレス化ができなかったらごめんなさい。)
※GPSとワイヤレス通信モジュール(ZIG-100B)
※無線によるGPS測位データの文字化け。
※有線によるGPS測位データの正常コード。
通信スピードの設定を9800bpsに統一はしたもののダメ。通信はできるが文字化けの原因究明に時間が掛かりそう。
※無線によるGPS測位データの文字化け。
※有線によるGPS測位データの正常コード。2008年5月19日(月) at 21:17
2008年5月18日 旅の記録その1(四万十川) / ロボチャン
おでかけ・旅 > ポータブルナビの製作編
久々の投稿です。ごぶさたしてました。5月の連休を利用し、家族にせがまれ四万十川まで2泊3日のキャンプに行ってきました。
製作中のGPSとモバイルPCのワイヤレス化が資金繰り面で難航しており停滞しております。そのため、今回の旅では紹介できず、残念です。
気をとり直し、四万十川の紹介をしたいと思います。
下の写真がキャンプ場前の四万十川です。
※四万十川
※キャンプ場です。
※利用者が少なく周りには3張り程度の利用者しかいませんでした。
ちなみに近くのかわらっこキャンプ場は満杯でした。
大きな地図で見る
※通称、沈下橋(橋の上からダイブするところでも有名です。)
※沈下橋から四万十川にダイブしているところ。
※カヌー教室(かわらっこ主催)
2日目は足摺岬に行ってきました。
※足摺岬です。
※キャンプ場から40km位の距離でした。
大きな地図で見る
3日目の最終日は坂本龍馬記念館、桂浜に寄り瀬戸大橋を通過して帰りました。
※坂本龍馬の銅像
※記念館から歩いて10分程度です。桂浜です。
※与島サービスエリアからの瀬戸大橋
※与島SAからの夕日
製作中のGPSとモバイルPCのワイヤレス化が資金繰り面で難航しており停滞しております。そのため、今回の旅では紹介できず、残念です。
気をとり直し、四万十川の紹介をしたいと思います。
下の写真がキャンプ場前の四万十川です。
※四万十川
※キャンプ場です。
※利用者が少なく周りには3張り程度の利用者しかいませんでした。
ちなみに近くのかわらっこキャンプ場は満杯でした。
大きな地図で見る
※通称、沈下橋(橋の上からダイブするところでも有名です。)
※沈下橋から四万十川にダイブしているところ。
※カヌー教室(かわらっこ主催) 2日目は足摺岬に行ってきました。
※足摺岬です。 ※キャンプ場から40km位の距離でした。
大きな地図で見る
3日目の最終日は坂本龍馬記念館、桂浜に寄り瀬戸大橋を通過して帰りました。
※坂本龍馬の銅像
※記念館から歩いて10分程度です。桂浜です。
※与島サービスエリアからの瀬戸大橋
※与島SAからの夕日 2008年5月18日(日) at 22:57
2008年5月1日 ポータブルナビ製作編:GPSとパソコンをワイヤレス化 / ロボチャン
おでかけ・旅 > ポータブルナビの製作編
・ロボット製作から始まりコンパスモジュールの代わりとしてGPSを購入したきっかけが、意外な展開となりました。
ロボット製作のブログですが、GPSに関しても非常に興味をもちましたのでGPSも平行して投稿していきます。(ロボットに関してちょっとおろそかになりますが、ご了承下さい。)
・GPS製作の今後の展開。
-GPSとPCのワイヤレス化-
Bluetooth(ブルートゥース)かZigBee(ジグビー)の安価の方でワイヤレス化を進めたいと思います。
※AKU-67無線ユニット(ロボットの無線操作用)の仕様上(通信スピードに問題あり)使用できないことが分かりました。
途中での内容変更をすることにご理解下さい。
-PCをディスクトップからモバイルPCに変更する-
モバイルにすることで初めてGPSを持って移動できます。ロボット操作も最終的にモバイル操作ができるように考えています。ワイヤレス化したGPSはバックパックに入れるか、コンパクト化ができれば帽子のポケットにでも入れておいてモバイルPCにケーブルが付かないフリーな状態で移動できれば最高ですね。
ロボット製作のブログですが、GPSに関しても非常に興味をもちましたのでGPSも平行して投稿していきます。(ロボットに関してちょっとおろそかになりますが、ご了承下さい。)
・GPS製作の今後の展開。
-GPSとPCのワイヤレス化-
Bluetooth(ブルートゥース)かZigBee(ジグビー)の安価の方でワイヤレス化を進めたいと思います。
※AKU-67無線ユニット(ロボットの無線操作用)の仕様上(通信スピードに問題あり)使用できないことが分かりました。
途中での内容変更をすることにご理解下さい。
-PCをディスクトップからモバイルPCに変更する-
モバイルにすることで初めてGPSを持って移動できます。ロボット操作も最終的にモバイル操作ができるように考えています。ワイヤレス化したGPSはバックパックに入れるか、コンパクト化ができれば帽子のポケットにでも入れておいてモバイルPCにケーブルが付かないフリーな状態で移動できれば最高ですね。


