目次
前
次
ワイヤレステスト環境整備
LCDに表示する情報は、動画撮影で後からの走行解析に
利用できますが、リアルタイムでは、コンピュータが
どの状態にあるのかを知りたくなります。
カメラを利用しないで、マシンの状態を知るには音を
使えばいいはず。ワイヤレスマイクで、情報伝達する
方法を用意してみる。
このように考えて、電波法に違反しない小型の送信器を
設計し、利用することにしました。
回路図は、以下。
USAのアマチュア無線関係の雑誌に掲載されていた
内容を、国産トランジスタに合わせ抵抗値その他
を一部変更しています。
単純に振幅変調(AM)を利用できるようにして
受信にはAMラジオを使います。
AMラジオは、電源不要のゲルマニウムラジオから
ストレートタイプ、スーパーヘテロダインタイプ
と10台くらいあるので、その中のどれかを専用
にします。
バイポーラトランジスタは、部品箱の中に入っていた
2SC1923を利用。トランジション周波数は、500MHzほど
だったので、AMラジオで使う周波数を、難なくこなす
と考えました。
ユニバーサル基板上に回路を組み上げると、以下。
キャリアの周波数生成は、DDSを利用。
DDSは中華製を入手していたので、これを活用。
MCRマシンの状態は、モールス符号の中の数字に
割り当てして、送信することにします。
状態割当は、以下。
- 1 ・ ー ー ー ー (NORMAL)
- 2 ・ ・ ー ー ー (CRANK)
- 3 ・ ・ ・ ー ー (TURN)
- 4 ・ ・ ・ ・ ー (LANE)
- 5 ・ ・ ・ ・ ・ (BLIND)
- 6 ー ・ ・ ・ ・
- 7 ー ー ・ ・ ・
- 8 ー ー ー ・ ・
- 9 ー ー ー ー ・
- 0 ー ー ー ー ー (NONE)
実際にモールス符号を出力するのは、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;
このコンポーネントに与えるデータパターンは、以下。
- 1 ・ ー ー ー ー => 1 0 3 0 3 0 3 0 3 0
- 2 ・ ・ ー ー ー => 1 0 1 0 3 0 3 0 3 0
- 3 ・ ・ ・ ー ー => 1 0 1 0 1 0 3 0 3 0
- 4 ・ ・ ・ ・ ー => 1 0 1 0 1 0 1 0 3 0
- 5 ・ ・ ・ ・ ・ => 1 0 1 0 1 0 1 0 1 0
- 6 ー ・ ・ ・ ・ => 3 0 1 0 1 0 1 0 1 0
- 7 ー ー ・ ・ ・ => 3 0 3 0 1 0 1 0 1 0
- 8 ー ー ー ・ ・ => 3 0 3 0 3 0 1 0 1 0
- 9 ー ー ー ー ・ => 3 0 3 0 3 0 3 0 1 0
- 0 ー ー ー ー ー => 3 0 3 0 3 0 3 0 3 0
これらを配列に入れて、シーケンサで送信すれば
目的は達成されます。
目次
前
次