2015年9月28日月曜日

PSoC 4 Pioneer Kitでシーケンサー基板を動かす

「シーケンス入力用のデバイス」は長ったらしいので「シーケンサー基板」という名前にすることにした。

そのシーケンサー基板をPSoC 4 Pionner Kitで動作させてみた。

と言っても、音を出す肝心のところはまだで、すかすかのUIのみのテストだ。

配線図


PSoC 4 Pioneer Kitとシーケンサー基板間はI2C通信なので、配線は
茶: GND
赤: VCC(+3.3V)
オレンジ: RESET
黄: SCL
緑: SDA
の5本だ。PSoC 4 Pioneer Kitも3.3V駆動させている。

PSoC 4 Pioneer Kit上で結線している黄色とオレンジのケーブルはUSB-UART(パソコンとのシリアル通信)用のものだ。→「PSoC 4 Pioneer Kit: USB-USRT Bridgeをやってみた&前回までの補足

シーケンサー基板には最初RESET線は入れてなかったが、デバッグがめんどくさいので入れてみた。これを入れておくとマスターをリセットするとシーケンサー基板にもリセットがかかるのでいちいちUSBケーブルを抜き差ししないで済む。

PSoC Creatorのプロジェクト
https://github.com/ryood/PSoC4_sequencer_master/tree/master/Sequencer_Master.cydsn

ToDo:

I2C通信をポーリングで行っているので割り込み処理に変更

<追記:2015.0929>ありゃ、この回路I2Cの信号線のプルアップしてない(^q^; なんで動いてるんだろう</追記>

2015年9月26日土曜日

AVRをI2Cスレーブとして使う スレーブを複数使う

製作したシーケンス入力用のデバイスと別にブレッドボードでI2Cのスレーブ回路組んでI2Cスレーブの2個使いの実験してみた。

ブレッドボード図





ブレッドボードの回路はリズムマシンのExt Boardを想定している

I2Cのスレーブ・マスタのテストプログラムをいろいろ作っているので、どれがどれかわからなくてかなり混乱したが、なんとか動くようになった。

このブログの記事を書きながら検証したのでなんとかなった感じだ(^q^;

ブログは見てもらいたいという動機もあるが、やっぱ書いてる時や、後で参照するのにとても役に立つ。

I2Cのスレーブ・アドレスはSequence Board:0xFE、Ext Board:0xAAに設定してやってみた。(スレーブ側のプログラムはSlave2のアドレス以外変えていない)

Atmel Studio(Slave1):Sequencer Board
https://github.com/ryood/RhythmMachine/tree/master/Atmel%20Stduio/Sequencer_I2C_Slave/Sequencer_I2C_Slave

Atmel Studio(Slave2):ブレッドボードで組んだ回路
https://github.com/ryood/Arduino_master_AVR_sleve/tree/master/Atmel%20Studio/I2C_2nd_Slave_Rx_Tx_ATMega88V

Arduino(Master)
https://github.com/ryood/Arduino_master_AVR_sleve/tree/master/Arduino/master_double_slave_tx_rx

メモ


  • 使おうと思っているSPIのグラフィクLCDはu8glibで動作確認されてるようなので、PSoCから直接制御するのはしんどそう。SPI経由でLCDを制御するAVRを入れて、PSoCとAVRはI2Cで通信?
  • そろそろPSoCでリズムマシンの音出しプログラムを作ったほうがいい?出力はぴゅんぴゅん3号のシールドを使う?
  • 秋月で仕入れたロータリーエンコーダーが安かったので(しかもALPS製)ちゃんとテストする


2015年9月24日木曜日

AVRをI2Cスレーブとして使う 送信・受信

AVRをI2Cスレーブとして使う スレーブからバイト列の送信(割り込みで処理) 」と同じ回路でテストしてみた。



処理としては、

AVR(Slave)→Arduino(Master)
AVRからタクトスイッチの押し下げ状態を含めた8Byteのデータを送信。Arduinoは受け取ったデータをSerial通信でパソコンに送る。

Arduino(Maseter)→AVR(Slave)
Arduinoから0..7の範囲でインクリメントした1Byteデータを送信。AVRは受け取ったデータの位置にあるLEDを点灯(LEDの点灯が流れる)。同時にタクトスイッチの押し下げ状態をORしてLEDを点灯。


AVRで使用したTWIのステータスコードは

  // TWI ステータスコード  
  // Rx  
  #define     TWI_SLA_W_ACK          0x60  
  #define     TWI_RX_DATA_ACK          0x80  
  #define     TWI_RX_STOP               0xA0  
  // Tx  
  #define     TWI_SLA_R_ACK          0xA8  
  #define     TWI_TX_DATA_ACK          0xB8  
  #define     TWI_TX_DATA_NACK     0xC0  

AVRはスレーブだがRX(受信)、TX(送信)両方の動作をする。I2C通信の開始時にマスターから送られる最初のI2Cアドレスの次のW/Rビットを見てRX、TXの処理に入る。

 データの送受信の処理はTWI割り込みルーチン内でTWIステータスコードでSwitch文で処理した。

  switch (TWSR & 0xF8) {  
      // Slave TX  
      case TWI_SLA_R_ACK:  
           TXdata_n = 0;  
      case TWI_TX_DATA_ACK:  
           TWDR = TXdata[TXdata_n++];  
           break;  
      case TWI_TX_DATA_NACK:  
           break;  
      // Slave RX  
      case TWI_SLA_W_ACK:  
           break;  
      case TWI_RX_DATA_ACK:  
           RXdata = TWDR;  
           break;  
      case TWI_RX_STOP:  
           break;  
      default:  
           twi_error(0x55);  
 }  

ほんとはRXモードのときにTX用のステータスコードを受け取った場合などの例外処理をしないといけないと思うが、かなりめんどくさそうなので今回は端折った。

のちのち禍根を残すことになるかもしれないが(^q^;

Atmel Studioのプロジェクト
https://github.com/ryood/Arduino_master_AVR_sleve/tree/master/Atmel%20Studio/I2C_Slave_Rx_Tx_ATMega88V_Byte_Sequence_Interrupt

Arduinoのスケッチ
https://github.com/ryood/Arduino_master_AVR_sleve/tree/master/Arduino/master_tx_rx

2015年9月23日水曜日

リズムマシンの全体の構想


シーケンス入力用の基板は作ったが、これだけだとトラックごとの音色の変更ができないので、音色設定用のロータリーエンコーダーをあと3つ乗せた基板を作ることを考えた。

普通のPOTだと音色トラックを切り替えた時に設定値がおかしくなる(上書きされる)。DTMでMIDIコンを使っていてもよくあるけど。

配線の色分けは赤と黒は電源ライン。黄色はI2C/SPIのクロック、オレンジはI2C/SPIのSDA/MOSIにした。青はSPIのSSだ。

各基板の機能

1) Sequencer Board


このあいだ作った基板で、I2C接続

  • 下に並んでる8個のタクト・スイッチでシーケンスを入力。
  • 一番右のタクトスイッチはシーケンスの1-8、9-16を切り替える。
  • 右上の2つのPOTで、テンポとマスターボリュームを設定。
  • 左のロータリーエンコーダーでトラック(Kick、Snare、Hihatなど)を切り替える。
  • ロータリーエンコーダーの押し下げでシーケンスの再生(Run/Stop)を切り替える。

ToDo:

  • Runモードの時に下部のLEDを流れるように点灯させて再生中のノートを表示。(ナイトランナーナイトライダーみたいなやつ)
  • 再生中のノートはマスターから送ったほうが良さそうなので、I2Cのスレーブ送信・受信をの両方を実装する必要がありそう。

2) Ext Board


I2C接続(スレーブ送信)

  • 3つのロータリーエンコーダーで各トラックのLevel、Decay、Toneを設定。
  • 4つのSW & LEDはまだ決めてないが、シーケンスのパターンを切り替える用途に使えないかな?あんまり複雑にしたくないけど。
  • この基板もAVRを乗せてI2Cスレーブとして動作させる予定。


3) SPI Graphic LCD

128×64のグラフィックLCD。SPI接続

  • 使う予定のLCDが3.3V駆動なので、全体を5V駆動させた時に3.3Vで動作させるためにリニアレギュレータを入れておく。
  • SPIの信号線も5V、3.3Vを切り替えられるようにRで分圧する回路も入れる。前やった実験を参考(Rの分圧で5V->3.3Vレベルシフト(片方向)
  • 切り替えはRをジャンパーでショート

4) DAC & LPF

SPI接続

PSoCを使うならDACは内蔵のものを使えばいいが、ArduinoとかNucleoとかでも使えるようにSPI接続のDACを使う予定。

5) PSoC 4 Prototyping Kit


製作途中はPSoC 4 Pioneer Kitを使う予定だが、最終的にはPSoC 4 Prototyping Kitを使う予定。

6) Pwr Supply

3.3Vまたは5Vの電源


整理してみるとまだまだやらないといけないことがあるもんだなあ(^q^;;;

2015年9月21日月曜日

シーケンス入力用のデバイス ハンダ付けでけた

ねちねちハンダ付けしてやっと完成(^q^/


自作の3.3V-5V安定化電源で3.3V給電している。

データはI2Cのスレーブとして出力するので、2線(+GNDライン)で接続してAruduinoでも使える。

ハンダ面

配線の交錯している部分には、はじめてポリウレタン線(0.26mm)を使ってみた。

使い方はKatsuhiro MorishitaさんがYoutubeで公開されている動画を参考にした。

いつも使っているジュンフロン線と違ってハンダゴテで被覆を溶かしつつ予備ハンダができるので作業性はいい。ヘタするとすずメッキ線より楽かも。

→使っているすずメッキ線が0.6mmと太いせいもあるかもしれない。ロジック回路ならすずメッキ線ももっと細くていいと思う。

ポリウレタン線の難点は、ちゃんとハンダ付けできてるかどうかわかりにくい点。ルーペで確認しないとわからない。

耐久性もちょっと心配。ユニバーサル基板で耐久性も何もないかもしれないが、下手にさわるとハンダが外れそうだ。

慣れの部分もあると思うので今後も適宜使っていくつもりです。

回路図



基板図


リズムマシンの方針(メモ)


  • シーケンス入力用のデバイスとぴゅんぴゅんコントローラー2号を併用?
  • 本体はぴゅんぴゅん3号を基本に(→Pioneer Kitではなく、Prototyping Kitで組んでみる?)
  • グラフィックLCDを使ってみる
  • 波形用のメモリが足りなかったら外付けのEEPROMを使ってみる。


2015年9月20日日曜日

矩形波だけのファンクションジェネレーター 改良案

使ってみて思ったのは下手に加工するよりも、AVRからの5Vp-pの出力を単純にPOTである程度減衰して出力できるようにしたほうが良さそうな気がしてきた。

「もともと30MHzあたりのノイズが乗っているもんだ」と思って使えばこのクロックノイズも使いみちがあるかもしれない。

LME49600の特性」で見てみたが、矩形波の立ち上がりとか入力インピーダンスの影響を見るためにはAVRの出力をそのままの方がわかりやすい。

いろいろ調べたが、OPAMPやロジックICの特性も結局AVRの出力との比較してということになる。

もうあきらめて出力部は単に「AVRのPWM出力+POTによる降圧」でやってみることにする。

機能仕様


インパルス応答: 
普通のOPAMPではインパルスの幅が狭すぎるとまともな応答をしないので、矩形波のDuty比を狭めることで擬似的に行う

ステップ応答:
これもオシロのトリガーで引っ掛ければ矩形波で見れる

GNDレベル: 
必要かどうかわからないが基板に余裕があればTLE2426でやることも想定

AVRのPWM


ATMega328PのTimer/CounterのPWMのモードをもう少し調べてみた。

「FastPWM」は「Frequency & Phase Correct PWM」モードの倍の周波数の波形を生成できるみたいだが、Duty比の設定がよくわからない。

なので、「Frequency & Phase Correct PWM」モードで考えた。

ソース・コードはGithubで公開した。
https://github.com/ryood/Timer_Counter_Test/blob/master/FastPWM_Test/FastPWM_Test.c

Frequency and Phase Correct PWM 出力周波数


Clock(Hz) Clock(kHz)
CPU Clock 16000000 16000
Prescaler 1 Clock 16000000
cycle 出力周波数(Hz) 出力周波数(kHz) サイクル(秒) サイクル(m秒)
2 4000000 4000 0.00000025 0.00025
5 1600000 1600 0.000000625 0.000625
10 800000 800 0.00000125 0.00125
20 400000 400 0.0000025 0.0025
50 160000 160 0.00000625 0.00625
100 80000 80 0.0000125 0.0125
200 40000 40 0.000025 0.025
500 16000 16 0.0000625 0.0625
1000 8000 8 0.000125 0.125
2000 4000 4 0.00025 0.25
5000 1600 1.6 0.000625 0.625
10000 800 0.8 0.00125 1.25
20000 400 0.4 0.0025 2.5
50000 160 0.16 0.00625 6.25
Prescaler 8 Clock 2000000
cycle 出力周波数(Hz) 出力周波数(kHz) サイクル(秒) サイクル(m秒)
2 500000 500 0.000002 0.002
5 200000 200 0.000005 0.005
10 100000 100 0.00001 0.01
20 50000 50 0.00002 0.02
50 20000 20 0.00005 0.05
100 10000 10 0.0001 0.1
200 5000 5 0.0002 0.2
500 2000 2 0.0005 0.5
1000 1000 1 0.001 1
2000 500 0.5 0.002 2
5000 200 0.2 0.005 5
10000 100 0.1 0.01 10
20000 50 0.05 0.02 20
50000 20 0.02 0.05 50
Prescaler 64 Clock 250000
cycle 出力周波数(Hz) 出力周波数(kHz) サイクル(秒) サイクル(m秒)
2 62500 62.5 0.000016 0.016
5 25000 25 0.00004 0.04
10 12500 12.5 0.00008 0.08
20 6250 6.25 0.00016 0.16
50 2500 2.5 0.0004 0.4
100 1250 1.25 0.0008 0.8
200 625 0.625 0.0016 1.6
500 250 0.25 0.004 4
1000 125 0.125 0.008 8
2000 62.5 0.0625 0.016 16
5000 25 0.025 0.04 40
10000 12.5 0.0125 0.08 80
20000 6.25 0.00625 0.16 160
50000 2.5 0.0025 0.4 400
Prescaler 256 Clock 62500
cycle 出力周波数(Hz) 出力周波数(kHz) サイクル(秒) サイクル(m秒)
2 15625 15.625 0.000064 0.064
5 6250 6.25 0.00016 0.16
10 3125 3.125 0.00032 0.32
20 1562.5 1.5625 0.00064 0.64
50 625 0.625 0.0016 1.6
100 312.5 0.3125 0.0032 3.2
200 156.25 0.15625 0.0064 6.4
500 62.5 0.0625 0.016 16
1000 31.25 0.03125 0.032 32
2000 15.625 0.015625 0.064 64
5000 6.25 0.00625 0.16 160
10000 3.125 0.003125 0.32 320
20000 1.5625 0.0015625 0.64 640
50000 0.625 0.000625 1.6 1600
Prescaler 1024 Clock 15625
cycle 出力周波数(Hz) 出力周波数(kHz) サイクル(秒) サイクル(m秒)
2 3906.25 3.90625 0.000256 0.256
5 1562.5 1.5625 0.00064 0.64
10 781.25 0.78125 0.00128 1.28
20 390.625 0.390625 0.00256 2.56
50 156.25 0.15625 0.0064 6.4
100 78.125 0.078125 0.0128 12.8
200 39.0625 0.0390625 0.0256 25.6
500 15.625 0.015625 0.064 64
1000 7.8125 0.0078125 0.128 128
2000 3.90625 0.00390625 0.256 256
5000 1.5625 0.0015625 0.64 640
10000 0.78125 0.00078125 1.28 1280
20000 0.390625 0.000390625 2.56 2560
50000 0.15625 0.00015625 6.4 6400

2015年9月19日土曜日

ロジックICでクロックノイズを低減する AVRとロジックICは電源を分けないとだめそう

AVRのPWMの出力周波数を上げられるようにしたので、MHzレベルで測定してみた。


74HC04

AVRとロジックICの電源を分けて測定した。

  • AVR: USB(AVRのプログラマからの給電)
  • 74HC04: 自作の5V-3.3V安定化電源(5V出力)

赤色:AVRのPWM出力 黄色:74HC04を通した

2MHzだと波形の平坦な部分に乗っているクロックノイズより、立ち上がり、立ち下がり時のオーバーシュート、アンダーシュートが目立ってくる。

どっちがいいか判断が難しい。
→AVR直接の出力にもPOTを入れて減圧できるようにすればいいか?うーん。

拡大

波形の上側

波形の下側

拡大してみると波形の平坦な部分のノイズは確かに減っている

同一電源

ロジックICもAVRと同じUSBからの電源にしてみた。

波形の上側

波形の下側

別電源にしたときと比べるとノイズがあんまり抑えられていない(@@;

AVR用のリニアレギュレータ回路とは別に、ロジックIC用のリニアレギュレータ回路を入れたら改善したりするかな?

2015年9月18日金曜日

ロジックICでクロックノイズを低減する ICの選定

ロジックICでBufferやInverterならほとんどどれでも大差ないような気もするがもう少し測定してみた。

測定条件


  • SQR_FGの出力は、F:100kHz, Duty:50%
  • オシロのch1(赤色):入力、ch2(黄色):出力
  • 縦軸 ch1,ch2とも2V/div

オシロの機能の以下の表示値を表にした。

  • Rise Time
  • Fall Time
  • Over Shoot
  • Pre Shoot

非反転の素子では以下の値も記録した。

  • Delay1: 上昇時のch1からch2の遅延
  • Delay2: 下降時のch1からch2の遅延

結果の表


線で囲った値が一番優秀そうな値だ。

オシロのキャプ画像はGithubにあげた。
https://github.com/ryood/SQR_FG/blob/master/LogicIC-Filter.zip

ブレッドボード図

74HC00

74HC04, 74HCU04, 74HC14, 74VHC04, 74VHCU04


74HC125, 74VHC125

74HC4050



2015年9月14日月曜日

ロジックICでクロックノイズを低減する 74VHC編

今回実験したのは

  • 74VHC04
  • 74VHCU04
  • 74VHC125

だ。VHCシリーズはHCシリーズより高速化されているらしい。(あんまりよくわかってない)

ハーフピッチなのでDIP変換基板に乗せてブレッドボードで実験してみた。

ブレッドボードの配線は前回と同じものです。

74VHC125 1段

74VHC125 2段

74VHC04

74VHCU04

どれがいいのかもっとちゃんと比較しないとわからない。立ち上がり波形しか見ていないが立ち下がりも比較しないとだめかなぁ。

入力波形のあばれ


矩形波だけのファンクションジェネレーターの出力のGNDに気休めに100uHのLを入れていたが、これを通さずに直接GNDに接続してみた。

74VHC125 1段

入力波形のクロックノイズ(と思しきもの)は増えるが、入力は系のあばれは減っている。入力波形に出ているクロックノイズはLなしでも出力ではきれいになくなっている。

74VHC125 2段

74VHC04

74VHCU04

前回と比較するためにVHCではなくHCの74HC125(1段)も見てみた


GNDにLを入れた場合 (前回のもの)

入力に現れる振動はこのGNDに入れたLの影響くさい。

ブレッドボード図を見てもバネっぽい図形だし、インダクタは電流の変化に対して抵抗する素子という意味でもこれが原因かなあ

どちらでもクロックノイズは取れているようなのでこのLは削除する方向で考えます。

2015年9月12日土曜日

ロジックICでクロックノイズを低減する ICをいろいろ試してみた

<追記:2015.09.14>実験したブレッドボード図を追加しました。</>

発注しておいたICが届いたので実験してみた。

何をしているかというと、「矩形波だけのファンクションジェネレーター」を作ってみたもののAVRのPWMで矩形波を出力しているが、AVRのクロック由来と思われる30MHz付近のノイズが乗ってしまうのでこれを除去したい。

が、アナログ・フィルターやOPAMPを使ってノイズを除去しようと思うと矩形波の直角な感じがなまってしまってなかなか使いづらい。

思い付きで3-State Bufferの74HC125を通してみたら、クロックノイズは低減されて矩形波の直角な感じも維持もしくは好ましい感じに整形されるみたいなので他のロジックICでもやってみることにした。

使ったICは
74HC125 3-State Buffer
74HC04 Inverter
74HCU04 Inverter(Bufferなし)
74HC4050 Buffer
74HC04と74HCU04の違いはバッファードとアンバッファードとあるが、アンバッファードの方はCMOSのInverter回路1発で反転、バッファードの方は反転回路を3個重ねて最後に反転出力にしているみたいだ。

74HC4050は単なるバッファで中の回路は反転回路2段重ねみたいだ。

実験回路

AVRのPWM出力をロジックICに入力し、ロジックICの出力を1kΩのRで受けて波形を見ることにした(ブレッドボード図では負荷抵抗が10kΩになってますが1kΩで測定)

GNDに入っているインダクタはGNDに乗っているクロックノイズを除去するための気休め。


74HC125(3-State Buffer)

赤色が「矩形波だけのファンクションジェネレーター」の出力、黄色がロジックICを通した出力

74HC125(3-State Buffer)x2

3-State Bufferを2回通してみた

74HC04(Inveter)





反転素子なので位相も反転しています。

74HCU04(Inverter Unbuffered)



インバーターのバッファがないタイプ。 

このICをアンプとして使っている作例も結構あります。(秋月のキットとか

ブレッドボードの配線は74HC04と同じ。

74HC4050(Buffer)





どれもクロックノイズは低減されているし、振動も抑制されている

入力

入力波形が暴れるので、矩形波だけのファンクションジェネレーターの出力をオシロに直結して見てみた


入力波形(赤色の波形)が暴れなくなった(^q^;

ロジックICを通した波形と比べるとクロックノイズは確実に低減されている。

が、ロジックICにつないだ時に入力側に現れる振動の原因は何?と思って0.1uFのコンデンサーと1kΩのRを並列につないでみた



波形の暴れはでてこない。これはわからない(^q^;;;;


CR以外に他の成分も影響してるんだろうか?


ロジックICはあと74VHCというタイプも仕入れていて(高速タイプらしいです)実験したいですが、また今度



シーケンス入力用のデバイス 基板設計

回路図

電源デカップリング用の47uFの電解コンデンサーとVCC、GNDのテストピンを追加。
RESET線は外した。一応RESET用のピン・ヘッダ―は残してある。

基板図

AVRの電源に入れる積セラをAVCC側に回した。

部品をならべた

今回は試作ということでケースに入れず基板むき出しの予定。