チャタリング退治&開発用リセット・クロック回路

スイッチのチャタリングを見ていきましょう。
こんな基本的な話も『CPUの創りかた』でバッチ解説されていて助かります。

f:id:marlesan:20160807081708p:plain:w250 f:id:marlesan:20160807081711p:plain:w250
タクトスイッチから直で信号を取ろうとすると、接点が衝突する瞬間にON/OFFが暴れる。これをチャタリング(とかバウンス)と呼ぶ。
なんかググって出てくるチャタリングの波形と形もタイムスケールも違うなという感じですが、ICの動作に影響してることはとりあえず分かります。スイッチからの信号が黄色、それをインバータに通したのが青です。

f:id:marlesan:20160807082253p:plain:w300
対策のひとつはCR回路を挿入すること。チャタリングしてもコンデンサの充放電に時間がかかるので、信号電圧はVccからGNDまで連続的に変化します(青)。タイムスケールがかなり伸びてるので波形では見えませんが、黄色の信号は立ち上がり・立ち下がりのところで最初の画像のようにガチャガチャしてます。

f:id:marlesan:20160807083720p:plain:w300
コンデンサをかませたところのなめらかな信号をインバータに入力すると、デジタル回路に優しいシャキッとした信号になります。これまたタイムスケールが違うので最初の画像と比較しづらいですが、青い信号の立ち上がり・立ち下がり部分を時間的に拡大してもガチャガチャしてません。
コンデンサを入れたのでスイッチを押してから最終的な信号が変化するまでに50msほど遅延が発生しています。今回の用途には全く問題なし。

f:id:marlesan:20160807091437j:plain:w300
実験回路

f:id:marlesan:20160807091514j:plain:w300
測定には Analog Discovery 2 を使っています。5V電源もとれる!

開発用クロック回路

以上、手動クロックの波形は問題ないということで開発用のクロック回路を作りました。

f:id:marlesan:20160807093348j:plain:w300
思ったより大変なことになっちゃったぞ。
左が手動クロック用のスイッチで、右がリセット信号用のスイッチ。上のトグルは手動/自動クロックの切り替えで、自動クロックの周波数は下にあるスライドスイッチで切り替えます(1Hz/10Hz)。要はTD4のリセット・クロック回路そのものですね。これくらいで1日潰してるようでは先行き不安です。

でもまぁ、この回路はデバッグに役立ってくれるはず。

f:id:marlesan:20160807093748j:plain:w300
自分しか読めない配線図。

レジスタ&ALU試作(失敗)

f:id:marlesan:20160805015424j:plain:w400
こんなのウゴク・ワケ・ナイス、と思いながら作業してましたがやっぱり動きませんでしたね……。はじめImData想定の4bitDIPスイッチからAレジスタへのデータ転送はクロックごとに上手くいってたので「やったか!?」と思いましたが、BレジスタとDレジスタ(プログラムカウンタ)に目視確認用のLED挿してから動きがむちゃくちゃになってAレジスタもフリーダムにチカチカするようになりました。困った。

一番怪しいのは抵抗内蔵LEDで、4本繋いだら40mAは流れる気がするのでこれは74HC161の定格を余裕で超えてますね(今調べた)。Dレジスタのカウンタがまず動いてなくて、引き離して単独で動作確認してもクロックの立ち下りで値が変わったりなので壊してしまったかもしれません。

明日はデータロードも含めて74HC161の基本動作チェックに取り組みます。あとはハンドクロックの波形が正しいか(ちゃんとチャタリングが消えてるか)確認して、リセット&クロック回路に問題なかったら開発用に基板に実装しよう。

お手製ダイオードアレイ

改良版つくりました - お手製ダイオードアレイ 改良版

CPUの創りかた』で紹介されているTD4の部品のうち、昨日の74HC154の他にはダイオードアレイDN9-1Cも通販でひょいっと買える感じではないようです。こっちはないならないでダイオード128個×両端=256箇所を根性ではんだ付けするだけの話に思えますが、TD4用に用意した基板ICB-98GUダイオードアレイじゃないと配線不可能なパターンだったので手作りしました。

f:id:marlesan:20160804013324j:plain:w400
ベンダーダイオードを曲げます。くるっとU字に曲げるには、オレンジの本体にもそのための突起があるんですが、付属の棒に巻いたほうが綺麗に仕上がります。

f:id:marlesan:20160804013547j:plain:w400
その辺にある基板とスペーサーでジグを作ってはんだ付けします。作業してる側を少し持ち上げるとやりやすいです。

f:id:marlesan:20160804013651j:plain:w400
念のため導通チェック(逆方向もチェックしてます)。

f:id:marlesan:20160804013722j:plain:w400
完成。

これを、

f:id:marlesan:20160804013743j:plain:w400
16個作ります……。

このアングルからだと綺麗に見えますが、基板に配置するとはんだ付けが不揃いなのがすごく目に付くので、布テープかなにかで目隠しする予定。

アドレスデコーダ試作

前回はROMの仮組みがメインだったので、アドレスデコーダ部分が本番規模の半分でした。 今回は4bit2進数を16bit10進数(と言っていいのだろうか…)にゲンミツに変換していきましょう。

f:id:marlesan:20160803000505j:plain:w300
あっさりできましたー。
DIPスイッチによるアドレス指定が2進数で1010なので、10進数で10番地。10番地にあたる左から11番目(0番地から始まるため)のLEDが光っています。

まぁ、昨日も使っていたIC、74HC138を2個並べるだけでしたね。
CPUの創りかた』は部品の入手性にかなり気を遣って書かれていますが、それでも2016年現在、本書でアドレスデコードに使われている74HC154が通販では入手困難のようで、このように74HC138で代用する必要があります……と、"TD4 74HC154"でググったら一発で出てくる情報を偉そうに語る恥知らずな大人がいますよ。一応、使い方は自分で考えたかったので「74HC138で代用できるみたいだぞ」という以上は調べなかったんですが、データシート見たら一目でした。

さて、問題なく目的の回路が組めたように見える裏で事故がひとつありました。
デコードの目視確認用にLEDアレイを使っていますが、こいつのアノードとカソードがわからなかったので「一瞬なら大丈夫やろ」と3Vを直接かけて確かめてみたら「ブツッ!」という音と共に端の1個がご臨終。何気に部品を破壊したのは初めてでちょっとショックでした。やっちゃいかんこととは分かってたので軽く弾くくらいの一瞬だったんですが、やっぱ横着はダメですね。

ROM回路の部分試作

というわけでTD4の製作日記です。
方針としては、まずブレッドボードでモジュールごとに回路を組んで動作確認してから基板実装に移ります。 まずはROM回路から。

f:id:marlesan:20160802000116j:plain:w300
機能別にボードを分けてます。一番下がアドレスデコーダで、ROM上の読み出したいデータの番地を2進数で入力すると、対応する8bitDIPスイッチに繋がる信号線がONに(負論理なのでLに)なります。2進数の入力はCPU本体から来るところ、ここでは4bitDIPスイッチで入力しています(スイッチが上下逆になっているのは、2日前の私がプルダウンを知らなかったからです)。それから本番では4bit2進数を16bit10進数(と言っていいのか?)にデコードしますが、実験回路ということで3bit2進→8bit10進のデコーダになっています。

真ん中がROM部分です。本番で16個作るうちの2個をボード上に実装しています。アドレスは左が0番地、右が6番地になるようデコーダと結線していて、今、アドレス入力用のDIPスイッチが0110、つまり6番地を指しているので、右側のLEDが光って読み出し中であることを示しています。ばっちりですね。ところで今回、回路製作の手間を省くために抵抗内蔵LEDというものを買いましたが、大きすぎて本番回路のROM部分の表示用としては使えないようです。残念。

ROM部分のDIPスイッチはプルアップで配線されています。すなわち、スイッチが開(OFF)の時にHを出力し、閉(ON)の時にLを出力する負論理の信号なので、それを正論理に反転してCPUに渡すのが上のデータバス部分。今はCPUではなく隣のLEDアレイに接続して読み出したデータを表示しています。6番地(右)のDIPスイッチが01010101になっていて、LEDも01010101(右詰め)で光っているのでこちらもばっちり。スイッチを色々弄っても、それに応じて正しく動作します。

私は電子工作は素人ですが、高専情報工学科で一応の専門教育を受けているのでこういう0と1の2値論理の世界には親しみがあります。 一応というのは学校に問題があったのではなく、私が不真面目な学生だったゆえの但し書きで、 論理回路設計の授業はレポート提出を無視し続けて説教されたというのが一番鮮やかな記憶だったりするので、 こうして10年以上前に学んだことがなんとなくでも体に染み付いてるのを感じるのは不思議な気持ちです。

電子工作ブログ

春先から電子工作を始めたおっさんです。
作業記録など残したいなぁと思い立ったのでブログつけてみます。

これまでの製作物

直流安定化電源(6月上旬)

f:id:marlesan:20160731223715j:plain:w300
電子工作は失敗から学べ!』という入門書のガイダンスに従って製作。 3~10Vで出力調整でき、メーター下のスイッチで電流計と電圧計の切り替えが可能というものです。 この電流計がとても有能で、何か回路を組んで電源投入した時、電流計の針がほとんど振れなければ(ちゃんと動作してるかは別として)とりあえず安心できます。 VccとGNDが短絡する一番やっちゃいけないエラーをやっちゃってると針がシュンッと振り切れるのですかさず「ファーイ!」とスイッチを切って迅速に対応可能。 電流テスターを回路に差し込むの面倒だし便利です。

ちなみに電子工作は本当に初心者で、上の写真も「立派な電源を作ったものの今の僕にはLEDを光らせることしかできない」という一枚です。 この1ヶ月前はLEDの光らせ方(抵抗値の計算方法)も知りませんでした。

導通チェッカー(6月下旬)

f:id:marlesan:20160731225903j:plain:w300
こちらの回路図を頂いて製作した導通チェッカーです。 テスター棒を当てた2点間が繋がってると「ピ──」とブザーが鳴って導通を知らせてくれます。これも完全に実用品で、普段使いしています。 このプロジェクト?自体は電源より前にスタートしていて、ブレッドボード上で回路を組んで動作確認するところまでは進んでいました。 ところがその回路をユニバーサル基板に実装するぞという段で特に図も起こさずアドリブで配線を進めたために、途中で完全に詰まってしまい、いじけてひと月ほどぶん投げてました。
でもまぁ、今考えれば失敗しない方がおかしいトライでしたね。

  • はんだ付けするとき、対象物を固定することを知らない
  • 被覆線や基板の表を使ってジャンプ配線することを知らない
  • いきなり両面スルーホール基板

ラジコンカー(7月中旬)

f:id:marlesan:20160731233954j:plain:w300
これまた『電子工作は失敗から学べ!』を参考にした製作です。 本の作例では赤外線リモコンを使って操作するラジコンですが、私が実際に作ったのはPS4のコントローラーで!BT通信で!アナログスティックで左右の車輪を無段階制御可能!な一品。モノとしては高度になっていますが、PS4コン絡みのところが既製品&既製ライブラリ利用なので製作難易度はむしろ激減してます。
当初はArduinoでリモコン信号デコード&モーター制御プログラムを仕上げた後、マイコンチップ(ATmega328)を基板に移して全体の回路を組む……という計画でした。が、赤外線リモコンがラジコンカーを操作するにはあまりにも劣悪なレスポンスだったので方針転換。一応リモコン信号デコードのプログラムは動くものを(しかも開発環境の移行時にソースが2回消失したので3回同じコードを)書いたので、学習的にもOKということでひとつ。

作例ではモーター左右×回転前後にそれぞれ独立のPWM出力(計4本)を与えてますが、PS4コン使うためのBTドングルを挿すためのUSBホストシールドArduinoに乗せたために使えるPWMが3本になってしまった!ので、2本のPWM出力をトランジスタで振り分けてなんとかするという仕組みを自力で考えて実装したのが一番の頑張りポイントです。たいした工夫でもないですが、3ヶ月前は抵抗の存在意義すら知らなかった人間が「ここはトランジスタが使える!」とか言ってるのはちょっと感動する光景じゃないですか? ないですか、そうですか。

TD4(現在進行中)

TD4とは『CPUの創りかた』という本で設計&製作される、汎用ICを使った4bitCPUです。
もともとモノの仕組みを知るのが好きで、Arduinoを弄っていてもプログラムコードと実際に動くモノの間にあるブラックボックス部分がどうしても気になってしょうがなかったので、このような方向に進んでしまいました。8月中の完成を目標にしています。