いかにして問題を解くか

このサイトはGoogle Analyticsを利用しています。

Chattering

目的

マイコンの話をしていると必ずチャタリングの話が出てきます。 ただ、あまり実感したことがないので、少し回路を組んで測定してみました。

測定器

SmartScope を使っています。

katogiso-tech.hatenablog.com

回路

f:id:katogiso-tech:20161106204522p:plain

当然こんな回路です。 電源電圧は 5 v で、スイッチ(SW) は

です。

結果

f:id:katogiso-tech:20161106204752p:plain

1ms もないくらいでチャタリングは収束していました。 ちなみに、タクトスイッチも試したのですが、 今回の回路と測定条件ではほぼチャタリングを確認できませんでした。

個人的な経験が不足しているため、妥当な結果かどうか判断できていません。

あとはリレーで試してみたいですが。

追加実験(おまけ)

f:id:katogiso-tech:20161106205357p:plain

ソフトに頼らず CR 回路でフィルタリングしてみた結果です。

f:id:katogiso-tech:20161106205532p:plain

時定数を 1ms くらいで設計したので、十分チャタリングは除去できています。

個人的な記録

以下の点が悲しい。

  • ハンダ付けが下手になっている。
  • 数値解析能力が低下している。

以下の点は勉強する。

  • Linux 上で、Spice 解析する方法

SmartScope

紹介

LabNation が作っている USB 接続のオシロです。 もともと、クラウドファウンディングのkickstarter で資金調達して制作されて、今は通常販売しています。

確か売り文句は「既存のUIから脱却して、新しい操作方法を提供する。」みたいなことが書いてありました。 サイトで確認してもらえばわかりますが、そこそこ良いソフトだと思います。

Mono の成果を利用したソフトが提供されていて、Linuxでも動きます。 私は普段から Linux で作業しているので、重宝しています。 また、どの程度サポートできているのかわからないのですが、Android でも動くようです。

どのくらい売れているのかわかりませんが、 既存のUSBオシロよりも画面が見やすくて趣味で使う程度なら文句ありません。

この記事は操作方法の覚書です。

UI 紹介

全体像

他のUSBオシロも持っているのですが、圧倒的に UI が良いです。 ちなみにデジアナになるし、プロトコルアナライザーにもなります。

f:id:katogiso-tech:20161106154937p:plain

波形表示の左側にある丸印は、対応するプローブの 0 V となります。 波形表示の右側にある丸印は、対応するプローブのトリガー電圧となります。

画面サイズは自在に変更できて、左下の丸いマークを押すと左側のメニューの表示、非表示を切り替えられます。

チャネル、ステータスの表示、非表示切り替え

f:id:katogiso-tech:20161106202226p:plain

これらの表示を、

f:id:katogiso-tech:20161106202253p:plain

右下にあるこのボタンで項目毎に切り替えられます。 また、その表示は好きな場所へ、ドラッグできます。

波形(トリガ、AC/DC など)の切り替え

左側の丸いマークをクリックすると、

f:id:katogiso-tech:20161106202530p:plain

こんなメニューが出てきます。 hide を押すと波形が消えます。

トリガ設定

右側の丸いマークをクリックすると、

f:id:katogiso-tech:20161106202653p:plain

トリガの設定ができます。

波形の幅などの計測

f:id:katogiso-tech:20161106202929p:plain

波形表示領域の外側(灰色)領域から、ドラッグすると補助線が出てきます。

上下端からドラッグすると、電圧側に補助線が出て、 左右端からドラッグすると、時間軸側に補助線が出ます。

これがなかなか便利で気に入ってます。

Inkscape 3.10 ドキュメントの背景色の変更

目的

デフォルトのドキュメントの背景が白なので、白いものを描いた時になにも見えない。 そんな時にドキュメントの背景を変更するやり方を説明する。

背景色変更方法

f:id:katogiso-tech:20161023210513p:plain

メニューの[ファイル]->[ドキュメントのプロパティー]で図のようなダイアログを表示して、 ページタブの右下にある[背景色]をクリックすると色を変更できる。

Chart JS V2.0 Bar Chart Pattern Sample

目的

bar chart は標準で1色でのベタ塗りだが、 モノクロでも識別できるようにパターンを使って塗りつぶすようにする。

最終結果

f:id:katogiso-tech:20161010182453p:plain

解決方法

元々, backgroundColor にパターンを渡すとそれで塗りつぶせるようになっているので、 パターンをどこかで作って渡すだけで可能となる。

npm が使えて、使うことに抵抗がなければ

patternomaly

$ npm install patternomaly

でインストールすれば良い。

私は単純な事に npm を使うのがあまり好きではないので、 勉強がてら [patternomaly] を参考に少し javascript を記述してパターンを作成した。

主な修正点

修正点は

  1. パターン作成用の javascript を追加しbackgroundColorに指定し、
  2. borderWidth を 2 にした

こととなる。

パターン作成用 Javascript

少し長いですが、javascript を読めればそんなに大したことはやっていません。 そしてほとんど patternomaly と同じです。

主な違いは 2 点で、

  1. パターンの塗りつぶしが背景色に白をアルファブレンドしていたのを、白で塗りつぶしたこと
  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 への指定

必要なところを抜き出すと以下ように、

  1. backgroundColor に 上記の pattern メソッドを指定し、
  2. パターンだけだと境界が曖昧になるので、borderWidthで境界を表示する

だけです。

また、パターンは

  1. 四角
  2. 水平線
  3. 垂直線

を選択できるようになっていて、それぞれ

  1. pattern( '#color', 'sq')
  2. pattern( '#color', 'lh')
  3. pattern( '#color', 'lv')

と指定すると切り替わります。

 var myChart = new Chart(ctx, {
     type: 'bar',
     data: {
         labels: [ "Day1", "Day2", "Day3" ],
         datasets: [
             <...>
             {
                 <...>
                 backgroundColor: pattern( '#' + pal[5], 'lh' ),
                 borderWidth:     2,
             }
         ]
     },
})

全体

gist13805da2122499a00f0369fd714a6e43

AVR AVR-AS

参考資料

AVR Libc

ここをベースにしてインストールする。

binutils

アセンブラとかが入っている。 avr-gcc もこれを使っている。

インストール先のディレクトリを適当に設定する。

$ mkdir /home/so/work/avr/local

Download

GNU Binutils

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

avr-as usage tutorial

上記サイトを参考にして、動作確認をする。

.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 画像の切り抜き

内容

画像をクリップ加工する方法を説明する。

クリップ

作業は

  1. 図形(四角形など)を描く
  2. コンテキストメニューの"フィル/ストローク"を選択する
  3. フィルはなし(無色)とする。
  4. ストロークは着色する。
  5. 元図と図形を両方選択(Shift + クリック)する。
  6. メニューの [オブジェクト]->[クリップ]->[設定]を押す。
  7. メニューの [ファイル]->[PNG画像にエクスポート]を選択する。

の順番となる。

図形を描く

矩形ツールなどを選択して、領域を指定する。

f:id:katogiso-tech:20160926000459p:plain

コンテキストメニューの"フィル/ストローク"を選択する

領域の塗りつぶしをなくして、枠だけにします。

  • フィルはなし(無色)とする。
  • ストロークは着色する。

f:id:katogiso-tech:20160926000452p:plain

元図と図形を両方選択

Windows みたいに Ctrl + クリックではなく、Shift + クリックする。

クリップ設定

メニューの [オブジェクト]->[クリップ]->[設定]を押す。

f:id:katogiso-tech:20160926000502p:plain

PNG としてエクスポートする

メニューの [ファイル]->[PNG画像にエクスポート]を選択する。

f:id:katogiso-tech:20160926000450p:plain

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