センサを使ってみたり、モータを回してみたり

[IMAGE]成長したテスト用マザーボード(^^;

OSが載り、対話的に操作するベースとなるプログラムも出来ました。そろそろ 何か、本当にマイコンを動かしているんだなと思えるような事を始めたいもの です。

そこでセンサの登場です。精度がどうこうとか言い出すとこの道もかなり険 しいものになってしまうようですが、それは趣味の世界。やってみて「まぁまぁ な感じ」がしたらOKです。

使うデバイスは安くて入手が容易、出来るだけ簡単に事を済ます為に外付け部 品が少ない程嬉しいですね。調整箇所が無ければさらに言う事無し。

そんな方向でセンサを3664に繋ぎ、測定を行なってみました。

しかし、何かもの足りません。こうして入力が出来ると何か出力がしたくなる のは自然な感情です。それではモータでも回してみますか。

2001.02.25記 新井
2001.03.15更新


  1. 温度計にする
  2. モータを回す
  3. 回転計をつける
  4. 明日はどっちだ?

温度計にする

まずはありがちな温度計から始めましょう。

使う温度センサは、National SemiconductorのLM35DZです。選択理由は…単に 秋月で手に入るそこそこの値段の温度センサの一つである、という事だけです。 250円也。

[IMAGE]LM35DZ 特徴:
  • 摂氏(℃)温度に直接校正されている
  • 温度係数はリニアで+10.0mV/℃
  • 0〜100℃の温度範囲
  • 4〜30Vの動作電源電圧範囲
  • 低自己発熱、静止空気で0.08℃
  • ±1/4℃以下の非直線性(代表値)
  • 低出力インピーダンス、1mA負荷で0.1Ω
手軽にいい加減に使うには都合が良さそうです。出来る限り外付け部品、配線 箇所、ハード的な調整箇所が少ない事が理想ですから。なにしろ手元にある測 定器といったら、お手頃なアナログテスタ一丁なもので。

いくら外付け部品は無い方が良いと言っても、LM35DZの出力電圧はせいぜい0〜 1.0Vというところなので、簡単にVoutをAN0に直結したのでは、3664に入って いる基準電圧AVcc(AKI-3664のデフォルトは=Vcc=5V、しかも16MHz駆動では 4Vまでしか下げられない)に対して少々小さいです。仕方無いので適当に増 幅してやりましょう。







[IMAGE]汎用オペアンプ LM358
それなりな汎用オペアンプ LM358
  • 動作させるのに±両電源は不要。
  • 補償回路内蔵のオペアンプを2個封入。
  • 単一電源 3V DC〜32V DC
  • 両電源 ±1.5V DC〜±16V DC
  • 大出力電圧スイング可
    0V DC 〜V±1.5V DC


そこでオペアンプを一発使います。入手性の良い、安い単一電源な汎用オペア ンプなら何でもいいのですが、やはりこれもNS製のLM358です。秋月で1個50円 也。

これで非反転増幅をするのですが、どの位の増幅率にすれば良いのでしょうか? 電源として5Vを使うなら、どうせ5-1.5=3.5V以上の出力は得られない制限もあ りますし。結局これは、測定範囲をどう定めるかという問題のようです。

抵抗は金ピを使ってみたり、半固定を加えて調整の余地を残したり、センサま でのケーブルの特性を…なんて事はしません(出来ません?)。さっぱりきっぱ りが合い言葉。

それでは回路図(と書くのは恥ずかしいほど)です。

電子回路の(教科書|入門書)を見れば必ず載っている非反転増幅回路です。特 に説明の必要は無いでしょう。少し抵抗が大きいかなという気がしないでも ないですが、部品袋の都合です。DCだし、元々色々な事をサックリ無視する前 提でやってるので、可としましょう。


[IMAGE]LM35DZ 温度センサ接続図
簡単な温度センサ接続回路

とにかくこれでLM35DZの出力を(設計上)約5.7倍してAN0に入力出来ました。

LM385の電源として6.5V以上を供給すると、出力は約88℃で5Vを上回るので(更 に6.8V以上供給時に93℃を超えると、AN0〜3の絶対定格、AVcc+0.3Vをも上 回る!)注意が必要です。

このように2〜60℃の測定が出来るハードが出来ました。次はソフトです。 テストとして温度を測るだけのものなら、特にタスクとしての実装を考えた り、割り込みで効率的な処理を云々とかいうのは考えなくて良いでしょう。ほ ぼAKI-3664附属のSAMPLE内のADROM.MARと同様なものを書きます。

A/D変換データをだらだらと表示するコマンドをミニモニに加えたものが、

adc.tar.gz (9993 bytes)
となります。

何か測定してみようと思って辺りを見渡したのですが、あまり適当なものがあ りません。そこで最も身近な熱源(?)である『私』を測定してみることにし ました。

[IMAGE]センサと膝 [IMAGE]センサを挟む
膝のところで温度を測定(若干汚い構図^^;)

測定データの記録の仕方ですが、/usr/bin/scriptを使っても良いですし、 ~/.tiprcを

script
record=<記録するファイル名>
としておくのでも良いでしょう。

実際の測定はこんな風になります。

frodo% tip cuaa1d
connected

Minimum Monitor V0.01 (on HOS-H8h v0.07)

% 
0		 : Display TIME
1 XXXX XXXX	 : Dump           #START #END
2 XXXX		 : BYTE write          #START
3		 : Event flag status
4		 : MailBOX status
5		 : TASK status
6 XXXX		 : Wait mail              #ID
7 XXXX XXXX	 : Wait flag         #ID #PTN
8 XXXX		 : Wait semaphor          #ID
9 XXXX		 : ADC test          #CHANNEL
% 9 0
0986366
0991249
0991249
0991249
0986366
0986366
0986366
  (後略 リセットか電源OFFで終了します)
このプログラムは約0.5秒毎に16回取り込んでその平均値を出力しています。 数値(=電圧)だけ眺めていてもつまらないので、グラフ表示してみましょう。

グラフ表示にはGNUPLOTを使います。これはports/packagesから一発install可 能です。4.2-RELEASEならgnuplot-3.7.1になるでしょう。

値が出力されている部分を切り出してtemp.txtとし、次の処理を行ないます。

frodo% awk '{print (n=n+0.5) " " $0/(5.52*10000)}' temp.txt > temp.dat
frodo% gnuplot

	G N U P L O T
	Unix version 3.7
	patchlevel 1
	last modified Fri Oct 22 18:00:00 BST 1999

	Copyright(C) 1986 - 1993, 1998, 1999
	Thomas Williams, Colin Kelley and many others

	Type `help` to access the on-line reference manual
	The gnuplot FAQ is available from
	

	Send comments and requests for help to 
	Send bugs, suggestions and mods to 


Terminal type set to 'x11'
gnuplot> plot "temp.dat" with linespoints
すると結果はこうなります。

[IMAGE]測定グラフ
GNUPLOTによる測定結果グラフ

測定値が次第に私の『ぬくもり』に近付いていく様が観察できました。(へへ; 温度が少し低目に出ているのは、私が低体温だから…ではなく、抵抗のバラツ キから増幅率が設計値よりも出ていないせいとかでしょう、多分。

初期の目的は十分に達成されたようなので、特にこれ以上、ハード/ソフトに よる校正はやりません。


モータを回す

さて、こうしてA/Dコンバータを用いて外界からの情報を入力する事が出来ま した。次は何か出力してみたいものです。しかも目に見える形で。

これは3664のテストの意味も兼ねているので(それこそ本命)、今まで使っ ていないfeatureを採用したい所です。

タイマWでPWMしてみましょう。タイマWは16bit×4のジェネラルレジスタ (GRA,GRB,GRC,GRD)を備え、ソフトの介在無しに最大3つのPWM出力を実現で きます。

そして、そのPWMで何を駆動するかですが、『目に見える形』とはいえ光モノ ではつまりません。動くものを目指してみます。即ちモータ。

安く遊ぶという大原則は今に至っても揺るぎないものなので、やはりこれも秋 月に転がっていた小型DCモータを使う事にします。

[IMAGE]100円モータ
MABUCHI製 FC-280SA-16200
  • DC 12V(10〜15V)
  • 10,000RPM/25g・cm(STALL 220g・cm)
  • 軸径2.0mm 軸長9.95mm

リテールパッケージ(?)なマブチのREシリーズで小さい奴を買った方が、ピニ オンギアとかリード線とかが付いててお得だったかもしれません。

リード線、コンデンサを半田付けし、モータは準備OK。

これをPWMで駆動する訳ですが、どのような構成で動かすかも一思案です。単 純に一方向の回転速度を変化させるだけならば、PWM出力をそこそこ電流の流 せるFET/Trに入れて、モータの電源ラインに噛ませれば済みます。

しかし、これではちょっと不満です。せめて正転/逆転位はしたいではありま せんか。そうなると一方向のみの場合に比べ4倍の回路が必要になります。 部品の個数が4倍で、半田付けの箇所も4倍です。これは嫌ですね。




[IMAGE]DCモータ駆動回路
一方向のみの駆動 正転/逆転駆動可能

安くて部品数が減らせて、当然半田付け箇所も減らしたい。これは専用のドラ イバICを使うのが妥当な選択のようです。ありがちすぎで何ですが、東芝の TA7291Pにしました。秋月と同じ通りにある 千石電商で購入。200円也。

[IMAGE]TA7291P
TA7291P(東芝製)
  • 動作電源範囲:
    Vcc=4.5〜20V/Vs=0〜20V/Vref=0〜20V
  • 出力電流: 1.0A(AVE.)/2.0A(PEAK)
  • 熱遮断回路、出力端子プロテクタ回路内蔵
  • 逆起電力吸収用ダイオード内蔵
  • 入力ヒステリシス回路内蔵
  • スタンバイ回路内蔵

出力電流がやや小さいですが、小型モータを地味に5V駆動する分にはなんとか なるでしょう。

これをまた簡単に3664に接続します。加える部品はコンデンサ2個。3664 から入力する信号は、動作モード(ストップ/正転/逆転/ブレーキ)選択のため のIN1/IN2にP50/P51、制御電圧入力にFTIOBで3本だけです。ロジック側電源/ 出力側電源はともにVccを使います。本当はモータは最悪のノイズ源の一つな ので電源/グランドの分離云々というのがあるらしいですが…(いつものように 以下略)

それでは回路図です。またしてもそのままですね。Vsには電流制限抵抗を入れ る事が推奨されていますが、大容量の抵抗器も手元にないということで省略し ています。








[IMAGE]TA7291P DCモータドライバ接続図
簡単なDCモータ駆動回路

GRA〜GRBにはWORDアクセスのみということなので、例によってミニモニにPWMのパルス 幅設定のためのコマンドを加えました。

dcm.tar.gz (15240 bytes)
まずはモータを接続せずP50/P51をミニモニで10に設定し(PDR5:0xFFD8番 地にBYTE Writeする)、大体5×(GRBの値÷0xFFFF)Vの電圧がOUT1-OUT2間に出 ている事を確認します。PWMの周期としてミニモニでGRAに0xFFFFが設定されて いて、GRBがGRAと等しい場合はパルスが出ないので、(有意な差かどうかは別 として)GRB=0〜0xFFFEに対応する65535通りのデューティ比が設定できます。 そして正しく配線されていれば、P50/P51の値を01に変えれば電圧の向きが逆 転し、00/11で0Vになる筈です。

それではいよいよモータを接続し、PWMによるDCモータ駆動テスト用に拡張さ れたミニモニから操作してみます。


Minimum Monitor V0.01 (on HOS-H8h v0.07)

% 9 0 2000             ← パルス幅を0x2000に設定
GRB = 2000
2000 : 0000 : 0000
% 2 ffd8               ← PDR5への書き込み = 動作モード設定
FFD8 : 00 > 1          ← 動作モード設定  = 正転
FFD9 : FF >               (モータ、回転開始)
% 9 0 4000             ← パルス幅を0x4000に設定
GRB = 4000                (モータ、加速)
4000 : 0000 : 0000
% 9 0 a000             ← パルス幅を0x9000に設定
GRB = A000                (モータ、更に加速)
A000 : 0000 : 0000
% 2 ffd8
FFD8 : 01 > 2          ← 動作モード設定  = 逆転
FFD9 : FF >               (モータ、逆回転)
% 2 ffd8
FFD8 : 02 > 0          ← 動作モード設定  = ストップ
FFD9 : FF >               (モータ、停止)
% 
操作通りに動きましたね。始動/逆転/停止、GRBに設定するパルス幅 に応じて回転数も変化している感じです。…音からすると。

これでは『目で見え』てないですねぇ…。それにこのままでは「制御」されて いるとは言い難いです。モータの動きが3664にフィードバックされていないか らです。これは何とかしなければなりません。


回転計をつける

DCモータは安くて良いのですが、制御の為にはフィードバックの機構を加えな ければならないのが欠点です。かと言って100円でステッピングモータは買え ないので、何とか安いフィードバックを考えることにしましょう。

何か回転を検出する手段は無いものか…そう考えている時、目に映ったのは 昔POPULOUSのやり過ぎでボタンが馬鹿になってしまったマウスです。蓋を開けて みると、ありました。回転を検出する機構です。

[IMAGE]古い98バスマウスの中身 [IMAGE]フォトインタラプタの構造と回転検出
古い98バスマウスの中身 フォトインタラプタの構造と回転検出

モータにスリット入りの円盤を回させてインタラプタに噛ませ、インタラプタ のフォトトランジスタの出力を何らかのポートに入れることで、回転検出が出 来ます。

マウスでは回転方向検出の為に一軸あたり2個のフォトインタラプタが設 置されていますが、回転量だけが欲しいこの場合では一個で十分です。

出力を入れるポートですが、本当ならカウンタ入力に入れ、ソフトの介在無し のカウントや、設定値とのコンペアマッチ割り込みを利用をしたいのですが、 3664ではもう使えるカウンタタイマが余っていません。AはHOSのシステムタイ マだし、WはPWMに使います。Vはあることはありますが、3相のPWMに対して1個 しか無いのでは、先々(?)2個以上のDCモータを使いたい時に困ります。

そうなるとパルスのカウントはソフトでやらなければなりませんが、パルスの 検出に全力を割く訳にはいきません。割り込みを使わざるを得ないでしょう。 なにやら勿体無いような気もしますが、IRQを割り当てる事で要求を満たす事 にしました。インタラプタの出力をIRQに入れ、IRQ割り込み処理でカウンタを +1していきます。

このIRQ0割り込み処理はCで書くにはあまりに単純で短いものであり、HOSの ハンドラとして登録するのも、処理本体に比べてOSの割り込みハンドラの方が 重くなってしまいそうなので、ハンドラとしては登録せず、↓のようにしてし まいました。

; IRQ0/1の入力パルス数をカウントする割り込み処理
; 淋しいくらいの作業量しかないので、HOS-H8hの割り込みハンドラとしては登録
; しない自力処理

	.h8300h

	.section .text
	.align	1
	.global	int0e

int0e:			; IRQ0
	push.l	er0
	mov.l	@_irq0_c:16,er0
	inc.l	#1,er0
	mov.l	er0,@_irq0_c:16
	pop.l	er0
	bclr	#0,@0xfff6:8	; fff6 bit0 = IRR1 IRRI0 clr
	rte

	.section .data
	.align	2
	.global	_irq0_c

_irq0_c:			; IRQ0のカウンタ
	.long	0

	.end
HOSプログラミングとしては正しくないような気もしますが、より高機能を目 指してCによるコーディングや、タスクとの連係を考える迄はこれで許しても らいます。

[IMAGE]フォトインタラプタ接続図
簡単なフォトインタラプタ接続図

このフォトインタラプタは、千石で買ったメーカ不明の1個50円ものなので、 定格なんかは不明なのですが、それほど変わったものではないと思います。 LED部に20mA程度流し、フォトトランジスタ部のコレクタをVccに、エミッタを 適当な抵抗を介してグランドに落せば、エミッタから透過/遮光に対して1/0 の出力を取れるでしょう。プルアップしてコレクタから出力を取る方が一般的 (出力がGNDに落ちた場合を考えれば当然)かもしれませんが、実験回路か ら配線をし直すのが面倒なのでこうなっています。

出力の状態によっては、(ハードウェアマニュアルのブロック図によればIRQ? には元々内蔵されていますが)シュミットトリガのゲートやヒステリシスを持たせた コンパレータ等を挟むなどしないと正しくエッジが検出出来ない場合もあるか もしれません。実験結果がいかにもおかしいようだったら、改めて導入を検討 する事にします。せめてオシロスコープがあれば…。

部品袋と相談した結果の回路図を示します。

このように接続した後、ミニモニでPORT1を汎用入出力ポート/入力にして(素 通し/遮光)でP14が1/0と変わる事を確認します。

[IMAGE]千石で購入したフォトインタラプタ [IMAGE]フォトインタラプタのテスト
千石で購入したフォトインタラプタ フォトインタラプタのテスト

% 2 ffe4   (ミニモニでPORT1は"全て汎用入出力&全て出力"に初期化されている)

FFE4 : FF > 0f         ← PORT1 P14〜P17を入力ポートに設定
FFE5 : FF > 
% 1 ffd0 ffd4          ← そのまま(光は透過)
FFD0 : 08 00 FF FF F8 FF FF FF 00 FF AF C3 FF FE FF FF  | ................
% 1 ffd0 ffd4          ← 紙を挟む(遮光)
FFD0 : 08 00 FF FF E8 FF FF FF 00 FF AF C3 FF FE FF FF  | ................
PDR1なる0xffd4番地が0xf8(透過)から0xe8(遮光)に変化しました。これはつま り、フォトインタラプタの状態がP14に反映している事を示します。センサの 出力をポートに入力するハードが出来た事が確認できました。

それでは、モータにスリット付きの円盤(壊れたX68PROマウスより徴発)をつけ、 実際に回転数を測定してみましょう。ソフトに関しては、「カウンタクリア→ IRQの割り込みを許可→1分待ち→カウント数/18(一周のカウント数)=一分当た りの回転数 表示」を0x200刻みのGRBの設定値に対して行なう回転数測定コマ ンドが前述のdcm.tar.gzのミニモニに既に含まれています。

[IMAGE]スリット入り円盤を装着 [IMAGE]回転数測定の様子
スリット入り円盤を装着 回転数測定の様子

測定の様子です。

Minimum Monitor V0.01 (on HOS-H8h v0.07)

% 
0		 : Display TIME
1 XXXX XXXX	 : Dump           #START #END
2 XXXX		 : BYTE write          #START
3		 : Event flag status
4		 : MailBOX status
5		 : TASK status
6 XXXX		 : Wait mail              #ID
7 XXXX XXXX	 : Wait flag         #ID #PTN
8 XXXX		 : Wait semaphor          #ID
9 XXXX XXXX	 : PWM Duty set     #CH #DUTY
A		 : Display RPM
% a
00000  00000
00512  00000
01024  00000
01536  00006
02048  00014
02560  00024
03072  00034
       (中略)
63488  02825
64000  02849
64512  02778
65024  02817
% 
こうして測定した結果から、温度測定の時同様、GNUPLOTでパルス幅-回転数の グラフを描いてみます。↓のように得られました。

[IMAGE]測定グラフ
GNUPLOTによるパルス幅-モータ回転数グラフ

まず、若干のふらつきがあるのが気になります。まぁ、多少の変動があるのは 当然ですし、それ以外にも心当たりは沢山ありますが…。この件に関して「も」 目をつぶ…。

低速域において目視した結果では、そう間違えた値でもないようです。よって、 この回路のままでも大丈夫であろうと判断します。また、高速域についてです が、グラフの流れからは特に「折り返し」が生じているようにも見えないので、 割り込み処理が追い付いていないという事もなさそうです。でも何かあやしい ですね。試しにモータに12V入れて計測したところ9,700台を出したので、多分… 。

このモータの実力を求めるなら、マブチモーターのデータによ れば10V以上が欲しい所です。モータ用電源を別に取り、Vref入力にはFET/Tr でPWM出力をレベル変換したものを入れるようにすれば出来るでしょう。しか し、『配線/部品は少ないほど良い』という原則に反します…。このままの回 路でやるとすれば、もっと低電圧タイプのモータの方が良いのかもしれません。

実際にある程度の負荷を加えた場合や、与えられたステップ数回転して停止と か、制御された加速/減速等を済ませなければ「DCモータの制御を実現した」 とは言い難いですが、実体を持たないテスト環境ということで、ここまでにし ます。いづれそれらは『実体』を持った時にでもやらねばならないでしょうけ ど。


明日はどっちだ?

温度センサは放っておいて、制御されたモータ=「足」を3664に備える事が出 来ました。RTOSとしてHOS-H8hも既に動いています。

これは即ち、アレへの最低限度の準備が整ったことを意味します。 今まではあまり本来のRTOSとしての利用が出来ていなかったHOSも、アレをやっ てこそ真価を発揮する筈。

アレの世界は高精度な工作や超絶のソフト技巧等の、ノウハウの蓄積が必要とさ れるとも聞きますが、果して…。