そういえば生存報告その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とかはまだです。ということで写真的には先週とほぼ変わらない状態です。
この話題、もう少し続けます・・・。
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とかはまだです。ということで写真的には先週とほぼ変わらない状態です。
この話題、もう少し続けます・・・。
2019-06-16 21:58
コメント(2)
そういえば生存報告 [ds-DCCデコーダ]
気が付けば、6月も中旬になってしまいました。
DesktopStation界隈はESUのデコーダの話がメインかと思います。
私は我が道を行くで、ふと前に買ったESP32のDevkitCで遊ぼうと思って、ライブラリを調べていたら、ESP8266Audioという、WAVもMP3もAACもDMA転送で音を出せるライブラリがあるじゃないですか。ということで、ちょっと試したんですが・・・。Mp3は同時に複数音なりますが、音が悪い・・・。I2Sのアンプも買ってみましたが、微妙です。ブレッドボードだからノイズが乗っている可能性もありますが。
次に、気を取り直して、nmraDCCがいつの間にかESP32に対応しているようです。早速、スケッチを試してみましたが、うんともすんとも言いません。ピンの選び方が悪いのか何なのか?同じスケッチとライブラリでちゃんと「びんぼうでいいの」(Arduino互換機)では動いたので、スケッチ自体が悪いわけではなさそうです。
そんな近況です。M5StackのFaceも買ってみたので、もう少し、ESP32周りで遊んでみたいと思います。
ESP32は大きくて、HOにも入りづらいんじゃないか?などの突っ込みは、まあ置いておいてください。
DesktopStation界隈はESUのデコーダの話がメインかと思います。
私は我が道を行くで、ふと前に買ったESP32のDevkitCで遊ぼうと思って、ライブラリを調べていたら、ESP8266Audioという、WAVもMP3もAACもDMA転送で音を出せるライブラリがあるじゃないですか。ということで、ちょっと試したんですが・・・。Mp3は同時に複数音なりますが、音が悪い・・・。I2Sのアンプも買ってみましたが、微妙です。ブレッドボードだからノイズが乗っている可能性もありますが。
次に、気を取り直して、nmraDCCがいつの間にかESP32に対応しているようです。早速、スケッチを試してみましたが、うんともすんとも言いません。ピンの選び方が悪いのか何なのか?同じスケッチとライブラリでちゃんと「びんぼうでいいの」(Arduino互換機)では動いたので、スケッチ自体が悪いわけではなさそうです。
そんな近況です。M5StackのFaceも買ってみたので、もう少し、ESP32周りで遊んでみたいと思います。
ESP32は大きくて、HOにも入りづらいんじゃないか?などの突っ込みは、まあ置いておいてください。
2019-06-11 21:05
コメント(4)