So-net無料ブログ作成

そういえば生存報告その2 [ds-DCCデコーダ]

 さて、先週はnmraDCCのESP32が動くはずのバージョンで動かないとブツブツと言っていましたが、その後です。
 Yaasanさんアドバイスありがとうございます。ただ、#define ESP32が宣言されてなくって、うまくコンパイルされていないのではないか?については、デバイスをESP32 devに設定していると勝手にESP32が宣言されていることを確認しました。ということで、原因は別でした。
 NmraDccMultiFunctionDecoder_1.inoサンプル内をにらめっこしていて、
void setup()内で
Dcc.pin(0,2,0)があるのですが、これは、NmraDcc.h内で

/*+
* pin() is called from setup() and sets up the pin used to receive DCC packets.
*
* Inputs:
* ExtIntNum - Interrupt number of the pin. Use digitalPinToInterrupt(ExtIntPinNum).
* ExtIntPinNum - Input pin number.
* EnablePullup - Set true to enable the pins pullup resistor.
*
* Returns:
* None.
*/
void pin( uint8_t ExtIntNum, uint8_t ExtIntPinNum, uint8_t EnablePullup);

と説明されています。問題はここでした。
ArduinoUnoではExtPinNum(物理ピン番号)が2の時。ExtIntNum(割り込み番号)が0で、これを記述すると、Dcc.pin(0,2,0)となります。
ESP32では、この物理ピン番号と割り込み番号の組み合わせは成り立ちません。(たぶんピン番号と割り込み番号が同一と思うんだけど、試していない)
で、Pin()の命令のもう一つの形態が2変数バージョンで、

/*+
* pin() is called from setup() and sets up the pin used to receive DCC packets.
* This relies on the internal function: digitalPinToInterrupt() to map the input pin number to the right interrupt
*
* Inputs:
* ExtIntPinNum - Input pin number.
* EnablePullup - Set true to enable the pins pullup resistor.
*
* Returns:
* None.
*/
#ifdef digitalPinToInterrupt
void pin( uint8_t ExtIntPinNum, uint8_t EnablePullup);
#endif

となっており、この2変数関数の内部は、NmraDcc.cppのほうで

#ifdef digitalPinToInterrupt
void NmraDcc::pin( uint8_t ExtIntPinNum, uint8_t EnablePullup)
{
pin(digitalPinToInterrupt(ExtIntPinNum), ExtIntPinNum, EnablePullup);
}
#endif

と3変数バージョンを呼んでいます。第一引数のdigitalPinToInterrupt(ExtIntPinNum)はピン番号から割り込み番号を返す関数のようで、こちらに変えたら、ちゃんと動きました。
つまり、setup()内の割り込みピンの設定関数を、下記例では、どちらも2ピンとしていていますが
Dcc.pin(0,2,0)から
Dcc.pin(2,0)に変更してうごくようになりました。
3日ぐらい、動かずに悩んでしまいました・・・。

現在、Mp3V5の各命令をなんとなくコピーしながら、動作確認を始めて、室内灯、ヘッド、テールライト、前後切り替えぐらいは動くようになりましたが、モーター部分やCVのWriteとかはまだです。ということで写真的には先週とほぼ変わらない状態です。
 この話題、もう少し続けます・・・。
re_DSC02829.jpg



コメント(2) 

コメント 2

Yaasan

原因判明したとのことで嬉しい限りです。
ESP32のWi-Fi機能は期待していませんが、巨大なRAMやFLASHはサウンドデコーダとしてかなりのポテンシャルが有り、期待しているところです。LokSoundよりもずっと高性能にできる可能性が高いです!
MP3でやると大変なことになりそうなので、ADPCMか何かで簡易圧縮程度にして、CPUパワーを使わないようにするためにも基本はWAVEでやった方が良いなと思います。

・複数サウンドの再生(最低8ch同時という話も)
・複数サウンドデータの保存方式の検討
・複数サウンドの再生プログラムの検討(ESU的なブロック図的なもの、ZIMOやデジトラックスのようなスクリプトなど)
・サウンドデータのダウンロード方法(Wi-Fi経由?UART?)
・スマイルコネクタシステム3.3V版?規格外確実ですがNext18?
・ElecrowでSMD部品実装済みの専用基板にも夢が膨らみます!

量産試作、量産の際には、お手伝いさせて頂きます!
by Yaasan (2019-06-17 07:50) 

fujigaya2

コメントありがとうございます。
ESP8266AudioライブラリでMp3を3音以上鳴らすと、ピーとかよくわからない音がしていました。あとは、コンパイルにすごい時間(数分?)かかっていたので、まあ、先は長そうですね。
by fujigaya2 (2019-06-18 06:56) 

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。