GND分離と1点アースは絶対にやろうな!!!!
アナログシンセサイザーの進捗が卒論によって完全に止められていましたが、ちょっぴり進捗出たのでその報告がてらGNDの取り回しについて書こうと思います。
まずこちらを見ていただきたい
1枚目:アナログ側の出力をDGNDに戻した時の波形
2枚目:アナログ側の出力をAGNDに戻した時の波形
測定した基板では、デジタル系とアナログ系のGNDは電源の大元の部分で一点GNDになるように配線しています。
なのでアナログ側の電流はAGNDを通って電源に帰って行き、デジタル側の電流はDGNDを通って電源に帰っていきます。
こうすることでデジタル側の電流が電源に帰って行く過程でAGNDを通らずに電源に帰るため、デジタル側のノイズがアナログの信号に混ざらない仕組みです。
マイコンが乗った音源ボードといった類のものを作りたいという人がもしここを見たなら、
GND分離
一点アース
GNDガード
といった内容で調べて見ましょう。
というかしっかりやらないと私の様に基板発注で8000円を溶かして虚無を生み出す羽目になります。
レーザーハープを自作してみた
みなさん、レーザーハープをご存知でしょうか。
平沢進やJeanMichelJarre等がライブの際に演出で使うやつですね。(かっこいい)
シンセサイザー製作と期末試験に追われて息抜きがて作り始めたら思った以上に
作ってみたいと感じている方も多いようなのでここに少しまとめます。
出来上がったのがこれ
暗いところにてPC込みでセットアップ
煙炊くとこんな
送るMIDIデータを手元のコントローラーで管理できます。
また、このコントローラーには3つのモードがあり、
1:弦一つに対して音を一つだけ割り当てるモード
2:弦一つに対して、音程を順番に上げて行くモード
3:弦一つに対して、ベロシティを順に上げて行くモード
があります。
これがコントローラー
ノート信号は3byteで構成されているので、そのデータをこれでいじれます。
モード1は汎用で大体音源があればなんでも使えるタイプですが、時事刻々と音を変化させたりするよりは、演奏において効果音を鳴らすのに使えるモードです
モード2は音程を順に上げて行くモードです。音程が順に上がって行くので一見役に立ちにくいですが、TX16WxといったVSTプラグインなどでは音程ごとに割り当てられるサンプラーなので音を順番に鳴らすことが可能です
モード3はベロシティが上がって行きます。これはFLstudioのDirectewaveというサンプラーで演奏することを前提にしたモードです
DirectwaveはTX16にはない機能として、音程だけでなくベロシティの範囲でもなるサンプルを決められるので、そこでシーケンスデータを組むことで一曲演奏することが可能です。
次に、どう言う原理か
ググれば無限に情報が出てくるのであえてここではコントローラーの方をメインに書くのでレーザー周りは自分で調べましょう。
基本はこれ
レーザー部分はこんな感じ(圧倒的小学生の工作感...!)
レーザーは一本3000円もするけれども貧弱な秋月のグリーンレーザーを使っています。
フレームに固定して、フォトトランジスタの受光部に当ててやるのが基本構成です。
CDSでの制作例が多いですが、フォトトランジスタだと安くて応答速度がよく、プログラムも回路も非常に単純になるので今後作られる方はフォトトランジスタで作るのをオススメします。
左上のGPIOって書いてあるところはコントローラ部分です。
フォトトランジスタがonになると、エミッタの電位が上がって、GPIOの入力がHになります
これを弦の数だけ用意します。私は6本分並べました。
あとは6個の弦の入力がHになったかを検知して、それをシリアル通信で送るだけです。
本当はUSB-MIDIを実装したかったのですが、私にはUSB-MIDIのプログラムが書けなかったのでレガシーMIDIを吐かせています。
使用マイコンはレーザーハープを作るにはハイスペックすぎるSTM32F042K8T6を使用しています。
楽をしたければmbedは良い...かも?
ちなみに毎回調整する問題が発生してしまうこともあるのですが、応答速度が圧倒的に早いのでフォトトランジスタオススメです
ただエミッタの寄生容量もあるのでその辺気をつけて作ると応答が良くなって高速ツーバス叩けるくらいには感度良くなります
ちなみに作るときに部品屋さんでどれ買えばいいですか?と聞くのだけはお勧めしません(というか断られます)
これを見て作りたいと思った馬骨の方。ぜひ自作して良い馬骨ライフを!!!!!!
SPIのピン変化割り込みについて
ガレスタさんがポーリングでSPI通信している記事を見かけました
gsmcustomeffects.hatenablog.com
マイコン同士で通信したい時にポーリングで待ってると大変都合が悪い時などもあるので今回はピン変化割り込みでSPI通信をした件について書きます。
動作の流れとしては
マスター側
タイマー起動
↓
1msごとに割り込んで指定の値を吐く
スレーブ側
HAL_SPI_RxCpltCallback関数を呼び出しておく
↓
NSSピンがローになるとHAL_SPI_RxCpltCallback関数に飛ぶ
↓
HAL_SPI_Receive関数で値を取得
次に設定について
SPI通信する際にスレーブ側のチップセレクトにNSSピンを設定します。
あとはSPIのマスター側とスレーブ側でMSBスタート、ビット数を合わせて通信するだけです。
マスター側(1msごとにADCの値を送る)
スレーブ側(nssがローになると値を取得)
HALlibralyでのSPI_Transmitについて
前にタダで買った(配送料消すために追加した)STM32F469IIを調理しようと思い、
どうせmbed対応のnucleoボードあたりが出てるから楽だろ(ハナホジ)
なんて思いでいたら、なんとですよ。ないんですよ。F469IIのボードが。
せっかくなのでインターネットの先人の方々が公開されてる開発環境の使い方を見ながらSPI通信しようと思ったのですが、意外と手間取ってしまったのでここにまとめます。
ちなみに当方プログラムは大の苦手ゆえにこんなこともわからんのか!という点でコケてましたがご了承ください。
では本題に。
HALLibralyでSPIの送信だけを行いたい場合は
HAL_SPI_Transmit (SPI_HandleTypeDef * hspi, uint8_t * pData, uint16_t Size, uint32_t Timeout);
で送信できますが、この時に指定するのはそれぞれ
hspi→&hspix (xには数字)
uint8_t*pData→(uint8_t*)配列の名前
size→配列の要素数
timeout→タイムアウトの時間
という具合です。
当初はpDataのところには変数を使えると思っていたのですが、海外の記事を読んでいたところ、pDataには配列を指定してやらないといけないっぽく、
int dactemp = 0;
HAL_SPI_Transmit(&hspi2,(uint8_t*)dactemp,1,10);
ではダメで
int dactemp[1] ={0};
HAL_SPI_Transmit(&hspi2,(uint8_t*)dactemp,1,10);
だといけるっぽいので参考までに
MakerFairTokyoに出展したい
8月に開催されたMakerFaireTokyo2017に行ったのですが、あれはいい。
そのとき感じたのが、
僕も出展したい!
てな訳でアナログシンセの音源ボードを出そうかなんて考えていますが、こういうのって一人だととっっっっっっっっっっても大変な気がする...
ブログ始めました
電子工作で色々試しているうちにブログなどにまとめておきたいな。と思ってとりあえず開設。