e-tipsmemo

ごった煮

KiCADのモデル Fusion360

KiCADには3Dmodelを表示・出力機能がデフォルトであるが、
対応フォーマットがwrlというものだけだ。
一方でフリーの3DCADとしては最も優秀だと思われる
Fusion360の出力フォーマットにwrlはない。
これをFreeCADを使って変換するプラグインがあるらしいのでそれの導入手順をメモる。

0. install

KiCADはVer4.0以降、FreeCADはVer0.15以降
Fusion 360 とFreeCADをインストールしておく。
f:id:katakanan:20171119125757p:plain

ここからFreeCADの補助ツールをダウンロード(インストール不要)
sourceforge.net

解凍したら中のlaunch-kicad_StepUp-Tools.batを編集する必要があるかもしれない。
f:id:katakanan:20171119130227p:plain

1. Footprintは作っておく

f:id:katakanan:20171119130930p:plain:w300

2. Stepファイルの用意

Fusion360で作る。(位置は原点に近い方がいい(あとで調節する))
ここで色付けしてしまう
f:id:katakanan:20171119131242p:plain
Exportでstep file形式を指定。
最終的にwrlファイルを出力したい場所にstpファイルをExportする。

3. 位置調整とwrl出力

launch-kicad_StepUp-Tools.batを起動する。
右側にツールバーのあるFreeCADとなる。
f:id:katakanan:20171119131809p:plain

load kicad footprintで先程作ったフットプリントを読み込む
f:id:katakanan:20171119132039p:plain
f:id:katakanan:20171119132233p:plain

stepファイルをドラッグ&ドロップし、読み込ませる。
位置調整はモデルを選択状態にして右のボタン郡で行う。
選択状態にしないとおこられる。
f:id:katakanan:20171119132526p:plain

位置の調整が終わったら
一旦Ctrl+SでFreeCadのフォーマットで
先程のstepファイルの場所に保存する
export kicadでwrlと位置を調整したstepを出力する。
f:id:katakanan:20171119132911p:plain

いっろいろとメッシュの細かさなどを聞かれるが、全部デフォルトでOK
stepファイルを上書きするかどうか聞かれる。無視。

wrlが出力される。
f:id:katakanan:20171119133039p:plain

4. フットプリントと紐付け

footprintの作成画面上の設定で先程のwrlを設定。
(ここで位置の調整をする必要はない)
f:id:katakanan:20171119133333p:plain

表示→3Dビューアー で
全体が見える(この時点ですでに位置があっているはず)
f:id:katakanan:20171119133612p:plain

これで終了

KiCADは全体的には悪くないCADだが
まったく使いにくいところ(先程の3Dの設定やschとlayout画面での統一性のないキー操作)
があるのでアップデートに期待している。

Verilog ビデオ信号出力(アナログRGB)

忘れないように。
1920x1080@60fpsの場合
ビデオ期間とhsyncの関係
f:id:katakanan:20171114115612p:plain

ビデオ期間とvsyncの関係
f:id:katakanan:20171114115713p:plain:w400

50fpsだとフロントポーチ、バックポーチの各値が違う。
hが横方向のピクセルを、vを縦のラインを数えていくカウンターを用意して、
適当な値になったらvsyncやhsyncを上げればよさそう。

module main(
    clk,
    resetn,
    rout,
    gout,
    bout,
    vsync,
    hsync    
    );

    localparam HDISP = 1920;
    localparam HSSTART = 2008;
    localparam HSEND = 2052;
    localparam HTOTAL = 2200;

    localparam VDISP = 1080;
    localparam VSSTART = 1084;
    localparam VSEND = 1089;
    localparam VTOTAL = 1125;

    input wire clk;
    input wire resetn;
    output reg[7:0] rout;
    output reg[7:0] gout;
    output reg[7:0] bout;
    output reg vsync;
    output reg hsync;
    
    reg[10:0] vcounter;//0 ~ 1124
    reg[11:0] hcounter;//0 ~ 2199
    wire vcount;
    wire disp;
    
    assign vcount = (hcounter == HTOTAL-1)? 1:0;
    assign disp = ((hcounter < HDISP) && (vcounter < VDISP))?1:0; 

    always@(posedge clk)begin
        if(resetn == 1'b0)begin
            vcounter <= 12'b0;
            hcounter <= 12'b0;
    end
        else begin  
            hcounter <= hcounter + 1;

        
            if(hcounter == HTOTAL-1)begin
                hcounter <= 12'b0;
            end
            
            if(vcount == 1'b1)begin
                        vcounter <= vcounter + 1;
            
                        if(vcounter == VTOTAL-1)begin
                            vcounter <= 11'b0;
                        end
            end
            
        end
    end
        
    wire rpattern;
    wire gpattern;
    wire bpattern;
    
    wire vsync_b;
    wire hsync_b;
    
    ///<240 <480 <720 <960 <1200 <1440 <1680 <1920 hcounter
    //r 0    0     0    0   1      1     1     1
    //g 0    0     1    1   0      0     1     1
    //b 0    1     0    1   0      1     0     1
    
    assign rpattern =   ((960 <= hcounter)&&(hcounter < 1920))? 1:0;
    assign gpattern =   (((480  <= hcounter)&&(hcounter < 960))||
                        ((1440 <= hcounter)&&(hcounter < 1920)))? 1:0;
    assign bpattern =   (((240  <= hcounter)&&(hcounter < 480))||
                        ((720  <= hcounter)&&(hcounter < 960))||
                        ((1200  <= hcounter)&&(hcounter < 1440))||
                        ((1680  <= hcounter)&&(hcounter < 1920)))? 1:0;
    
    assign vsync_b = ((VSSTART <= vcounter) && (vcounter <  VSEND))? 1:0;
    assign hsync_b = ((HSSTART <= hcounter) && (hcounter <  HSEND))? 1:0;
    
    always@(posedge clk)begin
        if(resetn == 1'b0)begin
            vsync <= 1'b0;
            hsync <= 1'b0;
            rout <= 8'b0;
            gout <= 8'b0;
            bout <= 8'b0;
        end
        else begin
            vsync <= vsync_b;
            hsync <= hsync_b;
            
            if(disp == 1'b1)begin
                rout <= {8{rpattern}};
                gout <= {8{gpattern}};
                bout <= {8{bpattern}};
            end
            else begin
                rout <= 8'b0;
                gout <= 8'b0;
                bout <= 8'b0;
            end
            
        end
    end

endmodule

clkはFullHDのピクセルクロックの148.5MHzを入れる。
とりあえずカラーバーを表示。
f:id:katakanan:20171114120837p:plain
よさそう。
ここに8bitのDACなどをつければビデオが表示できるはず。

Transition Minimized Differential Signaling のメモ

毎回調べてい気がするのでメモ

#include <iostream>
#include <bitset>

int main()
{
	std::bitset<8> rline[2200] = {0};
	std::bitset<10> rout[2200] = {0};

	//init
	for(int i=0;i<1920;i++)
	{
		rline[i] = 0x50;
	}

	int cnt = -2;

	for(int i=0;i<1920;i++)
	{
		std::cout << rline[i];
		int n0 = 0;
		int n1 = 0;

		if((rline[i].count() >= 5) || ((rline[i].count() == 4) && (rline[i][0] == 0)))
		{
			//XNOR
			std::cout << " XNOR\t";
			bool x = rline[i][0];
			bool y;
			
			for(int j=0;j<=7;j++)
			{
				if(j!=7){y = rline[i][j+1];}
				rout[i][j] = x;
				x = !(x^y);
			}
	
			rout[i][8] = 0;
			rout[i][9] = 0;

			n1 = rout[i].count();
			n0 = rout[i].size() - n1;
			n0 -= 2;

			std::cout << rout[i] <<"\t" << n1 << "\t" << cnt << "\t";
		}
		else
		{
			//XOR
			std::cout << " XOR\t";
			bool x = rline[i][0];
			bool y;
			
			for(int j=0;j<=7;j++)
			{

				if(j!=7){y = rline[i][j+1];}
				rout[i][j] = x;
				x = (x^y);
			}
	
			rout[i][8] = 1;
			rout[i][9] = 0;

			n1 = rout[i].count();
			n0 = rout[i].size() - n1;
			n0--;
			n1--;

			std::cout << rout[i] <<"\t" << n1 << "\t" << cnt << "\t";
		}

		if((cnt == 0) || (n1 == 4))
		{
			rout[i][9] = ~rout[i][8];
			if(rout[i][9])
			{
				rout[i] = ~rout[i];
				rout[i][8] = false;
				rout[i][9] = true;
				cnt = cnt + n0 - n1;
			}
			else
			{
				cnt = cnt - (n0 - n1);
			}
		}
		else
		{
			if(((cnt > 0) && (n1 > 4))||((cnt < 0)&&(n1 < 4)))
			{
				bool tmp = rout[i][8];
				rout[i] = ~rout[i];
				rout[i][8] = tmp;
				rout[i][9] = true;
				if(!rout[i][8])
				{
					cnt = cnt + (n0 - n1);
				}
				else
				{
					cnt = cnt + (n0 - n1) +2;
				}
			}
			else
			{
				rout[i][9] = false;
				if(!rout[i][8])
				{
					cnt = cnt + (n1 - n0) - 2;
				}
				else
				{
					cnt = cnt + n1 - n0;
				}
			}
		}

		std::cout << rout[i] << "\t" << cnt << std::endl ;
	}

	return 0;
}

参考にしたサイト
http://ijarcet.org/wp-content/uploads/IJARCET-VOL-4-ISSUE-4-1576-1579.pdf

だが最後が少し間違っている。

Disp=disp+onesX-zerosX-zerosX

のところを

Disp=disp+onesX-zerosX

であるはず。

ElectronでJCanvasを使う

Javascriptがよくわからなかったので導入がよくわからなかった。


electronのアプリの場所でローカルインストールする

npm install --save-dev jquery
npm install --save-dev jcanvas
index.html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
	<link href="./style.css" rel="stylesheet">
    <title>Hello World!</title>
  </head>
  <body>
    <h1>Hello World!</h1>
    <script>
      require('./renderer.js')
    </script>
    <canvas id="pallet" width="300" height="300"></canvas>
  </body>
</html>
renderer.js
window.jQuery = window.$ = require('jquery');
var JCanvas = require('jcanvas');
JCanvas($, window);


$(function(){

	$('#pallet').drawPolygon({
		layer: true,
		fillStyle: '#c33',
		x: 200, y: 200,
		radius: 50,
		sides: 5,
		concavity: 0.5,
		click: function(layer) {
		// Spin star
		$(this).animateLayer(layer, {
		rotate: '+=144'
		});
		}
	});	

});

f:id:katakanan:20171029101251p:plain

CSS内だけでcanvasのサイズを指定すると、表示がおかしくなる。

f:id:katakanan:20171029101318p:plain

その場合は、index.htmlに直接書くか、
jsに以下を追加する。

$('#pallet')[0].width=300;
$('#pallet')[0].height=300;

KiCAD 4.0.1 length matching (differential)

e-tipsmemo.hatenablog.com

の続き。

 

前提として回路図を書いてフットプリントの割当をしてある状態にする。

また、差動配線にしたいPinにつながるネット名が

[hoge]+,[hoge]- または[hoge]_P,[hoge]_Nとなっていないとできない。

 

①表示→OpenGL Modeにする。

②デザインルールを設定する。

f:id:katakanan:20171018215821p:plain

ほしい差動インピーダンスになるように配線幅と間隔を決める。

(基板厚は1.6mmで材質はだいたいFR4とか(なのでその誘電率をしらべ)適当なサイトのインピーダンス近似式をつかう)

*画像のは適当

③寸法→差動ペア

で今から配線する差動ペアの幅と間隔を決める。

f:id:katakanan:20171018220144p:plain

④配線→差動ペア

f:id:katakanan:20171018215610p:plain

で、差動配線する。ビアはV。

⑤配線→差動ペアの配線長の調整

で調整したい差動ペアの片方の配線をクリック。

⑥そのままLキーか右クリック→配線長の調整設定

f:id:katakanan:20171018220538p:plain

で目標の長さを指定。その他いろいろ設定可能。

Sやrはどれくらいがいいのかは周波数やアプリケーションに依るだろう・・・

⑥.⑤

f:id:katakanan:20171018220801p:plain

調整する前に、適当にセグメントをクリックすると全体の長さがわかるのでそこから調節死体長さを決まる。(セグメント長は光っている部分だけの長さ)

⑦引ける

引いている途中。1,2,3,4キーで上の設定画面で設定した範囲で微調節ができる。

f:id:katakanan:20171018220710p:plain

⑧配線→差動ペアの遅延/なんとかなんとか

配線をクリックして、右クリックメニューからスキュー調整メニューをだす。

f:id:katakanan:20171018221014p:plain

見たまま。

⑨引ける

引いている途中。1,2,3,4キーで上の設定画面で設定した範囲で微調節ができる。

f:id:katakanan:20171018221038p:plain

 

 

まとめ

ある機能は使ってみたくなるものであるが、差動ペアを引くことなどはあまりないので

お試しがてらのメモ。

Uart受信 Form Closing 停止する。

UARTの受信スレッドからUIスレッドの内容を変更する方法として、
以下のようなコードを書いた。

private void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
        //受信処理
    ...
       this.Invoke(new MethodInvoker(() => { /*UIスレッドでなんかする*/addValuetoGraph(); }));
}

が、これだと接続したままでFormのClosingイベント内でSerialをCloseすると、
プログラムが停止する。

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    if (serialPort1.IsOpen == true)
    {
        serialPort1.Close();
        comboBox1.Enabled = true;
        button1.Enabled = true;
    }
}

解決策
受信スレッドのInvokeをBeginInvokeにする。

//brfore
this.Invoke(new MethodInvoker(() => { addValuetoGraph(); }));

//after
this.BeginInvoke(new MethodInvoker(() => { addValuetoGraph(); }));

マイクロマウスのために買った部品たち

機械を習ったことがないが
マイクロマウスを始めるために何が必要か全くわからなかったので
調べた結果必要だと思われるものを色々と買った。

基本的な部品。
ホイールを自作する人もいるらしいが、
自分では精度がでないだろうし
自作の方法がわからない。

ホイールとセットで必要
ゴムの硬さが色々とあるようだがわからないので
適当なのを買った。

ミニチュアベアリングというカテゴリー
[X][Y]0ZZという型番でたくさん存在し
X(mm)が外径
Y(mm)が内径のようだ(??)
"シールド"はボールが剝き出しにならない蓋。
ゴミが入るのを防ぐ。

ナイロンナット
これでネジを固く閉められる。
普通のナットと違い、緩むのを避けたい場所で使うそう。

アルミM3テーパーカラー (ブラック) 6個入り SGE-108BK

アルミM3テーパーカラー (ブラック) 6個入り SGE-108BK

テーパーカラー
モーターマウントと車輪の間に挟むことでスムーズさを

タミヤ HOP-UP OPTIONS OP-585 φ3mmシムセット

タミヤ HOP-UP OPTIONS OP-585 φ3mmシムセット

シムリング
これも回転をスムーズに保つために必要

歯車(候補1)
ホイールの中心が8mmなので
内径8mmでモジュールが適当な値で
厚みが2mm程度で
大きさが20mm程度の大きさの歯車を必要としている。
(トルクを考えると、なるべく外側で回したほうが良さそうなので)
検索したところ、既製のものでは
この歯車ぐらいしかない・・?

M3のネジ
これらを単純に組み立てたときの想定図
f:id:katakanan:20170901211012p:plain
f:id:katakanan:20170901212245p:plain

これほどのツールが無料で使えるとはすごい時代だなぁ