SSブログ

そういえば生存報告その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:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。
そういえば生存報告ESP32で音を出す ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。