チュウニズムコントローラ自作(2) 基板設計

f:id:tohkaf:20160327211423p:plain


f:id:tohkaf:20160327211512p:plain

前回の回路のアートワークを引いた。

ハッチングはKiCADには実装されていないので人力で行った。疲れる。

f:id:tohkaf:20160327211526p:plain

ついでにアクリル板の穴位置と大きさを決めてDesignSparkで書き、Elecrowのレーザーカットサービスに出してみた。

この程度は自分で一枚切り出せばいいが実験的ということで。

チュウニズムコントローラ自作(1) 回路検討

最近チュウニズムを始めたが、配置等を覚えなくてもそれなりに遊べるUXに感動した、楽しい。

これまたコントローラを作っていないのか調べてみると思いのほか情報がないので作ってみることにした。

おそらく静電容量センサのスライダとIR-LEDによる手の検知は変わり者だからあまり作る人も居ないのかもしれない。

スライダは4セグメントの基板を連結して16セグメントを実現することにした。前後検知やホールド中のタップも検知できるよう複数個センサを仕込むことにする。

LEDにはWS2812がいやというほど余っているので使うことにする。

本当はここの基板にはタッチセンサだけを載せようと思っていたが、使いたかったセンサは

http://jp.rs-online.com/web/p/capacitance-to-digital-converters/7091583/

意外と値が張るので、PSoCを載せて基板ごとに入力周りの処理を行うことにした。


f:id:tohkaf:20160327033138p:plain

Ground Sliderの回路検討を行った。CapSenseを除けばシンプルなものである。

f:id:tohkaf:20160327033228p:plain

レイアウトは検討中。基板発注と平行してアクリル加工も頼んでしまおうかと思っている。

LEDCubeを作る(2) WS2812B点灯

f:id:tohkaf:20160131233657j:plain

LEDCubeを作る(1) 基板作成 - 今日やったこと で発注した基板も届き、LEDも届いたので光るか試した。

制御

http://akizukidenshi.com/download/ds/adafruit/WS2812B.pdf

データシートを読むにPWMのデューティーで0,1判定をしているそうなので(Duty=0%でリセット)適当にPWMを起こした。

f:id:tohkaf:20160131234004p:plain

#include <project.h>

#define LED_N               (4)
#define LED_RESOLUTION      (8)
#define LED_COLOR           (3)
#define LED_RESET_DURATION  (50)

volatile uint16_t current_led = 0x0;
volatile uint8_t current_color = 0x0;
volatile uint8_t current_bit = 0x0;

volatile uint8_t is_led_reset = 0x0;
volatile uint8_t led_reset_counter = 0x0;

volatile uint8_t color_data[LED_N][LED_COLOR] = { };
CY_ISR(pwm_ovf){
    if(is_led_reset){
        PWM_1_WriteCompare(0);
        
        if(led_reset_counter++ >= LED_RESET_DURATION){
            is_led_reset = 0x0;
        }
    } else {
        PWM_1_WriteCompare((color_data[current_led][current_color] & (0x80 >> current_bit++)) ? 2 : 1);
        if(current_bit >= LED_RESOLUTION) {
            current_bit = 0x0;
            current_color++;
        }    
        if(current_color >= LED_COLOR) {
            current_color = 0x0;
            current_led++;
        }
        if(current_led >= LED_N){
            current_led = 0x0;
            is_led_reset = 0x1;
            led_reset_counter = 0x0;
        }
    }
}
int main()
{
    uint32 i,j,k;
    
    PWM_1_Start();
    PWM_1_WriteCompare(0);
    CyDelay(10);

    isr_PWM_OVF_StartEx(pwm_ovf);
    CyGlobalIntEnable;
    
    for(;;)
    {
        for(j = 0 ; j < LED_COLOR ; ++j){
            for(i = 0 ; i < LED_N ; ++i){
                for(k = 0 ; k < 0xffff ; ++k){
                    color_data[i][j] = (k >> 8);
                }
            }
        }
        for(j = 0 ; j < LED_COLOR ; ++j){
            for(i = 0 ; i < LED_N ; ++i){
                for(k = 0 ; k < 0xffff ; ++k){
                    color_data[i][j] = ~(k >> 8);
                }
            }
        }
    }
}

DMAでLEDの書き換えをし続けるコンポーネントを作るかFPGAで制御したくなったが、FPGAなんざ使ったら本末転倒感がある。

PSoCでデジタル信号をクロックソースに使う方法

PSoC5LPでクロックソースを振動子ではなく外部発振器など信号供給で動作させる方法。

まず<プロジェクト名>.cyschでDigital Input Pinを作成。ワイヤを適当に伸ばす

f:id:tohkaf:20160111170602p:plain

ワイヤをダブルクリックし、ワイヤに名前をつける(後でどの信号線をクロックソースに使うかわかるようにするため)

f:id:tohkaf:20160111170803p:plain

<プロジェクト名>.cydwrのClocks、上にあるEdit Clockでシステムクロック設定を出す

f:id:tohkaf:20160111170956p:plain

Digital Signalsにチェックを入れ、Nameを編集

f:id:tohkaf:20160111171049p:plain

上の欄に周波数とトレランスも入力しておく。これでDigital Signalからの信号をクロックとして使うことが出来る。

音声信号の2Vrmsと+4dBuと-10dBVについて

一般的な電子機器はどんな音声信号を飛ばしているかまとめておく。

前提知識:対数について

対数Logは以下で示される

{ \displaystyle
y = a^x
}
の時、
{ \displaystyle
x = log_a(y)
}

aをなんとか乗したらyになる。そのなんとかを表しているのがLog

前提知識:dBについて

dBは電力、電圧と電流で定義がある。電圧については

{ \displaystyle
20log_{10}(Vout/Vi)
}

で表される。20dB、40dB、60dBとなると10倍、100倍、1000倍になるといった具合。

信号の振幅とPeek-to-Peekと実効値(Vrms)について

  • 振幅:中心からの振り幅
  • Peek-to-Peek:最小値と最大値の幅
  • 実効値:1周期電圧を与えた時の平均電力と等しい直流電圧値

Vrmsは積分すれば導出できるが正弦波の場合

{ \displaystyle
V_{rms} = V_m/\sqrt2 = 0.7071 \times V_m
}

である。コンセントも実効値なので実際振幅は141Vである。



2Vrms

ここからが本題

実効値の説明はしたのでわかるが、振幅が

{ \displaystyle
V_m = \left. V_{rms} \times (1/0.7071) \right|_{V_{rms} = 2} = 2.817
}

となる波形のことである。

音声機器は一般的に実効値で規格を表しているらしい。

2Vrmsは最大電圧レベルとして記述されていることがある。

+4dBu

dBはViとVoの比でしかなく、基準電圧がない。そこでdBuは0.775Vを基準にしてどれぐらいかをdBで表している。

つまり0.775Vが0dBuである。

{ \displaystyle
0dBu = \left. 20log_{10}(V/0.775) \right|_{V=0.775}
}

+4dBuは電圧では

{ \displaystyle
V_{rms} = \left. 10^{G/20} \times 0.775 \right|_{G=4} = 1.228
}

である。振幅まで出すなら

{ \displaystyle
V_m = \left. V_{rms} \times (1/0.7071) \right|_{V_{rms} = 1.228} = 1.73
}

である。業務機器でよく使われるようだ。

ちなみに0.775Vは600Ωで終端すると1mWになる電圧である。

-10dBV

今度は基準電圧が1Vで表されている。

同様に1Vが0dBVとなる。


{ \displaystyle
0dBV = \left. 20log_{10}(V/1) \right|_{V=1}
}

-10dBVを電圧で表すと

{ \displaystyle
V_{rms} = \left. 10^{G/20} \times 1 \right|_{G=-10} = 0.31
}

である。振幅まで出すなら

{ \displaystyle
V_m = \left. V_{rms} \times (1/0.7071) \right|_{V_{rms} = 0.31} = 0.437
}

である。民生機器はこちららしい。

LEDCubeを作る(1) 基板作成

ここ最近でよく見かけるようになったLEDキューブ、自分でも作りたくなったので作ってみることにする。

仕様

作っても可搬性が悪かったりメンテナンス性が悪いととてもじゃないが外で展示できない。
そこで全部基板で作成して組み立てる方式にする。

解像度は4×4×4を1モジュールにして拡張できるようにする。
全てのLEDをフルカラー制御出来ることが最低条件

LEDはマイコンを内蔵したWS2812Bを使う。最近Adafruitの円形LEDとかでよく見かけるやつだ。

マイコン内蔵RGB LED WS2812B (2個入): LED(発光ダイオード) 秋月電子通商 電子部品 ネット通販


あとはダイナミック点灯もクソもないので800kHzPWMでDuty比でエンコードしてデータ送出をするだけで良い。

8×8×8を作るとなると512個も必要で流石に秋月で買ってられないのでaliexpressで1ロット(1000個)発注をかけた。

static点灯なのでフルで光らせるととても明るい上に電流量が足りなくなるので輝度はソフトリミットをかけることにする。

基板設計

f:id:tohkaf:20160109191002p:plain

6mm × 100mm 4LEDで1モジュールのスティック基板。Panelizeで発注するので1枚あたり14モジュール取れる

f:id:tohkaf:20160109191107p:plain

制御回路は至ってシンプル。単品で連結できるようにしたことと、ベース基板からデータを再利用することを考えて一番端のデータを手前に持ってくるパターンも設けた。

f:id:tohkaf:20160109191213p:plain

ベース基板はスティック基板を4×4取り付けられるだけの基板。ベース基板同士も連結できるようにしておいた。


他の基板の準備ができたらElecrowに発注をかける予定。