PSoC3 FirstTouch STARTER KITでテルミン

とある案件で試用させてもらえることになったのでこっそりと遊ぶモード。

PSoCって

PSoCはデジタル・アナログ両方のハード部分をFPGAのようにプログラムできるマイコンです。
固定的な周辺機能、というものをすべて取り去ってしまい、全部プログラマブルにしてしまっているという画期的な製品。IDE上でCの関数としてAPIを生成できてしまうので、周辺ブロックアドレスマップ、という概念が半ば消失しています。分厚いハードウェアマニュアルのどこに書いてあるのか不明な長大メモリマップとにらめっこする時代は終焉、、、おーすげー

CPUは・・・

PSoC1 はCypress独自仕様の8bit CPU、 3は8051が入っています。最新のPSoC5は流行に流されてARM Cortex-M3が入っているので32-bitフル活用可能です。
今回貸してもらったのは 8051の PSoC3

なにかしてみる

「売れる製品とは、優れた製品ではなく、判りやすい製品である」という某格言では無いですが、ご多分にもれずこのPSoCも上記のような画期的アーキテクチャ以上に、当初から静電容量センサでの応用、という部分を強力に売り込んで出てヒット!という背景があるようです。そのためかこの辺りのサポートがスゴく、簡単に静電容量センサでいくつかの応用を(特にアナログの詳細な知識無しに)構成できるようになっています。サンプルにも静電タッチセンサや、近接センサなどの例が入っていて判りやすい。
お、この近接センサ使って適当にブザーをいじったらテルミンになるんでないですか、ということでやってみました。

作成風景

ブザーは壊れた腕時計から剥がして直接ハンダ付け。それをホットボンドで固めたものを使いました。

で、取り付けて、試してみるフェーズです。何事も勉強なのでアナログでやろうかとも思ったのですが、どうせこんなオマケブザーでは知れてるし、早く動かしてみたかったので手抜きのデジタル矩形波駆動。さらに、CPUで直接いじればイーや、ぐらいの軽い気持ちで、直接レジスタを外に出してみました(安直)。プログラマブルブロックの設計はこんな感じにGUIで絵を書いてやると

自動的に

/***************************************
*         Function Prototypes 
***************************************/    

void    Control_Reg_1_Write(uint8 control) ;
uint8   Control_Reg_1_Read(void) ;

のようなコードを生成してくれます。なのであとはメインルーチンにて

   while (1) {
        v = 1-v;
	Control_Reg_1_Write(v);
    busy_wait(freq);
       :
   }

のように呼び出すだけ。すごい。
とりあえず周波数をあげていってレーザーガンのような音を出す、をやってみました。これは大成功。

じつはPSoCでは、回路をセッティングするのもマイコンのソフトウェアの仕事です。つまり、書き込みを行ったときに書き込まれるのはプログラムのみで、回路コンフィグは毎回ブートルーチンが行います。これによって書き込み動作はソフトウェアの書き込みのみ提供すれば良く、しかもダイナミックに回路をかえるのも簡単、という上手い設計。

これはうまく行ったのでそれに気を良くしてそのまま進行。

で、お約束の

ハマる

近接センサーは確保したスロットに割り込みで入れてもらう設計になっていて、このルーチンを呼び出すだけでも結構なオーバーヘッドがあります。おかげで「ぶつんぶつん・・・ぶつん・・・」といった感じの超重低音(違う)になってしまう。やはりハードでやんなきゃなのか。残念。

とりあえず反射的に

という勘違いPWM回路を構成してしまってから、「あ、アホかおいらは」と反省して

カウンタあふれ駆動に直しました。これでperiodをいじれば特定周波数が出続けるという方式。周波数が指数出力になってしまうのでちとlog補正がいりますね。γ=1.7くらいにしてみました。

というわけで

完成したのが以下のような感じ。

結論

でけたーです。 しかしPSoCは概念が大変ソフトウェアよりのなのにアナログ中心でおもそろいですね。