目次

ワイヤレステスト環境整備

 LCDに表示する情報は、動画撮影で後からの走行解析に
 利用できますが、リアルタイムでは、コンピュータが
 どの状態にあるのかを知りたくなります。

 カメラを利用しないで、マシンの状態を知るには音を
 使えばいいはず。ワイヤレスマイクで、情報伝達する
 方法を用意してみる。

 このように考えて、電波法に違反しない小型の送信器を
 設計し、利用することにしました。
 回路図は、以下。




 USAのアマチュア無線関係の雑誌に掲載されていた
 内容を、国産トランジスタに合わせ抵抗値その他
 を一部変更しています。

 単純に振幅変調(AM)を利用できるようにして
 受信にはAMラジオを使います。

 AMラジオは、電源不要のゲルマニウムラジオから
 ストレートタイプ、スーパーヘテロダインタイプ
 と10台くらいあるので、その中のどれかを専用
 にします。

 バイポーラトランジスタは、部品箱の中に入っていた
 2SC1923を利用。トランジション周波数は、500MHzほど
 だったので、AMラジオで使う周波数を、難なくこなす
 と考えました。

 ユニバーサル基板上に回路を組み上げると、以下。



 キャリアの周波数生成は、DDSを利用。
 DDSは中華製を入手していたので、これを活用。



 MCRマシンの状態は、モールス符号の中の数字に
 割り当てして、送信することにします。

 状態割当は、以下。

 実際にモールス符号を出力するのは、FPGAが担当。

 2018年9月に入手済みのXilixnのFPGA基板を使います。



 動作は、次のように考えました。

 MCRマシンを制御しているコンピュータから
 4ビットで状態を取得。取得情報から対応
 モールス符号を生成し、送信器に出力。

 イメージは、以下。



 FPGA内部の回路は、次のVHDLコードで実現。

 常に4ビットの情報を入力しておき、ひとつ前の
 情報と異なれば、対応したモールス符号を送信器
 に出力しています。

 モールス符号は、数字ならば、5文字で固定なので
 テーブルの中に入れてあるパターンを出力するだけ
 にしてあります。

 モールス符号を送信するために内部コンポーネントを
 定義しておきます。

  -- synchronizar
  process( nRESET , CLOCK )
  begin
    if ( nRESET = '0' ) then
      iSFT_TRG <= "00" ;
    elsif rising_edge( CLOCK ) then
      iSFT_TRG <= iSFT_TRG(0) & TRG ;
    end if ;
  end process;
  iTRG <= '1' when ( iSFT_TRG = "01" ) else '0' ;

  -- sequencer
  process( nRESET , CLOCK )
  begin
    if ( nRESET = '0' ) then
      iSREG <= 0 ;
      iMPAT <= "00" ;
      iMDIG <= '0' ;
    elsif rising_edge( CLOCK ) then
      case iSREG is
        -- wait trigger
        when 0 => if ( iTRG = '1' ) then
                    iSREG <= iSREG + 1 ;
                  end if ;
        -- get value
        when 1 => iMPAT <= iMODE(0) ;
                  iSREG <= iSREG + 1 ;
        -- send first
        when 2 => if ( iMPAT = 0 ) then
                    iSREG <= 4 ;
                  else
                    iSREG <= 3 ;
                  end if ;
        -- send first pulse delay
        when 3 => iSREG <= 2 ;
                  iMPAT <= iMPAT - 1 ;
                  iMDIG <= '1' ;
        -- no pulse
        when 4 => iMPAT <= 3 ;
                  iSREG <= iSREG + 1 ;
        -- send first pulse wait
        when 5 =>  if ( iMPAT = 0 ) then
                    iSREG <= 7 ;
                  else
                    iSREG <= 6 ;
                  end if ;
        -- delay
        when 6 => iSREG <= 5 ;
                  iMPAT <= iMPAT - 1 ;
                  iMDIG <= '0' ;

        -- get value
        when 7 => iMPAT <= iMODE(1) ;
                  iSREG <= iSREG + 1 ;
        -- send second
        when 8 => if ( iMPAT = 0 ) then
                    iSREG <= 10 ;
                  else
                    iSREG <= 9 ;
                  end if ;
        -- send second pulse delay
        when 9 => iSREG <= 8 ;
                  iMPAT <= iMPAT - 1 ;
                  iMDIG <= '1' ;
        -- no pulse
        when 10 => iMPAT <= 3 ;
                   iSREG <= iSREG + 1 ;
        -- send second wait
        when 11 =>  if ( iMPAT = 0 ) then
                    iSREG <= 13 ;
                  else
                    iSREG <= 12 ;
                  end if ;
        -- delay
        when 12 => iSREG <= 11 ;
                   iMPAT <= iMPAT - 1 ;
                   iMDIG <= '0' ;

        -- get value
        when 13 => iMPAT <= iMODE(2) ;
                   iSREG <= iSREG + 1 ;
        -- send third
        when 14 => if ( iMPAT = 0 ) then
                     iSREG <= 16 ;
                   else
                     iSREG <= 15 ;
                   end if ;
        -- send third pulse delay
        when 15 => iSREG <= 14 ;
                   iMPAT <= iMPAT - 1 ;
                   iMDIG <= '1' ;
        -- no pulse
        when 16 => iMPAT <= 3 ;
                   iSREG <= iSREG + 1 ;
        -- send third wait
        when 17 =>  if ( iMPAT = 0 ) then
                    iSREG <= 19 ;
                  else
                    iSREG <= 18 ;
                  end if ;
        -- delay
        when 18 => iSREG <= 17 ;
                   iMPAT <= iMPAT - 1 ;
                   iMDIG <= '0' ;

        -- get value
        when 19 => iMPAT <= iMODE(3) ;
                   iSREG <= iSREG + 1 ;
        -- send fourth
        when 20 => if ( iMPAT = 0 ) then
                     iSREG <= 22 ;
                   else
                     iSREG <= 21 ;
                   end if ;
        -- send fourth pulse delay
        when 21 => iSREG <= 20 ;
                   iMPAT <= iMPAT - 1 ;
                   iMDIG <= '1' ;
        -- no pulse
        when 22 => iMPAT <= 3 ;
                   iSREG <= iSREG + 1 ;
        -- send fourth wait
        when 23 =>  if ( iMPAT = 0 ) then
                    iSREG <= 25 ;
                  else
                    iSREG <= 24 ;
                  end if ;
        -- delay
        when 24 => iSREG <= 23 ;
                   iMPAT <= iMPAT - 1 ;
                   iMDIG <= '0' ;

        -- get value
        when 25 => iMPAT <= iMODE(4) ;
                   iSREG <= iSREG + 1 ;
        -- send fifth
        when 26 => if ( iMPAT = 0 ) then
                     iSREG <= 28 ;
                   else
                     iSREG <= 27 ;
                   end if ;
        -- send fifth pulse delay
        when 27 => iSREG <= 28 ;
                   iMPAT <= iMPAT - 1 ;
                   iMDIG <= '1' ;
        -- no pulse
        when 28 => iMPAT <= 3 ;
                   iSREG <= iSREG + 1 ;
        -- send fifth wait
        when 29 =>  if ( iMPAT = 0 ) then
                    iSREG <= 31 ;
                  else
                    iSREG <= 30 ;
                  end if ;
        -- delay
        when 30 => iSREG <= 29 ;
                   iMPAT <= iMPAT - 1 ;
                   iMDIG <= '0' ;

        -- return first state
        when 31 => iSREG <= 0 ;

        -- default
        when others => iSREG <= 0 ;
      end case ;
    end if ;
  end process;

 このコンポーネントに与えるデータパターンは、以下。

 これらを配列に入れて、シーケンサで送信すれば
 目的は達成されます。


目次

inserted by FC2 system