すっかり寒くなってしまいましたね...
朝、ふとんから出るのが一苦労でございます。
みなさまは、どうおすごしでしょうか。
ひさびさの電子工作ネタ。今回は、
PSoC4の開発キット「PSoC4 PIONEER KIT」
を入手したので、あそんでみました~~。
というレポートです
開発キットは、秋葉原の秋月電商で買いました。
PSoC miniProgの横にふつーにぶら下がっていました。
3000円でした。お手頃価格です。
中身は、ボード本体とUSBケーブル。
あとはホームページのアドレスが書かれた
説明書がぺらんと1枚のみ。
開発ツール、マニュアル等のCDは付いて
ません。潔いですね。
ボードはこんな感じ。
Arduinoとピンコンパチ(最近の流行?)に
なってるので、見た目Arduinoっぽい。
右側にウリのスライダー型タッチセンサー
が付いています。
左にプログラマ制御用としてPSoC5が
いたりなんかして、モッタイナイ感が
漂っております。
さて、それでは!
さっそく何か動かしてみまスかー
というわけで、
外付けのOLED(SPI入力)と
タッチセンサーを使って
ボードを動かしてみました。
結果は動画を作ったので、
こちらをご覧頂けると幸いです。
【ニコ動】
以下、プログラム作成概要です。
【1】開発環境:
PSoC3/PSoC5と同様、PSoC Creatorです。
慣れると非常に楽ちんなので、
開発環境が一緒なのはありがたいです。
回路図に使いたい部品をぺこぺこ置きます。
タッチセンサとSPI(OLED制御用)、
入出力ピン置いて、今回試した部品はこれだけ。
ところでPSoC4のアナログ・マクロですが、
ADCとオペアンプ、コンパレータだけ、
というのが少し寂しいですね。
せめてDACくらいはちゃんと乗せて
欲しかったなー。という感想を持ちました。
回路図の部品をダブルクリックして
「Linear sliders」をAddします。
中身はよくわからないのでデフォルトで(笑)。
この設定でセンサーは触っている位置により
0~100の数値を返してくれるようです。
クロックは割とどうでも良かったので
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円のモトは取れそうです。
次は何、作ろーかなー