FreeBSD上でSH2の開発環境構築とSH2を使ったDCサーボモータの制御のページ
その2

SH2の開発環境とDCサーボモータを制御する方 法を紹介してきます。


2005年
10月2日
DCモータのドライブ回路の実験を行ないました。H型ドライブ回路で必要なDC-DCコンバータをプロセッサボードの下に実装します。これは5Vから絶縁された5Vを作ります。 H型の上側のFETは12+5=17Vをゲートに加えます。


先週、間違っていたGALの修正版を実装し、オープンコレクタのドライバ(7406)も追加します。実験なので、H型ドライブ回路はバラックで作りました。

写真はバラックで 作ったH型のドライブ回路です。テスト用にロータエンコーダでパルス幅を調整できるようにして、モータを回します。12Vは5Aのスイッチング電源ですが、少し容量が足らないようで、急加速すると保護回路が働いて、12Vが落ちます。ゆっくり加速すれば、パルス幅に応じて回転数制御できることが確かめられました。後で、実験用電源を変更します。写真ブレてます。

下はH型のモータドライバのブロック図です。FETはたまたまあったモトローラのMTB75N03HDLという型番です。25V75A、オン抵抗9mΩです。ちょっと電圧が低めですが、これを使って実際の回路も作る予定です。DC-DCコンバータの5Vは12Vに上乗せして17Vにして、上側のFETのゲートに接続されるプルアップ抵抗の電源に使います。



10月8日
左は拡張ボード上に作製した12Vから5Vを生成するDC-DCコンバータです。右側は先週バラックで実験をしたH型ドライバを2組拡張ボード上に作ります。モータを接続する端子台も追加ました。

モータを2つ接続してボード上のH型ドライバの動作テストを行います。正常に回りました。モータの 正転/反転もテストしておきます。電源は12Vのバッテリから取りました。恵梨沙 フォントかASCII文字だけ抜き出したフォントを組 込んでテストを行いました。機構の方も少し作業をしました。ここを クリックしてください。


2006年2月11日
ソフト開発とCADの図面入力用に購入したThinkPadのT22です。スペックはP3−1G、384Mバイト、32G、 DVD-ROM、1400x1050液晶です。処理速度は自宅アパートのPCとほぼ同スペックです。オークションで購入した時にOSが付属していなかったため、潔く全領域をFreeBSD6.0にしました。DVDが付いているので、雑誌の付録のDVDから簡単にBSDがインストールできました。小型のUSBマウスも付ておきました。

これまでにインストールした主なソフトウェアは以下です。

機械系
 qcad - 2D 製図
 mged - 3D-CG

電気系
 kicad - 回路図、PCBアートワーク
xcircuit - 回路図
 oregano - 回路図
 spice3 - 回路シミュレータ

文書系
 openoffice - ワープロ+表計算+図
 acroread7 - アクロバットリーダ
firefox - WEB閲覧

音楽系
 xmms - mp3プレイヤ

開発環境
sh用gcc - sh2クロス環境
 ddd - デバッカ

先週、CNC用のPCにネットワークカード入れたのですが認識できなかったので新品を 購 入しました。700円でした。双方ともRealTeckのカニマークのイーサネットのコントローラですが、新品で購入した方は3139が載っています。失 敗したものは3039?で違うップが載っていまた。これが認識できなかった原因と思われます。しかし、新品の方は認識には成功したものの、SCSIコント ローラとIRQが重なっていてMACアド レスが全て0の表示になってしまい、取りあえずSCSIカードを外しました。

CNC用PCにDHCPサーバをインストールし、クロスのLANケーブルで接続し てping telnetftの接続テストを行ないます。正常に通信できることを確認しました。

付属品もネットオークションで購入しました。DVDと排他的に使えるFD予備バッテリ

予備のHDDマウント英語キーに交換して外した日本語キー。



2月18日
Xの"-display"を使って、ノートPC側でフラ イスの制御プログラムを表示/入力するテストを行ないました。"popen"で起動している"gnuplot"もノートPC側に表示されます。

ノートPC側
$ xhost +192.168.0.2
$ telnet 192.168.0.2

CNC用PC側
$ xmodrv -display 192.168.0.8:0.0 &


2月19日
オークションで購入した、USB-シリアル変換ケーブルのテストをします。SH2ボードはデバッグ時にはgdbとコンソールの2チャネルが必要ですが、ノートPCにはシリアルが1つしか無いため、ハブを介してUSB-シリアル変換を使います。"uplcom"ドライバをロードしてUSB-シリアル変換ケーブルを挿すと、"cuaU0"と いうデバイスが使え るようになります。FreeBSD6.0はdevfsのため、/dev下はデバイスが認識されてデバイスファイルが出現します。なので、MAKEDEVも 存在しません。4.11から移行してくると、ちょっと馴れが必要です。ゆくゆくはmozのドライバも6.0系で動かす必要が出てくると思います。dddの 方は通常のcuaa0を使いました。

$ kldload uplcom
$ cu -l /dev/cuaU0 -s 19200
$ ddd --debugger "sh-hitachi-elf-gdb -x gdbstartup jsp"


3月18日
サーボモータ制御のテストプログラムを作成して実験を行ないました。下がメインループを抜粋したプログラムです。TOPPERSのサンプルプログラムのメインループを以下のサーボプログラムに変更しました。プログラムは目標値と現在値の差分を2倍してPWMのカウンタに設定する簡単なP制御を行ないます。PWMに設定できる範囲は+−1000ですが、あまり大きくするとオーバシュートが 大きくなるので、+−600に制限しています。LEDをスクロールしている周期関数で目標値を変更して自動で移動動作させます。10000回に1回は状態をシリアル出力します。動画をリンクしておきます。動画は約4Mバイトです。


// 自動移動テストプログラムのメインループの抜粋

#define COUNTER_MAX 600
#define COUNTER_MIN -600

#define MOTOR2_DIR 0x0008

    // P制御定数
    Kp = 2;

    while (1) {

            // モータ2の現在値を得る
            Count2 = (short)*TCNT2;

            // 周期関数から目標値を得て設定値を計算する
            Err = (M_y - Count2) * Kp;

            // 設定値を制限する
            if (Err >= COUNTER_MAX) {
                Err = COUNTER_MAX;
            }
            else if (Err <= COUNTER_MIN) {
                Err = COUNTER_MIN;
            }

            // 設定値をモータ2ドライバへ出力する
            if (Err < 0) {
               // 反転
               sil_wrh_mem (PEDR, sil_reh_mem (PEDR) & ~MOTOR2_DIR);
               sil_wrh_mem (TGR4B, (Err * -1));
            }
            else {
               // 正転
               sil_wrh_mem (PEDR, sil_reh_mem (PEDR) | MOTOR2_DIR);
               sil_wrh_mem (TGR4B, Err);
            }

            // 10000回に1回はシリアルへ出力する
            if (!(Loop % 10000))
                syslog(LOG_INFO, "Count=%d State=%d Err=%d\n", Count1, Y_state, Err);

            Loop++;

        }

次に使っていない方のロータリエンコーダから手動で 設定値を設定できるプログラムに変更します。ロータリエンコーダを回転させると追従してモータが回り ます。
これは実際にミッションに取りつけて移動量を調べるためのプログラムです。調子づいてエンコーダを反復してぐるぐる回していたら、ボードの電 源に入っている15Aのヒューズが飛びました。トルクが かかると大電流が流れるようです。タミヤのページにスペックがあります。ここをクリックしてください。こちらも動画をリンクしておきます。動画は約6Mバイトです。

// 手動移動テストプログラムのメインループの抜粋

#define COUNTER_MAX 600
#define COUNTER_MIN -600

#define MOTOR2_DIR 0x0008

    // P制御定数
    Kp = 2;

    while (1) {

            // モータ2
の 現在値を得る
            Count2 = (short)*TCNT2;

            // モータ1
の エンコーダから目標値を得る
            Count1 = (short)*TCNT1;

            // 差分にP係数を掛けて設定値を計算する
            Err = (Count2 - Count1) * Kp;

            // 設定値を制限する
            if (Err >= COUNTER_MAX) {
                Err = COUNTER_MAX;
            }
            else if (Err <= COUNTER_MIN) {
                Err = COUNTER_MIN;
            }

            // 設定値をモータ2ドライバへ出力する
            if (Err < 0) {
               // 反転
               sil_wrh_mem (PEDR, sil_reh_mem (PEDR) & ~MOTOR2_DIR);
               sil_wrh_mem (TGR4B, (Err * -1));
            }
            else {
               // 正転
               sil_wrh_mem (PEDR, sil_reh_mem (PEDR) | MOTOR2_DIR);
               sil_wrh_mem (TGR4B, Err);
            }

            // 10000回に1回はシリアルへ出力する
            if (!(Loop % 10000))
                syslog(LOG_INFO, "Count=%d State=%d Err=%d\n", Count1, Y_state, Err);

            Loop++;

        }

早速、実際にミッションに付けて実験します。ミッションを台車に乗せてPCの近くまで移動し、モータベースをミッションに取り付けます

とりあえず、トルクが足りるか心配のある前後の移動の実験を行ないます。回転方向は3速―4速に固定して、モータも外しておきます。

予め手動のロータリエンコーダで移動させ3速ー4速間の移動量を調 べます。結果は+−550となりました。プログラムを変更して自動的に+−550移動するように周期関数に設定します。現在のモータの減速比は75:1ですが、タミヤでは特注で納期はかかるものの、60:1、36:1などのモータも売っています。少し動作が遅いような感じですので、減速比の小さなモータでも実 験する予定です。減速比を小さくするとトルクも小さくなるので、この辺は色々と実験する必要がありそうです。以下のプログラムは周期関数の先頭部分で3速ー4速の目標値を設定 している部分です。これも動画をリンクしておきます。動画は約7Mバイトです。

  // LEDスクロール周期関数の先頭の抜粋
  // ニュートラルから開始

   Tloop++;

if (!(Tloop % 10)) {

if (Y_state == 0) {
M_y = -550; // 3速に移動
Y_state = 1;
}
else if (Y_state == 1) {
M_y = 550; // 4速に移動
Y_state = 2;
}
else if (Y_state == 2) {
M_y = 0; // ニュートラルに移動
Y_state = 0;
}
}


4月1日
たまたま、オークションで売っていた30:1のモータが落札できました。ギヤモータとギア単体の2個を落札しました。36:1のモータも出ていたのですが、こちらは落札できませんでした。


早速動かしてみみました。30:1では減速比が小さいのでP制御定数をにして動作させてみました。スピードとしては多分60:1と同じくらいと思われます。少し早くなりまし た。やはり60:1が丁度良さそうです。前後に比べて回転方向は ほとんどトルクがいらないので、回転方向に30:1を使う予定です。動画をリンクしてお きます。



4月8日
タミヤから購入した60:1のギアモータです。特注ですが、注文してから2週間くらいで送られて来ました。


早速、動かしてみます。P制御定数を元の2に戻します。丁度良いでしょうか?ギア比の異なるモータを始めて動作させる時は注意が必要です。ギアによって回転方向が違うため、サーボが逆に効いて暴走します(笑)。75:1と60:1は同方向ですが、30: 1は逆回転です。モータに付いてるリード線の色は回転方向が異なっても同じ色になっています。動画をリンクしておきます。



4月8日
ボードの右下に74HC00を2個使い、シフトバドルのシフトスイッチ用RS−FFを2セット増します。FFの出力はSH2のIRQへ接続します。割り込み は立下りエッジを使います。


コネクタを介して、シフトパッドのスイッチを接続しま す。初期設定と割り込みハンドラの設定は来週作製の予定です。




line