PSoC5 CY8C5888LTI-LP097 音を奏でる
プロジェクトファイルはこちら
数日、PSoCでなにをしたら良いのか、何に向いているのか色々と試行錯誤
していまして、私なりに思った事
・I2Cにはなんか向いてないなぁ
理由はI2Cって或る一定のコモンセンスが在りますよね
START / STOP / RESTART / ACK / NACK
そういう共通した言葉が使われていない
・LCD、限定的だなぁ
I2CタイプのLCDも使えるには使えるがどっちか言うと
PSoCに合わせたLCDを使う方が全然楽みたいな縛りを感じる
・USBUARTってやってみたいがネット記事が余りにも少なすぎる
やっとみつけてやってみたが動いて呉れない
・かといって今更RS232Cやりたくないなぁ
・或る意味決定的かな、つまり、基板を起こしたときPSoCを実装
する訳だけど量産ならいいよ、だけど試作段階でDIPがPSoC1
しか無いのは決定的に良くない、取り敢えずDIPでバラック組んで
デバッグしてから量産でしょ?最初から手半田が困難って問題
ですよね。
それと、ネット情報という資産を考えたときの指標は矢張りグーグル検索
でのヒット数だ、ちょっと調べてみた
検索文字、PSoC=約 1,940,000 件 (0.41 秒)
検索文字、PIC Microchip=約 10,800,000 件 (0.48 秒)
検索文字、arduino=約 126,000,000 件 (0.34 秒)
検索文字、raspberry pi=約 235,000,000 件 (0.36 秒)
この乖離が在る、だから出て来ないんだなって
PSoCの一番便利だなと思う部分
・レゴブロックみたいに組み立てられる
・アナログ回路モジュールが複数在る PSoC5
不便だと思う部分
・ネット検索してもなかなか問題解決策が見つからない
・秋月電子の販売数の少なさ
・ラズパイ、アーデュイーノとの親和性の無さ
・PICマイコンとの親和性の無さ
・唯我独尊なの?
まぁ、そのくらいにして私がこれだけは使えそうだと思って居る
モジュール WaveDAC 正弦波、ノコギリ波、描画波形、等が
簡単に得られるのは実に魅力的だと感じて居ます、ってんで
グーグル様に頼ってひたすらネットを彷徨いました、当然乍ら
最初は日本語サイト、然し乍らこれが殆ど壊滅状態、何だか
空しくなってきて「俺、何やってんだろ」とやがて哀しくなって
きました、なので次は英語圏、ところがこれも出てくるのは何所
やらのフォーラムサイトばっかりで問題が在って動かないソース
が提示されそれに対してアドバイスがあるものの解決したソース
は提示されていない、や、尻切れトンボの儘、何も得られない
で、中国語サイトもダメ、やっと見つかったのがスペイン語サイト
ここで他力本願発揮100%です、一発で動きました。
回路図は下記の通りですが、率直に感じたことは
何故 WaveDAC8 だけで周波数を変えられないのか
ってことですWaveDAC8専用パラメーターが在るんだからそれを
設定していけば出来るハズ、マニュアルにはこんな文言が在る
void WaveDAC8_Wave1Setup(uint8 *WavePtr, uint16 SampleSize)
Description:
Selects a new waveform array for the waveform 1 output. The WaveDAC8_Stop function should be called prior to calling this function and WaveDAC8_Start should be called to restart waveform.
Parameters:
uint8 *WavePtr: Pointer to array containing waveform data
uint16 SampleSize: Size of waveform array pointed to by WavePtr. (Maximum sample size is 4000, minimum is 4)
Return Value:
None
Side Effects:
Does not affect WaveDAC8 type or power settings
Description:
Selects a new waveform array for the waveform 1 output. The WaveDAC8_Stop function should be called prior to calling this function and WaveDAC8_Start should be called to restart waveform.
Parameters:
uint8 *WavePtr: Pointer to array containing waveform data
uint16 SampleSize: Size of waveform array pointed to by WavePtr. (Maximum sample size is 4000, minimum is 4)
Return Value:
None
Side Effects:
Does not affect WaveDAC8 type or power settings
これらを駆使すれば自由にプログラミングできるはず、最初にそう考えた
からネット中探しまくったのにそれらしき記事が全く出て来ないのは何故?
って思って居たところ冒頭のスペイン語サイトを見つけたって経緯です
回路は外部クロックを選択することでWaveDAC8の周波数を変化させて居ます
ってことは音源と成る周波数毎にクロックを造らなければならないこれって
良いの? 無駄なリソース浪費ではないの? まぁ良いけどね
クロックの周波数
↓
WaveDACのパラメーター
↓
Muxのパラメーター
↓
Controlのパラメーター
↓
Pin配列
↓
スペイン語サイトの鍵盤です
これメッチャ勉強に成ります、有り難う御座いました
↓
動画です、何所の国のなんて言う曲か全く判りません
なんか哀愁が漂う曲です
ソースファイル
/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "project.h" int main() { CyGlobalIntEnable; Wave_Start(); float negra; negra=700; Wave_Enable(); Control_Write(0); CyDelay(negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(1); CyDelay(negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(2); CyDelay(negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(3); CyDelay(negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(4); CyDelay(negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(5); CyDelay(negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(6); CyDelay(negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(7); CyDelay(negra); Wave_Stop(); CyDelay(1000); for(;;) { Wave_Enable(); Control_Write(7); CyDelay(negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(4); CyDelay(1.75*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(0); CyDelay(.25*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(0); CyDelay(.25*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(1); CyDelay(.25*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(2); CyDelay(.25*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(3); CyDelay(.25*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(4); CyDelay(2.5*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(4); CyDelay(.5*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(4); CyDelay(negra/3); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(5); CyDelay(negra/3); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(6); CyDelay(negra/3); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(7); CyDelay((2+1/3)*negra); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(7); CyDelay(negra/3); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(7); CyDelay(negra/3); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(6); CyDelay(negra/3); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(5); CyDelay(negra/3); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(6); CyDelay(negra*.75); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(5); CyDelay(negra*.25); Wave_Stop(); CyDelay(10); Wave_Enable(); Control_Write(4); CyDelay(negra*2); Wave_Stop(); CyDelay(1000); } } /* [] END OF FILE */
PSoC5 CY8C5888LTI-LP097 VGA_inv を使う(オペアンプ・ゲイン可変)
PSoCのOPamp絡みのモジュール PGA_inv です
これは可変ゲインを持って居るのですが逆位相で出力します
x1 / x3 / x7 / x15 / x22 / x24 / x31 / x47 / x49 がプログラムで
選べますがなんとも中途半端な倍率ですこと、例えば何で x10 / x20
が無いんでしょうねぇ。
取り敢えず回路図を提示します
WaveDAC8_2 が正弦波発振モジュール
VDAC8_1 と VDAC8_2 が DCバイアス、Vref です
PGA_Inv_1 が反転増幅器
PGA_1 が正転増幅器
↓
WaveDAC8_2 正弦波発振モジュールのパラメーター
↓VDAC8_1 、Vref のパラメーター
↓VDAC8_2 DCバイアス、Vref のパラメーター
↓
PGA_1 正転増幅器のパラメーター
↓
PGA_Inv_1 反転増幅器のパラメーター
Pin 配列
↓
main.c
それぞれのモジュールを起動し
倍率を変化させ、1秒キープ
四種類の増幅率をそれぞれ1秒キープ
Loopで繰り返しという単純な動作です
こんな使い方は無いでしょう、単なる実験です
で、思ったんですが、と言うか、ダメだこりゃって思った事です
VDAC8 からDCが出て来ます、これ、あちこちに繋ぐとレベル変動が
激しくて使い物に成りません、信号でフラれまくりです
なんて言うか・・・テーブルタップに色んな機器を配線して電源
とったらどんどん電圧が落ちて使えなく成る感じです
なので一つのOPampに一つのVDAC8が必要です、要は根性無しです
それと電源5Vですからレール・トゥ・レールって謳ってますが
たった5Vですよ?然かもマイナスには絶対振れません、絶対に
もっと言うと基準が0Vでしょ?だから増幅するとDC成分も重畳して仕舞い
必要な交流成分がサチッて仕舞うんです、なのでCカットとか外部で
やってチマチマと狭いスパンで基準を気にしながら回路を組む
組まざるを得ない、こんなのやってられない、ってのが正直な
感想です、だからこのOPampモジュールは使途は本当に限定的だな
って感じます。
ソースファイル
/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "project.h" int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ WaveDAC8_2_Start(); VDAC8_1_Start(); VDAC8_2_Start(); PGA_1_Start(); PGA_Inv_1_Start(); /* Place your initialization/startup code here (e.g. MyInst_Start()) */ for(;;) { /* Place your application code here. */ PGA_1_SetGain(PGA_1_GAIN_01); PGA_Inv_1_SetGain(PGA_Inv_1_GAIN_01); CyDelay(1000); PGA_1_SetGain(PGA_1_GAIN_02); PGA_Inv_1_SetGain(PGA_Inv_1_GAIN_03); CyDelay(1000); PGA_1_SetGain(PGA_1_GAIN_04); PGA_Inv_1_SetGain(PGA_Inv_1_GAIN_07); CyDelay(1000); PGA_1_SetGain(PGA_1_GAIN_08); PGA_Inv_1_SetGain(PGA_Inv_1_GAIN_15); CyDelay(1000); } } /* [] END OF FILE */
動画です
黄色が発振回路の源波形
青がAGP正転増幅器
紫がAGP_Inv反転増幅器
PSoC5 CY8C5888LTI-LP097 VGAを使う(オペアンプ・ゲイン可変)
PSoCの特徴的なモジュールに OPamp が在りますが、これ
或る程度の制限付きでゲインが変えられます
VGA (Variable Gain Amp)モジュールです
但し正転アンプです
x1 / x2 / x4 / x8 / x16 / x24 / x48 つまり33dBぐらいまで増幅が
プログラミングで可能って事です
逆に逆転アンプも在りますがゲインが異なるので要注意です
なんでやねんと言いたいですね
VGA_inv というモジュールです、こちらは
x1 / x3 / x7 / x15 / x22 / x24 / x31 / x47 / x49 の逆位相です
統一性が無いですねぇ・・・まぁ仕方無い・・・・。
動画は x1 / x2 / x4 を繰り返すだけの単純動作です
上、黄色が入力波形
下、青色が出力波形
↓但し、プログラミングしてて無駄な一日を過ごして仕舞ったので
この記事をご覧の方は、嘲ってやって下さい、何が無駄だったのか
ですが、オペアンプの出力です、これが適切に選択されていないと
ドツボに嵌まります。
動画の詳細は以下のように成ります、これなら動きます
回路図、抵抗は外付けでコンパイルには無関係です、メモ程度と
お考え下さい
↓
WavwDAC8_2 パラメーター
↓
VDAC8_1 パラメーター
↓
PGA_1 パラメーター
↓
main.c
モジュールを起動 → ゲインを変化させる → Loop
こんな簡単なプログラムなんですが
こうすると動きません
Pin_1 をご覧下さい 15[4] と書かれていますよね
なんでこの Pin を選んだかですが、作図していて pin 配置の画面に
切り替えるとご親切に自動的に pinが選ばれるのです
「ああーー便利だなぁ♪ 流石サイプレス社だ、ふんふんふーーん♪」ヽ(´ー`)ノ
なんて調子に乗ってやっていた訳ですよそしたらとんでもない
なにやっても出力が出て来ないんです、ちゃんと Analog out pin
をドラッグ・アンド・ペーストしたにも関わらずです
恐らくと言うか間違いなく英文マニュアルを読めばどの pin を
使うべきなのか書いて有るハズです、こういうバカをするから
ど素人なんですよね、あーあ、無駄な時間を過ごした。
ソースファイル
/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "project.h" int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ WaveDAC8_2_Start(); VDAC8_1_Start(); PGA_1_Start(); //PGA_Inv_2_Start(); /* Place your initialization/startup code here (e.g. MyInst_Start()) */ for(;;) { /* Place your application code here. */ PGA_1_SetGain(PGA_1_GAIN_01); CyDelay(1000); PGA_1_SetGain(PGA_1_GAIN_02); CyDelay(1000); PGA_1_SetGain(PGA_1_GAIN_04); CyDelay(1000); } } /* [] END OF FILE */
PSoC5 CY8C5888LTI-LP097 OPamp (オペアンプ)
PSoCの大きな特徴の一つとしてOPamp (オペアンプ)モジュール
が在ります、どの程度可能なのか大きな期待を寄せていた私が
バカでした、抵抗だのコンデンサだのは外付けしなければなりません
複雑なオペアンプ回路をプログラムで組むことは出来ませんので
逆にソフトウェアで何所まで代替出来るのかという発想の転換が
必要になってきます、それはそれ後にします。
取り敢えず内部正弦波発振回路とDACとオペアンプを使って
正弦波をパルスにする実験をしてみました、要はオペアンプを
コンパレーターとして使い閾値をDACで制御すれば出力はパルスに
成りますよね、その実験です、あんまり意味無いです。
取り敢えず回路図
WaveDAC8_1 が正弦波発振器です Pin2-0に出力してモニタします
VDAC8_1 がDACで閾値を決めています
オペアンプをコンパレーターとして動かして出力は Pin3-6です
Pin配置
WaveDAC8_1 のパラメーター
VDAC8_1のパラメーター
オペアンプのパラメーター
main.c の抜粋
WaveDAC8_1_Start();
VDAC8_1_Start();
Opamp_1_Start();
VDAC8_1_Start();
Opamp_1_Start();
これ起動させないと当然ですが動かない回路図書いて安心して居るとダメ
それぞれ起動しただけ for ループ内は何も無し
出力波形
ちゃんとコンパレーターが働いて居ます
一見してきれいですよね、だけど私は信用していません
拡大してみました
*** 雑感 ***
まぁこんなもんですよ
発振器はDACに決まってますからどうしてもギザギザ波形です
良く考えてみるとアナログ回路がデジタル回路に埋め込まれている
訳ですから周囲からのインターフェアは無い筈が無い、例えれば
メモリープレーヤーにAMラジオが付いていても音が濁っているのは
デジタルノイズが入ってくるからで、それと同じことがPSoCについても
言えると言うことですよね、「いやいや動けばそれでいいんだから」
そういう用途には向いています、が、極小電圧、電流を扱う回路には
使えませんノイズレベルで-120dBmぐらいなら良いんですけどね
期待するのが間違っています。
それと笑われそうですが・・・・
・回路図を書きました
・パラメーターを設定しました
・Pin配置を決めました
で
・main.c に対してプログラミングを開始しました
あれ? なんか変だぞ?・・・・
Op って書き始めると候補が次々と出てくるハズなのに何も出て来ない
Opamp****とかオートフィルが出てくるのに、なんでかなぁ、まぁいいや
と書き始めてスペルをチェックしてOK、なのに左側に赤いエラーマーク
が出てくる、なんで?
原因は
回路図書いたら一度その画面でコンパイルしなければならないんですね
それを行わなかった為にエラーマークが出ていた訳です
・回路図書いてコンパイル
・main.c 書いてコンパイル
これで動きました、という初歩的なミス、ちゃんと勉強しないで
行き成り使い始めるとこうなるのですね。
PSoC5 CY8C5888LTI-LP097 Lチカ PWM
PSoC第二弾 LチカでPWMです
ビジュアルで簡単にPWM出力が得られるんですね、流石PSoCです
これをPICマイコンでやろうとすると、然かもアセンブラだと
結構面倒です、出力ピンも限定されているし。
簡単にプログラミング出来たのですが、なんと動かなかったんです
プログラムは単純だしスペルの間違いも書いて居ると色々辞書候補
の様に出てくるから大文字小文字も間違う事はあんまりなさそうですが
出力設定がダメで出力しませんでした。
HW connection のチェックボックスです。
外国人のYouTube視てて判りました。
HW connection は Hard Ware Connection の意味なんですね
ここにチェックボックスを入れないと出て来なかったこれで随分
時間を無駄にしました。
PWM設定はほぼデフォルトで動きますが Clock だけ周波数を
変えましたデフォルトでは12MHzでしたが10KHzに下げました。
未だ未だ沢山のモジュールが在るのでこれは相当奥が深いのですね
いやぁ、無理、出来そうにないなぁ・・・。
ソースファイル
/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "project.h" int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ uint8 i; PWM_Start(); for(;;) { /* Place your application code here. */ i--; CyDelay(5); PWM_WriteCompare1(i); } } /* [] END OF FILE */ //*HW connectionは、チップ内の回路接続用の端子のこと PWM ではチェックボックスを入れないと出て来ない、これで引っかかった。*/
やっていて思ったんですが基板にはUSBコネクターが大小二つ付いていますが
小さい方はただの電源だけなんですね。
PSoC5 CY8C5888LTI-LP097 Lチカ PWM
PSoC第二弾 LチカでPWMです
ビジュアルで簡単にPWM出力が得られるんですね、流石PSoCです
これをPICマイコンでやろうとすると、然かもアセンブラだと
結構面倒です、出力ピンも限定されているし。
簡単にプログラミング出来たのですが、なんと動かなかったんです
プログラムは単純だしスペルの間違いも書いて居ると色々辞書候補
の様に出てくるから大文字小文字も間違う事はあんまりなさそうですが
出力設定がダメで出力しませんでした。
HW connection のチェックボックスです。
外国人のYouTube視てて判りました。
HW connection は Hard Ware Connection の意味なんですね
ここにチェックボックスを入れないと出て来なかったこれで随分
時間を無駄にしました。
PWM設定はほぼデフォルトで動きますが Clock だけ周波数を
変えましたデフォルトでは12MHzでしたが10KHzに下げました。
未だ未だ沢山のモジュールが在るのでこれは相当奥が深いのですね
いやぁ、無理、出来そうにないなぁ・・・。
ソースファイル
/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "project.h" int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ uint8 i; PWM_Start(); for(;;) { /* Place your application code here. */ i--; CyDelay(5); PWM_WriteCompare1(i); } } /* [] END OF FILE */ //*HW connectionは、チップ内の回路接続用の端子のこと PWM ではチェックボックスを入れないと出て来ない、これで引っかかった。*/
やっていて思ったんですが基板にはUSBコネクターが大小二つ付いていますが
小さい方はただの電源だけなんですね。
PSoC5 CY8C5888LTI-LP097 Lチカ
数年前に秋月電子から購入したスターターキット
Cypress Smiconductor CY8CKIT-059 PSoC 5LP Prototyping Kit
部品箱の肥やしに成って居たのを見つけていじってみました
先ずは定番の Lチカ です。
電源はDC5Vで、USBから給電出来るので便利、且つ
PICマイコンの様に書き込みツールのPICKIT3とか不要です
取り敢えずネットから PSoC Creator\4.2 をダウンロード
但しID登録が必要なのがちょっと面倒くさいです
それと一度インストールすると日々アップデートのダイアログ
が出て来て結構鬱陶しいもので、アンインストールしてしまって
更にPSoCから遠のいていました
最初にインストールしてプログラミングしようとして戸惑ったのは
CPUが見つからない、というか何所を探せば出てくるのよ!!
って少し イラッ としたのですがちゃんと用意されていました
↓
で、ポートを一個何所でも良いので出力に設定するために
ドラッグ・アンド・ペースト、こんな感じでナンカ間抜けです
これで動くのかよ、って感じですよね、でも動きました
プログラムは main.c ってファイルで行います
ソースファイルです、恐ろしく単純で恥ずかしいです。
/* ======================================== * * Copyright YOUR COMPANY, THE YEAR * All Rights Reserved * UNPUBLISHED, LICENSED SOFTWARE. * * CONFIDENTIAL AND PROPRIETARY INFORMATION * WHICH IS THE PROPERTY OF your company. * * ======================================== */ #include "project.h" int main(void) { CyGlobalIntEnable; /* Enable global interrupts. */ /* Place your initialization/startup code here (e.g. MyInst_Start()) */ for(;;) { Pin_1_Write(1); CyDelay(222); //wait Pin_1_Write(0); CyDelay(222); //wait /* Place your application code here. */ } } /* [] END OF FILE */
Pin_1_Write(1); これが出力Hight
CyDelay(222); これがタイマー(ms)
Pin_1_Write(0); これが出力Low
さて、ここまでは簡単ですが問題はここから先、何をやってみようか・・・。
Pin_1_Write(0); これが出力Low
さて、ここまでは簡単ですが問題はここから先、何をやってみようか・・・。