LPC1768からLPC546XXへ(Qiita版)

# 1. はじめに
どうも、私が、いままで、いろいろなプロジェクトで使っていた、mbed LPC1768 (以後、LPC1768)のボードが生産されなくなっているようです（主要な電子部品販売店では、在庫0となっています。2024年5月時点）。それで、2017年?頃から出てきた、L-Tek FF LPC546XX (以後 LPC546XX)ボードに移行しようとしています。とりあえず、LPC1768で動いていたプロジェクトの１つが、LPC546XXで動きそうなので、どのように移行したのか、記録を残したいと思います。
# 2. 背景
我々は、Wiki IoT/Bot Computing と名付けた IoTシステムを開発中です。これは、Raspberry Pi をエッジシステム(Bot)とし、PukiWiki ページをサーバシステム（C & C サーバ）としたIoTシステムです。Wiki IoT/Bot Computing はWiki(PukiWiki)によって、人とBotの共同作業を容易にしよう、と思っています。Wiki Iot/Bot Computing では、エッジシステムの先に、TWE-Liteを使った無線センサネットワーク(WSN)を接続することも可能になっていて、WSNの端末として、TWE-LiteとLPC1768を組み合わせたものを使っていました。

![wiki-iot-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/0814bd6c-3344-c76a-0d53-a12321cfd232.png)

http://www.yama-lab.org/BotComputing-WikiIoT/

また、我々はProject TESLAと名付けたプロジェクトを実施中です。このプロジェクトは、規格化した部品を使って組み立てられた「物」の構造・機能・状態の情報を外部に吸出し、その情報を遠隔地に転送し、遠隔地でその情報を受信し、遠隔地にある規格化した部品を使って、送信元の「物」と同じ、構造・機能・状態を持つ「物」を組み立てることにより、形だけでなく、内部構造や機能も含めて、遠隔地への転送を実現しようとするものです。現在、規格化した部品の例として、正６面体のテスラダイスと名付けた部品を開発中です。このテスラダイスも、中に LPC1768を組み込んで使っていました。


![tesla-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/a24e5e1d-55d1-4891-0ea6-0b60934a7386.jpeg)

https://www2.yama-lab.org/~yamanoue/wiki/index.php?ProjectTesla

https://protopedia.net/prototype/2730

以下がLPC1768の端子割り当て図です。

![LPC1768-pinout-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/94d05631-d953-8d16-e384-4a10fccac887.png)


ところが、2020年頃から、主要な電子部品販売店から、LPC1768の在庫が無くなってきているようです。また、LPC1768で使っていたオンラインコンパイラが、2022年12月より、使えなくなってしまいました。

https://qiita.com/qa65000/items/f84aab1ae449cbb902ba

そこで、オンラインコンパイラで開発していたプロジェクトを、 Keil Studio Cloud に移したのですが、mbed OS (mbed OS2)がdeprecatedになってしまい、mbed OS5に移行せざるをえなくなってしまいました。 LPC1768で mbed OS 2 から mbed OS 5に移行を試みているのですが、簡単にはできず、いまだにエラーが消えないプロジェクトが残っています。

以下、苦労している書き換え必要か所です。
- SD
https://qiita.com/TwDaiki/items/3370cb777d0c2dd3396e
- UART(Serial)
https://kajiyaken.hatenablog.jp/entry/2021/08/17/014810
- タイマー割込み(ticker)
https://forums.mbed.com/t/mbed-os-5-ticker/16357

現時点で、以下のような修正を行って、一部のプロジェクトのコンパイルは通るようになりました。

- 今までのSerial を、RawSerialに書き換える
- Ticker の attach を attach_us に書き換える

これは他のmbedのボードでも同じではあるのですが、どうせmbed OSの ver. up をするためにプログラムを書き換えるのであれば、LPC1768以外のボードに移行した方が良さそうです。

https://en.wikipedia.org/wiki/Mbed

また2024年5月時点で、USB Cable で LPC1768 を Windows 11のPCと接続して、USBのUARTのterminalを開こうとすると、com port が見つからなくなりました。driver を update しようとしても、update できませんでした。

# 3. ということで L-Tek FF LPC546XX
LPC1768はもう使えなくなりそう、ということでMbed のboardのページを見ていたところ、LPC1768によく似たボードが見つかりました。これがL-Tek FF LPC546XX です。

https://os.mbed.com/platforms/L-TEK-FF-LPC546XX/

端子割り当て図もLPC1768とよく似ています。一見、Serial (UART) が１つ少ないくらいです。RAMもLPC1768が32kBだったのが200kBと大分増えて、使いやすそうです。

![LPC546XX-pinout-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/56b9f6d8-f5bf-a775-4b3e-ddc07c2bbd73.png)

# 4. ところが　(その１)
コンパイル時に、以下のような"list index out of range"というエラーが出てコンパイルが止まりました。
オンラインのkeil mbed cloud ではこのようなエラーは出ていませんでした。

![error_list_out_of_range_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/29894c6f-7f0b-e504-45f5-4de521eabe35.png)

どこでエラーが出ているか、ソースコードの一部をコメントアウトしたりしながら、探ると、どうも、漢字（日本語）が入ったコメントがあるとエラーが出ているらしいことがわかりました。コメントを英数字に書き直すことでこのエラーが出なくなりました。

# 5. ところが　(その２)
RAMをちょっと沢山使うプログラムをLPC1768からLPC546XXに、新しく使い始めた、Keil Studio Cloud 上で移植しようとしたところ、コンパイルは通るのだけど、実行時に動かない現象が発生しました。コンパイル結果を見ると、200kBあるはずのRAMが20KBになっていました。

https://forums.mbed.com/t/200kb-20kb-new-out-of-memory/21815

この問題を解決するためには、設定ファイルのheap領域の宣言文を書き換える必要があることを教えていただきました。しかしながら、オンラインのKeil Studio Cloudでは書き換えることができず、オフラインのmbed studio で書き換える必要がある、ということでした。

https://os.mbed.com/studio/

そこで、手元のPCにmbed studioをinstall し、
以下のページなどを参考にしてプログラムを作成しました。このとき、OSを、mbed OS 5.15.9 (2024年5月時点)としています。そして、プロジェクトディレクトリの、

[ < workspace > ] > [ < project > ] > mbed-os >
targets > TARGET_NXP > TARGET_MCUXpresso_MCUS >
TARGET_MCU_LPC546XX>device > TOOLCHAIN_ARM_STD > 
LPC54682J512.sct

の #define Heap_Size 0x00400 を、例えば#define Heap_Size 0x1F000 に変更して、RAMの容量を増やすことができました。

![mbed-54xx-after-modi-ram-size-0512-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/f0935b20-a05f-201e-54c4-11cce568938c.png)


# 6. ところが（その３）

コンパイル（コンパイル）は通るのですが、実行を行うと、以下のような"pinmap not found" というエラーが出ました。

![run_time_error_20240512_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/84db7b8c-86df-736c-db3f-793e957836b6.png)


Webで検索するなどして調べると、どうも、端子(Pin)の番号と、それに割り当てた
役割が異なると出てくるエラーのようです。

以下はLPC1768(左)とLPC546XX(右)の端子配置図を並べた図です。赤い丸で囲んだ部分と、右にP0_xxとP1_xxがついているのと、USBコネクタが違うことはすぐに分かります。

![lpc1768-546xx-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/60c12d65-975d-1237-0c6d-1916d7bb059c.png)

もう一度、端子の割り当ての左右の図を、よく見くらべると、上の、赤い丸印で囲った部分の他にも異なる部分があるのがわかりました。
これを拡大したのが以下の図です。左がLPC1768、右がLPC546XXです。

![lpc1768-546xx-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/585767/5189aec5-7923-1c44-e7d2-ac48f6f7286b.png)

LPC1768とLPC546XXでは、rxとtxの割り当てが逆であることがわかります。
ということで、Serial(UART) の rx と tx を交換して、動くようになりました。

# 7. ところが　(その４)
LPC546XXのpinoutの図のちょっと下に、

p15:
supports analog input for measuring 4-20 mA
supports digital input only in pull down mode
does not support digital output

という記述がありました。p15をデジタル入力として使おうと思っていたのですが、つねに、pull down であるのと、いろいろ実験をしてみると、この pull down 抵抗が結構小さいことが分かりました（どうも、電流計測をするためのpin なので、当たり前ではありますね）。それと、まだ仕様書からは読み切れていないのですが、p20 は、どうも、つねに、pull up されているように思えます。

ということで、デジタル値の入力を行う部分で、p15とp20 を避けるように配置することで、入力ができるようになりました。

もう一つ、p29 と p30 は入れ替わっているように思います。

# 8. ところが　(その５)

LPC1768を使ったTesla Project では、GPIOのうち、６つをデジタル入力とし、赤外線フォトトランジスタ、[L-31ROPT1C](https://akizukidenshi.com/catalog/g/g104213/)のコレクタを3.3V、エミッタに47KΩの抵抗をつないで、GNDと接続し、エミッタと抵抗の接続箇所をこのデジタル入力に設定したGPIOに接続して赤外線の検知を行っていました。ところが、LPC1768をLPC546XXに置き換えると、光が当たっていない時にLow になるはずの入力が High になっています。真っ暗だと、Low になることもわかりました。いろいろ実験をしていると、なぜか、ちゃんと動くときもあります。それでオシロスコープで入力波形を見ると、矩形波になるはずの入力電圧が、のこぎり波になっていました。[L-31ROPT1C](https://akizukidenshi.com/catalog/g/g104213/)のデータシートをよく読みなおすと、Rise/Fall Time が 15μ sec なのですが、このときの抵抗が1KΩとなっていました。また、フォトトランジスタの特性について記述した以下のようなページも見つかりました。

https://offgridkin.com/archives/909

そこで、エミッタにつないだ47KΩの抵抗を10KΩに変更したところ、うまく動くようになりました。どうも、LPC1768の入力のPullNoneの時の抵抗が、LPC546XXのときと比べて、ずっと小さかったようです。

# 9. 終わりに
なんとか、Project TESLAのテスラダイスが使っているチップは、LPC1768からLPC546XXに移行できそうです。

LPC546XXは、日本の主要部品屋さんでは扱っていないみたいです。扱ってくれると嬉しいです。
現時点で買うのは日本では私だけかもしれないですが。（Raspberry Pi Pico に移行した方が速い？）
LPC546XXの利用者が増えて便利になると嬉しいです。

# 10. 謝辞
- https://forums.mbed.com/　
で丁寧に私の質問について調べて答えていただいた皆様に感謝します。
- この記事は、2024年5月23日の、IoTLT vol.111のLTの内容に一部加筆・修正した物です。いつもお世話になっている[IoTLT](https://iotlt.connpass.com)の関係者の皆様に感謝します。
- この活動（研究）の一部は科研費　基盤研究(C) 21K11858 の補助を受けています。