EDX-007でサーボモーターを動かしてみた

August 09, 2015

数年前に購入していたEDX-007というFPGA教育ボードを使って先日購入したサーボモーターを動かしてみました。EDX-007を使った理由はHDLの勉強がしたかったからで、それ以外に特に理由はありません。また、できる限りコストを下げたかったので、モーターの電源はUSBケーブル経由でPCからとり、電源回路は用意しませんでした。久々の電子工作だったので、結線するのに手間取りましたが、一回目のコンフィグレーションであっさり動いてしまいました。サーボモーターがいろいろ仕事をやってくれているので当然かもしれませんが、こんな単純な回路でも動くとやっぱり嬉しいものです。参考にした「二足歩行ロボット製作超入門」という本ではマイコンのPWM出力とサーボの信号線の間に1kΩの抵抗を入れていたのですが、今回使用したFPGAのI/Oピンとモータの信号入力は直接繋いで抵抗は入れませんでした(他に参考にしたサイトでは抵抗を使ってなかったので)。また、「FPGAマガジンNo.7」では、FPGAの制御信号にバッファを入れて5Vに近い電圧にしていたのですが、持ち合わせがなかったので、I/OピンをLVCMOS33(3.3V)に設定しました。部品としては、EDX-007とRCサーボ以外はコネクタやケーブル類だけです。ちなみに今回実装したVerilogHDLのソースは下記のようなものです。EDX-007についているボタンを押すと、サーボモーターが回転して角度が変わるだけの単純なものです。

`define DIV 16'h03a9
module pwm( input wire sw1, input wire sw2, input wire clk, output reg sig );
    reg [7:0] cnt;
    reg [15:0] div;
    wire [7:0] dutyout;
    assign dutyout = duty(sw1, sw2); 

    function [7:0] duty;
        input sw1, sw2;
        begin
            duty = (sw1 && sw2) ? 8'h08 :
                        (sw1 && !sw2) ? 8'h1a :
                        (!sw1 && sw2) ? 8'h1e :
                        8'h13;
        end
    endfunction 

    always @(posedge clk) begin
        div <= (div == `DIV) ? 16'h0000 : div + 16'h00001;
        cnt <= cnt + (div == 0);
        sig <= (dutyout >= cnt);
    end
endmodule