Chattering
目的
マイコンの話をしていると必ずチャタリングの話が出てきます。 ただ、あまり実感したことがないので、少し回路を組んで測定してみました。
測定器
SmartScope を使っています。
回路
当然こんな回路です。 電源電圧は 5 v で、スイッチ(SW) は
です。
結果
1ms もないくらいでチャタリングは収束していました。 ちなみに、タクトスイッチも試したのですが、 今回の回路と測定条件ではほぼチャタリングを確認できませんでした。
個人的な経験が不足しているため、妥当な結果かどうか判断できていません。
あとはリレーで試してみたいですが。
追加実験(おまけ)
ソフトに頼らず CR 回路でフィルタリングしてみた結果です。
時定数を 1ms くらいで設計したので、十分チャタリングは除去できています。
個人的な記録
以下の点が悲しい。
- ハンダ付けが下手になっている。
- 数値解析能力が低下している。
以下の点は勉強する。
- Linux 上で、Spice 解析する方法
SmartScope
紹介
LabNation が作っている USB 接続のオシロです。 もともと、クラウドファウンディングのkickstarter で資金調達して制作されて、今は通常販売しています。
確か売り文句は「既存のUIから脱却して、新しい操作方法を提供する。」みたいなことが書いてありました。 サイトで確認してもらえばわかりますが、そこそこ良いソフトだと思います。
Mono の成果を利用したソフトが提供されていて、Linuxでも動きます。 私は普段から Linux で作業しているので、重宝しています。 また、どの程度サポートできているのかわからないのですが、Android でも動くようです。
どのくらい売れているのかわかりませんが、 既存のUSBオシロよりも画面が見やすくて趣味で使う程度なら文句ありません。
この記事は操作方法の覚書です。
UI 紹介
全体像
他のUSBオシロも持っているのですが、圧倒的に UI が良いです。 ちなみにデジアナになるし、プロトコルアナライザーにもなります。
波形表示の左側にある丸印は、対応するプローブの 0 V となります。 波形表示の右側にある丸印は、対応するプローブのトリガー電圧となります。
画面サイズは自在に変更できて、左下の丸いマークを押すと左側のメニューの表示、非表示を切り替えられます。
チャネル、ステータスの表示、非表示切り替え
これらの表示を、
右下にあるこのボタンで項目毎に切り替えられます。 また、その表示は好きな場所へ、ドラッグできます。
波形(トリガ、AC/DC など)の切り替え
左側の丸いマークをクリックすると、
こんなメニューが出てきます。 hide を押すと波形が消えます。
トリガ設定
右側の丸いマークをクリックすると、
トリガの設定ができます。
波形の幅などの計測
波形表示領域の外側(灰色)領域から、ドラッグすると補助線が出てきます。
上下端からドラッグすると、電圧側に補助線が出て、 左右端からドラッグすると、時間軸側に補助線が出ます。
これがなかなか便利で気に入ってます。
Inkscape 3.10 ドキュメントの背景色の変更
目的
デフォルトのドキュメントの背景が白なので、白いものを描いた時になにも見えない。 そんな時にドキュメントの背景を変更するやり方を説明する。
背景色変更方法
メニューの[ファイル]->[ドキュメントのプロパティー]で図のようなダイアログを表示して、 ページタブの右下にある[背景色]をクリックすると色を変更できる。
Chart JS V2.0 Bar Chart Pattern Sample
目的
bar chart は標準で1色でのベタ塗りだが、 モノクロでも識別できるようにパターンを使って塗りつぶすようにする。
最終結果
解決方法
元々, backgroundColor にパターンを渡すとそれで塗りつぶせるようになっているので、 パターンをどこかで作って渡すだけで可能となる。
npm が使えて、使うことに抵抗がなければ
を
$ npm install patternomaly
でインストールすれば良い。
私は単純な事に npm を使うのがあまり好きではないので、 勉強がてら [patternomaly] を参考に少し javascript を記述してパターンを作成した。
主な修正点
修正点は
- パターン作成用の javascript を追加しbackgroundColorに指定し、
- borderWidth を 2 にした
こととなる。
パターン作成用 Javascript
少し長いですが、javascript を読めればそんなに大したことはやっていません。 そしてほとんど patternomaly と同じです。
主な違いは 2 点で、
- パターンの塗りつぶしが背景色に白をアルファブレンドしていたのを、白で塗りつぶしたこと
- pattern メソッド内部で shapeType で形を選択して、実行するあたり
です。 2 の方の違いは元のソースコードと見比べるとわかりますが、単純にしてしまいました。 Javascript は勉強中で、あまり正確に把握していないので問題があれば元のように書きなおしてください。
function generateShape (size) { var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); canvas.width = size; canvas.height = size; return { canvas, context }; } function square (width) { var shape = generateShape(width); var height = width; shape.context.fillStyle = 'rgb(255, 255, 255)'; shape.context.fillRect(0, 0, width / 2, height / 2); shape.context.fillRect(width / 2, height / 2, width / 2, height / 2); return shape.canvas; } function lineHorizontal (width) { var thickness = width / 4; var shape = generateShape(width); shape.context.fillStyle = 'rgb(255, 255, 255)'; shape.context.fillRect(0, 0, width, thickness); shape.context.fillRect(0, thickness * 2, width, thickness); return shape.canvas; } function lineVertical (width) { let thickness = width / 4; let shape = generateShape(width); shape.context.fillStyle = 'rgb(255, 255, 255)'; shape.context.fillRect(0, 0, thickness, width); shape.context.fillRect(thickness * 2, 0, thickness, width); return shape.canvas; } var shapes = { sq: square, lh: lineHorizontal, lv: lineVertical, }; function pattern( bgColor, shape ){ var patternCanvas = document.createElement('canvas'); var patternContext = patternCanvas.getContext('2d'); var size = 20; var outerSize = size * 2; var shapeType = shapes[shape]; patternCanvas.width = outerSize; patternCanvas.height = outerSize; patternContext.fillStyle = bgColor; patternContext.fillRect(0, 0, patternCanvas.width, patternCanvas.height); pattern = patternContext.createPattern( shapeType(size, bgColor), 'repeat'); patternContext.fillStyle = pattern; patternContext.fillRect(0, 0, outerSize, outerSize); patternFill = patternContext.createPattern(patternCanvas, 'repeat'); patternFill.shapeType = shapeType; return patternFill; }
backgroundColor への指定
必要なところを抜き出すと以下ように、
- backgroundColor に 上記の pattern メソッドを指定し、
- パターンだけだと境界が曖昧になるので、borderWidthで境界を表示する
だけです。
また、パターンは
- 四角
- 水平線
- 垂直線
を選択できるようになっていて、それぞれ
- pattern( '#color', 'sq')
- pattern( '#color', 'lh')
- pattern( '#color', 'lv')
と指定すると切り替わります。
var myChart = new Chart(ctx, { type: 'bar', data: { labels: [ "Day1", "Day2", "Day3" ], datasets: [ <...> { <...> backgroundColor: pattern( '#' + pal[5], 'lh' ), borderWidth: 2, } ] }, })
全体
AVR AVR-AS
参考資料
ここをベースにしてインストールする。
binutils
アセンブラとかが入っている。 avr-gcc もこれを使っている。
インストール先のディレクトリを適当に設定する。
$ mkdir /home/so/work/avr/local
Download
FTP サイトから最新の tar.gz をダウンロードして、展開する。
Install
展開したディレクトリに入って
$ ./configure --prefix=/home/so/work/avr/local --target=avr --disable-nls $ make -j 4 $ make install
で出来上がるので、パスを通して使いやすくする。 make の -j 4 オプションは並列コンパイルオプションなので、環境に合わせて変更してください。
export PATH=$PATH:~/work/avr/local/bin
上記は bash の例で、~/.bashrc に書いておけば毎回設定する必要はありません。
Usage
上記サイトを参考にして、動作確認をする。
.equ PORTB,0x18 .equ DDRB, 0x17 .org 0x00 reset: rjmp main; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; rjmp defaultInt; defaultInt: reti; main: sbi DDRB, 0; cbi DDRB, 0; end: rjmp end;
avr-as -mmcu=attiny13a -o sample.o sample.s avr-ld -o sample.elf sample.o avr-objcopy --output-target=ihex sample.elf sample.ihex
.o, .elf はバイナリファイルで、バイナリエディタで確認する必要がある。 最後のihexはテキストデータで、"intel hex format"という形式であり、テキストエディタで普通に読める。
:100000000FC00DC00CC00BC00AC009C008C007C09B :1000100006C005C004C003C002C001C000C01895DE :06002000B89AB898FFCF6A :00000001FF
intel hex format
一文字が16進数を表し、0x0-0xF(0-15) までが表現できる。 最初の ":" は行頭を示すフラグです。
Start code | Byte count | Address | Recode type | Data | Check sum |
---|---|---|---|---|---|
: | 10 | 0000 | 00 | 0FC00DC00CC00BC00AC009C008C007C0 | 9B |
: | 10 | 0010 | 00 | 06C005C004C003C002C001C000C01895 | DE |
: | 06 | 0020 | 00 | B89AB898FFCF | 6A |
: | 00 | 0000 | 01 | FF |
上記の表のように分解でき、Recode type は
Recode type | Description |
---|---|
00 | Data |
01 | End of file |
である。
hex ファイルの解析
AVR ATtiny13 の FlashROM は 1 word が 16bit なので、 2 Byte ずつアドレスが若い方から埋まっていく。
AVR が リトルエンディアンであるため DATA もリトルエンディアンになっており、 上位 1 Byte, 下位 1 Byte を入れ替えて解読する必要がある。
Address | DATA | OPECODE | OPERAND0 | OPERAND1 | MNEMONIC |
---|---|---|---|---|---|
0x00 | 0x0FC0 | 0b1100 | 0b001111 | RJMP | |
0x02 | 0x0DC0 | 0b1100 | 0b001110 | RJMP | |
0x04 | 0x0CC0 | 0b1100 | 0b001101 | RJMP | |
0x06 | 0x0BC0 | 0b1100 | 0b001100 | RJMP | |
0x08 | 0x0AC0 | 0b1100 | 0b001011 | RJMP | |
0x0A | 0x09C0 | 0b1100 | 0b001010 | RJMP | |
0x0C | 0x08C0 | 0b1100 | 0b001001 | RJMP | |
0x0E | 0x07C0 | 0b1100 | 0b001000 | RJMP | |
0x10 | 0x06C0 | 0b1100 | 0b000111 | RJMP | |
0x12 | 0x05C0 | 0b1100 | 0b000110 | RJMP | |
0x14 | 0x04C0 | 0b1100 | 0b000101 | RJMP | |
0x16 | 0x03C0 | 0b1100 | 0b000100 | RJMP | |
0x18 | 0x02C0 | 0b1100 | 0b000011 | RJMP | |
0x1A | 0x01C0 | 0b1100 | 0b000010 | RJMP | |
0x1C | 0x00C0 | 0b1100 | 0b000001 | RJMP | |
0x1E | 0x1895 | 0b1001010100011000 | 0b0000 | RETI | |
0x20 | 0xB89A | 0b10011010 | 0b10111 | 0b000 | SBI |
0x22 | 0xB898 | 0b10011000 | 0b10111 | 0b000 | CBI |
0x24 | 0xFFCF | 0b1100 | 0b111111111111 | RJMP |
RJMP のオペランドは2の補数なので、0b111111111111 は 10進数で表現するなら -1 です。
Inkscape 3.10 画像の切り抜き
内容
画像をクリップ加工する方法を説明する。
クリップ
作業は
- 図形(四角形など)を描く
- コンテキストメニューの"フィル/ストローク"を選択する
- フィルはなし(無色)とする。
- ストロークは着色する。
- 元図と図形を両方選択(Shift + クリック)する。
- メニューの [オブジェクト]->[クリップ]->[設定]を押す。
- メニューの [ファイル]->[PNG画像にエクスポート]を選択する。
の順番となる。
図形を描く
矩形ツールなどを選択して、領域を指定する。
コンテキストメニューの"フィル/ストローク"を選択する
領域の塗りつぶしをなくして、枠だけにします。
- フィルはなし(無色)とする。
- ストロークは着色する。
元図と図形を両方選択
Windows みたいに Ctrl + クリックではなく、Shift + クリックする。
クリップ設定
メニューの [オブジェクト]->[クリップ]->[設定]を押す。
PNG としてエクスポートする
メニューの [ファイル]->[PNG画像にエクスポート]を選択する。
AVR Emulator Spec. I
仕様
AVR マイコンを採用したのは流行りのフィジカルコンピューティングでよく使われているのと、 V-USBを使いたいからです。
USB の波形をオシロスコープとかでしっかり見たこともないから、 波形も見られそうだしちょうど良いかと思っています。
参考資料
基本的には ATtiny13 仕様書と命令の仕様書です。 遊びでエミュレータをつくろうとしている割には命令セットが多いかもと思い始めています。
ATtiny13 仕様書
http://www.atmel.com/images/doc2535.pdf
Instruction Set Manual
http://www.atmel.com/Images/Atmel-0856-AVR-Instruction-Set-Manual.pdf