2016音源とオーディオの電子工作(予定)ソフト屋がハードにはまっていく軌跡2016年10月31日月曜日mbedのPinDetectをHackしてMCP23S17で使えるようにする。mbedのチャタリング対策用のライブラリのPinDetectのソースをよく見てみると割込みではなくてポーリングで処理していた。中で使っているのはDigitalInなのでこれをMCP23S17経由で読み取れるようにしてみた。MCP23S17のPortB:0だけトグル動作。F401RE(mbed)で使ってみる。その2MCP23S17からの割込みが効かないとプログラミングに制約が出るのでもう少し。前回割り込みが効かなかったのはプログラミングのミスだったと思う。mbedのMCP23S17用のライブラリもhttps://developer.mbed.org/users/stjo2809/code/MCP23S17/に変更して割込みのテストをしてみた。こちらのLibraryはhttps://developer.mbed.org/users/romilly/code/MCP23S17/より低レベルというかレジスタ操作のラッパーという感じだ。Nucreo)をPA_14に割り当て、ResetをPA_13に割り当てた。Resetは別に使わなくてもいい。(追記:2016.11.09)起動時にResetを掛けておかないとMCP23S17がうまく動作しないようです。ch2:mosi拡大2byte目と3byte目の間で一瞬MOSIがLになっている。ch2:miso拡大MISOが無出力のとき、Lレベルがふらふらしているので、Pull-Downしておいた方が良さそう。3.3kΩでPull-down3.3kΩの方が多少きれい。3.3V駆動でロジック・レベルがHの時3.3V/3.3kΩ=1mA消費することになる。Mcp23s17.intcapb();Mcp23s17.gpioa(data);と読み込み、書き込みを連続した状態で測定。(Read:3byte、Write:3byte)誤動作の可能性があるので間にウェイトを入れた方が良さそう。ch2:intbActive-highに設定しているのでPinの状態に変化があった時INTBがHになり、INTCAPBを読み込んだ時Lに戻るのでこれで良さそう。メモ:ベースマシンはNucleo2台使いをやめてI/Oエクスパンダ―でI/Oピンを増やす方向で。細かい実験用にNucleoを1台空けたい。F401RE(mbed)で使ってみる。F401RE(mbed)で使ってみる。https://developer.mbed.org/users/romilly/code/MCP23S17/を使った。配線はArduinoの場合とほぼ同じ。F401REにはSPIが3つあるのでSPI3を使ってみた。}}メモ:ポーリングだとSPI3を使っても動作できたが、割り込みは試してみたがうまく動かせなかった。MCP23S17から割込み信号が出力されない。ポーリングで動作させてもオシロのプローブをSCK/MOSIあたりにあてるとLEDがふんわりと明るくなって点滅する。SPII/OエキスパンダーのMCP23S17をArduinoで使ってみる。Nucleo64を使っても入出力ピンが足りなくなりそうなので、IOエキスパンダーのMCP23S17を仕入れてみた。Arduinoでテスト。「真夜中の工作室」さんの記事と「きむ茶工房ガレージハウス」さんの記事を参考にした。MCP23008/MCP23S08は8bitバージョンで日本語のDATASHEETがあるので、こちらも参考にした。ブレッドボード図のArduinoの10番ピン~13番ピンがずれていたのをご指摘いただいたので修正しました。</追記>GPAとGPBで8bitずつ使うのが簡単そうなので、GPAをLED表示、GPBをタクトスイッチの入力として使った。INTA/INTBという割り込み線が用意されているので、これをArduinoの外部割込みのINT0(D2)につないで、タクトスイッチを押したときに割込みを発生させて、割込み処理ルーチン内でLEDを点灯させるようにした。ソースコードは「真夜中の工作室」さんのものを元にした。ArduinoのSPIライブラリを使っていないので、素のAVRその他にも移植しやすいと思う。{}メモ:SPIの送受信のところが冗長だが、関数にまとめると動作しなくなったので深追いせずにそのままべた書き。mode」とか出てきてややこしい。BANKは8bit版のMCP23008/MCP23S08にはないのでMCP23S17の英文のDATASHEETを読まないとわからない。Addressというのがデバイスごとのアドレス(15Pin~17PinのA0~A2で設定)と、レジスタ・アドレスがあるがBANKやSequencialの説明にあるアドレスは、レジスタ・アドレスのもの。設定で大事なのはIOCONで8bit版とも違っているのでここをいじる時は注意が必要。送受信データという手順で行う。受信の場合はMasterからダミーデータを送信して受信した。I2C版のMCP23017も慣れれば使えそうだが、さらにややこしそうな感じだ。通信速度も速いので線数が許すなら最初はSPI版の方が楽かも。SPI/I2C経由でI/Oを16bit拡張するならATMega328Pやピンコンパチで値段の安いATMega88VをSlaveとして使うという手もある。SPI信号を補強するバス・バッファと8bitの状態表示用のLEDを載せた。SequencerのSPI出力にバッファ(TC74HC541)を入れてみる。SequncerのSPI通信でハマっているが、SequencerからDCO、DCF、DCAをコントロールするのにもSPIを使っている。こちらはMISOはなく、Master->Slaveの一方通行なので多少気が楽だ。以前かんたんにテストしたTC74HC541を使ってバッファリングしてみた(参考:「高速バッファICのTC74HC541の出力波形を見てみる。波形が細かいSCKとMOSIにだけ、ダンピング抵抗を入れてみた。各Slave用のCSやDCAで使っているMCP4922のLDACは波形荒いし配線がめんどくさいので今回は端折った。SPI信号波形バッファからの出力付近(ブレッドボード上)で測定。74HC541(ダンピング抵抗33Ω)メモ:バッファリングの効果絶大。74HC541が強力なのか33Ω程度のダンピング抵抗は入れても入れなくてあまり変わらないようだ。Slave)にリセットをかけるシーケンスを追加。ControllerとSequencerに共通な定義を"BaseMachineCommon.h"として分離。INTメモ:SPIの信号線にダンピング抵抗を入れて波形を整えてみたが、Master側がMOSIMISOを拾わなくなることがある。動作しなくなるとResetをかけてもダメな場合があり、SPIのケーブルを挿し直したりすれば治る。オシロのプローブをあてても確実ではなくなった。MISO(Slave->Master)の動作だけが不安定な様で、これがうまく動かないとシーケンス再生中にLCDに今演奏しているステップが表示できなくなる。この機能を諦めればMISOはなくても良いので現状のままで進めてみる。Slave->Masterへの通信はファームウェア・レベルでまだ色々試せるし、最悪I2Cや自前の信号線を用意することも考えておく。ControllerとSequencerのSPI通信でSequencer(Slave)の近くにダンピング抵抗を入れてみる。Controller(Master)側のシールド上で抵抗を入れたり、コンデンサを入れたりいろいろしてみたが、長時間動作させたりRESETしたりすると通信がうまくいかなくなる場合がある。オシロのプローブを当てるとほとんどの場合動作するので原因特定が難しい。思いつきだが、Sequencer(Slave)の出力ピンの近くにダンピング抵抗を入れてようすをみることにした。メスという風になるように抵抗を加工した。QIピンのオスとメスを抵抗に直に圧着して、熱圧縮チューブで絶縁した。ピンヘッダとピンソケットを1Pinに分割してはんだ付けすれば同じようにできるが、QIピンのメリットはピンヘッダやピンソケット(のプラスチック部分)に比べて細いのでピンが混み合っているところでも挿せる。デメリットは値段が高い。慣れないととうまく圧着できないし、慣れてもたまにミスるので結構な出費になります。QIピンは専用?のカバーが売っているので使ってるが、1Pの場合は熱圧縮チューブでカバーしたほうが扱いやすいと思う。Headerに挿したようすSequencer(Slave)のSPIのMISOとSlave->Masterへの割り込み線にだけダンピング抵抗を入れた。MISO信号波形Master側の入力部分で測定した。220ΩSlave->Master割り込み線ファームウェアを変更してH/Lの間にwait_us(1)を入れてみた。波形の幅が広くなったので適当でよさそう。DCOにショットキーバリアダイオードで電源の逆接続対策をしてみる。ダンピング抵抗はピンソケットを使って差し替えられるようにした。シールドを載せるとNucleoボード上のリセットボタンが押せなくなるので、シールド上にリセットボタンを付けた。Master側からSlaveにリセットをかけられるようにResetボタンとは別にSlaveのReset端子につなぐGPIOを1本割り当てた。Interruptch1:Interupt(ダンピング抵抗のSlave側)ch1:Interupt(ダンピング抵抗のMaster側)メモ:Masterの出力の近くにダンピング抵抗を入れてSCK、MOSI、CSは波形がきれいになったようだ。ControllerとSequencerのSPIの信号線にダンピング抵抗を入れてみる。SPI信号の波形」MISOとInterruptはSlaveからの出力なのでMasterの近くに抵抗を入れてもやはりあまり効果がない。Sequencer(Slave)の近くに抵抗を入れるのは少々難しそうなので、波形なまるのを覚悟のうえでもっと抵抗値をあげてみる?ケーブルを加工してダンピング抵抗を入れてみる?まだときどきSlave->Masterの通信がうまくいかない。オシロスコープのプローブをあてておくと動作することが多い。ノイズや振動の影響で読み取りをミスってるのかなあ??プローブ内のCR類がたまたま、うまい具合に波形を整形してくれているのか。Sequencer間のSPI通信の信頼性をあげる。Sequencer→DCO、DCF、DCAのSPI信号を補強する(こちらも動作があやしい感じのときがある)。現状でもSlaveが3つあるので(CSがインアクティブの時はSlave側はHiZになってると思うが)余裕をもってドライブできるようにバッファICを入れてみる。Sequencerのファームウェアを点検して休符時にブツブツ言うのを修正する。Durationが短いときにブツブツ言うようだ。←めんどくさい(TqT;4x4キーパッドを使ってシーケンスの切り替えができるようにする。やりたいことはいろいろあるが、安定して使えないと楽器として使えないので安定度を上げるのが最優先だ。(19)mbedのPinDetectをHackしてMCP23S17で使えるようにする。F401RE(mbed)で使ってみる。F401RE(mbed)で使ってみる。I/OエキスパンダーのMCP23S17をArduinoで使ってみる。SequencerのSPI出力にバッファ(TC74HC541)を入れてみる。DCOにショットキーバリアダイオードで電源の逆接続対策をしてみる。高速バッファICのTC74HC541の出力波形を見てみる。(コマンド+データの形式でSlaveに送信...Nucleo(mbed)でaitendoの4×4のキーパッドを使ってみる。F401RE(mbed)同士でSPI通信してみる。(その2)Arduino同士でSerial通信(UART)して最大速度を調べる。