Junのページへようこそ!

 

Junで〜っす.よろしくね

 

  


僕の愛車MarkUです.

自走式倒立振り子の製作

目的

本研究では,モータで駆動される移動台車の上で振り子を倒立させるマシンについての設計・製作を行う.これは倒立振り子の一種と考えられるが,自走式倒立振り子は通常の倒立振り子と異なり,電気回路やバッテリを台車の上に乗せなければならないため,より軽く小さく作る必要がある.またすべりの問題もあるため,すばやい動きをさせることは難しいという問題もある. これらのことを考慮しながら,本研究では自走式倒立振り子の製作を行う.

 

自走式倒立振り子の原理

 

 自走式倒立振り子とは,前章でも述べたように台車に振り子が自由に回転するように接続されており,図1.1のようにモータの駆動力を制御して振り子が右に傾いたら台車を右に動かし,左に傾いたら台車を左に動かし,常に直立させようとする動作を繰り返す装置である.このような制御を用いないと振り子は倒れてしまう.

 

 

 

1.1 振り子と台車の動き

 

 

 

自走式倒立振り子の製作(1号機)

 

システムの概要(1号機)

 

自走式倒立振り子は機構部と電気回路部で構成される.本装置の回路部には倒立振り子の支持部にポテンショメータが取り付けられており、このポテンショメータによって直立状態を0度として,振り子が左方向に傾いたら−の値を,振り子が右方向に傾いたら+の値を,振り子の傾いた角度分の電圧値として出力できるようになっている.また機構部の台車にはDCモータが取り付けられており,ギヤをはさみ間接的にタイヤがつけられており,駆動力を与えることができる仕組みになっている.

機構部のポテンショメータにより,振り子が傾いた角度分を電圧に変換し,オペアンプにより増幅し,機構部のDCモータを駆動する.ここで,出力された角度が−ならモータによる駆動力を左方向に,角度が+なら駆動力を右方向に加えることにより,振り子を直立させることができる.

 

 

2.1 自走式倒立振り子(1号機)の概念図

機構部の使用部品

 

1) モータ(タミヤRE260

2) ハイスピードギヤボックス(タミヤ減速比11.6:1

3) スポーツタイヤ(タミヤφ56mm

4) ポテンショメータ(500KΩ)

5) ユニバーサルプレート(タミヤ60mm×160mm

6) 単三電池×8

7)           スイッチ×2

8)           アルミ板(1mm

9)           アルミ棒(φ4) 

 

 

     

図  2.2 モータと     図2.3 スポーツタイヤ     図2.4 ポテンショメータ

ハイスピードギヤボックス

 

         

2.5 ユニ  図2.6 単三電池  図2.7 スイッチ    図2.8 アルミ板・棒

バーサルプレート      

 

製作方法

 

1)  倒立振り子に関する調査.

2)            ユニバーサルプレートを土台として,ギヤボックス,タイヤ,電池を取り付ける.

3)            ギヤはハイスピード,ハイパワーギヤボックスを購入し,どの減速比(11.6:118:141.7:164.8:1)が一番適切か試し,結果的に11.6:1を使用する.

4)            タイヤはφ36mmとφ56mmを試し,結果的にφ56mmを使用する.

5)            ポテンショメータと振り子の接続部分の製図(図2.9参照)を描き,工場に製作を依頼した.

6)            電池,ポテンショメータ,振り子,スイッチ,回路を取り付けたが,電池を載せることにより,質量が大きくなり十分な加速がえられないため外付けにする.

7)            スイッチは,回路が容易になるため2つ付ける.

8)            振り子が重力と逆方向に直立している時に,ポテンショメータの電圧が0Vになるように調節して振り子と台車をネジ留めする.

 

2.9 ポテンショメータと振り子の接続部

 

電気回路部使用部品

 

1) オペアンプ(モトローラ TCA0372DP1

2) 抵抗(100KΩ×4100Ω×447KΩ×4

3) 基盤(50mm×70mm

 

 

2.10 オペアンプ・抵抗・基盤

 

 

製作方法

 

1)            オペアンプと抵抗を用いた電圧を増幅するための回路を設計した.

2)            オペアンプ2つと3種類の抵抗,計12本を図2.12の回路図に基づき,基板にはんだ付けし,配線して回路を製作する.

 

 

 

2.11 製作した増幅回路

 

2.12 角度計測部を含む増幅回路

 

 

2.13  製作した自走式倒立振り子(1号機)

 

 

挙動の確認

 

 今回製作した自走式倒立振り子(1号機)の挙動を確認する.まず電池を車体に乗せると質量が大きくなってしまい,十分な加速を得られないため外付けにした.また振り子の立っている時間を計測しようと試みたところ,多くの場合直立した状態で停止したため,計測することができなかった.直立した状態以外の場合は,振り子が倒れる方向に台車が動き立ち続けるが,徐々に位置がずれていくため,中央に戻すために手で振り子を逆方向に軽くたたくことが必要であった.

 

 

 
  

 

 

 
  

 

 

 
  

 

 

 
  

 

10

 

 
  

 

12

 

11

 
  

 

2.14 自走式倒立振り子(1号機)の挙動

 

 

自走式倒立振り子の製作(2号機)

 

システムの概要(2号機)

 

1号機は振り子を直立させることはできるが,位置を計測するエンコーダ等を用いていないため,決められた位置で振り子を直立させることはできない.本章で扱う2号機はロータリエンコーダが接続されていて,始点からの距離が計測できるため,決められた位置で振り子を直立させることができる.また2号機は位置フィードバック制御,ワンボードコンピュータによるデジタル制御,速度を調節できるPWM制御を行う.

本装置には倒立振り子の支持部にポテンショメータが取り付けられており、このポテンショメータによって直立状態を0度とした振り子の角度を電圧値として検出できるようになっている.また台車にはDCモータが取り付けられており,タイヤに駆動力を与えることができる機構になっている.

 ポテンショメータにより角度を計測し,ロータリエンコーダにより位置を計測し,この2つのセンサにより得られた電圧をワンボードコンピュータにより,デジタル信号処理を行い,FETにより増幅してPWM制御を行い,決められた位置を中心に振り子を直立させるようにDCモータの駆動力を制御する.

 

 

3.1 自走式倒立振り子(2号機)の概念図

 

機構部の使用部品

 

1) ラジコン用モータ(マブチモータRS-540SH

2) スーパースリックタイヤ(タミヤφ67mm

3) ポテンショメータ(スペクトロール10KΩ)

4) ロータリエンコーダ(ネミコンOMS-100

5) 台車(タミヤ・ポルシェ)

6) アルミ板(1.5mm

7) アルミ棒(φ6

8)    バッテリ(タミヤ・二カドバッテリ7.2V) 

 

 

        

3.2 ラジコン用モータ     図3.3 スーパースリックタイヤ    図3.4 ポテンショメータ       図3.5 ロータリエンコーダ

 

 

          

3.6 台車                          図3.7 アルミ板・棒       図3.8 バッテリ

 

 

製作方法

 

1)            3.6に示した台車を組み立てる.

2)  アルミ板を電動のこぎりで切削し,図3.9に示す回路固定板,ポテンショメータ固定板,L字板を製作し取り付ける.

3)            ポテンショメータと振り子の接続部分は製図(図3.10参照)を描き,工場に製作を依頼した.

4)            3)の部品とアルミ棒で製作した振り子を接続する.

5)            アルミ板と台車をねじでとめて機構部が完成する.

 

 

3.9 アルミ板で製作した部分

 

3.10 ポテンショメータと振り子の接続部


電気回路部の使用部品

 

1) ワンボードコンピュータ(秋月電子AKI-H8/3048

2) FETNEC 2SK12902SJ330

3) タクトスイッチ×3

4) スイッチ×2

5) 発光ダイオード×4

6) アルミ板(1mm

7) 抵抗(22KΩ×210KΩ×23.3KΩ×21KΩ×4470Ω×2100Ω×6

 

3.11 製作した回路部


製作方法

 

製作した電気回路部の回路図を図3.12に示す.以下製作方法について述べる.

1) ワンボードコンピュータとタクトスイッチと発光ダイオードと抵抗を基板に取り付ける.

2) スイッチを押すと,発光ダイオードが光る数種類のサンプルプログラムを入力し,動作の確認を行う.

3) その基板にFETによるHブリッジ回路を製作するため,まずブレッドボード上でその回路を組みモータを接続し,正転逆転するかを確認する.

4) その回路を基板上で製作し,モータ,バッテリ,ポテンショメータ,ロータリエンコーダに配線する.

5) ワンボードコンピュータにPWM制御やA/D変換などのプログラムを入力する.

6) プログラム上でモータの駆動力を決定するフィードバックゲインの数値を微妙に変え,挙動を確認して一番適切な数値を選択し,自走式倒立振り子(2号機)が完成する.

 

 

 

3.12 電気回路部の回路図

 

 

3.13 製作した自走式倒立振り子(2号機)

 

挙動の確認

 

 今回製作した自走式倒立振り子(2号機)の挙動を確認する.1号機と異なり,2号機はロータリエンコーダを用いることにより,決められた位置で立ち続けることができることを確認した.振り子の立っている時間を計測しようと試みたところ,1分程度駆動すると,FETが非常に熱くなり,FETが破壊する恐れがあったため長時間は計測することができなかったが,1分以内は立っていられることが確認できた.しかし実験を何回も行う時は,FETの熱がなかなか低下しないため,1回動かしたら少し時間を置く必要がある.台車はある位置を中心に動くが,その幅は1.7m程度である.よってこのマシンを動かすためには,最低1.7mの凹凸のない平面が必要である.また無風状態でなければならない.

テキスト ボックス: 1 テキスト ボックス: 2
 


  

 

テキスト ボックス: 4テキスト ボックス: 3  

 

テキスト ボックス: 6テキスト ボックス: 5  

 

テキスト ボックス: 8テキスト ボックス: 7  

 

3.14 自走式倒立振り子(2号機)の挙動

 

2号機のプログラム

 

#include <3048f.h>                                                                 /*I/Oアクセス用インクルード*/

#include <stdio.h>                                                                  /*入出力用インクルード*/

 

#define COUNT                        2000

#define ST                                          0.005

#define MAXSPEED                  70

 

void init(void);                                                            /* 初期化 */

void motorSpeed(int speed);                              /* モータの速度(0-100) */

float getSpeed(void);                                                   /* サンプリングタイム毎に呼び出す */

int adconv(int channel);

void wait(int t);                                                          /* time*5msウェイト */

 

main(){

           int speed = 0,i;

 

           init();

           while (P2.DR.BIT.B0 == 1);

           while(1){

                      speed = (adconv(0) -518 )*2;

                      if (speed > 0) speed += 30;

                      else speed -= 30;

                      motorSpeed(speed);

/*                   printf("%f\n",getSpeed());*/

                      wait(10);

           }

}

 

 

void init(void){                                                            /* 初期化 */

           P1.DDR = 0xff;

           P2.PCR.BYTE = 0xff;

 

           RFSHC.RTCOR = 39;                                       /* システムクロック初期設定(5ms) */

           RFSHC.RTMCSR.BIT.CKS = 6;               /* Timer Internal Clk 1/2048 */

 

           ITU0.TCR.BYTE = 0x23;                                    /* Timer Internal Clk 1/8 */

           ITU0.GRA = COUNT;                                        /* カウントする数(波長幅) */

           ITU0.GRB = 0;                                                /* カウントする数(オンである幅) */

           ITU.TMDR.BIT.PWM0 = 1;                                  /* PWMモード */

           ITU.TSTR.BIT.STR0 = 1;                                   /* Start Count */

 

           ITU1.TCR.BYTE = 0x23;                                    /* Timer Internal Clk 1/8 */

           ITU1.GRA = COUNT;                                        /* カウントする数(波長幅) */

           ITU1.GRB = 0;                                                /* カウントする数(オンである幅) */

           ITU.TMDR.BIT.PWM1 = 1;                                  /* PWMモード */

           ITU.TSTR.BIT.STR1 = 1;                                   /* Start Count */

 

                                                                                                     /* ロータリエンコーダ用初期設定 */

           ITU.TMDR.BIT.MDF = 1;                         /* チャンネル2を位相計数モードに設定 */

           ITU.TSTR.BIT.STR2 = 1;                                   /* Start Count */

}

 

 

void motorSpeed(int speed){                             /* モータの速度 */

           if (speed > MAXSPEED) speed = MAXSPEED;

           if (speed < -MAXSPEED) speed = -MAXSPEED;

           if (speed > 0){

                      P1.DR.BIT.B3 = 0;

                      P1.DR.BIT.B4 = 1;

                      ITU0.GRB = 20 * speed;             /* カウントする数(オンである幅) */

                      ITU1.GRB = 0;                                     /* カウントする数(オンである幅) */

           } else {

                      P1.DR.BIT.B3 = 1;

                      P1.DR.BIT.B4 = 0;

                      ITU0.GRB = 0;                                     /* カウントする数(オンである幅) */

                      ITU1.GRB = -20 * speed;                       /* カウントする数(オンである幅) */

           }

}

 

 

float getSpeed(void){                                                   /* サンプリングタイム毎に呼び出す */

           int count;

           float coef = 1.053e-4;

           count = ITU2.TCNT;

           ITU2.TCNT = 0;

           return(coef*count/ST);

}

 

 

void wait(int t){                                                          /* time*5msウェイト */

           for(;t > 0;t --){

                      while(!(RFSHC.RTMCSR.BIT.CMF));

                      RFSHC.RTMCSR.BIT.CMF = 0;

           }

}

 

 

int adconv(int channel){

           AD.CSR.BIT.CH=channel;

           AD.CSR.BIT.ADST=1;

           while(AD.CSR.BIT.ADF==0);

           AD.CSR.BIT.ADF=0;

           if (channel==0) return(AD.DRA>>6);

           else return(AD.DRB>>6);

}         

 

 

まとめ

 

本研究では,移動台車の上に倒立させる振り子についての設計・製作を行った.これは倒立振り子の一種と考えられるが,自走式倒立振り子は通常の倒立振り子と異なり,電気回路やバッテリを台車の上に乗せなければならないため,より軽く小さく作る必要があった.

1号機では,電池を車体に乗せると質量が大きくなってしまい,十分な加速を得られないため外付けにした.これはモータの駆動力が小さいためだと考えられる.この装置は俊敏さが重要になるので,摩擦力の大きいタイヤを使用しなければならないことが分かった.また振り子の立っている時間を計測しようと試みたところ,多くの場合直立した状態で停止したため,計測することができなかった.これは,ポテンショメータの摩擦力が大きいためだと考えられる.直立した状態以外の場合は,振り子が倒れる方向に台車が動き立ち続けるが,徐々に位置がずれていくため,中央に戻すために手で振り子を逆方向に軽くたたくことが必要であった.

2号機では,十分な加速が得られないことは,ラジコン用モータに変更して,駆動力を大きくすることで解決した.またすべるため,摩擦力の大きいタイヤを使用しなければならないことが分かった.またポテンショメータの摩擦力が大きく,直立した状態で停止してしまう問題も,摩擦が少ないポテンショメータを選択することで,解決できた.さらに決められた位置で立ち続けることができない問題も,ロータリエンコーダを用いることにより,位置を計測しフィードバックを行うことにより解決することができた.