2019年8月4日日曜日

移転しました


どうせ HelloWorld させたら、あとはM5Stockになっているだろうと思っていたM5Stack

遊び始めたら、いろいろと意外と長続きしている…というか沼にハマりつつあるので(笑)ブログを移転することにしました。

↓ 新しいブログはこちら ↓
https://phillowocompile.blogspot.com/

こっちのM5Stack関係の記事は折に触れて移し替えたいと思います

ほとんど読者のいないような弱小ブログですけど、今後もよろしくw

2019年6月14日金曜日

M5Stackを使って動画プレーヤーもどきを作ろう!


■はじめに


あくまでも「もどき」です(^^;

しかもM5Stack単体で動画を再生しているわけではないし…

事の発端は↓こんな記事

ピカチュウ(ハリウッド版)をずっと見ていたい人のためのデバイス - nomolkのブログ http://nomolk.hatenablog.com/entry/2019/05/10/120000


これを「M5Stack」でもできないだろうか?という話がM5Stack界隈からのツイートからちらほらと…

・・・んでも、M5Stackはmp4デコーダーを積んでいるわけでもないし、FFmpegも無いしなー┐(´д`)┌という問題が。

そこで、M5Stack用のarduinoスケッチに、らびやん氏が作成した「tcpreceiver」というのがある。

https://github.com/lovyan03/M5Stack_LovyanToyBox.git

これを使って、Youtubeを再生している母艦からスクリーンショットをポコポコとM5Stackに送り込むのが手っとり早そうではある。

ちょっとインチキ?っぽいけど、まあいいや。

(余談)自分が使った母艦はLinuxMintだけど、原理的にはラズパイとかからもできるはず。(初代ラズパイだとyoutube-dlが重すぎて使い物になりませんでした(T^T)


■ 用意するもの

Xvfb Linuxとかで仮想のディスプレイのフレームバッファを提供するXサーバーのソフト。ラズパイのように元々画面を持っていないようなシステムでもユーザーが設定した解像度のモニターにX-Windowsシステムを用意しておくことができるわけだ。

mpv いわずとしれたコマンドラインから動画を再生するためのソフト。youtube-dlと組み合わせるとyoutubeの動画を再生することができる。

libjpeg スクリーンショットの画像データをjpegに変換するためのライブラリ。無ければ「libjpeg-dev」のパッケージをapt-getしておこう。

libXtst Xvfbが仮想のスクリーンなら、こちらはプログラムから仮想のイベントを送り込む関数が含まれているライブラリ。これもあらかじめapt-get install libxtst-dev しておこう

もちろんXvfbもmpvも、持っていなければapt-get installから普通にインストールすることができる。

youtube-dlについては https://ytdl-org.github.io/youtube-dl/download.html にダウンロード方法が書いてある。ちょくちょくと更新されているので、こまめに更新しておくといいかもしれない。youtubeがちょくちょくと仕様変更が行われるからだ。仕様変更が行われる理由はよく知らない


■ さあはじめよう。

おもむろにLinuxシステムを起動して、コンソールに到達しよう。

まずは仮想ディスプレイのXvfbを起動する。下の例では「:1」という名前のディスプレイをQVGAの16bitカラーで起動しましょう。という指定だ。そしてフレームバッファの状態を/tmpディレクトリ以下から取得できるようなる。

$Xvfb :1 -screen 0 320x240x16 -fbdir /tmp &

こんな感じ。
※Xディスプレイの名前は「:(コロン)+数字」で表すのが一般的なようだ。

オプションの詳細などはmanページを参照すればよくわかる。さすがman。

次にこの仮想Xディスプレイ上にmpvを走らせる。
youtubeの動画を再生するのであれば、youtube-dl用のオプションをつけるといい。


$export DISPLAY=:1
$mpv --ytdl-format=242 --loop=force https://www.youtube.com/watch?v=NQhDJBDpvYs

環境変数DISPLAYに「:1」を指定してから実行している。

--ytdl-format="[height<=240]"とかでもいいけれど
youtube-dlのフォーマットと同じオプションも使えるらしいのでいろいろ試してみるのも面白いかも。

249          webm       audio only DASH audio   60k , opus @ 50k, 43.25MiB
250          webm       audio only DASH audio   76k , opus @ 70k, 57.71MiB
171          webm       audio only DASH audio   93k , vorbis@128k, 69.77MiB
140          m4a        audio only DASH audio  134k , m4a_dash container, mp4a.40.2@128k, 107.52MiB
251          webm       audio only DASH audio  160k , opus @160k, 121.60MiB
160          mp4        256x144    144p   74k , avc1.4d400c, 30fps, video only, 23.26MiB
278          webm       256x144    144p  128k , webm container, vp9, 30fps, video only, 77.67MiB
133          mp4        426x240    240p  131k , avc1.4d4015, 30fps, video only, 38.89MiB
242          webm       426x240    240p  224k , vp9, 30fps, video only, 95.82MiB
ex) mpv --ytdl-format=171 URL

こうすると、仮想ディスプレイ上にyoutubeの動画が再生される。

この時点で確認したい場合は、VNCサーバー&ビューアを用意するといいだろう。
(Linux MintではVNCビューアに「Remmina」を使うことができる)

加えて、Xvfbのオプションで「-fbdir 」を指定しているから、このディレクトリ以下にフレームバッファのファイルができる。そのデータをjpeg化してM5Stackに送り込むプログラム(Sender)を作ることにしよう。

【Sender編に続く】

2019年5月12日日曜日

M5StackからVNC接続してみる

何番煎じくらいかどうかもよくわからないネタ。

githubにaruduinoでVNC接続するソースがあったので、「面白そう!」と思ってチマチマとM5Stack用のコードを書いてみた

https://github.com/phillowcompiler/arduinoVNC

元がESP32+ILI9341でも動いているためか、意外とちょっとした改変でサクっと動き出した。

でも…………

う〜ん。いまいち安定しない…
自分の環境ではプチプチとリセットがかかってしまうorz


時間があれば、ラズパイあたりから/usr/bin/xrandr で320x240のディスプレイを作って、そっから転送するようにしてみよう。

2019年5月9日木曜日

【おっさんほいほい】M5StackでEmiClockをスマートウオッチ化するお話(後編)

■ 前編のあらすじ


平成オワタ\(^o^)/
 ↓
・平成といえば、「時をかける少女」がブームになったよね。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]
時をかける少女 [ 仲里依紗 ]
価格:4096円(税込、送料無料) (2019/5/9時点)
↑さりげなくアフィる(笑)

・でも、平成の時をかけた少女といったら「EmiClock」のEmiでしょ!
 
←EmiClockのホームページ 



・おっしゃ!M5Stackが机の中でStackされとるし、スマートウオッチとして蘇らせるか!



…なんか、ちょっと違う気がするけど、細かいことはこのへんにおいといて(/・_・)/□

さっそく始めてみましょう………っ!!!


■ …その前に!


当然ですが、EmiClockには著作権というものがあります。HPを見る限りでは

・(改変したものを含めて)再配布の禁止
・画像を抜き出した二次利用の禁止

…となっています。昨今のように「いらすとや」とか「東方」の二次利用もOKというコンテンツがありふれていると、いささか厳しいと感じるかもしれません。

しかし前編でも触れたようにEmiClockが作られた時代は「フリーソフト」と呼ばれるものであればどんどん勝手に雑誌の付録CDROMに収録されていたわけですね。

ですから結局は雑誌の出版社だけが儲けて、製作者は「おいコラ!T◯chWinの付録CDに入ってたソフトうごかねーぞ!lzh?なんだそれはおいしいのか?」…という、「パソコン初心者」からのサポート対応だけに追われるということがよくあったようですね┐(´д`)┌

それでフリーソフト製作者も自衛手段として、「再配布禁止」と言わざるを得ない状況だったのかもしれません。

あとは…まだホームページ素材サイトなんてものもあまりありませんでしたから、二次利用OKになりますと、画像だけを抜き出して自分のホームページのアイコンに使ったりする事例が後を絶たなかったのでしょう。そうすると「見えないドレス」のありがたみが(中略)ですしね(ナンノコッチャ

そんなわけで、筆者もM5Stack版EmiClockのソースを公開することができないのです。
ただ、改造方法を示すくらいだったら、たぶん問題ないかと(^_^;


■ 用意するもの


結局、前置きが長くなってようやく本題。ここは悪い記事の見本のオンパレードのようなブログですね^^;

作るのは「時計」なのですが、その機能を一からコードを書くのは非常にめんどくさいので、ここは先人たちの苦労をありがたく利用させていただくことにする。(以下はgithubのリンクになっています)

アナログ時計のサンプル
NTPから時間を持ってくるサンプル

これらを組み合わせればあっという間にNTPアナログ時計が完成する。本当に便利な時代になったものであるヽ(´ー`)ノ

そして、時計盤やEmiの画像をEmiClockのX11版(リンクは窓の杜)ソースから持ってくればOK。ソースを解凍すると、iso-2022-jpコード(!)で書いてあるので日本語が文字化けしているかもしれない。今時のUbubtuだとなかなか相性が悪いのでFireFoxとか適当なウェブブラウザに放り込んでやった方が読みやすいでしょうね(^^;

画像イメージはすでに.hファイルになっているのでメモリ上に展開しよう。展開方法はソースを追えばそんなに複雑ではない。元がRGBカラー指定になっているので、LCD用の565カラーに変換してあげるのも忘れずに。
こうしてメモリ上に描いたデータを最後にLcd.drawBitmapする。



ね!簡単でしょう!?

売りの着せ替え機能ですが、オリジナルは1時間に1回変わるようになっているようです。

でも、自分でコードが書けるのですから……あとはわかってますよね?(⌒▽⌒;)

M5Stackは機種によって加速度センサという素晴らしいものを積んでいるので、筆者はこれを使ってシェイク動作で着せ替えされるようにしています。


2019年5月3日金曜日

【おっさんほいほい】M5StackでEmiClockをスマートウオッチ化するお話(前編)

(注意)この記事は前置きが長いです。すぐに本題に移りたい方は次の記事から。

■ はじめに

M5Stackを買った。



めんどくさい環境構築もやった。

サンプルも少しは動かしてみた。

こうした幾つかの壁を乗り越えてきた勇者たちに次に立ちはだかるのは

「なんだ!結局LチカとかHelloWorldするだけのオモチャじゃん」

という思いであります(笑)

何か面白いネタはないか」と探しているのが、こういうマイコンをいじって遊んでいる人たちの習性だったりするのですね(^▽^;

そうしている間に時は流れ、平成も終わる…。

………そんな時に思い立ったのが

EmiClockをM5Stackでスマートウオッチ化してみよう!

というネタであります(関連性意味不明)。

M5StackのAruduinoなら、こんなちょっとした思いつきもひょいひょいとできちゃいそうです。本当に罪作りなヤツですな。お主もワルよのう。

そして、それを筆者を含めたプログラミング初心者向け講座みたいなブログの記事にしたら、結構自己満足できそうだったので、さっそく始めてみることにしました。Let'sプログラミング!


■ EmiClockとは


なんていうか、シーラカンスのようなソフトです(褒め言葉ですよ!?

↓公式ページはこちら。


こういったバナーとかホームページのデザインそのものもインターネット黎明期のにおいがしますね。いや懐かしいw(当時はみんなジオシティーとかでホームページスペースをレンタルして自分のウェブページを開設することが流行ったものです)

これを見るとパソコンというものがまだまだ一部のマニアのオモチャで、ちょっといいやつになると大学とか企業の研究室くらいにしか無かったような時代に生まれたデスクトップアクセサリです。

当時はコンピューターがCUIからグラフィカルなインターフェイスを備えたものになる過渡期だったので、コンピューターのデスクトップというのはずいぶんと殺風景なものでした。


※画像はWindows上で再現されたX-Window System。これを見てピン!と来る人もいるはず。
筆者はXBillをプレイしたくてLinuxをインストールしたものです(?)

こんな具合にウインドウズシステムがまだ物珍しかったというのもあって、いろんなデスクトップアクセサリが生まれたものです。それを自分のPCにインストールして少しでも賑やかさを増し加えてGEEKっぽい雰囲気を出す時代でした。
(まだインターネットというものもあまり普及していなかったので、雑誌の付録CD-ROMからインストールしたり、ソースコードリストをチマチマと打ち込んでコンパイルしていたこともあったようです)

 ←こんな感じの雑誌がいっぱいあった(駿河屋のHPより)


EmiClockは、そんなデスクトップアクセサリのひとつでした。

しかも当時のコンピューターソフトというのは、どうしてもアメリカ人のセンスというか、なんていうか、いわゆるCoolでバタくさい(死語?^▽^;)雰囲気なものが多かったのですが、EmiClockは日本人好みの、かわいらしいデザインが革新的でした。今で言う「萌え」文化の始まりみたいなものだったのかもしれませんね。

そして、まだPCといえばWindows一強という時代ではなかったので、いろんなプラットフォームに移植されていたりします。


殺風景になりがちだったX-Window系のデスクトップで、アクが強くなくて・かわいらしく・丸いウインドウのデザインは革新的だった。(http://www.wheel.gr.jp/~dai/sl-zaurus/bsd/ より)

中でもLinuxとの関わりは深いですね。

X11用のEmiClockが公開されてからは、LinuxのJG(Japanese Games and amusements)に加えられて、VineLinuxに標準で入っていたんだとか。

Ubuntuなんてものが無い時代、日本でLinuxといえばVineLinux(敬意を表してブドウ色で書く!)だったりしましたからね。あのrpmなんだかapt-getなんだかよくわからないの(笑

筆者も、実はvinelinuxをインストールしたあとにEmiClockを起動させたりしたけれど、自分はあんまりデスクトップアクセサリの類が好きではないんです。なんかチャカチャカして作業に集中できないというか…MSWindowsでも「伺か」とか流行ったことぎあったけど、すぐ飽きちゃった。¥e

ただ、このEmiClockを熱愛していたお兄さんたちもそれなりにいたようです。起動時の「みゅっ」という声を聞いて萌え萌えになってしまい、この「みゅっ」を聞かないと仕事ができないYo!とか言うくらいならまだまだ序の口。

このソフトの最大の売りはEmiが一定時間ごとに「着せ替え」をすることでして、この着せ替えの衣装を買ったり(シェアウェアだったのです!)、「見えないドレスがある」という情報があると、どうやって出せバインダー!!みたいに四苦八苦して、X11版のソースを解析&改変してコンパイルしなおして強制的に剥いてしまった猛者たちもいたようです(笑

…ただ、きちんと正式な手順を踏んで見た方が感動が大きいとのこと(なんのこっちゃ)


……では、前置きが長くなったところで、このEmiClockをM5Stack用に移植してみよう。

また後の記事で。(^▽^;


2019年4月23日火曜日

【M5Stack】PlatformIOを使ってプログラミングするのが思いのほか快適だった件

■ はじめに

自分以外にこのブログを見る人はM5Stackが何たるかを既に知っているという条件で(^^;

M5Stackに限らず、このテのマイコンボードにプログラムを書いてなんかさせるためには、母艦となるパソコンを用意して、そこに開発環境を用意してあげなければならない。

この作業が結構面倒くさくて、そんなに何回もやりたいとは思わないことだろう。しかし、PlatformIOを試してみたら、思いのほか快適だったので紹介したい。


■ PlatformIOとは

ここをご覧になっている方は説明するまでも無いでしょう…僕は10年近くIT関係のお仕事から離れていたので、このPlatformIOからMicrosoftのVSCodeというエディターを初めて知りました(^^;。いや、お恥ずかしい
どうせMicrosoftが作るものだから、恐ろしく

トロくて!

めんどくさくて!


変で使いづらいリボンインターフェイスがついていて!



漢(おとこ)ならやっぱりviでしょう!?というイメージを勝手に抱いていたのですが(笑)。意外や意外、このVSCodeはコーディング作業でとっても使いやすいですよ。僕がプログラマーをやってたときに、こんな便利なものがあったらなあ…なんて旧石器時代からタイムスリップしてきたような感覚を味わってしまったのでした。。。

Linuxを使っているような偏屈なUnti-Microsoftな方でも、宗教上の理由がなければ(!?)公式からrpmなりdebなりを落としてサクっとインストールできるようになっています。実に素晴らしい


↑VSCodeの公式ホームページ。開いたとたんブラウザの使用OSを判別して、ダウンロードするべきファイルを教えてくれる。「さあ、ここからなんかクリエイティブなことをするのだ…」という天啓が届きそうですw

なお、僕がAsus Eee S101用に32bit用でダウンロード&インストールしたら、Linuxの32bit用はもうすぐアップデートが終了するからもう使うのはやめなよ。と絶えず警告されてしまう(笑)

まあIntel Atomを積んでいるようなネットブックというノートパソコンの形をしたオモチャではそれなりに重いです(^^;、Azureというクラウド環境前提で作られたためか、オフラインでの挙動もちょっと心もとないところがありますね

ああ〜やっぱりAtomはダメな子だわ。」と呆れて、github謹製のAtomエディタも触らず嫌いという風評被害ももたらしているという、なかなか罪深いヤツですね(!?


■ PlatformIOの始め方

では、VSCodeのインストールが終わったら、PlatformIOの環境構築を始めよう。
手順は至って簡単。

VSCodeの左下あたりに四角っぽいボタンで「拡張」というのがある。そこから拡張機能をインストールしていこう。

(1)「拡張機能」から「C/C++」をインストール


(2)「拡張機能」から「PlatformIO」をインストール



たったこんだけ。

簡単すぎませんか(@@)
…まあ、必要なものはその都度インターネットからダウンロードしてインストールするという方式のためなのか、時間はかかりますね。

プロジェクトの始め方もとっても簡単です!
PlatformIOの「ホーム」から「NewProject」を選択して…


入力する必要事項はたったの3つ。

プロジェクト名:適当にはじめは「hello」とか(笑)

ボード名:M5Stackもあります!psramを積んでいないFACESとかGRAYもCoreの方を選べば大丈夫ですね!

フレームワーク:まずはAruduinoということになりますね~

プロジェクト作成が最初の場合はESP32用の環境(ESP-IDF)もインストールされるので、結構時間がかかるだろう。


PlatformIOの「Platforms」のところを選ぶと「Espressif 32」というのがインストールされているのがわかる。…ずいぶん時間がかかるわけだヽ(´ー`)ノ

あとは新しくできた「main.cpp」のところを編集すればいい。Arduinoのスケッチのように「setup」と「loop」という関数ができてるので、それぞれに関数を追加する。

あ、そうそうM5StackのAdruino用ライブラリもインストールも忘れないようにして、「platformio.ini」のところにライブラリ名を書いておこう。書き方は


lib_deps =
# Using a library name
M5Stack


こんな感じ。

あとは、下に↓こんなボタンがあるので、ビルド([レ]チェックマークのアイコン)とか書き込み(雲のアイコン)すればM5Stackに焼かれる。めでたし、めでたし。




…もうすでにこのテの環境構築を説明したブログはたくさんあるだろうから、いったい何番煎じなんだYO!というネタでありました(^^;

おつかれさま。

2019年4月4日木曜日

【M5Stack/MicroPython】lcd.printのAPIが意外と初心者殺しだった件

■ はじめに

M5Stackで手っとり早くなんかプログラムを書いて動かすのはMicroPythonを使うのが最も簡単だと思います。(少なくても自分にとっては。前の記事も参照)

たいていの人はlcd.print("HelloWorld")とか表示させたりして、この世界にようこそ!されるのでしょうが、意外とこのLCDクラスが曲者した。「初心者というのはこんな所で詰まるのか!」というTipsのためにもまとめておきます。


■ lcd.printについて

説明するまでもないけれど、M5StackのLCDパネルに文字列を表示させるためのAPIです。
普通、このテのマイコン開発ボードでは適当な表示器を見繕って自前でSPIとかのドライバを書くことから始めないといけない。表示器がキャラクタ表示に対応していなければフォントも用意することだろう。それこそ「たかがHelloWorld、されどHelloWorld」という世界で、HelloWorldを表示させられたら、もう力尽きてそれ以上の気力が湧いてこないのです(;´Д`)

それがM5StackのMicroPythonでは「from m5stack import lcd」一発で使えてしまうのだから驚きだ
これさえできれば、表示に関してはやりたいことがすぐできる…

…できるはず…

…はずなのですが(笑)


■ 詰まってしまうこと


(1)lcdは小文字
まずはここですね(*_*; 
 lcdはついついシフトキーを押しながらLCDと書いてしまう。
特にVB出身者とかだと関数を大文字で書く習慣がまだあるかもしれない(!?)最近は関数やクラスは小文字で始まる言語が主流になってきただろうけど、僕のように久しぶりにコードを書いてみるような人は注意が必要だ。
Webの検索エンジンとは違って大文字小文字が違うだけでもNot foundで怒られてしまうので、テキストエディタの一括置換のお世話になるわけだ。

(2)フォント定数やカラーコード定数もlcdモジュールの定数である
はじめは本当にフォントや文字色の指定の仕方がわかりませんでした(オヤジギャグではありませんよ!

公式の説明はこうだ。

以下のフォント定数が定義済みで、font引数に指定できます: 
FONT_Default, FONT_DefaultSmall, FONT_DejaVu18, FONT_Dejavu24, FONT_Ubuntu, FONT_Comic, FONT_Minya, FONT_Tooney, FONT_Small, FONT_7seg

だから

lcd.font("FONT_Tooney")

とか書いてもフォントが変わらないのです!
HTMLとかCSSコーダーの方は意外と間違いやすいですかね…
定数と書いてあるのですが、そのまま指定してもダメ。

だから、こう
lstfont = ["FONT_Default","FONT_DejaVu18","FONT_DejaVu24","FONT_Ubuntu","FONT_Comic","FONT_Minya","FONT_Tooney"]
lstfontid = [lcd.FONT_Default,lcd.FONT_DejaVu18,lcd.FONT_DejaVu24,lcd.FONT_Ubuntu,lcd.FONT_Comic,lcd.FONT_Minya,lcd.FONT_Tooney]
lstcolor = [lcd.WHITE,lcd.LIGHTGREY,lcd.MAGENTA,lcd.CYAN,lcd.ORANGE,lcd.GREENYELLOW,lcd.PINK]

lcd.clear()
for i in range(len(lstfontid)):
    lcd.font(lstfontid[i])
    text = "%s = %s\r\n" % (lstfont[i],lstfontid[i])
    lcd.print(text,0,lcd.LASTY,lstcolor[i])

結果

lcdモジュールの定数として指定する必要があるというわけだったんです。
…まあ、落ち着いて考えればそうなのでしょう。


(3)角度やtransparentはキーワード引数である。
これも結構ハマりました(T_T)
公式の説明はこう。

lcd.print(text[,x, y, color, rotate, transparent, fixedwidth, wrap])


それで、
lcd.print("Hello World",100,100,lcd.RED)

こんな具合にx, y, color までは省略可能なのですが指定すれば表示できます。

でも
lcd.print("Hello World",100,100,lcd.RED,90,0)

rotate以降を指定するとtype errorとかになってしまう…
文字列で指定するのか?と思って
lcd.print("Hello World",100,100,lcd.RED,"90",0)

これも当然ダメ(笑)

…はて、わけわかめ@@;;;;

ということでいろいろぐぐってみたけど、text以上の引数が必要になるシーンなんてあるの?とばかり、
lcd.print("Hello World") というtextまで指定されたサンプルしかない(^_^;)

これはファームウェアのソースを見るしかない!というわけで、それらしきメソッドのソースを見ると、こうだ。
const mp_arg_t allowed_args[] = {
        { MP_QSTR_text,         MP_ARG_REQUIRED | MP_ARG_OBJ, { .u_obj = mp_const_none } },
        { MP_QSTR_x,                              MP_ARG_INT, { .u_int = 0 } },
        { MP_QSTR_y,                              MP_ARG_INT, { .u_int = 0 } },
        { MP_QSTR_color,                          MP_ARG_INT, { .u_int = -1 } },
        { MP_QSTR_rotate,       MP_ARG_KW_ONLY  | MP_ARG_INT, { .u_int = -1 } },
        { MP_QSTR_transparent,  MP_ARG_KW_ONLY  | MP_ARG_OBJ, { .u_obj = mp_const_none } },
pythonに慣れた人であれば常識なのかもしれないけど、rotate以降はキーワード引数とのこと。

だから
from m5stack import *
import random
import utime
lcd.clear(lcd.BLUE)
while True:
    x = random.randint(0,320)   
    y = random.randint(0,240)
    r = random.randint(0,360)
    lcd.print("SPAM",x,y,0xFFFFFF,rotate=r,transparent=True)
    utime.sleep(0.2)
としてやれば

結果

はああ〜やっとできた〜(TдT)

リファレンスにrotate以降はキーワード引数ですよ。とか、transparentはbooleanで指定して下さい。とか、突然変更になるかもしれないし、そこまで親切じゃないぞ!。という話です(笑)

でも「type error」だって吐き出すし、いよいよとなったらファームのソースも公開してんだからそっちを見てね(はぁと)ということかもしれません(^_^;)

以上、意外と難しかったlcd.printのお話でした!