adding backend script + test program for microcontroller
This commit is contained in:
54
specification/mindmap.md
Normal file
54
specification/mindmap.md
Normal file
@@ -0,0 +1,54 @@
|
||||
# Алгоритм работы сортировщика
|
||||
|
||||
```mermaid
|
||||
mindmap
|
||||
root((Алгоритм работы))
|
||||
Этап 1: Ожидание и Движение
|
||||
Arduino запускает шаговый двигатель
|
||||
Лента движется с постоянной скоростью
|
||||
Этап 2: Детекция и Анализ
|
||||
Объект проходит под датчиком и камерой
|
||||
Предмет соответствует габаритам?
|
||||
Да
|
||||
Есть признак круга в сечении?
|
||||
Да - Требуется доупаковка
|
||||
Секция 2
|
||||
Нет - Подходит для сортировки
|
||||
Секция 3
|
||||
Нет
|
||||
Не подходит по габаритам
|
||||
Секция 1
|
||||
Этап 3: Трекинг Синхронизация
|
||||
Arduino отсчитывает шаги двигателя
|
||||
Вычисляется момент времени T
|
||||
Этап 4: Маршрутизация
|
||||
В момент T сервопривод поворачивает барьер на 45°
|
||||
Объект смещается в выбранную зону
|
||||
Сервопривод возвращается в исходное положение
|
||||
Этап 5: Завершение
|
||||
Объект попадает в накопитель
|
||||
Система возвращается в состояние Ожидание
|
||||
```
|
||||
|
||||
## Блок схема:
|
||||
|
||||
|
||||
```mermaid
|
||||
flowchart TD
|
||||
Start[Этап 1: Ожидание и Движение] --> Detect[Этап 2: Детекция и Анализ]
|
||||
Detect --> SizeCheck{Предмет соответствует<br/>габаритам?}
|
||||
|
||||
SizeCheck -->|Нет| Reject[Секция 1:<br/>Не габарит]
|
||||
SizeCheck -->|Да| CircleCheck{Есть признак<br/>круга?}
|
||||
|
||||
CircleCheck -->|Да| Repack[Секция 2:<br/>Требуется доупаковка]
|
||||
CircleCheck -->|Нет| Sort[Секция 3:<br/>Подходит для сортировки]
|
||||
|
||||
Reject --> Track[Этап 3: Трекинг]
|
||||
Repack --> Track
|
||||
Sort --> Track
|
||||
|
||||
Track --> Route[Этап 4: Маршрутизация]
|
||||
Route --> End[Этап 5: Завершение]
|
||||
End --> Start
|
||||
```
|
||||
277
specification/mvp_1.drawio
Normal file
277
specification/mvp_1.drawio
Normal file
@@ -0,0 +1,277 @@
|
||||
<mxfile host="server.home">
|
||||
<diagram name="Страница-1" id="mppyHKg2Vbg7W8e0-Fd9">
|
||||
<mxGraphModel dx="3902" dy="2031" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="1654" pageHeight="1169" math="0" shadow="0">
|
||||
<root>
|
||||
<mxCell id="0" />
|
||||
<mxCell id="1" parent="0" />
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-2" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="37" y="773" as="sourcePoint" />
|
||||
<mxPoint x="1547" y="773" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-6" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="257" y="720" as="sourcePoint" />
|
||||
<mxPoint x="1617" y="720" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-7" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="37" y="770" as="sourcePoint" />
|
||||
<mxPoint x="107" y="720" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-8" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="1547" y="774" as="sourcePoint" />
|
||||
<mxPoint x="1617" y="724" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-9" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" value="<font style="font-size: 30px;">1</font>" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="847" y="830" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-10" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;" value="<font style="font-size: 30px;">2</font>" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="1097" y="830" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-11" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;" value="<font style="font-size: 30px;">3</font>" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="1377" y="830" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-12" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" value="" vertex="1">
|
||||
<mxGeometry height="80" width="160" x="67" y="680" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-13" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="227" y="680" as="sourcePoint" />
|
||||
<mxPoint x="257" y="660" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-14" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="227" y="760" as="sourcePoint" />
|
||||
<mxPoint x="257" y="740" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-16" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="67" y="680" as="sourcePoint" />
|
||||
<mxPoint x="97" y="660" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-17" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="97" y="660" as="sourcePoint" />
|
||||
<mxPoint x="257" y="660" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-18" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="257" y="740" as="sourcePoint" />
|
||||
<mxPoint x="257" y="660" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-19" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" value="" vertex="1">
|
||||
<mxGeometry height="80" width="50" x="477" y="390" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-20" edge="1" parent="1" source="jfPUc6vKa1uVjcLF1lrC-19" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="567" y="620" as="sourcePoint" />
|
||||
<mxPoint x="527" y="530" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-21" edge="1" parent="1" source="jfPUc6vKa1uVjcLF1lrC-19" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="487" y="520" as="sourcePoint" />
|
||||
<mxPoint x="477" y="530" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-22" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="477" y="530" as="sourcePoint" />
|
||||
<mxPoint x="527" y="530" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-23" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;dashed=1;dashPattern=12 12;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="477" y="530" as="sourcePoint" />
|
||||
<mxPoint x="417" y="750" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-24" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;dashed=1;dashPattern=12 12;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="527" y="530" as="sourcePoint" />
|
||||
<mxPoint x="587" y="750" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-26" parent="1" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;" value="" vertex="1">
|
||||
<mxGeometry height="80" width="50" x="307" y="390" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-27" edge="1" parent="1" source="jfPUc6vKa1uVjcLF1lrC-26" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;dashed=1;dashPattern=8 8;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="357" y="580" as="sourcePoint" />
|
||||
<mxPoint x="332" y="740" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-29" parent="1" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;fillColor=#f0a30a;strokeColor=#BD7000;fillStyle=solid;direction=west;gradientDirection=north;shadow=1;size=20;autosizeText=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontColor=#000000;fontSize=17;align=left;" value="Лазерный датчик расстояния.<br>В нашем случае он измеряет высоту объекта.<br>Так как камера у нас расположена перпендикулярно движению ленты. И корректно не сможет определить высоту объектов" vertex="1">
|
||||
<mxGeometry height="160" width="315" x="42" y="210" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-30" parent="1" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;fillColor=#f0a30a;strokeColor=#BD7000;fillStyle=solid;direction=west;gradientDirection=north;shadow=1;size=20;autosizeText=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontColor=#000000;fontSize=24;align=left;" value="Тут у нас установлена камера, первично мы ее откалибруем и сможем визуально оценить размер объекта" vertex="1">
|
||||
<mxGeometry height="160" width="315" x="387" y="210" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-32" parent="1" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" value="" vertex="1">
|
||||
<mxGeometry height="40" width="40" x="804" y="640" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-37" edge="1" parent="1" source="jfPUc6vKa1uVjcLF1lrC-38" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;fontSize=16;startSize=14;endArrow=open;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=12 12;" target="jfPUc6vKa1uVjcLF1lrC-32" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="847" y="370" as="sourcePoint" />
|
||||
<mxPoint x="967" y="710" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-38" parent="1" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;fillColor=#f0a30a;strokeColor=#BD7000;fillStyle=solid;direction=west;gradientDirection=north;shadow=1;size=20;autosizeText=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontColor=#000000;fontSize=26;align=left;" value="Датчик ультразвуковой, определят что объект приехал на сортировку" vertex="1">
|
||||
<mxGeometry height="160" width="315" x="737" y="190" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-39" edge="1" parent="1" source="jfPUc6vKa1uVjcLF1lrC-40" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=open;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.542;exitY=0.018;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=12 12;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="1197" y="360" as="sourcePoint" />
|
||||
<mxPoint x="937" y="610" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-40" parent="1" style="shape=note;whiteSpace=wrap;html=1;backgroundOutline=1;darkOpacity=0.05;fillColor=#f0a30a;strokeColor=#BD7000;fillStyle=solid;direction=west;gradientDirection=north;shadow=1;size=20;autosizeText=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontColor=#000000;fontSize=25;align=left;" value="Сервопривод с ограничителем движения который не дает объекту двигаться дальше." vertex="1">
|
||||
<mxGeometry height="160" width="315" x="1062" y="190" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-42" connectable="0" parent="1" style="group" value="" vertex="1">
|
||||
<mxGeometry height="80" width="90" x="882" y="620" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-31" parent="jfPUc6vKa1uVjcLF1lrC-42" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https%3A%2F%2Ffonts.googleapis.com%2Fcss%3Ffamily%3DArchitects%2BDaughter;" value="" vertex="1">
|
||||
<mxGeometry height="80" width="90" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-34" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-42" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="45" y="80" as="sourcePoint" />
|
||||
<mxPoint x="95" y="150" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-35" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-42" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="95" y="150" as="sourcePoint" />
|
||||
<mxPoint x="95" y="40" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-36" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-42" source="jfPUc6vKa1uVjcLF1lrC-31" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="45" y="-20" as="sourcePoint" />
|
||||
<mxPoint x="95" y="40" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-48" parent="1" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;" value="" vertex="1">
|
||||
<mxGeometry height="40" width="40" x="1062" y="640" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-49" edge="1" parent="1" source="jfPUc6vKa1uVjcLF1lrC-38" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=open;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=12 12;" target="jfPUc6vKa1uVjcLF1lrC-48" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="948" y="430" as="sourcePoint" />
|
||||
<mxPoint x="877" y="720" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-50" edge="1" parent="1" source="jfPUc6vKa1uVjcLF1lrC-40" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=open;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.542;exitY=-0.004;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;dashPattern=12 12;" target="jfPUc6vKa1uVjcLF1lrC-44" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="1436" y="410" as="sourcePoint" />
|
||||
<mxPoint x="1167" y="673" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-51" connectable="0" parent="1" style="group" value="" vertex="1">
|
||||
<mxGeometry height="80" width="90" x="1137" y="620" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-44" parent="jfPUc6vKa1uVjcLF1lrC-51" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;" value="" vertex="1">
|
||||
<mxGeometry height="80" width="90" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-45" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-51" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="45" y="80" as="sourcePoint" />
|
||||
<mxPoint x="140" y="90" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-46" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-51" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="140" y="90" as="sourcePoint" />
|
||||
<mxPoint x="140" y="-10" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-47" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-51" source="jfPUc6vKa1uVjcLF1lrC-44" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="45" y="-20" as="sourcePoint" />
|
||||
<mxPoint x="140" y="-10" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-52" connectable="0" parent="1" style="group" value="" vertex="1">
|
||||
<mxGeometry height="80" width="90" x="1407" y="620" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-53" parent="jfPUc6vKa1uVjcLF1lrC-52" style="rounded=0;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;" value="" vertex="1">
|
||||
<mxGeometry height="80" width="90" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-54" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-52" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="45" y="80" as="sourcePoint" />
|
||||
<mxPoint x="140" y="90" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-55" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-52" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="140" y="90" as="sourcePoint" />
|
||||
<mxPoint x="140" y="-10" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-56" edge="1" parent="jfPUc6vKa1uVjcLF1lrC-52" source="jfPUc6vKa1uVjcLF1lrC-53" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=none;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;endFill=0;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="45" y="-20" as="sourcePoint" />
|
||||
<mxPoint x="140" y="-10" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-57" parent="1" style="ellipse;whiteSpace=wrap;html=1;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;" value="" vertex="1">
|
||||
<mxGeometry height="40" width="40" x="1337" y="640" as="geometry" />
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-58" edge="1" parent="1" source="jfPUc6vKa1uVjcLF1lrC-38" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=open;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;exitPerimeter=0;dashed=1;dashPattern=12 12;" target="jfPUc6vKa1uVjcLF1lrC-57" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="957" y="530" as="sourcePoint" />
|
||||
<mxPoint x="1144" y="820" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
<mxCell id="jfPUc6vKa1uVjcLF1lrC-59" edge="1" parent="1" style="edgeStyle=none;orthogonalLoop=1;jettySize=auto;html=1;rounded=0;fontFamily=Architects Daughter;fontSource=https://fonts.googleapis.com/css?family=Architects+Daughter;fontSize=16;startSize=14;endArrow=open;endSize=14;sourcePerimeterSpacing=8;targetPerimeterSpacing=8;curved=1;dashed=1;dashPattern=12 12;" value="">
|
||||
<mxGeometry relative="1" width="140" as="geometry">
|
||||
<Array as="points" />
|
||||
<mxPoint x="1207" y="350" as="sourcePoint" />
|
||||
<mxPoint x="1447" y="620" as="targetPoint" />
|
||||
</mxGeometry>
|
||||
</mxCell>
|
||||
</root>
|
||||
</mxGraphModel>
|
||||
</diagram>
|
||||
</mxfile>
|
||||
BIN
specification/mvp_1.jpg
Normal file
BIN
specification/mvp_1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 58 KiB |
114
specification/mvp_1.md
Normal file
114
specification/mvp_1.md
Normal file
@@ -0,0 +1,114 @@
|
||||
# Наброски будущей схемы конвейера
|
||||
|
||||

|
||||
|
||||
## Пояснение к схеме
|
||||
|
||||
### todo
|
||||
|
||||
## Список материалов:
|
||||
|
||||
В этот список необходимо доложить энкодер для двигателя!
|
||||
|
||||
| Название | Сумма, ₽ | Количество |
|
||||
| :--- | :--- | :--- |
|
||||
| Медная лента для удаления припоя / Оплетка для выпайки диаметр 2 мм длина 1.5 м | 164 | 1 |
|
||||
| Набор проводов для пайки | 1 030 | 1 |
|
||||
| Набор проводов для пайки | 855 | 1 |
|
||||
| Флюс гель универсальный безотмывочный, для пайки микросхем и компонентов Flux RMA-223-UV-10г | 162 | 1 |
|
||||
| Припой для пайки с канифолью 1мм 50гр ПОС-61 на катушке (ГОСТ) | 423 | 1 |
|
||||
| ALIENTEK Паяльник 140 Вт, 7 предметов | 4 985 | 1 |
|
||||
| Преобразователь DC-DC понижающий с 8-60V до 1-36V 15A max | 805 | 1 |
|
||||
| Беспаечная макетная плата (breadboard) MB-102, 830 точек, для Arduino и прочих устройств | 1 112 | 2 |
|
||||
| 120 шт. Провода перемычки для макетных плат, соединительные провода для модулей, контроллеров arduino (10 см) 3 вида по 40 шт папа-папа, мама-мама, папа-мама | 636 | 3 |
|
||||
| Homeled, Блок питания, 12V, 200W, 180-265 вольт. С клеммами. Импульсный для светодиодных лент и светильников | 599 | 1 |
|
||||
| Двигатель для шуруповерта 12v без шестерни | 834 | 2 |
|
||||
| Сервопривод MG996R, 10 шт, 180 , металлические шестерни, для Arduino, роботов и RC, размеры стандарт | 2 990 | 1 |
|
||||
| PWM PCA9685 драйвер на 16 сервоприводов расширитель портов с I2C интерфейсом для Led и Servo (12 bit, I2C) в IIC/I2C/TWI/SPI c тестером сервоприводов 3 режима, набор | 1 178 | 2 |
|
||||
| Датчик расстояния ультразвуковой HY-SRF05 для Arduino | 1 310 | 5 |
|
||||
| Модуль MOSFET силовой ключ, опторазвязка, 40В, 50А, AOD4184 | 898 | 4 |
|
||||
| Arduino UNO R3 Atmega328P (CH340G), с кабелем | 1 377 | 3 |
|
||||
| Плата расширения Ethernet Shield W5100 | 1 376 | 2 |
|
||||
| ИТОГО | 20 732 | |
|
||||
|
||||
[Ссылка на товары](https://www.ozon.ru/cart?share=IxNShaU)
|
||||
|
||||
|
||||
## Возможные проблемы в программно-аппаратной автоматической сортировке товаров на конвейерной линии
|
||||
|
||||
### 1. Проблемы визуального распознавания
|
||||
|
||||
- Сложность освещения: Непредсказуемое освещение может затруднить распознавание объектов
|
||||
- Схожие внешние признаки: Товары с похожими формами/цветами могут быть распознаны неправильно
|
||||
- Неправильная калибровка камер: Ошибки в определении координат объектов
|
||||
|
||||
### 2. Проблемы сенсорной системы
|
||||
|
||||
- Недостаточная чувствительность датчиков: Пропуск объектов или ложные срабатывания
|
||||
- Влияние пыли/влаги: Затруднение работы сенсоров
|
||||
- Нестабильность работы датчиков: Необходимость постоянной калибровки
|
||||
|
||||
### 3. Проблемы управления движением
|
||||
|
||||
- Неправильная синхронизация: Несовпадение времени сортировки и движения конвейера
|
||||
- Недостаточная мощность приводов: Задержки в перемещении
|
||||
- Конфликты в движении: Пересечение траекторий сортировщиков
|
||||
|
||||
### 4. Проблемы программного обеспечения
|
||||
|
||||
- Недостаточная обработка ошибок: Простой системы при возникновении проблем
|
||||
- Неправильная логика принятия решений: Неправильная классификация объектов
|
||||
- Проблемы с обновлением модели ИИ: Устаревшие алгоритмы распознавания
|
||||
|
||||
### 5. Проблемы механики
|
||||
|
||||
- Недостаточная прочность конструкции: Повреждение при высоких скоростях
|
||||
- Неправильное размещение сортировщиков: Конфликты при перемещении
|
||||
- Проблемы с удержанием объектов: Потеря товаров при сортировке
|
||||
|
||||
## Решения от ИИ:
|
||||
|
||||
Когда мы переходим к прототипу на **Arduino + отдельный сервер**, архитектура меняется. Теперь у нас есть «Мозг» (сервер), который видит и думает, и «Руки» (Arduino), которые исполняют.
|
||||
|
||||
Главная проблема здесь — **задержка (latency)** при передаче данных между сервером и контроллером. Если сервер скажет «толкай» в тот момент, когда объект уже проехал, система провалится.
|
||||
|
||||
Вот как я бы решил эти проблемы в контексте такого прототипа:
|
||||
|
||||
### 1. Визуальное распознавание (Серверная часть)
|
||||
Поскольку сервер мощный, мы можем использовать тяжелые модели (YOLO, TensorFlow), но должны ограничить влияние среды.
|
||||
|
||||
* **Освещение:** Для прототипа я бы сделал «световой короб» из белого пластика или картона с LED-лентой внутри. Это создаст мягкий свет без теней, что критично для дешевых веб-камер.
|
||||
* **Схожие признаки:** На сервере я бы реализовал многоэтапную проверку: сначала определение класса объекта, затем — анализ его геометрии (площадь, периметр), чтобы отличить, например, красный кубик от красного шарика.
|
||||
* **Калибровка:** Чтобы сервер понимал, где находится объект в реальном мире, я бы использовал «маркеры привязки» (например, черные метки по углам ленты). Сервер видит метку -> понимает масштаб -> вычисляет координаты объекта в миллиметрах.
|
||||
|
||||
### 2. Сенсорная система (Arduino часть)
|
||||
Датчики на Arduino будут служить «триггерами» для сервера.
|
||||
|
||||
* **Чувствительность:** Я бы добавил ИК-датчик в начале линии. Как только объект пересекает его, Arduino посылает сигнал на сервер: «Объект в зоне, сделай фото!». Это избавит сервер от необходимости анализировать видеопоток 24/7.
|
||||
* **Пыль/Влага:** В прототипе это менее критично, но я бы использовал простые пластиковые колпачки-козырьки над датчиками, чтобы на них не оседал мусор.
|
||||
* **Нестабильность:** Программный «антидребезг» (debouncing) в коде Arduino, чтобы один объект не засчитывался как несколько из-за помех.
|
||||
|
||||
### 3. Управление движением (Arduino часть)
|
||||
Здесь решается проблема рассинхронизации между «медленным» сервером и «быстрым» конвейером.
|
||||
|
||||
* **Синхронизация (Критический узел):** Я бы **не** использовал команду «Толкай сейчас». Вместо этого сервер отправляет пакет данных: `ID объекта` и `Тип (куда сортировать)`. Arduino записывает этот объект в очередь (массив) и отслеживает его движение с помощью энкодера на моторе или датчика прохождения.
|
||||
* *Логика:* «Я знаю, что объект №5 — это 'Красный', и он должен быть сброшен через 500 импульсов энкодера».
|
||||
* **Мощность приводов:** Использование внешнего блока питания для моторов (не от Arduino!), чтобы избежать просадок напряжения и перезагрузок контроллера при старте ленты.
|
||||
* **Конфликты:** Ограничение скорости подачи. В прототипе проще всего реализовать «дискретную подачу»: один объект заходит в систему -> обрабатывается -> вылетает -> только тогда подается следующий.
|
||||
|
||||
### 4. Программное обеспечение (Взаимодействие)
|
||||
Разделение ответственности между Python (сервер) и C++ (Arduino).
|
||||
|
||||
* **Обработка ошибок:** Внедрение «контрольного сигнала» (Heartbeat). Если Arduino не получает сигнал от сервера в течение 2 секунд, он останавливает конвейер, чтобы товары не улетели в пустоту.
|
||||
* **Логика принятия решений:** Сервер отправляет не просто команду, а структуру данных. Например: `{"id": 12, "action": "divert", "target": 2, "confidence": 0.98}`. Если `confidence` низкий, Arduino отправляет объект в корзину «Ошибка».
|
||||
* **Обновление модели:** Преимущество сервера в том, что я могу обновлять модель ИИ, не перепрошивая Arduino. Весь «интеллект» живет в Python-скрипте.
|
||||
|
||||
### 5. Механика (Прототип)
|
||||
Для прототипа важна модульность и легкость замены деталей.
|
||||
|
||||
* **Прочность:** Использование 3D-печатных деталей с заполнением (infill) более 40% в точках крепления моторов и использование подшипников в осях, чтобы избежать люфта.
|
||||
* **Размещение:** Установка сортировщиков (сервоприводов) на стандартных профилях или рельсах, чтобы их можно было сдвинуть на пару сантиметров вперед/назад для точной подстройки под камеру.
|
||||
* **Удержание объектов:** Вместо жестких толкателей я бы использовал «мягкие» лапки из силикона или резины на сервоприводах. Это предотвратит опрокидывание легких предметов и снизит ударную нагрузку на пластиковые детали.
|
||||
|
||||
**Резюме по архитектуре:**
|
||||
`Датчик (Arduino) -> Триггер (Сервер) -> Распознавание (Сервер) -> Команда в очередь (Arduino) -> Отсчет расстояния (Arduino) -> Сброс (Механика)`.
|
||||
97
specification/specification.md
Normal file
97
specification/specification.md
Normal file
@@ -0,0 +1,97 @@
|
||||
Привет! Как инженер-конструктор и эксперт по электронике, я с удовольствием помогу тебе спроектировать этот макет. Задача ясна: создаем систему автоматизированной сортировки с точным управлением скоростью и маршрутизацией по высоте.
|
||||
|
||||
Давай разберем твои вопросы по порядку.
|
||||
|
||||
### 1. Выбор двигателя: Шаговый vs Коллекторный
|
||||
|
||||
Для твоей задачи — **максимально точного выдерживания скорости** и управления с микроконтроллера — выбор очевиден.
|
||||
|
||||
| Характеристика | Коллекторный двигатель (DC) | Шаговый двигатель (Stepper) |
|
||||
| :--- | :--- | :--- |
|
||||
| **Точность скорости** | Низкая. Скорость зависит от напряжения и нагрузки. Для точности нужен энкодер (обратная связь). | **Высокая**. Скорость задается частотой импульсов. Постоянна при заданной нагрузке. |
|
||||
| **Управление** | Простое (PWM/ШИМ). | Требует специальный драйвер (например, A4988 или TMC2208). |
|
||||
| **Пуск/Стоп** | Плавный разгон, сложно точно позиционировать. | **Идеальный**. Можно точно задать количество шагов и мгновенно остановиться. |
|
||||
| **Крутящий момент** | Высокий на высоких оборотах. | Высокий на низких скоростях (идеально для ленты). |
|
||||
| **Сложность реализации** | Очень низкая. | Средняя (нужен драйвер и настройка тока). |
|
||||
|
||||
**Мой вердикт:** Используй **шаговый двигатель (например, NEMA 17)**.
|
||||
Если ты хочешь «выдерживать скорость максимально точно», обычный DC-мотор тебя разочарует: при увеличении веса объекта на ленте скорость будет падать. Шаговый же двигатель будет поддерживать заданный темп, пока не будет достигнут предел его крутящего момента.
|
||||
|
||||
---
|
||||
|
||||
### 2. Селекторы (Сервоприводы)
|
||||
|
||||
Использование сервоприводов с барьером под 45° — это классическое и эффективное решение для макета.
|
||||
|
||||
**Советы по реализации:**
|
||||
* **Механика:** Чтобы объект не застревал и не «зажевывался», сделай барьер обтекаемым или используй гладкий пластик/алюминий.
|
||||
* **Угол:** 45 градусов — оптимально, но убедись, что при срабатывании сервопривод не толкает объект слишком резко, чтобы тот не перевернулся.
|
||||
* **Логика:** В промышленном подходе, как отмечено в контексте, важно отслеживать «корректность маршрутизации» [1]. Рекомендую добавить в код проверку: действительно ли объект ушел в нужную зону, или произошла ошибка.
|
||||
|
||||
---
|
||||
|
||||
### 3. Датчик определения высоты
|
||||
|
||||
Для измерения высоты объекта сверху, когда лента движется, тебе подойдут три варианта в зависимости от требуемой точности:
|
||||
|
||||
1. **Ультразвуковой датчик (HC-SR04):** Самый дешевый и популярный.
|
||||
* *Минус:* Широкий луч (может «цеплять» борта конвейера) и низкая скорость обновления.
|
||||
2. **ИК-датчик расстояния (Sharp GP2Y0A21YK0F):** Более точный, узкий луч.
|
||||
* *Минус:* Аналоговый сигнал, чувствителен к цвету объекта (черный поглощает ИК).
|
||||
3. **Лазерный ToF-датчик (VL53L0X / VL53L1X):** **Мой выбор для этого проекта.**
|
||||
* *Плюсы:* Измеряет время полета фотона (Time-of-Flight), работает независимо от цвета объекта, очень высокая точность (до миллиметров) и очень узкий луч.
|
||||
|
||||
---
|
||||
|
||||
### Итоговая архитектура (предложение):
|
||||
|
||||
* **Контроллер:** Arduino (Uno или Mega, если планируешь расширять количество датчиков).
|
||||
* **Привод ленты:** Шаговый двигатель NEMA 17 $\rightarrow$ Драйвер A4988/TMC2208 $\rightarrow$ Arduino.
|
||||
* **Сортировка:** 3 $\times$ Сервоприводы SG90 или MG90S (с металлическим редуктором надежнее).
|
||||
* **Датчик высоты:** VL53L0X (I2C интерфейс).
|
||||
* **Питание:** Отдельный блок питания 12В для двигателя и 5В для Arduino/сервоприводов (общий минус/земля).
|
||||
|
||||
**Важное замечание из спецификации:**
|
||||
Не забудь предусмотреть в логике категорию «Не подходит для сортировки» [1]. Если датчик зафиксирует объект, который либо слишком высокий, либо слишком низкий (выходит за допустимые габариты), система должна отправить его в отдельный поток или оставить на ленте до конца [1].
|
||||
|
||||
Поскольку мы проектируем макет, важно учитывать не только функциональность, но и ограничения, упомянутые в техническом контексте: доступную площадь участка [1], разнообразие форм товаров (включая круглые в сечении) и необходимость бережного обращения с хрупкими или ценными объектами [1].
|
||||
|
||||
|
||||
# Сервоприводы с барьером — это надежный вариант, но в зависимости от того, какие объекты вы будете сортировать, рассмотрите следующие альтернативы:
|
||||
|
||||
### 1. Электромагнитные толкатели (Solenoids)
|
||||
Вместо плавного поворота барьера, соленоид дает резкий линейный толчок.
|
||||
* **Плюсы:** Очень высокая скорость срабатывания, компактность [1].
|
||||
* **Минусы:** Резкий удар. Если ваши объекты хрупкие, этот вариант **не рекомендуется**, так как он противоречит требованию к «мягкости обращения» [1].
|
||||
* **Когда использовать:** Для прочных, тяжелых или однотипных деталей.
|
||||
|
||||
### 2. Откидная платформа (Tipping Platform)
|
||||
Это участок конвейера, который может наклоняться в сторону или под ним открывается люк.
|
||||
* **Плюсы:** Позволяет перемещать объекты за счет гравитации. Это один из самых бережных способов перемещения, что важно для ценных или хрупких товаров [1].
|
||||
* **Минусы:** Требует более сложной механической интеграции в саму ленту.
|
||||
* **Когда использовать:** Если приоритетом является сохранность объекта и минимизация механических ударов.
|
||||
|
||||
### 3. Поворотный диск-распределитель (Rotating Disc)
|
||||
В конце основной ленты устанавливается диск, который поворачивается на определенный угол, направляя объект в один из трех лотков.
|
||||
* **Плюсы:** Занимает минимум места (оптимально для ограниченной площади участка [1]). Отлично работает с объектами, имеющими круг в сечении [1].
|
||||
* **Минусы:** Требует точной синхронизации остановки ленты и поворота диска.
|
||||
* **Когда использовать:** Если макет должен быть максимально компактным, а объекты имеют схожую форму (например, цилиндры или сферы).
|
||||
|
||||
### 4. Боковой конвейер (Cross-Belt / Diverter)
|
||||
Это короткий перпендикулярный отрезок ленты, который включается только тогда, когда объект должен быть сброшен в зону.
|
||||
* **Плюсы:** Самый профессиональный и «мягкий» метод. Идеален для хрупких товаров [1].
|
||||
* **Минусы:** Высокая стоимость и сложность (нужно еще 3 маленьких мотора и дополнительные ленты).
|
||||
* **Когда использовать:** Если вы хотите создать максимально приближенный к реальному промышленному производству макет.
|
||||
|
||||
### Сводная таблица для выбора:
|
||||
|
||||
| Вариант | Бережность (для хрупких [1]) | Компактность (площадь [1]) | Сложность реализации | Работа с круглыми объектами [1] |
|
||||
| :--- | :--- | :--- | :--- | :--- |
|
||||
| **Серво-барьер** | Средняя | Высокая | Низкая | Хорошо |
|
||||
| **Соленоид** | Низкая | Очень высокая | Низкая | Средне |
|
||||
| **Платформа** | Высокая | Средняя | Средняя | Хорошо |
|
||||
| **Диск** | Средняя | Очень высокая | Средняя | Идеально |
|
||||
| **Боковой конвейер**| Очень высокая | Низкая | Высокая | Хорошо |
|
||||
|
||||
**Моя рекомендация:**
|
||||
Если вы хотите сохранить простоту управления через Arduino, но при этом учесть требования к бережности и компактности [1], я рекомендую остаться на **сервоприводах**, но изменить конструкцию барьера: вместо «толкателя» сделать **«поворотный желоб»** или **«шлюз»**. Это позволит объекту плавно скатываться в нужную зону, не подвергаясь резким ударам.
|
||||
Reference in New Issue
Block a user