e-tipsmemo

ごった煮

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

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

歯車の検討準備

歯車を購入するにあたって、機械要素部品としての基本的な知識を調べた。
小原歯車工業(株):歯車技術資料 歯車の歯形及び寸法

Fusion 360のアドインに
平歯車を作るものがあり
f:id:katakanan:20170827120933p:plain

これに必要な最低限のもの
f:id:katakanan:20170827120650p:plain

Standard

寸法
mm単位 or inch単位

Pressure Angle

圧力角
20度が一般的(買う歯車に合わせる)

Module

ピッチ円直径をd
ギアの歯数をnとすると

歯の感覚(ピッチp)は

p = \frac{d\times\pi}{n}

両辺を\piで割ると

\frac{p}{\pi} = \frac{d}{n}

これがモジュール

Number of Teeth

歯数

Backlash

バックラッシュ/バックラッシ

Root Fillet Radius

歯底すみ肉部曲率半径

Hole Diameter

軸穴直径

L3GD20 動作テスト②

前回の続き
L3GD20が送る角加速度を見るが
そのままのデータだとノイズやなんやらの影響で
値が暴れすぎるので今のところ移動平均をとって出力させる。
平均をとるデータ数を変えてどれくらいなめらかになるか試す。

移動平均なし
f:id:katakanan:20170812221836p:plain

5回
f:id:katakanan:20170812221839p:plain

10回
f:id:katakanan:20170812221841p:plain

なんとなく飛んでいる値が減っているようだ

コード例

float dx;
float dy;
float dz;

int itr;

int16_t a[SIZE];
int16_t b[SIZE];
int16_t c[SIZE];

int32_t suma;
int32_t sumb;
int32_t sumc;

void get_deg()
{
    suma = 0;
    sumb = 0;
    sumc = 0;

    a[itr] = gyro.read_x();
    b[itr] = gyro.read_y();
    c[itr] = gyro.read_z();
    itr = (itr + 1)%SIZE;
    
    for(int i=0;i<SIZE;i++)
    {
        suma += a[i];
        sumb += b[i];
        sumc += c[i];
    }
    
    dx = (float)suma/SIZE;
    dy = (float)sumb/SIZE;
    dz = (float)sumc/SIZE;
    
    pc.printf("X%fY%fZ%f\r\n", dx,dy,dz);    
}

L3GD20 動作テスト①

急に作りたくなったものがあるので、L3GD20をmbedから使ってみる。

I2Cはちょっと面倒なのでSPIで通信する。

f:id:katakanan:20170714232309p:plain

図にするほどのものでもない図。
akizukidenshi.com
ライブラリがあるいが面白くないので自分で

のチップデータシートによるとSPIの波形は

f:id:katakanan:20170714232625p:plain
のようなタイミングで
SPI - SPIマスター | Mbed

によるとMode3
bitは8で
最初はWho am Iアドレスを読む。

#include "mbed.h"
#include "L3GD20.h"

DigitalOut myled(LED1);

Serial pc(USBTX, USBRX);
//SPI spi(p5, p6, p7); // mosi, miso, sclk
L3GD20 gyro(p5, p6, p7, p8/*, PinName interrupt1=NC, PinName interrupt2=NC*/);

int main() {
    
    pc.baud(115200);

    pc.printf("0x%02X\r\n", gyro.read_byte(0x0F));
    gyro.write_byte(0x20, 0x0F);

    while(1) {
        myled = 1;
        wait(0.5);
        myled = 0;
        wait(0.5);
        pc.printf("0x%02X\r\n", gyro.read_byte(0x0F));
    }
}
#pragma once
#include "mbed.h"

class L3GD20
{
    SPI _spi; // mosi, miso, sclk
    DigitalOut _cs;
    
    public:
    L3GD20(PinName mosi, PinName miso, PinName sclk, PinName cs):_spi(mosi, miso, sclk),_cs(cs)
    {
        _spi.format(8,3);
        _spi.frequency(10000000);
    }
    
    uint8_t write_byte(uint8_t reg, uint8_t val)
    {
        _cs = 0;
        _spi.write(reg);
        _spi.write(val);
        _cs = 1;
        return 0;
    }

    uint8_t read_byte(uint8_t reg)
    {
        _cs = 0;
        _spi.write(reg|0x80);
        uint8_t ret = _spi.write(0x00);
        _cs = 1;
        return ret;
    }
};

これで0xD4が送られてくればOK

"AXI なんとか FIFO" の雑な違い..(?)

Vivado IP の中には今(2016.4)のところ
FIFOで検索すると以下のものがヒットする。

一番目は普通のFIFOである。
最後はおいておいて、その下3つの違いについて

AXI Data FIFO

これについてあまり情報がなかった(おそらく必要となる場面があまりないからか・・)
AXI Interconnectのなかで使われているらしく。
https://www.xilinx.com/support/documentation/ip_documentation/axi_interconnect/v2_0/pg059-axi-interconnect.pdf
これのp76を読む限り、
ユーザーは必要なときにInterconnect内のFIFOをオンオフ擦ることもできるし、
直接ブロックデザインに入れることもできる。
データ幅やクロック変換によってデータレートが違うところで役に立つ。(AXI Crossbar付近)

という感じ。直接使うことはあんまりなさそうだ。

AXI-Stream FIFO

データシート
https://www.xilinx.com/support/documentation/ip_documentation/axi_fifo_mm_s/v4_1/pg080-axi-fifo-mm-s.pdf
によると、
AXI4とかAXI4-LiteをAXI Streamに変換するのにつかえる。イーサネットとかそういうたぐいのパケットコミュニケーションを使うものに良いよ、という。
ただ非同期クロックには対応していない。

使用例をみるとわかりやすい。
p37 Programming Sequence for TX and RX in Store-and-Forward Mode

送信は必要なタイミングでlengthを書き込むことで開始される。
受信はあらかじめThresholdを設定しておくことで割り込みをかけることができるようだ。

AXI4-Stream Data FIFO

https://www.xilinx.com/support/documentation/ip_documentation/axis_infrastructure_ip_suite/v1_1/pg085-axi4stream-infrastructure.pdf
によるとAXI4-Stream Infrastructure のうちの一つである。
そもそもInfrastructuresは

  • Buffering Module
  • Transform Module
  • Routing Module

に分かれており。これらはAXI4-Stream Systemを構成するのに便利なモジュール群である。
その中のBuffering Moduleの一つであるFIFO
FIFO generatorによBRAM,LUTをベースとしてFIFOを実装する。

p13からその説明で基本的なFIFOにAXI4-Streamがくっついたと捉えている。
非同期クロックに対応している。


この中で使いそうなのはAXI Stream FIFOのようだ。
FIFOに特定の情報が集まったらバーストを開始させて、目的のスレーブが処理する。