試走会からの改良
夏の試走会で明らかになったコース面の反射を
なくすために、LED光照射器を作成しました。
LED光照射器には、白色LEDを利用したので3.3Vでは
発光しません。そこで、簡易DCDCコンバータを発振
ICの555で作って、付加しています。
3.3Vの電源を接続すると、次のような発光状態に
なります。写真では、白く見えますが、長い時間
見てられないほどです。
DCDCコンバータの発振周波数を決めるため、CPLD
ボードで下のチャージポンプ回路を、クロックに
より動かしてみました。
周波数は、100、50、25Hzとしたところ
50Hz以上では、フリッカを感じません。
そこで、発振ICの555の発振周波数を50Hz
から100Hzの間になるように、抵抗、キャ
パシタの値を選びました。
チャージポンプの周波数を決めるために
使ったVHDLコードは、以下。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity ltst is
generic (
TOPX : integer := 16 ;
XMAX : integer := 58880 --; 11.776MHz => 100Hz
);
port (
-- system
nRESET : in std_logic ;
CLOCK : in std_logic ;
-- selector
SEL : in std_logic_vector(1 downto 0) ;
-- monitor output
CLK100 : out std_logic ;
CLK50 : out std_logic ;
CLK25 : out std_logic ;
-- out
FOUT : out std_logic --;
);
end ltst;
architecture behavioral of ltst is
-- clock generator component
component clkgenx is
generic (
TOPX : integer ;
RMAX : integer --;
);
port (
-- system
nRESET : in std_logic ;
CLOCK : in std_logic ;
-- output
CLKOUT : out std_logic -- ;
);
end component ;
-- clock
signal iCLK100 : std_logic ;
signal iCLK50 : std_logic ;
signal iCLK25 : std_logic ;
signal iFOUT : std_logic ;
-- selector
signal iSEL : std_logic_vector(1 downto 0) ;
begin
-- clock generator component
CLKX : clkgenx generic map (TOPX,XMAX) port map (nRESET,CLOCK,iCLK100) ;
-- input
iSEL <= SEL ;
-- output
FOUT <= iFOUT ;
-- monitor
CLK100 <= iCLK100 ;
CLK50 <= iCLK50 ;
CLK25 <= iCLK25 ;
-- selector
iFOUT <= iCLK100 when ( iSEL = "01" ) else
iCLK50 when ( iSEL = "10" ) else
iCLK25 when ( iSEL = "11" ) else
CLOCK;
-- divider
process (nRESET,iCLK100)
begin
if ( nRESET = '0' ) then
iCLK50 <= '0' ;
elsif rising_edge(iCLK100) then
iCLK50 <= not iCLK50 ;
end if ;
end process ;
process (nRESET,iCLK50)
begin
if ( nRESET = '0' ) then
iCLK25 <= '0' ;
elsif rising_edge(iCLK50) then
iCLK25 <= not iCLK25 ;
end if ;
end process ;
end behavioral;
上のVHDLコードから、分周に関係するコードを
呼び出しています。内容は、以下です。
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity clkgenx is
generic (
TOPX : integer ;
RMAX : integer --;
);
port (
-- system
nRESET : in std_logic ;
CLOCK : in std_logic ;
-- output
CLKOUT : out std_logic -- ;
);
end clkgenx;
architecture Behavioral of clkgenx is
signal iSCNT : std_logic_vector(TOPX-1 downto 0);
signal iCLK : std_logic ;
begin
-- output
CLKOUT <= iCLK ;
-- divider
process (nRESET,CLOCK)
begin
if ( nRESET = '0' ) then
iSCNT <= (others => '0') ;
iCLK <= '0' ;
elsif rising_edge(CLOCK) then
if ( conv_integer(iSCNT) = RMAX-1 ) then
iSCNT <= (others => '0') ;
iCLK <= not iCLK ;
else
iSCNT <= iSCNT + '1' ;
end if ;
end if ;
end process ;
end Behavioral;
動作確認は、次のボードを使いました。
写真の中にあるA、B、C、Dのタックに
あわせたピンアサインは、UCFファイル
に記述してあります。
# system
NET "clock" LOC = "P5" ;
NET "nreset" LOC = "P39" ;
# monitor outpout(A lower nibble)
NET "clk100" LOC = "P1" ;
NET "clk50" LOC = "P2" ;
NET "clk25" LOC = "P3" ;
# selector(A upper nibble)
NET "sel<0>" LOC = "P6" ;
NET "sel<1>" LOC = "P7" ;
# data output(D)
NET "fout" LOC = "P35" ;
LED照光器をマシンの前部に装着すると
次のようになります。
電源は、FPGA+ARM基板かモータドライブ
基板のどちらかから供給できます。
LED照光器を動かすと、コースに対し
光照射するので、上から見ると次の
ようなイメージとなります。
メカ、ハードの改良ができたのでファームウエア
VHDLコードの改造にかかります。
実際に動かしてみると、光量が不足して
いたので、対策を考えました。
基板がLED光を反射するように
アルミテープを貼りました。
これでも、光量が不足する感じなので
昇圧回路を挟むことに。
電源を接続するだけで済ませたいので
インダクタとキャパシタの充放電による
簡単な回路で昇圧しました。
回路図は、以下です。
インダクタの先にあるトランジスタは
28kHzくらいでスイッチングしています。
スイッチング用クロックの生成には、LMC555
を使いました。昇圧回路での消費電力が少なく
なるように、ICを選定しています。
また、インダクタは330uHを並列接続し165uHで
使っています。電流容量を少し増やすためで
手持ちで120uH、500mA程度流せるインダクタなら
1個で済ませられます。
基板に実装すると、次の写真となります。
名刺の半分くらいのサイズになっている
ので、マシンのシャーシに両面テープ等
で貼り付けて走らせます。
この回路で、LEDに与える電圧は直結の
約2倍になりました。
電池入手に、ダイソーへいくと写真
のようなライトが売られていました。
レンズと反射材がついているので
場合により、このライトを使おう
と\105で購入してきました。
白色LEDを実装したユニバーサル基板に
アルミテープを貼付けると、次のように
なりました。
床面に、アルミテープで反射した光が
見えます。
目次
前
次