
実は数ヶ月前からペスカタリアンになったのだ。
つまり肉、卵、牛乳、バターなど動物性のものは滅多に食べない。
あと、サラダ油、オリーブオイル、ごま油など、油系も滅多に摂取しない。
ワテの主食は魚介類、野菜、玄米、豆乳、果物、ピーナッツ、キノコなどだ。
その結果、体重は10キロ減った。腹の周りの脂肪がほぼ無くなったのだ。
さて、そんなワテはPIC32MKという32ビットPICマイコンのプログラミングに挑戦中だ。
前回記事はこちら⤵️
前回までで、PICマイコンに液晶ディスプレイを接続してSPI通信方式で文字を出力するところまでは成功している。
当記事では、タッチペン、内蔵DACによるサイン波、三角波、方形波の出力に成功したので、その作業過程を紹介したい。
では、本題に入ろう。
PIC32MKマイコンでタッチペンを使う
前回記事で紹介したように現状では下写真に示すように液晶ディスプレイに文字や図形を描画できるところまでは成功している。

写真 PIC32MKマイコンで液晶ディスプレイに文字・図形出力成功
秋月電子で買ったこの液晶ディスプレイはアマゾンなどにも売っている。
この液晶ディスプレイはSPI通信方式で制御するタイプだ。
さて、液晶ディスプレイに文字や図形を表示する機能はChatGPTに協力してもらった結果、案外簡単に実現出来た。
そこで次にタッチパネルの制御に挑戦したのだが、一週間以上悪戦苦闘してようやく成功した。
タッチペンの制御で泥沼にはまった
この液晶ディスプレイ(LCD)の場合には、タッチペン(Touch)の制御もSPI通信方式になっている。
PIC32MKマイコンの場合、SPI1、SPI2、SPI3、・・・のように複数のSPIチャンネルがある。
この場合、以下のような幾つかの制御方式が考えられる。
- SPI1のみを使ってLCD、Touchの両方を制御する。
- SPI1でLCDを制御、SPI2でTouchを制御する。
ワテの場合は最初は前者の方式でやってみたのだ。つまり一つのSPI1チャンネルを使ってLCDとTouchの両方を制御するのだ。
なぜそのようにしたのかと言うと、今回PIC32MKマイコンを使うのも初めてだし、LCD制御のSPI通信なんてのも初めての経験。
そもそもワテがPIC32MKの実験用基板を設計した時点でSPI通信なんて全く知らないので、とにかくネット検索してPICマイコンでタッチペン付きLCDを制御している例を色々探したのだ。
その結果、SPI1のみを使ってLCDとTouchの両方を制御している例が幾つか有ったので、それを真似したのだが、それが泥沼への入口だったのだ。
一つのSPI1でLCDとTouch Pen両方制御は無理があるようだ
ChatGPTさんの協力を得ながら、SPI1を使ってLCDとTouchの両方を制御するC++コードを試したのだが、タッチペンでタッチした場所の(x, y)座標読み取りが正常に動作しないのだ。
この秋月電子の液晶ディスプレイはILI9341と言うICで制御されている。一方、タッチパネルの制御は下写真に示すXPT2046と言うICが使われている。

写真 秋月液晶ディスプレイのタッチパネル制御IC(XPT2046)
このXPT2046は12bit ADCを内蔵しているので、タッチペンでタッチした場所の(x, y)座標は0~4095の範囲の値が得られるはずなのだが、ワテのC++コードではなぜか意味不明な値が帰って来るのだ。
そのコードはワテ自作ではなくてChatGPTさんの生成したコードなので、信頼性は高い。ところが、どんなに試行錯誤しても、全く意味不明な値しか得られない。
一方、液晶ディスプレイの表示自体は正常に動作するのだが。ただし液晶表示とタッチペン操作を頻繁に行うと、PICMKマイコンが固まってしまう事もあるのだ。
そこでワテがChatGPTさんに「ほんまにこのやり方でタッチパネルを動作させる事が出来るのか?」と聞くと、
ChatGPTさん曰く、「一つのSPI1を使ってLCDとTouchの両方を制御することは可能なので、何かの間違いを修正すれば必ず上手く行きます」みたいな反応なのだ。
それを信じて、時間がある時に必死でデバッグしたのだが、タッチした(x,y)座標が正しく読み取れない。
どうやら原因はLCDの描画は20MHzくらいの高速なクロックでも問題ないが、タッチパネルの制御は1MHzくらいが限界のようで、100KHzくらいがお勧めとの事だ(ChatGPTさん)。
なのでSPI1のボーレートを100KHzに変更してやってみたが、それでもタッチパネルが動作しない。
もうお先真っ暗というくらいタッチパネルが動作しない。
と言う事で、SPI1を使ってLCDをとTouchの両方を制御する方式は中止した。
SPI1でLCD、GPIOでTouch Penを制御する
そこでSPI1でLCDを制御して、SPI2でTouchペンを制御する方式を試そうと思ったのだが、そうするとPCBWayさんで作成したPIC32MK用実験基板の配線変更箇所がかなり多くなってしまう。
やれば出来るが、なるべくなら変更箇所は少なくしたい。
そこでChatGPTに相談したところ、SPI1でLCDを制御し、GPIOでTouchペンを制御する方式でも行けるとの事だ。
つまり、LCDはSPI1を使ってSPI通信方式で制御する。
一方、TouchペンはPICマイコンの複数のGPIO端子を使ってソフトウェア的にSPI通信信号を送受信する事で、SPI制御が可能との事だ。これをBit Bangと言うらしい。
それなら実験基板の配線変更も少なくなるので好都合だし。
Bit Bang(ビット・バンギング)方式によるSPI通信は、専用のSPIハードウェアモジュール(SPIペリフェラル)を持たないマイコンの汎用入出力ピン(GPIO)を使い、ソフトウェア(プログラム)で直接SPI信号(SCLK, MOSI, MISO, CS)を制御して通信を行う技術です。
引用元 Google AI検索結果
ということで、下写真のように基板の幾つかの配線を変更した。
![]() |
![]() |
写真 Bit Bang(ビット・バンギング)方式でSPI通信を行うために実験基板の配線変更した
下写真は配線変更後に組み立て途中の様子を示す。

写真 配線変更後に組み立て途中の様子
さて、実験再開だ。
SPI1でLCDのみを制御成功
配線変更後に、まずはLCD表示を試したら下写真のように問題なく描画出来る。

写真 SPI1でLCDのみを制御するのは成功
この場合、SPI1のボーレートはHarmonyの画面でデフォルトの20MHzになっているが、それでも全く問題なく高速に描画出来ている。
SPI1でLCDとTouchの両方を制御していた時には、遅いTouchに合わせるためにボーレートは1MHzにしていたのだが、それでもTouch機能が動かなかった。
なお、前回記事ではHarmony Legartと言うグラフィックライブラリを使ってLCD表示を行う予定だと記載したが、Harmony Legartは少し試したのだが使い方が分からなかったので、今のところ中断している。
今後、再挑戦したいと思っている。
さて、次はTouch機能だ。
Bit Bang方式でタッチペンの制御に成功
Bit Bang方式でタッチペンのタッチ座標(x,y)を読み取るC++コードもChatGPTさんに生成してもらった。
今までは座標がまともに取得出来なかったが、ChatGPTさん生成のBit Bang方式のコードでは、タッチした場所に応じて、それに近い場所の座標が正しく取得出来ている!
あとは、LCDの四隅(左上、右上、左下、右下)をタッチして、それらの場所の(x, y)のADC出力値を取得しておく(ADC座標系)。
そのADC座標系とLCD座標系(0,0)~(319,239) との間の線形な変換(キャリブレーション)を行えば、下写真のようにタッチした位置のLCD座標を正確に求める事が出来るので、その場所に点を描画すればお絵かき機能を実装することが出来た。

写真 即席で作成したタッチペンのお絵かき機能
下動画ではタッチペンでお絵かきをやっている様子を撮影した。音声は無し。
動画 タッチペンでお絵かき機能に成功した様子を撮影(音声無し)
と言うことで、当初のSPI1でLCDとTouchペンの両方を制御する方式は高速動作するLCDと低速動作のTouchペンを一つのSPI1で制御するのは無理があるようだ。
理論上は可能なのかも知れないが、今回採用した秋月のタッチペン付き液晶ディスプレイではワテが必死で試した限りでは、実現不可能だった。
なのでもし読者の皆さんも類似の実験をやるなら、SPI1とSPI2を使ってLCDとTouchを別々に制御するか、あるいはSPI1でLCD制御しBit BangでTouch制御する方式(ワテ採用)がお勧めだ。
なお、今回のタッチペンのプログラミングに関して、PICマイコンを使った類似の例を探したのだが、あまりヒットしない。
一方、ArduinoやSTM32マイコンやRaspberry Piを使ってこの秋月タッチペン付き液晶ディスプレイを制御する例は多数あったのだが。
でもPICマイコンを使ってこのタッチペン付き液晶ディスプレイの制御でトラブったと言うようなブログ記事やフォーラムへの投稿も見付からない。
ということは、この件はワテ固有の問題であり、世間の人は難なくPICでこの液晶ディスプレイやタッチペンの制御に成功しているに違い無いと思って、諦めずにChatGPTに教えてもらいながらやったら無事に成功した。
今回のタッチペンの例に限らず、何かのトラブルに直面して必死でネット検索しても類似の例がヒットしない場合には、それはワテが世界で初めて発見した難解な問題なのではなく、単なるうっかりミスややり方が間違っているなどの場合が殆どだ。
殆どと言うより100%と言っても良いだろう。
内蔵CDAC1を使ってアナログ波形を出力する
さて、次は内蔵CDAC1を使ってアナログ波形を出力する実験だ。
というよりも、実は内蔵DACの出力実験は、タッチペンの制御で八方塞がりになっている時に気分転換でやってみたら、案外簡単に成功していたのだ。もちろんChatGPTさんに頼りまくりだが。
まずは10KHzの方形波を出力してみた(下写真)。

写真 内蔵CDAC1で10KHzの方形波を出力
PICマイコンを使って内蔵DACから波形を出力するにはタイマー割り込みを使ってDACにデータを送る。
さらに内蔵のDMA機能を組み合わせると、CPUを介さずにメモリからDACに高速データ転送が出来るので、上写真の例ではTMR+DMAの方式でやっている。
下写真は正弦波を発生させた例だ。

写真 正弦波を発生させた例
上写真の正弦波の場合には、データ点数が少ないと滑らかな正弦波にならず階段状になる。
かと言って、あまりにデータ点数が多いとDACの動作が付いていかないようで、10KHzの予定が3.597KHzになっている。
なお、出力の振幅は±13Vくらいあるが、これはPIC32MK1024GPK064は3.3V動作なので、DAC出力も -0.3 ~ 3.6 Vくらいの範囲になるのだが、ワテ設計の実験基板はその電圧範囲を ±15Vに拡大するようにレベルシフトやゲイン調整回路をオペアンプで実装している。
この実験でそのオペアンプ回路もワテの設計通りに正常動作している事が確認出来たので一安心だ。
次は三角波だ。

写真 三角波を発生させた例
三角波の場合は方形波と同じくデータ点数が数点で良いから正弦波に比べてかなり高い周波数まで出力出来る。
少し実験した限りでは数百キロヘルツくらいまでは綺麗に出力出来た。
なので、これらの機能を上手く使いこなせば、パルスジェネレータや任意波形発生器を自作する目処が立った。
なお、この波形発生実験ではPICマイコンは内蔵クロックで動作させているが、外部に追加している48MHz MEMSクロックでもPICマイコンは動作することは確認済だ。
なので外部クロックで動作させながら波形出力すれば、より正確な周波数で出力出来ると期待出来る。
例えば10KHzで出力すれば今回の実験では10.08KHzなどになったが、外部クロック動作ならピッタリ10.000KHzくらい正確に出力出来るかもしれないので、今後はそのあたりも実験したい。
まとめ

DIYやプログラミングで行き詰まっても、諦めずに挑戦し続ければ解決策は必ず見付かる。
当記事では、ワテ設計のPIC32MKマイコン用汎用実験基板にタッチパネル付き液晶ディスプレイを接続して文字・図形表示、タッチペン座標読み取り、お絵かき機能を実現するまでの作業過程を紹介した。
次に、内蔵DACを使った波形発生の実験結果を紹介した。
SPI通信でトラブって泥沼にはまったが、最終的にはSPIとBit Bangを併用してLCDとTouchパネルの独立制御に成功した。
今回の作業ではChatGPTさんの協力によって作業効率は数百倍くらい上がったと実感している。
従来なら自分でプログラムを書いて必死でデバッグ作業を行っていたが、最近では自分でプログラムを書くことは滅多にない。
全てChatGPTさんにソースコードを生成して貰っている。もちろんChatGPT生成のコードにバグや間違いがある場合もあるが、自分で0からコードを書くのに比べたらその作業効率はワテの実感では数百倍向上していると思う。
ということで、ワテ設計のPIC32MK汎用実験基板は致命的な設計ミスなどはなく、今のところいい感じで動作している。
PICKIT5を買えばPICプログラミングが可能だ。MPLABは無料ツールだし。
PIC プログラミング キットはPICKIT5よりも安いけれどMPLABでPICKIT5同様に使えるようだ。
(続く)






















コメント