Superb Garbages 2

千野純一(chinorin)のはてなダイアリーの続きです。

ATtiny13A(MicroCore)でロータリーエンコーダ信号を容易に取り扱うためのスケッチ

  • 僭越ながら。汎用的で独立的な仕組みを作ったら、こういう風に公開するのもいいかなと思った。

 

  • Arduino IDEMicroCoreを導入した環境でATtiny13Aに書き込める、一般的なロータリーエンコーダ(インクリメンタル式)の差動信号を単純なパルスにデコードするスケッチを置いときます。特別なライブラリとかを入れるのが面倒とかで、スケッチ一発で終わらせたい人向け。
  • 例えばISP化したArduino UNOとか(Arduino as ISPってやつ。NanoとかLeonardoとかでも一応できる)を使ってATtiny13Aに書き込むことができます。そのあたりの詳細はぐぐれ。
  • エンコーダを回すとプッシュスイッチとかと同じようなノリで信号が発生しますので、別のメインとなるマイコンで受け取るなり、ロジックIC並べて色々やるなりして遊んでください。これ単体ではロータリーエンコーダの検査ができるくらいでほとんど無意味です。
  • ライセンスはCC0著作権は主張しません。ご自由に使っていただいて構いませんが、このスケッチを使用したことで損害などが発生しても当方は関知せず、補償等は一切行いません。ご利用は自己責任で。
// For ATtiny13A as MicroCore, a sketch of using rotary encoder
// [Encoder] -> 0/1 [ATtiny13A] 3/4 -> (pulse)
// Creative Commons CC0 license. No Rights Reserved.

void setup() {

//	pinMode(0,INPUT);
//	pinMode(1,INPUT);
//	pinMode(3,OUTPUT);
//	pinMode(4,OUTPUT);
	DDRB=0b00011000;

//	digitalWrite(3,LOW);
//	digitalWrite(4,LOW);
	PORTB=0b00000000;

	SREG=0b10000000;
	GIMSK=0b00100000;
	PCMSK=0b00000011;

	sei();
}

ISR(PCINT0_vect){
	static int state;
	boolean d3=bit_is_set(PINB,PINB0),d4=bit_is_set(PINB,PINB1);

	if(d3 && !d4){
		state=3;
	} else if(!d3 && d4){
		state=4;
	} else if(d3 && d4){
		if(state){
			digitalWrite(state,HIGH);
		}
		state=0;
	} else {
		state=0;
		PORTB=0b00000000;
	}
}

void loop() {}
  • けっこう無駄がありそうで、特にif構造をもっと効率的に書けるだろうとは思うのですが、自分が使う用としてはこれで充分いけそうなのでまあいいかという感じで⋯。
  • 動作テストしたパッケージはATtiny13A-PU(DIP-8のやつ。国内だと60円とか85円とかで売ってる)、5V駆動でクロックは内蔵9.6MHz。Arduino IDEのバージョンは1.8.15、MicroCoreのバージョンは2.0.3です。
  • エンコーダは手回し専用という感じだと思います。ゆっっっくり回したりすると一時的に誤動作を起こす場合があります。めちゃめちゃ速く回したときも読み落としが発生する可能性がありますので、精密な角度検知のために使うのは避けた方がいいです。
  • ATtiny13Aだけでなく、おそらくATtiny13や13Vでも動くのではないかと思います。もしかしたらATtiny85/45/25等、8本足AVRなら問題なくいけるかもしれませんが、それらはMicroCoreではないので詳しくはわかりません。


  • ↑接続の例。記号が新旧混じっていてすみません。抵抗とかこの形じゃないと雰囲気出なくない?
  • ロータリーエンコーダからの2つの出力をそれぞれATtiny13Aの0番と1番に入れます。エンコーダをある方向へ回すと3番にパルスが出力されます(一瞬HIGHになり、すぐにLOWになります)。逆方向は4番です。最初は3番4番の先にLED(と抵抗)などを置いてみると信号の出る様子がわかって楽しいかもしれません。
  • ATtiny13AのVccは1.8~5.5Vだそうです。
  • R1/R2はプルダウン抵抗、C1/C2はいわゆるチャタリング対策のためのノイズフィルタの役割をするコンデンサです。それぞれご自分が信じる値のものを配置してください。動作テストでは、抵抗は各10kΩ、コンデンサは各104(0.1μF)のセラミックコンデンサを使いました。(無極性でなくても効果はあります。電解コンデンサとかなら上側が+)
  • C3はノイズ対策および電圧平滑のためのコンデンサです。ご自分が信じる値のものを配置してください。動作テストでは0.47μFの電解コンデンサを使いました。(こちらも無極性でも大丈夫でしょう)
  • これらのコンデンサについては、一般的にはもっと小さな容量のものを使うような気がします。計算とか検証とか面倒なのでとりあえず適当ですが、省くと誤動作を起こす確率が高まる(ように感じる)ので適当でも効果があるんだと思います。
  • ATtiny13Aの2番と5番は使いません。使わないピンって結局どうするのが正しいんだっけ⋯。テスト環境では何も接続しませんでしたが、論理を固定しておくべきなのかもしれません。設定上はINPUTになっています。なお5番は\rm{\overline{RESET}}なのでLOWを入れると再起動がかかるっぽい。
    • 8/4追記:そうだ、入力端子は論理を固定、出力端子はオープン、というのが基本でしたね。このプログラムの場合、2番と5番はINPUTなので論理を固定しておくべきです(2番はどちらでもよい。5番はHIGHに)。プルアップorプルダウン抵抗を忘れずに。
    • あるいは setup() にある DDRB=0b00011000; を DDRB=0b00111100; にすると2番と5番もOUTPUTになるのですが、\rm{\overline{RESET}}の端子をOUTPUTにして果たして大丈夫なのかどうか⋯。
    • ⋯⋯って、ああ、これらって内部プルアップしとけばいいのか。なるほど。気が向いたら改変しまーす。Microcoreのそのへんの仕様を調べるのと、一応テストするべきなのとで腰を落ち着けてやる必要がある。

 

  • 意義としては⋯⋯これをロジックICでやるとすると74HC14(シュミットトリガインバータ)と74HC74(Dフリップフロップ)あたりを使うのが普通みたいだけど、それらを買うよりATtiny13Aの方が安いかも? ということで。
  • そもそも電子工作を始めた当時、ロータリーエンコーダってめんどくせーなー接続するだけでこれをやってくれるICとかねーのかよと思って探したんだけど、これが意外となさそうなんだよね。そんな過去の自分の願いを叶える活動みたいな。
  • そもそもこの仕組みってロータリーエンコーダに内蔵して然るべきだと思うのよ。機械式ならともかく、光学式のエンコーダなんてどうせ電源使うんだからここまでやればいいのに。差動信号がどうしても必要なら(そんなシチュエーションあるの?)それはそれで別に出力すればよろしい。AとB以外に\rm{\overline{A}}\rm{\overline{B}}とかつけてる場合なんだろうか。w プルアップしたいのはわからんでもないが。
  • あっ、そうするとエンコーダという名前は相応しくなくなってしまうんだ。ここはロータリーコーデックということでひとつ⋯。

ノイズの続きとワイヤラッピングと無極性電解コンデンサ

  • そうかあ、どちらかというとデジタル回路の方がノイズの影響が深刻なのね。なるほど。身近なアナログ回路って例えばオーディオ関係だと最高でも96KHzくらいのもんだし、今調べてみたら蛍光灯のインバータですら100KHzくらいらしい。一方マイコンはATtiny13Aでも20MHzだもんな。w
  • これも今まで体験してきた「ノイズ」というものについてのイメージの問題が大きそうなのと……それから、いかにそのへんの市販品のノイズ対策がしっかりしているかというのが関係しているように思う。今まで本当に色々なデジタルガジェットに触れてきたけれども、デジタルな部分のノイズによる不具合に遭ったことなんて数えるほどしかないわけで。
  • 電子工作をやってると市販されてる工業製品の品質のすさまじさが実感できるよね。マウスのホイールを押し込むボタンの精度とかすげぇくない? あれホイールの回転軸と一緒にロータリーエンコーダ(回転角と回転方向を検知する部品)ごと押し込んでるんだぜ…。

 

  • 本当にまだまだ知らないことがいくらでもあるな。ワイヤラッピングって何だよこれ。いや、それに関する文章を読んだことあるとは思うんだけど、ピンに巻き付けるだけってそんなんで導通が安定するわきゃねえだろと思ってあまり気にとめていなかったみたいだ。実ははんだづけよりも頑丈らしいぞ。
  • なんか専用の工具でくるくるってやってこれでしっかり導通するしほどけたりもしないっていう動画を見てしまい、こんなのがあるなら最初に教えといてくれよーと実際に口に出して言ってしまう今日この頃でありました。
  • しかしくるくるするだけなのにけっこうたけーなこの工具も。w 5000円くらいのとか9000円くらいのとかがある中で2000円未満で売ってるのもあるけど、やっぱ安いのじゃそんなに巻けないのかなあ。怖いなあ。線材も合ってるやつを買わないとあかんのね。
  • しかしねえ、ワイヤラッピングによる配線ができるようになれば、少しのブレッドボードと足長ピンヘッダだけでもわりと堅牢な構造が作れそうな感じがする。あとはブレッドボードじゃなくてもピンヘッダ同士(2本だけの場合はジャンパピンでいいんだが、3本以上はけっこうめんどい)を簡単に短絡する方法があればいいと思うけど、もし1本のピンに2線以上のラッピングができるならそれで問題なさそうかな。ラッピングツールの構造がわからんのでわからん。
  • そういえば3極以上のジャンパピンってのも当然あるだろと思って探してみたけど意外とないねえ⋯。2極のが連結してるの(これって連結してるだけで縦方向には導通してないよな?)とか、刺す方のやつならあるんだけどそうじゃない。

 

  • 本当にまだまだ知らないことがいくらでもあるなその2。無極性電解コンデンサって何だよ! 電解コンデンサは必ず極性があるとというのは嘘だったのか。いや嘘じゃなくてマイナス側にもプラスの電極をつけるとかなんとか。それならそもそも、電解コンデンサはぜんぶ無極性にしたらだめなのかな⋯。安全でよいと思うんだけど。
  • しかも無極性電解コンデンサを持ってない場合は、倍の容量のコンデンサ2つを向かい合わせに直列に繋ぐと代わりになるらしい。しかもプラスを内側にするのがよいとかなんとか。こえーよ。
  • ちなみに無極性電解コンデンサ、両極性電解コンデンサ、双極性電解コンデンサ、ノンポーラ電解コンデンサ、バイポーラ電解コンデンサ。ぜんぶ同じものだそうな。こういう表現が定まってない用語もなんかいろいろあるよな。両電源/正負電源とか、低損失/低ドロップアウトとか。そういうのを見つけたら、これって同じ意味なのかなあと思いつつも一応調べなきゃいけないのがめんどい。

今日の驚き

  • センシティブなアナログ回路とか、MHz刻みのシビアなタイミングでMUXしてるとかならともかく、スピードが必要というわけでもないデジタル回路のいかにもデジタルな部分がノイズの影響で誤動作を起こすとか意味わかんねえじゃん? しかも5Vでやってんのにさ。
  • 今日はキャラクLCDがどうしてもちゃんと動かず、出力ピンを色々変えてみたりしてもなんかちょっと意味のある文字が見えたと思ったらすぐぐちゃぐちゃになっちゃうみたいなのが続いてたんだけど、ブザー鳴らすとそれが起こるらしいということがわかって、これはどうしたもんかと⋯。
  • ところでツイストペアケーブルって知ってます? 2本の線を同方向にくるくるよじって1本として扱えるみたいなやつなんだけど。ブザーとノイズについて色々調べてみて、あれはノイズ対策のためにくるくるよじってるというのを初めて知り申した。ツイストペアケーブル。発明者はかのグラハム・ベルさんだそうな。
  • そこで試しにくるくるひねって再起動してみたら、もうぱったりノイズの影響がなくなって、これはやべえよさすがだよグラっち⋯⋯ってなったとさ。おしまい。
  • そんなにきっちり巻いたわけでもないし、巻いた回数もそんなに多くないのにそれでもこの威力というところに驚いた次第であります。グラハム・ベルさんには、ツイストペアケーブルを発明したことについては大いに感謝申し上げます。でも諸悪の根源・悪魔の発明であるところの電話については感謝しない。

 

  • んんん? マイコンで仮想的な(普通に物理的なものでもいいけど)キーボードやマウスを作るには、HIDクラスっていうの? なんかそういうのが使えるわりと性能のいい(AVRでいうとATmega32u4以上の)MCUが必要で、それより性能の低いコントローラの場合はUSBが使えてもRS-232C通信くらいしかできず、せいぜいV-USBでソフト的に強引なエミュレーションをするしかなくて色々問題が⋯⋯という理解をなんとなくしているのだが。
  • http://park19.wakwak.com/~gadget_factory/factory/comkey/
  • こういうのないのかね? と薄々思いつつもなんとなく検索してなかった「COMポートからの入力をみてキーボード入力を吐く」ソフト。Windows限定、自分専用ならこの方法でいいよな⋯。

ソルダレス・ブレッドボード怒りの追記

  • 片側1レーンが6穴のやつを発売してるのってサンハヤト(超どうでもいいし誰もがそう思ってることを確信するものだが、関東出身者にとっては伊東温泉に思いを馳せさせられる社名である。「馳せる」の活用これで合ってるか自信がない)だけなの? 5穴のやつって最初にマイコンボード(横幅700milのやつ)を刺すにあたって右側に寄るか左側に寄るか悩みに悩んでそこから作業が進まないんだよね。
  • えいやっと決めて例えば右に寄せて刺したら(つまり上から見える残りの穴は右2左3)、たいてい「やっぱり左寄せにすればよかった⋯」ってなって、仕方ないから左に寄せて差し替えようとしたときに誤ってジャンパワイヤをごぼっと抜いてしまって最初からやり直しになる。いつもそうだ。もちろん、最初に左に寄せたら後で右に寄せる必要が生ずる。
  • そんで結局こりゃ右も左も3穴必要だわってことになって、真ん中へんのボードで隠れてる穴から無理矢理配線せにゃならん。これどうにかならんのか? マイコンボードに足長ピンソケットとかを履かせるべきなのか? それともaitendoで売ってるT形変換基板(こんなの)みたいに300mil幅に変換するやつを自作するべきなんだろうか。17列のミニブレッドボードからそのように変換する汎用的なものがあると嬉しいかもしれん。
  • いや、そもそも1レーン6穴のやつが普及価格になってくれるだけで(サンハヤトのブレッドボードはたけえんだ。きっと高品質で扱いやすいんだろうけど⋯)このストレスはだいぶ緩和されると思うの。最初に右寄せ左寄せで迷うのがとにかくつらい。
  • ブレッドボード関係の特許をざっと調べてみたけど、穴の数に関するものはないみたい(当然か)。しかしこの界隈の実用新案とかを眺めるのはなかなか楽しかった。ブレッドボードはね、もっと工夫をこらしたものをどんどん出すべきだと思うんだ。例えば実登3231589、そうそうこういうやつよ。

 

  • ⋯⋯⋯あれ? 左右6穴ずつになっても結局余るのは片側3穴、逆側4穴になるだけで、どっちを広くするか迷うのは変わらないのか、そうか⋯。
  • そもそもだ、小型ボードが700milなんていう中途半端な幅を採用してるのが悪いんじゃねーか!!! いっそのことブレッドボード前提の小型マイコンボードはぜんぶ300milにしなさいよ。細長~くなってもいいし、ブレッドボードの外側にT字型にはみ出してもいいし、なんなら2階建てでもまあいい。どうせジャンパワイヤ使ったら背が高くなっちゃうんだ。
  • 結局自分で作れって話か。

マイコン連動とコンデンサと抵抗

  • うーん⋯⋯いくつか買ってあったDigisparkが相次いで書き込めなくなり、色々調べてdigispark用のブートローダを書き込んだつもりなんだけどどうもDigiMouseやDigiKeyboardが正常に動かない。ただのATtiny85になってしまった。ただのATtiny85なんて、ちょっと速いATtiny13Aみたいなもんじゃないですか。(そう?)
  • ちっちゃいのにがんばってUSBを制御しようとしてるのはなかなか好感もてるけど、まーやっぱりムリがあるんじゃないの。w ちゅーことで、DigisparkとATtiny13Aを連動させ(足がたりないから)、右クリックする間隔を可変抵抗で自由に変更できるという「Minecraft統合版自動釣りデバイス」を作っていたが諦めてSeeeduino Xiaoかなんかでやろう。
  • でも「準備完了ピン」と「右クリック指令ピン」でDigisparkとATtiny13Aに会話させるのは楽しかった。2ピン使って全二重通信をしたが、次の機会があったら1ピンで半二重をやってみたい。

 

  • コンデンサって具体的に何に使うのか知らなかったしどれくらいの容量のをどれくらいの頻度で使うのか全く見当がつかず、必要ってときになかったら嫌なのでまーとりあえず「ひととおり入ったセット」を買っておいたりするじゃないですか。一応セラミックコンデンサ電解コンデンサのそれぞれで。
  • しかしコンデンサというのはそんなにたくさんの種類を持ってる必要ないわけね。この回路にはこういうコンデンサが必要ですって言われるときってたいてい「0.1μF~10μF程度」とか「数十μF~数百μF程度」とか「100pF~470pF程度」とかってわりとアバウトに指定されることが多い。ので、パリッパリのアナログ回路をやらない限りは結局ぜんぶで3種類くらいしか持ってなくても大丈夫なのね⋯⋯という気持ち。
  • これは抵抗にも言えて、例えばLEDの電流制限抵抗だって結局「計算すると150Ωくらいが最適ですが、持ってなければ110~470Ωくらいのを適当に使いましょう」みたいな感じだし、プルアップ/プルダウン抵抗だって「どの数値が正しいかというのはなく好みです。10kΩで統一してる人もいれば、そのへんにあった47kΩとか22kΩとかを適当に使う人もいます」みたいなね。
  • 結局、セラミックコンデンサは103(0.01μF)と104(0.1μF)、電解コンデンサは22μF、抵抗は220Ωと10kΩ(と、強いて言えば1MΩ)。ほとんどそれしか使ってない気がする。可変抵抗も10kΩばっかり。電源やオーディオなんかをやる場合はもっと色々必要かもしれないけど、これから電子工作を始める人、特にデジタル回路しかやる気ないよって人は参考にしてください。w
  • あとスイッチ(押しボタンとか)をよく使う人は10kΩの集合抵抗(抵抗アレイ)があると便利かもしれないよ。10kΩが並列でたくさん繋がってるだけのやつ。

ラグ板と端子について

  • あ、ラグ板ってこれ、ブレッドボード(元来の意味での)みたいに扱っていいんだ。最初に調べたときにボディアース専用とか単なる固定金具なので導通させないとか書いてあったので、そうかー使えないのか。この形状の実装基板みたいなのがあれば便利なのにねえ……と思ったりしたんだが、それでよかったみたい。つーわけで昨日書いた「プラスチック板に複数の金属片が~」っていうのはラグ板のことです。w
  • そうなると、ピンが出ててブレッドボードに刺さるラグ板あるいはラグ端子みたいなのが欲しいところだよなあ。
  • そういえば、我らが三和電子のボタンにファストン端子が使われてる関係で俺はファストン端子を標準的に使おうと決めて大中小取りそろえてみたんだけど、やっぱりブレッドボードに直接プラグを立てるみたいな方法がないんだよね。めちゃめちゃ探して基板に立てるファストン端子(足が太くてブレッドボードには刺さらない)は買ってみたものの……基板につけるならXH端子とかの方がよくねえか? って思う。見た目わかりやすいし。
  • まーファストン端子って空中配線用って感じなのかね。三和電子のボタンに採用されてるのも、アーケード筐体のコンパネの中で空中配線チックな実装をするからか。
  • なんかギボシ端子やらファストン端子やらが下火っぽい理由がなんとなくわかった気がするわ。着脱するための端子なのに、結局着脱するシチュエーションってそんなに多くないな、みたいな⋯。

ブレッドボードについて

  • そうねえ、そのためにソルダレス・ブレッドボードなるものがあるんだろうけどな。
  • しかし最終的にブレッドボードで実装となるとジャンパワイヤがぐちゃぐちゃで大変なことになるのとブレッドボード自体の厚みもけっこうあるのとで体積がかなり大きくなる……というのは(低集積がブレッドボードの利点のひとつなので)仕方ないので諦めるとして、以下の2つの問題が解決できればブレッドボード実装も現実的なものになると思うがどうだ。
    • ピンが抜けやすい。やたら固くて全然抜けないというかそもそも全然刺さらないブレッドボードもあるがそういうのではなくて、仕上げ時に軽く固定するような仕組みがあるといいよね。これについては、導電性が損なわれないなら瞬間接着剤やUVレジンという手もアリかもしれん。
    • ブレッドボードに実装できない部品がある。あるというかそのままでは刺さらないものがほとんどで、逆に普通の形をした抵抗とかトランジスタみたいなやつの方が例外と言えるほどだ。刺さらない部品を刺さる足配置に変換する基板とかも売ってたりするけど、そういうのも結局はんだづけが必要だしなあ。表面実装モノは基本的に諦めるほかなさそうだが、それ以外は何かうまいことやれる仕組みが欲しいよね。せめて導線をラグ端子やスルーホールみたいなところに確実にからげる仕組みがあれば、それだけでかなり便利になるのではないかな? 導通性のケーブルタイみたいなやつとか、なんかムリなのかね。
  • あとはまあ、超小型のブレッドボード(25穴とか45穴とかのやつ)をもう少し便利にして欲しい(例えば2個使えばちょうどICが刺さって安定するとか、裏面の突起をレゴ互換にするとか)のと、もう少しいろんな形が欲しい(例えば電源とGNDだけ用の細長いやつとか(一応あるけどちょい高い)、真ん中の仕切りがProMiniとかProMicroとかがぴったり刺さる幅のやつとか、電源とGNDが真ん中を通ってるやつとか)かな、と思う。
  • 応用的に、ブレッドボードに追加で端子台(基板に刺すターミナルではなくて、電気工事とかで使うやつ)を使うと色々と安定するんだけど、あれも意外と高いんだよな。もっと単純な……例えばプラスチック板に複数の金属片がネジ2個ずつで固定してあるだけ(仕切りナシ)でも電子工作目的なら充分使えると思う。っていうかこれなら自作できるか。作ってみるけど、値段次第では売れると思うよ。(※この件については次の日の記事に追記があります)