目次
前
次
PID制御
実際に走行させると、前部を振る動作をします。
直進する場合、首振動作は走行時間を長くするので
これを何とかしなければと考えました。
MCR大会会場で、顔見知りになって情報交換している
知人にメールで相談すると、PID制御が必要と回答が
きました。
学生時代に、制御の大家である教授の講義を受けましたが
PID制御を詳しく勉強したことはありません。そこで参考
書籍を探しました。
この書籍には、シミュレータがついています。シミュレータ
を操作して、数式は理解できるのですが、モデルを入れない
と実際の動作をシミュレーションできません。
「パソコンで学ぶ自動制御の応用学 」という書籍の基になった
内容をトランジスタ技術のバックナンバーから探し出しました。
この中にあったOPアンプ利用の実験ボードを作成して、モデルを
考えるべく動かしてみました。
PID制御対象は、実験ボードですが、この基板を動かすには
次の3つの入出力が必要です。
制御に対応させると、次のようになります。
- 操作量 D/Aコンバータ
- 制御量 A/Dコンバータ
- 外乱 デジタル出力
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)
目次
前
次