ラベル RTOS の投稿を表示しています。 すべての投稿を表示
ラベル RTOS の投稿を表示しています。 すべての投稿を表示

2016年6月4日土曜日

ESP8266:I2S MP3 webradio streaming example(give up)


ESP-WROOM-02でI2Sを動かせないかと思ってググっていたら、上記記事がヒットしました。
Web StreamingがESP8266で出来る!

そりゃあやるしかありませんよね。残念ながら「現在は16bitのモノラル」だけど「サンプル・レートは96-320KBit MP3でテストしてうまくいってるっぽい」そうです。スゴいのか凄くないのかよくわかりませんw

なお、記事をよくみるとSPI RAMはSD_D0など見慣れないピンにつながっています。これ32pinのESPじゃないとダメですね。幸いなことにDACもSPI RAMもなしで動く、と書いてありますので、SPI RAMなしで行きます。ES9023も微妙に高かったので、同じように動作するはずのPCM5102ってのを買いました。ebayで1000円ぐらいでした。

上記リンクの通り配線しますが、ES9023ボードはライン出力なので別にアンプを用意する必要があります。
  • PCM5102(ES9023)ボード用電源(とりあえずUSBから取ります)
  • ブレッド‐ボードなど配線材料

数日間チャレンジしたのですが、動かすことができませんでした。最終的な原因はシリアルのコンフリクトだと思います。私は一旦ギブアップしますが、引き継いでくださる方のために記録を残しておきます。

■ダウンロード&ビルド■

このサンプルはfree-rtosで書かれています。ので、まだfree-rtosの環境がなければ、こちらをご参考にどぞ。

各種設定は mp3/user/playconfig.h で行うことができます。上から順番に見ていきます。

接続先のWIFI SSIDとパスワードをAP_NAMEとAP_PASSに設定します。

MP3_DECODERをダウンロードしたままの状態だとローカルのサーバからMP3をダウンロードする設定になっていますが、面倒なのでやめます。リストされているうちでは icecast.omroep.nl ってところだといい感じに接続できました。そのすぐ上の #if 0 を #if 1 に書き換えます。そして #if 1になっている 192.168.33.128 のところを #if 0 に書き換えます。ご自宅にラズパイなどでストリーミングサーバを立てている場合には、それを活かしてみましょう(動作を確認した後で)。

I2Sをつないでいるので DELTA_SIGMA_HACK をコメントアウトします。 PWM_HACK はそのままコメントアウトですね。

上記の通りSPI RAMは使わないのでFAKE_SPI_BUFFの行のコメントを外します。

ビルドはgithubに書いてあるとおり、コマンドラインで当該ディレクトリに移動してからmakeです。たぶん問題ないと思います。ツールが見つからない旨のエラーが出る場合にはパスを設定していあるか確認してください。make対象がないというエラーはディレクトリが違います。
 make COMPILE=gcc BOOT=none APP=0 SPI_SPEED=80 SPI_MODE=QIO SPI_SIZE=1024
エラーがでなければ、ESP-WROOM-02にダウンロードします。なお、元記事にも書いてありますが、コンパイル後に出る eagle.irom0text.bin---->0x40000 は間違っています。下記のように0XA0000から書き込みをしてください。USBシリアルとESP-WROOM-02をつないでPROGとRESETを一緒にGNDに落とし、RESETを先に離してからPROGを離し、ダウンロードモードにしておきます。Board1の場合には白ボタンと赤ボタンを一緒に押して先に赤ボタンを離してから白ボタンを離します。コマンドラインで
cd mp3
esptool.py --port /dev/tty.usbserial-AH016T8K --baud 115200 \
write_flash 0x00000 ../bin/eagle.flash.bin 0xA0000 ../bin/eagle.irom0text.bin

これでConnecting...以下の表示が出ればOKです。
Connecting...
Erasing flash...
Writing at 0x00009c00... (100 %)
Erasing flash...
Writing at 0x000df800... (100 %)
Leaving...
動作はあまり安定しておらず、起動してすぐにexception、数秒走ってはexceptionが出る…を繰り返して、Rxのランプが点灯しっぱなしになったらGPIO15とRxをオシロで見てみます。数MHzのパルスが出ていればひとまず動いてます。

…ここまでplayconfig.hを試行錯誤して数時間かかりました。

ただ、LR切り替え信号が出てません。この信号がDATAのスタート信号になっているので、これがでないとDAC動いてくれません。

ソースを見ると、Tx / RxをI2Sの信号に使っているのにSerialにprintfでメッセージを出しているのですが…これ問題ないのでしょうか? UART_SetBaudrateをコメントアウトして動作に影響しないようにprintfをコメントアウトしてみましたが、ダメでした。

うーん、あと一歩だと思うのですが…ここまで動かしてギブアップするのは残念です。ただ、I2Sの使い方についてはいい勉強になりました。Tx/RxはDMAでバッファを使えるんですね。当面使う見込みないけどもw

以上お目汚し、失礼しました。

2015年9月28日月曜日

32bit CPU搭載インバータ改良

iPhone6s plus、カメラの性能すげええ

前回はとりあえず20khzで発振して、ボリュームに応じてデューティー比を変えるだけで32bit CPU Cotrtex-M0をまったく活かしておりませんでした。

今回は、少し仕事をしてもらっています…とはいえ、8bitどころか4bitで十分なレベルなのですが。

■仕様■

出力電圧をボリュームで設定できるように。

■実装■

メインループでは設定電圧と現在の電圧を測定し、その差でパルス幅を設定します。設定電圧以上なら出力をオフにし、設定電圧より低ければその差に応じてパルス幅を決めます。差が大きければ大きいほどパルス幅を広くしてインダクタンスに貯める電力を増やします。

その他、100m秒ごとに電圧設定のためのボリュームを読みに行きます。

■ハード■

前回はMOSFETとSBDの耐圧が限界となって電圧を上げられませんでした。今回は、耐圧500vのMOSFETと1000vのダイオード、それに400vの電解コンデンサを使います。

ただ、一つ問題があって、高耐圧のMOSFETはゲートがオンになる電圧も高く、今回使った2SK3234の場合は約5v以上必要です。そのため3.3vのLPC1114では直接ドライブできないので、小さなMOSFETを一段追加しそれでゲートを駆動します。電源電圧も5v以上必要です。何かすごーい遠回りをしているような気もしますが、気にしないで作ります。

あとどのぐらいの出力かを示すLEDと、出力電圧を測定するための分圧抵抗などを追加しました。

なおMOSFETが1個余計に入ったので、出力の論理が反転しています。つまり、mbedから「1」を出力するとパワーMOSFETがoffになります。そのためにPWMへの出力では 1.0 - width としてデューティー比を反転させています。


■mbedのPWM■

当初はボリュームでPWM周波数を変更できるようにしていました。インダクタンスを使っているので、どのぐらいの周波数でパルスを出力するのが一番効率が良いのかをさぐるためです。

で、100m秒ごとにボリュームからanalog inで読み取った値をもとにpwm.periodの値をセットしたのですが…これを行うとPwmOutの値を0にしていても100mSごとに出力がon / offする、つまり約5hzの太いパルスが出てしまいます。

設定電圧を0にしていても約40vの電圧が出てMOSFETがヤケに熱いので、何だろうと思ったのですが…ともかく回路が壊れなくて何よりです。

もう一つ、LEDをPWMで駆動しているのですが、当初まったく点灯しませんでした。これは、PWMの周波数がデフォルトのまま(約20m秒=50hz)なのにそれよりも早い周期でPWMへの書き込みを実行していたためです。ledに書き込みをしているループは1m秒で1回回りますので、それより十分早い10khzを出力するよう変更したところ、無事点灯しました。

いやはや…。

■動かしてみて■

設定電圧を急速に上げるとLEDが明るく点灯し、電圧が上昇して設定電圧に近づくとすーっと暗くなっていきます。逆に急に下げてやるとLEDはしばらく消灯した後、設定電圧に近づくとすっと点灯します。だいたい狙い通りです。強烈なノイズ発生源の近くにあるのでanalog inの値はそうとうバラついているはずで、安定しなければ移動平均処理を加えようかと思っていたのですが、なしでも安定してます。

時間積分効果とでも言いましょうかw

なお、こういう制御(PD)の場合、設定電圧よりも少し低いところで安定します。今回はボリュームを使っているので気にならないですが、電圧を数値で設定する場合にはそのための補正が必要です。

昔、Skycamという製品のためにモーターぶんまわし系の制御をしていた時にはずいぶん苦労したものです…(遠い目

なお、現在、出力値と電圧差の関係は単純な比例ですが、より安定かつスムーズな制御を行うためには二次関数式で比例させることもできます。つまり電圧差が少ないときには少しだけパルスを出して、差が大きい時はドカッと出すわけです(何その小学生なみの表現)。その先にはPID制御などが…ってキリがないw

電源電圧5vと9vで試しましたが、どちらも200vまできっちり上がりました。一応設定限度を200vにしているんですが、波形を見る限りもうちょっと上げられそうです。消費電流は多いですねぇ…9v電源から100vまで上げた時で70mA前後です。冬の太陽だと手持ちの0.5w太陽電池では無理で、2-5wぐらいのセルでないと安定して動かすのは難しいでしょうねぇ。大きいと風の影響なども考えないといけないし…ああどんどん違う方向へ(笑)。

■ソース■

特に珍しいことはしていません。このソースはフリーで公開します。つまり、何にどう使ってもいいですが、責任は問いませんよライセンスです。