2013/06/06

深刻なドライバー不足

3年のKです。

今日はサークルの定例会で、諸担当を決めていました。
(i)主に決めたのはレスコンに提出する書類の担当です。
(ii)また、当日搬送しなければいけないのでドライバー(最初ソフトウェアのドライバーしか浮かびませんでしたが運転手ですね;)を募りました。
サークル内の人間はロボット製作にていっぱいなので先輩方にお願いのメールを送らせて頂きましたが結果はいかほど……。もう来られていないのに申し訳ないですが是非協力をお願いいたします……。
(iii)そして、新入生は工作機械を使うための講習を受けて頂きます。工作センターの職員の方々が開いて下さる毎年恒例の講習ですが、今年は去年より日程が遅いですね。
明日からと言う急な日程ですが参加のほどよろしくお願いします。4コマ終わりの4時20分に次世代工作センターに集合です。

そして機能のサーボを分解した結果、どうやらモーターがいかれている模様です。
これは買い直しかな……。

3個動かない件の実験結果は : 
・IDはそれぞれ1, 2, 6を使用した。
(1) 2個のサーボを連結させ、1つが通信の先端、もう1つは先端のサーボの2つめのコネクタに接続した。その結果、全ての組み合わせでサーボが動いた。
(2) 3個のサーボを連結させた結果、動いた。

どうやら私の送ったシリアルデータが問題だったようだ。
すかさずICSのUSBAdapterの送るデータ内容を検証。
 データに誤りなどはなさそうだ。

もう一度ブレッドボードにPICを戻して動かしてみる。
あれ、動くじゃないか。3つでも動くじゃないか。
送信間隔が短すぎると踏んでボタンで1つずつ送信するようにしてみても動くじゃないか。
 そのままのプログラム(とにかくデータを送りつけるタイプ)でも動くじゃないか。
どうやら基板に刺すと動かなくなるようだ。
 もう一度データが送れているか確認したところどうやら送れているようだ。

基板の出力ピンだけからシリアルデータを取り、電源は別のところからとっても動かない。(2つまでは動く)

どうやらシリアルデータ自体が、3つ以上サーボをつなぐと正常に出力できていない(信号電圧が足りない?)ようだ。
テスト用ブレッドボードに付いていなくて、基板に付いている信号ピンの先についていたものは……
(CMの後驚愕の事実が!!)


金赤黒茶の縞々模様が!!


受信端子に付けるはずの抵抗を謝って送信端子に付けていたみたいです。3個になって、出力インピーダンスの影響が出てきてしまい、送信できなかったようです。


あー申し訳ないテスト希望の皆さま。

これで安心して本機用の基板が作れます;;
RCサーボ用は低性能の16F648Aでも使おうかな☆

今後の予定☆
以下システム開発の予定を立てていきます

(1) メイン基板の作成
I2Cで各基板に送信する役目を果たす基板。CRCとか余り詳しくないのでその辺の実験も必要。
どれほどの伊豆が乗って遅延が発生するのか検証し、16F1827が使用できるか確認する。(おそらくスペック的には十分)
(2) メインプログラムの作成
現段階ではテスト用の入力・画面出力しか備わっていないので入力に応じて通信するプログラムを作成する。(これは前作ったチャットプログラムを流用することにする。ただしUDP版)
他の機体と通信できるように。各機体にはIDを付けて機体自体で管理できるようにする。
(i) サーバープログラムを立てる
(ii) 各機体のPCはTPIPと通信を確立する
(iii) 各機体のPCはサーバープログラムと通信を確立する
(iv) 各機体のPCはTPIPから送られる映像データを、他の機体へ要請があれば転送する。

この際、命令は
(i) 映像を取得したい機体のIDを一覧(サーバーに要請する)から選び、サーバーに命令を送る
(ii) サーバーはその機体に対して映像を送る命令を出す
(iii) その機体のPCはサーバーではなく直接他の機体と通信を確立し、映像を垂れ流す。

ところで設定関係のプログラムも作らなければならないが、
アームの画面表示等、CSVファイル(あるいはXMLファイル)だけでは表現しきれないことが発生する。
これに対応するためにスクリプト言語による小差の設定が出来るようにしたい。
(出来れば私の好きな言語Rubyにしたいが難しそう)

PCは、現在の状態を表示するためにTPIPからデータを受信し(或いはサーボモーターの場合は現在の指定値から算出できる)、1フレーム毎にスクリプトを呼び出し、計算させ、
その結果を描画する。

描画する関数を予め用意して、スクリプトに処理させるのが理想である。
(TPIPSystem::Drawから行うなど)

各設定は例えば、IPアドレスや機体ID、機体名を始め.
・コントローラー入力設定(どんな入力デバイス?, 出力デバイスは何を使う?, 出力デバイスへの挙動の割り当ては?, スクリプトは?)
例えばPWMによる出力デバイス(個のサークルではExtenderと呼ばれている)をPS2のアナログ入力から行うとしよう。
PS2のアナログ値をPCが取得し、その値を歩きたいのサーボモーターに伝達しなければならない。PCはアナログ値をメイン基板に転送する。その際必要となる情報は、
(i) どの基板に送るか
(ii) 基板上の何番ぴんから出力するか
(iii) 角度のデータ
であり、角度のデータは例えば0x00~0xffなどとするが、これは基板に依存する。
基板は個のデータを解釈して、例えば0x80をニュートラルなどと解釈する。
0x7fをミュートRaruと解釈する開発者も居るだろうし、符号付きの整数を用いる人も居るだろう。
即ち、PCは送るデータのフォーマットも含めて出力デバイスの詳細を知らなければならない。


ユーザーが入力する値(x1, x2, x3, ..., xn) → 出力ドライバー →基板上に送る値(y1, y2, y3, ..., yn)と変換してくれる出力ドライバーが居てくれると便利であり、
個の出力ドライバーはプログラム上ではなく別のファイルで定義できると便利である。
個のドライバーをスクリプト言語で記述できると大変汎用性のあるプログラムに仕上がる。

もしも出来ないときは残念ながら、既存のドライバーをプログラム内に記述し、
即ち、「一般PWM出力基板」などと決めて、コントローラの入力も選択 :
(i) アナログ
(ii) ステップ式のデジタル
するようにする。デジタルの場合は、ボタンを1回押すと角度が何度動くか、
同地押しは何秒間隔にするか、などのユーザーによる設定が必要になる。

さて、その設定は、1.各ボタン毎に割り振れるようにするべきであるか
(つまり○、△、□、×、……に対して割り振る形)、
それとも2.出力先のドライバーを選び、そのドライバーの出力に応じて割り振れるようにするべきか
(つまりPWM1~PWM8ピンに割り振る形)、
3.機能ごと追加していく形にするべきか
(つまり、カメラか移転用サーボ、駆動用DCモーター、など)
検討の余地がある。

1.の場合は、○と×を例えばPWMの+10, -10と設定した場合、関連性が分かりづらくなる。利点はボタンを操作する側に立てばどれを使おうか簡単に選べるという点である。
2.の場合は予め出力ドライバーを列挙し、そのドライバーのピンなどにボタンなどを割り振っていく形となる。何が使えるのが一目瞭然でわかりやすい。
3.の場合は「カメラ回転用サーボ1」 と登録し、その中でどのドライバーを使って何番ぴんから出力して、どんな入力形態で出力データに関する設定はどうして……というのを行う。

実際3が一番設定しやすいだろう。 やはりスクリプトが使えれば夢が広がる……

(3) 各基板の作成
今回シリアルサーボを導入するのでシリアル出力用基板を作りますが、単にシリアルデータを出力するだけです……。16F1827で性能で十分ですね。ただし100kbps以上の通信が必要なのでR8Cマイコンは使えませんね;

 ポテンショメーターの読み込み用の基板も作らないといけませんね。
こちらはアナログ入力をしてTPIPにデータを送る(メインマイコンにI2Cで送る)んですけど、
I2Cでスレーブ側が送信するプログラムを組んだことがないので実験します。
(これは来週かな……)

ポテンショメータの読み込み結果、画面に状態を表示しないといけません。
i. 数字で
ii. 画像で
出すんですが、iは簡単。ただし、場所・フォントを指定します。設定できるようにしたいな。
iiはやはり各機体ごと異なるので、プログラム中に指定するわけにはいきません。
但し解決策はあります。

アームの形状は――が組み合わさったものだと考えれば、
(i) 原点を用意する。回転平面を指定する(xy, yz, zx)。
(ii) 原点からr1の位置に支点(モーター)を作る。回転平面を指定する。
(iii) r1の位置からr2の位置に支点(モーター)を作る。……
と繰り返していけば、3Dで描画できます。

即ち、原点での回転方向と、rnと回転方向さえ分かれば描画できるのです。
これらを指定するのが設定ファイルの役目であり、部分的には解決します。
# ドライバーの件ではスクリプトファイルがとても有効なんですけどね……
# まあそんなにたくさんのドライバーは存在しないんですが。精々4種類

そのほかの基板は電源基板ですね。
電源は7.2V×2~3と10.8V×1~2の2種類。
i. コネクタはどうするか
ii. 緊急停止スイッチの仕組みはどうするか
iii. バッテリーへの振り分け回路や保護回路はどうするか
など問題があります。

iについては、基板にコネクタを付けて線をつなぐようにします。
その先は更にバッテリーとつなぐコネクタを用意します。
iiについては全ての電源はスイッチを通して電流が流れるようにします。
或いはリレーを使います。(ここは未定、スイッチの定格電流を再度調べておきます)
 iiiについては未検討です。バッテリーのショート防止用に何かあった方がいいと思いますが、そもそもシリアルサーボ自体電流を消費するのであまり保護できないんですよね;

バッテリーについても連続駆動時間の実験を調べる必要がありますし、
バッテリーの負担分配(電圧が違うと駆動モーターの左右で挙動が代わってまっすぐ進めない)も検討しなければなりません。

基板上には刺すピンが同電圧の電源として共通になっていて、
その電源への供給は、ICが制御してバッテリーを選択するという方法もありますが、
切り替え時のノイズが怖い。これも要実験あるいは見送り。

バッテリーの状態はPC上から分かった方がいいので、電源基板とメインボードとI2Cで通信して、逐一報告できるようにしたいですね。アナログ入力でいいでしょう。
10.8Vまでなので、抵抗で分圧して1/3とします。15Vだとしても5Vとなるので入力電圧には余裕があります。
ただしAD変換の精度は精々8bitとしておきますので、5/256 =  0.02[V]まあこれだけあれば。0.02×3 = 0.06Vの精度で計測できますから、バッテリーの有無程度の場合には支障がありません。0.1V精度でも十分ですからね。

するとバッテリーの設定も必要となります。
バッテリーの電圧低下による自動停止・ここのバッテリーの停止命令などがあった方がいいでしょう。
すると、バッテリーの停止に伴ってFETやリレーが必要となります。
どちらかや水泡を採用しますが、MOS-FETで十分な気がします……。電流や放熱の設計によってはリレーになるかもしれませんが。出来れば小さい方がいいよね。

……他に何かありますかね。明日1コマから授業なので今日はこの辺で……ハンバーグ作りたいしね

余談☆
今日M8ネジ買ってきました。あと防振用ゴム(そう書いてなかったけど)これでようやく買ったヘッドライトを装着できそうです。H4バルブ化したので前方も明るくなったかな。 なおライトユニットの中に入っていたコード類が外に飛び出してしまったため雨の対策が必要な模様……

0 件のコメント:

コメントを投稿