すっかり寒くなってしまいましたね...


朝、ふとんから出るのが一苦労でございます。


みなさまは、どうおすごしでしょうか。


ひさびさの電子工作ネタ。今回は、


PSoC4の開発キット「PSoC4 PIONEER KIT」
を入手したので、あそんでみました~~。


というレポートです



開発キットは、秋葉原の秋月電商で買いました。
PSoC miniProgの横にふつーにぶら下がっていました。
3000円でした。お手頃価格です。
あれたうみと ひるのすなはま



パッケージ。
あれたうみと ひるのすなはま



中身は、ボード本体とUSBケーブル。
あとはホームページのアドレスが書かれた
説明書がぺらんと1枚のみ。
あれたうみと ひるのすなはま



開発ツール、マニュアル等のCDは付いて
ません。潔いですね。



ボードはこんな感じ。
Arduinoとピンコンパチ(最近の流行?)に
なってるので、見た目Arduinoっぽい。



右側にウリのスライダー型タッチセンサー
が付いています。



あれたうみと ひるのすなはま
中央のLQFP44がPSoC4です。



左にプログラマ制御用としてPSoC5が
いたりなんかして、モッタイナイ感が
漂っております。


さて、それでは!
さっそく何か動かしてみまスかー




というわけで、
外付けのOLED(SPI入力)と
タッチセンサーを使って
ボードを動かしてみました。


結果は動画を作ったので、
こちらをご覧頂けると幸いです。


【ニコ動】


【電子工作】PSoC4であそんでみた



以下、プログラム作成概要です。




【1】開発環境:


PSoC3/PSoC5と同様、PSoC Creatorです。
慣れると非常に楽ちんなので、
開発環境が一緒なのはありがたいです。



あれたうみと ひるのすなはま
回路図に使いたい部品をぺこぺこ置きます。
タッチセンサとSPI(OLED制御用)、
入出力ピン置いて、今回試した部品はこれだけ。



あれたうみと ひるのすなはま
ところでPSoC4のアナログ・マクロですが、
ADCとオペアンプ、コンパレータだけ、
というのが少し寂しいですね。
せめてDACくらいはちゃんと乗せて
欲しかったなー。という感想を持ちました。



あれたうみと ひるのすなはま

次は各マクロの設定をします。
まずはタッチセンサーから。



回路図の部品をダブルクリックして
「Linear sliders」をAddします。



あれたうみと ひるのすなはま
中身はよくわからないのでデフォルトで(笑)。
この設定でセンサーは触っている位置により
0~100の数値を返してくれるようです。



あれたうみと ひるのすなはま
SPIの設定。これはOLEDの仕様に
合わせます。



あれたうみと ひるのすなはま
クロックは割とどうでも良かったので
Internal Clockを選択。



あれたうみと ひるのすなはま
最後に入出力PINの割り付けをして、
回路図は以上でおしまい。



あれたうみと ひるのすなはま



【2】動作プログラム:




動作試行プログラムです。


職業的プログラマではないので
載っけるのは恥ずかしいのですが、
自分の備忘録として...
(1ヶ月後には忘れているので)


あと、ブログの仕様でタブが消えてて
見ずらいです。ごめんなさい。



// *************************************
// *** PSoC4
// *** Capsense -> OLED PROGRAM
// ***----------------------------------
// *** PIN ASSIGN
// *** Arduino PSoC4: PinName
// *** RES 12 P3_1 : P3_1_RES
// *** CS_PIN 11 P3_0 : P3_0_CS
// *** DC_PIN 10 P3_4 : P3_4_DC
// *** CLK_PIN 13 P0_6 : P0_6_CLK
// *** MOSI_PIN 8 P2_6 : P2_6_MOSI
// *************************************
#include <device.h>
#include <stdio.h>
// *************************************
// *** OLED DATA
// *** const unsigned char I8A[96x130]
// *** const unsigned char I8B[96x130]
// *************************************
#include <I8A.h>
#include <I8B.h>
// *************************************
// *** OLED INIT PROGRAM
// *************************************
#include <OLED.h>
// *************************************
// *** Define constant for capsense slider
// *** -> 0xFFFFu の時 NO_FINGER らしいです
// *************************************
#define NO_FINGER 0xFFFFu
// *************************************
// *** OLED : WRITE
// *************************************
void OLEDREGWRITE(uint8 D0){
// ***-------------------------------***
SPIM_WriteTxData(D0);
while(!(SPIM_ReadTxStatus() & SPIM_STS_SPI_DONE));
// ***-------------------------------***
}
// *************************************
// *** MAIN PROGRAM
// *************************************
void main() {
// *************************************
// *** 変数
// *************************************
uint16 sliderPosition = NO_FINGER;
uint16 lastPosition = NO_FINGER;
// ***-------------------------------***
// *** DATA START-BIT and END-BIT
// ***-------------------------------***
uint16 STARTBIT;
uint16 ENDBIT;
// ***-------------------------------***
uint16 i;
uint8 FLG1,FLG2,SW1,SW2;
// *************************************
// *** 初期化
// *************************************
// ***-------------------------------***
// *** 割り込みEnable
// ***-------------------------------***
CyGlobalIntEnable;
// ***-------------------------------***
// *** Start all the components
// ***-------------------------------***
SPIM_Start();
CapSense_Start();
// ***-------------------------------***
// *** Initialize CapSense baselines
// ***-------------------------------***
CapSense_InitializeAllBaselines();
// ***-------------------------------***
// *** OLED Initialize ( display OFF )
// ***-------------------------------***
P3_0_CS_Write(1); // *** CS OFF
OLED_Init();
// *************************************
FLG1 = 0;
FLG2 = 0;
SW1 = 0;
SW2 = 0;
// *************************************
// *** PROGRAM START
// *************************************
for(;;){
// ***-------------------------------***
// *** CAP-SENSE : Update all baselines
// ***-------------------------------***
CapSense_UpdateEnabledBaselines();
// ***-------------------------------***
// *** CAP-SENSE : Start scanning
// *** all enabled sensors
// ***-------------------------------***
CapSense_ScanEnabledWidgets();
// ***-------------------------------***
// *** CAP-SENSE : Wait for scanning
// *** to complete
// *** uint8 CapSense_IsBusy (void)
// *** 1 : scanning in progress
// *** 0 : scanning completed
// ***-------------------------------***
while( CapSense_IsBusy() );
// ***-------------------------------***
// *** CAP-SENSE : Find Slider Position
// ***-------------------------------***
// *** uint16 CapSense_GetCentroidPos
// *** (uint8 widget)
// *** -> リニアスライダーの位置を返す
// ***-------------------------------***
sliderPosition =
CapSense_GetCentroidPos(CapSense_LINEARSLIDER0__LS);
// ***-------------------------------***
// *** 指が離れていたら
// ***-------------------------------***
if(sliderPosition == NO_FINGER){
// ***-------------------------------***
// *** 指が離れていたら
// ***-------------------------------***
}
// ***-------------------------------***
// *** 指がスライダー上にあれば
// ***-------------------------------***
else{
// ***-------------------------------***
// *** ディスプレイはON
// ***-------------------------------***
// *** DC <CMMAND> SELECT ***
P3_4_DC_Write(0);
// *** af : display ON ***
OLEDREGWRITE(0xaf);
// ***-------------------------------***
// *** 画像の表示位置
// *** ダサいif文で失礼しました
// ***-------------------------------***
if( sliderPosition < 10 )
{ STARTBIT = 0*96; ENDBIT = 64*96; FLG1 = 1 ; }
else if( sliderPosition < 16 )
{ STARTBIT = 4*96; ENDBIT = 68*96; FLG1 = 2 ; }
else if( sliderPosition < 22 )
{ STARTBIT = 8*96; ENDBIT = 72*96; FLG1 = 3 ; }
else if( sliderPosition < 28 )
{ STARTBIT = 12*96; ENDBIT = 76*96; FLG1 = 4 ; }
else if( sliderPosition < 34 )
{ STARTBIT = 16*96; ENDBIT = 80*96; FLG1 = 5 ; }
else if( sliderPosition < 40 )
{ STARTBIT = 20*96; ENDBIT = 84*96; FLG1 = 6 ; }
else if( sliderPosition < 46 )
{ STARTBIT = 24*96; ENDBIT = 88*96; FLG1 = 7 ; }
else if( sliderPosition < 52 )
{ STARTBIT = 28*96; ENDBIT = 92*96; FLG1 = 8 ; }
else if( sliderPosition < 58 )
{ STARTBIT = 32*96; ENDBIT = 96*96; FLG1 = 9 ; }
else if( sliderPosition < 64 )
{ STARTBIT = 36*96; ENDBIT = 100*96; FLG1 = 10 ; }
else if( sliderPosition < 70 )
{ STARTBIT = 40*96; ENDBIT = 104*96; FLG1 = 11 ; }
else if( sliderPosition < 76 )
{ STARTBIT = 44*96; ENDBIT = 108*96; FLG1 = 12 ; }
else if( sliderPosition < 82 )
{ STARTBIT = 48*96; ENDBIT = 112*96; FLG1 = 13 ; }
else if( sliderPosition < 88 )
{ STARTBIT = 52*96; ENDBIT = 116*96; FLG1 = 14 ; }
else if( sliderPosition < 94 )
{ STARTBIT = 56*96; ENDBIT = 120*96; FLG1 = 15 ; }
else
{ STARTBIT = 60*96; ENDBIT = 124*96; FLG1 = 16 ; }
// ***-------------------------------***
// *** 描画
// ***-------------------------------***
// *** DC <DATAD> SELECT ***
P3_4_DC_Write(1);
SW1 = P0_7_SW_Read();
if( sliderPosition != lastPosition
&& ( FLG1 != FLG2 || SW1 != SW2 ) ){
if( SW1 == 0 ){
for( i=STARTBIT; i<ENDBIT; i++ ){
OLEDREGWRITE(I8B[i]);
}
}
else {
for( i=STARTBIT; i<ENDBIT; i++ ){
OLEDREGWRITE(I8A[i]);
}
}
}
FLG2 = FLG1;
SW2 = SW1;
}
}
// *************************************
// *** LOOP END
// *************************************
}
// *************************************
// *** PROGRAM END
// *************************************






PSoC4のプログラムメモリは32kBなので、
96 x 130 pixcelの画像データを2枚入れたら
リソースの99%を使ってしましましたwww
あれたうみと ひるのすなはま


とりあえず1日でボードが動いたので、
満足満足。


3000円のモトは取れそうです。


次は何、作ろーかなー