Author: akita

  • 誰もコメントくれんのう・・・ -- akita 2008-05-19 (月) 21:43:15
  • あわわ…。ダメ出しで申し訳ないのですが、PWM8_1の設定のClock_Syncを、Sync to SysClk?に変えることを明記したほうがわかりやすいと思います。デフォルトのUse SysClk? DirectではClockの設定に関わらず24MHzが出ると自主課題のときの覚え書きにありました。今回の動作には直接関係ないような気がしますが。 -- senda 2008-05-19 (月) 22:51:34
  • まだ使ったことがないので、CapSense?編を是非。 -- まつむら? 2008-05-20 (火) 01:43:00
  • コメントありがとうございます。Clock_Syncの話は書いておきました。CapSense?は、明日書きました(時制がおかしな未来日記) -- akita 2008-05-20 (火) 21:42:40
  • Tutorialやってみましたが、光強度が変わりませんorz このチュートリアルで初心者が間違えそうなところって何処ですか -- kanou 2008-05-21 (水) 07:36:17
  • あ、Programmer再起動したら出来ました。お騒がせしました。 -- kanou 2008-05-21 (水) 08:06:21
  • とりあえず、だーっと要点だけ書いてみました。実践してみて、細かい補足を書いてくれる人、募集。 -- akita 2008-05-22 (木) 21:33:24
  • ページが長くなりすぎました。サブページに分けるには、どうやればいいんでしょう・・・? -- akita 2008-05-22 (木) 21:33:49
  • 秋田先生、ありがとうございます。サブページですが、別ページにするか、もしくは、PSoC入門:PSoC First Touch編/別ページ名?./別ページ名?)とする方法があります。ただ、ページ名が結構長くなってしまうというデメリットもありますが。。 -- kondo 2008-05-26 (月) 13:27:46
  • ページの整形をしてくれる人、募集・・・ -- akita 2008-05-26 (月) 21:09:13
  • ↑やりますよ♪どういう風に分けましょうか?例題まではこのページに合った方がいいような気もしますね。 -- kondo 2008-05-27 (火) 08:20:58
  • 配線をして、その後解除すると配線が消えません。消す方法を教えてください。 -- note? 2008-05-27 (火) 18:07:12
  • Device Editorで右クリックして、Refreshすると消えます。 -- kanou 2008-05-27 (火) 18:09:16
  • はじめまして。詰まった点は2点。1:モジュール接続の際、左クリックの前に赤い文字重要。 2:コンパイル時のundefinedなどとなるときはスペル再チェック。liteでも同じ。 3:VC3のソースはVC1と同じ。 以上でとりいそぎ1は動きました。赤くするなどはまた別途チャレンジしてみます。改めてすごいと思いますわ。これ。 -- もー? 2008-06-02 (月) 03:45:59
  • ↑すんません、詰まった点は3点です。 -- もー? 2008-06-02 (月) 03:46:34
  • VCP Drivers ですが、v5.40.24は挙動が怪しいです。研究室の人は、ストレージに入っている(古いバージョンだけど安定)ものを使うといいかも -- komatsubara 2009-11-17 (火) 00:13:06
  • ↑そういう問題でしたか・・・ -- akita 2009-11-17 (火) 17:25:52

もくじ

PSoCとはナニモノ?

語弊があるかもしれませんが、「周辺I/Oデバイスを自由に設定できるマイコン」です。PSoCの概要は、この分野の日本での第一人者(?)、桑野さんの解説が参考になるでしょう。
http://www.kumikomi.net/article/report/2007/27ftouch/01.html

このPSoCを、とりあえずさわってみたいよ、という向きにおすすめなのが、PSoC First Touchです↓

package.jpg

こいつの中身は、2つ↓

ft1.jpg

書き込み機(左)と、PSoCがのった小基板(右)。PCのUSBポートに書き込み機をつなぎ、小基板上のPSoCに、自分で作ったプログラムを書き込めます。小基板には、LED、明るさセンサ、ブザーなどがついていて、PSoCからつつけます。半田付けして基板を作らなくても、とりあえず遊べるのがお手軽ですね。

ft2.jpg

書き込み時は、↑こんなふうにドッキングして使います。

ftmt.png

小基板に載っているものは、↑こんな感じ。

(技術情報)
LEDや各センサなどは、それぞれPSoCの次のようなピンにつながっています。

P0.0Thermister
P0.1&P3.1CSD feedback
P0.6Light sensor
P1.2LED(B)
P1.3LED(R)
P1.4LED(G)
P1.6Buzzer
P2.0CapSense? wire
P2.1〜7CapSense? slider

例えばP0.1は、ポート0の1番、のピンを表しています。

開発ソフトウエアの導入

まずはPSoCで遊ぶためのコンパイラなどの開発ソフトウエアを導入しておきましょう。以下のものを導入しておきます。

※(2008/10/15追記:PSoC Designerがv5.0にバージョンアップしました。多少画面が変わっていますが、基本的には同じなので、適宜読み替えながら進めてください。

  • PSoC Designer http://www.cypress.com/?rID=34517
  • PSoC Programmer http://www.cypress.com/?rID=2581
    なおMeRLのみなさんは、ファイルサーバ(Storage)の \\Storage\merl\Softwares\merl に、おいてありますので、使ってください。ついでに、PSoC First Touchの付属CDに入っているマニュアルというかドキュメント(First Touch Guide.pdf)も、必要であれば参照します。(最初はいらないかな・・・)
    • PSoC Designer v5をインストールするときは、先にPSoC Programmer v3をインストールする必要があります。

各ソフトウエアのインストールのうち、PSoC Programmerのインストール時には、デバイスドライバのインストール ウイザードが立ち上がりますので、とりあえず、すべて「はい」「次へ」を選んでおきます。

※PSoC Designerのインストールの後半で、コンパイラ(HITECH-C)のインストールがありますので、Cancelしないように注意。

※PSoC Designer5.0以上のバージョンを使う場合はCコンパイラが内部に付いているので、以下の内容を無視してください。

また、PSoCで末永く遊ぶためには、Cコンパイラが欠かせません。ただし、これは売り物です。MeRLのみなさんは、ライセンスがありますので、秋田へ相談してください。
→フリーのLite版があるようです。(情報提供:mo-さん)とりあえずはこれでもイケそうです
http://www.cypress.com/portal/server.pt?space=CommunityPage&control=SetCommunity&CommunityID=285&PageID=552&shortlink=SD1089

ここにインストールマニュアルが置いてありました。
http://www.cypress-japan.co.jp/ccompiler/How_to_install_HiTECH_Lite.pdf
有料のものは、ライセンスキーを入力するだけで、ImageCraft?社製のCコンパイラが使えましたが、こちらはHigh-Tech社製のコンパイラをインストールする必要があります。
詳しくはマニュアルを参考にして下さい。
08/9/26(Fri) 16:58 近藤

また、HITECH-Cコンパイラは、Forumがあるので、困ったことがあったら頼ってみるとよいでしょう。
http://forum.htsoft.com/all/postlist.php?Cat=0&Board=PSoC&page=0

試しになんか作ってみる:LEDと光センサ

これからやること

スタート→Cypress Microsystems→PSoC Designerで、PSoCでプログラムを書くためのアプリケーションPSoC Designerを立ち上げます。
PSoC Designerを使って、PSoCのプログラムを書くおおまかな手順は次の通りです。

  1. Device Editor画面で、使う周辺I/Oデバイスを選び、必要な設定をする
  2. プログラムを書く
  3. 書き込む
  4. 遊ぶ

この1.が、他のマイコンにはない、PSoCの特長といえます。マイコンは、一般にはタイマ、A/Dコンバータ、パルス出力、シリアル通信、などのいろいろな機能を持つ周辺I/Oデバイスが内蔵されていて、それをつかってマイコンは実世界とつながるわけですが、一般のマイコンは、この周辺I/Oデバイスの種類と数は、製品によって決まっています。つまり、A/Dコンバータが1個しかないマイコンは、いくらA/Dコンバータが2個ほしい!と思っても、どうしようもありません。ところが、PSoCは、(内部リソースが許す限り)好きな周辺I/Oデバイスを作り、それを使うことができます。例えばパルス発生回路が16個あるような、化け物のようなマイコンも、普通に作れます。

はじめに:プロジェクトの作成

まず、PSoC Designerを立ち上げると、新しいプロジェクトをはじめるウイザードが始まるので、初期設定をしておきましょう。

↓新しいプログラムを書くので、Start New Projectを選びます。

pd01.png

↓プログラムファイルなどを置いておくディレクトリ(フォルダ)を指定し、プロジェクトの名前を決めます。たとえばled_testのようにしておきましょう。

pd02.png

↓使うPSoCの種類を選ぶ画面になります。ViewCatalog?を押して、使うPSoCを選びます。

pd03.png

↓こんな感じで、いろんなPSoCが一覧表で出てきます。今回使う、PSoC First Touchの小基板に載っているPSoCは、CY8C21434というやつですので、そいつを探して、Selectボタンを押します。

pd04.png

↓めでたく、CY8C21434が選ばれました。ついでに、プログラムを書くのに使う言語を選びます。Cコンパイラを導入してあれば、迷わずCを選んでおきましょう。

pd05.png

使うモジュールを配置する

↓プロジェクトの作成がすむと、こんな感じの画面になると思います。これは、PSoCの周辺I/Oデバイスを設定するDevice Editorのうちの、使う周辺I/Oモジュールを選ぶUser Module Selection Viewというものです。(名前が長いですね)

pd06.png

今回は、次のような機能を持つものを作ってみることにします。

  • 明るさセンサで、明るさを読み取る
  • その明るさに応じて、LED(青)の明るさを変える

明るさセンサから明るさを読み取るにはA/Dコンバータを使います。またLEDの明るさを変えるには、PWM (Pulse Width Modulation)というモジュールを使います。これは、パルスの1周期のうちでON(1)の時間を変えることで、近似的にLEDの明るさを変える、というものです。(ONの時間の比率が高いほど、明るく光る)

まずは、今回使う、A/DコンバータとPWMを、使えるように選んでおきましょう。

↓左端に、使えるモジュールが並んでいます。このうち、PWMsを選び、その中のPWM8をダブルクリックします。そうすると、中央上側の枠の中に、PWM8モジュールが、PWM8_1という名前がついて現れます。

pd08.png

↓同じように、ADCsの中のADC8を選んでおきましょう。名前はADC8_1となります。

pd09.png

使うモジュールを配線する

これで、使いたいモジュールを選び終わったので、こいつらを、実際に使えるように配置をします。その配置は、Device Editorの、Interconnect Viewという画面で行います。

pd07.png

↑の右端のボタンを押して、Interconnect View画面に移ります。

↓Interconnect View画面では、四角と縦線、横線がたくさんありますね。四角はモジュールを構成するブロックが配置される場所、縦線と横線は配線で、これらをうまくつないで、ブロックどうしや、PSoCの外のI/Oピンとつなぎます。この画面は、ADC8_1を1回クリックした状態ですが、ADC8_1で使うブロックが、薄く水色と緑の枠がかかっています。

pd10.png

このまま、ADC8_1を右クリックしてPlaceを選べば、実際にPSoCの中で配置されて使えるようになるのですが、今回は、ちょっと事情により、配置する場所を変えます。

pd11.png

↑この(1)のボタンで、次に配置可能な場所に移ります。

↓このような状態になったら、さきほどの(2)のボタンを押して配置(Place)します。

pd12.png

↓ADC8_1が配置されました。配置されたブロックが、ADC8_1の枠と同じ青色になっています。

pd13.png

↓同じように、PWM8_1も配置しておきます。このPWM8_1は、どこでもかまいません。

pd14.png

ちなみにInterconnectView?画面では、次のようにして画面を拡大したり移動したりできます。

  • Ctrl+左クリック=拡大
  • Ctrl+Shift+左クリック=縮小
  • Alt+ドラッグ=移動

次は、ADC8_1とPWM_1を、PSoCの外につながるピンに接続します。さきほどの表を見ると、明るさセンサはP0.6に、青LEDはP1.2につながっていることがわかるので、これにあわせましょう。

まずADC_8の入力をP0.6につなぐため、次の2段階をふみます。

↓AnalogColumnInputSelect_1がP0.4になっているので、それを選びます。

pd15.png

↓出てくるメニューからPort0_6を選ぶと、こうなります。

pd16.png

↓次に、ADC8_1のADC Inputと書いてあるところをクリックすると、ADC8_1の入力をどこにつなぐかを選ぶメニューが出てきます。

pd17.png

↓このメニューから、AnalogColumn? InputSelect_1(さっき、Port0_6を選んだやつ)を選ぶと、そこにつながります。配線を追いかけて、Port0_6につながっていることを確認しておきましょう。

pd18.png

次に、PWM8_1の出力を、青LEDがつながっているP1.2につなぎます。

InterconnectView?画面の右上の方に並んでいるI/Oピンのうち、Port_1_2をクリックすると、そのピンをどこにつなぐか選ぶメニューが出てきます。ここから、GlobalOutOdd_2を選びます。(左上の方にも並んでいますが、こいつらは入力ピンとして使うときに使います)

pd19.png

↓このGlobalOutOdd_2というのは、右の方に縦に並んでいる配線のうちの1本で、こんなかんじでPort_1_2が接続されます。(上に書いてあるGOOというのが、GlobalOutOdd?の略)

pd20.png

↓次に、PWM8_1の下に並んでいる横線(Row_0_Ouptut_2)と、さきほどの縦線(GlobalOutOdd_2)をつなぐことにします。

pd21.png

↓Row_0_Output_2の右端についている四角をクリックすると、こんな画面が現れます。このうち、GlobalOutOdd_2につながっている三角を選ぶと、その三角(バッファ)を使うかを選ぶメニューが現れるので、GlobalOutOdd_2を選びます。(デフォルトでは、このバッファはOffになっているので、結果としてRow_0_Output_2とGlobalOutOdd_2はつながっていない)

pd22.png

↓Row_0_Ouptut_2とGlobalOutOdd_2がつながりました。

pd23.png

↓最後に、PWM8_1の出力(CompareOut?)を、横線(Row_0_output_2)につないでおきます。PWM8_1のCompareOut?をクリックすると、その出力をどこにつなぐかを選ぶメニューが出てくるので、Row_0_Ouptut_2を選んでおきます。

pd24.png

↓PWM8_1のCompareOut?出力が、Row_0_Output_2につながりました。

pd25.png

↓だいぶまわりくどかったですが、結果として、PWM8_1のCompareOut?出力が、青LEDがつながっているPort1_2につながっていることを確認しておきましょう。

pd26.png

使うモジュールを設定する

配置したPWM8_1とADC8_1に必要な設定をしておきます。まず、クロック周りの設定をします。

↓左上の方に、PSoC全体に関係する設定をする箇所があります。この中のVC1=SysClk?/N のところを16にしておきます。

pd27.png

PSoCの内蔵クロック(24MHz)を何分の1かに分周してVC1という名前のクロック信号として使うのですが、この分周比を16とすることで、VC1は24MHz/16=1.5MHzのクロック信号となることになります。

続いて、PWM8_1の設定を行います。主な設定項目は、

  • 使うクロック信号
  • 周期
    です。

PWM8_1を上の枠の中で選ぶと、PWM8_1のパラメータの設定画面が左端中央に出てきます。とりあえず↓このように設定しておきます。

pd28.png

この例では、PWM8_1で使うクロック信号がVC1(さきほど1.5MHzに設定しました)、周期が255カウント、となっています。PWM8_1から出てくるパルスの周波数は、クロック信号をこの周期分カウントするのにかかる時間がそのパルスの周期なので、1.5MHz/256=5.9kHzとなります。
つまり5.9kHzのパルスがPWM8_1(につながっているP2.1)に出てくるわけですが、そのうちのON(=LEDが点灯する)カウント数を、PulseWidth?に設定します。例えばPulseWidth?=127とすれば、ちょうどONとOFFの時間が同じ(デューティー比50%と呼びます)パルスが出てくることになります。LEDはこの5.9kHzで点滅することになりますが、そんなに速い点滅は見えないので、結果として、半分くらいの明るさで光っているようにみえることになります。このPulseWidth?は、あとで書くプログラムで設定するので、ここではいじる必要はありません。

[けっこうはまることが多いので注意]ちなみにここにClockSync?という項目があります。これは、モジュールに与えられるクロック(ここではVC1)を、システムクロック(SYSCLK=24MHz)に同期させるかどうか、という選択です。無難なのは、Unsynchronized(同期させない)、あるいはSync to SYSCLK(SYSCLK=24MHzに同期)です。デフォルトのUse SYSCLK Directだと、せっかくClock源をVC1にしていても、文字通りSYSCLKが使われてしまい、PWM8_1は24MHzのクロックで動いてしまうので、注意。(デフォルトがこのDirectというのは、いかがなものか、と個人的には思いますが、しょうがない)

続いて、ADC8_1の設定をしましょう。

といいつつ、ADC8_1は、けっこう複雑なので、そのデータシートに目を通しておきましょう。メニューバーの中に、モジュールのデータシートを見るボタン(↓の右端)があるので、ADC8を選んで押してみましょう。

pd30.png

だーっと読んでみると、与えるべきクロック周波数が書かれている箇所があります↓

pd31.png

ADC8には、0.24MHz〜2.4MHzのクロックを与える必要があることがわかります。今の場合は、さきほどのVC1が1.5MHzでしたから、さしあたって、このVC1を与えればよさそうです。
同様に、データシートを読んでいくと、VC3の分周比(Divider)に関する記述がありますが、ここでは結論だけ。VC3のDividerは256とすることにします。

↓これらをふまえて、ADC8_1の設定を以下のようにしておきましょう。

pd32.png

これで、使うモジュール(PWM8_1とADC8_1)の設定がおわりました。この設定に基づいて、プログラムを書き始めるために、Config -> Generate Application を実行しておきます。

・・・長かったですね。
一般にマイコンは、最初から内蔵されているモジュールが決まっているので、これらのような設定は不要ですが、PSoCはそのモジュールを自由に決められる分、いろいろと設定しないといけないところがありました。この設定の手順は、これからPSoCで何かを作るたびに行うので、徐々に慣れていけばよいでしょう。

プログラムを書く

pd33.png

↑このボタンの、左から2番目のボタン(青っぽい)を押すと、プログラムを書くためのApplication Editor画面↓になります。

pd34.png

↓左端のSource Filesの中のmain.cをダブルクリックすると、プログラムを書くべきmain.cが現れます。

pd35.png

さて、いよいよプログラムを書くわけですが、今回はメインでやることは非常に単純で、

  1. 明るさセンサの値をADC8_1で読む
  2. その読んだ値を、PWM8_1のパルス幅に設定し、青LEDの明るさを変える
  3. 1.〜2.を繰り返す

↓というわけで、こんなプログラムになります。

pd36.png

最初のほうのPWM8_1_Start()は、PWM8_1モジュールを使い始める関数、その次のM8C_EnableGInt〜ADC8_1_StartADC()までは、ADC8_1モジュールを使い始めるまでのおまじない、です(実はADC8_1のデータシートに載っているサンプルのまんま)

メインのwhileループは、次のとおりです

  • A/D変換が終わるのをまつ (while(ADC8_1_...)
  • A/D変換した結果をdに読み出す (d = ADC8_1_...)
  • PWM8_1のパルスの幅をdに設定する (PWM8_1_...)
    あ、このPWM8_1_WritePulseWidth?の引数は、d/2ではなくてdが正しいです。読みかえてください・・・

ちなみにPWM8_1_WritePuseWidth?などの関数は、PWM8のデータシートに載っています。各データシートのサンプルコード(Sample Code)が参考になりそうですね。
ちなみに上記のA/D変換まわりの処理は、ADC8のデータシートのサンプルのほぼそのまんまです。

プログラムを書き終わったら、Build → Buildでコンパイルします。

pd37.png

↑無事コンパイルがおわったら、めでたしめでたし。エラーが出た場合は、そのエラーメッセージを参考に、デバッグしましょう。

書き込み

いよいよ、作成したプログラムをPSoC First Touchの小基板のPSoCに書き込んで動作させてみましょう。

PSoC First Touchの2つの部分をドッキングした状態で、PCのUSBポートに接続すると、ドライバをインストールする画面が現れるので、自動的にインストール、を選べば、あとは自動でドライバが入るはずなので、終わるまで待ちます。

↓PSoC DesignerのProgram → Program partを選ぶと、書き込みを行うPSoC Programmerが立ち上がります。

pp1.png

↓左上の方のPortから、使う書き込み機を選びます。

pp2.png

↓無事選ばれました。ついでに、書き込み対象のPSoCであるCY8C21434を選ぶため、Device Familyは21x34を、DeviceはCY8C21434を選んでおきます。

pp3.png

↓作成したプログラムをコンパイルした結果を開くため、File Loadを押すと、書き込みするファイルを選ぶ画面が現れるので、いま作ったプログラムのプロジェクトのディレクトリ(フォルダ)の下のフォルダoutputの中にある、*.hex(この場合はled_test.hex)を選んでおきます。

pp4.png

↓Programを押せば、プログラムの書き込みがはじまるので、少し待ちます。(10秒くらい?)

pp5.png

↓書き込みが終わるとき、なぜかChecksum Failedと出るようですが、ちゃんと書き込みができているようなので、気にしないことにします。

pp6.png

書き込みが終わると、すぐにプログラムの動作は始まっています。どんな感じでしょう?

例題1

  1. 明るさに応じて、赤色のLEDの明るさが変わるようにしてみましょうかね。
  2. 明るさに応じて、赤←→青と変わるようにしてみましょうかね。(ヒント:赤=赤100%+青0%、青=赤0%+赤100%、と考えて、赤、青、それぞれの明るさを、ADC8_1の値に応じて変えるとよいでしょうね)

CapSense?で遊ぶ

PSoC(の一部)では、容量検知型の、タッチセンサを使えます。ポチポチおすスイッチの代わりに、電極に触れるだけでスイッチの代わりにできたり、あるいは複数並べて、触れている位置を検知するスライダーにもできます。

このタッチセンサの機能は、CapSense?というモジュールを配置することで、簡単に使えます。

新しいプロジェクトを始めたあと、ユーザモジュールの選択のときに、CapSensors?の中のCSDというモジュールを選びます。
すると、CSDモジュールの構成を聞かれますので、最初の「Select CSD without clock prescaler」を選んでおきます。
(CSDモジュールは、Delta-Sigma変調を使って、ノイズ耐性を高めたタッチセンシングの方式を使っているらしいです。興味がある人はCSDモジュールのデータシートに動作原理の解説があります)

続いて、CSDモジュールを配置後、CSD_1を右クリックして現れるメニューの中から、「CSD Wizard」を選ぶと、↓このような画面が現れます。

csd1.png

これは、タッチセンサとして使うボタンの数と、そのボタンの代わりに使う電極をPSoCのどのピンにつなぐかを指定します。
まずは、PSoC First Touchの近接センサの電極として使う青色のビニール線(P2[0]につながっている)を、タッチセンサの電極として使うことにします。
↓この画面のN sensorsを1にしてEnterを押すと、左側に「SW0」という箱が現れます。

csd2.png

↓ここに、右側の中からP2[0]をドラッグすると、SW0という名前のタッチセンサとしてP2[0]につながっている電極(青色のビニール線)を使う指定ができるので、OKを押して終了します。

csd3.png

↓続いて、CSDモジュールの設定を、次のようにしておきます。Modulator Capatitor, Feedbank Resistorは、この基板ではこのピンにコンデンサと抵抗がついているので、この通りに指定します。Referenceは、VBG(内蔵のBandgap Reference)を使います。

csd4.png

ついでに、LEDがつなげたPWM8モジュールも配置し、最初の例と同じように設定・配線しておきます。

↓その後、次のようなプログラムを書いてみましょう。(実はCSDモジュールのデータシートのSampleCode?のほぼパクりです)

csd5.png

最初の方はおまじないですが、関数名が、そのまんまの名前なので、だいたいやっていることはわかるかと思います。要は、初期化をしたあと、while(1)の中で、タッチセンサの値を読んでいます。
k番目のタッチセンサがオン(さわっている)かどうかは、CSD_1_IsSensorActive?(k)という関数でわかります。今回のタッチセンサはSW0ですから、CSD_1_IsSensorActive?(0)でオンかどうかを調べ、ONであればLEDを明るく、OFFであれば暗くしています。

このタッチセンサは、ある程度、ですが、電極までの距離もわかります。
↓CSD_1_waSnsDiff?[k]で、k番目のタッチセンサと指までの距離(正しくはカウンタの値)が求められます。ただしこの変数は16ビットですので、適当なビット数分だけ右シフトした後、下位8ビットのみをPWM8_1のデューティー比として設定しています。

csd6.png

さらにCSDモジュールは、複数の並んでいる電極をつないで、指がどの位置に触れているかという場所を求めることもできます。(Slide機能)

↓CSD Wizardで、N Slidersを1にしてみましょう。下の方に、構成するスライダを構成する電極数を入れる場所があります。この小基板にはP2[1]〜P2[7]に7個の並んだ電極がつながっていますので、それぞれ指定しておきます。また、その7個の電極の並びで、指が触れている位置を、何段階で検出するか、をResolutionとして指定できます。今回は、PWM8_1の分解能と同じ8ビット(255)としておきましょう。

csd7.png

↓プログラムは、タッチセンサの場合とほぼ同じです。スライダの位置(触れている場所)は、CSD1_wGetCentroidPos?(k)で求められます。(ただしk=1が、1つめのスライダ)今回は、その値が0〜255で求められることにしていました(先ほどのResolution)ので、そのままPWM8_1のデューティー比として書き込んでいます。

csd8.png

タイマ割り込み

割り込みを使うと、main()関数の中のwhile(1)ループをまわしながら、定期的にある関数を実行したり、あるいは何かの入力があったときにある関数を実行する、ということができます。

割り込みの使い方の例として、タイマ割り込みを使って、定期的にLEDの明るさを変えてみましょう。

次のステップをふんでみてください。

  1. 新しいプロジェクトで、PWM8_1と、Timer8_1を配置(Timer8_1は、Timers内のTimer8を使う)。PWM8_1は、最初の例と同じように設定し、どれかのLEDに接続する。
  2. Timer8_1モジュールの設定をする。主なところは以下の通り。
    • Clockとして、1kHz程度のクロックをVC3などで作る。VC3の周波数は厳密でなくてもよい。
    • Periodを20ms程度の周期になるように設定する。例えばClockの周波数が1kHzであれば、Timer8_1は1msごとにカウンタが進むので、Periodを20にすれば、20msごとにTimer8_1のカウントが終わる(Terminal)ことになる。
    • InterruptType?TerminalCount?にする。これで、Timer8_1のカウントが終わるごと(つまり20msごと)に割り込みが発生するようになる
  3. プログラムを書く。主なところは以下の通り。
    • グローバル変数としてBYTE dutyを宣言しておく。
    • Timer8_1カウント終了割り込みが発生したときに呼ばれる関数(割り込み処理ルーチン: Interrupt Service Routine; ISR)を定義する。

      #pragma interrupt_handler Timer8_1_ISR
      void Timer8_1_ISR(){

       PWM8_1_WritePulseWidth(duty++);
      }
      なお割り込み処理関数は、(割り込みを起こすモジュール名)_ISR、となる。
  • main()関数内て、Timer8_1割り込みを許可(使えるようにする)し、Timer8_1をスタートしておく。
    M8C_EnableGInt;
    Timer8_1_EnableInt?();
    Timer8_1_Start();
    それ以外のところは、PWM8_1をスタートしたら、あとはwhile(1)で何もしなくてもOK。

(注意)HI-TECHのコンパイラでコンパイルすると、アドレス割り当てしてください、っていうWarningがでますが、これは自動でしてくれるので無視してかまいません。

書き込み器からの独立

お気づきの方も多いと思いますが、書き込みを終わったあとは、書き込み機は、特にすることはありません。しいていえば、小基板に電源を供給しているだけです。

つまり。

電源さえつなげば、小基板を切り離して動作させることができるわけです。

書き込み機につながるコネクタに、ヘッダピンをつないで、First Touch Document.pdfに載っているピン配置を参考に、VCCとGNDの間に+5Vを供給すればOKです。

  1. 5Vの電源は、何でもよいのですが、USBポートが便利です。
    USBポートは、+5Vの電源が供給されているので、PCのUSBポートでも、最近よく見かける、↓こんなグッズでもOKです。
    USB-Pow1.JPG
    USB-Pow2.JPG

ケーブル側のUSBコネクタ↓には4本の端子がありますが、差し込む先のほうから見て、下の写真で、右端が+5V、左端がGNDです。

USB-B.JPG

↓手持ちの不要なUSBケーブルを切断して作ってもいいですし、USBコネクタに自分でビニール線をつないでもOKです。こういうのを1本持っておくとよいでしょう。

USB-PowCable.JPG

USBコネクタの反対側、自分の機器につなぐ側のコネクタは、なんでもよいのですが、MeRL標準としては、いわゆるφ2.1mm DCプラグ↓、をおすすめします。

DCplug.jpg

これにそろえておくと、みんなで使い回しができて便利です。

自分の機器側には、↑の受け側(ジャック)を穴あき基板などに取り付け、その基板上に小基板をつなぐコネクタなどをつけると完成です。

PCとの遭遇

FirstTouch?の小基板は、いろいろなセンサがついていますが、PCとつないで、いじれると、楽しそうです。
PSoCなどのマイコンとPCをつなぐ、一番お手軽な方法は、調歩同期式(非同期式)シリアル通信と呼ばれるものです。PCに詳しい人であれば、「シリアルポート」という名前の方がなじみがあるかもしれません。

PCのシリアルポートは、RS232という規格にそっていて、0と1を、それぞれ+7V以上、ー7V以下、という電圧で表すことになっています。
ところが、マイコンをここにつなごうとすると、この+7V以上やー7V以下という電圧が必要になりますが、ふつうのマイコンは、こんな変な電圧は扱えません。

また、最近のPCは、シリアルポート(COMポート)がないものが増えてきて、USB-シリアル(COMポート)変換器、というのを使えば、シリアルポートの代わりに使えるのですが、先ほどの電圧レベルの関係で、マイコンには直接つなげません。この電圧レベルの変換をしているIC(MAX232というやつが有名)も市販されているのですが、PCとつなぐマイコン機器をつくるたびに、このICを使うのは、ちょっと面倒です。

そこで、USBから、マイコンのI/Oポートと同じ電圧レベル(いわゆるTTLレベル:1=+5V程度、0=0V)の調歩同期式シリアルに変換するICが市販されていますので、それをつかって、USBからマイコンの調歩同期式シリアルポートにつなぐアダプタをMeRLで準備しています↓。

USB-UART.JPG

黒い4ピンのコネクタをマイコン側に、USBコネクタ(miniB)をPCのUSBポートへつなぎます。PC側では↓このドライバを使うと、COMポートとして扱えます。(割り当てられるCOMポートの番号は、接続後にデバイスマネージャのポート、の中に現れるCP210x...についている番号で確認する)
×http://www.silabs.com/tgwWebApp/public/web_content/products/Microcontrollers/USB/en/mcu_vcp.htm
http://www.silabs.com/products/mcu/pages/usbtouartbridgevcpdrivers.aspx
→VCP Driver Kit をDLし、あらかじめインストールしておく。その後、↑をつなぐと、ドライバを自動的にインストールできます。

なおマイコンと調歩同期式シリアル通信を行うときには、1バイト単位でデータを送受信できると便利なことが多いので、↓このアプリを入れておくとよいでしょう。
http://www.vector.co.jp/soft/win95/prog/se089304.html

マイコン側の基板(小基板をつなぐ基板など)には、4本の一列のピンヘッダを立て、順番に次のように接続します。(受信ピン、送信ピン、は、あとでPSoCで割り当てるので、後ほど・・・)

  1. GND
  2. VDD
  3. 受信ピン
  4. 送信ピン

マイコンの中で調歩同期式シリアル通信を行うモジュールを、UART (Universal Asynchronous Receiver & Transmitter)と呼びます。PSoCも、Digital Communicationカテゴリの中にUARTというモジュールがあるので、これをつかえばPCと調歩同期式シリアル通信をすることができます。

  • このモジュールを配置後、自分で決めた2本のピンのうち、RX inと受信ピンに使うピン、TX outと送信ピンに使うピンを配線する。
  • このモジュールのClockは、行いたい通信速度の8倍を与える。例えば9600bps(1秒間に9600ビット)で通信する、という取り決め(プロトコル)にするのであれば、Clockには9600Hz×8を、VC3などで適当に分周して与える。(数%の誤差はOK)
  • main()関数内で、UART_1_Start(UART_PARITY_NONE)でスタートする。ちなみにPARITY_NONEは、パリティビットをつけない、という指定で、一般的にはこれを使う。
    なおPC側のAcknowrichも、通信速度(COMポートを開くと、画面の下の方に表示されている)を、マイコン側とそろえておく必要があります。またデータ長を8bit、ストップビットを1bit、パリティ:NONE、としておきます。(データ長とストップビット、はPSoCでは、それぞれ8bit, 1bitから変更できない)※用語が気になる人はGoogle先生に聞いてみましょう
  • PSoCからの1バイトの送信は、UART_1_PutChar?(d);
  • PSoCからの1バイトの受信は、UART_1_cGetChar?(d);

PCから送ったデータに基づいて、LEDの明るさを変えられるようにすると、PSoCを征服した感があって、楽しいかもしれません。


添付ファイル: fileUSB-UART.JPG 270件 [詳細] fileUSB-PowCable.JPG 208件 [詳細] fileUSB-Pow2.JPG 183件 [詳細] fileUSB-Pow1.JPG 192件 [詳細] fileUSB-B.JPG 161件 [詳細] fileDCplug.jpg 237件 [詳細] filecsd8.png 101件 [詳細] filecsd7.png 257件 [詳細] filecsd6.png 106件 [詳細] filecsd5.png 100件 [詳細] filecsd4.png 103件 [詳細] filecsd3.png 243件 [詳細] filecsd2.png 252件 [詳細] filecsd1.png 267件 [詳細] fileftmt.png 385件 [詳細] filepp7.png 109件 [詳細] filepp6.png 206件 [詳細] filepp5.png 222件 [詳細] filepp4.png 195件 [詳細] filepp3.png 236件 [詳細] filepp2.png 238件 [詳細] filepp1.png 219件 [詳細] filepd37.png 245件 [詳細] filepd36.png 157件 [詳細] filepd35.png 251件 [詳細] filepd34.png 202件 [詳細] filepd33.png 102件 [詳細] filepd32.png 108件 [詳細] filepd31.png 291件 [詳細] filepd30.png 104件 [詳細] filepd29.png 102件 [詳細] filepd28.png 95件 [詳細] filepd27.png 290件 [詳細] filepd26.png 252件 [詳細] filepd25.png 212件 [詳細] filepd24.png 208件 [詳細] filepd23.png 215件 [詳細] filepd22.png 222件 [詳細] filepd21.png 211件 [詳細] filepd20.png 283件 [詳細] filepd19.png 282件 [詳細] filepd18.png 277件 [詳細] filepd17.png 278件 [詳細] filepd16.png 275件 [詳細] filepd15.png 372件 [詳細] filepd14.png 255件 [詳細] filepd13.png 227件 [詳細] filepd12.png 241件 [詳細] filepd11.png 183件 [詳細] filepd10.png 312件 [詳細] filepd09.png 233件 [詳細] filepd08.png 298件 [詳細] filepd07.png 110件 [詳細] filepd06.png 326件 [詳細] filepd05.png 211件 [詳細] filepd04.png 256件 [詳細] filepd03.png 221件 [詳細] filepd02.png 241件 [詳細] filepd01.png 250件 [詳細] fileft2.jpg 197件 [詳細] fileft1.jpg 226件 [詳細] filepackage.jpg 203件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-07-08 (木) 16:21:02 (22d)