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

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

↓プロジェクトの作成がすむと、こんな感じの画面になると思います。これは、PSoCの周辺I/Oデバイスを設定するDevice Editorの画面です。

pd06n.png

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

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

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

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

↓右下の「User Modules」の中に、左端に、使えるモジュールが並んでいます。
このうち、PWMsを選び、その中のPWM8をダブルクリックします。

pd07n.png

↓そうすると、中央上側の枠の中に、PWM8モジュールが、PWM8_1という名前がついて現れます。

pd08n.png

↓同じように、ADCsの中のADC8を選んでおきましょう。名前はADC8_1となります。
ソフトのバージョンによってはADC8がないかもしれません。その場合はADC10を使ってください。プログラムを少し変更しないといけませんが、基本的な設定はADC8と一緒です。

pd09n.png

*モジュールの色に意味はありませんので、色が違っても気にしないでください。

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

これで、使いたいモジュールを選び終わったので、こいつらを、実際に使えるように配置をします。さきほどユーザーモジュールをダブルクリックした時点で、配置可能な場所の中から適当なところに、すでに配置が済んでいます。が、場合によっては、配置する場所を変える必要があることもあります。今回は、ちょっと事情により、ADC8_1の配置する場所を変えます。

↓下の方にあるADC8_1の四角をドラッグして、右側の列に移動させます。

pd13n.png

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

pd14.png

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

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

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

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

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

pd15n.png
pd15bn.png

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

pd16n.png

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

pd17n.png

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

pd18n.png

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

↓左下のほうにある「Pinout」の中にある、Port_1_2をクリックすると、そのピンの属性を設定することができます。ここでは、その中の"Select"をGlobalOutOdd_2を選びます。ref(pd19n.png,,30%)

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

pd20n.png

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

pd21n.png

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

pd22n.png

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

pd23n.png

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

pd24n.png

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

pd25n.png

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

pd26n.png

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

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

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

pd27n.png

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

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

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

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

pd28n.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を選んで押してみましょう。

pd30n.png

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

pd31.png

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

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

pd32n.png

これで、使うモジュール(PWM8_1とADC8_1)の設定がおわりました。

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

プログラムを書く

↓右上の方の「Workspace Explorer」の中にある、Source Filesの中のmain.cが、プログラム本体です。

pd34n.png

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

pd35.png

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

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

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

pd36.png

ADC10を使っている方はこちら

pd36_10.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が正しいです。読みかえてください・・・
  • ADC10を使った場合
    • ADC10の帰り値は10ビットなのですが、PWM8の引数には8ビットしか入れられないので、ビット演算で2ビット右にシフトしています。

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

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

pd37.png

↑無事コンパイルがおわったら、めでたしめでたし。エラーが出た場合は、そのエラーメッセージを参考に、デバッグしましょう。
エラーメッセージをダブルクリックすると、エラーの行に飛ぶことができます。

書き込み

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

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

Designer経由で書き込むときと、Programmerというソフトを起動して書き込む2種類があります。通常はDesigner経由で書き込む方法が楽でしょう。

ソフトのバージョンが古いと、Designer経由で書き込もうと思っても、programmerが起動するようです。

Designer経由で書き込むとき

↓PSoC DesignerのProgram → Program partを選ぶと、Program Portという画面が出てきます。

ppd1.png

この段階ですでに、書き込み先のPSoC、書き込むプログラムが選択されているので、右下の矢印をクリックすれば書き込みが始まります。
書き込みが終わると、すぐにプログラムの動作は始まっています。どんな感じでしょう?

もし動かなかったら、一度USBポートから抜いてみて、さしなおしてみてください。
(よくあります)

programmer経由で書き込むとき

スタートメニューから、PSoC Programmerを起動してください。
↓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の値に応じて変えるとよいでしょうね)

添付ファイル: filepd36_10.png 61件 [詳細] filepd13n.png 193件 [詳細] filepd34n.png 172件 [詳細] filepd14.png 176件 [詳細] filepd18n.png 182件 [詳細] filepp6.png 197件 [詳細] filepp2.png 171件 [詳細] filepd16n.png 201件 [詳細] filepp3.png 172件 [詳細] fileppd1.png 191件 [詳細] filepd15n.png 182件 [詳細] filepd30n.png 79件 [詳細] filepd31.png 190件 [詳細] filepd32n.png 80件 [詳細] filepd17n.png 191件 [詳細] filepd35.png 175件 [詳細] filepd28n.png 89件 [詳細] filepd15bn.png 172件 [詳細] filepp1.png 182件 [詳細] filepd20n.png 180件 [詳細] filepd37.png 194件 [詳細] filepp5.png 178件 [詳細] filepd27n.png 173件 [詳細] filepd25n.png 181件 [詳細] filepd26n.png 155件 [詳細] filepd21n.png 172件 [詳細] filepd22n.png 189件 [詳細] filepp4.png 213件 [詳細] filepd08n.png 179件 [詳細] filepd09n.png 189件 [詳細] filepd36.png 84件 [詳細] filepd06n.png 188件 [詳細] filepd07n.png 203件 [詳細] filepd23n.png 184件 [詳細] filepd24n.png 185件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-02 (日) 11:12:58