DesignSpark Electrical Logolinkedin
Menu 検索
フォーラムで質問

開発ボード「Clicker 2 for PSoC 6」を使ってプロトタイピング

Cypress 製の「PSoC 6」は、すばらしい機能を豊富に取り揃えた非常にパワフルで柔軟なマイクロコントローラです。ただ同社の提供する関連ドキュメントの膨大さに「プロトタイプ程度の開発でも相当のドキュメントを読みこなす必要があるのでは・・・」と感じてしまうかもしれません。そんな時に便利なのがMikroelectronica社の「Clicker 2 for PSoC 6」です。同社の規格したClickボードシリーズのモジュールを接続するだけで簡単に目的に動作を実現させることができます。この記事では、PSoC 6ベースボードにセンサやペリフェラルの実装を簡単に行えることを試してみたいと思います。

「Clicker 2 for PSoC 6」の紹介

Clicker 2 for PSoC6 はかなりコンパクトな基板です。昨今多くの開発ボードがマイコンのすべての機能を1枚の基板に詰め込もうとしているのと比べると際立っています。回路図に記載されているチップは、PSoC 6、PSoC 5 (PSoC 6のプログラミング及びデバッギング用)、LTC3586 USB電源マネージャが1つずつとなっており、そこに同社のモジュールシリーズ「Clickボード」を2枚取り付けられるコネクタがあります。

この単純化された設計により、MCUプロジェクトのうち、使うつもりのないデバイスや機能に気を取られることなく、必要なものだけに集中できます。また、センサやその他のデバイスで実験するのが簡単になり(Clickボードを交換するだけ)、その部品が本当に自分のプロジェクトに必要なのか判断する助けになります。  

今回、私の引き出しに何か月も眠っていた MQ-7ベースの一酸化炭素検知器clickボード(CO click)を使用してIoT型一酸化炭素警告システムを作ろうと考えています。

セットアップ

組み込みシステムは中で何が起きているのかをあまり知らせてくれないため、アプリケーションを開発するときに何が役に立ち、何が役立たないのかを解明するのが難しくなりがちです。この問題はFreeRTOSを使用して解決することにします。PSoC Creatorに組み込まれたFreeRTOSは、USBで接続されたターミナルウィンドウにSTDOUTをリダイレクトします。これにより、信頼できる「printf」関数を使用して、プログラムで何が起きているのかを知ることができるようになります。これはどんなPSoCプロジェクトを開始するときにもデバッグ支援として再利用できるシンプルなセットアップです。

PSoC Creator 4.2を開き、[File] -> [New Project]を選択します。ターゲットデバイスを尋ねられます。すでにPSoC 6を使用していれば、次のような画面が表示されます。

ここでは、PSoC 63デバイスを使用します。[Next]をクリックし、その後のウィンドウも、[Select project template]が表示されるまで[Next]をクリックします(デフォルトは変更しません)。ここでは空の回路図を使用します。プロジェクトに名前を付けて、[Finish]をクリックします。空のワークスペースが表示されます。

通信にはUARTを使用するつもりなので、メインウィンドウ右の[Component Catalog]から取得します。コンポーネントを探す最も簡単な方法は、[Component Catalog]ウィンドウの上にある検索バーに必要なものを入力する方法です。次にコンポーネントをドラッグして、メインウィンドウにドロップします。

UART設定はデフォルトのままにするので、ダブルクリックして設定画面を表示する必要はありませんが、UARTを正しい出力ピンに接続する必要があります。出力ピンはClicker 2ボードの回路図にあります。

そこでP12.1とP12.0が必要です。これらは、Workspace Explorer (メインウィンドウの左)で[Pins]をダブルクリックすることでセットアップできます。

さて、どうやら私の回路図とPSoC Creatorの回路図には、どのピンがRxでどのピンがTxであるかについてずれがあるようです。ここではPSoC Creatorの方を使用します。

次にSTDIOのターゲットをUARTに変更し、「printf」文がターミナルに送信されるようにします。FreeRTOSのセットアップから始めることにします。プロジェクト名を右クリックして、[Build Settings…]を選択します。

次に[Peripheral Driver Library]に移動し、[FreeRTOS]の下の[Memory Management] (デフォルトヒープを使用)と[Retarget I/O]をオンにします。

この時点で、トップメニューバーに移動して、[Build] -> [Generate Application]を選択し、セットアップがすべて正常に完了したことを確認できます。よくできました!

PSoC Creatorによっていくつかのファイルがプロジェクトに追加されています。FreeRTOS、stdio_user.c、stdio_user.h、及びretarget_ioです。stdio_user.hを修正する必要があります。

次の行:

#include <project.h>

を一番上に追加し、UART定義を変更します。

#define IO_STDOUT_UART          UART_1_HW
#define IO_STDIN_UART           UART_1_HW

次にFreeRTOSConfig.hを開きます。

45行目の警告をコメントアウトしてから、71行目のヒープサイズを変更します。

#define config_TOTAL_HEAP_SIZE      (48*1024)

変更が終わったら、main_cm4.cに移動し(Workspace Explorerから開きます)、通信用にUARTを開始し、ターミナルに情報を出力するいくつかのコードを追加します。

#include "project.h"
#include <stdio.h>
 
int main(void)
{
    __enable_irq(); /* Enable global interrupts. */
 
    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
 
    PWM_1_Start();
    UART_1_Start();
    
    printf("\033[2J\033[H"); // Clear Screen
    printf("Test\r\n");
    
    
    for(;;)
    {
        /* Place your application code here. */
    }
}

コードを実行できるようになる前にもう一手間必要です。PuttyやTera Termのようなターミナルエミュレータです。これらをセットアップするには、Windowsのデバイスマネージャーを開き、どのCOMポートにKitProg2 USB UARTが接続されているかを確認します。

私の場合はCOM12でした。これをターミナル設定に設定します。私はPuttyを使用していて、設定は次のようになっています。

ターミナルを開いてから、PSoC Creatorに戻り、[Program]ボタン(Workspace Explorerのすぐ上)をクリックします。アプリケーションがビルドされ、PSoC 6にロードされます。ターミナルに戻ると、メッセージが表示されています。

センサの追加

デバッギングスキームができたので、実際の実験を始められます。CO Clickボードの回路図を見ると、センサからANピンへのアナログ出力があります。

Clicker 2ボードの回路図に戻ると、Clickボードサイト1のANピンは、PSoC 6のP10.4に接続されていることが分かります。したがって、このピンの電圧を読み取るため、アナログ-デジタルコンバータ(ADC)のセットアップが必要になります。

PSoC CreatorのComponent Catalogで「ADC」で検索すると、Scanning SAR ADCが見つかります。これを最上位レベルの設計図にドロップできます。

5Vデバイスに十分な入力範囲でシングルエンド入力を取るようにこのADCを設定する必要があります。

これらのパラメータを設定した後、ADCを接続するアナログピンも必要です。ピンはComponent Catalogで見つかります。設計図にドロップし、ADCの入力に接続します。

次にこのピンをピンマップのP10.4に接続します。

次にデータ収集を実行するコードを追加します。MikroelectronicaコードWebサイトのCO Clickのサンプルコードで、ADCで測定された電圧をPPM (百万分率)値に変更する変換式を見つけました。これを私たちのコードでも使用しましょう。

/* ========================================
 *
 * Reading data from an MQ-7 CO sensor
 *
 * ========================================
*/
#include "project.h"
#include <stdio.h>
#include <math.h>

const double Rl       = 5000.0;              // Rl (Ohm) - Load resistance
const double Vadc_2x  = 0.0016113281;        // ADC step 2*Vref/4096 1.61mV (12bit ADC)
const double Vadc_33  = 0.0008056641;        // ADC step 3.3V/4096 0.81mV (12bit ADC)
double Vrl;                                  // Output voltage
double Rs;                                   // Rs (Ohm) - Sensor resistance
double ppm;                                  // ppm
double ratio;                                // Rs/Rl ratio

int16_t adc_rd, adc_V;
char txt[16];

//Calculation of PPM
void calculatePPM() {
  double lgPPM;
  Vrl = (double)adc_rd * Vadc_2x;            // For 3.3V Vcc use Vadc_33
  Rs = Rl * (5 - Vrl)/Vrl;                   // Calculate sensor resistance
  ratio = Rs/Rl;                             // Calculate ratio
  lgPPM = (log10(ratio) * -3.7)+ 0.9948;     // Calculate ppm
  ppm = pow(10,lgPPM);                       // Calculate ppm
}

int main(void)
{
    __enable_irq(); /* Enable global interrupts. */

    UART_1_Start();
    printf("\033[2J\033[H"); // Clear Screen
    printf("Terminal Output Running...\r\n");
    
    ADC_1_Start();
    
    printf("Conversion starting now...\r\n\n");

    for(;;)
    {
        ADC_1_StartConvert();
        Cy_SysLib_Delay(50);
        adc_rd = ADC_1_GetResult16(0);                // Connected to mikroBus1 AN pin/P10.4
        Cy_SysLib_Delay(50);
        adc_V = ADC_1_CountsTo_Volts(0, adc_rd);  
        Cy_SysLib_Delay(50);
        ADC_1_StopConvert();
        Cy_SysLib_Delay(50);
        
        calculatePPM();                               // Calculating PPM value
        printf("ADC value = %d, Volts = %f, ppm = %f\r\n", adc_rd, Vrl, ppm);
        Cy_SysLib_Delay(5000);
    }
}

/* [] END OF FILE */

これでPSoC 6をプログラムする準備が整いました。コードをデバイスにアップロードし、ターミナルを見ると、データが表示されています。

ダブルチェックとして、CO ClickのANピンと接地ピンの電圧を測定してみると(信頼性の高い当社のRS Proデジタルマルチメーターを使用します)、電圧レベルは同じです。すばらしい!ADCは期待通りに動いています。

次に空気中のCOレベルが高くなったら、PSoC 6が知らせてくれるようにしてみましょう。すると疑問はこうなります。適切なPPM測定を行うには電圧をどのように(CO Clickのポテンショメータで)調整すればいいのだろうかと。MQ-7 データシートを参照してみましょう。

OK、面白いことが分かりました。このセンサは、実際はこれまで行ったものよりもっと複雑なセットアップが必要なようです。最も正確な値を得るには、オンセンサヒータを設定し、高温と低温の加熱サイクルを実行します。5Vで48時間加熱した後、5Vを60秒間印加します。このときの値はまだ使用できません。次に1.4Vを90秒間印加し、このときの値をCO測定に使用します。高温段階ではCO (及びその他の可燃性ガス化合物)をセンサプレートから蒸発させます。これは実質的に低温測定段階で正確に測定できるようにするためのクリーニングです。実際に測定するときは、このようなサイクルを繰り返すことになります。

私達のCO clickは、このサイクルを実行できるように作られていないため、一酸化炭素の存在を検知できるものの、本当に正確な測定値を得られるように、これまで作ってきたモジュールを越えて設計を再考する必要がありそうです。

最後に考えてもらいたいこと

MQ-7センサで一酸化炭素を正確に測定することは、私が最初に考えたものよりずっと複雑であることが分かりましたが、Clicker 2 for PSoC 6ボードで非常にシンプルなプロトタイプを試すことができました。他の一酸化炭素clickボード(CO 2 Click)を試すのも同じくらい簡単だと思いますが、試してみる前にセンサのデータシートを読んだ方がいいかもしれません。

私は、ベアボーンのPSoC 6開発ボードとして、Clicker 2が好きです。センサや、その他のプロジェクトで使用するペリフェラルに集中することができるからです。近いうちにこのボードで別のClickボードモジュールであれこれ試したくて今からウズウズしています。

Mark completed his Electronic Engineering degree in 1991 and went on to work in real-time digital signal processing applications engineering, later moving into technical marketing.

4 Feb 2019, 5:33