WAVプレーヤーの製作(その12 小型TFT LCD, part2)

先回、小型TFT LCDについて述べたが、まだ諦めきれずに弄っています。

課題は
1.このアイコン背景色の問題
2.タッチパネルが4線式のA/D入力なのでSPIに慣れた身には未体験領域だ。安定度が心配です。
  ソフトも新作を要します。
3.タッチの割り込みはどうやるのだろうか? A/Dの割り込みってあるの? 動作安定するの?

1.は一応の暫定処置ができたので、今回は2.と3.です。

【タッチができるようになりました】
stm32_proj_47.jpg

左右・上下計測を順に行うために、DC電圧出力とA/D計測を順に切り替えながら計測しなければならないので、これは大変かなと覚悟していたのですが、結構あっさりとできました。

ボールペンでスクリーンの真ん中へんを押してます。xは上下、yは左右方向です。
左上にタッチされた座標を表示させていますが、下一桁が0なので、ぴったり安定のように見えてしまいますが、実際の表示はかなり数値がバラツイテいます。

これだけならば、良さそうに思ってしまいますが、実はx、y方向の数値分布がゆがんでます。

stm32_proj_48.jpg

この画像はスクリーン9箇所をタッチして、おおよその値を読んだものです。上の画像とは異なり (x左右,y上下)で表記してます。
スクリーンの中央付近の上下左右電圧を読んで、(0-320,0-240)になるようにスケーリングしてあります。左下がゼロです。

ところが、左右・上下がかなり歪の大きい値になります。特に、左側の上下方向は酷い状態で使い物になりません。

この4線抵抗膜式タッチスクリーンのAD値はタッチしないとほぼゼロで、タッチするとある値以上にピッと上がるので、「アナログウォッチドック」という割り込み機能を使えば(まだ調べていないが)、音楽演奏中に停止時間僅かでボリューム変更ができるのだが、タッチ精度が悪いと操作ができないとなってしまう。

まあ、この小さなTFT液晶は、表示専用か、タッチ機能を使うとしても大雑把な機能に減退されるのかもしれません。


折角、タッチができるようになったので、その処理内容を備忘録とします。
-----------------
私はこれまでpicマイコンを使ってきたので、後閑さんのタッチスクリーンの記事を参考にさせて頂きました。
ここにはタッチスクリーンの原理が、とっても解りやすく図解されているので、stm32のソフトに反映するのがとても楽にできました。

・stm32側で用意するハード
 1) アナログ入力とGPIO入力に切り替えできるピンを2個、これを LCDタッチの y-,x- 端子に配線する
 2) GPIO出力と入力が切り替えられるピンを2個、 これを LCDの y+,x+端子に配線する
(picと違い、stm32には訳も無いことですね)
 3) ノイズ防止のため、この4ピンは10kぐらいの抵抗でプルダウンしておく。
 4) A/D入力に使うピン2個には、これもノイズ防止のため0.1uF程度のコンデンサをGND間に付ける。

・ソフト
動作と計測の手順は
 計測してもらう側:座標数値を大きくしたい側に+3V、反対側を0(GND)にする
 計測する側   :一方をアナログ計測、もう一方を入力(フローティング)とする → 電圧を計測する

 以上の動作をするチャンネルを切り替えて別方向の座標を計測する。

【GPIOを切り替えてx,yを交互に計測する部分】
この後で、計測した10回の rPoint データの真ん中辺3点の平均値を使ってます。

void readTouch(void)
{
  uint16_t rPoint[2][10],temp = 0;
  uint8_t t,t1,count;

  // OUT DC GPIOB_Pin7(Y+), IN DC GPIOA_Pin3(Y-)
  GPIO_Conf_touchY();     // y 方向への切り替え

  GPIO_SetBits(GPIOB,GPIO_Pin_7);   //PB7(Y+) is OUT DC
  GPIO_ResetBits(GPIOA,GPIO_Pin_3); //PA3(Y-) is IN DC
  GPIO_ResetBits(GPIOB,GPIO_Pin_6); //PB6(X+) is IN DC
                                      //PA2(X-) is Analog IN
  delay_ms(5);  // 安定時間
  for(count = 0; count<10; count++ )  //10回計測する
    {
      Present_ParamY = ReadADC1(ADC123_IN2_CH);   //STBee.hへDefine追加してます
      delay_ms(1);
      if(Present_ParamY > 3000 || Present_ParamY < 5000){
          rPoint[0][count] = Present_ParamY;
      }
    }

  // OUT DC GPIOB_Pin6(X+), IN DC GPIOA_Pin2(X-)
  GPIO_Conf_touchX();   // x 方向に切り替える

  GPIO_SetBits(GPIOB,GPIO_Pin_6);   //PB6(X+) is OUT DC
  GPIO_ResetBits(GPIOA,GPIO_Pin_2); //PA2(X-) is IN DC
  GPIO_ResetBits(GPIOB,GPIO_Pin_7); //PB7(Y+) is IN DC
                                      //PA3(Y-) is Analog IN
  delay_ms(5);  // 安定時間
  for(count = 0; count<10; count++ )
    {
      Present_ParamX = ReadADC1(ADC123_IN3_CH);  //STBee.hへ追加
      delay_ms(1);
      if(Present_ParamX > 3000 || Present_ParamX < 5000){
          rPoint[1][count] = Present_ParamX;
      }
    }


【y方向へ切り替え】
void GPIO_Conf_touchY(void)
{
  //GPIOD,GPIOE clock set
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);

  GPIO_InitTypeDef GPIO_initstruc;

  // OUT DC (Y+) pin = PB7
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_7;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_initstruc);

  // IN DC (Y-) pin = PA3
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_3;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_initstruc);

  // IN DC (X+) pin = PB6
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_6;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_initstruc);
  ADC_InitTypeDef  ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | ADC_IN0_3_GPIO_RCC, ENABLE);

  GPIO_InitStructure.GPIO_Pin = ADC123_IN2_PIN;  // PA2(X-) pin is Analog IN
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(ADC123_IN2_PORT, &GPIO_InitStructure);
}

【x方向に切り替え】
void GPIO_Conf_touchX(void)
{
  //GPIOD,GPIOE clock set
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOA, ENABLE);

  GPIO_InitTypeDef GPIO_initstruc;

  // OUT DC (X+) pin = PB6
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_6;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_Out_PP;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_initstruc);

  // IN DC (X-) pin = PA2
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_2;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOA,&GPIO_initstruc);

  // IN DC (Y+) pin = PB7
  GPIO_initstruc.GPIO_Pin=GPIO_Pin_7;
  GPIO_initstruc.GPIO_Mode=GPIO_Mode_IN_FLOATING;
  GPIO_initstruc.GPIO_Speed=GPIO_Speed_50MHz;
  GPIO_Init(GPIOB,&GPIO_initstruc);

  ADC_InitTypeDef  ADC_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;

  /* ADCCLK = PCLK2/6 = 72/6 = 12MHz*/
  RCC_ADCCLKConfig(RCC_PCLK2_Div6);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1 | ADC_IN0_3_GPIO_RCC, ENABLE);

  GPIO_InitStructure.GPIO_Pin = ADC123_IN3_PIN;  // PA3(Y-) pin is Analog IN
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(ADC123_IN3_PORT, &GPIO_InitStructure);
}

この他に、ADチャンネルの設定、読み込みがありますが、一般的な設定なので省略します。



・・・小型化は諦めてプレーヤーを完成させなくてはなりません。




コメントの投稿

非公開コメント

プロフィール

haiga

Author:haiga
私のブログへようこそ!
電気オンチが始めた自作オーディオです
2010/3/17 電子工作をプラスしました。

自作オーディオの楽しみ共有のため、私が作ったパーツ提供をしてます。質問や要望を遠慮なくコメント欄に書き込んでください。

FC2カウンター
その日1回目にアクセスいただいた方の総カウントです
最新記事
最新コメント
最新トラックバック
カテゴリ
月別アーカイブ
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード