|
|
|||||||||||||
今回のニキシー管時計作製で使用したマイコンは、Cypress(サイプレス)社の、PSoC(Programmable System-on-Chip)というマイコンです。(ピーソックと読むそうです) 近所の本屋で右の参考書を見つけたので、このマイコンを使ってみました。“マイコン実装済の基板”&“USB対応書き込み器”&“開発ツール収録のCD-ROM”が付いて、価格¥3800- と手軽に始められそうだったのです。 CQ出版社から出ている、「PSoCマイコン・スタートアップ」という本です。 |
|||||||||||||
さて、このPSoCマイコン、参考書を読むと、開発方法が2種類あるんだそうです。(ここでいう開発というのは、マイコンに特定の働きをさせるためのプログラムを組み、組んだプログラムをマイコンに入れ、マイコンに働きを持たせること(だと思います。。。)) 1つ目の開発方法は、“Chip Level Design”という方法で、C言語やアセンブラ言語を使ってプログラミングをしていく方法で、もうひとつは、“System Level Design”という方法で、これはGUIベースで入力デバイス、出力デバイスなどを配置し、入出力仕様を設定していくだけでプログラミングが出来上がるというものです。 今回買った「PSoCマイコン・スタートアップ」という本では、主に“System Level Design”による方法が解説されているので、これを見ながら“System Level Design”で挑戦してみました。 |
|||||||||||||
|
|||||||||||||
実際に時計用のプログラムを作る前に、先ずは試しに簡単な動作をさせるプログラムを“System Level Design”で組んで、本に付属の基板で動作させてみましょう。 例えば、2個のLEDと1個のタクトスイッチを使って、スイッチを押すたびにLEDが交互に点灯するようなものを作ってみましょう。 前準備として、開発ツールの“PSoC Designer”と“PSoC Programmer”を付属のCD-ROMからパソコンにインストールしておきます。 |
|||||||||||||
あと、付属のマイコン実装済基板を、左の写真&図のようにユニバーサル基板に載せ、LED、抵抗、タクトスイッチを実装しておきました。 (LED 9個付いてますが、今回は2個しか使いません。) |
|||||||||||||
|
|||||||||||||
←“PSoC Designer”を起動した時の画面です。 新規プロジェクトを作成する場合は、赤で囲んだ“New Project...”をクリックします。 |
|||||||||||||
すると左のように、新規プロジェクトの種類とプロジェクト名、保存する場所を設定するウインドウが出てきます。 “System Level Design”で組みますので、種類は“System Level Design”を選び、名前は“Two_LED_Alternation”としました。保存場所は、写真では“C:\”となっていますが、予めPSoCのプロジェクト専用のフォルダを作っておき、そこに保存するほうが、整頓が出来ていいように思います。 |
|||||||||||||
以上の設定が出来れば、“OK”をクリックすると、左のような画面になります。この画面で、GUIを配置したりして、プログラムを組立てていきます。(デザイン画面というそうです) ちなみに、「Window」メニューの「Auto Hide All」を選択しておくと、上下左右の小さいウインドウがタブ表示になり、タブをクリックすることで必要な時のみ表示できます。GUIを配置する場所を広く見ることができ、便利です。 (左の写真は既にそうしています) |
|||||||||||||
|
|||||||||||||
● 先ずは試し〜簡単なプロジェクト そのB〜(パーツ配置) |
|||||||||||||
|
|||||||||||||
今回のプロジェクトでは、タクトスイッチ(プッシュスイッチ)1個とLEDを2個使うので、とりあえず、それらを配置します。 |
|||||||||||||
まずはプッシュスイッチから。 画面左側の「Inputs」カタログのタブをクリックし、(tactile \ Button \ Normally Open \ Internal Pulldown N_O)を選択します。プルダウン抵抗内蔵の(Internal Pulldown)ノーマリーオープン型(N_O)スイッチということです。 |
|||||||||||||
選択すると、左の写真のようにプロパティ設定画面になります。Name欄は選んだデバイスに関係なくInput Catalogから選ぶと自動的に“Input1、2・・・”と付けられるので、分かりやすい名前に変更しておくといいと思います。今回は、“SW_1”と名付けました。 |
|||||||||||||
このデバイスは、他に設定する箇所はないので、“OK”をクリックすると、デザイン画面上にプッシュスイッチが配置されます。デザイン画面上の配置場所はどこでもいいので、見やすい場所に移動させます。 |
|||||||||||||
続いてはLEDです。 画面左側の「Outputs」タブをクリックし、(Display \ LED \ Single Color \ On/Off)を選択します。 |
|||||||||||||
|
選んだLEDのプロパティ設定画面が表示されます。Output Catalogから選んだデバイスは、自動的に“Output1、2・・・”と付けられます。タクトスイッチと同じように、自分の分かりやすい名前に変更します。ここでは、“LED_1”と名付けました。あと、“Initial Value”と“Current Mode”を選ぶ欄があります。“Initial Value”は、初期状態をどうするかで、“ON”か“OFF”を選びますが、今回は、何もせず、空白にしておきます。“Current Mode”は、ピンが電流を吸い込む方向(Lowレベル出力)の時にLEDが点灯するのか、吐き出す方向(Highレベル出力)の時に点灯するのかを選ぶもので、これはハードウエア(実際のマイコンとLEDとの配線)で変わります。今回は、先に示した回路図のように、Vccに直にLEDのアノードを付け、(抵抗は介してますが)ピンがLowレベルの時に点灯するようにしていますので、“Sinking”を選びます。 |
||||||||||||
プロパティの設定が出来たら、“OK”をクリックします。 デザイン画面上にLEDが配置されます。 今回、LEDは2個使いますので、もう1個、同じ設定で“LED_2”の名前で配置します。 |
|||||||||||||
|
|||||||||||||
さて、これで部品の配置はできましたが、問題はこれらをどのように制御し、自分がしたい動きにさせるかです。 “System Level Design”で入力に応じて出力状態をコントロールする機能は、“Transfer Function Valuators”のところにあります。 今回は、この中に入っている、“State Machine”と“Table Lookup”というのを使います。 話は少し反れますが、これら二つの概要を少し。 |
|||||||||||||
“State Machine”とは、入力信号などの条件により、回路の状態(ステート)の遷移(移り変わり)を制御していく機能です。(分かりづらいですな・・・)(遷移:せんいと呼びます。。。) |
|||||||||||||
例えば、左の図で説明すると、ステート1という回路状態の時、入力スイッチONにするという入力が入ると、ステート2という回路状態に移ります。次に、ONにしていた入力スイッチをOFFにするとステート2からステート3に移り変わります。このように、入力スイッチをON、OFFさせることで、ステート1→ステート2→ステート3→ステート4→ステート1→・・・といった具合に移り変わっていきます。 |
|||||||||||||
“Table Lookup”は、回路の状態(ステートなど)とハード(LEDなど)の状態を対応させるのに使います。 |
|||||||||||||
例えば、上の図の“State Machine”図で、ステート2に来た時だけLEDを点灯させたい場合、LEDのon/off条件を“Table Lookup”で左のように設定します。 |
|||||||||||||
|
|||||||||||||
● 先ずは試し〜簡単なプロジェクト そのD〜(State Machine) |
|||||||||||||
さて、話を戻しまして、デザイン画面に部品を配置したところからです。 先ずは、「Valuators」タブから、“Transfer Function Valuators”の中の “State Machine”を選びます。 |
|||||||||||||
するとこんな感じで、名前を設定するウィンドが開きます。今回は、“control_1”と名付けました。 そして、“OK”をクリックすると・・・ |
|||||||||||||
“State Machine”の機能を設定するウィンドが開きます。 |
|||||||||||||
詳しい設定は後でするとして、とりあえず、“Add State”を4回クリックして、ステートを4つ出しておいて、“OK”をクリックします。 (もちろん、ここで設定を全て終わらせても問題ないです。・・・というか、本来はそうするのでしょう。) |
|||||||||||||
すると、デザイン画面に“control_1”という制御機能のアイコンが追加されます。 改めて、“control_1”の設定をします。“control_1”のアイコンを右クリックすると、“control_1” に関するポップアップタブが出ます。ここで、“Transfer Function・・・”を選び、次に出てくる“Edit Transfer Function” ウィンドで、“Edit Transfer Function” を選び、“OK”をクリックします。 |
|||||||||||||
するともう一度、機能を設定するウィンドが開きます。 先ずは、“State0”を選んで“Edit State”をクリックします。すると、ステート0からの移動条件と移動場所を設定するウィンドが開きます。 |
|||||||||||||
ここで、“Expression”(移動する時の条件)を“SW_1==SW_1_On”と書き込みます。そして、“Transition From:”を“State0”、“Transition To:”を“State1”に、それぞれ選びます。“Name”欄は、何でもいいのですが、“SW_1_on”としました。 |
|||||||||||||
“OK”をクリックすると、左のように、“SW_1_on”という矢印で“State0”と“State1”が繋がります。これで、“SW_1”の状態が“on”の時、“State0”から“State1”に移り変わるという設定が出来ました。 |
|||||||||||||
続いて、“State1”から“State2”に移る設定をします。これは、押しているSW1を離した時に移動するように設定します。なので、“State1”を選んで“Edit State”をクリックし、“Expression”(移動する時の条件)を |
|||||||||||||
“SW_1==SW_1_Off”と書き込みます。そして、“Transition From:”を“State1”、“Transition To:”を“State2”にします。“Name”は、“SW_1_off”としました。 |
|||||||||||||
“State3”は、“State0”と同じように“Expression”を“SW_1==SW_1_On”とし、“Transition From:”を“State3”、“Transition To:”を“State4”にします。 また、“State4”は、“State1”と同じように“Expression”を“SW_1==SW_1_Off”、“Transition From:”を“State4”、“Transition To:”を“State0”にします。 (かなり端折ってしまってすみません。。) |
|||||||||||||
“State Machine”のループが出来ました。 |
|||||||||||||
“OK”をクリックし、ウィンドを閉じると、“SW_1”と“control_1”が橙色の線で結ばれ、この二つが関連付けられました。 これで、“State Machine”の設定は終わりです。 |
|||||||||||||
|
|||||||||||||
● 先ずは試し〜簡単なプロジェクト そのE〜(Table Lookup) |
|||||||||||||
次は、LEDをどのタイミングで点灯させるかを設定します。ここで使うのが、“Table Lookup”です。 まずは、LED1を設定します。 |
|||||||||||||
LED1を右クリックし、現れるポップアップメニューから“Transfer Function”を選択します。すると、“Select Transfer Function”というウィンドが出ますので、“Table Lookup”を選択します。 |
|||||||||||||
“Table Lookup”を選び、“OK”をクリックすると、“Select Input(s)”というウィンドが現れます。これは、何でLED1をコントロールするかという、入力デバイスの選択です。今回は、ステートマシンのステートの状態でコントロールするので、“control_1_ State”を選びます。 (“control_1”は、今回ステートマシンに付けた名前です。) |
|||||||||||||
すると、このような設定ウィンドが現れます。 左側に黄色くある“State0”〜“State3”を、右側の“ON”か“OFF”の位置にドラッグ&ドロップで移動させ、設定します。 |
|||||||||||||
LED1は、“control_1”の“State0”と“State1”で点灯(ON)、“State2”と“State3”で消灯(OFF)させたいので、“State0”と“State1”を“ON”側、“State2”と“State3”を“OFF”側に移動させます。 |
|||||||||||||
“OK”をクリックし、ウィンドを閉じると、“control_1”と“LED1”が結ばれ、この二つが関連付けられます。これで、LED1の設定は終わりです。
|
|||||||||||||
続いて、LED2の設定です。これもLED1と同じように、“Table Lookup”を選び、“Select Input(s)”で“control_1_ State”を選択します。 |
|||||||||||||
LED2は、LED1と反対に、“control_1”の“State0”と“State1”で消灯(OFF)、“State2”と“State3”で点灯(ON)したいので、“State0”と“State1”を“OFF”側、“State2”と“State3”を“ON”側に移動させます。 |
|||||||||||||
“OK”をクリックし、ウィンドを閉じると、“control_1”と“LED2”も結ばれます。これで、LED2の設定は終わりです。 |
|||||||||||||
・・・ひとまず、これでデザイン作業は終了です。とりあえず、一服致しましょお。。 この後、“Build(ビルド)”&“マイコンに書き込み”の作業が待っております。。。 |
|||||||||||||
● 先ずは試し〜簡単なプロジェクト そのF〜(Build) |
|||||||||||||
さて、これまで、デザイン画面でプログラムのデザイン作業をしてきましたが、このデザイン画面の情報から書き込みファイルを生成する作業をビルド(Build)といいます。(実際の生成は、初めに設定をして、暫く待っておけば、PSoC Designerが勝手にしてくれます。) では、ビルドをしてみましょう。 |
|||||||||||||
Buildメニューから、「Generate/Build ‘Two_LED_Alternation’Project」を選択し、暫くすると、デバイス選択画面になります。デバイス(マイコンの型式)の選択です。付属基板には“CY8C21434”というマイコンが実装されているので、CY8C21030の下にあるCY8C21434を選びます。 |
|||||||||||||
左下にコンフィグレーション設定の欄があり、 Supply Voltage:5V Sample Rate:Free Run Flash Interface:デフォルトのままEnable Reserved ROM Size:デフォルトのまま2 にそれぞれ設定し、NEXTをクリックします。 |
|||||||||||||
“NEXT”をクリックし、暫くすると、ピン配置画面になります。PSoC Designerが勝手に空いているピンに各パーツを割り振ってくれますが、ユニバーサル基板に実装した時に既にパーツの配列は決めていますので、そのように割り振りを直します。 |
|||||||||||||
既に実装した配列のように、SW_1はP2[0]、LED_1はP0[0]、LED2はP0[2]にドラッグ&ドロップで配置し直します。 |
|||||||||||||
“NEXT”をクリックすると、ビルドが始まります。ビルド中は、ビルドの進捗状態が表示されます。少し時間がかかるかもですが、気長に待ちましょう。 |
|||||||||||||
ビルドが完了すると、ウィンド下のほうの、OUTPUTに、ビルド作業の結果が表示されます。 Errorが0であれば、ビルド完了です。 |
|||||||||||||
|
|||||||||||||
● 先ずは試し〜簡単なプロジェクト そのG〜(PSoCに書き込み) |
|||||||||||||
ビルドまで完了したので、いよいよPSoCマイコンに書き込みをします。 |
|||||||||||||
Programメニューから“PSoC Programmer”を選択すると、“PSoC Programmer”のウィンドが開きます。 |
|||||||||||||
付属のMini ProgをUSBポートに挿します。Mini Progを認識すると右下の“Not Connected”の表示が“Connected”に変わります。 |
|||||||||||||
ここからは、“PSoC Programmer”のウィンドを最大化しています。 ↓アイコン(?)(PSoCへ書き込みのボタンです)をクリックすると、書き込みが始まります。 |
|||||||||||||
少し待っていると、“Programming Successed”というメッセージが表示されます。 これで、書き込み終了です。 |
|||||||||||||
|
|||||||||||||
● 先ずは試し〜簡単なプロジェクト そのH〜(実際に動かしてみる) |
|||||||||||||
PSoCへの書き込みが完了しましたので、実際に動かしてみましょう。 |
|||||||||||||
PSoC ProgrammerからPCに挿しているMini Progを介して電源を供給できますので、動作チェック程度なら別個に電源を用意しなくても簡単にできます。 PSoC Programmerの電源アイコンをクリックすれば、電源が供給され、もう一度クリックすると供給が止まります。 電源供給中は、右下の“Not Powered”の表示が“Powered”に変わります。 |
|||||||||||||
電源を供給すると、まずP0[0]に接続しているLED_1が点灯、P0[2]に接続しているLED_2は消灯している状態になります。 |
|||||||||||||
SW_1を押すと、LED_1が消灯、LED_2が点灯という状態に切り替わります。もう一度SW_1を押すと、LED_1が点灯、LED_2が消灯という状態に切り替わり、SW_1を押すごとに、LED_1とLED_2が点灯、消灯を繰り返します。 |
|||||||||||||
以上で、“先ずは試し〜簡単なプロジェクト”は終わりです。次はもう少し複雑な動作のプロジェクトを試してみましょう。 |
|||||||||||||