ラベル シーケンス入力用のデバイス の投稿を表示しています。 すべての投稿を表示
ラベル シーケンス入力用のデバイス の投稿を表示しています。 すべての投稿を表示

2015年11月9日月曜日

シーケンサー基板 CQ出版のPSoC 5LP基板で動作確認(メモ)

UARTではなく、シーケンサー基板からの送受信値をパラレルのキャラLCDに表示するようにして、I2CコンポーネントをUDBではなくFixedにしたら動作した。


TopDesign

I2CコンポーネントはUDBモードだとクロックとリセットの入力が必要みたいだが、Fixedモードだといらないみたいだ。Clock_1とRST_1はモード切替の残骸です。

DWR Pins


PSoC Creatorのプロジェクト
https://github.com/ryood/RhythmMachine/tree/master_test/Master_PSoC5LP_Test/PSoC/Sequencer_Board__Test/Sequencer_Master_CQ_PSoC5LP.cydsn

メモ:


  • I2CコンポーネントをUDBモードにすると動作が異常に遅くなる。

シーケンサー基板 PSoC 5LPで動作テスト

マスターのファームウェアをPSoC 5LPにそのまま移植しようとするとなかなか上手く動いてくれないのでシーケンサー基板単体でテストした。

CQ出版のPSoC 5LP基板


この基板はProgram用と通信用の2つのUSBポートがあるが、通信用の方がPCで認識しない。
(接続音もでない)

PSoC 5LP Prototyping Kit(USBUARTコンポーネント)


こちらもProgram用と別に通信用のmicroUSBポートがついている。USBUARTコンポーネントのを使って制御するようだ。PCに接続すると認識はされるが、ドライバがインストールできない。

PSoC Creatorのプロジェクトのフォルダー下に「USBUART_1_cdc.inf」というファイルができるのでこれをインストールするらしいが、Windows 8ではドライバに署名がないとインストールできない。

Microsoft Certified USB UART Driver
http://www.cypress.com/documentation/software-and-drivers/microsoft-certified-usb-uart-driver

から署名付きのドライバを落としてインストールしてみたがどう使うのかよくわからない。

調べるのも疲れてきたので保留。

PSoC 5LP Prototyping Kit(UARTコンポーネント)


UARTコンポーネントは、KitProg経由でデカい方のUSBコネクタ経由でUART通信ができるのでこれを使った。

配線図


SCL,SDAは4.7kΩでプルアップ


PSoC Creatorのプロジェクト
https://github.com/ryood/RhythmMachine/tree/master_test/Master_PSoC5LP_Test/PSoC/Sequencer_Board__Test

「ARM PSoCで作るMyスペシャル・マイコン」にUARTに出力するprintf(書式付き)の関数があったので使わせてもらった。

PSoC 5LP Prototyping Kitでシーケンサー基板単体では無事動作させることができた(^q^/

メモ:
PSoC 4とPSoC 5LPでは使えるコンポーネントがかなり違うので移植作業は結構大変(@@;

2015年10月1日木曜日

シーケンサー基板とI2C LCDのAE-AQM1602Aの同時利用

自作のシーケンサー基板と秋月のI2C LCDのAE-AQM1602Aを同時に使ってみた。

最終的には動作したが、またまた、かなりハマりまくった(^q^;

ブレッドボード図
<修正: 2015.10.25> 配線が間違っていたので図を差し替えました。
</修正>


何にハマったかと言うと、I2Cの信号線のプルアップ用のRの抵抗値だ。

AE-AQM1602Aの場合、整理すると

  • 1kΩでプルアップ
    シーケンサー基板動作OK、AQM1602表示されず(I2C通信エラー)
  • 4.7kΩでプルアップ
    シーケンサー基板動作OK、AQM1602の動作もOKだが、数分後にシーケンサー基板がエラー(I2C通信エラー)
  • 10kΩでプルアップ
    シーケンサー基板動作OK、AQM1602の動作もOK。(1時間程度動作させているがまだ大丈夫そう。)

という結果になった。

オシロで波形を確認 (LCDの初期化コマンド)

1kΩでプルアップ

ch1:SDA ch2:SCL

途中でエラーになって終了しているようだ。

4.7kΩでプルアップ

10kΩでプルアップ

拡大

1kΩでプルアップ

先頭はAE-AQM1602Aのスレーブアドレスのはずなので、0111:1100(0x7c)のはずだが、なんかおかしいなぁ(^q^;

4.7kΩでプルアップ

10kΩでプルアップ

AE-AQM1602Aで動作確認済みのPSoC Creatorのプロジェクト
https://github.com/ryood/PSoC4_sequencer_master/tree/master/Sequencer_Master_AQM1602.cydsn

シーケンサー基板のAtmel Studioのプロジェクト
https://github.com/ryood/RhythmMachine/tree/master/Atmel%20Stduio/Sequencer_I2C_Slave

SPL792-I2C

AE-AQM1602Aではなんとか動かせたが、最初aitendoのSPL792-I2Cでテストしていてなかなか動かなかった。

Rをいろんな値に変えてやってみたが、


  • 4.7kΩでプルアップ 
    シーケンサー基板動作NG(I2C通信エラー)、LCD動作OK
  • 3.3kΩでプルアップ 
    シーケンサー基板動作OK、LCD表示されず(I2C通信エラー)


と、4.7kΩと3.3kΩの間でどちらかが動作しなくなる。

I2Cはかれこれ1年ぐらい格闘しているがいまだに謎が多すぎてよくわからない。

シーケンサー基板のI2Cプルアップ

前回、I2Cの信号線をプルアップしなくても動いたのでもう少し実験してみた。

PSoC 4 Pioneer Kit



シーケンサー基板とPSoC 4 Pioneer Kit プルアップなし

ch1: SDA ch2:SCL

シーケンサー基板とPSoC 4 Pioneer Kit 10kΩのRでVCC(3.3V)にプルアップ

比較するとプルアップしたほうが出力電圧が若干(1目盛り:400mV程度)上がっているが、どちらもI2C通信はうまく行っている。

拡大

シーケンサー基板とPSoC 4 Pioneer Kit プルアップなし

シーケンサー基板とPSoC 4 Pioneer Kit 10kΩのRでVCC(3.3V)にプルアップ

波形も大差ない。

Arduino

PSoCの問題かも?と思いArduinoでもテスト

シーケンサー基板とArduino プルアップなし

シーケンサー基板とArduino 10kΩでプルアップ

Arduinoでも同様。

シーケンサー基板単体

ということはシーケンサー基板のAVRで内部プルアップされてる?と思って単体で3.3V電源を繋いでみた



スレーブなので信号は何も現れないが、信号線がプルアップされていればオープン状態でGNDレベルではなくVCCあたりになるはずだ

あ、いや違うのか?スレーブは待機状態でLに引っ張るのかな?

わけがわからん(^q^;;;


ほんとはもっと簡単な回路でテストするべきだと思うが、I2Cバスのどこか1箇所でプルアップすればいいのでこの件は保留。

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月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月12日土曜日

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

回路図

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

基板図

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

部品をならべた

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

2015年9月9日水曜日

シーケンス入力用のデバイス コーディング完了

一通り単体でテストしてみたので全部まとめてプログラミングしてみた。

https://github.com/ryood/RhythmMachine/blob/master/Atmel%20Stduio/Sequencer_I2C_Slave/Sequencer_I2C_Slave/Sequencer_I2C_Slave.c

ブレッドボード図
※AVRはATMega88Vです。


チャタリング対策


タクトスイッチとロータリーエンコーダーの軸の押し下げのスイッチは、タイマーを使って20m秒後の状態と比較して変化がなければチャタリングではないと判断しているが、時々読みこぼすことがあるみたいなのでオシロで動作状態を見てみた。

スイッチの状態を読み取ったあと、Timer0をオーバー・フロー割り込みさせるモードでワンショットで起動している。
// Timer0を起動
TCCR0B = 0x05; // プリスケーラ-:1024, 1/(8MHz/1024)=128us
TCNT0 = 100; // 128us*(256-100)=19.968ms
TCNT0が255を超えたときオーバー・フロー割り込みがかかるので、TCNT0=0だと
128us * (256 - 0) = 32.768ms
TCNT0 = 255だと
128us * (256 - 255) = 0.128ms
になる。(実際はその他の処理が入るのでもう少し長くなる)

TCNT0 = 0の場合

赤色はLEDの列の一番左、黄色はPD0(タクトスイッチの一番左)

黄色がH->Lの変化する地点から、赤色がL→Hに変化する地点の差を目盛りで読み取ると、だいたい32ms

TCNT0 = 255の場合

同様に差を読み取るとだいたい200us=0.2msだ。

Timer0による遅延は想定通り動いているようだ。

読みこぼしの原因は、コードのその他の部分に何かバグがあるかもしれないし、スイッチ自体の動作不良かも?


I2Cの送信データ



No. Sign Size(bit) Name 説明 備考
1 unsigned 16 SEQUENCE Sequence 1..16 1バイト目のLSBがシーケンス1
2バイト目のLSBがシーケンス9
2 unsigned 8 POT1 Pot1のADC読み取り値 0..255
3 unsigned 8 POT2 Pot2のADC読み取り値 0..255
4 unsigned 8 RE ロータリーエンコーダーの値 0..255
5 unsigned 8 RE_SW ロータリーエンコーダーのSWの押し下げ状態。 0: 開放 1:押し下げ

Masterから送信要求があれば、毎回上記6バイトを送信する。

基板上で入力した値は、基板上で視認できるようにしたつもりだ。(POTはつまみの位置で)


はんだ付けはとても疲れるのでぼちぼち進めたいとおもいます。

割り込みとRTOS


今回ぐらいの規模なら割込みを逐一処理しても大丈夫だったが(と言って、ロータリーエンコーダーの処理はポーリングで行っていますが)、これ以上複雑になってくるとRTOSを使った方が良さそうな気もする。

スイッチの押し下げ状態の割込みにはAVRのPin Change Interruptを使ったが、これもTimer割込みで処理しようとすると割込みルーチンの中の処理がかなり複雑になってくる。

FreeRTOSという無償のRTOSがあって、ちょっと調べた感じではスケジューリングに特化していて軽量コンパクトな作りになっているようだ。

音源の波形生成みたいなタイミングにシビアなシステムには使いにくいが、UIの制御みたいなのにはありかも。もっと複雑なことをしたくなった場合は考えてみようと思います。

2015年8月26日水曜日

シーケンス入力用のデバイス 基板設計とブレッドボードで実験

もう少し考えてみた。

回路図

基板図

部品を並べた

POTを2個追加した。

外部との通信はI2CなのでI2CのLCDを載せることも考えてみたが、ユニバーサル基板では配線がきつそうなのでPOTを2個追加することにした。

ADCの入力に使えるPORTCの空きピン数を増やすために、タクトスイッチの入力用のPINをPORTB、PORTDにまたがって使うことにした。

プログラミングがちょっと煩雑になりそうだが(^q^;

POTの用途はまだちゃんと考えていないがLevelやDecayの調整に使えないかと思っている。

基板図の黄色い配線は基板の表面で配線しようかな?

ツマミを乗せた

いつも使ってるつまみをつけてみたが、なんか大げさな感じがするのでもっと安っぽいやつを仕入れる予定。

Sequencer_IC接続表

接続状態が混乱しそうなので、一応表にまとめてみた。

ATMega88Vの空きピンはPC3の一本だけになってしまった。

PINを大量消費したが、外部との接続には最低I2CのSCL、SDAとGNDの3本で済む。AVRの起動時の挙動(Fuse Bitで指定するらしい)をうまくすれば、RESETは省略できるかも知れない。


ブレッドボードで実験

ArduinoとのI2Cの通信と、LED制御用のシフトレジスタ(74HC595)だけ実験してみた。

なんか色々問題がありそうなのでもう少し実験続行予定。

I2C通信は割り込みで処理するべき?


ファームウェアのソース
https://github.com/ryood/RhythmMachine/blob/master/Atmel%20Stduio/Sequencer_I2C_Slave/Sequencer_I2C_Slave/Sequencer_I2C_Slave.c

前回テストしたI2C Sleveのコードをそのままコピペで使ったが、I2Cの処理でマスターからの送信要求をwhileループでWaitしている
// Wait for TWINT Flag set.
while( !( TWCR & (1<<TWINT) ) );
マスターからの要求が無い限りこのループからは抜け出さない。なので、待ち状態の間はメインループでポーリングで読み取っているタクトスイッチの押し下げを検知できない。

I2C通信を割り込みで処理するか、スイッチ押し下げをTimer割り込みで検知するかしないとダメっぽい。

納期はないので(^q^;両方割り込みで処理できるように実験してみようかな?

ATMegaならFreeRTOSも使えるみたいだが、まずは割り込みで処理することを目標に
→ロータリーエンコーダーとPOTのADCもあるので悩ましい(^q^;

I2C通信の送出

どこまでこの基板上で処理するかも悩ましい。

単なる入力デバイスとして考えると
スイッチの状態[1..8](8bit)|スイッチの状態[9..16](8bit)|POT1のADC値(8bit)|POT2のADC値(8bit)|ロータリーエンコーダーの状態(8bit)
ぐらいかな?ロータリーエンコーダーによるトラックの切り替えは本体で処理しようか?悩ましい(^q^;;;

メモ:
  • スイッチのトグル動作はできたがチャタリング対策はまだ
  • タクトスイッチはTR-808みたいに4個ずつ(1小節ごと)で色分けしたほうが使いやすそう
  • シーケンスの[1..8]、[9..16]切り替え表示用のLEDは縦に並べたほうが良さそう
  • GND、VCCにテスト・ピンを追加
  • パスコンに10uFぐらいのケミコンを追加

2015年8月22日土曜日

シフトレジスタ(74HC595)をAVR(ATMega88V)で使う

LEDの制御をするために74HC595のテストをしてみた。

「chibiegg研究ノート」さんの記事(http://www.chibiegg.net/elec/avr-elec/74hc595_sample.htm)を参考にしました。

ブレッドボード図
↑表記はatmega168になっていますが、実際はATMega88V(http://akizukidenshi.com/catalog/g/gI-03655/)を使用しました。

「chibiegg研究ノート」さんの記事では、ATiny2313を使用されていますが、リズムマシンのシーケンス入力制御用にはATMega88Vを使用する予定なのでPIN配置を変更した。

AVRのソースはほとんどそのままだが、ATMega88VのPIN配置に合わせて
#define SHIFT_PORT PORTB
#define SHIFT_DATA PB1
#define SHIFT_SCK PB2
#define SHIFT_RCK PB3
に変更。DDRも合わせて変更した。
//DDRB = 0b00000111;  //入出力設定
DDRB = 0b00001110;
ATMega88VのFuse Bitはデフォルトのまま
hFuse: 0Fh
lFuse: 62h
eFuse: 01h
基本的には内蔵RCクロック1MHzの動作の設定です。

eFuseの値はavrdudeの読み取り値でこういう値でした。
→ATMega328PではデフォルトでeFuse:0Fhとかだったような気がしますがよく覚えていない(^q^;


動作状態

3.3V駆動で問題なく動作したので、たいしたことない動画だが、youtubeにあげてみた。


動画撮影にはこの間川崎のキャンドゥ(セリアだったかな?)でゴリラポッドみたいな三脚を買ったので使ってみた。


安っすかったけどちゃんと使えたです(^q^/)

SPI

「chibiegg研究ノート」さんのところでAVRのSPIを使う方法も紹介されていたのでやってたが、こちらも動作OK。

SPIのメリットとしてはコードサイズを節約出来て動作が早くなるようだが、AVRのSPI用のPIN(SCK, MISO, MOSI, SSにアサインされているPB2..PB5)が予約されてしまうようで今回の用途では少し使いづらい。(MISOとSSは使わないので)

GPIOを使ったほうがある程度PIN配置の自由が効きそうなのでGPIOを使う方向で考えたいと思う。

ソースコードも多少改変したのでGithubにあげました。
https://github.com/ryood/74HC595_Test

2015年8月21日金曜日

シーケンス入力用のデバイスの構想

コミケに行って何作ってるんだか忘れかけてたが、そうそうリズムマシンを作っている途中だった。

シュミット・インバーターでチャタリング防止するのは実装がしんどすぎそうなのであきらめて、ATMega88Vをコントローラーとして使ってプログラムでチャタリング対策する方向で考えることにした。

回路図

機能的にはスイッチを並べてI2Cに変換すればいいだけの話だが

オムロンのこのスイッチが使いたくてしょうがない


ですので、なんとかスイッチの押し下げとLEDの点灯を連動させたいので、シフト・レジスタの74HC595を使ってAVRのピン数を節約する方向で考えることにした。

基板図(途中)

電源系とタクトスイッチを優先して錫メッキ線を使うことにして配線してみた。

いつも使ってるC基板の倍サイズのB基板で考えてみました。LEDへの信号線はジュンフロン線かポリウレタン製みたいな被覆のあるケーブルで配線する予定。基板の上半分は考え途中です。


部品並べた

基板の下側のタクトスイッチは左から8個をシーケンス入力用、右の1個でシーケンスの1..8、9..16に切り替える用途に使うつもり。

LEDは左8個をシーケンスのON/OFFを表示、右端の青(透明)と赤の2個は1..8、9..16の切り替えの表示用のつもりです。

真ん中左あたりのロータリー・エンコーダーはたぶんトラック切り替え用に使って、軸の押し下げもスイッチとして働くので一応使えるようにしておいた。


シフト・レジスタの使い方の実験をまだしていないので、ATMega88Vのテストも兼ねてやるつもりです。

メモ:

  • AVRではなくてPSoCを使えばデジタル・ブロックでシュミット・インバーターを実装できそうだが、DIP28PのPSoC1でも値段が高過ぎる→実験だけでもしてみるか
  • タクトスイッチではなく、POTとかロータリー・エンコーダーを並べればVelocity(音の大きさ)やDecay(音の長さ)を設定できるかも知れない。実装の手間もコストもかかるけど、ロータリー・エンコーダーの周りをぐるっとLEDで囲ってやればNordっぽいUIが・・・妄想全開(^q^;
  • わりと気楽に考えてたけど、昔あったマイコン・キットのTK-80の弱い(一部強い)バージョンを作ろうとしているのかもしれない。LEDを8セグメントのLEDに置き換えて考えてみるとぞっとします(^q^;;;