Header Ads

ロータリーエンコーダでサーボを動かす

Arduinoでロータリーエンコーダでサーボを動かすコードを作りました。10番ピンにサーボ、3,4番ピンにロータリーエンコーダをつなぎました。ロータリーエンコーダの検出がなかなか厄介です。可変抵抗よりノイズが少なくなることを期待したものの、うまく検知できずこちらもまだまだ課題がありそうです。

動作の様子


コード

Blocklyduinoのコードです。インポートして使えます。

<xml xmlns="http://www.w3.org/1999/xhtml"><block type="initializes_setup" id="17" x="188" y="13"><statement name="CONTENT"><block type="variables_set" id="181" inline="true"><field name="TYPE">Number</field><field name="VAR">CLK</field><value name="VALUE"><block type="math_number" id="191"><field name="NUM">0</field></block></value><next><block type="variables_set" id="219" inline="true"><field name="TYPE">Number</field><field name="VAR">DT</field><value name="VALUE"><block type="math_number" id="220"><field name="NUM">0</field></block></value><next><block type="variables_set" id="309" inline="true"><field name="TYPE">Boolean</field><field name="VAR">work</field><value name="VALUE"><block type="logic_boolean" id="324"><field name="BOOL">FALSE</field></block></value><next><block type="variables_set" id="333" inline="true"><field name="TYPE">Number</field><field name="VAR">WAVE</field><value name="VALUE"><block type="math_number" id="334"><field name="NUM">0</field></block></value><next><block type="variables_set" id="356" inline="true"><field name="TYPE">Number</field><field name="VAR">WAVE0</field><value name="VALUE"><block type="math_number" id="357"><field name="NUM">0</field></block></value><next><block type="variables_set" id="543" inline="true"><field name="TYPE">Number</field><field name="VAR">Dbit</field><value name="VALUE"><block type="math_number" id="544"><field name="NUM">0</field></block></value><next><block type="variables_set" id="723" inline="true"><field name="TYPE">Number</field><field name="VAR">Angle</field><value name="VALUE"><block type="math_number" id="726"><field name="NUM">0</field></block></value><next><block type="servo_write" id="707" inline="true"><field name="PIN">10</field><value name="ANGLE"><block type="variables_get" id="759"><field name="TYPE">Number</field><field name="VAR">Angle</field></block></value><next><block type="variables_set" id="974" inline="true"><field name="TYPE">Number</field><field name="VAR">Amp</field><value name="VALUE"><block type="math_number" id="975"><field name="NUM">3</field></block></value></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></next></block></statement><next><block type="controls_while" id="164" inline="false"><value name="BOOL"><block type="logic_boolean" id="165"><field name="BOOL">TRUE</field></block></value><statement name="DO"><block type="procedures_callnoreturn" id="573"><mutation name="make_data"></mutation><next><block type="variables_set" id="657" inline="true"><field name="TYPE">Number</field><field name="VAR">Dbit</field><value name="VALUE"><block type="math_number" id="658"><field name="NUM">0</field></block></value><next><block type="controls_if" id="371" inline="false"><value name="IF0"><block type="logic_compare" id="468" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="451"><field name="TYPE">Boolean</field><field name="VAR">work</field></block></value><value name="B"><block type="logic_boolean" id="469"><field name="BOOL">FALSE</field></block></value></block></value><statement name="DO0"><block type="controls_if" id="483" inline="false"><mutation elseif="1"></mutation><value name="IF0"><block type="logic_operation" id="415" inline="true"><field name="OP">AND</field><value name="A"><block type="logic_compare" id="421" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="396"><field name="TYPE">Number</field><field name="VAR">WAVE0</field></block></value><value name="B"><block type="math_number" id="422"><field name="NUM">0</field></block></value></block></value><value name="B"><block type="logic_compare" id="380" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="409"><field name="TYPE">Number</field><field name="VAR">WAVE</field></block></value><value name="B"><block type="math_number" id="423"><field name="NUM">1</field></block></value></block></value></block></value><statement name="DO0"><block type="variables_set" id="496" inline="true"><field name="TYPE">Boolean</field><field name="VAR">work</field><value name="VALUE"><block type="logic_boolean" id="497"><field name="BOOL">TRUE</field></block></value><next><block type="controls_while" id="511" inline="false"><value name="BOOL"><block type="logic_compare" id="513" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="514"><field name="TYPE">Boolean</field><field name="VAR">work</field></block></value><value name="B"><block type="logic_boolean" id="515"><field name="BOOL">TRUE</field></block></value></block></value><statement name="DO"><block type="procedures_callnoreturn" id="574"><mutation name="make_data"></mutation><next><block type="controls_if" id="521" inline="false"><value name="IF0"><block type="logic_operation" id="522" inline="true"><field name="OP">AND</field><value name="A"><block type="logic_compare" id="523" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="524"><field name="TYPE">Number</field><field name="VAR">WAVE0</field></block></value><value name="B"><block type="math_number" id="525"><field name="NUM">-1</field></block></value></block></value><value name="B"><block type="logic_compare" id="526" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="527"><field name="TYPE">Number</field><field name="VAR">WAVE</field></block></value><value name="B"><block type="math_number" id="528"><field name="NUM">0</field></block></value></block></value></block></value><statement name="DO0"><block type="variables_set" id="561" inline="true"><field name="TYPE">Number</field><field name="VAR">Dbit</field><value name="VALUE"><block type="math_number" id="562"><field name="NUM">1</field></block></value><next><block type="variables_set" id="529" inline="true"><field name="TYPE">Boolean</field><field name="VAR">work</field><value name="VALUE"><block type="logic_boolean" id="530"><field name="BOOL">FALSE</field></block></value></block></next></block></statement></block></next></block></statement></block></next></block></statement><value name="IF1"><block type="logic_operation" id="598" inline="true"><field name="OP">AND</field><value name="A"><block type="logic_compare" id="599" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="600"><field name="TYPE">Number</field><field name="VAR">WAVE0</field></block></value><value name="B"><block type="math_number" id="601"><field name="NUM">0</field></block></value></block></value><value name="B"><block type="logic_compare" id="602" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="603"><field name="TYPE">Number</field><field name="VAR">WAVE</field></block></value><value name="B"><block type="math_number" id="604"><field name="NUM">-1</field></block></value></block></value></block></value><statement name="DO1"><block type="variables_set" id="605" inline="true"><field name="TYPE">Boolean</field><field name="VAR">work</field><value name="VALUE"><block type="logic_boolean" id="606"><field name="BOOL">TRUE</field></block></value><next><block type="controls_while" id="607" inline="false"><value name="BOOL"><block type="logic_compare" id="608" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="609"><field name="TYPE">Boolean</field><field name="VAR">work</field></block></value><value name="B"><block type="logic_boolean" id="610"><field name="BOOL">TRUE</field></block></value></block></value><statement name="DO"><block type="procedures_callnoreturn" id="611"><mutation name="make_data"></mutation><next><block type="controls_if" id="612" inline="false"><value name="IF0"><block type="logic_operation" id="613" inline="true"><field name="OP">AND</field><value name="A"><block type="logic_compare" id="614" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="615"><field name="TYPE">Number</field><field name="VAR">WAVE0</field></block></value><value name="B"><block type="math_number" id="616"><field name="NUM">1</field></block></value></block></value><value name="B"><block type="logic_compare" id="617" inline="true"><field name="OP">EQ</field><value name="A"><block type="variables_get" id="618"><field name="TYPE">Number</field><field name="VAR">WAVE</field></block></value><value name="B"><block type="math_number" id="619"><field name="NUM">0</field></block></value></block></value></block></value><statement name="DO0"><block type="variables_set" id="620" inline="true"><field name="TYPE">Number</field><field name="VAR">Dbit</field><value name="VALUE"><block type="math_number" id="621"><field name="NUM">-1</field></block></value><next><block type="variables_set" id="622" inline="true"><field name="TYPE">Boolean</field><field name="VAR">work</field><value name="VALUE"><block type="logic_boolean" id="623"><field name="BOOL">FALSE</field></block></value></block></next></block></statement></block></next></block></statement></block></next></block></statement></block></statement><next><block type="variables_set" id="778" inline="true"><field name="TYPE">Number</field><field name="VAR">Angle</field><value name="VALUE"><block type="cast_number" id="1048" inline="true"><field name="TYPE">(int)</field><value name="VAR"><block type="math_arithmetic" id="819" inline="true"><field name="OP">ADD</field><value name="A"><block type="variables_get" id="795"><field name="TYPE">Number</field><field name="VAR">Angle</field></block></value><value name="B"><block type="math_arithmetic" id="985" inline="true"><field name="OP">MULTIPLY</field><value name="A"><block type="variables_get" id="1004"><field name="TYPE">Number</field><field name="VAR">Amp</field></block></value><value name="B"><block type="variables_get" id="836"><field name="TYPE">Number</field><field name="VAR">Dbit</field></block></value></block></value></block></value></block></value><next><block type="controls_if" id="842" inline="false"><mutation elseif="1"></mutation><value name="IF0"><block type="logic_compare" id="888" inline="true"><field name="OP">LTE</field><value name="A"><block type="variables_get" id="933"><field name="TYPE">Number</field><field name="VAR">Angle</field></block></value><value name="B"><block type="math_number" id="934"><field name="NUM">0</field></block></value></block></value><statement name="DO0"><block type="variables_set" id="951" inline="true"><field name="TYPE">Number</field><field name="VAR">Angle</field><value name="VALUE"><block type="math_number" id="952"><field name="NUM">0</field></block></value></block></statement><value name="IF1"><block type="logic_compare" id="953" inline="true"><field name="OP">GTE</field><value name="A"><block type="variables_get" id="954"><field name="TYPE">Number</field><field name="VAR">Angle</field></block></value><value name="B"><block type="math_number" id="955"><field name="NUM">180</field></block></value></block></value><statement name="DO1"><block type="variables_set" id="956" inline="true"><field name="TYPE">Number</field><field name="VAR">Angle</field><value name="VALUE"><block type="math_number" id="957"><field name="NUM">180</field></block></value></block></statement><next><block type="servo_write" id="760" inline="true"><field name="PIN">10</field><value name="ANGLE"><block type="variables_get" id="761"><field name="TYPE">Number</field><field name="VAR">Angle</field></block></value><next><block type="serial_println" id="672" inline="false"><value name="CONTENT"><block type="variables_get" id="697"><field name="TYPE">Number</field><field name="VAR">Angle</field></block></value></block></next></block></next></block></next></block></next></block></next></block></next></block></statement></block></next></block><block type="procedures_defnoreturn" id="168" x="913" y="88"><mutation></mutation><field name="NAME">convert_CLK</field><statement name="STACK"><block type="controls_if" id="174" inline="false"><mutation else="1"></mutation><value name="IF0"><block type="inout_digital_read" id="25"><field name="PIN">3</field><field name="INPUT_MODE">INPUT_PULLUP</field></block></value><statement name="DO0"><block type="variables_set" id="196" inline="true"><field name="TYPE">Number</field><field name="VAR">CLK</field><value name="VALUE"><block type="math_number" id="197"><field name="NUM">1</field></block></value></block></statement><statement name="ELSE"><block type="variables_set" id="198" inline="true"><field name="TYPE">Number</field><field name="VAR">CLK</field><value name="VALUE"><block type="math_number" id="199"><field name="NUM">0</field></block></value></block></statement></block></statement></block><block type="procedures_defnoreturn" id="566" x="913" y="288"><mutation></mutation><field name="NAME">make_data</field><statement name="STACK"><block type="variables_set" id="575" inline="true"><field name="TYPE">Number</field><field name="VAR">WAVE0</field><value name="VALUE"><block type="variables_get" id="593"><field name="TYPE">Number</field><field name="VAR">WAVE</field></block></value><next><block type="procedures_callnoreturn" id="207"><mutation name="convert_CLK"></mutation><next><block type="procedures_callnoreturn" id="234"><mutation name="convert_DT"></mutation><next><block type="variables_set" id="345" inline="true"><field name="TYPE">Number</field><field name="VAR">WAVE</field><value name="VALUE"><block type="math_arithmetic" id="250" inline="true"><field name="OP">MINUS</field><value name="A"><block type="variables_get" id="286"><field name="TYPE">Number</field><field name="VAR">CLK</field></block></value><value name="B"><block type="variables_get" id="293"><field name="TYPE">Number</field><field name="VAR">DT</field></block></value></block></value></block></next></block></next></block></next></block></statement></block><block type="procedures_defnoreturn" id="223" x="913" y="488"><mutation></mutation><field name="NAME">convert_DT</field><statement name="STACK"><block type="controls_if" id="225" inline="false"><mutation else="1"></mutation><value name="IF0"><block type="inout_digital_read" id="226"><field name="PIN">4</field><field name="INPUT_MODE">INPUT_PULLUP</field></block></value><statement name="DO0"><block type="variables_set" id="227" inline="true"><field name="TYPE">Number</field><field name="VAR">DT</field><value name="VALUE"><block type="math_number" id="228"><field name="NUM">1</field></block></value></block></statement><statement name="ELSE"><block type="variables_set" id="229" inline="true"><field name="TYPE">Number</field><field name="VAR">DT</field><value name="VALUE"><block type="math_number" id="230"><field name="NUM">0</field></block></value></block></statement></block></statement></block></xml>
Powered by Blogger.