1 / 1212345...最後 »

音楽の再生には何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の表示を自由にスクロール(回転?)表示できる。

続きを読む… »

WiFiのSSIDをスキャン

161020a6ESP8266 ArduinoにWiFiのSSIDをスキャンする機能は、あるよね、と探してみたら、当然ながらあった。SCANクラスというものがあり、Arduinoの同名のライブラリを若干拡張してあるらしい。サンプルプログラムはWiFiScanというのがあって、何の問題もなく動く。結果はシリアルポートに出力される。

それだけでは、何なので、HSES-LCD24の液晶に結果を表示するようにしてみた。プログラムは、GitHubで公開している。 改造点は,表示順を信号強度順にソートしたぐらい。あとはひたすら、見た目が良くなるように調整した。液晶の解像度が320×240もあるので、凝ろうと思えば、かなり凝れる。

実用的な価値があるかどうかは別にして、ちょっとそれっぽい表示になったと思う。自宅で動かしても、かなり多くのSSIDが表示されることに驚く。ノイズが減るのか、深夜になると10を超えるSSIDが表示される。あと、別のESP8266と思われるSSIDが表示されている。これはセンサーを繋いで、WebClientとして動いているやつで、AccessPointとして動いているとは思わなかった。そのうち、調べてみたい。

161020a3

esp8266 ArduinoのPROGMEM

160903a0HSES-LCD24での日本語表示を試みる際に、PROGMEMを調べた。

ArduinoのPROGMEMとは、データをROM領域に格納する仕組み。(reference,日本語)

C(C++)言語だとconst修飾子を付ければ、十分な気がするが、AVR等の小型のCPUだと、そうはならない。命令用のROMとデータ用のRAMのアクセス経路を分離し、回路を節約しているためだ。ATmegaとかだとROMのデータを読み込むには、専用の機械語があった気がする。
続きを読む… »

ESP8266 Arduinoでmake

Arduinoのスケッチをmakeコマンドでコンパイルしたいという欲求は昔からあり、sudar/Arduino-Makefileなどというものがあるのも知っているのだが、ちょっと調べて

  • Linux前提っぽい
  • Makefileにincludeさせて使うものらしい
  • Arduino非純正CPU (ESP8266とか)に対応しているか不明

というような感じなので、手を出さずにいた。

HSES-LCD24で日本語の表示をさせようと検討すると、やっぱり fontxファイルをバイナリーのままコードに埋め込みたくなった。Arduino-IDEでコンパイルさせていると、埋め込み先のsectionがわからない。ということでgcc等のコマンドが見えるmakeコマンドでのコンパイルに挑戦してみることにした。
続きを読む… »

1 / 1212345...最後 »