1 / 1412345...最後 »

ESP8266用ILI9341ライブラリの高速化

HSES-LCD24用のILI9341ライブラリとして、Humblesoft_ILI9341を使用している。これは、Adafruit_ILI9341を拡張したもので、Fontxを使った漢字描画機能、scroll機能などが追加されている。 実行速度面では、まったく改善されていない。HSES-LCD24用のデモプログラムを新たに作ろうと思うのだが、描画速度が遅いので、先に高速化を行うことにした。

Adafruit_ILI9341のexamplesにgraphicstestという各種描画機能の実行時間をマイクロ秒単位で表示してくれる。これを使い、実行時間を計測しながら高速化を行った。

最終的な結果の表を以下に示す。塗りつぶし系の描画では7倍前後、あまり高速化できなかったLines等でも1.5倍程度の高速化ができた。 文字の描画も4.68倍高速化されているが、これは若干説明を要する。

今回使用した高速化の手段を以下に示す。

  • CS,D/C信号操作の高速化
  • SPI大量データ転送の高速化
  • クロックの高速化
  • 文字描画の高速化

続きを読む… »

Windows上のエディタ

Windows上でも、ずっとemacsを使ってきたが、ちょっと辛くなってきた。IME制御機能付きのWindows用emacsが手に入らなくなってきたからだ。

IME制御機能付きであれば、emacsのキー(デフォルトでCtrl-\, 私はカスタマイずしてCtrl-O)でIMEのOn/Offを切り替えることができるのだが、機能が無いとemacsのキーでは、emacs自身のかな漢字変換機能のOn/Offが行われ、IMEのOn/Offは「半角/全角」キーで行うことになる。日本語を入力しているとモードが混乱して極めて効率が悪い。
続きを読む… »

F-PLUG 再び

2年前に F-PLUGというBluetooth接続の電力計を導入し、部屋のエアコンの電力、周辺温度、湿度等を1分ごとに記録し、Linuxサーバに保存していた。Bluetooth接続をLinuxのrfcommコマンドでttyデバイスに変換し、sunagaeさんのpythonのプログラムでデータを取得している。 

ところが、rfcommのプロセスがよく止まる。 そのたびにrfcommを再起動(再実行?)させていたのだが、エアコンの電力消費状況も把握できたので、興味も薄れ、ほっぽらかしにしていた。

だんだん暖かくなり、今年はエアコンも新設したこともあり、興味が復活、ふたたび使いたくなってきた。しかし、rfcommを使うのは止めたい。 pythonを使えば、直接 Bluetooth機器とお話しできるっぽい、

まずは、pyBluezで、bluetoothデバイスのスキャン

import bluetooth

nearby_devices = bluetooth.discover_devices(lookup_names=True)
print("found %d devces" % len(nearby_devices))

for addr, name in nearby_devices:
    print(" %s - %s" % (addr, name))

デバイスのアドレス (‘B0:99:DE:AD:BE:EF” みたいなやつ)がわかれば、socketで接続できるらしい。

import socket

addr = "B0:99:DE:AD:BE:EF"
port = 1

sock = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM,
                     socket.BTPROTO_RFCOMM)
sock.connect((addr, port))

これを使ってpyFplugを改造し、直接データを取得できるようになった。 F-PLUGは 新しい方のエアコンに付け替えた。

可能ならF-PLUGを買い足そうと思ったんだが、調べると販売中止になっている。売れなかったということか。同じbluetooth接続の電力計 ラトックのREX-BTWATTCH1の方は、まだ買えそうだが、通信プロトコルの情報がみつからない。なんとかなるのであれば、他のエアコンや冷蔵庫のデータも取ってみたいところだが、残念だ。

音楽の再生には何bit必要?

ESP32のDACに音を出力する場合、8bitというのはどんなもんなんだろう。 bit数が足りないために音声が、まともに聞こえないというのでは困るなぁと思い、実験してみた。

pythonのwavライブラリを使うとwavファイルの操作ができる。これを使って、wavファイルのデータを指定したbit数まで落とすプログラムを作成した。処理に結構時間が、かかるので10秒だけ出力する。

結果、私のPCの再生環境では8bitと12bitの聞き分けができないことが判明。8bitからbit数を落として行ってもホワイトノイズが増えていくだけで、あまり問題無く聞ける。1bitだとノイズがかなり大きいが、それでも曲は判別可能。予想外の結果だった。

変換した結果を以下に示す。元の曲は魔王魂さんのフリー歌もの素材「桜日和」

1bitの音源:(音量注意)

続きを読む… »

ESP32_MP3_Decorderを動かしてみた。

ESP32のI2Sで音声出力の実験をしているが、なかなかうまくいかない。サンプルプログラムを元にプログラミング・ガイドを見ながらDACに音声を出力させようとしているのだが、うまくいかない。部分的にちゃんと波形は出力されているのだが、うまくつながらない。周期も変。

資料も少ないし、動いたという例も無いと思っていたところESP32_MP3_Decoderの存在を知る。試してみると、いろいろ問題は、ありながら、断続的に音が出た。MP3のデコードも自前でやっているらしい。


続きを読む… »

intel hexファイルのマージ

PIC32MXのプログラムを開発中、2つのintel hexファイル(bootloaderとfirmware本体)を1度に書き込みたいと思ったのだが、pic32progではできない。objcopyあたりでmergeできるか調べるが,無理そう。hexファイルのmergeならpythonで自分で書いても簡単そうなので書き始めるが、念のため python + intel hexで検索したら、ライブラリ、その名もintelhexがあった。ドキュメントによるとmerge機能まである。サンプルを見ながらプログラムを書き、あっさり動作。凄いね。世の中は。

import sys
from intelhex import IntelHex

usage = "%s hex_infile1 hex_infile2 hex_outfile" % sys.argv[0]
if len(sys.argv) != 4:
    print(usage)
    sys.exit(1)

infile1, infile2,outfile  = sys.argv[1:]

ih1 = IntelHex(infile1)
ih2 = IntelHex(infile2)
ih1.merge(ih2, overlap='ignore')
ih1.write_hex_file(outfile)

ドキュメントによると、ライブラリにhexmerge.pyというユーティリティが付属し、ライブラリと一緒にインストールされるとあったが、わたしの環境では見付らない。これが使えれば、プログラムを書く必要すら無い。

ESP8266+OLEDでRSS表示

HSES-NODEのサンプルプログラムにRSS表示のプログラムを追加することは、前々から予定していた。RSS表示自体はHSES-LCD24で既にやっていて新味が無いので後回しになっていたのだが、やっと完成した。実際に動かして見ると案外面白い。OLEDなので、表示が鮮明。LCDより、はるかに見やすい。表示される文字数が少なく、スクロールされていくので、見続けないと内容がわからないため、つい見続けてしまう。あとサイズが小さいのも魅力的。

プログラムとしては、まずHumblesoft_SSD1306ライブラリに文字をスクロール表示する機能(ScrollTextクラス)を追加。HSES-LCD24用のRssDispのソースプログラムを持ってきて、ちょっと修正してやったら、すぐにRSSが表示された。 それに日付・時刻等を表示する機能を追加し、さらに画面のレイアウトを変更する機能もつけた。スイッチ(IO0)を押すとレイアウトが切り替わり、時刻が大きく表示されたり、RSSが大きく表示されたりする。

ESP32で動画表示

ESP32に接続した320×240のTFT LCDにネットワーク経由でデータを転送し動画を表示することができた。表示速度は、240×160だと10fps, 240×135で15fps, 120×90なら30fps以上が可能。あと2倍ぐらい高速化の余地はありそう。

ESP32側のプログラムはArduino環境で開発。udpパケットを受信し、データをそのままLCDに書き込む。簡単なフロー制御も実装している。tcpではなく、udpを使用したのは、フロー制御を自前でやりたかったから。通信エラーでパケット欠落が起きても再送などして欲しくなかったから。あとudpだと自然にパケット単位で処理することになり、プログラムがわかりやすい。tcpのストリームにパケットの切り出し処理が面倒。やってみた結果,フロー制御でいろいろ実験できて面白かった半面、いろんな通信環境にちゃんと対応できているかどうか不安。そのうちtcpでも試してみたい。

動画データは、既存の動画ファイルをffmpegで専用フォーマットに変換したものを使用。ファイルの中には RGB各5,6,5bitづつの16bit/pixelのTFT LCDのフォーマットで画像データが収められている。これをpythonのプログラムでudpパケットで送信している。


続きを読む… »

ESP32のGPIOのバグ

ESP32でパラレル接続のTFT LCDに表示を行おうと、既存のライブラリを参考にプログラムを書き、大体動くようになったのだが、なんか変。変な点が描画される。(右上の写真参照)

怪しいところはたくさんある。自分のコードも怪しいし、LCDは使用実績はあるものの、結構古いものなので怪しいし、esp32-arduinoもesp-idfも日々更新されていて怪しい。電源ラインも怪しい。オシロスコープを駆使し、しつこく調べると WRパルスが出ているタイミングでCSがHighになっている状況を発見。WR信号もCS信号もGPIOで操作している。これは、プログラムのミスではありえない。
続きを読む… »

Bad Apple on ESP8266 + OLED

HSES-NODE-OLEDでBad Apple(影絵)を再生できた… って、結構前に出来ていたのだけれど、Blogに記事を書くのが遅くなってしまった。画像データは ffmpegで1フレームづつBMPファイルに変換し、PCからpythonのプログラムでudpパケットにして送信している。詳しい話はQiitaに書いた。ソースコードはGitHubで公開している。
続きを読む… »

温度計プログラム完成

HSES-LCD24のサンプルプログラムとして温度計が完成、githubに公開した。まずは、画面を見て貰おう。

161124a1i
画面には、日付、時刻、温度センサーから取得した4つの温度と、その平均値、温度変化のグラフが表示されている。グラフには当日のデータに加えて、前日のデータもグレイで表示されている。
続きを読む… »

arduino用にsscanf関数のサブセットを作成

d161118a1C/C++のプログラムで簡単な文字列解釈が必要になった時、sscanf()で処理しているのだが、esp8266 arduino環境だと使えない。コンパイルは通るがリンク時にエラーとなる。仕方がないので strtol()関数などで凌いでいたのだが、浮動小数点の解釈をする必要があり、StringのtoFloatの説明を見ているうち、段々腹が立ってきて、sscanf()のサブセットを作ることを思いついた。

toFloat()で許せないのは、数字として解釈できなかった場合0を返すだけで、元の文字列を見ないと数字だったのかどうかわからないこと。解釈できたかどうかをbool値で返し、値は引数に変数のポインタを渡して返すべきだと思う。
続きを読む… »

SPI3台使いは、ちょっと大変

d161117a2HSES-LCD24ではESP8266(ESP-WROOM-02)のSPIに3つのデバイスが接続されている。TFT LCDとTouchscreenとSDカードスロットの3つだ。1つづつの動作確認は済んでいるのだが、今回初めて3つのデバイスを同時に動作させるプログラムを作ろうとしてトラブった。

各デバイスのライブラリーは、いろいろ提供されている。、SPI接続のライブラリーは基本的にSPIに複数のデバイスが接続されていることをあまり考慮していないので、使用の際には注意が必要だ。

まず、SPIデバイスのCS信号に接続されている端子は、初期化時にHighを出力されるようにされるが、そのまま初期化処理を続行されてしまうので、デバイスの初期化処理(biginメソッド?)を順次呼び出すと、他のデバイスのCS信号が未初期化、INPUTモードでハイインピーダンス状態でSCLK/MOSI/MISOに信号が出てくることになりMISO信号の衝突がありえる。よって、全部のCS信号を自分でHigh出力状態にしてやる必要がある。

続きを読む… »

esp8266/ArduinoのRTC

f161108a1ESP-WROOM-02等で使用するesp8266/Arduinoでは、サンプロプログラムにNTPClienttが含まれていることもあり、現在の時刻を取得するRTC(Real Time Clock)は自分で作成するものだと思い込んでいた。

時刻を取得するたびにntpパケットを飛ばすのもどうかと思うので、ntpパケットは適当な間隔で飛ばして、millis()関数とのオフセットでも管理することになるのかな。ntpサーバ1つだけだと嫌だな、とか色々考えているうち、偶然 esp8266/Arduinoの中にtime.cというファイルを発見。configTime()関数で、サーバーやタイムゾーン等を設定してやれば、time()関数でUNIX時間を取得できそう。
続きを読む… »

ILI9341のスクロール機能

fig161103a2ILI9341には,画面をスクロールさせる機能がある。VerticalScrollDifinition(33h)コマンドで、上下の非スクロールエリアの幅を設定(リセット時は0)。VerticalScrollStartAddress(37h)コマンドでスタート位置を設定すれば、Vertical Scroll Areaの表示を自由にスクロール(回転?)表示できる。

続きを読む… »

1 / 1412345...最後 »