No.175
RaspberryPiからレガシーDMXを出力する方法を妄想しています。
直接出すのは無理があります。UARTはありますが、2系統出すのが関の山。BreakTimeも出しにくい。
ならば、RaspberryPiからはSPIで出力し、PICで250kbpsのUARTに変換するのがいいかなと。
RaspberryPiからCS(チップセレクト)を使ってPICを選択するのがノーマルな方法ですが、レガシーDMXを出来る限り数多くだすには効率が悪い。SPIを休みなく送りつけたらPICは処理しきれませんので1ワード毎に休み時間を入れないといけない。また、PIC1個毎に一気にデータを送り付けるにはPICがデータをキャッシュ出来なければなりませんが、512バイト以上のメモリを持ったPICは選択肢が少なくピン数も多い。
しかるに、SPIを普通に使ったら2系統扱うのが限界だと思われます。
で、考えた方法が、複数のPIC(レガシーDMX1系統に付き1個使用)がRaspberryPiから1個に見える方法です。
RaspberryPiからは複数のユニバースのデータを適切に並べ替えて一気に送出します。RaspberryPiにとっては一番ストレスが無い方法です。
もちろんPICはこれを捌くことが出来ませんから、RaspberryPiとPICの間に仕掛けを入れます。
SPIはクロック同期型の送信方法ですからデータ線の他にクロック線があります。受信はクロックによって実行されますので、CSがアクティブでも、データ線に変化があっても、クロックが伴わなければ何も起こりません。通常ならCSを用いて受信先を決定しますが、クロックの出力先を仕分けても同じことです。
送信が始まって1から8カウントの間は1番目のPICへSPIのクロックを送り、9から16カウントの間は2番目のPICへSPIのクロックを送り・・・以下末番のPICまで繰り返します。RaspberryPiから送信があっても、クロックが行かない受信器にとってはワードとワードの間の休み時間でしかありません。
これなら、送信するRaspberryPiからはPIC達が1個に見え、受信するPIC達には自分宛のデータがだけが届きます。RaspberryPiが休みなく送信してもPIC側は他が受信している間に処理を進められますし、RaspberryPiの送信タイミングが適切であれば受信したSPIのデータをUARTに渡すだけでPIC内でのスタックは不要です。ピン数が少ないPIC12F1822でも対応可能ということ。
これを実現するクロックの仕分けは汎用ロジックICで行います。
バイナリカウンタ74HC4040
3to8 ラインデコーダ TC74HC138
この二つです。
数日前はGALを使おうかと思ったのですが、16ピンの汎用ロジック2個で可能ならこちらの方がいいかと。ファームウェア書かなくていいし、安いし、30年以上確実に動くし。
バイナリカウンタはクロックをカウントして2進数相当の出力をするICです。これにSPIクロックを入力し、下から4~6bit目の出力を使います。SPIクロックの8倍周期でカウントされる3bitのバイナリと見なせます。
8倍周期の3bitのバイナリをラインデコーダに入れます。ラインデコーダは入力された3bitのバイナリに相当するピンだけ出力します。このデコーダにSPIのクロックも入れれば8カウント毎に送り先が切り替わるクロックが出力されます。
SPIのモードは74HC4040の特性に合わせてmode3がよいと思われます。
文章で伝わりにくいのは承知していますが、アイデアがまとまってスッキリした。
オレメモってことで。
整理しきらないとモヤモヤして本業が手に付かなかったので回路図を描いてみました。気分スッキリ。
折角なので揚げてみました。
クリックして表示されるモノはぼやけてしまいますので、回路を追いたい方はサムネのリンク先の画像本体をダウンロードして見てください。

追記
回路図に間違い発見!
74HC4040のCLKにはSPI_CLKが入らないといけません。
74HC4040から74HC138のA,B,Cに行くのもQ4,Q5,Q6です。なら74HC4020でもいいな。
データは手直ししましたが、ここに再アップするのは面倒。まぁいいか。
さらに追記
クロックカウントの考え方が根本的に間違っているような気が・・・74HC4040(4020)のカウントの進み方がズレてね?最初のビットをサンプリングする前に1カウントされてしまうぞ。
ならばSPIをmode0で使えばいいか?mode0ならアイドル・ローだから74HC138ではなく74HC238か?
考え直し。
#電子工作 #RaspberryPi
直接出すのは無理があります。UARTはありますが、2系統出すのが関の山。BreakTimeも出しにくい。
ならば、RaspberryPiからはSPIで出力し、PICで250kbpsのUARTに変換するのがいいかなと。
RaspberryPiからCS(チップセレクト)を使ってPICを選択するのがノーマルな方法ですが、レガシーDMXを出来る限り数多くだすには効率が悪い。SPIを休みなく送りつけたらPICは処理しきれませんので1ワード毎に休み時間を入れないといけない。また、PIC1個毎に一気にデータを送り付けるにはPICがデータをキャッシュ出来なければなりませんが、512バイト以上のメモリを持ったPICは選択肢が少なくピン数も多い。
しかるに、SPIを普通に使ったら2系統扱うのが限界だと思われます。
で、考えた方法が、複数のPIC(レガシーDMX1系統に付き1個使用)がRaspberryPiから1個に見える方法です。
RaspberryPiからは複数のユニバースのデータを適切に並べ替えて一気に送出します。RaspberryPiにとっては一番ストレスが無い方法です。
もちろんPICはこれを捌くことが出来ませんから、RaspberryPiとPICの間に仕掛けを入れます。
SPIはクロック同期型の送信方法ですからデータ線の他にクロック線があります。受信はクロックによって実行されますので、CSがアクティブでも、データ線に変化があっても、クロックが伴わなければ何も起こりません。通常ならCSを用いて受信先を決定しますが、クロックの出力先を仕分けても同じことです。
送信が始まって1から8カウントの間は1番目のPICへSPIのクロックを送り、9から16カウントの間は2番目のPICへSPIのクロックを送り・・・以下末番のPICまで繰り返します。RaspberryPiから送信があっても、クロックが行かない受信器にとってはワードとワードの間の休み時間でしかありません。
これなら、送信するRaspberryPiからはPIC達が1個に見え、受信するPIC達には自分宛のデータがだけが届きます。RaspberryPiが休みなく送信してもPIC側は他が受信している間に処理を進められますし、RaspberryPiの送信タイミングが適切であれば受信したSPIのデータをUARTに渡すだけでPIC内でのスタックは不要です。ピン数が少ないPIC12F1822でも対応可能ということ。
これを実現するクロックの仕分けは汎用ロジックICで行います。
バイナリカウンタ74HC4040
3to8 ラインデコーダ TC74HC138
この二つです。
数日前はGALを使おうかと思ったのですが、16ピンの汎用ロジック2個で可能ならこちらの方がいいかと。ファームウェア書かなくていいし、安いし、30年以上確実に動くし。
バイナリカウンタはクロックをカウントして2進数相当の出力をするICです。これにSPIクロックを入力し、下から4~6bit目の出力を使います。SPIクロックの8倍周期でカウントされる3bitのバイナリと見なせます。
8倍周期の3bitのバイナリをラインデコーダに入れます。ラインデコーダは入力された3bitのバイナリに相当するピンだけ出力します。このデコーダにSPIのクロックも入れれば8カウント毎に送り先が切り替わるクロックが出力されます。
SPIのモードは74HC4040の特性に合わせてmode3がよいと思われます。
文章で伝わりにくいのは承知していますが、アイデアがまとまってスッキリした。
オレメモってことで。
整理しきらないとモヤモヤして本業が手に付かなかったので回路図を描いてみました。気分スッキリ。
折角なので揚げてみました。
クリックして表示されるモノはぼやけてしまいますので、回路を追いたい方はサムネのリンク先の画像本体をダウンロードして見てください。

追記
回路図に間違い発見!
74HC4040のCLKにはSPI_CLKが入らないといけません。
74HC4040から74HC138のA,B,Cに行くのもQ4,Q5,Q6です。なら74HC4020でもいいな。
データは手直ししましたが、ここに再アップするのは面倒。まぁいいか。
さらに追記
クロックカウントの考え方が根本的に間違っているような気が・・・74HC4040(4020)のカウントの進み方がズレてね?最初のビットをサンプリングする前に1カウントされてしまうぞ。
ならばSPIをmode0で使えばいいか?mode0ならアイドル・ローだから74HC138ではなく74HC238か?
考え直し。
#電子工作 #RaspberryPi