製作モジュール一覧

ラベル ピュンピュンマシン の投稿を表示しています。 すべての投稿を表示
ラベル ピュンピュンマシン の投稿を表示しています。 すべての投稿を表示

2015年6月9日火曜日

ぴゅんぴゅんコントローラー2号の検討

ジョイスティックのつまみ(?)の部分は引っ張ったら外せた


2センチ角の角穴をあけられればケースの内側から取り付けられそうだ

ケースの素材はポリカーボネートらしいのでまた穴あけの練習するか(^q^;

POT 3個のうち1つぐらいは通信機用のにできるかなと思ったがスペース的にきつそうかな?

実装方法

タクトスイッチの下側の部分とジョイスティックの基板の上面までの高さが大体同じぐらいなので
基板に実装してしまっても大丈夫かもしれない

ユニバーサル基板の上面からタクトスイッチの押す部分の上面までがだいたい8mm

ユニバーサル基板の上面からジョイスティックの基板の上面までがだいたい4mm

なのでケースに取り付けるためのネジは4mm+ユニバーサル基板の厚さ1.5mm+ケースの板厚2mm=7.5mm以上、ケースの内部の高さが15㎜なのでそれ以下

スペーサーは4㎜以上、6㎜以下で5㎜ぐらいがいいのか?

う~ん、スペーサーはなくてもケースに取り付けるねじ止めを慎重にすれば大丈夫かな?


POTの取り付け用に基板をカットするとして、あと2個ぐらいタクトスイッチをつけられそうだ

が、アナログ5本(→これもI2Cを使うとArduinoではアナログ入力のPortAの線数が足りなくなる)

デジタルで6本になるので5+6=11なので手持ちの10線のフラットケーブルでは足りない

アナログ線はGNDと含めてやった方がノイズに強くなりそうなので(よくわかりませんが(@@;

アナログ系列とデジタル系列でラインを分けるような感じでやればいけるかな?

2015年6月6日土曜日

ぴゅんぴゅんコントローラー2号の構想

ずっと前にParallaxのジョイスティック(http://akizukidenshi.com/catalog/g/gM-06807/)を買ったまま触らないでいた

コントローラーは市販のUSBのゲーム用のジョイパッドを流用しようかと思っていたが
プロトコルを調べるのがめんどくさそうなので自作することを考えてみた


2軸なのでPOT2個を置き換えようかなと思っていたが、バネで中央に戻る仕組みなので単純にはいかない

なのでPOT3個はそのままアナログ値の設定用に残して、ジョイスティックは値を揺らす感じで使ったらどうかと思った

MIDIキーボードについているPitch、Modコントローラーみたいな使い方

ケースへの取り付け方法は考えないとだめかな

タクトスイッチもNintenodoっぽく色違いで十字に並べてみた

アナログが5本、デジタルが4本、VCC、GNDで11線

アナログは10kΩのRが5個並列になるので3.3Vで
(3.3V / 10kΩ) * 5 = 1.65mA
5V駆動で
(5V / 10kΩ) * 5 = 2.5mA
パイロットランプのLEDに1mA流すとしても許容範囲かな?

ケース内にマイコン基板を仕込めれば2線、3線のシリアル接続できそうだけど

う~ん(^q^;

2015年1月15日木曜日

ぴゅんぴゅん3号の構想

PSoCで音出しと表示の最低限のことはできそうなので
ぴゅんぴゅん3号(Arduinoのシールド版のVer.2)の外形について
部品を並べて考えてみた



画像の右側は1号、2号だ

こうやって見ると1号の方が怪しげで完成度が高そうに見える
完全ディスクリートだし(^q^;

2号はLCDのおさまりが悪すぎるが性能は高い

左から真ん中の上側のArduino Uno、PSoC 4 Pioneer Kit、NucleoはArduinoとピン互換の3枚

真ん中の下はこないだ購入したPSoC 4 Prototype Kitだ

左下が作る予定のピュンピュン3号シールドの候補

左側がaitendoさんのLCD、右側がストロベリー・リナックスさんのLCDだ
どちらのLCDもI2C接続

音の出力はRCAジャックから

ICソケットはDAC用だ

Arduinoのシールドなので、PSoC 4 PioneerキットでもNucldoでも載せられる

下真ん中のPSoC 4 Protype Kitでもファームウェアを工夫すればそのまま載せられるかもしれない

コントローラーはぴゅんぴゅん2号用に作ったものをそのまま流用するか



USBのホストとして使えればアナログJOYSTICK付のゲーム用のコントローラーも候補に入れている

今のところPSoCでI2CのLCDの表示がうまくいっていない

LCDのコマンドをPSoCのコンポーネントではなくてプログラムで直書きしようかな

DACとの通信用にSPIもやらなければいけないのか・・・

うん、まあなんとかいけそうな気がしてきました(^q^/

<追記>

RCAじゃなくてステレオミニジャックにすればそのままイヤホンつなげられるか

出力用のOPAMP一個ぐらい載せるスペースはありそうだし

出力を直だしできればピュンピュンマシン以外にも流用できるかな?

2014年9月1日月曜日

ぴゅんぴゅん2号のファームウェアを更新した

DDSの位相変調の実験をしていたのでぴゅんぴゅん2号のファームウェアに反映させた

https://github.com/ryood/ArduinoPyunPyun/tree/master/Arduino/PyunPyunNo2

パソコンを新調して
波形を録画するのと同時に録音する方法がわからなくなったので今回は音無しだ


最初に基本のサイン波を出力して周波数をスイープ

サイン波→三角波→ノコギリ波(上昇)→ノコギリ波(下降)→矩形波と
基本波形を変更

LFOの位相変調でまた同じように基本波形を揺らしている


2つほどわからないことがあった

ソースのコメントに書いてあるが、LFOの演算を分周しているところで比較対象が
浮動小数点少数ならちゃんと動くんだが、整数にするとダメっぽい

SAMPLE_CLOCK / LFO_CLOCK

は、#defineの定義にしたがって

5.0

になるので、即値で「5.0」にするとOK

なのに「5」だとアウト

全く動かないわけではなくてブチブチノイズが入る

なんなんだこれは?

シリアル通信とかLCDへの出力はそれなりにwaitがかかるので
Timer割り込み中のprintfデバッグはしにくい

いずれまじめにデバッグすることにする(予定)


もう一つは位相変調の係数だ

前回は変調の値をマイナスにするとNGっぽいと書いたが(http://dad8893.blogspot.jp/2014/07/dds.html)
マイナスにふられてる値でもなんとなく大丈夫そうだ

理屈としては時間をさかのぼることになるが
逆に面白いノイズとなっている気がする

これもちゃんと調べないといかんな



2014年8月26日火曜日

秋月のI2CのLCDを使ってみた

秋月で仕入れたI2Cの液晶の実験をしてみた
http://akizukidenshi.com/catalog/g/gK-06795/

LCDを基板にハンダ付けしないといけないんだが
はじめてのハーフピッチだ

案の定まともにハンダ付けできなかった
ブリッジしまくった(^q^;

なんとか修復しようとこねくり回してたら
元からついてたチップコンデンサのハンダを溶かして外してしまったらしい



回路図を見てみるとデカップリング用のコンデンサなので
なくてももしかしたら動くかもしれない

液晶端子のハンダ付けもあやしいがこれ以上いじくりまわしたくない

もう半分諦めながら(別にI2CのLCDを発注しておいた)とりあえずできるとこまでやろうと思った

でAVRの参考書でI2Cのところを調べてみると
I2Cの仕様はめちゃくちゃ複雑

[アフィ] 参考書とはこれです

SPIと大して変わらないだろうと思ってたのが間違いだった

こんなもん一個一個調べてたら、らちがあかないと思ったので
Arduinoのライブラリのお力を借りることにした

まず<Wire>というライブラリがある。
http://arduino.cc/en/Reference/Wire

I2Cのプロトコルをラッピングしてあるライブラリだ。

Webで「AQM0802」で探したらいろいろとソースを公開くださっているサイトが見つかった。
一番基本ぽかったのはここ

ArduinoでI2C液晶
http://blog.goo.ne.jp/sim00/e/ab138be751d447bcdb0eecaaca232214

秋月の仕様書と見比べて多分多少いじれば大丈夫そうなので
そのままコピペでAruduinoに書き込んだ



GJ(^q^/

秋月の仕様書だと「スレーブアドレスは、0x7Cです。」となってたので修正が必要と思ってたが
<Wire>ライブラリだと最後のbitの0は計算に入れてないみたいなので

0x3e

でOKっぽい

秋月のLCDモジュールも仕様では3.3Vだが、レベル変換がめんどくさいし(一応絶対定格は5.5V)
壊れてもいいので同じようにArduinoの5Vでつっこんだ

シールドに作りこむときはもうちょっと考えないといけないが
とりあえず動いたので良しとする

2014年8月24日日曜日

ぴゅんぴゅん2号 回路図修正

回路図に誤りがあったので修正した。



https://github.com/ryood/ArduinoPyunPyun/tree/master/Eagle

LCDがうまく表示されないのでシールドをチェックしなおしてたら
特にどこも直していないのにちゃんと表示されるようになった



よくわからん

2014年8月22日金曜日

ぴゅんぴゅん2号の修理(行きは良い良い帰りは・・・)

ぴゅんぴゅん2号のLCDが逝ったっぽいので秋月で買ってきた新品と交換することにした

ピンソケットのハンダ付けなんてちょちょいのちょい
・・・と思ったが

オスメス間違えてつけてしまった(^q^;

ほんと外すのはしんどい
こんなもんある程度道具が揃ってないとムリ




精密ドライバとか爪楊枝でしのいだが、またやってしまったら
ソルダーアシストを購入することも考える

↑こういうやつ

金は使わず知恵と勇気で乗り越えるというポリシーなので多分買わないと思うが


で、なんとかメスの方に付け替えられたので試したら
だめっぽかったLCDと同じ状態だ



音は出てるしLCD単体のプログラムを走らせてみてもだめ

なのでシールドの配線のどっかがおかしくなってるはずだ



見た目じゃわからないのでまたそのうちテストし直します(予定)

2014年7月21日月曜日

DDSの位相変調

Mixerの足りない部品が届くまで他のことをやることにした。

DDSの変調の効き具合がどうも弱いので考えた。

もうARMベースで32bit処理しようかと思ったが
まだ粘れそうなのでネチネチがんばった

課題としては

phaseRegister += tuningWord + lfoValue;

ここが負の値になると破綻する。

なので、tuningWordの値を大きくするためにSampling Rateを
Arduinoの割り込み処理でまあまあ現実的な15,625Hzに変更。

また変調の値(=lfoValue)を正負ではなくて
正の値にだけできるだけ大きく振れるように変更した。



https://github.com/ryood/DDSTest.git

https://github.com/ryood/DDSTest/blob/LFO%E3%82%92%E6%AD%A3%E3%81%AE%E5%80%A4%E3%81%AB/DDSTest-LFO/DDSTest-LFO.cpp
(2014.08.31追記)

みごとなクソ波形だ(^q^

もしかしたらコミケまでにピュンピュン2号のファームウェアを更新できるかもしれない

2014年6月15日日曜日

DDSでLFOを検証

とりあえず、Visual Cで検証用のコードを書いてみた





周波数変調と位相変調


VCOにかけるLFOの役目は、LFOの出力電圧でVCOの発振周波数を揺らしてやることだ
これをDDSでまじめにやるとすると

初期処理: 
LFOの発振周波数からTuning Wordを計算(浮動小数点演算) 
ループ: 
LFOのTuning WordをPhase Accumulatorに加算
Phase Accumulatorの値を元にテーブルを参照してLFOの出力値を取得
VCOの発振周波数とLFOの出力値を乗算(浮動小数点演算)
得られた周波数からTuning Wordを計算(浮動小数点演算)
        Phase Accumulatorの値を元にテーブルを参照してVCOの出力値を取得
ループ終わり:

と、演算量が少ないというDDSの利点がまったく生かせない事態になる

周波数変調と位相変調は微積の関係なので、位相変調で処理することにした
具体的にはTunig WordにLFOの出力値を加算している

数学的な検証はめんどくさいのでやってないが、DDSでの変調はこれが普通だと思う


LFOの最低周波数


DDSの出力周波数は

  f_out = ( M / 2 ^ n ) * f_smp
  
で求まる。(M: Tuning Word, n: Phase Accumulatorのビット長, f_smp: サンプリング周波数, f_out: 出力周波数)

( M / 2 ^ n )が0以下の場合の場合発振しない。しかも整数なので、M = 1 として
f_smp = 44100, n = 16, の場合を考えると

  f_out = ( 1 / 2^16 ) * 44100 = 0.673[Hz]
  
となる。 また、この1つ上の周波数は M = 2, 1.346[Hz] となりLFOとしてはよろしくない

なので、LFOのサンプリング周波数は波形生成の整数分の1で処理することにした


今後の予定


LFOの効き方をもっと良くするために係数を調整する必要がある。
が、オーバーフローとかビット数とかの計算がめんどさい

気が向いたらやることにして、基本的なエンジン部分はだいたいこんなもんでいいかと思う


シンセなら次はVCAやEGに手を付けるか迷うとこだが、ピュンピュンマシンなので
音色のキモになるフィルタに手を付けたい。

VCFやデジタルフィルタは理論的なことが難しすぎるので
可変抵抗でパラメータをコントロールするタダのアナログフィルタでも面白いかも

2014年6月3日火曜日

DDSのLookup Tableのbit長

前回はPhase Accumulatorのbit長の検証をした。

考えてみるとLookup Tableのbit長やサイズは8bit,16bit,32bitといった
キリの良い値に制限しなくてもよさそうだ。

値段が手頃なDACはだいたい12bit程度なのでLookup Tableは16bitのうち
12bitを使用することにする。

Arduino UnoのFlash Memoryのサイズは32KBなので



DDSのLookup Tableのサイズ 16bit長で取れる個数
512 31.25
1024 15.625
2048 7.8125

波形は、サイン波、ノコギリ波(上昇)、ノコギリ波(下降)、矩形波、三角波の
最低5種類として1024個ぐらいでよさそう

2Byte * 5 * 1024 = 10KB

PSocやARMでもまあまあこれぐらいが現実的かな?

で、Visual Cで波形を生成して比較してみた。

Accumulator: 16bit, Lookup Table: 8bit * 256

Accumulator: 32bit, Lookup Table: 8bit * 256

Accumulator: 16bit, Lookup Table: 12bit * 1024

Accumulator: 32bit, Lookup Table: 12bit * 1024

THDの値を比較するとAccumulatorを32bitにするよりもLookup Tableを
12bit * 1024に拡張したほうが良さそうだ。


2014年5月27日火曜日

DDSのフェイズアキュムレーターのbit長の検証

ピュンピュン2号はArduinoでDDSで波形を生成している。


↓動画
https://www.youtube.com/watch?v=nUqrsvC5NPo

DDSというのはソフトシンセで言うとWave Table方式のオシレーターの一種だ(と思う)
詳しいことはNational Instrumentsのドキュメントがわかりやすかった
http://www.ni.com/white-paper/5516/ja/

ピュンピュン2号はAVRで作ったシンセを公開してくださってるサイトをいろいろ参考にして
ソースを切り貼りしながら試行錯誤してプログラムを組んだのでかなり行き当たりばったりだ。

先人に習ってDDSのフェイズアキュムレーターは32bitで実装した。

でも16bitと32bitで、どれぐらい違いがあるのか調べてみたくなった。

Arduinoは16bitのCPUで、16bitまでの演算は掛け算も2クロックぐらいで済む。
逆に言うと32bit演算とか浮動小数点演算は極端に重くなる。

Arduinoで組んでもいいんだが、別にリアルタイムでやる必要もないので
普通のCで検証してみた。

32bitアキュムレーター

// DDSTest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <io.h>
#include <fcntl.h>

#define _USE_MATH_DEFINES
#include <math.h>

/*********************************************************
phaseRegister   : 32bit
tunigWord       : 32bit
lookupTable     :  8bit
**********************************************************/

#define SAMPLE_CLOCK 44100 // 44.1kHz
#define TABLE_SIZE    0x100   // Lookup Table Size

uint32_t phaseRegister;
uint32_t tuningWord;
int16_t waveValue;
uint8_t *lookupTable;

double frequency = 440.0;  // 440Hz
int period = 1323000;      // 10s

int _tmain(int argc, _TCHAR* argv[])
{
_setmode(_fileno(stdout), _O_BINARY);

// Lookup Table の作成
lookupTable = (uint8_t*)malloc(TABLE_SIZE);
for (int i = 0; i < TABLE_SIZE; i++) {
lookupTable[i] = (sin(2.0 * M_PI * i / TABLE_SIZE) / 2 + 0.5) * 0xFF;
}
tuningWord = frequency * pow(2.0, 32) / SAMPLE_CLOCK;

phaseRegister = 0x00000000; 
for (int i = 0; i < period; i++) {
int index;

phaseRegister += tuningWord;
index = phaseRegister >> 24;
waveValue = (lookupTable[index] << 8) - 0x8000;

// printf("%d\n", waveValue);

// 16bit長の raw データとして出力
fwrite(&waveValue, sizeof(waveValue), 1, stdout);
}

free(lookupTable);

return 0;
}


16bitアキュムレーター

// DDSTest.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <io.h>
#include <fcntl.h>

#define _USE_MATH_DEFINES
#include <math.h>

/*********************************************************
phaseRegister   : 16bit
tunigWord       : 16bit
lookupTable     :  8bit
**********************************************************/

#define SAMPLE_CLOCK 44100 // 44.1kHz
#define TABLE_SIZE    0x100   // Lookup Table Size

uint16_t phaseRegister;
uint16_t tuningWord;
int16_t waveValue;
uint8_t *lookupTable;

double frequency = 440.0;  // 440Hz
int period = 1323000;       // 30s

int _tmain(int argc, _TCHAR* argv[])
{
_setmode(_fileno(stdout), _O_BINARY);

// Lookup Table の作成
lookupTable = (uint8_t*)malloc(TABLE_SIZE);
for (int i = 0; i < TABLE_SIZE; i++) {
lookupTable[i] = (sin(2.0 * M_PI * i / TABLE_SIZE) / 2 + 0.5) * 0xFF;
}

tuningWord = frequency * pow(2.0, 16) / SAMPLE_CLOCK;

phaseRegister = 0x0000;
for (int i = 0; i < period; i++) {
int index;

phaseRegister += tuningWord;
index = phaseRegister >> 8;
waveValue = (lookupTable[index] << 8) - 0x8000;

//printf("%d\n", waveValue);

// 16bit長の raw データとして出力
fwrite(&waveValue, sizeof(waveValue), 1, stdout);
}

free(lookupTable);

return 0;
}


rawデータで出力して、SOX (http://sox.sourceforge.net/)でwavに変換して
WaveSpectra(http://www.ne.jp/asahi/fa/efu/soft/ws/ws.html)でFFTして比較した。

(16bit)

(32bit)


ほとんど差がない。

静止画ではわからないが、16bitの方は-80dB以下のノイズが振動している。

が、音源としてはどっちでも一緒な気がする。


音源は、正弦波ではなくてめちゃくちゃな波形を出力した時にどういう聞こえ方をするのかが
大事なんである。

ピュンピュン2号のArduinoでは処理速度が追いつかなくなったので
次は32bitのARMベースにしようかと思っていたが
16Bit処理に抑えられればまだまだいける気がします

一応、rawデータのバイナリを直接比較したが2,584KB中61バイト違うだけだった。


2014年5月4日日曜日

NE555でピュンピュン失敗


ノコギリ波のLFOを555で実装するのはなかなか難しい
シミュレーションではうまくいったが
ブレッドボードの試作ではうまくいかない

2Hzぐらいまでは発振してくれたんだがR4,R2の数値を上げていくと
発振しなくなる

0.1HzぐらいまでいかないとLFOとしては役に立たない

あきらめて555のLFOは出せる波形だけにして
VCOの方をノコギリ波も出せるようにするかな

最悪LFOはマイコン出力でもいいし

制御工学はまじめに勉強するとしんどそうなので
NFBやフィルタの設計には
何やら怪しげな伝達関数というものがあって
モデル化するにはとても便利!

という理解で一旦保留します

LTSpiceの使い方は「エレキジャック」のページがわかりやすかった
http://www.eleki-jack.com/KitsandKids2/cat196/ltspice/

いよいよMoogFilterに手をつける

2014年4月26日土曜日

LT Spiceのお勉強 NE555でピュンピュンマシン

後段のVCOもNE555にしてみた
回路的にはすっきりした



C3の干渉を避けるためにオペアンプのボルテージフォロワを入れてみたが
ここはTrのエミッタフォロワでも十分だと思う

バイアスとかめんどくさいのでとりあえず

なんか等価回路みたいなやつで書けばもっとすっきりするんだろうが
よくわからん

酒が回ってきたのでこれ以上難しいことが考えられない

まじめにNE555を使おうと思ってトランジスタ技術の2011年1月号を買おうと
思ってんたんだが

3.11があって買いそびれた

アマゾンをさっき見たらめちゃ高かったので

『定本 発振回路の設計と応用』というやつを買ってたので読みなおした

どんだけひどい波形が出てくるか楽しみである


2014年4月23日水曜日

LTSpiceのお勉強 NE555でLFO

いきなりMoogフィルターのシミュレーションはしんどいので
NE555でLFOのシミュレートしてみた



矩形波とノコギリ波もどきの電圧差を埋めるために
非反転増幅回路を入れてみた

後段にOPAMPのVCOを入れてピュンピュンマシンにする予定なので
カップリングコンデンサを入れて交流成分だけを取り出した

9V電池で駆動することを考えて±4.5Vの電源にしたが
NE555の推奨電圧がMin 4.5Vなので電池がヘタったら確実にやばい

そもそも抵抗の分圧だと無駄な電流が流れすぎる

NE555のGNDを負電源に振れられればいいが

とりあえず電源のことは無視して考える