init
This commit is contained in:
parent
6071ba3b24
commit
50e539afa7
|
@ -1,3 +1,8 @@
|
||||||
# toneroulette
|
# toneroulette
|
||||||
|
|
||||||
Educational game for children: "Guess The Note" based on Arudino, buzzer, RGB LED, servo and rotary encoder
|
Educational game for children: "Guess The Note" based on Arudino, buzzer, RGB LED, servo and rotary encoder
|
||||||
|
|
||||||
|
![toneroulette](https://dev.ussr.win/microcontrollers/toneroulette/raw/branch/master/toneroulette_agg.jpg)
|
||||||
|
|
||||||
|
![toneroulette](https://dev.ussr.win/microcontrollers/toneroulette/raw/branch/master/toneroulette_bb.jpg)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,537 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg
|
||||||
|
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||||
|
xmlns:cc="http://creativecommons.org/ns#"
|
||||||
|
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||||
|
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||||
|
width="210mm"
|
||||||
|
height="297mm"
|
||||||
|
viewBox="0 0 210 297"
|
||||||
|
version="1.1"
|
||||||
|
id="svg8"
|
||||||
|
sodipodi:docname="barrel.svg"
|
||||||
|
inkscape:version="1.0.2 (e86c870879, 2021-01-15)"
|
||||||
|
inkscape:export-filename="/home/feder/bitmap.png"
|
||||||
|
inkscape:export-xdpi="190.02963"
|
||||||
|
inkscape:export-ydpi="190.02963">
|
||||||
|
<defs
|
||||||
|
id="defs2">
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797257"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1317" />
|
||||||
|
<rect
|
||||||
|
x="102.86595"
|
||||||
|
y="58.074068"
|
||||||
|
width="17.262081"
|
||||||
|
height="22.162882"
|
||||||
|
id="rect1295" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1317-8" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1336" />
|
||||||
|
<filter
|
||||||
|
inkscape:collect="always"
|
||||||
|
style="color-interpolation-filters:sRGB"
|
||||||
|
id="filter1371"
|
||||||
|
x="-0.0039488089"
|
||||||
|
width="1.0078976"
|
||||||
|
y="-0.0033078121"
|
||||||
|
height="1.0066156">
|
||||||
|
<feGaussianBlur
|
||||||
|
inkscape:collect="always"
|
||||||
|
stdDeviation="0.029265564"
|
||||||
|
id="feGaussianBlur1373" />
|
||||||
|
</filter>
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1317-8-9" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1384" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1317-8-5" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1384-2" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1317-8-2" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1384-6" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1317-8-5-6" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1489" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="35.164084"
|
||||||
|
height="29.567182"
|
||||||
|
id="rect1317-8-5-62" />
|
||||||
|
<rect
|
||||||
|
x="102.37154"
|
||||||
|
y="58.797256"
|
||||||
|
width="19.673576"
|
||||||
|
height="28.400667"
|
||||||
|
id="rect1489-4" />
|
||||||
|
</defs>
|
||||||
|
<sodipodi:namedview
|
||||||
|
id="base"
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1.0"
|
||||||
|
inkscape:pageopacity="0.0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:zoom="0.7"
|
||||||
|
inkscape:cx="599.26614"
|
||||||
|
inkscape:cy="673.23808"
|
||||||
|
inkscape:document-units="mm"
|
||||||
|
inkscape:current-layer="layer1"
|
||||||
|
inkscape:document-rotation="0"
|
||||||
|
showgrid="false"
|
||||||
|
inkscape:window-width="1280"
|
||||||
|
inkscape:window-height="1007"
|
||||||
|
inkscape:window-x="1280"
|
||||||
|
inkscape:window-y="0"
|
||||||
|
inkscape:window-maximized="1" />
|
||||||
|
<metadata
|
||||||
|
id="metadata5">
|
||||||
|
<rdf:RDF>
|
||||||
|
<cc:Work
|
||||||
|
rdf:about="">
|
||||||
|
<dc:format>image/svg+xml</dc:format>
|
||||||
|
<dc:type
|
||||||
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
|
</cc:Work>
|
||||||
|
</rdf:RDF>
|
||||||
|
</metadata>
|
||||||
|
<g
|
||||||
|
inkscape:label="Layer 1"
|
||||||
|
inkscape:groupmode="layer"
|
||||||
|
id="layer1">
|
||||||
|
<circle
|
||||||
|
style="fill:#cccccc;fill-rule:evenodd;stroke-width:0.264583"
|
||||||
|
id="path10"
|
||||||
|
cx="112.5"
|
||||||
|
cy="127"
|
||||||
|
r="80"
|
||||||
|
sodipodi:insensitive="true" />
|
||||||
|
<circle
|
||||||
|
style="fill:#333333;stroke-width:0.921539"
|
||||||
|
id="path863"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.855179"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="0"
|
||||||
|
sodipodi:end="0.52359878"
|
||||||
|
sodipodi:arc-type="slice"
|
||||||
|
d="m 153.35902,151.64351 a 77.503838,77.503838 0 0 1 -10.38355,38.75192 L 75.855179,151.64351 Z"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#e6e6e6;stroke-width:0.921539"
|
||||||
|
id="path863-8"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.855179"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="5.7595865"
|
||||||
|
sodipodi:end="0"
|
||||||
|
sodipodi:arc-type="slice"
|
||||||
|
d="m 142.97547,112.89159 a 77.503838,77.503838 0 0 1 10.38355,38.75192 H 75.855179 Z"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#333333;stroke-width:0.923732"
|
||||||
|
id="path863-7"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.855179"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.873207"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="5.2359878"
|
||||||
|
sodipodi:end="5.7595865"
|
||||||
|
sodipodi:arc-type="slice"
|
||||||
|
d="m 114.79179,84.523218 a 77.873207,77.503838 0 0 1 28.50356,28.368372 l -67.440171,38.75192 z"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#333333;stroke-width:0.921539"
|
||||||
|
id="path863-85"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.855179"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="4.1887902"
|
||||||
|
sodipodi:end="4.712389"
|
||||||
|
sodipodi:arc-type="slice"
|
||||||
|
d="M 37.10326,84.523217 A 77.503838,77.503838 0 0 1 75.855179,74.139671 v 77.503839 z"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#333333;stroke-width:0.921539"
|
||||||
|
id="path863-4"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.855179"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="3.1415927"
|
||||||
|
sodipodi:end="3.6651914"
|
||||||
|
sodipodi:arc-type="slice"
|
||||||
|
d="M -1.6486588,151.64351 A 77.503838,77.503838 0 0 1 8.7348855,112.89159 l 67.1202935,38.75192 z"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#e6e6e6;stroke-width:0.921539"
|
||||||
|
id="path863-8-5"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="76.175064"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="4.712389"
|
||||||
|
sodipodi:end="5.2359878"
|
||||||
|
sodipodi:arc-type="slice"
|
||||||
|
d="M 76.175064,74.139671 A 77.503838,77.503838 0 0 1 114.92699,84.523218 L 76.175064,151.64351 Z"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#e6e6e6;stroke-width:0.921539"
|
||||||
|
id="path863-8-8"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="76.175064"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="3.6651914"
|
||||||
|
sodipodi:end="4.1887902"
|
||||||
|
sodipodi:arc-type="slice"
|
||||||
|
d="M 9.0547707,112.89159 A 77.503838,77.503838 0 0 1 37.423145,84.523217 l 38.751919,67.120293 z"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#666666;stroke-width:0.921539"
|
||||||
|
id="path863-8-6"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.855179"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="5.7595865"
|
||||||
|
sodipodi:end="0"
|
||||||
|
sodipodi:arc-type="chord"
|
||||||
|
d="m 142.97547,112.89159 a 77.503838,77.503838 0 0 1 10.38355,38.75192 z"
|
||||||
|
sodipodi:open="true"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#666666;stroke-width:0.921539"
|
||||||
|
id="path863-8-5-6"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="76.039864"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="4.712389"
|
||||||
|
sodipodi:end="5.2359878"
|
||||||
|
sodipodi:arc-type="chord"
|
||||||
|
d="M 76.039864,74.139671 A 77.503838,77.503838 0 0 1 114.79179,84.523218 Z"
|
||||||
|
sodipodi:open="true"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#666666;stroke-width:0.921539"
|
||||||
|
id="path863-8-8-3"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="76.175064"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="3.6651914"
|
||||||
|
sodipodi:end="4.1887902"
|
||||||
|
sodipodi:arc-type="chord"
|
||||||
|
d="M 9.0547707,112.89159 A 77.503838,77.503838 0 0 1 37.423145,84.523217 Z"
|
||||||
|
sodipodi:open="true"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#4d4d4d;stroke-width:0.921539"
|
||||||
|
id="path863-72"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.855179"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="0"
|
||||||
|
sodipodi:end="0.52359878"
|
||||||
|
sodipodi:arc-type="chord"
|
||||||
|
d="m 153.35902,151.64351 a 77.503838,77.503838 0 0 1 -10.38355,38.75192 z"
|
||||||
|
sodipodi:open="true"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#666666;stroke-width:0.923732"
|
||||||
|
id="path863-7-2"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.990379"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.873207"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="5.2359878"
|
||||||
|
sodipodi:end="5.7595865"
|
||||||
|
sodipodi:arc-type="chord"
|
||||||
|
d="m 114.92699,84.523218 a 77.873207,77.503838 0 0 1 28.50356,28.368372 z"
|
||||||
|
sodipodi:open="true"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#666666;stroke-width:0.921539"
|
||||||
|
id="path863-85-5"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="76.175064"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="4.1887902"
|
||||||
|
sodipodi:end="4.712389"
|
||||||
|
sodipodi:arc-type="chord"
|
||||||
|
d="M 37.423145,84.523217 A 77.503838,77.503838 0 0 1 76.175064,74.139671 Z"
|
||||||
|
sodipodi:open="true"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#666666;stroke-width:0.921539"
|
||||||
|
id="path863-4-5"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="75.855179"
|
||||||
|
sodipodi:cy="151.64351"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="3.1415927"
|
||||||
|
sodipodi:end="3.6651914"
|
||||||
|
sodipodi:arc-type="chord"
|
||||||
|
d="M -1.6486588,151.64351 A 77.503838,77.503838 0 0 1 8.7348855,112.89159 Z"
|
||||||
|
sodipodi:open="true"
|
||||||
|
transform="rotate(-15)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
id="text1315"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect1317);fill:#e6e6e6;fill-opacity:1;stroke:none;filter:url(#filter1371);"
|
||||||
|
x="8.9477463"
|
||||||
|
y="0"
|
||||||
|
transform="rotate(-90,114.48492,125.01285)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313"><tspan
|
||||||
|
x="102.99671"
|
||||||
|
y="68.160615"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#e6e6e6">ДО </tspan></tspan><tspan
|
||||||
|
x="108.32454"
|
||||||
|
y="81.389741"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#e6e6e6">C</tspan></tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
id="text1315-5"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect1317-8);fill:#e6e6e6;fill-opacity:1;stroke:none;"
|
||||||
|
x="8.9477463"
|
||||||
|
y="0"
|
||||||
|
transform="rotate(-30,124.36985,125.32297)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313"><tspan
|
||||||
|
x="102.51354"
|
||||||
|
y="68.160615"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#e6e6e6">МИ </tspan></tspan><tspan
|
||||||
|
x="108.59325"
|
||||||
|
y="81.389741"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#e6e6e6">E</tspan></tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
id="text1315-5-8"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect1317-8-9);fill:#000000;fill-opacity:1;stroke:none;"
|
||||||
|
x="8.9477463"
|
||||||
|
y="0"
|
||||||
|
transform="rotate(-60,117.77986,124.80921)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313"><tspan
|
||||||
|
x="104.71495"
|
||||||
|
y="68.160615"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle">РЕ </tspan></tspan><tspan
|
||||||
|
x="107.81553"
|
||||||
|
y="81.389741"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle">D</tspan></tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
id="text1315-5-0"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect1317-8-5);fill:#000000;fill-opacity:1;stroke:none;"
|
||||||
|
x="8.9477463"
|
||||||
|
y="0"
|
||||||
|
transform="translate(0.0550113,8.5196754)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313"><tspan
|
||||||
|
x="102.86494"
|
||||||
|
y="68.160615"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle">ФА </tspan></tspan><tspan
|
||||||
|
x="108.59325"
|
||||||
|
y="81.389741"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle">F</tspan></tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
id="text1315-5-2"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect1317-8-2);fill:#000000;fill-opacity:1;stroke:none;"
|
||||||
|
x="8.9477463"
|
||||||
|
y="0"
|
||||||
|
transform="rotate(60,107.0215,124.70427)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313"><tspan
|
||||||
|
x="103.73827"
|
||||||
|
y="68.160615"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle">ЛЯ </tspan></tspan><tspan
|
||||||
|
x="108.11266"
|
||||||
|
y="81.389741"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle">A</tspan></tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
id="text1315-5-0-2"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect1317-8-5-6);fill:#e6e6e6;fill-opacity:1;stroke:none;"
|
||||||
|
x="8.9477463"
|
||||||
|
y="0"
|
||||||
|
transform="rotate(90,109.01627,123.33367)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313"><tspan
|
||||||
|
x="103.89588"
|
||||||
|
y="68.160615"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#e6e6e6">СИ </tspan></tspan><tspan
|
||||||
|
x="108.17468"
|
||||||
|
y="81.389741"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:10.5833px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#e6e6e6">B</tspan></tspan></text>
|
||||||
|
<text
|
||||||
|
xml:space="preserve"
|
||||||
|
id="text1315-5-0-8"
|
||||||
|
style="font-style:normal;font-weight:normal;font-size:10.5833px;line-height:1.25;font-family:sans-serif;white-space:pre;shape-inside:url(#rect1317-8-5-62);fill:#e6e6e6;fill-opacity:1;stroke:none;"
|
||||||
|
x="8.9477463"
|
||||||
|
y="0"
|
||||||
|
transform="rotate(30,103.8382,110.03236)"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313"><tspan
|
||||||
|
x="105.38416"
|
||||||
|
y="68.160615"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:9.17222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#e6e6e6">СОЛЬ </tspan></tspan><tspan
|
||||||
|
x="116.18884"
|
||||||
|
y="81.389741"><tspan
|
||||||
|
style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:9.17222px;font-family:sans-serif;-inkscape-font-specification:'sans-serif, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;text-align:center;text-anchor:middle;fill:#e6e6e6">G</tspan></tspan></text>
|
||||||
|
<path
|
||||||
|
d="m 131.24283,144.32911 c -20.16811,-0.5667 -36.687408,5.71934 -36.687408,5.71934 l -0.01206,31.90022 c -2.053475,-0.68879 -4.550633,-0.85208 -7.086925,-0.33118 -5.468106,1.12272 -9.048894,4.99546 -7.997776,8.65151 1.05112,3.65604 6.33561,5.71018 11.803115,4.58799 5.155661,-1.05862 8.631697,-4.56256 8.131419,-8.02326 v -23.83524 c 0,0 11.681505,-3.45105 26.833645,-4.31634 v 17.72776 c -2.03121,-0.65724 -4.48081,-0.80629 -6.97075,-0.29505 -5.4681,1.12221 -9.04889,4.99496 -7.99777,8.6515 1.05051,3.65604 6.33501,5.70969 11.80311,4.58749 4.77459,-0.98028 8.10975,-4.05793 8.17958,-7.25613 l 0.002,0.002 z"
|
||||||
|
fill="#000000"
|
||||||
|
id="path1676"
|
||||||
|
style="stroke-width:0.553395"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<circle
|
||||||
|
style="fill:#e6e6e6;stroke-width:0.921539"
|
||||||
|
id="path863-8-5-4"
|
||||||
|
sodipodi:type="arc"
|
||||||
|
sodipodi:cx="-262.00809"
|
||||||
|
sodipodi:cy="87.914368"
|
||||||
|
sodipodi:rx="77.503838"
|
||||||
|
sodipodi:ry="77.503838"
|
||||||
|
sodipodi:start="4.712389"
|
||||||
|
sodipodi:end="5.2359878"
|
||||||
|
sodipodi:arc-type="slice"
|
||||||
|
transform="rotate(-105)"
|
||||||
|
d="m -262.00809,10.41053 a 77.503838,77.503838 0 0 1 38.75192,10.383547 l -38.75192,67.120291 z"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
<path
|
||||||
|
d="m 104.84436,237.2632 c 0.22608,-7.12287 -2.2817,-12.95706 -2.2817,-12.95706 l -12.726413,-0.004 c 0.2748,-0.72525 0.33993,-1.60717 0.13212,-2.50293 -0.4479,-1.93119 -1.9929,-3.19584 -3.45146,-2.82461 -1.45856,0.37123 -2.27805,2.23758 -1.83036,4.16856 0.42233,1.82085 1.82021,3.0485 3.20084,2.87182 h 9.50894 c 0,0 1.37677,4.12561 1.72198,9.47696 h -7.0724 c 0.2622,-0.71737 0.32167,-1.58251 0.11774,-2.46189 -0.4477,-1.93119 -1.99271,-3.19584 -3.45148,-2.82461 -1.45855,0.37101 -2.27785,2.23737 -1.83014,4.16856 0.39107,1.68626 1.61888,2.86416 2.89478,2.88882 l -7.9e-4,7e-4 z"
|
||||||
|
fill="#000000"
|
||||||
|
id="path1676-4"
|
||||||
|
style="stroke-width:0.207724"
|
||||||
|
inkscape:export-filename="/home/feder/path863.png"
|
||||||
|
inkscape:export-xdpi="278.46313"
|
||||||
|
inkscape:export-ydpi="278.46313" />
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 24 KiB |
|
@ -0,0 +1,95 @@
|
||||||
|
/*************************************************
|
||||||
|
|
||||||
|
* Public Constants
|
||||||
|
|
||||||
|
*************************************************/
|
||||||
|
|
||||||
|
#define NOTE_B0 31
|
||||||
|
#define NOTE_C1 33
|
||||||
|
#define NOTE_CS1 35
|
||||||
|
#define NOTE_D1 37
|
||||||
|
#define NOTE_DS1 39
|
||||||
|
#define NOTE_E1 41
|
||||||
|
#define NOTE_F1 44
|
||||||
|
#define NOTE_FS1 46
|
||||||
|
#define NOTE_G1 49
|
||||||
|
#define NOTE_GS1 52
|
||||||
|
#define NOTE_A1 55
|
||||||
|
#define NOTE_AS1 58
|
||||||
|
#define NOTE_B1 62
|
||||||
|
#define NOTE_C2 65
|
||||||
|
#define NOTE_CS2 69
|
||||||
|
#define NOTE_D2 73
|
||||||
|
#define NOTE_DS2 78
|
||||||
|
#define NOTE_E2 82
|
||||||
|
#define NOTE_F2 87
|
||||||
|
#define NOTE_FS2 93
|
||||||
|
#define NOTE_G2 98
|
||||||
|
#define NOTE_GS2 104
|
||||||
|
#define NOTE_A2 110
|
||||||
|
#define NOTE_AS2 117
|
||||||
|
#define NOTE_B2 123
|
||||||
|
#define NOTE_C3 131
|
||||||
|
#define NOTE_CS3 139
|
||||||
|
#define NOTE_D3 147
|
||||||
|
#define NOTE_DS3 156
|
||||||
|
#define NOTE_E3 165
|
||||||
|
#define NOTE_F3 175
|
||||||
|
#define NOTE_FS3 185
|
||||||
|
#define NOTE_G3 196
|
||||||
|
#define NOTE_GS3 208
|
||||||
|
#define NOTE_A3 220
|
||||||
|
#define NOTE_AS3 233
|
||||||
|
#define NOTE_B3 247
|
||||||
|
#define NOTE_C4 262
|
||||||
|
#define NOTE_CS4 277
|
||||||
|
#define NOTE_D4 294
|
||||||
|
#define NOTE_DS4 311
|
||||||
|
#define NOTE_E4 330
|
||||||
|
#define NOTE_F4 349
|
||||||
|
#define NOTE_FS4 370
|
||||||
|
#define NOTE_G4 392
|
||||||
|
#define NOTE_GS4 415
|
||||||
|
#define NOTE_A4 440
|
||||||
|
#define NOTE_AS4 466
|
||||||
|
#define NOTE_B4 494
|
||||||
|
#define NOTE_C5 523
|
||||||
|
#define NOTE_CS5 554
|
||||||
|
#define NOTE_D5 587
|
||||||
|
#define NOTE_DS5 622
|
||||||
|
#define NOTE_E5 659
|
||||||
|
#define NOTE_F5 698
|
||||||
|
#define NOTE_FS5 740
|
||||||
|
#define NOTE_G5 784
|
||||||
|
#define NOTE_GS5 831
|
||||||
|
#define NOTE_A5 880
|
||||||
|
#define NOTE_AS5 932
|
||||||
|
#define NOTE_B5 988
|
||||||
|
#define NOTE_C6 1047
|
||||||
|
#define NOTE_CS6 1109
|
||||||
|
#define NOTE_D6 1175
|
||||||
|
#define NOTE_DS6 1245
|
||||||
|
#define NOTE_E6 1319
|
||||||
|
#define NOTE_F6 1397
|
||||||
|
#define NOTE_FS6 1480
|
||||||
|
#define NOTE_G6 1568
|
||||||
|
#define NOTE_GS6 1661
|
||||||
|
#define NOTE_A6 1760
|
||||||
|
#define NOTE_AS6 1865
|
||||||
|
#define NOTE_B6 1976
|
||||||
|
#define NOTE_C7 2093
|
||||||
|
#define NOTE_CS7 2217
|
||||||
|
#define NOTE_D7 2349
|
||||||
|
#define NOTE_DS7 2489
|
||||||
|
#define NOTE_E7 2637
|
||||||
|
#define NOTE_F7 2794
|
||||||
|
#define NOTE_FS7 2960
|
||||||
|
#define NOTE_G7 3136
|
||||||
|
#define NOTE_GS7 3322
|
||||||
|
#define NOTE_A7 3520
|
||||||
|
#define NOTE_AS7 3729
|
||||||
|
#define NOTE_B7 3951
|
||||||
|
#define NOTE_C8 4186
|
||||||
|
#define NOTE_CS8 4435
|
||||||
|
#define NOTE_D8 4699
|
||||||
|
#define NOTE_DS8 4978
|
|
@ -0,0 +1,187 @@
|
||||||
|
#include "pitches.h" // загрузить ноты из pitches.h
|
||||||
|
#include "Servo.h" // загрузить стандартную библиотеку Servo.h
|
||||||
|
Servo myservo; // создать объект сервопривода myservo для его контроя
|
||||||
|
const int redLED = 4; // красный пин светодиода
|
||||||
|
const int greenLED = 5; // зелёный пин светодиода
|
||||||
|
const int blueLED = 6; // синий пин светодиода
|
||||||
|
const int buzzer = 7; // сигнальный пин пищалки
|
||||||
|
const int servo = 9; // контрольный пин сервопривода
|
||||||
|
const int encDT = 2; // пин правого поворота (DT) поворотного регулятора
|
||||||
|
const int encCLK = 3; // пин левого поворота (CLK) поворотного регулятора
|
||||||
|
const int encSW = 8; // пин нажатия (SW) поворотного регулятора
|
||||||
|
volatile unsigned int encPos = 32768; // счётчик позиции поворотного регулятора
|
||||||
|
unsigned int lastReportedPos = 32768; // последнее записанное значение позиции поворотного регулятора
|
||||||
|
static boolean rotating = false; // управление поворотом регулятора
|
||||||
|
boolean right_set = false; // переменная процедуры правого поворота регулятора
|
||||||
|
boolean left_set = false; // переменная процедуры левого поворота регулятора
|
||||||
|
int pos = 0; // переменная позиции сервопривода
|
||||||
|
int posnote = 0; // переменная ноты на которую указывает сервопривод
|
||||||
|
int playednote = 0; // переменная хранящая последнюю сыгранную ноту
|
||||||
|
int gamma[] = {NOTE_B3, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5}; // си3-до5
|
||||||
|
|
||||||
|
void setup() { // функция выполняемая при запуске
|
||||||
|
Serial.begin(9600); // инициализация серийного монитора
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT); // определение встроенного светодиода
|
||||||
|
digitalWrite(LED_BUILTIN, LOW); // выключить встроенный светодиод подав напряжение низкого уровня
|
||||||
|
pinMode(buzzer, OUTPUT); // определение пищалки на выходной сигнал
|
||||||
|
pinMode(encDT, INPUT_PULLUP); // определение правого поворота регулятора на вход с подтягивающим резистором
|
||||||
|
pinMode(encCLK, INPUT_PULLUP); // определение левого поворота регулятора на вход с подтягивающим резистором
|
||||||
|
pinMode(encSW, INPUT_PULLUP); // определение нажатия регулятора на вход с подтягивающим резистором
|
||||||
|
attachInterrupt(0, encRight, CHANGE); // контакт регулятора на прерывании 0 (право)
|
||||||
|
attachInterrupt(1, encLeft, CHANGE); // контакт регулятора на прерывании 1 (лево)
|
||||||
|
// randomSeed(analogRead(0)); // устновка случайного семени в зависимости от напряжения на незанетом пине
|
||||||
|
initAll(); // вызов функции иниализации пищалки, светодиода и севпривода
|
||||||
|
randomNote(); // вызов функции проигрывания случайной ноты
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() { // функция выполняемая постоянно
|
||||||
|
rotating = true; // указание состояния поворота регулятора
|
||||||
|
if (lastReportedPos != encPos) { // если последнее записанное значение поворота регулятора неравно нынешнему положению
|
||||||
|
// Serial.print("POS:"); Serial.print(pos); Serial.print("IN:"); Serial.println(encPos, DEC); // вывод значений для отладки
|
||||||
|
if (lastReportedPos < encPos) { // если последнее записанное значение поворота регулятора меньше нынешнего
|
||||||
|
if (pos > 10) rotateRight (pos, (pos-30)); // если позиция севопривода больше 10 - повернуть вправо на 30 градусов
|
||||||
|
}
|
||||||
|
if (lastReportedPos > encPos) { // если последнее записанное значение поворота регулятора больше нынешнего
|
||||||
|
if (pos < 170) rotateLeft (pos, (pos+30)); // если позиция севопривода меньше 170 - повернуть влево на 30 градусов
|
||||||
|
}
|
||||||
|
lastReportedPos = encPos; // последнему записанному значению присвоить нынешнее значение регулятора
|
||||||
|
}
|
||||||
|
if (digitalRead(encSW) == LOW ) { // если нажата кнопка
|
||||||
|
posnote = ((((pos / 30) + 1) - 8) * (-1)); // вычисление ноты на которую указывает сервопривод
|
||||||
|
// Serial.print("NOTE:"); Serial.println(posnote); // вывод значений для отладки
|
||||||
|
if (posnote == playednote) { // если сервопривод указывает на последнюю сыгранную ноту
|
||||||
|
int blinking; // объявление временной переменной мерцания светодиода
|
||||||
|
for (blinking = 0; blinking < 10; blinking += 1) { // цикл 10 шагов мерцания от 0 до 9
|
||||||
|
colourGreen(); // зелёный свет светодиода
|
||||||
|
delay(200); // задержка в 200 миллисекунд
|
||||||
|
colourBlue(); // синий свет светодиода
|
||||||
|
delay(200); // задержка в 200 миллисекунд
|
||||||
|
}
|
||||||
|
colourOff(); // выключить свечение светодиода
|
||||||
|
delay(1000); // задержка в 1000 миллисекунд
|
||||||
|
randomNote(); // вызов функции проигрывания случайной ноты
|
||||||
|
} else { // иначе
|
||||||
|
colourRed(); // красный свет светодиода
|
||||||
|
delay(1000); // задержка в 1000 миллисекунд
|
||||||
|
colourOff(); // выключить свечение светодиода
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourRandom() { // функция случайного цвета светодиода
|
||||||
|
analogWrite(redLED, random(0,255)); // случайное значение красного
|
||||||
|
analogWrite(greenLED, random(0,255)); // случайное значение зелёного
|
||||||
|
analogWrite(blueLED, random(0,255)); // случайное значение синего
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourRed() { // функция красного цвета светодиода
|
||||||
|
analogWrite(redLED, 255); // максимальное значение красного
|
||||||
|
analogWrite(greenLED, 0); // минимальное значение зелёного
|
||||||
|
analogWrite(blueLED, 0); // минимальное значение синего
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourGreen() { // функция зелёного цвета светодиода
|
||||||
|
analogWrite(redLED, 0); // минимальное значение красного
|
||||||
|
analogWrite(greenLED, 255); // максимальное значение зелёного
|
||||||
|
analogWrite(blueLED, 0); // минимальное значение синего
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourBlue() { // функция синего цвета светодиода
|
||||||
|
analogWrite(redLED, 0); // минимальное значение красного
|
||||||
|
analogWrite(greenLED, 0); // минимальное значение зелёного
|
||||||
|
analogWrite(blueLED, 255); // максимальное значение синего
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourOff() { // функция отсутствия цвета светодиода
|
||||||
|
analogWrite(redLED, 0); // минимальное значение красного
|
||||||
|
analogWrite(greenLED, 0); // минимальное значение зелёного
|
||||||
|
analogWrite(blueLED, 0); // минимальное значение синего
|
||||||
|
}
|
||||||
|
|
||||||
|
void rotateLeft(int posFrom, int posTo) { // функция поворота сервопривода влево
|
||||||
|
delay(32); // подождать 32 миллисекундыы
|
||||||
|
myservo.attach(servo); // присоединиться к сервоприводу
|
||||||
|
delay(32); // подождать 32 миллисекунды
|
||||||
|
for (pos = posFrom; pos < posTo; pos += 1) { // цикл увеличения позиции с posFrom до postTo с шагом в 1 градус
|
||||||
|
myservo.write(pos); // сообщить сервоприводу переместиться в позицию pos
|
||||||
|
delay(15); // подождать 15 миллисекунд для достижения позиции
|
||||||
|
}
|
||||||
|
// Serial.print("LEFTfrom:"); Serial.print(posFrom); Serial.print("to:"); Serial.print(posTo); Serial.print("cur:"); Serial.println(pos); // вывод значений для отладки
|
||||||
|
delay(32); // подождать 32 миллисекунды
|
||||||
|
myservo.detach(); // отсоединиться от сервопривода
|
||||||
|
delay(32); // подождать 32 миллисекунды
|
||||||
|
}
|
||||||
|
|
||||||
|
void rotateRight(int posFrom, int posTo) { // функция поворота сервопривода вправо
|
||||||
|
delay(32); // подождать 32 миллисекунды
|
||||||
|
myservo.attach(servo); // присоединиться к сервоприводу
|
||||||
|
delay(32); // подождать 32 миллисекунды
|
||||||
|
for (pos = posFrom; pos > posTo; pos -= 1) { // цикл уменьшения позиции с posFrom до postTo с шагом в 1 градус
|
||||||
|
myservo.write(pos); // сообщить сервоприводу переместиться в позицию pos
|
||||||
|
delay(15); // подождать 15 миллисекунд для достижения позиции
|
||||||
|
}
|
||||||
|
// Serial.print("RIGHTfrom:"); Serial.print(posFrom); Serial.print("to:"); Serial.print(posTo); Serial.print("cur:"); Serial.println(pos); // вывод значений для отладки
|
||||||
|
delay(32); // подождать 32 миллисекунды
|
||||||
|
myservo.detach(); // отсоединиться от сервопривода
|
||||||
|
delay(32); // подождать 32 миллисекунды
|
||||||
|
}
|
||||||
|
|
||||||
|
void initAll() { // функция иниализации пищалки, светодиода и севпривода
|
||||||
|
int gammavar; // обявление временной переменной нотной гаммы
|
||||||
|
for (gammavar = 1; gammavar <= 8; gammavar += 1) { // цикл увеличение ноты от 1 до 8
|
||||||
|
colourRandom(); // случайный цвет светодиода
|
||||||
|
tone(buzzer, gamma[gammavar]); // подать на пищалку соответствующий тон гаммы
|
||||||
|
delay(200); // подождать 200 миллисекунд
|
||||||
|
noTone(buzzer); // нет больше тона на пищалке
|
||||||
|
delay(10); // подождать 10 миллисекунд
|
||||||
|
}
|
||||||
|
for (gammavar = 7; gammavar >= 1; gammavar -= 1) { // цикл уменьшения ноты от 7 до 1
|
||||||
|
colourRandom(); // случайный цвет светодиода
|
||||||
|
tone(buzzer, gamma[gammavar]); // подать на пищалку соответствующий тон гаммы
|
||||||
|
delay(200); // подождать 200 миллисекунд
|
||||||
|
noTone(buzzer); // нет больше тона на пищалке
|
||||||
|
delay(10); // подождать 10 миллисекунд
|
||||||
|
}
|
||||||
|
colourRandom(); // случайный цвет светодиода
|
||||||
|
delay(500); // подождать 500 миллисекунд
|
||||||
|
colourRandom(); // случайный цвет светодиода
|
||||||
|
rotateLeft (0, 180); // повернуть сервопривод налево на 180 градусов
|
||||||
|
colourRandom(); // случайный цвет светодиода
|
||||||
|
delay(500); // подождать 500 миллисекунд
|
||||||
|
colourRandom(); // случайный цвет светодиода
|
||||||
|
rotateRight (180, 0); // повернуть сервопривод направо на 180 градусов
|
||||||
|
colourRandom(); // случайный цвет светодиода
|
||||||
|
delay(500); // подождать 500 миллисекунд
|
||||||
|
colourRandom(); // случайный цвет светодиода
|
||||||
|
delay (1000); // подождать 1000 миллисекунд
|
||||||
|
colourOff(); // выключить свечение светодиода
|
||||||
|
}
|
||||||
|
|
||||||
|
void encRight(){ // обработка прерывния поворотного регулятора на прерывании 0 (право)
|
||||||
|
if (rotating) delay (1); // подождать миллисекунду, пока поворот не закончится
|
||||||
|
if (digitalRead(encDT) != right_set) { // если физическое значение регулятора неравно переменной процедуры правого поворота регулятора
|
||||||
|
right_set = !right_set; // изменить значение переменной процедуры правого поворота регулятора на обратное
|
||||||
|
if (right_set && !left_set) // если происходит поворот вправо и не происходит вопорота влево (для регулировки)
|
||||||
|
encPos += 1; // увеличить счётчик позиции поворотного регулятора на 1
|
||||||
|
rotating = false; // больше нет вращения до завершения постоянно выполняемой функции loop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void encLeft(){ // обработка прерывния поворотного регулятора на прерывании 1 (лево)
|
||||||
|
if (rotating) delay (1); // подождать миллисекунду, пока поворот не закончится
|
||||||
|
if (digitalRead(encCLK) != left_set) { // если физическое значение регулятора неравно переменной процедуры левого поворота регулятора
|
||||||
|
left_set = !left_set; // изменить значение переменной процедуры левого поворота регулятора на обратное
|
||||||
|
if (left_set && !right_set) // если происходит поворот влево и не происходит вопорота вправо (для регулировки)
|
||||||
|
encPos -= 1; // уменьшить счётчик позиции поворотного регулятора на 1
|
||||||
|
rotating = false; // больше нет вращения до завершения постоянно выполняемой функции loop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void randomNote() { // функция проигрывания случайной ноты
|
||||||
|
delay(200); // подождать 200 миллисекунд
|
||||||
|
playednote = random(1,7); // сгенерировать случайное значение от 1 до 7 для переменной хранящей последнюю сыгранную ноту
|
||||||
|
tone(buzzer, gamma[playednote]); // подать на пищалку соответствующий тон переменной хранящей последнюю сыгранную ноту
|
||||||
|
delay(2000); // подождать 2000 миллисекунд
|
||||||
|
noTone(buzzer); // нет больше тона на пищалке
|
||||||
|
delay(200); // подождать 200 миллисекунд
|
||||||
|
}
|
Binary file not shown.
|
@ -0,0 +1,187 @@
|
||||||
|
#include "pitches.h" // include tones from pitches.h
|
||||||
|
#include "Servo.h" // include pitches standard Servo.h library
|
||||||
|
Servo myservo; // create servo object to control a servo
|
||||||
|
const int redLED = 4; // red pin of LED
|
||||||
|
const int greenLED = 5; // green pin of LED
|
||||||
|
const int blueLED = 6; // blue pin of LED
|
||||||
|
const int buzzer = 7; // signal pin of buzzer
|
||||||
|
const int servo = 9; // control pin of servo
|
||||||
|
const int encDT = 2; // pin of the right rotation of encoder (DT)
|
||||||
|
const int encCLK = 3; // pin of the left rotation of encoder (CLK)
|
||||||
|
const int encSW = 8; // pin of the switch of encoder (SW)
|
||||||
|
volatile unsigned int encPos = 32768; // encoder position counter
|
||||||
|
unsigned int lastReportedPos = 32768; // the last recorded position value of encoder
|
||||||
|
static boolean rotating = false; // encoder rotation control
|
||||||
|
boolean right_set = false; // variable for the procedure of right turn of encoder
|
||||||
|
boolean left_set = false; // variable for the procedure of left turn of encoder
|
||||||
|
int pos = 0; // variable to store servo position
|
||||||
|
int posnote = 0; // variable of the note to which servo is pointing
|
||||||
|
int playednote = 0; // variable storing the last note played
|
||||||
|
int gamma[] = {NOTE_B3, NOTE_C4, NOTE_D4, NOTE_E4, NOTE_F4, NOTE_G4, NOTE_A4, NOTE_B4, NOTE_C5}; // ti3-do5
|
||||||
|
|
||||||
|
void setup() { // function performed at start-up
|
||||||
|
Serial.begin(9600); // serial monitor initialisation
|
||||||
|
pinMode(LED_BUILTIN, OUTPUT); // definition of built-in LED
|
||||||
|
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
|
||||||
|
pinMode(buzzer, OUTPUT); // definition of buzzer to output signal
|
||||||
|
pinMode(encDT, INPUT_PULLUP); // definition of right turn of encoder as input pullup
|
||||||
|
pinMode(encCLK, INPUT_PULLUP); // definition of left turn of encoder as input pullup
|
||||||
|
pinMode(encSW, INPUT_PULLUP); // definition of switch of encoder as input pullup
|
||||||
|
attachInterrupt(0, encRight, CHANGE); // encoder pin on interrupt 0 (right)
|
||||||
|
attachInterrupt(1, encLeft, CHANGE); // encoder pin on interrupt 1 (left)
|
||||||
|
// randomSeed(analogRead(0)); // setting a random seed depending on the voltage on an unswitched pin
|
||||||
|
initAll(); // call for function of the initialisation of buzzer, LED and servo
|
||||||
|
randomNote(); // call random note play function
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() { // ongoing function
|
||||||
|
rotating = true; // encoder rotating state set
|
||||||
|
if (lastReportedPos != encPos) { // if the last recorded encoder position is not equal to the current position
|
||||||
|
// Serial.print("POS:"); Serial.print(pos); Serial.print("IN:"); Serial.println(encPos, DEC); // output values for debug
|
||||||
|
if (lastReportedPos < encPos) { // if the last recorded encoder position is less than the present value
|
||||||
|
if (pos > 10) rotateRight (pos, (pos-30)); // if servo position is greater than 10 - turn right 30 degrees
|
||||||
|
}
|
||||||
|
if (lastReportedPos > encPos) { // if the last recorded encoder position is greater than the present value
|
||||||
|
if (pos < 170) rotateLeft (pos, (pos+30)); // if servo position is less than 170 - turn left 30 degrees
|
||||||
|
}
|
||||||
|
lastReportedPos = encPos; // assign current encoder position to the last recorded position
|
||||||
|
}
|
||||||
|
if (digitalRead(encSW) == LOW ) { // if encoder switch is pressed
|
||||||
|
posnote = ((((pos / 30) + 1) - 8) * (-1)); // calculating the note indicated by servo
|
||||||
|
// Serial.print("NOTE:"); Serial.println(posnote); // output values for debug
|
||||||
|
if (posnote == playednote) { // if servo points to the last played note
|
||||||
|
int blinking; // declaration of LED blinking variable
|
||||||
|
for (blinking = 0; blinking < 10; blinking += 1) { // cycle 10 blinking steps from 0 to 9
|
||||||
|
colourGreen(); // green LED light
|
||||||
|
delay(200); // 200 millisecond delay
|
||||||
|
colourBlue(); // blue LED light
|
||||||
|
delay(200); // 200 millisecond delay
|
||||||
|
}
|
||||||
|
colourOff(); // switch off LED light
|
||||||
|
delay(1000); // 1000 millisecond delay
|
||||||
|
randomNote(); // call the random note play function
|
||||||
|
} else { // else
|
||||||
|
colourRed(); // red LED light
|
||||||
|
delay(1000); // 1000 millisecond delay
|
||||||
|
colourOff(); // switch off LED light
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourRandom() { // random colour LED function
|
||||||
|
analogWrite(redLED, random(0,255)); // random value of red
|
||||||
|
analogWrite(greenLED, random(0,255)); // random value of green
|
||||||
|
analogWrite(blueLED, random(0,255)); // random value of blue
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourRed() { // red colour LED function
|
||||||
|
analogWrite(redLED, 255); // maximum value of red
|
||||||
|
analogWrite(greenLED, 0); // minumum value of green
|
||||||
|
analogWrite(blueLED, 0); // minumum value of blue
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourGreen() { // green colour LED function
|
||||||
|
analogWrite(redLED, 0); // minumum value of red
|
||||||
|
analogWrite(greenLED, 255); // maximum value of green
|
||||||
|
analogWrite(blueLED, 0); // minumum value of blue
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourBlue() { // blue colour LED function
|
||||||
|
analogWrite(redLED, 0); // minumum value of red
|
||||||
|
analogWrite(greenLED, 0); // minumum value of green
|
||||||
|
analogWrite(blueLED, 255); // maximum value of blue
|
||||||
|
}
|
||||||
|
|
||||||
|
void colourOff() { // no colour LED function
|
||||||
|
analogWrite(redLED, 0); // minumum value of red
|
||||||
|
analogWrite(greenLED, 0); // minumum value of green
|
||||||
|
analogWrite(blueLED, 0); // minumum value of blue
|
||||||
|
}
|
||||||
|
|
||||||
|
void rotateLeft(int posFrom, int posTo) { // servo's left turn function
|
||||||
|
delay(32); // 32 millisecond delay
|
||||||
|
myservo.attach(servo); // attaching to servo
|
||||||
|
delay(32); // 32 millisecond delay
|
||||||
|
for (pos = posFrom; pos < posTo; pos += 1) { // cycle of increasing position from posFrom to postTo in 1-degree increments
|
||||||
|
myservo.write(pos); // tell servo to go to position in variable pos
|
||||||
|
delay(15); // 15 millisecond delay
|
||||||
|
}
|
||||||
|
// Serial.print("LEFTfrom:"); Serial.print(posFrom); Serial.print("to:"); Serial.print(posTo); Serial.print("cur:"); Serial.println(pos); // output values for debug
|
||||||
|
delay(32); // 32 millisecond delay
|
||||||
|
myservo.detach(); // detaching from servo
|
||||||
|
delay(32); // 32 millisecond delay
|
||||||
|
}
|
||||||
|
|
||||||
|
void rotateRight(int posFrom, int posTo) { // servo's right turn function
|
||||||
|
delay(32); // 32 millisecond delay
|
||||||
|
myservo.attach(servo); // attaching to servo
|
||||||
|
delay(32); // 32 millisecond delay
|
||||||
|
for (pos = posFrom; pos > posTo; pos -= 1) { // cycle of reduction position from posFrom to postTo in 1-degree increments
|
||||||
|
myservo.write(pos); // tell servo to go to position in variable pos
|
||||||
|
delay(15); // 15 millisecond delay
|
||||||
|
}
|
||||||
|
// Serial.print("RIGHTfrom:"); Serial.print(posFrom); Serial.print("to:"); Serial.print(posTo); Serial.print("cur:"); Serial.println(pos); // output values for debug
|
||||||
|
delay(32); // 32 millisecond delay
|
||||||
|
myservo.detach(); // detaching from servo
|
||||||
|
delay(32); // 32 millisecond delay
|
||||||
|
}
|
||||||
|
|
||||||
|
void initAll() { // function of the initialisation of buzzer, LED and servo
|
||||||
|
int gammavar; // declaration of temporary gamma variable
|
||||||
|
for (gammavar = 1; gammavar <= 8; gammavar += 1) { // note increase cycle from 1 to 8
|
||||||
|
colourRandom(); // random LED light
|
||||||
|
tone(buzzer, gamma[gammavar]); // sending the appropriate tone to buzzer
|
||||||
|
delay(200); // 200 millisecond delay
|
||||||
|
noTone(buzzer); // no more tone on buzzer
|
||||||
|
delay(10); // 10 millisecond delay
|
||||||
|
}
|
||||||
|
for (gammavar = 7; gammavar >= 1; gammavar -= 1) { // note decrease cycle from 7 to 1
|
||||||
|
colourRandom(); // random LED light
|
||||||
|
tone(buzzer, gamma[gammavar]); // sending the appropriate tone to buzzer
|
||||||
|
delay(200); // 200 millisecond delay
|
||||||
|
noTone(buzzer); // no more tone on buzzer
|
||||||
|
delay(10); // 10 millisecond delay
|
||||||
|
}
|
||||||
|
colourRandom(); // random LED light
|
||||||
|
delay(500); // 500 millisecond delay
|
||||||
|
colourRandom(); // random LED light
|
||||||
|
rotateLeft (0, 180); // turn servo 180 degrees to left
|
||||||
|
colourRandom(); // random LED light
|
||||||
|
delay(500); // 500 millisecond delay
|
||||||
|
colourRandom(); // random LED light
|
||||||
|
rotateRight (180, 0); // turn servo 180 degrees to right
|
||||||
|
colourRandom(); // random LED light
|
||||||
|
delay(500); // 500 millisecond delay
|
||||||
|
colourRandom(); // random LED light
|
||||||
|
delay (1000); // 1000 millisecond delay
|
||||||
|
colourOff(); // switch off LED light
|
||||||
|
}
|
||||||
|
|
||||||
|
void encRight(){ // processing encoder interrupt 0 (right)
|
||||||
|
if (rotating) delay (1); // wait a millisecond for the turn to end
|
||||||
|
if (digitalRead(encDT) != right_set) { // if physical encoder value is not equal to the variable of the encoder right turn procedure
|
||||||
|
right_set = !right_set; // change value of encoder right turn procedure variable to the opposite value
|
||||||
|
if (right_set && !left_set) // if turning to the right occurs and not turning to the left (to adjust)
|
||||||
|
encPos += 1; // increase encoder position counter by 1
|
||||||
|
rotating = false; // no more debouncing until loop() hits again
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void encLeft(){ // processing encoder interrupt 1 (left)
|
||||||
|
if (rotating) delay (1); // wait a millisecond for the turn to end
|
||||||
|
if (digitalRead(encCLK) != left_set) { // if physical encoder value is not equal to the variable of the encoder left turn procedure
|
||||||
|
left_set = !left_set; // change value of encoder left turn procedure variable to the opposite value
|
||||||
|
if (left_set && !right_set) // if turning to the left occurs and not turning to the right (to adjust)
|
||||||
|
encPos -= 1; // decrease encoder position counter by 1
|
||||||
|
rotating = false; // no more debouncing until loop() hits again
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void randomNote() { // random note play function
|
||||||
|
delay(200); // 200 millisecond delay
|
||||||
|
playednote = random(1,7); // generate random value from 1 to 7 for the variable storing the last note played
|
||||||
|
tone(buzzer, gamma[playednote]); // sending the appropriate tone to buzzer
|
||||||
|
delay(2000); // 2000 millisecond delay
|
||||||
|
noTone(buzzer); // no more tone on buzzer
|
||||||
|
delay(200); // 200 millisecond delay
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
Binary file not shown.
After Width: | Height: | Size: 82 KiB |
Loading…
Reference in New Issue