2008年12月15日月曜日
Gainer の PGA設定
2008年7月8日火曜日
gainer clone で「かざぐるま」あるいは PWMによるモーターの駆動 (2)
前回のあらすじ
Gainerモジュールにトランジスタアレイでかざぐるまを駆動することに成功したCUE。
しかし、そのモーターからは脳を直撃する怪音が無限に鳴り響く!
すこし時間があいてしまったが、前回の最後で述べたとおり、怪音をなくすためにはPWMの周波数を変更するのがもっとも一般的かつ効果的な手法である。しかしながらgainerの配布されているファームウェアでは、PGAのゲインはコマンドで変更できてもPWMの周波数は変更できない。ということで、「Gainerのファームウェアを改造してノイズが出ないモータを実現するぞ」プロジェクトを決行した
。
当方ではファームウェアの不具合について感知しないのはもちろん、ファームウェアの焼き込みサービスも行ってないのであしからず。秋月電子などから PSOC miniProg を手に入れて各自で焼き込んでもらいたい。どのように作業したかは以下のとおりである。
1. ファームウェアの入手
firmware はgainer.cc のページからダウンロードできる。以下のページからファームウェアのソースファイルをダウンロードする。ダウンロードできたらこれを unzipして展開しておく。
2. ファームウェアの展開
ファームウェアはzipなので適当なツールを使って展開する。このとき置き場所は日本語の入っていないディレクトリでなければ、PSoCデザイナでmakeするときに不具合がでることがあるので注意したほうがよい。僕は C:\ に直接展開したフォルダをそのまま移動した。
3. 設定画面をながめる
書き換えポイントを探るためにコンフィグとソースをよく見て考える。
config_a にPWMモジュールが8つ発見できたので、これが出力用のPWMに違いないとあたりをつける。そのときに、PWMのクロックをどこからもらってるかを配線からながめると16ビットのカウンタを使ってブロードキャストバスに信号を流し込み、そのバスの信号をクロックとして使っているということがわかった。
その後で、ソースコードをかるく読んでみるとまさしく config-a の PWMモジュールの山がそのままPWMとして出力されることがわかる。これでconfig-a のPWMモジュールのクロックを書き換えるという方針が決定した。
4. 使えそうなクロックを探す
使えそうな clockとして Gainerの生の設定でPSoCモジュールが供給しているのは、24MHzの生クロックのほかこれを分周して作っている VC1,2,3 のそれぞれさらに専用のcounterにより作りだされているもともとのPWMの信号がある。それぞれのクロックはどれくらいの周期かというとPWMでは 256クロックで1周期ということなのでCPUCLK 24MHz が およそ 100KHzとなるがこれはすこし早すぎるようだ。
VC1は 24/3 = 8MHz VC2は 8/4 = 2MHz であり、これをさらに 1/256したものが周波数になる。よって VC1でおよそ 32KHz VC2では 8KHz となる。超音波領域に突入することが目標なので、 VC1のほうを採用することとした。
これをそのまま PWMのクロックに入れればいいのだが8つある設定を書き換えるのは大変なので大本となっている PWM用のカウンタであるCounter16に入力することにした。
このままでは counter16のソースが 8MHzとなったはいいがカウンタをつかってさらにスピードを落としているので、それをカウントしている部分を探すこれはソースコードのほうで発見した。
クロックの比は 1:1 なので226行目(あたり)のところの Counter16_A_PWMClk_WritePeriod(0); を 0に書き換える。これで毎回カウントアップのたびにCounterがあふれているはずだ。
実際のところcounter16など使わなくても、直接配線をVC1に変更しまくればそれでもOKなのだが、その場合には書き換えるポイントが8つになってしまうので、間違い等があると大変である。そこで今回はCounterはそのまま使って、そのカウンタの周期を修正したのである。修正ポイントのコードは以下のとおりである。
--ここから
// start analog outputs
// Counter16_A_PWMClk_WritePeriod(157); // 50Hz (i.e. 20ms)
Counter16_A_PWMClk_WritePeriod(0); // 10KHz (i.e. 1ms)
Counter16_A_PWMClk_WriteCompareValue(0);
Counter16_A_PWMClk_Start();
--ここまで
この2つをやってからbuild を行う。今回はHitechC のフリー版つかってmakeを行った。Gainer自体はもともとimage-craftのコンパイラで作られていたはずだが、何の問題もなくコンパイルもおわったのでこれを miniprogを使って書き込んで完成である。
これで動作させればPWMでモータを駆動させても音がならないGainerが完成である。モータが動かなくなるくらい低いPWM値の場合にモータからの異音がしなくなるのがわかるはずだ。
改変した後のHEXファイルはこちらにおいておく。そのままmini-progで焼き込めば動くはずだ。
ラベル: gainer, Processing, PSoC
2008年5月12日月曜日
2008年4月28日月曜日
PSoC書き込み器またまたあらわる


2008年2月28日木曜日
Gainer clone on BreadBoard

基板をつくる前にはブレッドボードである程度試作するのが最近の一般的な?流儀だとおもうが、ブレッドボード遊びに興じてしまったのでそちらの結果を先に。
PSoC を使った製品といえば、 iPod やGameboy microが有名だが、PSoCを使った「作品」となると gainer だろう。gainerはメディアアーティストのためのフィジカルコンピューティングデバイスとして設計されており、 Processing Flash MAX/MSPといった作品作りによく使われる環境に適応するためのライブラリが提供されており、親和性が非常に高い。
このキット オープンソースなHWであるが、焼かれた基板にパーツをつけて8500円という価格で売られている。8500円という値段は、ほとんど手作りに近い状態で作られて会社で売られるにはまっとうな値段だと思うが、ちょっと一瞬遊んでみるには一瞬躊躇する値段かもしれない。
どうせブレッドボードで使うのなら、最初っからパーツをブレッドボード上にくんでしまったら安上がりでは?とおもったので手持ちのパーツを使ってやってみた。回路図を見る限り USB-UARTに PSoCがつながれて、 LEDとSwitchが1つづつオマケにつながっているだけだ。LEDはアクティブハイにドライブされており、SWは内部 pulldownでVCCに直結されている。回路図をみながらとりあえずそのままボード上で再現してみた。
なにも難しいところはないけど、パズルのように配線をおこなって、まあ、これでいいんじゃないか?というところまではたどりついたので晒しておこうとおもう。
モジュールが秋月なのですべて秋月電子でそろえるとして、トータルコストとしては、
AKI-UM232R 950円
CY8C29466 500円
ブレッドボード EIC-102BJ 700円
とまあブレッドボードをいれても2000円強といったところ。
ブレッドボードには余分があるのでこの上に簡単な回路なら足すことはもちろん可能だ。そのためにベースは片側に寄せてくみ上げてある。
互換とするにはさらに電流制限抵抗とLEDとタクトスイッチが必要だが、電子工作をするものならこれくらいはパーツ箱から出てくるであろうということで、コストには加算していない。
これで合計2150円である。PSoCライターがない場合は PSOCのライターであるCY3210-MiniProg1 4000円が必要となるが、この場合にはminiprogにサンプルとして29466がついてくる。
とりあえずサンプルプログラムが動いたので、満足して作品として完成させるのはまた次回ということで。
2007年12月26日水曜日
PSOC miniprog用コネクタ
PSOCをつかった回路をつくるときに、miniprogとの接続をどうしようか?っていうのはちょっとだけ悩ましい。普通の5pinのシングルラインのヘッダピンでも用は足りるけれど差し込みが安定しないし、ぼーっとしていると逆差ししてしまうかもしれない。Cypressが指定している純正の受け側のコネクタが手に入れば良いのだが秋葉原をちょっと回った感じでは難しそう。最近気に入っているのは、molexのこのコネクタ。秋葉原の「ネジの西川」こと西川電子部品の2階のコネクタ売り場で探しているときに見つけたのだが、純正のコネクタとだいぶ近い形をしている。
型番は
- Molex 5045-05A (ストレート)
- Molex 5046-05A (L字)
このままでは右の写真のようにロック部分が長くてMiniprogと干渉してしまうのだが、
2007年12月20日木曜日
PSoC SMP(Switch Mode Pomp)
2007年12月11日火曜日
USB加速度レコーダ(1)

まずは回路図です。今回使ったのはstrawberry-linuxのUSB PSOCモジュールです。チップは24794でUSBのFull-speedに対応しています。
簡単にUSBでシリアルやHIDが作れるこころが特徴です。
加速度センサーは秋月電子の KMX52を使った8pinの3軸加速度センサーモジュールです。たぶん簡単に素人が手にはいる3軸加速度センサーとしては最安値だと思います。
あとは、加速度とは関係ないのですがいつもの温度センサーLM35DZも準備します。
Port0にはアナログ入力の切り替えスイッチがつながっているので、こちらにセンサーを配置します。0,1,2でz,y,x 軸を配置しました。これは 加速度センサーモジュールのピン配置を考えて、ジャンプしない配線を実現するためにZ,Y,Xの順番になっています。
さらに、Port0-3に温度センサをつなぎます。
センサーとしては以上なのですが、動作状況がわかりにくかったのでPort2-7にLEDを配置して、インジケータとして利用します。
電源は、USB-PSoCのモジュールから取り出せますのでそちらを使います。
あとはデカップリング用コンデンサなどは適時配置するとよいでしょう。
最近のお気に入りは 2012サイズのチップコンデンサで、これを裏のランド面にランド間をまたぐように
貼り付けています。
http://akizukidenshi.com/catalog/items2.php?q=%22P-00355%22&s=popularity&p=1&r=&page=
以上でハードウェアの準備が終了です。
追記: 回路図が貼れてなかったので追加しました orz...
2007年12月8日土曜日
マルチチャンネルレコーダー

3軸加速度センサと温度センサからのデータを収集するために、USB PSoCを使ってシリアルからデータが流れてくるシステムを作ってみました。
とくに変わった所はないのですが、サンプリングレートを向上させるためにインクリメンタル型ではなく、sigma-delta 型のADコンバータを使っています。
1ポイント4回サンプリングで4chのデータを 32Hzの割り込みで取り出しています。サンプルレートだけなら、128Hzあたりはとれてもおかしくないんですけど、アナログスイッチの切り替えやシリアル通信があるからなのかできても64Hzでそれ以上はちょっと無理な感じですね。
今日は気力がないので完成品の写真だけですが、また元気なときにプロジェクトともどもアップしていきます。
2007年11月30日金曜日
PSoC温度計を作ってみた(その4)
コードも載せときます。
プロジェクト全部は
こちらから。
//---------------------------------------------------
// C main line
//---------------------------------------------------
#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules
#include <stdlib.h>
#define ADC 4096.0
#define PGAGAIN 4.0
#define VREF 2.6
#define SUM 50
void main()
{
// Insert your main routine code here.
int data , i, j;
float temp ;
char *ostr ;
LCD_1_Init() ;
LCD_1_Position(0,0) ;
LCD_1_PrCString("PSoC Thermometer") ;
M8C_EnableGInt ; // global interrupt enabling macro
PGA_1_SetGain(PGA_1_G4_00) ;
PGA_1_Start(PGA_1_HIGHPOWER) ;
ADCINC_1_Start(ADCINC_1_HIGHPOWER) ;
ADCINC_1_GetSamples(0) ; // read AD convert continuously
for(;;) {
temp = 0 ;
for( i=0; i<SUM; i++) {
while(ADCINC_1_fIsDataAvailable() == 0 ) ;
ADCINC_1_iClearFlagGetData() ;
data = ADCINC_1_iGetData() ;
temp += (data * VREF * 100 ) / ( ADC * PGAGAIN) ; //calculate AD --> temp
}
temp /= SUM ;
ostr = ftoa(temp,&j) ;
ostr[5] = '\0' ;
LCD_1_Position(1,2) ;
LCD_1_PrHexInt(data) ;
LCD_1_Position(1,7) ;
LCD_1_PrString(ostr) ;
}
}
PSoC温度計を作ってみた(その3)
コーディングと動作確認、そして完成へ
プロジェクトファイルをおいておくのでそちらを参照してください。moduleのイニシャライズをしたら、ADコンバータのデータを読み込み計算結果を合計して、平均値を出して表示します。これを繰り返すだけですね。
ADCINC_1_Start() と PGA_1_Start()でパワー指定をするときに、 HIGH以外を選ぶとAD変換や増幅時の直線性に問題が出て、データがおかしくなることがあるので注意。特に LOWPOWERはわかっていない限り選ばないほうがいいです。
書き込んだら通電してみてください。液晶の濃さは半固定抵抗でかえられるので、見やすいように調整してください。僕が最初につくったモジュールは動かない!とおもったらとても薄くなっていただけでした。
あとは、電池駆動するなり、5VのACアダプタを刺せるようにすればそのまま使えます。リファレンスをバンドギャップ電源からとっているので、電源電圧が安定していなくてもかなり正確な温度が出るはずです。
必要パーツがコネクタ類をのぞけば、 液晶表示機と半固定抵抗、温度センサ、PSOCだけというのは面白いとおもいませんか?
まあ、実際にはこの基板は共著のYUO氏からデカップリングコンデンサが足りないという厳しい突っ込みをうけてしまったわけですが、いちおうこのまま作ってもよほどのことがないかぎり動くとは思います。
PSoC温度計を作ってみた(その2)
モジュールと論理配線
今回必要なのは ADコンバータのADCINCと 増幅用のPGA そして LCD液晶のモジュールです。ADCINCは2nd stageを選びました。それぞれ ADC / Amplifier / Misc. Digital のセクションにあります。
これらの配置は以下のとおりです。
- ADCINC DBB00 / ASC10 / ASD20
- PGA ACB00
- LCD Port2

アナログ入力の接続は、P0[7] を PGAの入力にするためにAnalogColumn_Inputmux01 を port0_7に設定し、PGAの入力をAnalogColumn_Inputmux01に設定します。PGAの倍率は4倍としました。
さらに ADCINCのPOSINPUT を ACB00にすることで、 PGAからの出力をAD変換することができます。単電源
なのでNEGINPUTは使いませんが、今回はこちらも ACB00とつないであります。NeginputGAINのところで disconnected を選択しておけば大丈夫です。ADコンバータの設定はformatが unsigned, Resolutionが12bit でクロックを VC2に設定しています。
デジタル側はADCのためのPWMだけなので アナログ側の配線だけ拡大したものを図にしておきます。
グローバルリソースは図のように設定しておいてください。VC2が1MHzなのは時間計算が楽になるからという理由ですが、今回はさほど意味がありません。
2007年11月29日木曜日
PSoC温度計を作ってみた(その1)
PSoCの開発は 物理配線 PSoC内部の論理配線と設定、コーディングとデバッグ という順番で進む。
物理配線
回路図のように P0[7] (1pin) に温度センサのLM35を接続します。もちろん VCC/GNDもひきまわします。
P2[0-6] を PSoCのモジュールの解説画面にしたがってLCDとつなぎます。LCDとのインターフェースは 4bitモードになります。これらのほかに VCC/GNDとコントラストをつなぐ必要があります。これはPSoCでLCDを使うときのデフォルトの設定になりますから1度準備しとくと便利です。
PSoC自体にもVcc/Gndを与えるのをわすれないようにしましょう。PSoCのチップはなぜか同じポートのピンが左右に散らばってるのですこし面倒かもしれません。ピン間を積極的に使うと上手に配線できるらしいですが、あまり深く考えずにラップ線かなにかでひきまわすのがよいでしょう。
余裕があればISSP用のヘッダピンをつくり、なければあとで書き込む方法を妄想しつつ実装します。僕のボードは図のようになっています。これはもともと赤外線通信のデバッグ用ボードなので、赤外線LEDと受光部、秋月で買ったフルカラーLEDなどがマウントされています。
続く
PSoC温度計

手持ちの赤外線解析用の冶具にLM35DZを足して温度計に加工した。たんに家があまりにも寒いのに室温を計る寒暖計が夏の猛暑で壊れてしまったからだ。
PICなどのマイコンで作ると、LM35の 1Vで100度という出力はあまりにも小さくオペアンプを足すのが普通だが、PSoCの場合には内蔵のPGAでそのまま増幅できるので実質温度センサとPSoCだけで完成する。あとはモジュールのLCDドライバで出力すればおしまい。50samplingして平均しているが、室温を見るには十分だ。非常に簡単かつ実用的で、練習再開にはもってこいともいえるかもしれない。
(追記)
どうせなら、作ったものだけじゃなく作り方も書けと怒られたので書いてみた。PSoCは設定項目が多いのでおもったより長くなったので3分割のわりにたいしたことをやっていない。実質の作業は、僕の場合温度センサを足してコードを書いただけなので、1時間もかかっていない。blogかくほうがよっぽど時間がかかっている。
2007年11月28日水曜日
書き込み機の先ふたたび
2007年11月21日水曜日
PSoC書き込み器(の先)


PSoC にminiprogで書き込みをするときには、resetをいれて5本のラインをつなぎこむ。
基板にそのためのヘッダを立てるのをいつもやってきたのだが、
すこしでも基板を簡単にするために、ヘッダをサボって書き込む方法を考えた。
そこで思いついたのがICクリップを使って挟んでやる方法だ。28pinのクリップは高かったので、14pinのクリップに。実際は10pinでよかったらしい。
電源は別途テスト用クリップを伸ばすことで対応した。2520の端子を圧着してソケットに差したものをクリップのピンに差し込んで準備完了。分解できるので失敗しても無駄にならない。
反対側には、ピンヘッダを半田付けし、プログラマにさせるようにしておいた。
想像以上に簡単に作れたわりに、基板の配線が楽になって、いくつも基板同じような基板を作るときには重宝する。もっとも、DIP品でないPSoCの場合には別途やりかたを考える必要がある。
ということで、ジャンパピンがでっぱってケースに入らないことがあるので、
