チュウニズムコントローラ自作(2) 基板設計
前回の回路のアートワークを引いた。
ハッチングはKiCADには実装されていないので人力で行った。疲れる。
ついでにアクリル板の穴位置と大きさを決めてDesignSparkで書き、Elecrowのレーザーカットサービスに出してみた。
この程度は自分で一枚切り出せばいいが実験的ということで。
チュウニズムコントローラ自作(1) 回路検討
最近チュウニズムを始めたが、配置等を覚えなくてもそれなりに遊べるUXに感動した、楽しい。
これまたコントローラを作っていないのか調べてみると思いのほか情報がないので作ってみることにした。
おそらく静電容量センサのスライダとIR-LEDによる手の検知は変わり者だからあまり作る人も居ないのかもしれない。
スライダは4セグメントの基板を連結して16セグメントを実現することにした。前後検知やホールド中のタップも検知できるよう複数個センサを仕込むことにする。
LEDにはWS2812がいやというほど余っているので使うことにする。
本当はここの基板にはタッチセンサだけを載せようと思っていたが、使いたかったセンサは
http://jp.rs-online.com/web/p/capacitance-to-digital-converters/7091583/
意外と値が張るので、PSoCを載せて基板ごとに入力周りの処理を行うことにした。
Ground Sliderの回路検討を行った。CapSenseを除けばシンプルなものである。
レイアウトは検討中。基板発注と平行してアクリル加工も頼んでしまおうかと思っている。
LEDCubeを作る(2) WS2812B点灯
LEDCubeを作る(1) 基板作成 - 今日やったこと で発注した基板も届き、LEDも届いたので光るか試した。
制御
http://akizukidenshi.com/download/ds/adafruit/WS2812B.pdf
データシートを読むにPWMのデューティーで0,1判定をしているそうなので(Duty=0%でリセット)適当にPWMを起こした。
#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を作成。ワイヤを適当に伸ばす
ワイヤをダブルクリックし、ワイヤに名前をつける(後でどの信号線をクロックソースに使うかわかるようにするため)
<プロジェクト名>.cydwrのClocks、上にあるEdit Clockでシステムクロック設定を出す
Digital Signalsにチェックを入れ、Nameを編集
上の欄に周波数とトレランスも入力しておく。これでDigital Signalからの信号をクロックとして使うことが出来る。
音声信号の2Vrmsと+4dBuと-10dBVについて
一般的な電子機器はどんな音声信号を飛ばしているかまとめておく。
前提知識:dBについて
dBは電力、電圧と電流で定義がある。電圧については
で表される。20dB、40dB、60dBとなると10倍、100倍、1000倍になるといった具合。
信号の振幅とPeek-to-Peekと実効値(Vrms)について
- 振幅:中心からの振り幅
- Peek-to-Peek:最小値と最大値の幅
- 実効値:1周期電圧を与えた時の平均電力と等しい直流電圧値
Vrmsは積分すれば導出できるが正弦波の場合
である。コンセントも実効値なので実際振幅は141Vである。
2Vrms
ここからが本題
実効値の説明はしたのでわかるが、振幅が
となる波形のことである。
音声機器は一般的に実効値で規格を表しているらしい。
2Vrmsは最大電圧レベルとして記述されていることがある。
+4dBu
dBはViとVoの比でしかなく、基準電圧がない。そこでdBuは0.775Vを基準にしてどれぐらいかをdBで表している。
つまり0.775Vが0dBuである。
+4dBuは電圧では
である。振幅まで出すなら
である。業務機器でよく使われるようだ。
ちなみに0.775Vは600Ωで終端すると1mWになる電圧である。
-10dBV
今度は基準電圧が1Vで表されている。
同様に1Vが0dBVとなる。
-10dBVを電圧で表すと
である。振幅まで出すなら
である。民生機器はこちららしい。
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点灯なのでフルで光らせるととても明るい上に電流量が足りなくなるので輝度はソフトリミットをかけることにする。
基板設計
6mm × 100mm 4LEDで1モジュールのスティック基板。Panelizeで発注するので1枚あたり14モジュール取れる
制御回路は至ってシンプル。単品で連結できるようにしたことと、ベース基板からデータを再利用することを考えて一番端のデータを手前に持ってくるパターンも設けた。
ベース基板はスティック基板を4×4取り付けられるだけの基板。ベース基板同士も連結できるようにしておいた。
他の基板の準備ができたらElecrowに発注をかける予定。