久しぶりに PSoC のお勉強 CapSense

2015-06-07 12.27.37

出張中 PSoC4 基板を動かすことなく週末帰宅です。今日は CapSense を使ってみましょうと少しだけ実験です。PSoC4 Pioneer Kit に CapSense 基板を、ジャンプワイヤで接続します。 CapSense に使うポートはどこでもいいのですが、石から 10mm 以内の場所に 560Ω の抵抗を入れるのが推奨されています。

2015-06-07 13.27.12

PSoC4 Pioneer Kit も基板のはじっこにスライド式のセンサが配置されていて、それの入力に使う I/O ピンには 560Ω がはいっています。R17から R21 までですな。この I/O ポートは P1_1, P1_2, P1_3, P1_4, P1_5 にアサインされていて、ヘッダにも接続されているので流用可能です。

ということで、別の CapSense 基板ひっぱりだしてきて使います。青い基板の中央にクルクル出来るホイールのパターンが作られています。シルク印刷には、SLD_0 から SLD-9 まで 10個パターンがありますが、基板側の入力が5個だけなので、SLD_0, 2 4 6 8 の5つ配線して使えるかやってみます。

スクリーンショット 2015-06-07 13.40.20

CapSense のエレメント数 5 と API のレゾリューションを 100 。

スクリーンショット 2015-06-07 13.40.15

センサーの動作モードは、本当ならマニュアル設定で追い込んで不安定な動作を取り除いたほうが良いですが今回は様子見で Auto 設定でやっています。

キャプチャ20150607134600

あとは、デバッグ用にシリアルポート追加したりして実験開始。ラジアルスライダの各エレメントというか電極を軽くクリックした状態では、SLD_0 は 0、SLD-2 は 20 と設定画面で指定したレゾリューション 100 をボタン数 5 で割った数値がわりあてられ、ピッタリの値が返ってきました。

0
20
40
60
80
40

次に、右回りにグルグルやってみます。

1
2
3
5
6
7
8
9
10
15
20
22
23
24
25
26
27
28
29
33
35
36
37
40
42
43
44
45
46
47
48
50
51
52
53
54
55
56
57
58
62
63
64
65
66
67
70
71
72
73
74
75
76
77
78
80
85
88
90
91
92
94
95
96
98
99
100

指をグルグルすることで、今触ってる電極と隣の電極の測定値が変化することをうまく処理してるようで100まで出ます。

久しぶりに PSoC のお勉強

2015-05-30 17.17.04

題名のとおり、PSoC を出してきてお勉強です。液晶に文字を出す練習です。使っているボードは PSoC4 PIONEER KIT という FLASH が 32K の
小規模マイコンです。今は PSoC 4 M-Series Pioneer Kit という flash が 128k のも出ているので機会があれば購入しておきたいところです。こっちのほうのキットは capsence pad が円形なのがいいです。

今日は、久しぶりに PSoC のプラミングの仕方を思い出すための勉強タイム。まず以下2つをクリアするべく作業開始

  • 秋月 I2C 液晶に文字を出す
  • USB-UART ブリッジの動作確認

スクリーンショット 2015-05-30 17.34.30

部品を貼って

スクリーンショット 2015-05-30 17.34.37

部品が使うピンをどのポートに出すかアサイン。コードはだるかったので main.c にベタ書き。液晶への文字出力と PC の TeraTerm に文字が出ることは確認出来ました。液晶の初期化は I2C接続小型キャラクタLCDモジュール(3.3V/5V)ピッチ変換キット 用です。

/* ========================================
 *
 * 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>
void i2cLcdSendCommand(unsigned char);
void i2cLcdSendData(unsigned char);
void i2cLcdSendStr(char *);

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

    /* Place your initialization/startup code here (e.g. MyInst_Start()) */
    I2C_Start();
    CyDelay(100);
    i2cLcdSendCommand(0x38);
    RLED_Write(1);
    CyDelay(20);
    i2cLcdSendCommand(0x39);
    CyDelay(20);
    i2cLcdSendCommand(0x14);
    CyDelay(20);
    i2cLcdSendCommand(0x73);
    CyDelay(20);
    i2cLcdSendCommand(0x56);
    CyDelay(20);
    i2cLcdSendCommand(0x6c);
    CyDelay(20);
    i2cLcdSendCommand(0x38);
    CyDelay(20);
    i2cLcdSendCommand(0x01);
    CyDelay(20);
    i2cLcdSendCommand(0x0c);
    CyDelay(20);
    i2cLcdSendStr("Hello World");
    
    
    UART_Start();
    UART_UartPutString("Terminal out\n\r");    

    
    for(;;)
    {
        /* Place your application code here. */
        BLED_Write(1);
        CyDelay(1000);
        BLED_Write(0);
        CyDelay(1000);
    }
}


void i2cLcdSendCommand(unsigned char command) {
    
    unsigned char buf[2];
    buf[0] = 0x00;
    buf[1] = command;
    I2C_I2CMasterClearStatus();
    I2C_I2CMasterWriteBuf(0x3E, &buf[0], 2, I2C_I2C_MODE_COMPLETE_XFER);
    while(I2C_I2CMasterStatus() != I2C_I2C_MSTAT_WR_CMPLT) {
        ;
    }
    //CyDelay(1);
}

void i2cLcdSendData(unsigned char ch) {
    
    unsigned char buf[2];
    buf[0] = 0x40;
    buf[1] = ch;
    I2C_I2CMasterClearStatus();
    I2C_I2CMasterWriteBuf(0x3E, &buf[0], 2, I2C_I2C_MODE_COMPLETE_XFER);
    while(I2C_I2CMasterStatus() != I2C_I2C_MSTAT_WR_CMPLT) {
        ;
    }
    //CyDelay(1);
    ;
}

void i2cLcdSendStr(char *str) {

    while(*str) {
        i2cLcdSendData(*str++);
    }
}
/* [] END OF FILE */