goo blog サービス終了のお知らせ 

寝ても覚めてもPSoC

電子工作とマイコンをやりはじめました。
ど素人ですので配信する情報の取り扱いには十分注意してください。

ColdFire(SilentMoonSDK)を使って温度をTwitterに自動送信[LM60]

2011年07月11日 | ColdFire
1年半ほど前、SilentC[InterFace誌付録のColdFire基板です]で定期的にTwitterにつぶやくものを作りました。
しかし、これはBASIC認証を使用しているため、現在では使えません※現在はOAuth認証です。
まぁTwitterが廃れていれば放っておくのですがw大盛況らしいのでなんとかしたい。(僕はあまり利用していませんが...)
そこで、今回はSilent Moon SDKで再びTwitterに温度をつぶやくものを作ります

つぶやくために何が必要かですが、それは以下の2つとなります。
1.クライアントアプリの申請登録
2.シグネチャ用にハッシュ関数(HMAC-SHA1)

1はGoogleにアプリを申請することで、コンシュマーキー、コンシュマーシークレット、アクセストークン、アクセストークンシークレットの4つキーが入手できます。
これらを指定のフォーマットでハッシュ化することで2のシグネチャが生成できます。

この辺は、ここを参照してください。ここ以外は、既存のライブラリ等を使用したりするため、マイコン(MCF52233)環境下ではあまり参考になりませんでした。

さて、つぶやくまでの具体的な手順です。
1.Twitterにログインする
2.下記URLにアクセスしてアプリケーションを登録する
  http://twitter.com/apps/new
  ※Application TypeはClient
  ※Default Access typeはRead & Write
  ※Use Twitter for loginは チェックをつける
3.登録するとコンシュマーキー、シークレットを入手できるので記録しておく
  ※最初に登録した場合、何故かRead属性になっているケースがあるため、アプリケーションの詳細でRead&Writeに設定する
4.Twitter Access Token取得ツールを起動し、キーとシークレットを入れてREQUEST TOKENボタンを押す。
5.ブラウザが起動するので『アプリを認証』を押す
6.PINが表示されるため、ツールにPINを入力してACCESS TOKENの取得ボタンを押す
7.アクセストークン、シークレットを入手できるので記録しておく
8.プログラムソースの以下の定義(#define)内容を記録したものに書き換える
  CONSUMER_KEY
  CONSUMER_SECRET
  ACCESS_TOKEN
  ACCESS_TOKEN_SECRET
9.ビルドしてプログラムを転送し、ExecUser(1)で実行

以上で完了です。



プログラム的には以下のようになっています。
1.送信文字列をURLエンコード
2.時刻を取得するためUNIX TIME APIを使用して取得
3.SHA-1用にキー文字列とベース文字列を作成
4.ハッシュ値を生成
5.ハッシュ値をBASE64でエンコード
6.それをさらにURLエンコードし、シグネチャ完成
7.ヘッダーに組み込んでTwitter APIにOAuthでPOST

さらっと書いていますが、結構苦労しましたwwww
やっている最中は、何度も何度も何度も認証エラーをくらった
これでマイコンだけでTwitterに投稿できます!



回路図です。


配線はシンプルです。LM60と確認用のLEDだけです。
LM60は前にも書きましたが、424mVのDCオフセットをもっていて、そこが0℃になります。それを基準に6.25mV/℃とリニアに変化するため、LM35につづいて簡単に制御できるセンサーです。マイナス温度が測れたり、2.7Vから動作するのもポイント高いです。

ColdFire[MCF52233]

プロジェクトです。(※Twitter Access Token取得ツールを同梱)
Device: ColdFire MFC52233 CQ
IDE : CodeWarrior for ColdFire V7.0
Text : UTF-8
Font : Japanese FONT
ColdFire_twoauth.zip
※MakeColdfireBin.batのIPアドレスを自分の環境に書き換えてください。
※Ver7.2はUTF-8が使えますが、V7.0の場合はIDEでソースを編集しないでください

SilentMoonSDKで電力供給状況を表示する

2011年04月28日 | ColdFire
東京電力が計画停電に伴って電力供給状況のデータをCSVで公開しています。
せっかくなのでこれを使ってみようかと思っても、なかなか扱いにくい形式であったり、データ量が乏しかったり、何かと使いにくい。
すると、ネットのエライ人達が使いやすい形式で提供してくれるようになりました。
そのAPIを利用してLCDに電力供給状況を表示してみようと思いました。

PSoCでやりたいところでしたがPSoCではTCPが使えないので、今回はSilentC...ではなくてSilentMoonSDKでやってみました。(Interface誌2008年9月号付録のColdFire基板です)

使用したAPIは、東京電力電力供給状況API(http://tepco-usage-api.appspot.com/)です。Google検索で一番上に表示されたので。

APIに対してGETすると、JSON形式でデータが取得できます。
SilentMoonSDKにはJSONパーサがないので、前回同様に単純文字列操作で値を取得しました。
LCDは通常のキャラクタLCDでは接続PINが多く面倒なので、シリアル1本で済むSGD-Aを使いました。

そんなこんなで無事、表示できました!
2分毎にAPIを呼んで更新しています。



配線はUTXD0(pin20)をSGD-AのRXに接続します。(9600bps)
コンソール上にもデータを表示するので、LCD(SGD-A)は接続しなくてもOKです。
TeraTermでExecUser(1)で実行できます。

プロジェクトです。
Device: ColdFire MFC52233 CQ
IDE : CodeWarrior for ColdFire V7.0
Text : SHIFT-JIS
Font : Japanese FONT
ColdFire_tepower_20110428.zip
※MakeColdfireBin.batのIPアドレスを自分の環境に書き換えてください。

SilentMoonSDKでネイティブアプリ 完成

2010年02月23日 | ColdFire
”TwitterおみくじBOT for ColdFire”が完成しました!

MakeColdfireBin.batとソースのユーザー名とパスワードを書き換えてビルドし、コンソールでExecUser(1)とすればBOTが起動します。[e]キーで中断しない限り、約2分毎に処理を繰り返します。
Twitterで@ユーザー名付きでメッセージに”おみくじ”と入れて送信すると、運勢を返信してきます。

ビルドの注意点として、文字コードをUTF-8にそろえるためソースファイルもUTF-8となっています。CodeWarriorではUTF-8の設定ができないため(設定する方法があればぜひ教えてください)、ソースの編集はTeraPadで行い、ビルドだけIDEで行います。決して、IDE上でソースの編集を行わないでください。
ColdFire基板単独で動作するので特に配線は必要ありませんが、AN0はどこにも接続しないでください。なぜならば、乱数生成にAN0を使用しているからです。未接続でA/D変換すると出鱈目な数値を返してくるのを(強引に)利用しています

今回SilentMoonSDKでTwitterBOTを作りましたが、作成時に起きた問題点をまとめると以下のようになります。

1.標準ライブラリが少ないので必要なものは自作する必要がある
2.GetNetLine関数は1行取得の使いやすい関数だが254文字までしか受け取れない。255文字以上の場合はカットされる。今回はサンプルのためこの関数を使用したが、長い文字列を取得する必要がある場合は、Read関数とGetReceiveBuffer関数で処理しなければならない。
3.GetNetLine関数に関連するバグに悩まされたが、結局は自分が余計なパラメータを送信していたのが原因だった。疑ってゴメンよ...
4.XMLパーサはまともに作ると大変なので、出力形式が固定であるので単なる文字列処理として簡略化した。出力フォーマットが変更されたら若干修正作業が発生するwww
5.日本語文字の出力は&#nnnnというHTML実体参照形式になる。nnnnはUnicode十進数らしく、これをUTF-8文字列に変換するには、
 code = atoi(nnnn);
 utf8[0] = (BYTE)(0xE0|(code>>12));
 utf8[1] = (BYTE)(0x80|(((code>>8)&0x0f)<<2)|(code>>6)&0x03);
 utf8[2] = (BYTE)(0x80|(code&0x3f));
 utf8[3] = 0;
でOKだった。ここに変換の図が載っています。トン!
6.Twitterメッセージのidが大きすぐる!w 今後どーすんだろ?とりあえず今回は2分割しましたが...

とにかく他のプラットフォームのように文字列関数や数値関数が充実してたり、漢字コード変換も関数一発とはいかないのでこういうのは苦労しますね。とくに僕のようなメモリ大量、高速CPUになれた”ゆとり君”には。変換サーバを通せば楽なんだけど、それじゃー意味ないしなぁ...
あ、ちなみに長時間稼動させた事はないので安定度は未知数です


続いてTwitterBOTの仕組みです。これが正しいとかではなく、”この方法でできました”です。つまり俺流ですので、ご了承ください。

1.誰かから @BOTユーザー名 メッセージ としてリクエストしてもらいます。
2.BOTは mentions API で返信メッセージの一覧を取得します。
  ※通常は最新の返信メッセージを受け取るため、 since_id パラメータでidを指定します。
3.いろんな(余計な)データが取得できますが、最低限必要なパラメータは、
 status.id....メッセージのid
 status.text...メッセージ本文
 status.user.screen_name...返信ユーザー名
 です。出力データを見れば構造はすぐわかります。
4.受け取ったメッセージ本文の中にキーワード(今回は”おみくじ”)が存在したら、@返信ユーザー名 ほにゃららら~ と、 update API でつぶやきます。
5.取得したリスト分繰り返します。
6.API制限のため数分待機して2.に戻る。

このBOTでは mentions API のpage制御をしていません。巡回時に2page以上も返信リクエストがある場合はちゃんと処理する必要があります。そんな人気なBOTを作ってみたいですがw
とりあえずは countパラメータで 200 としておけば良いのではないでしょうか
くれぐれもスパムBOTにならないように気をつけないといけないですね。


いろいろ難がありましたが、ColdFire+SilentMoonSDKでのネイティブアプリ開発は、所詮はマイコンなので大きなものを対象としなければ非常に有効な手段だと思いました。(もう少しライブラリを整備する必要はありますが...)
現状PSoCではTCP/IPが使えないので、I2CやUARTでやりとりしたりして組み合わせると...夢広がりますwww

プロジェクトです。
ColdFire_Twitter_omikujiBOT.lzh
※twbot.cで定義されているUSERNAMEとUSERPWを自分の情報に書き換えてください。
※MakeColdfireBin.batのIPアドレスを自分の環境に書き換えてください。


※現在はBASIC認証が廃止されているため、そのままでは動作しません。

SilentMoonSDKでネイティブアプリ

2010年02月17日 | ColdFire
久々にInterface付録基板のColdFireをやっています。(...っていうか、まだ他に誰かこの基板を使っている人がいるのかなw)
今回はSilentCではなくて、SilentMoonSDKを使用したネイティブアプリをC言語で作成しています。IDEはCodeWarriorです。
とりあえずTwitterにつぶやくのはできたので、Twitter-BOTでも作るかぁと。
手始めにPCアプリで@ネームでメッセージをもらうと、その相手に運勢を返すのはできた。
カスタマイズ性を持たせてNTサービスにして配布しようかと考えたけど、PCよりも単体で動くColdFireの方が面白いよね!

って事で作り始めましたが....
なかなか難航しておりますww
ここ4日間ほど睨めっこ状態です

長期化は好ましくないので、なんとかケリをつけなくては....

ColdFireを使って温度をTwitterに自動送信[LM35DZ]

2009年11月27日 | ColdFire
最近、Twitterなるものが流行っているらしい。
どうもブツブツとつぶやくそうな。一人ではなく、みんなとブツブツとつぶやき合うこともにできる。
...それが面白いらしい。

そーかぁ、よし!つぶやくぞ~!
なんて気分にはなれないし、面倒くさいw

Twitterは、他のWebサービス同様にAPIが公開されていて、独自アプリでつぶやくことができることがわかった。
んじゃ、自分でつぶやくのは面倒だからマイコンにつぶやいてもらおうじゃないか

という訳で、以前SilentCでPOST処理をしたのを少し改造して作ってみました。
肝心のつぶやく内容は温度です。(LM35DZは超簡単だからwww)

では、ColdFireに永遠につぶやいてもらいましょう。室温を!


↑こんな感じ。

サンプルソースです。
TwitterApiSample BASE64(Interface誌についていたのと同じものです)

7行目のUserInfoにTwitterのユーザー名とパスワードを : でつなげて記述します。
これだけで動きます。たぶん。(回路を組まなくても、A/D変換した値が表示されます)
サンプルでは1分毎にTwitterに送信していますので、もし使う場合は適当に間隔を変えてください。一応つぶやきAPIに制限はないので1分でも大丈夫と思いますが。

実は日本語が使えません。そのままでは。何故かというと、文字コードがUTF-8にしなくてはならないからです。しかもその変換が面倒。
まぁ、今回のように固定文字列であれば、予め変換しておけばOKですね。
変換後の文字コードを%31%32のように書くだけです。温度のような半角は変換する必要はありません。
サンプルでは日本語でつぶやくようになっています。

TwitterAPIでつぶやく時の要点は、
1.文字コードはUTF-8、URLエンコード
2.基本認証でログインする
3.前回と同じ内容は反映されない
かな。

回路図はありません。すいません。
ColdFire AN0[55pin] とLM35DZのdataoutをつなぐだけです。(間に0.1uFをGNDへ)

PSoCがイーサネットに対応してくれればなぁ...

※現在はBASIC認証が廃止されているため、そのままでは動作しません。

SilentC特別版[ColdFire]

2009年10月18日 | ColdFire
インターフェース付録基板ColdFireのSilentCを特別版にアップデートしました。
まだか?まだか?と騒いだ割には、今頃やってるというw
まぁ、タイミングがズレればこんなもんだわな~



↑更新ついでにSampleプロジェクトを実行してみたの図。

Telnet接続していれば、CodeWarriorでビルドするとColdFire基板にプログラムを転送してくれます。
うーん!これはなかなかいいんでない???

まぁしかし、基本的にはPSoCでセンサ入力等のメイン処理をやって、ColdFireはPSoCから受け取ったデータをインターネット処理(メール送信やCGIへPOST)という事になるのは変わらないかな~(多分...)
前にも書いたけど、サーバとなるPCがあれば別にColdFireを使う必要はないです。ColdFire部分をPCでソフト作れば何も問題なくできますから。
とにかくPSoC+ColdFireというマイコンだけで処理できるのが良いですね (ColdFireだけでもかなりできると思いますが...)



SilentC活用テクニック最終回のファイルはどこに?[ColdFire]

2009年08月28日 | ColdFire
インターフェース9月号の付録基板『ColdFire』の連載記事が今月号(10月)で終了となります。
むぅ、誠に残念です。
最終回らしく、なかなか夢広がりんぐって内容でした。
で、早速なんかやってみようかなぁと思ってパッチを....あて....
あれ?CDに収録されてないな。
そういえばWebからDLしろって書いてあったな。インターフェースのHPへ。
って、あれ?無いじゃん。んなら、こっちか!という事で、サイレントシステムのページに行くが、ないぃぃぃぃぃ!

もしもし?アップロード忘れてますよ?
本は確か25日発売ですよね??

※8/31追記 本日、DLサイトにファイルが登録されました!

サイレントCでHTTP POST処理[ColdFire]

2009年07月16日 | ColdFire
インターフェース9月号の付録基板『ColdFire』でPOST処理が必要になったのでやってみました。
ColdFireはSilentCというC言語ライクなインタプリタを搭載していて、簡単にネットワークアプリが作れるという優れものです。
現在もインターフェース誌で活用方法が連載されています。解説サイトもたくさん(?)あるのが嬉しいですね。今回もかなり助かりました。

PSoCではUSBまたはUARTでセンサの値をWindowsアプリに送り、そこからPOSTしていました。しかし、この方法ではPCを起動していなくてはならず、電気代がもったいないのでw、ちょっとした温度計等の監視系には向いていません。
その点、ColdFire基板では3.3VのACアダプタがあれば動きます
バスパワーではなく電池でPSoCを動かした時と同じぐらい感動しました。

SilentCのPOST処理のソースです。
少し改造すれば、室内温度等を定期的にどっかの掲示板に送信する事ができます。

PostSample
serverにサーバードメイン、cgipathにCGIのパスを入れて、パラメータ設定の部分を書き換えればOKです。
※CGIがmultipart形式の場合はうまく動きません。