ラベル Arduino の投稿を表示しています。 すべての投稿を表示
ラベル Arduino の投稿を表示しています。 すべての投稿を表示

2020年12月3日木曜日

Arduino(ESP32)にタッチパネル液晶

アマゾンでタッチパネル付きのLCDが格安で販売されていたので

買ってみました。

WayinTop 2.8インチ TFT液晶モジュール 240x320 SPI ILI9341搭載 3.3V/5V タッチパネル タッチペン付属 10KΩ抵抗器付属 ジャンパーワイヤー付属

なんと、ピンコネクタケーブル付きで直ぐに使える

ってことで早速サンプルを色々と動かしてみました。

サクサク動くしとても使いやすいですね


で、同時に購入したLCDの乗っかったESP32

WINGONEER T-Display ESP32 CP2104 WiFi Bluetoothモジュール1.14インチ用LCD開発ボード

タッチパネルは無いけどこれもイイですね。


ただし、重大な問題を発見!!

LCDを変える毎にライブラリをイジらないとダメだって???

それじゃライブラリの共有化ができない(T T)


そこで、なんとか頑張って共有化にチャレンジしてみました。


がっ、まだ上手く行っていません。

取り敢えずLCDを変えた場合でも最小の変更ということで

以下の方法で逃げています。


まずはライブラリフォルダ中のlibraries\TFT_eSPI\User_Setup.h

このファイルを以下のようにコメントアウト編集します。

/*▼

#define ILI9341_DRIVER

*/

/*▼

#define TFT_CS   PIN_D8  // Chip select control pin D8

#define TFT_DC   PIN_D3  // Data Command control pin

#define TFT_RST  PIN_D4  // Reset pin (could connect to NodeMCU RST, see next line)

*/


そして


Arduino\libraries\TFT_eSPI\User_Setup_Select.h

このファイルの以下の行の前に色々と追加して

#include <User_Setup.h>           // Default setup is root library folder

こんな感じにしました。
//▼TFT_eSPI.cppを単体でコンパイルしてしまうのでスケッチ内で#defineしても未定義になってしまう
//#define TTGO_ESP32
//#define ILI9341

#if defined (TTGO_ESP32)
#pragma message "found the TTGO_ESP32 so use Setup25_TTGO_T_Display"
#include <User_Setups/Setup25_TTGO_T_Display.h>    // Setup file for ESP32 and TTGO T-Display ST7789V SPI bus TFT
#pragma message "found the TTGO_ESP32 so use ST7789_DRIVER"
#define ST7789_DRIVER      // Full configuration option, define additional parameters below for this display
#elif defined (ILI9341)
#pragma message "found the ILI9341 so use TFT_ILI9341_TP"
#define ILI9341_DRIVER
#define TFT_MISO 19
#define TFT_MOSI 23
#define TFT_SCLK 18
#define TFT_CS   15 // Chip select control pin
#define TFT_DC    2 // Data Command control pin
#define TFT_RST   4 // Reset pin (could connect to RST pin)
#define TOUCH_CS  5     // Chip select pin (T_CS) of touch screen
#elif !defined(ILI9341) && !defined(ST7789_DRIVER)
#pragma message "not found ILI9341 or ST7789_DRIVER"
#define TFT_CS   PIN_D8 // Chip select control pin D8
#define TFT_DC   PIN_D3 // Data Command control pin
#define TFT_RST  PIN_D4 // Reset pin (could connect to NodeMCU RST, see next line)
#else
#endif
//▲

#include <User_Setup.h>           // Default setup is root library folder

これで、頭の行の#define行をLCDに合わせてコメントアウトするだけです。
↓使用するLCDに合わせてコメントを外します。
//#define TTGO_ESP32
//#define ILI9341

本当はスケッチ内の#defineだけで処理できれば嬉しいのですが
スケッチのコンパイルが終わった後に何故かTFT_eSPI.cppを単体でコンパイルしてるようで
その際にスケッチの#defineを読まないので対処できませんでした。



また、日を改めてチャレンジしてみます。

一応ファイルは以下でダウンロードできます。



2015年11月7日土曜日

ArduinoでSPIの双方向通信をしてみた

SPI(Serial Peripheral Interface)で通信したいよ~♪
って言われたので作ってみた。

はじめは何故Slaveから送信できないのか分からなかったけど、
CSがアサート状態だと送信レジスタに書けないのね。

だからMasterがちゃんとSlaveを気遣ってやらないとダメなんだ。
つまり、奴隷に働いてもらいたかったら、いいご主人様にならないといけない
ってことね♪

/* * SPI Master * UARTから1Byte受け取ってSPIで送信する * SPIから1Byte受け取ってUARTにHEXを送る * (注)Master側がCSをDisableにしてあげないとSlaveは送信レジスタにデータを書けないよ * * CS - to digital pin 10 (SS pin) * SDI - to digital pin 11 (MOSI pin) * CLK - to digital pin 13 (SCK pin) */ #include <SPI.h> #define ouSpiSS 10 //SPI Select void setup() { //UARTを設定するよ Serial.begin (115200); Serial.println("SPI Master"); //SPIをMasterに設定するよ pinMode (ouSpiSS, OUTPUT); //SPI Select SPI.setBitOrder(MSBFIRST); //LSBFIRST / MSBFIRST SPI.setClockDivider(SPI_CLOCK_DIV128); //取り敢えずは最遅で設定するよ SPI.setDataMode(SPI_MODE0 ); //アイドル時SCKはLow 立ち上がりでラッチ SPI.begin(); //SPIをEnableにするよ } void loop(){ char cc; char re; cc = Serial.read(); //UARTから1byte受信 if(cc != -1){//受信データあり? //SPIに1Byte送信するよ digitalWrite(ouSpiSS, LOW); //SPI Select SPI.transfer(cc); //SPIに1Byte送信 digitalWrite(ouSpiSS, HIGH); //Slaveが返せるようにしてあげる delayMicroseconds(100); //Slaveが返す準備ができるまでちょっと待つ //SPIから1Byte受信するよ digitalWrite(ouSpiSS, LOW); //SPI Select re = SPI.transfer(0); //ダミー送信しながら受信するよ digitalWrite(ouSpiSS, HIGH); //SPI Select解除 Serial.println(re,HEX); //受信データをUARTにHEXで送信 } } /* * SPI Slave * Masterからの小文字を大文字に大文字を小文字に変換して返す * (注)Master側がCSをDisableにしてくれないとSlaveが送信レジスタにデータを書けないよ * * CS - to digital pin 10 (SS pin) * SDI - to digital pin 11 (MOSI pin) * CLK - to digital pin 13 (SCK pin) */ #include <SPI.h> void setup (void) { //SPIをSlaveに設定するよ pinMode(MISO, OUTPUT); //送信ポートを出力にする SPI.setBitOrder(MSBFIRST); //LSBFIRST / MSBFIRST SPI.setDataMode(SPI_MODE0 ); //立ち上がりでラッチ SPCR |= _BV(SPE); //SPI Enable SPI.attachInterrupt(); //SPI割り込み開始 } // SPI割り込み処理 ISR (SPI_STC_vect) { byte cc = SPDR; //SPIの受信バッファから取得 if(isupper(cc)){//大文字? SPDR = tolower(cc); //小文字に変換して送信バッファに書き込むよ } else{//大文字以外? SPDR = toupper(cc); //大文字に変換して送信バッファに書き込むよ } } //メインループは何もしてないよ void loop (void) { }

2014年5月28日水曜日

Arduinoでタッチセンサ

ちょこちょことググっていたらioポートをタッチセンサとして使えるってのを発見しました。
静電容量式タッチセンサで遊ぶ

何これ、面白うそうって事で
建築発明工作ゼミ2008さんの所からソースを頂いて早速動かしてみたところ

どうも触られる側、つまりセンサ及びマイコン側の環境で誤動作しやすかったので
色々と試して実用化できそうな気がしてきました。

一応現象としてはタッチを話した後に誤作動していたのでタッチ部に貯まった電荷が
逃げ切れていない為と思われるので一旦入力ピンを出力にして貯まった電荷を
逃しています。


まだ、課題としてタッチ側の面積を変えると誤動作もありましたので更に確認してみたところ、
タッチ部の面積と通常時の時間の長さが比例して伸びるだけで
タッチした時の時間はそれほど変化しませんでした。
つまり、コンデンサを並列に繋ぐようなものなので当たり前ですね。
そんなわけで自動キャリブレーション的な事もできないことはないと思いますが
タッチ面積を極端に大きくすると通常時の不安定さが増すだけだし
常識的なタッチ面積であれば実用には大丈夫だと思います。



通常時波形:緑=タッチコントロール出力 黄=タッチ入力




タッチ時波形:緑=タッチコントロール出力 黄=タッチ入力








//
//ioポート式タッチセンサ評価プログラム
//

#define LED_OUT  13     //LEDでタッチセンサのon/off表示
#define TOUCH_MON  12   //タッチセンサモニタ
#define TOUCH_OUT 11    //タッチセンサコントロール
#define TOUCH_IN  10    //タッチセンサ入力

#define TOUCH_AV  3     //移動平均回数
int touchLv=40;         //タッチ判定値
int touch=0;            //フィルタ用変数

int  touchMng(void)
{
  int aa=0;    //静電容量変化量の変数を用意
  unsigned long touchTm;    //タッチ時間保持

  pinMode(TOUCH_IN,INPUT);  //タッチ入力設定
  digitalWrite(TOUCH_OUT, HIGH);  //タッチ出力ピンをHIGHで出力
  digitalWrite(TOUCH_MON, HIGH);  //入力モニタ用出力
  //タッチ入力がHIGHになるまでをカウント
  //※HIGH→LOWの変化では検出不能でした
  touchTm = micros();
  while (digitalRead(TOUCH_IN)!=HIGH){
    if(micros()-touchTm > touchLv) {
      break;
    }
  }
  digitalWrite(TOUCH_MON, LOW);
  aa = micros()-touchTm;             //変化時間をμSecで取得
  digitalWrite(TOUCH_OUT, LOW);
  pinMode(TOUCH_IN,OUTPUT);    //入力を一旦出力にして貯まった電荷を逃します
  delay(1);

  Serial.print(touchLv);
  Serial.print(" \t");
  Serial.print(aa);
  Serial.print(" \t");
  Serial.print(touch);
  Serial.print(" \t");

  //加重移動平均
  //touch += aa-touch/TOUCH_AV;
  //return(touchLv*TOUCH_AV &gt; touch ? 0 : -1);
  //単純移動平均
  touch += -touch/TOUCH_AV + aa;
  return(touchLv > touch/TOUCH_AV ? 0 : -1);
}


void  loop(void)
{
  if(touchMng() == 0) {
    Serial.println("    off");
    digitalWrite(LED_OUT, LOW);
  }
  else {
    Serial.println("on");
    digitalWrite(LED_OUT, HIGH);
  }
}


void setup(void)
{
  Serial.begin(9600);          //シリアルでモニター

  pinMode(TOUCH_OUT,OUTPUT);    //タッチ出力をデジタル出力
  pinMode(TOUCH_IN,INPUT);      //タッチ入力をデジタル入力
  pinMode(TOUCH_MON,OUTPUT);    //タッチ入力をモニタ出力
  pinMode(LED_OUT,OUTPUT);      //タッチ入力をモニタ出力
}



2014.06.19追記

専用IC使ったタッチセンサってどうなってんだ?
ってことで波形見てみました。



緑が通常状態で黄色がタッチしている状態。
2μSecぐらいのパルスを出して、触ると電圧が半分ぐらいに落ちてますね。

2017.11.20 追記
新たに「Arduinoでタッチセンサ その2」を書いてみました。
http://yuzumemo.blogspot.jp/2017/11/arduino.html