2004/03/30 |
本日は、最近発見した、ちょっとしたWideStudioの小技を紹介します。 へ、編集しちゃってもいいのかな? WideStudioでごちょごちょと、新SIPHA TERM画面を作っていますが、部品を作っているうちに、Inspector(アプリケーションビルダの左側に表示されてるオブジェクトのツリーウィンドウ)に並んでいるオブジェクトの順番が気に入らなくなることがありませんか? どうも、作っている順番に表示されていくようでして、「あ、あのボタン忘れた」とか言って追加すると、下のほうに来てしまいます。実は、プロポをエミュレーションする画面を作っていたんですが、画面上のボタンの順番に並んでいないと、どうもやりにくい!というわけで、ちょちょっとWideStudioの定義ファイルをのぞいてみました。 ふむふむ。「ウィンドウ名.win」(たぶん、メインウィンドウと呼ばれる単位だと思います)というファイルにオブジェクト情報があるようですね。テキストファイルなので、エディタで「えい」と開けば内容を確認することができます。よくみると、この中に定義してある順番で表示されているようです。「#OBJ」で始まっている行が1オブジェクトの定義順のようです。 「むむむ、ひょっとしてこれの順番を入れ替えれば…」、たぶん正規技じゃないと思いますので、ファイルをコピってバックアップしておいてください。また、WideStudioは終了させておいてください。 WideStudioの動きを良く見ていると、このファイルをアプリケーションビルダでまず作り、ビルド時に、「ウィンドウ名.cpp」と「ウィンドウ名.h」いうファイルを自動生成し、この中にオブジェクト生成のソースコードが生成されるようですね。おまけ情報としては、これらのファイルをいくら編集しても、ビルドのたびに戻ってしまうのでダメ、ということになります。そっとしておいてあげましょう。 というわけで、「ウィンドウ名.win」の中身をエディタでちょいちょいと入れ替えてWideStudioを再起動…お、変わりました。これで、気にせずオブジェクトをぐいぐい追加できます(^^)。別に結果には何も影響を与えないのですが、気分気分!これで気分上々です。 というわけで、小技でした。 WideStudio、オブジェクトがごちゃごちゃする時はFormに貼り付けちゃえ 左の画面は、「プロポエミュレータ」を作ろうと思って作った画面なんですが、左右の9個組みボタンは、1つのFormオブジェクト上に配置してあります。こうすると、Inspectorには9個ずつ階層化して表示されるようになります。これだけでも結構気分がいいのですが、さらに!1つ作って、コピーすれば、もう1組の9個ボタンウィンドウを作れることが発覚。ぶらぼ〜! そ、そして、まだ利点があります。全体の表示座標を変える時に「おお、Formに貼り付けておいてよかった〜」というのをさらに実感しました。う〜ん、楽チン。つ〜のも、それぞれのボタンの大きさはあまり変えないのですが、全体のレイアウトを見直すときに、表示座標を変えたいときがあります。実際にあったのは、大元のウィンドウサイズを変えたときです。「うぅ、でかかった」なんて時ウィンドウを小さくすると、全体の部品配置もバランスよく見直したりするわけですが、こんな時、Form上に配置してあると、Formの座標をずらすだけで、ボタンが9個組で移動してくれます。というのも、Form上に配置する場合、それぞれのボタン表示座標は、Formの左上が(0,0)の原点になります(各ボタンがFormの子供になるわけですね)。そんなわけで、Formさえ移動すればいいのです。 というわけで、いいか悪いか良くわからないですが、オススメ!のやり方です。
| |
2004/03/29 |
やっとこさ、出張から戻ってきました。な〜んか、今回の出張はやったらヘヴィ(今回始まったことではないですが)で、結局、週末はほとんど爆睡していました。それで、今朝、部屋の花が枯れていたことに気づいたと…あ〜、ヤダヤダ。心に余裕が無いっていやですね〜。 ロボット製作してる机も、ROBO-ONEが終わった時と同じで、全然片付けていないです。ROBO-ONEからもう2ヶ月。次は大丈夫かな? GREAT MECHANICS さて、今回のGREAT MECHANICS、「ザク」とかが一杯載っています。実は、ワタクシ、ガンダムがオンタイムな世代にも関わらず、ガンダムを見たことがありません。高校生になって、「マクロス」を観たぐらいです。いろいろ勉強になります。 せっかくの出張、ちょっと仕入れてきました。 そして、USB-シリアル通信ケーブルですが、ちゃんと使えるのかな?まだテストはしていないのですが、これから試しに、H8/3664に接続してみようと思っています。2つあってもしょうがないので、使えるのを確認したら、友達に転売予定(笑)。
| |
2004/03/24 |
スライダーネタで、おかださん(OKADA Official Site)から、メールを頂きました。おかださんのモーションデータ作成ツールって、な、なんとExcel+VBなのね…。現物見て、びっくりしました。詳細は、おかださんのHPを参照してください。見ると、そうかExcelさえあれば、フリーツールと組み合わせて、いい感じのものができてしまうではないか〜というのがわかってしまいました。 実は、以前、ホームページの方は拝見させて頂いていたのですが、「VBで」というところだけ覚えていまして、Excelの方は忘れていました。「ロボット製作のページ」−「R2N-series製作日記」の下のほうにあります。ExcelからVBでシリアル通信ライブラリを呼び出して、User Formで作った操作画面です。よく考えると、これも結構、アリだなぁって思ってしまいました。ほら、Excelって、表計算ソフト。動作データって、ほとんど表だったり、計算いっぱいだったりするわけですし、初期データなどもセルに書いておいて、コアにシリアルでアクセス。実は、なかなか良いんではないかと、思うわけです。 ここから第2のポイントで、今日のお題なんですが、各スライドバーとその受け関数を、割と単調にコーディングされていまして、これについて、「簡単ではまった」(邪道と思いつつ始めたら、意外に簡単であったという意味だと思います)とのコメントを頂きました。そこで、SISOは考えました。 わらひは、いきなり複雑なことをやろうとしている気がする… といわけで、WideSudioでも、同じようなことができるというのをおかださんにアピールしつつ、こっそりExcel路線もおもしろいと思いつつ、単純なスライドバーの生成をやります(最初からそうしなさいって感じですよね〜)。ひょっとしたら、正式採用かな?ま、今は、小手試し期間です(^^; 単純にサーボ制御用スライドバーを作るには? トグル:tglServoDegCtl00、tglServoDegCtl01 前回、ボタンではなく、ラベルを使用していたのですが、今は、気分でボタンにしています。「押すと原点復帰」とかしたらおもしろいかな?と思いまして。また、ボタンだと、ラベルと違って表示にグラデーションが使えるので、デザイン的な理由もあったりします(笑)。 後は、スライダにVALUE-CHのイベントプロシージャをつけます。1つめは、SDCmovSlider00、2つめはSDCmovSlider01とします。そうすると、ソースコードが生成されます。SDCmovSlider00を例に… まずは#includeの次に、
を追加します。次に、関数の中身として、次の1行を追加します。
SDCmovSlider01の方も同様にしてください(ただし00は01にしてくださいね)。これで、スライダを動かすと、ボタン上の数値がぐりぐり変わるソフトができます。サーボの個数分だけ、これを繰り返して作ればOKです。一見大変そうですが、やってみると、それほどでもないです。う〜む。意外でした。あれこれ考えるよりは楽かも。しかも、WideStudioは、プロパティで「ユーザー設定値」というのが設定できるので、これを駆使すればさらに楽ができるかも…。んで、できあがりはこんな感じです。 ところで、以前、スプラッシュウィンドウの時に紹介した、ウィンドウにグラフィックファイルを貼り付ける機能の話、覚えていますか?あれとこれを組み合わせると、お楽しみの…これができます。う〜ん、なかなかきれいにできました。
| |
2004/03/21 |
相変わらず異国の地のSISOです。ああ、思えば、ROBO-ONEが終わって約2ヶ月。ほとんどこんな生活をしております。しかも、先日、熱がでて寝込んでしまいました。こっちのメンバーにヘルプしてもらって初めて異国の病院に行きました。行ってみたら、全然日本と変わりませんでした。もっと早く行けばよかった。診断結果はただの風邪でした。今は、微妙にフラフラする気もしますが、久しぶりにたくさん寝ているので、そのせいかもしれません。というわけで、時間を見つけてWideStudioです。 なぜ、今、WideStudioか?それはですね、「仕事のおかげでロボットに触れない」→「時間が無い」→「いじける」→「引きこもる」…ではつまらないので、時間が無いのならば、時間をかけずに完成できるよう、開発環境を整えておく!という、非常に前向きなような、そうでないような、しょうがないからそうしているような作戦なのです。ほら、かっちょよくて使いやすいエディタとかあれば、動作データもさくさくできるかもしれないでしょ〜。 う〜む、画像が表示されない… というわけで、とりあえずフルパスで記述していた画像ファイルのパスを相対(というかディレクトリ情報を抜いた)パスに変えました。左の画像は、WideStudioのアプリケーションビルダでプロパティを表示したところです。これで、とりあえず、実行ファイルと画像ファイルを同じフォルダに置いておけばいつも表示されるようになりました。 これ、実行ファイルに入れてしまう方法って無いんでしょうか?また調べてみようとは思いますが、これはこれで、ビルド無しで画像が入れ替えれていいような気がします。でも入れたいな〜。どなたかご存知じゃないでしょうか??? く、クラスってどうやって追加するの? ま、まさか、これがおまじないか… SACdefFileというクラスを定義しようとしていたんですが、これのソースファイルをSACdefFile.h、SACdefFile.cppとしていました。そしたら上記のエラーに引っかかっていたんですが、これを、SSACdefFile.hとSSACdefFile.cppにしたら通ってしまいました。ソースファイル名の頭に「S」を追加して、名前を変えてみたわけです。不思議です。でも、SACdefFileSrc.h、SACdefFileSrc.cppとやってもダメなんですよね〜。お作法かなぁ。 ちなみに、自分で独自に作成したソースコードをコンパイルの対象に入れるには、「プロジェクト」−「プロジェクトの設定」にて「コンパイル」タブを開いて、「追加オブジェクト」にオブジェクトファイル名を追加すればいいです。先の、SSACdefFileの例で行くと、SSACdefFile.oと書いてやればOKです(「SSACdefFile.cpp」では無いのでご注意)。 ファイルの内容をリスト表示 んでまあ、とりあえず、ファイルを読み込んでWSClistDataクラスにWSCstringをがばがばとnewしてくっつけて読み込んでやって、それを試しにWSClistで表示してみたら、左上のようになってしまいました。なんか変でしょ?表示がかけています。これは悩みました。なぜだろう?なぜだろう? 実は、ファイルから読み込んだ時に、「改行コード」が入ったままになっていて、それをWSClistにそのままaddItem()していました。もし、同じような表示になった方がいましたら、「改行コードを削除」してやればOKですよ。んで、左下になりました。 ちなみに、改行コードを削除するには、WSCstringクラスに便利な関数がありまして、delLineFeed()で一発で外れます。なかなか便利です。 setPropertyはすごい! void STM_opeSlideServoDeg( WSCbase* object ) { int nIdx, nDeg; nDeg = object->getProperty( WSNvalue ); nIdx = object->getProperty(WSNuserValue); STM_aplblServoDeg[nIdx]->setProperty( WSNlabelString, nDeg ); }
| |
2004/03/16 |
WideStudioでスライドバー、しかも動的生成 画像で見ると、「トグルスイッチ」、「ラベル」、「スライドバー」という3つの部品で構成されている塊が、4つ表示されているのがわかると思います。これらは、アプリケーションビルダで作ったのではなく、プログラムにて動的に生成しており、スライドバーを動かすとその値がラベルに反映されるようになっています。さてさて、どうやって作ったかを解説してみたいと思います。いつもながら思うのですが、わかっている人には「しょうもないコード」です。でも、これもまたワタクシメの歴史なので、笑って許してください。 ■まずはインクルードファイルとその他準備 #include <WSCvtoggle.h> #include <WSCvlabel.h> #include <WSCvslider.h> 次に、トグルスイッチなどを生成した時に、実体を管理するためのポインタ配列を作ります。管理する対象は、「トグル」、「ラベル」、「スライダ」ですので、それぞれのクラスのポインタ配列とします。また、「何個管理する」といった情報は、あちこちで使いますので、#defineしておきます。そんなわけで、上記の#includeにつづいて、以下のようなソースを書きます。 #define NUM_MAX 4 WSCvtoggle* STM_aptglServoPls[NUM_MAX]; WSCvlabel* STM_aplblServoDeg[NUM_MAX]; WSCvslider* STM_apsldServoDeg[NUM_MAX]; まあ、こんな風に、いきなりグローバルにするとかっていうのは、なんとなく気が引けますが、他のサンプルとかを見ている限りではよさそう(WideStudioの中では悪くない?)な気がしますので、よしとします。相変わらず、お作法がつかめていませんが、こんな感じでしょう。余談ですが、イメージ的には、「C++クラスライブラリをベースとして、それをCでお気軽に呼び出して使う世界」な気がします。とても現実的で、とっかかりがいい感じですが、本当のところはどうなんでしょう? ■INITIALIZEの実行関数に生成機能を組み込む!(とりあえず) int nCnt; char szServoName[64]; for( nCnt = 0; nCnt < NUM_MAX; nCnt++ ){ sprintf( szServoName, "SERVO-%02d", nCnt ); // ここからいろいろ書き足します。 } ■部品の動的生成 STM_aptglServoPls[nCnt] = new WSCvtoggle( object, szServoName ); STM_aptglServoPls[nCnt]->initialize(); このあたりは、サンプルソースを見て、「う〜ん、こうかなぁ」とやってみました。本を読むと「生成したらとにかくinitialize()」と、非常に楽しい文章で説明されています。さらに、WSCvtoggleのnewする時のパラメータ、まだよくわかっていません。どっかに少しだけ書いてあったような気がするのですが、1つめは親となるオブジェクト、2つめは「名称」だと思います。だとすると、1つずつ、名前を変えないといけないような気もするのですが、動的に生成する場合は、問題にならないようです(アプリケーションビルダでは、ソースを自動生成する都合上のものかな)。 そして、WSNuserValueを設定します。一見、何につかえるかわからないプロパティですが、ここに数値を入れておくと、後で取り出して使うことができます。イベントプロシージャの実行関数を1つで書いてしまう場合、この数値を使って識別をさせることができますので、ちゃんと数値を設定することにします。 STM_aptglServoPls[nCnt]->setProperty( WSNuserValue, nCnt ); 後は表示名です。このプロパティに設定した文字列が、トグルスイッチのところに表示されます。 STM_aptglServoPls[nCnt]->setProperty( WSNlabelString, szServoName ); 最後に、表示サイズや表示位置を設定します。ループにあわせて、Y座標がずれるようにしてあります。このあたりは趣味の問題なので、好きなように設定すればよいと思います。どれがどの値かは、アプリケーションビルダで試しに1つ部品を作ってみて、プロパティでいじくって確認してみてください。 STM_aptglServoPls[nCnt]->setProperty( WSNx, 0); STM_aptglServoPls[nCnt]->setProperty( WSNy, nCnt*40 ); STM_aptglServoPls[nCnt]->setProperty( WSNwidth, 100 ); STM_aptglServoPls[nCnt]->setProperty( WSNheight, 18); STM_aptglServoPls[nCnt]->setProperty( WSNindicatorSize, 16 ); STM_aptglServoPls[nCnt]->setProperty( WSNshadowThickness, 0 ); おっと。最後の最後に、「表示!」します。 STM_aptglServoPls[nCnt]->setVisible(True); 同様に、ラベル、スライダも設定します。設定しているのは表示系ばかりですので、それぞれのプロパティについては、アプリケーションビルダで1つ作ってみて、確認してください。というわけで、以下のようになりました。 STM_aplblServoDeg[nCnt] = new WSCvlabel( object, szServoName ); STM_aplblServoDeg[nCnt]->initialize(); STM_aplblServoDeg[nCnt]->setProperty( WSNuserValue, nCnt ); STM_aplblServoDeg[nCnt]->setProperty( WSNlabelString, "0" ); STM_aplblServoDeg[nCnt]->setProperty( WSNx, 100 ); STM_aplblServoDeg[nCnt]->setProperty( WSNy, nCnt*40 ); STM_aplblServoDeg[nCnt]->setProperty( WSNwidth, 50 ); STM_aplblServoDeg[nCnt]->setProperty( WSNheight, 18); STM_aplblServoDeg[nCnt]->setProperty( WSNshadowThickness, 0); STM_aplblServoDeg[nCnt]->setVisible(True); STM_apsldServoDeg[nCnt] = new WSCvslider( object, szServoName ); STM_apsldServoDeg[nCnt]->initialize(); STM_apsldServoDeg[nCnt]->setProperty( WSNuserValue, nCnt ); STM_apsldServoDeg[nCnt]->setProperty( WSNx, 0 ); STM_apsldServoDeg[nCnt]->setProperty( WSNy, nCnt*40+18 ); STM_apsldServoDeg[nCnt]->setProperty( WSNwidth, 150 ); STM_apsldServoDeg[nCnt]->setProperty( WSNheight, 18); STM_apsldServoDeg[nCnt]->setProperty( WSNsliderSize, 16 ); STM_apsldServoDeg[nCnt]->setProperty( WSNmaximum, 127 ); STM_apsldServoDeg[nCnt]->setProperty( WSNminimum, -127); STM_apsldServoDeg[nCnt]->setProperty( WSNdragInterval, 1 ); STM_apsldServoDeg[nCnt]->setProperty( WSNvalue, 0 ); STM_apsldServoDeg[nCnt]->setVisible(True); ■イベントプロシージャの割り当て まずは、実行関数の方です。割と一般的で、普通のスライダサンプルプログラムもこんな感じだと思います。 void STM_opeSlideServoDeg( WSCbase* object ) { char szDeg[64]; int nIdx, nDeg; nDeg = object->getProperty( WSNvalue ); sprintf( szDeg, "%d", nDeg ); nIdx = object->getProperty(WSNuserValue); STM_aplblServoDeg[nIdx]->setProperty( WSNlabelString, szDeg ); } 中身は簡単なものですが、先に説明しましたWSNuserValueが活躍しているのがわかると思います。この実行関数は、すべてのスライダから呼び出されます。そのため、どの人から呼び出されたかを認識しないといけないです。この行です。 nDeg = object->getProperty( WSNvalue ); この実行関数が呼び出されるとき、objectという変数が渡されますが、これが、この関数を呼び出したオブジェクト(このケースの場合、具体的にはスライダのオブジェクトの1つ)のポインタになります。先の初期化で、WSNvalueに、固有の識別番号を入れていますので、これを取り出すことによってどのスライダから呼び出されたかがわかります。 よって、どのラベルを更新するかわかることになりますね! さて、この実行関数を、WSEV_VALUE_CHイベントが発生した時に呼び出されるように、生成したスライダオブジェクトに割り当てます。それには、以下のように、プロシージャを名称とトリガから生成、生成したプロシージャに実行関数を割り当て、そしてスライダにこれを追加するという形になります。 WSCprocedure* ep = new WSCprocedure( "SERVO_DEG", WSEV_VALUE_CH ); ep->setFunction( STM_opeSlideServoDeg, "STM_opeSlideServoDeg" ); STM_apsldServoDeg[nCnt]->addProcedure( ep ); これをforループの、スライダを生成した後に実行するようにすればOKです。これで「スライダを動かすとラベルの値が変わる」という部品を、動的に生成することができるようになりました。それぞれの部品の表示位置や制御対象とするサーボの情報などを、定義ファイルとかで与えて、SIPHA-COREと通信できるようにすれば…うふっ。
| |
2004/03/12 |
うぅ、相変わらず出先のSISOです(しかも、いつもに増して忙しい)。トランジスタ技術(H8のおまけ付き)は、友人にメールして買ってもらいました(3冊程)。たぶん、シリアル通信のレベルコンバータは買わないといけなさそうです(って、買った人はきっと、もう確認されてますよね〜)。そういえば、GOLDENWORKSさんのところで、基板で売っているUSB-SERIALコンバータが紹介されていましたが、あれに一緒に組み込んじゃって、マイコンアクセス専用にしちゃってもよさそうですね〜。んで、ついでにUSBから5V取り出してマイコンに供給したらモバイルですね!電車の中でも、飛行機の中でもマイコンソフトを開発できそうです。今度やってみよう。 WideStudioでメニュー
■ALT+Fでメニューが開かない…うぅ、マニュアル読みなさいって感じ。
■メニューに関連付けた実行関数が呼び出せない…うぅ、やっぱりマニュアル(以下略) | |
2004/03/08 |
ROBO-ONE Special
MAGI優勝記念企画 SIPHA-COREの制御周期 サーボ制御信号の出力 タイマWには、ジェネラルレジスタと呼ばれる4つのレジスタがあり、タイマ値とのコンペアによって割り込みをかける機能があります。タイマWのオーバーフローによってサーボ制御信号をONし、コンペアマッチ割り込みによってOFFしています。そういった意味では、コンペアマッチ割り込みがぶつかった時に、若干サーボがプルプルしますが、実際のところ、うちのサーボでは、問題になるほどプルプルしません。というのは、OFFする処理をすごく簡単な処理にしているからです。具体的には、あっさりと…
といったコードになっています。ピンアサインメント考える時に、こういうシンプルなコードでクリアできるように考慮しました。 シリアル通信 通常のメモリ読み書きは、サーボなどを制御していても実行できるようになっています。実際の処理は「計算、ROMアクセスフェイズ」のみで行っています。シリアル通信は、サーボプルプルを防ぐために、割り込みは使用せず、「計算、ROMアクセスフェイズ」の中で、レジスタをチェックすることで行っています。 パソコンとの間は、完全に1バイトずつのハンドシェイク(受信したよ、送ったよと、1バイトずつやる)にて行っています。そのため、データの取りこぼし無く、「計算、ROMアクセスフェイズ」の時間のみを使って通信できるのですが、実は、かなりスループットが良くないです。それでも、制御中でもサーボ指示値などを取り出せるメリットは大きいです。また、実質転送レートは「その他フェイズ」の処理あまり時間に左右されます。最悪ケースで、1制御周期で1バイト、つまり50バイト/秒になることもありますが、データを厳選していれば実用範囲です。転送可能量は、その時々の「計算、ROMアクセスフェイズ」で使用した時間によって変わります。 また、シリアルEEPROMを書き込むときだけは、サーボ制御信号などの処理を全て停止させています。実用上、ぐいぐいロボットを動かしている時に、データ書きとかできなくても困らないので、問題は無いです。 R/C受信機の取り込み さて、これをどうやってリアルタイムに取り込んでいるかといいますと、この図を見てください。 R/C受信機の信号は、こんなふうに、少しずれて出力されていますが、ここの話では全然関係ないです(笑)。ウソを書くわけにもいかないので、リアルに書かせていただきました。先に書きましたように、「タイマVオーバーフロー時に、信号がHighになっていたらカウントアップ」という処理をひたすらするソースコードがあります。普通に考えると、HIGHの時、ず〜っとカウントアップ、LOWの時はカウントアップしない…よってまたHIGHになるとカウントアップ…じゃあ、全然、パルス幅がわからない!となってしまいます。 しかし、上の図をよく見てみると…サーボと同じで、パルスが出力されるとその後、大体、14msecぐらいのお休みがあります。これに目をつけました。SIPHA-COREの制御周期タイミングは、2.5msec、2.5msec、2.5msec、2.5msec、2.5msec、7.5msecです。この間隔でカウントアップされている値をチェックすると、「前回チェックした時と同じ時」=「LOWになっている時」ということになります。つまり、シンプルで短い処理である「HIGHならひたすらカウントアップ」という処理をさせておくだけで、制御周期タイミング時にチェックすると、R/C受信機信号の幅を取得できるわけです。具体的には、制御周期タイミングの方で 前回と同じ値かチェック という処理をします。制御周期タイミングでの処理は、実は比較的、時間が延びたりしても問題がありません。なぜならば、この間はサーボ制御信号を出力していないですし、また実際にはタイマWを止めてしまっています。よって、割と複雑な処理を書いても、プルプルには全く影響はなく、また、全体のパフォーマンスにもそれほど影響が無いです。そんなわけで、制御周期タイミングの割り込み(タイマWのオーバーフロー)では、割と時間がかかるこういった判断の部分を書き、その他の割り込みでは、極力シンプルにしています。この速度(0.128msec)で割り込みをかけると、処理能力がだいたい70〜80%程度になります。そんなわけで、割り込み側の処理を、極力軽くするのは大切なことだと思います。 ところで、これだけだと、実は、サーボ制御信号のOFFタイミングとタイマVの割り込みが一緒に入った時に、サーボがとてもプルプルしてしまいます。ここが最も悩んだところです。いくらタイマV割り込み処理をがんばったとこで効果なく、レジスタ退避をすっとばすなどのウルトラC技を使わないとこれを回避することはできませんが、結構、簡単な方法でこれをクリアしました。それは「タイマVの割り込みを使わない」ということです。「計算、ROMアクセスフェイズ」では、タイマVの割り込みを使ってカウントアップし、「サーボ制御信号出力フェイズ」では割り込みを使わず、メインの方にぐるぐる回りでタイマWのOVFをチェックするようにし、これでカウントアップします。サーボ制御信号OFF処理にとって、自分以外の割り込みは深刻ですが、逆に、0.128msec間隔程度の処理からみれば、サーボ制御信号OFF処理なんて誤差の範囲です。こうしてめでたくリアルタイムにR/C受信機信号を取り込めるようになったのでした。加速度センサも同じアルゴリズムで取り込みを行っています。 チューニング対象は、読み込みの
EEPROM_BlockRead() こんな感じです。SIPHA-COREでは、制御周期の空き時間を使ってEEPROMにアクセスしているため、まとめて取れる時間が少なく、一度に読み出すデータ数を少なくしてマメに読み出す、というスタイルを取っています。そのため、一気に読み込む場合のスループットは、オリジナルのものでも変わりません。しかし、マメに読み出す、アクセスアドレスを変える、といった使い方をする場合、非常に効果があります。具体的な部分は探してみてください。 アイドルチェック ACKBの処理と停止処理 を初期化関数にまとめ、EEPROM_BlockRead()からはずすことです(そのまんまですね…)。イメージ的には、ファイルオープン/クローズな感じです。 使ってみて思ったのは、今のアクセス方法ですと、どうしてもまとまった時間を作らないといけないので、処理全体からみると、ちょっと足かせ気味です。う〜む、これからどうしましょう。 そして、今回のネタはばらしてしまいましたので…SIPHA-COREも、次へのステップへの進んでいくのです(SISO = 切羽詰らないとやらないヒト)。
| |
2004/03/07 |
G-Tune 2004F 詳細写真 左側に写っているのがS03Tなんですが、とりつけステーがゆがんでいるのがわかると思います。今回の加工で、精度だすのが難しかったのが、サーボケースへの穴あけでした。今後、もう少しやり方を考えていこうと思っています。今回は、簡単に「型」みたいなものを用意してやっていたんですが、次回は、「サーボがはまる型」を用意して、それで穴あけ位置合わせをしようと思っています。 個人的には、肉抜き用の穴と、サーボケーブルの引っ張り出しの場所が、さりげなく一致させているあたりが、設計的にスマートでオシャレだなんて思っているのですが、いかがでしょうか? ロボット系リンクページ作りました
| |
2004/03/04 |
WideStudioでスプラッシュ! せっかくなので、オンラインマニュアルを読めばわかることはおいといて、ポイントを紹介させていただきます。 作ったものは…起動すると、メインのウィンドウ以外にもう1つ、起動表示用のビットマップを貼ったウィンドウを開き、1.5秒後に自動的に閉じるものです。よくアプリケーションでありますよね?起動するときに製品名とか表示されて、後ろでアプリケーションが起動処理をするやつ。アレです。いまのところ、これだ!という方法が良くわからないので、スプラッシュ風っていうのが正解なんでしょうか? こんなふうに作ってみました。まずはアプリケーソンビルダを使います。
こうやって考えてみると、実は、タイマのスタートって、INITIALIZEでかけてるのってまずいのかな?スプラッシュなので、構わないって感じですけど。ウィンドウが開いてからカウント開始するのが正しそうなので、別のトリガがいいのかもしれません。というわけで、さっそく「EXPOSE」に変えてみました。これは描画された時に発生するトリガです。「ウィンドウ表示=最初の描画が行われる→EXPOSEが発生する」と思いまして。このあたり、アプリケーションビルダでやると、めちゃ簡単です。マウスでちょいちょい。んで「実行」…あ、いい感じですね。スプラッシュの時はどっちでもいいんでしょうが、普通の時はこの方が良さそうです。 というわけでわかったこと。
相変わらず、プロシージャの「プロシージャ名称」の意味がわからず、適当に名前付けていたりします。お作法は、今日の分に関してはだいぶわかってきたのですが、依然、やりたいことについてはわかっていないです。 ONO様…本の読破ですが、最初は「うっ」っと思いました。でも、最初…斜め読み、2回目は割とまじめ、後は必要に応じて、と読んでいたら、結構、楽しく読めましたよ。個人的には、もうちょっと仙人の会話が欲しかったです。すべてはわかりませんが、とっかかりと、大雑把な概念を理解するのであれば、なかなか良い本だと思います。 それにしても、ここはどこだ?日本語が通じないぞ?というわけで、これから数日は、WideStudioネタになるかな(笑)。 ではでは! | |
2004/03/02 |
ROBO-ONE SpecialでZIPPONさんのMAGI、優勝しました。おめでとうございます!いや〜、すごいですね〜!というわけで、普段、めったに買わないビールを買って、家で乾杯!です。記念企画とかやろうかなぁ。 そんなわけで、3月 というわけで 何気にわかってきたような気がするので、試しに、SIPHA-TERMの作り直しを兼ねて、見てくれから作ってみようと思います。というか、ユーザインターフェイスの作り方しかわかりませんでした ^^;。イマイチ、イベントプロシージャ構成の概念(というか必要性)が理解できていません。プロシージャ、トリガ、起動関数、これらの中で、トリガと起動関数の必要性はよくわかるんですが、プロシージャ(プロシージャ名)ってなんで必要なんだろう???なんかこれは日本語名にしてもいいところを見ると、便宜上、区別するためだけに存在するもんだろうか?あと、普通にクラス(シリアル通信クラスとか)を追加する場合、どういう方法がベターなんでしょう??? でも、これでプログラムとか公開できれば、ここを見ににきてくださっているみなさんにも、気軽にお勧めできます。なんといっても無償ですから。なんか作ったら、バシバシとアップしますね。
|
2004 | Jan. | Feb. | Mar. | Apr. | May. | Jun. | Jul. | Aug. | Sep. | Oct. | Nov. | Dec. |
2003 | Jan. | Feb. | Mar. | Apr. | May. | Jun. | Jul. | Aug. | Sep. | Oct. | Nov. | Dec. |