2018年10月
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      

カテゴリー

ブログパーツ

無料ブログはココログ

« 2012年12月 | トップページ | 2013年2月 »

2013年1月

2013年1月31日 (木)

PICとXBee WiFiでツィートしてみる(その3)

花岡ちゃんのウィークエンド:ツィートガジェットの実験

今回はphpからツィートする実験です。相変わらず他人のナントカで相撲をとる流儀なので… こちらのページをご覧ください。すべて出来上がっています。(ありがとうございました!)

ツィートphpはXAMPPなどのlocalhostサーバに置くとエラーになります。OAuth認証でエラーが出るようなので、外部サーバが参照できないからではないかと思います。そのため、ネット上のレンタルサーバに置いて実験します。このphpにブラウザでアクセスするとツィートします。Twitterは同じ内容の連続投稿を受け付けないので、2回目のテストはphpを編集して投稿内容を変更する必要があります。

気をつけなければいけないのは、日本語をツィートする場合、文字コードをUTF-8にしないと投稿できないことです。phpを編集する際、エディタの文字コードをUTF-8に設定しておけば問題ありません。

さあ、ここまでくれば、前の投稿で試したファイルアップロードphpと、このツィートphpを合体させればよい訳です。出来上がりがこれです。
「twbot.zip」をダウンロード

このディレクトリのup.phpに自分のツィッター投稿用の4つの暗号を書き込み、サーバの任意のディレクトリにアップします。今回のPICのコードはこれがドメイン直下にあるという前提で書いているので、そこに置くのがおすすめです。
up.phpはアップロードされたデータをtw.txtに保存し、これをツィートします。ファイルを保存する必要はありませんが、うまくツィートされないときなどアップされたデータを確認できるので、このほうが便利です。

これで準備完了。次回、PICのプログラムから投稿してみます。
待ちきれない向きは、前回やった「手動でアップロード」でヘッダのphpの指定を"/twbot/up.php"に変更、アップロードしてみてください。Thanks!!とツィートされるでしょう。

2013年1月30日 (水)

PICとXBee WiFiでツィートしてみる(その2)

花岡ちゃんのウィークエンド:ツィートガジェットの実験

今回はXBee WiFiとX-CTUでウェブサーバーにアクセスしてみます。つまりHTTPでの通信方法を手動で確認しておこうという訳です。HTTPの解説はいろいろありますが、このページがそのものズバリでわかりやすいでしょう。
サーバからファイルをGETしています。Webページのフォームに書き込んだ文字列をテキストファイルに落とし、コレを周期的にGETすることで、XBee WiFiを使ったガジェットに命令を送ることが出来ます。以前試作した猫のぞきカメラで撮影コマンドを送るにはこの方法を使っています。

なお、自分のドメインのipアドレスは、WindowsのコマンドプロンプトやMacのターミナルから
 nslookup ドメイン名(yahoo.co.jpなど)
とやると、調べることが出来ます。

上の例はブラウザのように特定のファイルを読み出すやり方ですが、Xbee WiFiからサーバへツイート内容などをアップロードしたいときには、データをアップロード用のphpプログラムに"POST"します。POSTするにはこのような文字列を送ります。

POST /u.php HTTP/1.1
Host: example.com
Content-Type: multipart/form-data; boundary=---------------------------7dc3801415811aa
Connection: Keep-Alive
Content-Length: 194

-----------------------------7dc3801415811aa
Content-Disposition: form-data; name="upfile"; filename="tw.txt"
Content-Type: text/plain

Thanks!!
-----------------------------7dc3801415811aa--

ホスト(ドメイン)名example.comは架空のものです。試す場合は自分のドメイン名に直してください。空行から上の部分をヘッダ、下の部分をボディと呼びます。ボディに送信するデータ、この場合は文字列"Thanks!!"を入れます。アップロードしたデータはphpプログラムでtw.txtというテキストファイルに保存します。コレを行うu.phpは下記からダウンロードし、FTPで自分のサーバのドメイン直下に置いてください。
「u.php」をダウンロード

このHTTPリクエストをX-CTUから送信すると下記のようになります。

Uptest_2

最後の方の"ok"がphpからの正常終了のメッセージです。ngの場合は受信されていません。HTTPリクエストの内容とContent-Lengthのバイト数を見直してください。

ヘッダー部分のboundaryはボディのはじめと終わりを示す文字列で、送信データに現れそうも無い文字列にする必要があります。
大事なのがContent-Lengthでボディのバウンダリ文字列の最初から最後までのCR、LFを含むバイト数です。つまり下記の部分のバイト数です。

(ここから→)-----------------------------7dc3801415811aa
Content-Disposition: form-data; name="upfile"; filename="tw.txt"
Content-Type: text/plain

Thanks!!
-----------------------------7dc3801415811aa--(←ここまで)

これが正しくないとエラーになったり途中で止まったりしてしまいます。実際のデータ転送ではThanksの部分を任意のデータに変えて送る訳ですが、送る前にボディのバイト数を計算してヘッダに記載する必要があります。

次回はphpでツィートの実験をします。


2013年1月29日 (火)

PICとXBee WiFiでツィートしてみる(その1)

花岡ちゃんのウィークエンド:ツィートガジェットの実験

XBee WiFiを使うとPICからでもインターネットにアクセスできます。以前普通のXbeeで試した猫のぞきカメラKameroのようにネットとやり取りをする機械は、ネットとの接続にパソコンを使用していましたが、XBee WiFiならばパソコンなしで同じようなことが出来そうです。もっと気軽に使える機械になりそうですね。

そういう訳で、今回のウィークエンドでは、PICとXbee WiFiでツィッターに投稿する機械を作ってみようと思います。ボタンを押すと「ラッキーナンバー」をツィートする電子ガジェットです。試作したモノは実用性も面白みもありませんが、ネット連動のロボットやガジェットをPICで作ってみたい方の参考になるのではと思います。

■ツィートガジェットの概要
試作したのはこんなバラックセットです。マイコン基板はデバック・エクスプレスについてきた16F887の基板、それにブレットボードに搭載したXBee WiFiを接続しただけです。左のマイコン基板のボタンを押すと、「ラッキーナンバー」をツィートします。電源は単三4本と3.3V低損失レギュレータで作っています。電源についてはこちらを参考にしてください。

Dscn2517

システム構成はこのようになっています。ツィッターに投稿するにはOAuth認証が必要で、これをPICに実装するのはハードルが高そうです。そこで今回はレンタルサーバーに置いたphpプログラムでツィッターへの投稿をすることにしました。PICからはツィートしたい内容をこのphpに送ればよいようにします。なお、レンタルサーバはロリポップを使っています。

Xbee_2

次回はXBeeからレンタルサーバへのアクセス方法です。

2013年1月20日 (日)

【昔語り2】紙テープに未来を託そう

アキバ昔語り

今回はちょっと大物です。そう、あの紙テープ装置の登場です。科特隊の隊員や南部博士が目視で読んでいたアレです。

Dscn2461  Dscn2436


そもそも、紙テープに穴をパンチして情報を保存するさん孔テープは、コンピュータ時代以前から電信などの電気通信に使われていましたが、それは一部の専門家が知るところでしかありませんでした。しかし、コンピュータが時代の寵児として脚光を浴びはじめた1950年代ごろから、点滅するランプやラインプリンタとともにコンピュータのシンボルとしてメディアへの露出が増え、不規則に穴のあいたさん孔テープは、一般の人々にも未来的なイメージのアイコンとしてなじみの深いものとなっていったようです。

僕が覚えているのは駄菓子屋で売られていた「電信テープ」です。おそらくは電報かなんかで使用した紙テープ(もちろん何らかのデータがパンチされている!)を直径10センチくらいに巻き、どぶ漬けで赤や青に着色したものです。どうやって遊ぶかは子供に丸投げというものでした。それで積極的に遊んだ記憶はないのですが、読む真似をしたことはありました。「信夫山に怪獣出現!」とかですね。

70年代後半になっても紙テープはまだまだ現役でした。大学の研究室では自前のミニコンを持っているところもあり、そういうところでは、毎朝紙テープからイニシャルブートしていたそうです。
僕は会社勤めをしてから、電卓用マイコンを利用したソフト開発でとある電機メーカーに出向した際、初めて紙テープに触れました。当時の開発環境はメインフレームにリモート端末でアクセスしてアセンブラを使い、結果の紙テープとプリントアウトを電算室までもらいにいくというものでした。紙テープをミナトエレクトロニクスのPROMライターにかけて2716とかに書いてようやく試作機が動くという、まことにまどろっこしいもので、1日に7〜8回修正コードを出すのが精一杯でした。

それより少し前、学生時代にはマイコン用のBASICやアセンブラが紙テープで販売されていましたが、肝心のリーダパンチャーが高価で僕には縁のないものでした。ちなみに中古品でリーダが8K円くらい、パンチャーが18K円くらいだったと思います。これを手に入れたとしても、自作マイコンにあわせたインターフェイスやら電源やらを作らなければなりません。今と違ってインターネットで簡単に調べることもできませんから、アマチュアがいきなり挑戦してうまく使えたかどうかは疑問です。
とはいえ、一度は使ってみたいモノではあるわけで、以前ヤフオクで入手したNC用の紙テープ装置をパソコンに接続して動かしてみることにしました。

その紙テープ装置はRS232Cで加工機に接続するタイプですが、マニュアルが一切無く、どんなコマンドを送ればいいのかまったくわかりません。色々やってみましたが、うんともすんとも言いません。電源を入れてフィードボタンを押すとテープがフィードされるので機械としては一応動くみたいです… それではということで、もっと聞き分けのいい制御装置を新たに作ることにしました。まあなんとかなるっしょという軽い気持ちで始めたのですが、さすがそうは簡単にいかず、メカのオーバーホールも含めると1ヶ月近くの大プロジェクトになってしまいました。詳細をお話しするには紙幅も足りないし、あまり興味の無いところでしょうから、改造した中身の写真を示すにとどめます。

Dscn2457

ベークの基板がPIC16F887で自作した制御装置です。もともとそこにあったオリジナルの基板はジャンク箱行き、電源部だけを使用しました。動作の様子は動画でご覧ください。

動くとさすがに壮観です。現在の機械にはない男らしさがありますね。

さて、これの使い道ですが… なにか昔のマイコンを作ってブートローダーを動かしてみましょうか? あまり前向きの使い方は思いつきません。
ただ、一説によると磁気媒体や光媒体よりも紙媒体の方が長期の保存に耐えるという話も聞きます。現代詩の愛好家でもある僕としては、千年先の究極的にディジタル化した人類のため、すばらしい詩作品を文字ではなく紙テープに託すというのもアリかなと思います。もっとも正倉院に保存してもらえれば、ですが。

2013年1月17日 (木)

ここらでスピードアップ!

ROSさんお手やわらかに:ROS入門編

あまりチンタラやっていると飽きてきそうなので、ここらでスピードアップする。

■「サービス」と「パラメータ」
「サービス」はcなどの関数呼び出しみたいなもの。目的のノードの特定のサービスをコールすると、例えば初期化したり、何かを計算して値を返すことなどが出来る。発行と引用との違いは、直接相手のノードに働きかけることだ。サービスを要求するとすぐさまレスポンスするので、タイミングが重要な、移動コマンドなどには有効ではないか。発行と引用はセンサの値を渡したりするのにむいているのかも知れない。
パラメータは共用メモリのようなもの。数値や文字列を「パラメータサーバ」に書き込んだり読み出したりすることが出来る。グローバル変数みたいな感じだ。発行と引用との違いは内容が書き換わったときに通知がないということか。YAMLマークアップ言語を使っているということだが、これも今はわからない。
これで、サービスとパブリッシュ(発行)/サブスクライブ(引用)とパラメータというノード間通信の基本はおしまい。


■ rqt_consoleとroslunch
rqt_consoleはデバッグコンソールのようだ。使うときに読めばいいので飛ばす。
roslunchはいくつかのノードを定義して実行するバッチのように見える。サンプルでは二つのturtlesimを別々のネームスペースで実行させ、さらにroslunch上で片方のアウトプットを片方のインプットに接続するノードmimicを定義して、全部をいっぺんに起動する。
あらたにノードを定義できるのがミソなのか? コンセプトが良くわからないが、まとまった働きをするシステムを起動するのに必要なのはわかる。


■ rosed ROSファイルを一発オープン
これはroscdなんかと同じで、rosのファイルを指定してエディタを開くコマンド。パスを細かく指定する必要はなく、
rosed [package_name] [filename]
でOK。まあGUIから操作するならあまり恩恵ははないかも。なおデフォルトのエディタはvinだそうだ。


■ msgファイルとsrvファイル
この辺からいよいよパッケージを作るハナシになってくる。
msgとsrvはc言語のプロトタイプ宣言のようなものだ。msgは発行・引用されるメッセージを変数か構造体の形で定義し、srvはサービスを呼び出すときの引数と返り値を定義する。
msgはパッケージディレクトリの直下にmsgというディレクトリをつくり、その中に拡張子が.msgのテキストファイルの形で保存する。例えばPersonというメッセージを定義したければPerson.msgというファイルに(例えば)下記のように記述する。

string first_name
string last_name
uint8 age
uint32 score

忘れてはいけないこと→パッケージディレクトリのCMakeLists.txt をひらいて"# rosbuild_genmsg()"のコメントを外しておくこと。
こうしないとビルドのときにmsgを参照しないようだ。

同様にsrvディレクトリを作り、.srvの拡張子のファイルを作る。内容見本はこんな感じ。

int64 a
int64 b
---
int64 sum

---の前が引数で、後が返り値の定義。チュートリアルにはどこかからコピーして持ってくる方法が書いてある。cpのros版、roscpを使ってる。こういう風にコピーすることも多いのだろうか。
それからsrvもCMakeLists.txtの"# rosbuild_gensrv()"をアンコメントしておかなければならない。

定義したらMakeする。これ↓(パッケージbeginner_tutorialsの場合)
rosmake beginner_tutorials
するとc++,Lisp,Pytonのメッセージハンドラがsrcディレクトリに作成される。


■ここまでのまとめ
チュートリアルのこのページの最後にはまとめがある。

・コマンドのヘルプを見るには → -h をつける

コマンドまとめ

・rospack = ros+pack(age) : provides information related to ROS packages
・rosstack = ros+stack : provides information related to ROS stacks
・roscd = ros+cd : changes directory to a ROS package or stack
・rosls = ros+ls : lists files in a ROS package
・roscp = ros+cp : copies files from/to a ROS package
・rosmsg = ros+msg : provides information related to ROS message definitions
・rossrv = ros+srv : provides information related to ROS service definitions
・rosmake = ros+make : makes (compiles) a ROS package

ようやくコードを書く準備ができた。

2013年1月 9日 (水)

rostopicコマンドあれこれ

ROSさんお手やわらかに:ROS入門編

今回はrostopicコマンドをあれこれを試してみる。チュートリアルページの1.2.2から。このコマンドはトピックを操作をするものだ。

rostopic echoはトピックが発行したり引用したりするメッセージをタイプする。デバッグには必須だ。

rostopic listは発行・引用されている変数をリストする。もっともシンブルに rostopic list -v とやると、現在走っているすべてのトピックの変数(構造体か?)をリストする。

rostopic type でトピックを指定するとその変数の名前を取得できる。(これはlistでもわかる)次に、rosmsg show にこの変数名を与えると、その変数の要素の名前と型を表示する。こんな感じ。

rosmsg show turtlesim/Velocity

float32 linear
float32 angular

つまり、この構造体は移動距離linerと旋回角度angular二つの変数からなっているというわけだ。

これは既存のトピックとメッセージやりとりするプログラムを作る際に便利なのかな?

さて、いよいよコマンドラインからトピックにメッセージを送ってみる。ここまでくるとようやくプログラムが作れるような気になってくる。

rostopic pub -1 /turtle1/command_velocity turtlesim/Velocity -- 2.0 1.8

これはシミュレータの亀に円弧を描いて動くようメッセージを送る。一回のコマンドで一個のメッセージだ。これを実行するとこんなメッセージが現れる。

publishing and latching message for 3.0 seconds

3秒後にまたコマンド入力できるようになるが、何をラッチしているのかは分からない。
(後から考えると、これは3秒間このメッセージを「掲示」しているという意味らしい。つまりこの間にノードはメッセージを取得することになる。取得されるとメッセージはそのノードからは見えなくなるらしい。そうでないと「1回だけ」実行できない。3秒以上経過するとメッセージは自動的に消去される。メッセージが残っていると、思いがけないときに引用され、誤動作につながるかもしれないからだろう。)

周期的に送るにはこんな風にする。毎秒1回円弧を描くコマンドを送る。亀は円を描いて動きつづける。

rostopic pub /turtle1/command_velocity turtlesim/Velocity -r 1 -- 2.0 -1.8

rostopic pub -h でヘルプが出る。他のコマンドはこれを見ればまあ推測できる。
いろいろといじっているうちにコマンドを出しても亀が動かなくなった。こうなってしまうとroscoreを再起動してやり直さないとダメだった。

2013年1月 4日 (金)

ROSコマンドのまとめ

ROSさんお手やわらかに:ROS入門編

この休み中にROS上で動くソフトを製作するのはちょっと無理なようだ。
急がば回れというわけで、今後の作業を円滑に進めるため、主要なROSコマンドをスニペットにまとめておく。これを適時更新していって自前のマニュアルにするつもり。

■新たなワークスペースを作る
rosws init ~/fuerte_workspace /opt/ros/fuerte
#ホームディレクトリの直下にfuerte_workspaceというワークスペースを作る
source ~/fuerte_workspace/setup.bash
#作成したワークスペースを有効にする

■ワークスペースに作業用ディレクトリを作る
mkdir ~/fuerte_workspace/sandbox
rosws set ~/fuerte_workspace/sandbox

■特定のパッケージかスタックを見つける
rospack find turtlebot_node
#turtlebot_nodeパッケージを探し、パスを返す

■ワークスペースに移動する
roscd

■スタックまたはパッケージのディレクトリに移動する
roscd turtlebot_node

■スタックまたはパッケージの内容を表示する
rosls turtlebot_node

■新規パッケージを作る
roscd
cd sandbox
#ワークスペースの目的のディレクトリに移動
roscreate-pkg beginner_tutorials std_msgs rospy roscpp
#beginner_tutorialsというパッケージディレクトリを作る

■パッケージの依存関係の表示
rospack depends1 beginner_tutorials #一時依存の表示
rospack depends beginner_tutorials #すべての依存関係の表示

■ROSのコア部分を起動する
source ~/fuerte_workspace/setup.bash
export ROS_HOSTNAME=localhost
export ROS_MASTER_URI=http://localhost:11311
#以上の初期化をした後で
roscore

■ノード関係
rosnode -h #ヘルプが出るのでそれを見よ
rosrun turtlesim turtlesim_node #パッケージturtlesimのノード?turtlesim_nodeを実行

■トピックとノードの接続関係をグラフィカルに表示
rosrun rqt_graph rqt_graph


2013年1月 3日 (木)

iPhoneでRoombaをリモコン(動画)

花岡ちゃんのウィークエンド:RoombaのWiFiリモコン

先日実験した、iPhoneでRoombaをリモコンする様子の動画を撮りました。
充電ステーションで待機させておくと、ウチの猫がトイレの砂を散らかした時なんかは意外と実用的です。

思いがけないトラブルに見舞われる

ROSさんお手やわらかに:ROS入門編

この正月休みを利用して、なんとか恰好をつけようと思っていたROS入門だが、思いがけないところから横槍が入った。ubuntuをインストールしたThinkPadのトラブルだ。キーボード入力の調子がおかしくなったしまったのだ。
いままでは日本語モードでも英語モードでも普通に使えていたのだが、数文字入力するとキーを打っても表示されなくなり、数秒すると表示されなかった分がいきなり表示されるという現象が発生して、まともに入力できない。

思えば、新年早々、たまっていたアップデートをしたあとに具合が悪くなったように思う。試しに別のキーボードを接続しても同じなので、ノートのキーの故障ではないだろう。ドライバまわりが怪しいが、unixの知識がないのでどうしていいのかわからない。

やむを得ないので、ubuntuのインストールDVDから、自動アップデートなしで再インストールしてみた。ソフト的な問題ならこれで解決するはずだが、状況は変わらない。どうやらそう簡単な問題では無いようだ。

異常に気づいたのは、神田明神の初詣から帰ってきた後だ。出かけるときにはThinkPadはACを接続したままでハイバネーションにいれたはず・・ ハイバネーション?? そういえばハイバネーションにいれたのは初めてだ。ハイバネーションのインジケータが点灯するのを確かめて出かけたっけ・・ まさかね、と、思いながら電源まわりを探ってみると、なんと! ACアダプタを外すと正常に入力できるではないか。ACを接続すると、また入力が途切れ途切れになる。どうやらこれが原因のようだ。

ハイバネーションから覚めきっていないのが原因か。周期的に何かが休止状態になるせいで、連続したキー入力がブツ切れになるようだ。
シャットダウンしてACアダプタとバッテリーを外し暫くおいた後、組み直して立ち上げるとACで正常に動作した。ubuntuではThinkPad T61のハイバネーションはサポートしていないようだ。ふたを閉めてもハイバネーションにならないように設定する必要がありそうだ。まあ、わかってしまえばバッテリーを一回外して再起動すればいいだけだからそんなに気を使わなくてもいいハナシだが。(後日談だが、新たにインストールしたubuntuでは、ハイバネーションはグレーになっていて選べない。僕は確かにハイバネーションを選んだように思うがどうやって選択したのだろう? あるいは勘違いか?)

ともあれ、またぞろROSを再構築しなければならない。

« 2012年12月 | トップページ | 2013年2月 »