昨日の午前中に年休消化のために午前中だけ半休を取っておきながら、今日は朝から休日出勤。作業を進めたいのだけれど、どうやったら巧い仕組みができるか良い案がなくて、結局作業は進まなかった。
帰ってきてから夕飯を食べつつ、TVでクレヨンしんちゃんをみながらエンディングに涙してみた。う〜ん、お子様向けのTVアニメで涙を浮かべるとは(汗) ま、どうでもいいことなんだけど。
ここのところ仕事のほうに注力しているため、帰りが遅くなっていてPICのプログラミングも手をつけていない。このペースで行ったら夏のROBO-ONEに間に合わないのではないかと、すごく心配だ。
囲碁の世界に定石があるように、プログラミングや回路設計にも定石がある。がしかし、こういった定石を私はあまり知らない。特に回路設計の定石は「設計のknow how」ってやつで、経験がものをいうのかもしれない。今日はBBSで質問を受けて初めてタクトSW周りの設計ミスに気がついた。
会社から帰ってくる時間が遅いと一日一作業が限界。てことで、今日は回路図を修正して、実験基板の配線を直して、ボタン入力があるサンプルプログラムを書き換えて動作を確認して、Upしてある図やソースを入れ替えたらすでに午前2時。
ボタン操作でラジコンサーボを動かせるところまではできたので、今度はPCから動かしてやろうとVBのプログラムに着手した。VBなんて今まで使ったことがなかったのだが、まあなんとか使えそうな感じ。しかし。通信がうまく行ってない。PICからPC(VB)に文字列を送る分には正しく送れているようなのだが、VBからPICに送るほうがどうもうまくない感じ。う〜ん・・・
今日会社の食堂でお昼を食べながらTVを見ていたら、アメリカによるイラク攻撃が始まった旨のニュースが流れていた。何でかしらないけど、日経平均株価は8,100円台まで値を戻してるんだとか。
さて、今日のお題。OSの根幹をなすスケジューラの簡易版を自分で作ってみようというお話。ラウンドロビンスケジューリングであれば、結構簡単。
// 一般的なCコンパイラの場合
// task ID
enum {
TASK_A,
TASK_B,
TASK_C,
TASK_NUM <- こうするとタスクの数を自動的に数えることができる
} taskID;
// task control block
typedef struct{
int wupcnt; // 次にタスクが起動されるまでの残り時間
void (*entry)(void); // タスクのエントリポイント(タスクへのポインタ)
}t_tcb;
t_tcb tcb[TASK_NUM];
たとえば、
void task_a(void);
があるなら、
tcb[0].entry = task_a;
とすれば、起動すべきタスクを登録できる。
// scheduler
while(1){
for(i=0; i<TASK_NUM; i++){
if( 0 == tcb[i].wupcnt )
tbc[i].entry();
else if( 0 < tcb[i].wupcnt )
tbc[i].wupcnt--;
}
}
|
ここまで書いた時点で午前3時半ちかく。も〜眠くて後解説する気力がもちませ〜ん。
アメリカはどうしてもイラクを攻撃したい様子。タイムリミットまであとわずか。国連を理想化しすぎているのは日本人だけなのかもしれない。国連って、泥臭い政治の駆け引きの場だったんだ・・・。
先週末ずっとロボット関連のことをほったらかしにしていたので、今日は定時で退社してからPICのプログラム作成に挑戦。インターバルタイマの設定が、以前はこれで正確にできていたのに、オシロスコープで出力を見ると今日は(というか昨日から)時間が10倍になっていて、なんだろうな、と悩んでしまった。シミュレータデバッガでは正しい時間で動くのに。 と思ったら、オシロスコープの(x10)ボタンが押されていたことに、明け方になって気がついた。アホだ。
プログラムの実行時間を計るのには、オシロスコープも良いが、シミュレータデバッガも欠かせない、と今日は実感した。ちょっと時間かかるけど。PICにプログラムを転送してオシロをつなぐよりずっと楽だし。
今日できたプログラムは、timer0 で 1ms 周期でタスク(もどき)の制御をし、timer1 でサーボのON時間が過ぎたらOFFに落とすという代物。このやり方なら、ON時間のオーバーラップなしで最大6個までサーボを制御できるはず。 ニュートラルを1500usに設定したとき出力が1510usくらいになっちゃうけど、誤差は1%以下ということでOKでしょう。805BBも、5945Mも、3003Sも、ぜんぜんビビッたりせず、すごくいい感じ。 とりあえずソースコードを公開しますが、「C言語は初めて」とか「割り込みって何?」という方には難解かもしれません。あしからず。
まだ雪が積もってて、ツルツルすべりまくり。
今日は大学時代の剣道部の先輩が遠くに行ってしまう(お嫁に行ってしまう)ということで、皆で久しぶりに集まって門出を祝った。 学生時代から部内でいくつかカップルがあったが、それがこうして結婚していくのを祝うのは、とてもうれしい。おまけに、先輩・後輩が集まってワイワイできるのはすごく楽しい。おかげで、久しぶりに飲み会が終わった記憶なし。どうやって宿まで帰ったかも不明。明日は出張なのに・・・。
が私に立って、来週月曜は北海道へ出張。今日はそのプレゼン資料作り。人前で話をするのって、もしかして修士論文の発表以来かも? 資料を持ち時間15分のつもりで作ったら、質疑応答で5分ほしいから10分にしてくれとの注文。内容を大幅カットして、やさし〜く、あさ〜い話に変更することになった。
なんでも明日は労働組合の朝ビラ配りをやってくれ、とのこと。あさ7:30からじゃ、起きれないよ。てことで、今日はロボット作りの作業をやらずにさっさと就寝。
少しだけPICのプログラミングに慣れてきたような気がするので、やっとPICを使ってラジコンサーボを制御するプログラムを書いてみた。もちんろん、C言語で。実験基盤にはボタンを3個つけたので、右のボタンを押したらサーボが右に少しだけ回る、左に押したら左に、真ん中のを押したらニュートラルに戻る、というプログラムを書いてみた。
プログラムの設計は、超簡易版自作スケジューラによるマルチタスクもどきで、100us周期の割りこみでスケジューラを動かした。まぁまぁそれなりには動くのだが、ニュートラルの時間を1500usに設定しているのに、オシロスコープでみると、1600usでていて、その差が100usぴったりなのがすごーく気になる。けど、原因がよくわからない状態。 とりあえず、大体10°刻みくらいでラジコンサーボを制御することができたことはできた。納得してないけど。
Hitechのラジコンサーボ。デジタル制御のHS-5945MGとかHS-5245MGは角度を振り切るとそれ以上制御しないらしく、過大な電流は流れない。それに対し、アナログ制御のHS-805BB+は、角度を振り切っても大電流が流れてまだ制御しようとがんばっている様子。その代わり、805BB+はカタログスペック上は可動範囲が±45°なのに、実際には±90°くらい回っているので、デジタルサーボより可動範囲を広く使えて便利そう。
今回作ったラジコンサーボ制御プログラムは、角度が10°以下の制御ができないため、再度作り直す予定。それができたら、VBからサーボの制御周期やニュートラル位置などを変更するプログラムを書いてみようかな。
ROBO-ONEに向けたヒューマノイドプロジェクトが始まってしまったがためにストップしているベーシックマウス。ハードとしてはできているのだが、ソフトがいまだ白紙状態。 今日は気が向いたので、ちょっとだけソフト設計の続きをやってみた。
今日の反省。 繰り返し型のソフト開発を進める上で、最初から大上段に構えて全部詳細まで設計するのはダメダメで、失敗する典型的な例。 すぐ必要な最低限度から設計・実装して、必要に応じて追加していくのが吉。 マウス用ソフトの設計でも、最初から迷路を走行するプログラムを書こうってのがそもそもの間違いで、センサテストモード、モータテストモードなどから設計・実装していくのが良いみたい。
メールを書いて、お風呂に入って、ソフト設計を少しやって、この日報を書いたらすでに午前2時半。
今日は会社の先輩からもらったRS-232Cドライバ(MAX232CPE)を例の実験基盤に実装してPIC-PC間で通信実験をした。回路図の修正から半田付け、通信実験という順番でやったわけだが、回路図の修正が終わった時点ですでに日付がまわってしまった。24時を過ぎてから、基盤の空きスペースに無理やりICソケットとコンデンサ5個を押し込んで半田付け&配線。通信実験のほうはPICのプログラムにまったく修正を加えず一発OK。PIC側から送った文字列が正しくPCのハイパーターミナルに表示されているので、ちゃんと通信ができているということなのだろう。
ここまでできたら、次にやることはVBで書いたプログラムからPICをコントロールすること。それができたら、PICを使ってラジコンサーボを制御するところに着手する予定。
今日は自宅Webサーバを目指して、休眠中のPCにVineLinuxをインストールしてみた。でも、@niftyじゃ、回線がADSLかB-FletzじゃないとダイナミックDNSサービスを受けさせてくれないようだし、固定IPもドメイン名も未取得なので、サーバ構築はお預け。
で、昨日予告したPCとのシリアル通信実験。 C言語でちょ〜簡単なプログラムを書いて、PICに落として、PCにつないでみたけど、文字が化け化け。 最初から一発でうまく行くとは思ってないのだけれど、いくらプログラムをチェックしても、PC側の設定を変えてみても、文字は化けたっきり。 そしてたどり着いたのは、回路が間違っているんじゃないかってところ。 「C言語によるPICプログラミング入門」(後閑哲也著、技術評論社)のサンプルにある回路図と見比べてみて、私の回路と異なるところは・・・ずばり、私の回路にはRS232CレベルコンバータICが入ってないというところ。 AKI-H8/3048のときも、AKI-H8/3664のときも、自分でレベルコンバータICなんて追加せずにシリアル通信ができていたので、別につけなくても通信できるだろうと、そう思っていたのが悪かったようだ。
それじゃあ、RS-232CレベルコンバータICがないと、なぜ動かないのか? 本を引っ張り出してみたり、ネットで検索したりしてみてわかりました。 PC側のRS-232CとPIC側のTTLでは、論理の電圧レベルが全然違うんですね。 あれれ、でもPIC側からTTLレベルでしか信号を送ってないなら、PC側では常に0しか受け取ってないんでは? なら、なぜ文字化け??
シリアル通信というと、RS-232Cだの、USARTだの、SPI、SCI、I2C、CAN、USB、IEEE1394など規格がありすぎてなんだかよくわからないのが現状。でも、今日はPCのRS-232CポートとPICを繋ぐには、MAX232などのレベルコンバータICが必要だってことは理解した。 IC手に入れたら続きをやってみよう。
木曜日は仕事で久しぶりに長時間のミーティング。これが疲れの原因なのか、これに間に合うようにがんばってきたのが原因なのか、ミーティング後は集中力が持たず、さっさと20時には帰宅。帰宅したら、布団も敷かずに就寝。金曜日は資料をまとめて終り。ロボット作りは一切なし。
今日は、PIC16F876Aにアセンブリ言語で書いた簡単なプログラムを書き込んで、水曜日に作った実験用基盤の動作チェックをした。一発でOK。問題なし。たいして複雑な回路じゃないけれど、配線の取り回しがだいぶマシになってきたなぁと関心。でも、まだ他人には見せられない(汗)
さて本題のCSS-PCM。ミドルレンジPIC用のCコンパイラで、組み込み関数が豊富。 IPIから購入すると、送料込みで\27,050-。 インストール時に"Did not found MPLAB.INI" ってなような(?)メッセージがでてMPLAB(統合環境)への組み込みがうまくいかなかった。でも、これはMPLABをインストールしてあるディレクトリからMPLAB.INIをコピーしてPICC(CSS-PCMをインストールしたディレクトリ)に貼り付けてから、コマンドラインで ccsc +setup ってやったら先ほどのメッセージが出なくなったので、きっとうまく行ったんだと思う。MPLAB設定もちゃんとできたし、Cのコンパイルもできから。
Cコンパイラを使ってみて思ったこと。恐ろしく簡単すぎる!・・・と思うのは、先にアセンブリ言語でプログラムを書いていたからなのだろうか? たとえて言うなら、いままで自転車に乗ってた人が原付に乗り換えたようなもんです。免許書も給油も必要ないけど。C言語歴が長い私には、もう後戻りできません。とりあえず、8個つけたLEDでナイト2000みたないことをして、ボタン入力も受け付けてくれることを確認したところで今日は終り。明日はいよいよPCとのシリアル通信実験の予定。