目次

PID制御

 実際に走行させると、前部を振る動作をします。

 直進する場合、首振動作は走行時間を長くするので
 これを何とかしなければと考えました。

 MCR大会会場で、顔見知りになって情報交換している
 知人にメールで相談すると、PID制御が必要と回答が
 きました。

 学生時代に、制御の大家である教授の講義を受けましたが
 PID制御を詳しく勉強したことはありません。そこで参考
 書籍を探しました。



 この書籍には、シミュレータがついています。シミュレータ
 を操作して、数式は理解できるのですが、モデルを入れない
 と実際の動作をシミュレーションできません。

 「パソコンで学ぶ自動制御の応用学 」という書籍の基になった
 内容をトランジスタ技術のバックナンバーから探し出しました。

 この中にあったOPアンプ利用の実験ボードを作成して、モデルを
 考えるべく動かしてみました。



 PID制御対象は、実験ボードですが、この基板を動かすには
 次の3つの入出力が必要です。

 制御に対応させると、次のようになります。

 3種の入出力を持っているマイクロコンピュータの手持ちが
 ないかと探すと、アナログデバイセズのADu7026があります。



 ARMプロセッサの中で、アナログ部分を強化しているADu7026と
 PIDの実験ボードの接続は、次の図に示す内容にしました。



 PersonalComputerの指令で、周期的に操作量を与えて、制御量の
 値を内蔵メモリに保存します。外乱を与えて、操作量を計算させ
 制御量を記録します。
 指定時間経過後、内蔵メモリに保存した操作量、制御量を転送させ
 グラフ表示します。

 制御をかけた場合の操作量、制御量がどうであったのかを
 シリアルインタフェースで、PersonalComputerに転送します。

 操作量、制御量の変化を表示するアプリケーションをTcl/Tkで
 作成します。画面イメージは、以下です。
 グラフの上を制御量、下を操作量としています。



 Tcl/Tkのソースコードは、次のようにしました。


#!/bin/sh

wm title . "PID analyzer"

# clear file names
set fname ""
set pname ""
set fd_in  ""

# add menu on TopLevel
. configure -menu .mnuTop
menu .mnuTop

# add sub form
.mnuTop add cascade  -label File -underline 0 -menu .mnuTop.file
menu .mnuTop.file -tearoff no

# add sub menu "Open"
.mnuTop.file  add command -label "Open" -command {OpenText}

# add sub menu "ShowImage"
.mnuTop.file  add command -label "Show" -command {ShowImage}

# add sub menu "Quit"
.mnuTop.file  add command -label "Quit" -command {exit}

# declare image file
image create photo input_image -file $fname

# set window size
set w 1000
set h 1000

label .lblTxt -textvariable fname
label .lblPgm -textvariable pname
canvas .gdat -width 256 -height 400
.gdat create rectangle 0 0 255 400 -fill black

pack .lblTxt
pack .lblPgm
pack .gdat

###########################
# Open Text File procedure
###########################
proc OpenText { } {
  global fname pname xrecode
  # set file types
  set ftype {{ "text Files" .txt} { "All Files" * }}
  # get file name from built-in tool
  set fname [tk_getOpenFile -filetypes $ftype -parent . ]
  # create file name
  set xlist [split $fname "."]
  set xlist [split $xlist "/"]
  set xlist [lindex $xlist end]
  set pname [lindex $xlist 0]
  set pname "$pname.txt"
  # initialize
  for {set i 0} {$i < 256} {incr i} {
    set xrecode($i) ""
  }
  # open files
  set fd_in [open $fname "r"]
  # justify context
  set i 0
  while { [gets $fd_in sbuf] >= 0 } {
    # separate and divide
    foreach e $sbuf {
      set xrecode($i) "$xrecode($i) [expr $e / 20]"
    }
    # increment
    incr i
  }
  # close
  close $fd_in
}

#######################
# Save Image procedure
#######################
proc ShowImage { } {
  #global xrecode .gdat
  global xrecode
  # tk_messageBox -type ok -message "show $pname"
  # clear screen
  .gdat create rectangle 0 0 255 400 -fill black
  # start point
  for {set j 0} {$j < 8} {incr j} {
    set ys($j) [lindex $xrecode(0) $j]
  }
  # show
  for {set i 1} {$i < 256} {incr i} {
    # get end point
    for {set j 0} {$j < 8} {incr j} {
      set ye($j) [lindex $xrecode($i) $j]
    }
    # calculate
    for {set j 0} {$j < 8} {incr j} {
      if { $j < 4 } {
        set s($j) [expr 200 - $ys($j)]
        set e($j) [expr 200 - $ye($j)]
      } else {
        set s($j) [expr 400 - $ys($j)]
        set e($j) [expr 400 - $ye($j)]
      }
    }
    set xs [expr $i - 1]
    # line
    .gdat create line $xs $s(0) $i $e(0) -fill red
    .gdat create line $xs $s(1) $i $e(1) -fill green
    .gdat create line $xs $s(2) $i $e(2) -fill yellow
    .gdat create line $xs $s(3) $i $e(3) -fill blue
    .gdat create line $xs $s(4) $i $e(4) -fill white
    .gdat create line $xs $s(5) $i $e(5) -fill brown
    .gdat create line $xs $s(6) $i $e(6) -fill gray
    .gdat create line $xs $s(7) $i $e(7) -fill lightblue
    # update
    for {set j 0} {$j < 8} {incr j} {
      set ys($j) $ye($j)
    }
  }
}



(under construction)


目次

inserted by FC2 system