├── .gitmodules
├── README.md
├── ROS-Packages
└── README.md
├── diy_robotics_arm_esp32
├── .gitignore
├── .vscode
│ ├── extensions.json
│ └── settings.json
├── README.md
├── images
│ └── Communication.png
├── lib
│ └── README
├── platformio.ini
└── src
│ ├── Axis.hpp
│ ├── Configuration.h
│ ├── OledDisplay.hpp
│ ├── communication
│ ├── DataFormat.hpp
│ └── WiFiConnection.hpp
│ └── main.cpp
├── diy_robotics_arm_pcb
├── README.md
├── diy_robotics_arm-backups
│ └── diy_robotics_arm-2024-02-12_133838.zip
├── diy_robotics_arm.kicad_pcb
├── diy_robotics_arm.kicad_prl
├── diy_robotics_arm.kicad_pro
├── diy_robotics_arm.kicad_sch
├── diy_robotics_arm.zip
├── fp-info-cache
└── images
│ ├── pcb_arm.png
│ └── schematic_arm.png
├── diy_robotics_gripper_cad
├── CONCEPT.md
├── FinRay_finger_parallel.step
├── FinRay_finger_parallel.stl
├── README.md
├── finger_50mm.stl
├── finger_50mm.stp
├── flange.stl
├── flange.stp
├── gear_16_teeth.stl
├── gear_16_teeth.stp
├── gegenstueck_rack.stl
├── gegenstueck_rack.stp
├── images
│ ├── img1.png
│ ├── img2.png
│ ├── img3.png
│ ├── img4.png
│ ├── img5.png
│ ├── img6.png
│ ├── img7.png
│ └── img8.png
├── laufschiene.stl
├── laufschiene.stp
├── mounting_adapter.stl
├── mounting_adapter.stp
├── rack.stl
├── rack_asm.stp
├── rack_spacer.stl
├── rack_spacer.stp
├── servo_mg90s.stp
└── zsb_gesamt_asm.stp
├── diy_robotics_gripper_esp32
├── .gitignore
├── .vscode
│ ├── extensions.json
│ └── settings.json
├── README.md
├── images
│ └── Communication.png
├── lib
│ └── README
├── platformio.ini
└── src
│ ├── Configuration.h
│ ├── Gripper.hpp
│ ├── OledDisplay.hpp
│ ├── communication
│ ├── DataFormat.hpp
│ └── WiFiConnection.hpp
│ └── main.cpp
├── diy_robotics_gripper_pcb
├── README.md
├── diy_robotics_gripper.kicad_pcb
├── diy_robotics_gripper.kicad_prl
├── diy_robotics_gripper.kicad_pro
├── diy_robotics_gripper.kicad_sch
├── diy_robotics_gripper.zip
└── images
│ ├── pcb_gripper.png
│ └── schematic_gripper.png
├── hardwaretest_without_ROS
├── Gripper_via_SerialMonitor
│ ├── .gitignore
│ ├── .vscode
│ │ └── extensions.json
│ ├── include
│ │ └── README
│ ├── lib
│ │ └── README
│ ├── platformio.ini
│ ├── src
│ │ ├── Gripper.hpp
│ │ └── main.cpp
│ └── test
│ │ └── README
├── README.md
├── SixAxis_via_SerialMonitor
│ ├── .gitignore
│ ├── .vscode
│ │ └── extensions.json
│ ├── Achsensteuerung_per_SerielleDaten.code-workspace
│ ├── include
│ │ └── README
│ ├── lib
│ │ └── README
│ ├── platformio.ini
│ ├── src
│ │ └── main.cpp
│ └── test
│ │ └── README
└── StepperTest_ArduinoUno
│ ├── .gitignore
│ ├── .vscode
│ └── extensions.json
│ ├── Stepper_w_Accelstepper.ino
│ ├── fritzing_stepper_test.fzz
│ ├── fritzing_stepper_test.png
│ ├── include
│ └── README
│ ├── lib
│ └── README
│ ├── platformio.ini
│ ├── src
│ └── main.cpp
│ └── test
│ └── README
└── images
├── Robot_blur.png
├── VideoPreview.png
├── VideoPreviewPfuscher666.png
├── application_packages_new.png
├── description_packages.png
├── driver_packages.png
├── image.png
├── pcb_arm_and_gripper.png
└── staged_build_new.png
/.gitmodules:
--------------------------------------------------------------------------------
1 | [submodule "ROS-Packages/diy_robot_full_cell_description"]
2 | path = ROS-Packages/diy_robot_full_cell_description
3 | url = https://github.com/RobinWolf/diy_robotarm_wer24_description
4 | [submodule "ROS-Packages/diy_soft_gripper_description"]
5 | path = ROS-Packages/diy_soft_gripper_description
6 | url = https://github.com/RobinWolf/diy_soft_gripper_description
7 | [submodule "ROS-Packages/diy_robotarm_wer24_description"]
8 | path = ROS-Packages/diy_robotarm_wer24_description
9 | url = https://github.com/RobinWolf/diy_robotarm_wer24_description
10 | [submodule "ROS-Packages/diy_robot_cell_description"]
11 | path = ROS-Packages/diy_robot_cell_description
12 | url = https://github.com/RobinWolf/diy_robot_full_cell_description
13 | [submodule "ROS-Packages/diy_robotarm_wer24_driver"]
14 | path = ROS-Packages/diy_robotarm_wer24_driver
15 | url = https://github.com/RobinWolf/diy_robotarm_wer24_driver
16 | [submodule "ROS-Packages/diy_soft_gripper_driver"]
17 | path = ROS-Packages/diy_soft_gripper_driver
18 | url = https://github.com/RobinWolf/diy_soft_gripper_driver
19 | [submodule "ROS-Packages/diy_robot_application"]
20 | path = ROS-Packages/diy_robot_application
21 | url = https://github.com/RobinWolf/diy_robot_application
22 | [submodule "ROS-Packages/diy_robot_wer24_moveit"]
23 | path = ROS-Packages/diy_robot_wer24_moveit
24 | url = https://github.com/RobinWolf/diy_robot_wer24_moveit
25 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # diy_robotics
2 |
3 | ## Table of Contents
4 | 1. [Video of the results](#video)
5 | 2. [Overview](#overview)
6 | 3. [Possible improvements](#improvements)
7 | 4. [Part list](#partlist)
8 | 5. [Assembly-Videos by pfuscher666](#assemblyvideos)
9 |
10 |
11 |
12 | ## Video of the results (in German)
13 |
14 | This [YouTube video](https://www.youtube.com/watch?v=qf8R6U7XTOY) shows the results of our project work:
15 |
16 | [](https://www.youtube.com/watch?v=qf8R6U7XTOY)
17 |
18 |
19 |
20 |
21 | ## Overview
22 |
23 | This repo contains the results of a project work at the University of Applied Sciences Karlsruhe by **Robin Wolf, Hannes Bornemann and Mathias Fuhrer**. As part of the project work, the [Six-Axis Robot Arm WE-R2.4 from LoboCNC](https://www.printables.com/de/model/132260-we-r24-six-axis-robot-arm) was set up and a new gripper was developed.
24 |
25 | The project was supervised by Gergely Sóti, Philipp Augenstein and Prof. Dr.-Ing. habil. Björn Hein.
26 |
27 | 
28 |
29 | The CAD files of the gripper and assembly instructions can be found in folder [diy_robotics_gripper_cad](https://github.com/mathias31415/diy_robotics/tree/main/diy_robotics_gripper_cad).
30 |
31 | 
32 |
33 | Two PCBs were designed for the electrical wiring: one PCB for the 6 axes and one PCB for the gripper. The KiCAD and Gerber files can be found in the folders [diy_robotics_arm_pcb](https://github.com/mathias31415/diy_robotics/tree/main/diy_robotics_arm_pcb) and [diy_robotics_gripper_pcb](https://github.com/mathias31415/diy_robotics/tree/main/diy_robotics_gripper_pcb).
34 | 
35 |
36 | To control the 6 axes and the gripper, ROS2 implementations were written that communicate via Wifi with an ESP32, from which the axes and the gripper are then moved. One ESP32 is responsible for the 6 axes, and the second ESP32 is responsible for the gripper.
37 |
38 | The ROS2 packages are packaged in Docker containers so that they can be used by others without any problems. The repos of our ROS2 packages are linked in the folder [ROS-Packages](https://github.com/mathias31415/diy_robotics/tree/main/ROS-Packages). To just use our ROS application go to the repo [diy_robot_application](https://github.com/RobinWolf/diy_robot_application) and follow the HowTo. To understand our implementation you should read all readmes of our ROS repos
39 |
40 | The PC on which the ROS2 packages are executed must be connected to the same Wifi as the two ESP32s. The two ESP32s then receive messages from the PC via TCP-IP with the commands for the gripper and the 6-axes and then control the gripper and the axes accordingly. The VS-Code PlatformIO project folders for the ESP32 of the gripper and the axes can be found in the folders [diy_robotics_arm_esp32](https://github.com/mathias31415/diy_robotics/tree/main/diy_robotics_arm_esp32) and [diy_robotics_gripper_esp32](https://github.com/mathias31415/diy_robotics/tree/main/diy_robotics_gripper_esp32). Make sure to adapt the SSID and IP address as well as the password of your Wifi in the ``Configuration.h`` files.
41 |
42 |
43 | The [hardwaretest_without_ROS](https://github.com/mathias31415/diy_robotics/tree/main/hardwaretest_without_ROS) folder contains additional programs to test the hardware without ROS via the Serial Monitor.
44 |
45 |
46 |
47 |
48 | ## Possible improvements
49 |
50 | - Conversion of the robot to metric screws
51 | - Endstops or sensors to determine the position of the robot or to move it to a home position
52 |
53 |
54 |
55 |
56 |
57 | ## Part list (as of March 2024)
58 | The information serves as a guide only. Prices may change over time. It is also worth comparing other providers and manufacturers.
59 | (Parts such as screws, filament and glue are not listed)
60 |
61 | ### 1. Robot-arm
62 | | Index | Description | Quantity | Total price in € | Link |
63 | | --- | --- | --- | --- | --- |
64 | | 1 | Nema 17 Stepper-Motor 42Ncm | 3 | 15,55 | [Link](https://www.omc-stepperonline.com/de/3-stueck-e-serie-nema-17-bipolar-42-ncm-59-49-oz-in-1-5a-42x42x38mm-4-draehte-3-17he15-1504s) |
65 | | 2 | Minibea PM35L-048 Stepper-Motor | 3 | 18,20 | [Link](https://www.ebay.de/itm/403845575203?_trkparms=amclksrc%3DITM%26aid%3D777008%26algo%3DPERSONAL.TOPIC%26ao%3D1%26asc%3D20230811123857%26meid%3D01b980ffd3f64d67a8210c3d282fd210%26pid%3D101770%26rk%3D1%26rkt%3D1%26itm%3D403845575203%26pmt%3D1%26noa%3D1%26pg%3D4375194%26algv%3DRecentlyViewedItemsV2%26brand%3DMarkenlos&_trksid=p4375194.c101770.m146925&_trkparms=parentrq%3Acd81805118b0a8cc93d6ff8cffffc172%7Cpageci%3Aa6388820-82dd-11ee-97f3-8e07020e1f61%7Ciid%3A1%7Cvlpname%3Avlp_homepage) |
66 | | 3 | 6mm steel balls for bearings | 200 | 9,99 | [Link](https://www.amazon.de/dp/B01LPZ56ZC?psc=1&ref=ppx_yo2ov_dt_b_product_details ) |
67 | | 4 | additional connection cable for motors 1,5m | 6 | 9,59 | [Link](https://www.amazon.de/Iverntech-Schrittmotor-Terminal-3D-Drucker-Stepper/dp/B08SQ35LRQ/ref=sr_1_6?crid=2UUMN13RQ0TTT&keywords=stepper%2Bmotor%2Bkabel&qid=1700576677&sprefix=stepper%2Bmotor%2B%2Caps%2C149&sr=8-6&th=1 ) |
68 | | 5 | Power supply 24V 350W | 1 | 22,97 | [Link](https://www.omc-stepperonline.com/de/lrs-350-24-mean-well-350w-24vdc-14-6a-115-230vac-geschlossenes-schaltnetzteil-lrs-350-24) |
69 | | 6 | Step-Down Converter 24V - 5V | 2 | 4,00 | [Link](https://www.amazon.de/Yizhet-Converter-Spannungsregler-Einstellbares-Abw%C3%A4Rtsmodul/dp/B0CKWYXD89/ref=sr_1_2_sspa?keywords=step+down+modul&qid=1699960183&sr=8-2-spons&sp_csd=d2lkZ2V0TmFtZT1zcF9hdGY&psc=1) |
70 |
71 |
72 |
73 | ### 2. Gripper
74 | | Index | Description | Quantity | Total price in € | Link |
75 | | --- | --- | --- | --- | --- |
76 | | 1 | Servo SG90 Continuous Drive (Metal 360 Degree) | 2 | 9,00 | [Link](https://de.aliexpress.com/item/1005004550512467.html?spm=a2g0o.order_list.order_list_main.10.12875c5fjUap8p&gatewayAdapt=glo2deu) |
77 |
78 | ### 3. PCBs
79 | The geber-files for the PCBs can be found in folders [diy_robotics_arm_pcb](https://github.com/mathias31415/diy_robotics/tree/main/diy_robotics_arm_pcb) and [diy_robotics_gripper_pcb](https://github.com/mathias31415/diy_robotics/tree/main/diy_robotics_gripper_pcb). With the geber-files, the PCBs can be ordered from any manufacturer. At JLCPCB we paid a total of just over €30 for 5 pieces of both PCBs.
80 | The parts for assembling the PCBs are listed below. Note that some parts are required for both PCBs and are therefore listed twice. However, one set is often sufficient for both PCBs (e.g. for the pin headers). For components such as the ESP-32, it is cheaper to buy a set of two for both PCBs than to order two individual ESP-32s.
81 |
82 | #### 3.1 Arm PCB
83 | | Index | Description | Quantity | Total price in € | Link |
84 | | --- | --- | --- | --- | --- |
85 | | 1 | 0.96 Inch OLED Display SSD1306 | 1 | 1,78 | [Link](https://de.aliexpress.com/item/1005005970901119.html?spm=a2g0o.order_list.order_list_main.22.4a065c5ffRtZfv&gatewayAdapt=glo2deu) |
86 | | 2 | ESP-32 | 1 | 10,00 | [Link](https://www.amazon.de/gp/aw/d/B074RG86SR/?_encoding=UTF8&pd_rd_plhdr=t&aaxitk=6a9e09b157f2b15a9cc364c1aba715aa&hsa_cr_id=4742246160502&qid=1699959775&sr=1-1-e0fa1fdd-d857-4087-adda-5bd576b25987&ref_=sbx_be_s_sparkle_mcd_asin_0_title&pd_rd_w=ee0VR&content-id=amzn1.sym.6f8b36f0-c2c9-44f2-97a8-5b151d2fc9c7%3Aamzn1.sym.6f8b36f0-c2c9-44f2-97a8-5b151d2fc9c7&pf_rd_p=6f8b36f0-c2c9-44f2-97a8-5b151d2fc9c7&pf_rd_r=0TBV9VYJCQK5QB253DBZ&pd_rd_wg=KZCjO&pd_rd_r=297525bc-30e7-47c9-996a-8a255adffee4) |
87 | | 3 | 2-Pin Screw Terminal 5mm | 3 | 4,56 for a set | [Link](https://de.aliexpress.com/item/1005005595075178.html?spm=a2g0o.order_list.order_list_main.17.4a065c5ffRtZfv&gatewayAdapt=glo2deu) |
88 | | 4 | Pin Header 1x4 Pin Male 2,54mm | 6 |1,77 for male + female set | [Link](https://de.aliexpress.com/item/4000873858801.html?spm=a2g0o.detail.pcDetailTopMoreOtherSeller.2.e4a5600cBKuomq&gps-id=pcDetailTopMoreOtherSeller&scm=1007.40050.354490.0&scm_id=1007.40050.354490.0&scm-url=1007.40050.354490.0&pvid=c41c94ec-099f-42bf-a647-59697bc6a5d5&_t=gps-id:pcDetailTopMoreOtherSeller,scm-url:1007.40050.354490.0,pvid:c41c94ec-099f-42bf-a647-59697bc6a5d5,tpp_buckets:668%232846%238114%231999&pdp_npi=4%40dis%21EUR%211.77%211.77%21%21%211.89%211.89%21%4021038dfc17098923902746506e96e7%2110000010058190554%21rec%21DE%213958237401%21&utparam-url=scene%3ApcDetailTopMoreOtherSeller%7Cquery_from%3A) |
89 | | 5 | Capacitor 25V 100uF | 6 | 1,78 for 50pcs | [Link](https://de.aliexpress.com/item/1005005945738204.html?spm=a2g0o.order_list.order_list_main.11.4a065c5ffRtZfv&gatewayAdapt=glo2deu) |
90 | | 6 | DRV8825 Stepper Driver | 6 | 10,00 | [Link](https://www.amazon.de/dp/B07YFS29W7?psc=1&ref=ppx_yo2ov_dt_b_product_details ) |
91 | | 7 | 4-way DIP-Switch 2,54mm | 6 | 1,86 for 10pcs | [Link](https://de.aliexpress.com/item/1005006109195564.html?spm=a2g0o.order_list.order_list_main.10.4a065c5ffRtZfv&gatewayAdapt=glo2deu) |
92 | | 8 | Female pin header 2,54mm for the display, ESP-32 and Stepper Drivers | | 1,77 for male + female set | [Link](https://de.aliexpress.com/item/4000873858801.html?spm=a2g0o.detail.pcDetailTopMoreOtherSeller.2.e4a5600cBKuomq&gps-id=pcDetailTopMoreOtherSeller&scm=1007.40050.354490.0&scm_id=1007.40050.354490.0&scm-url=1007.40050.354490.0&pvid=c41c94ec-099f-42bf-a647-59697bc6a5d5&_t=gps-id:pcDetailTopMoreOtherSeller,scm-url:1007.40050.354490.0,pvid:c41c94ec-099f-42bf-a647-59697bc6a5d5,tpp_buckets:668%232846%238114%231999&pdp_npi=4%40dis%21EUR%211.77%211.77%21%21%211.89%211.89%21%4021038dfc17098923902746506e96e7%2110000010058190554%21rec%21DE%213958237401%21&utparam-url=scene%3ApcDetailTopMoreOtherSeller%7Cquery_from%3A) |
93 |
94 |
95 | #### 3.2 Gripper PCB
96 | | Index | Description | Quantity | Total price in € | Link |
97 | | --- | --- | --- | --- | --- |
98 | | 1 | 0.96 Inch OLED Display SSD1306 | 1 | 1,78 | [Link](https://de.aliexpress.com/item/1005005970901119.html?spm=a2g0o.order_list.order_list_main.22.4a065c5ffRtZfv&gatewayAdapt=glo2deu) |
99 | | 2 | ESP-32 | 1 | 10,00 | [Link](https://www.amazon.de/gp/aw/d/B074RG86SR/?_encoding=UTF8&pd_rd_plhdr=t&aaxitk=6a9e09b157f2b15a9cc364c1aba715aa&hsa_cr_id=4742246160502&qid=1699959775&sr=1-1-e0fa1fdd-d857-4087-adda-5bd576b25987&ref_=sbx_be_s_sparkle_mcd_asin_0_title&pd_rd_w=ee0VR&content-id=amzn1.sym.6f8b36f0-c2c9-44f2-97a8-5b151d2fc9c7%3Aamzn1.sym.6f8b36f0-c2c9-44f2-97a8-5b151d2fc9c7&pf_rd_p=6f8b36f0-c2c9-44f2-97a8-5b151d2fc9c7&pf_rd_r=0TBV9VYJCQK5QB253DBZ&pd_rd_wg=KZCjO&pd_rd_r=297525bc-30e7-47c9-996a-8a255adffee4) |
100 | | 3 | 2-Pin Screw Terminal 5mm | 2 | 4,56 for a set | [Link](https://de.aliexpress.com/item/1005005595075178.html?spm=a2g0o.order_list.order_list_main.17.4a065c5ffRtZfv&gatewayAdapt=glo2deu) |
101 | | 4 | Pin Header 1x4 Pin Male 2,54mm | 1 | 1,77 for male + female set | [Link](https://de.aliexpress.com/item/4000873858801.html?spm=a2g0o.detail.pcDetailTopMoreOtherSeller.2.e4a5600cBKuomq&gps-id=pcDetailTopMoreOtherSeller&scm=1007.40050.354490.0&scm_id=1007.40050.354490.0&scm-url=1007.40050.354490.0&pvid=c41c94ec-099f-42bf-a647-59697bc6a5d5&_t=gps-id:pcDetailTopMoreOtherSeller,scm-url:1007.40050.354490.0,pvid:c41c94ec-099f-42bf-a647-59697bc6a5d5,tpp_buckets:668%232846%238114%231999&pdp_npi=4%40dis%21EUR%211.77%211.77%21%21%211.89%211.89%21%4021038dfc17098923902746506e96e7%2110000010058190554%21rec%21DE%213958237401%21&utparam-url=scene%3ApcDetailTopMoreOtherSeller%7Cquery_from%3A) |
102 | | 5 | Female pin header 2,54mm for the display, ESP-32 and Stepper Drivers | |1,77 for male + female set | [Link](https://de.aliexpress.com/item/4000873858801.html?spm=a2g0o.detail.pcDetailTopMoreOtherSeller.2.e4a5600cBKuomq&gps-id=pcDetailTopMoreOtherSeller&scm=1007.40050.354490.0&scm_id=1007.40050.354490.0&scm-url=1007.40050.354490.0&pvid=c41c94ec-099f-42bf-a647-59697bc6a5d5&_t=gps-id:pcDetailTopMoreOtherSeller,scm-url:1007.40050.354490.0,pvid:c41c94ec-099f-42bf-a647-59697bc6a5d5,tpp_buckets:668%232846%238114%231999&pdp_npi=4%40dis%21EUR%211.77%211.77%21%21%211.89%211.89%21%4021038dfc17098923902746506e96e7%2110000010058190554%21rec%21DE%213958237401%21&utparam-url=scene%3ApcDetailTopMoreOtherSeller%7Cquery_from%3A) |
103 |
104 |
105 |
106 |
107 | ## Assembly-Videos by pfuscher666
108 |
109 | [Pfuscher666](https://www.youtube.com/@pfuscher666) made a nice assembly video series on YouTube using our Github repo. If you want to recreate the robot, we recommend checking out his [playlist](https://youtube.com/playlist?list=PLlPSE-8AfOheRNZ__qo-JLWLydIsqo4Fw&si=UZEIlQIDYb_gISjW).
110 |
111 | [](https://www.youtube.com/watch?v=72cq4wMddos)
112 |
--------------------------------------------------------------------------------
/ROS-Packages/README.md:
--------------------------------------------------------------------------------
1 | # Main Readme for the ROS-Integration of our DIY-Robotarm and Gripper
2 |
3 | This Readme file works as an overview about the complete ROS-integration of our robot and gripper. It should clarify our way to set up the whole ROS project before you take a deeper inlook into the single package Readme's.
4 |
5 | Every mentioned package has its own readme where deeper informations about the structure, development process and content are provided.
6 |
7 | ROS (Robot Operating System) is a open-source software framework for robotics tasks. In the following we will use the ROS2 distribution Humble.
8 |
9 | ## Main Ideas/ Tasks
10 | - ROS runs on a LINUX- device and sends control messages to the ESP32 microcontroller on the hardware side. No complex calculations on the ESP32 are needed.
11 | - Ensure that developed ROS-Packages are reusable for other projects -> Modularity is recommendet
12 | - Use docker in development and deployment, so no version and dependencie issues should occur when ROS is running on other computers.
13 | - The 6 axis robotic arm shold be controlled within the ROS2-Control framework, for the gripper only a bool state control (opening and closing) should be implemented.
14 | - Set up Moveit 2 for motion planning
15 | - Implement the python user interface as known from the other robotic-systems in the IRAS laboratory.
16 |
17 | ## Structure
18 | As mentioned above modularity is one of our main targets while software-development. Using docker in development and deployment of the packages facilitates to deal with that requirement.
19 | Every ROS robotics project has three key parts.
20 |
21 | **Part 1 is the description of the robotics hardware.** The description package contains all things to represent the hardware inside the ROS-framework such as the URDF-Model.
22 | Our full diy robotics "cell" consists of the 6-axis arm, the gripper and the subframe where the arm is mounted on. So in total wee need 3 seperate packages to describe our diy robot inside the ROS-framework as shown below:
23 |
24 | - gripper description repo: https://github.com/RobinWolf/diy_soft_gripper_description
25 | - arm description repo: https://github.com/RobinWolf/diy_robotarm_wer24_description
26 | - combined cell description repo: https://github.com/RobinWolf/diy_robot_full_cell_description
27 |
28 | 
29 |
30 | **Part 2 are the drivers.** The drivers link the description (digital robot) to the real hardware. For the arm and the gripper we use different control stategies.
31 | Due to the complexity of controlling 6 dependent axis, the arm is fully included in the ROS2-Control framework. The control message to the ESP32 contains the next axis setpoints (next interpolated point in the C-Space when creating trajectories), some status bits and some bits for communication management. Because we kept the hardware as sinple (and cheap) as possible, no sensors for joint-states are included. We operate the arm in an Open-Loop control. If the arm is used inside the specified physical limits, this should not be a disadvantage. For more informations on this point, please switch to the overall-Readme.
32 | Because of simplicity the gripper doesn't need to be integrated in ROS2-Control. The gripper driver package only contains a simple service-definition wich sends a bool (0 or 1) to the robot where 0 equals open and 1 close.
33 | So in total we need 2 seperate driver packages:
34 |
35 | - gripper driver repo: https://github.com/RobinWolf/diy_soft_gripper_driver
36 | - arm driver repo: https://github.com/RobinWolf/diy_robotarm_wer24_driver
37 |
38 | 
39 |
40 | **Part 3 of our robotics system integration is the application.** Firstly these packages contain Moveit configurations to enable motion planning to provide trajectories for the robot. Secondly a user-friendly interface for programming the robot is integrated here. At the end the upcoming users should be able to develop robotic applications with our diy hardware by just writing a simple python code where trajectories and motions (PTP, LIN) could be programmed.
41 | To generate an interface between Moveit2 and our python application we implemented some services as moveit wrappers. Clients for these services are initialized and called by the methods in your final application. For a deeper view inside the moveit and application package, please refer to these repos:
42 |
43 | - moveit and wrapper repo: https://github.com/RobinWolf/diy_robot_wer24_moveit
44 | - application repo: https://github.com/RobinWolf/diy_robot_application
45 |
46 | 
47 |
48 | To build our robotics control system from the introduced packages, we need to connect them.
49 | There are multiple possible ways to connect the provided packages/ the docker containers. We have choosen a "stacked" technique. When launching the whole system with all packages included, this container was built in different stages. Every stage inside the Dockerfile defines a image which represents one step of the build process. In every stage one of the depencencie packages and needed ROS extentions get installed/added to the container. The next stage uses this stage as their base image and puts another package on top.
50 | In our implementation all stages of the image were build everytime you want to run the container, for further deployment it's also possible to upload the final built image in dockerhub or other cloud platforms and just call this instead of rebuilding at every call. The following chart should display the concept and how we build our whole ROS-Framework from the introduced packages:
51 |
52 | 
53 |
54 | So in total we need to develop 3 description packages, 2 driver packages and 3 moveit packages and 1 application package.
55 |
56 | ## Development
57 | Every mentioned package was developed more or less independend. For simple development and deployment, every package has its own GIT repository.
58 | In the development phase of the packages we connect a source folder from our host-machine to the docker container. This setup enables coding on the host-machine and testing the packages in a docker container at the same time. All changes in this setup are pushed on the dev branch of the desired repo.
59 | Please refer to the Readme's in the desired package repos for deeper informations about the structure, development process and content of the introduced packages.
60 |
61 | ## Deployment
62 | After development was finished we reorganized the structure inside the package to the common ROS conventions and disconnected the source folder from our docker container. This was pushed to the main branch of the desired repo. For further deployment the repo which contains all the code gets directly cloned in the docker container while building the container from the provided image.
63 |
64 | If you want to run the package on your PC in the deployed docker container, you should follow the given guideline:
65 | 1) Clone the Repo which contains the package you want to run to your LINUX-PC. (hint: working docker installation required)
66 | 2) Open a new terminal and navigate to the cloned content
67 | 3) build the docker container from the provided image by sourcing the run script. ```./run.sh```
68 |
69 | Now you are inside the container.
70 | - If you have run some of the dependencie packages, the current development state should be build, sourced and launched automatically. For this please refer to the different package repos.
71 | - If you have run the application package, all dependencies are build and sourced automatically. You can start buildig your own robotics application with the python interface !
72 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/.gitignore:
--------------------------------------------------------------------------------
1 | .pio
2 | .vscode/.browse.c_cpp.db*
3 | .vscode/c_cpp_properties.json
4 | .vscode/launch.json
5 | .vscode/ipch
6 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See http://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "platformio.platformio-ide"
6 | ],
7 | "unwantedRecommendations": [
8 | "ms-vscode.cpptools-extension-pack"
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "cmake.configureOnOpen": false,
3 | "files.associations": {
4 | "*.tcc": "cpp"
5 | }
6 | }
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/README.md:
--------------------------------------------------------------------------------
1 | # diy_robotics_arm_esp32
2 | This code initializes a robotic system with multiple axes, each controlled by a stepper motor. It uses an ESP32 microcontroller, a display (SSD1306), and communicates with a PC over WiFi. The data format for communication between ROS and the ESP32 is defined in `DataFormat.hpp`. The target axis positions of the 6 axes and an activate signal are transmitted. The activate signal is an indicator that ROS and the ESP are connected.
3 | The code defines the axes, sets up communication using the `WiFiConnection.hpp`, and handles data reception from the PC. The robotic system is activated or deactivated based on commands from the PC. The code continuously checks for updates from the PC, adjusts axis positions accordingly, and updates the display with relevant information. If the axes do not need to be moved, the axes are switched off so that the motors do not get warm. In addition, the hardware enable switch is monitored with which the axes can also be switched off. If the axes are deactivated with this switch, the axis movement is also stopped on the software side.
4 |
5 | 
6 |
7 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/images/Communication.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_arm_esp32/images/Communication.png
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/lib/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for project specific (private) libraries.
3 | PlatformIO will compile them to static libraries and link into executable file.
4 |
5 | The source code of each library should be placed in a an own separate directory
6 | ("lib/your_library_name/[here are source files]").
7 |
8 | For example, see a structure of the following two libraries `Foo` and `Bar`:
9 |
10 | |--lib
11 | | |
12 | | |--Bar
13 | | | |--docs
14 | | | |--examples
15 | | | |--src
16 | | | |- Bar.c
17 | | | |- Bar.h
18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
19 | | |
20 | | |--Foo
21 | | | |- Foo.c
22 | | | |- Foo.h
23 | | |
24 | | |- README --> THIS FILE
25 | |
26 | |- platformio.ini
27 | |--src
28 | |- main.c
29 |
30 | and a contents of `src/main.c`:
31 | ```
32 | #include
33 | #include
34 |
35 | int main (void)
36 | {
37 | ...
38 | }
39 |
40 | ```
41 |
42 | PlatformIO Library Dependency Finder will find automatically dependent
43 | libraries scanning project source files.
44 |
45 | More information about PlatformIO Library Dependency Finder
46 | - https://docs.platformio.org/page/librarymanager/ldf.html
47 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/platformio.ini:
--------------------------------------------------------------------------------
1 | ; PlatformIO Project Configuration File
2 | ;
3 | ; Build options: build flags, source filter
4 | ; Upload options: custom upload port, speed and extra flags
5 | ; Library options: dependencies, extra library storages
6 | ; Advanced options: extra scripting
7 | ;
8 |
9 | ; Please visit documentation for the other options and examples
10 | ; https://docs.platformio.org/page/projectconf.html
11 |
12 | [env:esp32dev]
13 | platform = espressif32
14 | board = esp32dev
15 | framework = arduino
16 | board_build.f_cpu = 240000000L
17 | monitor_speed = 115200
18 | board_build.partitions = huge_app.csv
19 | lib_deps =
20 | waspinator/AccelStepper@^1.64
21 | thingpulse/ESP8266 and ESP32 OLED driver for SSD1306 displays@^4.4.0
22 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/src/Axis.hpp:
--------------------------------------------------------------------------------
1 | #ifndef AXIS_HPP
2 | #define AXIS_HPP
3 |
4 | #include
5 | #include
6 | #include
7 | #include "Configuration.h"
8 |
9 |
10 | class Axis {
11 | //*******************************************************************************************************************
12 | //***********************define private class variables and methods (only callable inside the class******************
13 | //*******************************************************************************************************************
14 | private:
15 | AccelStepper _stepper; // Stepper Object initialized from Accelstepper adapted for SR
16 | bool _invertDirection = false; // If TRUE, the axis is inverted
17 | double _gearing = -1; //gearing given in config-file for all axis 1/38.4
18 | double _microsteps = -1; //still to implement!
19 | double _stepsPerRev = -1; //still to implement
20 | int _axisNumber = -1; // Axis Number Identifier (1...6) -> default -1 to detect improperly initialized objects
21 | int _minPos;
22 | int _maxPos;
23 |
24 | // Output Pin Information
25 | struct {
26 | bool invertOutputEnable = false; // If True, HIGH to Disable the stepper -> default: HIGH to enable Steppers
27 | int step, direction;
28 | } _outputs;
29 |
30 | // Position information
31 | struct Position {
32 | double setpoint = 0;
33 | double current = 0;
34 | } _position;
35 |
36 |
37 | // Get the distance between the current position and the setpoint
38 | double _distance() {
39 | if (_position.setpoint > _position.current) return (_position.setpoint - _position.current);
40 | else return (_position.current - _position.setpoint);
41 | };
42 |
43 |
44 | //*****************************************************************************************
45 | //*******************public Methods, callable in the main**********************************
46 | //*****************************************************************************************
47 | public:
48 | // Axis Constructor for DRV8825 Drivers
49 | Axis(int number, uint8_t stepPin, uint8_t directionPin, double gearing, int stepsPerRev, int microsteps, int minPos, int maxPos, int velMax, int accMax, bool invertDirection = false)
50 | {
51 | _axisNumber = number;
52 | _invertDirection = invertDirection;
53 | _gearing = gearing;
54 | _microsteps = microsteps;
55 | _stepsPerRev = stepsPerRev;
56 |
57 | //Define a stepper with the DRV8825 Driver
58 | _stepper = AccelStepper(AccelStepper::DRIVER, stepPin, directionPin);
59 |
60 | // Set min and max axis positions
61 | _minPos = minPos;
62 | _maxPos = maxPos;
63 |
64 | // Set maximum acceleration
65 | _stepper.setAcceleration(accMax);
66 |
67 | // Set maximum speed
68 | _stepper.setMaxSpeed(velMax);
69 |
70 | Axis::axisList.push_back(this); // Add the axis to the global list
71 | //see at the bottom of the class: push_back(this) adds pointer (this) to the current Axis object to the class
72 | //this allows iterating over all objects, e.g. for run()
73 | }
74 |
75 |
76 | // Get the current position in Degrees --> for feedback (not from motor, but axis position)
77 | double getPosition() {
78 | int invertParam = 1;
79 | if(_invertDirection) invertParam = -1; // Adjust rotation direction
80 | return (double) (_stepper.currentPosition()/(_stepsPerRev * _microsteps * _gearing) * 360.0 * invertParam); // Conversion from Steps to Degrees
81 | }
82 |
83 |
84 |
85 | // Move the axis relative to the current position (degrees)
86 | // void moveToRelativePosition(double position) { moveToPosition(getPosition() + position); };
87 |
88 | // Move the axis to an absolute position (degrees)
89 | void moveToPosition(double position)
90 | {
91 | if (position > _maxPos)
92 | {
93 | position = _maxPos;
94 | // Serial.println("position > _maxPos");
95 | }
96 |
97 | else if (position < _minPos)
98 | {
99 | position = _minPos;
100 | // Serial.println("position < _minPos");
101 | }
102 |
103 | long stepSetpoint = 0;
104 | //Conversion from Degrees to Steps for the Accelstepper class
105 | int invertParam = 1;
106 | if(_invertDirection) invertParam = -1; // Adjust rotation direction
107 |
108 | stepSetpoint = position/360.0 * _stepsPerRev * _microsteps * _gearing * invertParam; // Conversion from Degrees to Steps
109 | _stepper.moveTo(stepSetpoint);
110 | };
111 |
112 | // Polling function controlling the motor:
113 | void runMotor() { _stepper.run(); } // only this axis
114 |
115 | // Static function to poll all the existing motors:
116 | static void runAll() { //1 poll -> execute 1 step
117 | for (Axis * axis : Axis::axisList) axis->runMotor(); // all axes in axisList
118 | };
119 |
120 | // Static list of pointers to all axis instances. This allows iterating over all of them
121 | static std::vector axisList; //see above
122 | };
123 |
124 | std::vector Axis::axisList; // Instantiate the static axis list
125 | //std::vector<> is like an array that contains the pointer addresses of all Axis objects
126 | // Axis:: means that the definition for the variable axisList is static,
127 | // so it is the same for all instances of the Axis class and can be accessed in all instances
128 |
129 | #endif
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/src/Configuration.h:
--------------------------------------------------------------------------------
1 | #ifndef CONFIGURATION_H_
2 | #define CONFIGURATION_H_
3 |
4 | struct AxisLimits {
5 | float speed, acceleration;
6 | double maxPosition, minPosition;
7 | };
8 | struct Settings {
9 | AxisLimits axisLimits[7]; // Only using indices 1...6
10 | bool initialized = false;
11 | } settings;
12 |
13 | #define NETWORK_SSID "DIY-Robotics"
14 | #define NETWORK_PASSWORD "87654321"
15 | #define IP_ADDRESS 192, 168, 212, 203 // Gripper 202, Arm 203
16 | #define GATEWAY_IP 10, 42, 0, 1
17 | #define SUBNET_MASK 255, 255, 255, 0
18 |
19 | // Axis 1 uses a DRV8825 Driver, NEMA 17
20 | #define STEPPER_1_STEP 16
21 | #define STEPPER_1_DIR 13
22 | #define AXIS_1_GEARING 38.4 // i = n_Input/n_Output = 38.4/1 = 38.4
23 | #define AXIS_1_STEPS_PER_REV 200
24 | #define AXIS_1_MICROSTEPS 8 // M0 = 1, M1 = 1, M2 = 0 --> 1/8 microstepping
25 | #define AXIS_1_POS_MIN -135
26 | #define AXIS_1_POS_MAX 135
27 | #define AXIS_1_VEL_MAX 1000
28 | #define AXIS_1_ACC_MAX 1000
29 | #define AXIS_1_INVERT_DIRECTION false // to match axis rotation direction with simulation rotation direction
30 |
31 | // Axis 2 uses a DRV8825 Driver, NEMA 17
32 | #define STEPPER_2_STEP 18
33 | #define STEPPER_2_DIR 17
34 | #define AXIS_2_GEARING 38.4
35 | #define AXIS_2_STEPS_PER_REV 200
36 | #define AXIS_2_MICROSTEPS 8
37 | #define AXIS_2_POS_MIN -120
38 | #define AXIS_2_POS_MAX 120
39 | #define AXIS_2_VEL_MAX 1000
40 | #define AXIS_2_ACC_MAX 1000
41 | #define AXIS_2_INVERT_DIRECTION false
42 |
43 | // Axis 3 uses a DRV8825 Driver, NEMA 17
44 | #define STEPPER_3_STEP 5
45 | #define STEPPER_3_DIR 19
46 | #define AXIS_3_GEARING 38.4
47 | #define AXIS_3_STEPS_PER_REV 200
48 | #define AXIS_3_MICROSTEPS 8
49 | #define AXIS_3_POS_MIN -150
50 | #define AXIS_3_POS_MAX 150
51 | #define AXIS_3_VEL_MAX 1000
52 | #define AXIS_3_ACC_MAX 1000
53 | #define AXIS_3_INVERT_DIRECTION true
54 |
55 | // Axis 4 uses a DRV8825 Driver, MINIBEA
56 | #define STEPPER_4_STEP 25
57 | #define STEPPER_4_DIR 23
58 | #define AXIS_4_GEARING 38.4
59 | #define AXIS_4_STEPS_PER_REV 48
60 | #define AXIS_4_MICROSTEPS 8
61 | #define AXIS_4_POS_MIN -120
62 | #define AXIS_4_POS_MAX 120
63 | #define AXIS_4_VEL_MAX 400
64 | #define AXIS_4_ACC_MAX 800
65 | #define AXIS_4_INVERT_DIRECTION true
66 |
67 | // Axis 5 uses a DRV8825 Driver, MINIBEA
68 | #define STEPPER_5_STEP 27
69 | #define STEPPER_5_DIR 26
70 | #define AXIS_5_GEARING 38.4
71 | #define AXIS_5_STEPS_PER_REV 48
72 | #define AXIS_5_MICROSTEPS 8
73 | #define AXIS_5_POS_MIN -120
74 | #define AXIS_5_POS_MAX 120
75 | #define AXIS_5_VEL_MAX 400
76 | #define AXIS_5_ACC_MAX 800
77 | #define AXIS_5_INVERT_DIRECTION true
78 |
79 | // Axis 6 uses a DRV8825 Driver, MINIBEA
80 | #define STEPPER_6_STEP 33
81 | #define STEPPER_6_DIR 32
82 | #define AXIS_6_GEARING 38.4
83 | #define AXIS_6_STEPS_PER_REV 48
84 | #define AXIS_6_MICROSTEPS 8
85 | #define AXIS_6_POS_MIN -175
86 | #define AXIS_6_POS_MAX 175
87 | #define AXIS_6_VEL_MAX 400
88 | #define AXIS_6_ACC_MAX 800
89 | #define AXIS_6_INVERT_DIRECTION true
90 |
91 | // define enable pin for all Axis (connected on Hardware)
92 | #define ENABLE_ALL 4
93 |
94 | // check if hardware enable switch is enabled (HIGH when ENABLE_ALL is HIGH and Switch is ON)
95 | #define HARDWARE_ENABLE 34
96 |
97 | #endif
98 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/src/OledDisplay.hpp:
--------------------------------------------------------------------------------
1 | #ifndef OledDisplay_HPP_
2 | #define OledDisplay_HPP_
3 |
4 | #include
5 | #include
6 | #include "SSD1306Wire.h"
7 |
8 | class OledDisplay {
9 | private:
10 | SSD1306Wire display;
11 |
12 | public:
13 | OledDisplay(int address = 0x3c, int sda = SDA, int scl = SCL) : display(address, sda, scl) {
14 | // Initialize the display
15 | display.init();
16 | display.flipScreenVertically();
17 | };
18 |
19 | ~OledDisplay() {}
20 |
21 | void DrawDisplay(String text) {
22 | // Clear the display
23 | display.clear();
24 |
25 | // Text
26 | display.setTextAlignment(TEXT_ALIGN_LEFT);
27 | display.setFont(ArialMT_Plain_16);
28 | display.drawString(0, 0, text);
29 |
30 | // Write buffer to the display
31 | display.display();
32 | }
33 | };
34 |
35 | #endif
36 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/src/communication/DataFormat.hpp:
--------------------------------------------------------------------------------
1 | #ifndef DATAFORMAT_HPP_
2 | #define DATAFORMAT_HPP_
3 |
4 | #include
5 | #include
6 |
7 | #ifdef __linux__
8 | #elif ESP32
9 | #endif
10 |
11 |
12 | // Error Codes
13 | enum class ErrorCode : uint8_t {
14 | noError = 0,
15 | errorA,
16 | errorB,
17 | errorC
18 | };
19 |
20 | namespace Communication {
21 |
22 | union PcToRobot_t {
23 | struct __attribute__((packed)) {
24 | uint8_t messageNumber;
25 | bool emergencyStop;
26 | uint8_t reserved[1];
27 |
28 | bool activate; // Activate robot
29 | int32_t jointSetpoints[6]; // Joint positions
30 | };
31 |
32 | uint8_t receiveBuffer[64];
33 | };// request;
34 |
35 |
36 | union RobotToPc_t {
37 | struct __attribute__((packed)) {
38 | uint8_t messageNumber;
39 | enum ErrorCode errorCode;
40 | uint8_t reserved[1];
41 |
42 | bool active; // Robot active/ not active
43 | int32_t jointPositions[6]; // Joint positions
44 |
45 | };
46 | uint8_t sendBuffer[64];
47 | };// response;
48 | }
49 |
50 | #endif
51 |
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/src/communication/WiFiConnection.hpp:
--------------------------------------------------------------------------------
1 | #ifndef COMMUNICATION__WiFiConnection_HPP_
2 | #define COMMUNICATION__WiFiConnection_HPP_
3 |
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include
12 | #include
13 |
14 |
15 | #define FORMAT_LITTLEFS_IF_FAILED true
16 |
17 |
18 | class WiFiConnection {
19 | private:
20 | WiFiServer _wifiServer;
21 | bool _enable = false;
22 | WiFiClient _client;
23 |
24 | uint64_t _t_lastMessage;
25 | bool _clientConnected = false;
26 | uint32_t _receivedMessages = 0;
27 |
28 | std::string _ssid;
29 | std::string _password;
30 | uint8_t _port;
31 | std::string _clientName;
32 |
33 | std::function _callback;
34 |
35 | void _initialize() {
36 | _wifiServer = WiFiServer(_port);
37 | _wifiServer.setNoDelay(true);
38 |
39 |
40 | IPAddress ipAddress(IP_ADDRESS);
41 | IPAddress gateway(GATEWAY_IP);
42 | IPAddress subnet(SUBNET_MASK);
43 |
44 | WiFi.config(ipAddress, gateway, subnet);
45 |
46 |
47 | Serial.println("Connecting to WiFi");
48 |
49 | WiFi.persistent(false);
50 |
51 | WiFi.hostname(_clientName.c_str());
52 | WiFi.disconnect();
53 | WiFi.begin(_ssid.c_str(), _password.c_str());
54 | WiFi.setSleep(false);
55 |
56 | esp_wifi_set_ps(WIFI_PS_NONE);
57 |
58 | while (WiFi.status() != WL_CONNECTED) {
59 | Serial.print(".");
60 | delay(1000);
61 | }
62 |
63 |
64 | Serial.println("Connected to the WiFi network");
65 | Serial.println(WiFi.localIP());
66 |
67 | _client.stop();
68 | _wifiServer.close();
69 | _wifiServer.begin();
70 | }
71 |
72 | public:
73 | WiFiConnection() {};
74 |
75 | WiFiConnection(const std::string& ssid, const std::string& password, std::function callback, uint8_t socketPort, const std::string& clientName) {
76 | _ssid = ssid;
77 | _password = password;
78 | _port = socketPort;
79 | _clientName = clientName;
80 | _callback = callback;
81 | this->_initialize();
82 | };
83 |
84 | ~WiFiConnection() {
85 | _wifiServer.close();
86 | WiFi.disconnect();
87 | };
88 |
89 | void sendBinaryData(byte * pData, size_t len) {
90 | if (_client.connected()) {
91 | _client.write(pData, len);
92 | // _client.flush();
93 | }
94 | }
95 | void sendData(String data) { if (_client.connected()) _client.write((data + "\n").c_str()); }
96 | bool clientConnected() { return _clientConnected; }
97 |
98 | void loopForever(bool enable = true) {
99 | while(true) {
100 |
101 | if (WiFi.status() != WL_CONNECTED) this->_initialize();
102 |
103 | if (!_client.connected()) _client = _wifiServer.available();
104 |
105 | if (!_enable && enable) Serial.println("Enabled WiFi");
106 | else if (_enable && !enable) Serial.println("Disabled WiFi");
107 |
108 | else if (enable) {
109 | if (_client.connected()) {
110 | if (_clientConnected == false) {
111 | Serial.println("Client has connected");
112 | _receivedMessages = 0;
113 | }
114 |
115 | byte receivedData[64];
116 | byte responseData[64];
117 |
118 | if (_client.available()) {
119 | _client.readBytes(&receivedData[0], sizeof(receivedData));
120 |
121 | if (_callback(&receivedData, sizeof(receivedData), &responseData, sizeof(responseData))) {
122 | _receivedMessages++;
123 | this->sendBinaryData(&responseData[0], sizeof(responseData));
124 | }
125 | }
126 |
127 | _clientConnected = true;
128 |
129 | } else {
130 | if (_clientConnected == true) {
131 | Serial.println("Client has disconnected");
132 | }
133 |
134 | _receivedMessages = 0;
135 | _clientConnected = false;
136 | }
137 | }
138 | _enable = enable;
139 | vTaskDelay(1);
140 | }
141 | }
142 | };
143 |
144 | #endif
--------------------------------------------------------------------------------
/diy_robotics_arm_esp32/src/main.cpp:
--------------------------------------------------------------------------------
1 |
2 | #include
3 | #include
4 | #include "SSD1306Wire.h"
5 |
6 | #include "Configuration.h"
7 | #include "communication/WiFiConnection.hpp"
8 | #include "communication/DataFormat.hpp"
9 | #include "Axis.hpp"
10 |
11 | // Initialize the display
12 | SSD1306Wire display(0x3c, SDA, SCL); // default: SCL : GPIO22; SDA: GPIO21
13 |
14 | // Calls Axis constructor of Axis.hpp and passes recommended params
15 | // look at this: Axis(int number, uint8_t stepPin, uint8_t directionPin, double gearing, int stepsPerRev, int microsteps, bool invertDirection = false)
16 | Axis axis1(1, STEPPER_1_STEP, STEPPER_1_DIR, AXIS_1_GEARING, AXIS_1_STEPS_PER_REV, AXIS_1_MICROSTEPS, AXIS_1_POS_MIN, AXIS_1_POS_MAX, AXIS_1_VEL_MAX, AXIS_1_ACC_MAX, AXIS_1_INVERT_DIRECTION);
17 | Axis axis2(2, STEPPER_2_STEP, STEPPER_2_DIR, AXIS_2_GEARING, AXIS_2_STEPS_PER_REV, AXIS_2_MICROSTEPS, AXIS_2_POS_MIN, AXIS_2_POS_MAX, AXIS_2_VEL_MAX, AXIS_2_ACC_MAX, AXIS_2_INVERT_DIRECTION);
18 | Axis axis3(3, STEPPER_3_STEP, STEPPER_3_DIR, AXIS_3_GEARING, AXIS_3_STEPS_PER_REV, AXIS_3_MICROSTEPS, AXIS_3_POS_MIN, AXIS_3_POS_MAX, AXIS_3_VEL_MAX, AXIS_3_ACC_MAX, AXIS_3_INVERT_DIRECTION);
19 | Axis axis4(4, STEPPER_4_STEP, STEPPER_4_DIR, AXIS_4_GEARING, AXIS_4_STEPS_PER_REV, AXIS_4_MICROSTEPS, AXIS_4_POS_MIN, AXIS_4_POS_MAX, AXIS_4_VEL_MAX, AXIS_4_ACC_MAX, AXIS_4_INVERT_DIRECTION);
20 | Axis axis5(5, STEPPER_5_STEP, STEPPER_5_DIR, AXIS_5_GEARING, AXIS_5_STEPS_PER_REV, AXIS_5_MICROSTEPS, AXIS_5_POS_MIN, AXIS_5_POS_MAX, AXIS_5_VEL_MAX, AXIS_5_ACC_MAX, AXIS_5_INVERT_DIRECTION);
21 | Axis axis6(6, STEPPER_6_STEP, STEPPER_6_DIR, AXIS_6_GEARING, AXIS_6_STEPS_PER_REV, AXIS_6_MICROSTEPS, AXIS_6_POS_MIN, AXIS_6_POS_MAX,AXIS_6_VEL_MAX, AXIS_6_ACC_MAX, AXIS_6_INVERT_DIRECTION);
22 |
23 | bool gEnableAxis = false; // Enable axes only when axes need to move --> otherwise off to prevent motors from overheating
24 | bool gRobotActive = false; // Robot active/not active --> comes from PC
25 |
26 | void DrawDisplay(String text)
27 | {
28 | // Clear display
29 | display.clear();
30 |
31 | // Text
32 | display.setTextAlignment(TEXT_ALIGN_LEFT);
33 | display.setFont(ArialMT_Plain_10);
34 | display.drawString(0, 0, text);
35 |
36 | // Write the buffer to the display
37 | display.display();
38 | }
39 |
40 | bool onDataReceived(void *data, size_t len, void *response, size_t responseLen)
41 | {
42 | // Check if the received data has the expected size
43 | if (len != sizeof(Communication::PcToRobot_t))
44 | {
45 | Serial.println("Error: Unexpected size of received data");
46 | return false;
47 | }
48 |
49 | // Copy the received data into the corresponding structure
50 | Communication::PcToRobot_t receivedData;
51 | memcpy(&receivedData, data, sizeof(Communication::PcToRobot_t));
52 | gRobotActive = receivedData.activate;
53 |
54 | // Response for PC --> since there is no feedback from robot hardware, the received data is simply sent back:
55 | Communication::RobotToPc_t responseData;
56 | responseData.messageNumber = receivedData.messageNumber + 1;
57 | responseData.errorCode = ErrorCode::noError;
58 | responseData.active = gRobotActive;
59 |
60 | if((gRobotActive == true)) // If robot is activated by PC
61 | {
62 | if(gEnableAxis && (digitalRead(HARDWARE_ENABLE) == LOW)) // If axes are enabled and Hardware Enable Switch is LOW --> stop robot motion
63 | {
64 | // Serial.println("Hardware Enable Switch is off. Stop Motion at actual position"); // If axes are enabled and Hardware Enable Switch is LOW --> stop robot motion
65 |
66 | // Cancel motion at current position
67 | for (auto axis : Axis::axisList)
68 | {
69 | axis->moveToPosition((axis->getPosition())); // Overwrite target position with current position if Hardware Enable Switch is turned off during motion
70 | }
71 | }
72 | else
73 | {
74 | // Check for each axis if the old and new axis position is the same up to 2 decimal places
75 | int index = 0;
76 | bool mustMove = false; // If axis position is not the same --> true
77 | for (auto axis : Axis::axisList)
78 | {
79 | double currentPosition = axis->getPosition();
80 | double targetPosition = receivedData.jointSetpoints[index] * 1e-3;
81 | if (abs(currentPosition - targetPosition) > 0.1) // If axis position is not the same --> move (axis positions are rounded to 2 decimal places)
82 | {
83 | mustMove = true;
84 | if (!gEnableAxis) // If axes are not enabled: enable axes
85 | {
86 | digitalWrite(ENABLE_ALL, HIGH);
87 | gEnableAxis = true;
88 | // Serial.println("Enable all axis");
89 | }
90 |
91 | // Check if Hardware Enable Switch is enabled
92 | if ((digitalRead(HARDWARE_ENABLE) == HIGH)) // if Soft and Hardware Enable HIGH --> move axis
93 | {
94 | // Serial.println("Soft and Hardware Enable HIGH --> move axis");
95 | axis->moveToPosition(receivedData.jointSetpoints[index]* 1e-3); // Move to new axis position
96 | }
97 |
98 | }
99 | index++;
100 | }
101 |
102 | if (!mustMove && gEnableAxis) // If axes do not need to move and axes are enabled --> disable axes
103 | {
104 | digitalWrite(ENABLE_ALL, LOW);
105 | gEnableAxis = false;
106 | // Serial.println("Disable all axis");
107 | }
108 | }
109 | }
110 |
111 | // Determine current axis positions for response
112 | int index = 0;
113 | for (auto axis : Axis::axisList)
114 | {
115 | responseData.jointPositions[index++] = axis->getPosition() * 1000; // convert back to millidegrees
116 | }
117 |
118 | // Only for debugging --> remove later
119 | /*Serial.println("Received Data:");
120 | Serial.println("Active: " + String(gRobotActive));
121 | Serial.println("Message Number: " + String(receivedData.messageNumber));
122 | Serial.println("jointSetpoints[0]: " + String(responseData.jointPositions[0]));
123 | Serial.println("jointSetpoints[1]: " + String(responseData.jointPositions[1]));
124 | Serial.println("jointSetpoints[2]: " + String(responseData.jointPositions[2]));
125 | Serial.println("jointSetpoints[3]: " + String(responseData.jointPositions[3]));
126 | Serial.println("jointSetpoints[4]: " + String(responseData.jointPositions[4]));
127 | Serial.println("jointSetpoints[5]: " + String(responseData.jointPositions[5]));*/
128 |
129 | // Display output with current data
130 | DrawDisplay("Robot activated = " + String(gRobotActive) + " \n Enabled = " + String(digitalRead(HARDWARE_ENABLE) == HIGH)+ + " \n A1 = " + String(responseData.jointPositions[0] * 1e-3)+ "; A2 = " + String(responseData.jointPositions[1] * 1e-3)+ " \n A3 = " + String(responseData.jointPositions[2] * 1e-3)+ "; A4 = " + String(responseData.jointPositions[3] * 1e-3) + " \n A5 = " + String(responseData.jointPositions[4] * 1e-3)+ "; A6 = " + String(responseData.jointPositions[5] * 1e-3));
131 |
132 | // Copy the response into the response buffer
133 | memcpy(response, &responseData, sizeof(Communication::RobotToPc_t));
134 | return true;
135 | }
136 |
137 | void networkTask(void * parameter)
138 | {
139 | delay(5e3);
140 | DrawDisplay("Connecting to WiFi");
141 | WiFiConnection connection(NETWORK_SSID, NETWORK_PASSWORD, onDataReceived, 80, "ESP32_Server_Gripper");
142 | DrawDisplay("Connected to WiFi");
143 | connection.loopForever(true);
144 | };
145 | TaskHandle_t NetworkTask;
146 |
147 | void setup()
148 | {
149 | Serial.begin(115200);
150 | Serial.println("Starting up");
151 |
152 | // Initialize the display
153 | display.init();
154 |
155 | pinMode(HARDWARE_ENABLE, INPUT); // Pin to check if hardware enable switch is on
156 |
157 | pinMode(ENABLE_ALL, OUTPUT); // Enable Drivers
158 | digitalWrite(ENABLE_ALL, LOW); // Disable all drivers
159 |
160 | // Start network task
161 | xTaskCreatePinnedToCore(networkTask, "networkTask", 4096*2, NULL, 17, &NetworkTask, 0);
162 | }
163 |
164 | void loop() {
165 | Axis::runAll(); // Poll all Axis -> see Axis.hpp file
166 | }
--------------------------------------------------------------------------------
/diy_robotics_arm_pcb/README.md:
--------------------------------------------------------------------------------
1 | # diy_robotics_arm_pcb
2 |
3 | 
4 |
5 |
6 | ① 0.96 Inch OLED Display SSD1306 (1 pcs.)
7 |
8 | ② ESP-32 (1 pcs.)
9 |
10 | ③ 2-Pin Screw Terminal 5mm (3 pcs.)
11 |
12 | ④ Pin Header 1x4 Pin Male 2,54mm (6 pcs.)
13 |
14 | ⑤ Capacitor 25V 100uF (6 pcs.)
15 |
16 | ⑥ DRV8825 Stepper Driver (6 pcs.)
17 |
18 | ⑦ 4-way DIP-Switch 2,54mm (6 pcs.)
19 |
20 | (①, ② and ⑥ are plugged into female pin header 2,54mm)
21 |
22 | 5V for the ESP32 power supply must be connected to the "VCC_ESP32" screw terminal. 24V for the servo stepper power supply must be connected to the "VCC_Stepper" (on the picture incorrectly "VCC_Servo") screw terminal. The steppers of axes 1 - 6 are connected to the pin header "Axis 1-6". An external enable switch can be connected to the "Enable" screw terminal. This allows the axes to be switched off independently of the software. If no switch is to be used, the contacts can be short-circuited.
23 |
24 | ### Schamatic
25 | 
26 |
27 |
--------------------------------------------------------------------------------
/diy_robotics_arm_pcb/diy_robotics_arm-backups/diy_robotics_arm-2024-02-12_133838.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_arm_pcb/diy_robotics_arm-backups/diy_robotics_arm-2024-02-12_133838.zip
--------------------------------------------------------------------------------
/diy_robotics_arm_pcb/diy_robotics_arm.kicad_prl:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "active_layer": 0,
4 | "active_layer_preset": "All Layers",
5 | "auto_track_width": true,
6 | "hidden_netclasses": [],
7 | "hidden_nets": [],
8 | "high_contrast_mode": 0,
9 | "net_color_mode": 1,
10 | "opacity": {
11 | "images": 0.6,
12 | "pads": 1.0,
13 | "tracks": 1.0,
14 | "vias": 1.0,
15 | "zones": 0.6
16 | },
17 | "selection_filter": {
18 | "dimensions": true,
19 | "footprints": true,
20 | "graphics": true,
21 | "keepouts": true,
22 | "lockedItems": false,
23 | "otherItems": true,
24 | "pads": true,
25 | "text": true,
26 | "tracks": true,
27 | "vias": true,
28 | "zones": true
29 | },
30 | "visible_items": [
31 | 0,
32 | 1,
33 | 2,
34 | 3,
35 | 4,
36 | 5,
37 | 8,
38 | 9,
39 | 10,
40 | 11,
41 | 12,
42 | 13,
43 | 15,
44 | 16,
45 | 17,
46 | 18,
47 | 19,
48 | 20,
49 | 21,
50 | 22,
51 | 23,
52 | 24,
53 | 25,
54 | 26,
55 | 27,
56 | 28,
57 | 29,
58 | 30,
59 | 32,
60 | 33,
61 | 34,
62 | 35,
63 | 36,
64 | 39,
65 | 40
66 | ],
67 | "visible_layers": "fffffff_ffffffff",
68 | "zone_display_mode": 0
69 | },
70 | "meta": {
71 | "filename": "diy_robotics_arm.kicad_prl",
72 | "version": 3
73 | },
74 | "project": {
75 | "files": []
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/diy_robotics_arm_pcb/diy_robotics_arm.kicad_pro:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "3dviewports": [],
4 | "design_settings": {
5 | "defaults": {
6 | "board_outline_line_width": 0.09999999999999999,
7 | "copper_line_width": 0.19999999999999998,
8 | "copper_text_italic": false,
9 | "copper_text_size_h": 1.5,
10 | "copper_text_size_v": 1.5,
11 | "copper_text_thickness": 0.3,
12 | "copper_text_upright": false,
13 | "courtyard_line_width": 0.049999999999999996,
14 | "dimension_precision": 4,
15 | "dimension_units": 3,
16 | "dimensions": {
17 | "arrow_length": 1270000,
18 | "extension_offset": 500000,
19 | "keep_text_aligned": true,
20 | "suppress_zeroes": false,
21 | "text_position": 0,
22 | "units_format": 1
23 | },
24 | "fab_line_width": 0.09999999999999999,
25 | "fab_text_italic": false,
26 | "fab_text_size_h": 1.0,
27 | "fab_text_size_v": 1.0,
28 | "fab_text_thickness": 0.15,
29 | "fab_text_upright": false,
30 | "other_line_width": 0.15,
31 | "other_text_italic": false,
32 | "other_text_size_h": 1.0,
33 | "other_text_size_v": 1.0,
34 | "other_text_thickness": 0.15,
35 | "other_text_upright": false,
36 | "pads": {
37 | "drill": 2.1,
38 | "height": 4.0,
39 | "width": 4.0
40 | },
41 | "silk_line_width": 0.15,
42 | "silk_text_italic": false,
43 | "silk_text_size_h": 1.0,
44 | "silk_text_size_v": 1.0,
45 | "silk_text_thickness": 0.15,
46 | "silk_text_upright": false,
47 | "zones": {
48 | "min_clearance": 0.5
49 | }
50 | },
51 | "diff_pair_dimensions": [
52 | {
53 | "gap": 0.0,
54 | "via_gap": 0.0,
55 | "width": 0.0
56 | }
57 | ],
58 | "drc_exclusions": [],
59 | "meta": {
60 | "version": 2
61 | },
62 | "rule_severities": {
63 | "annular_width": "error",
64 | "clearance": "error",
65 | "connection_width": "warning",
66 | "copper_edge_clearance": "error",
67 | "copper_sliver": "warning",
68 | "courtyards_overlap": "error",
69 | "diff_pair_gap_out_of_range": "error",
70 | "diff_pair_uncoupled_length_too_long": "error",
71 | "drill_out_of_range": "error",
72 | "duplicate_footprints": "warning",
73 | "extra_footprint": "warning",
74 | "footprint": "error",
75 | "footprint_type_mismatch": "ignore",
76 | "hole_clearance": "error",
77 | "hole_near_hole": "error",
78 | "invalid_outline": "error",
79 | "isolated_copper": "warning",
80 | "item_on_disabled_layer": "error",
81 | "items_not_allowed": "error",
82 | "length_out_of_range": "error",
83 | "lib_footprint_issues": "warning",
84 | "lib_footprint_mismatch": "warning",
85 | "malformed_courtyard": "error",
86 | "microvia_drill_out_of_range": "error",
87 | "missing_courtyard": "ignore",
88 | "missing_footprint": "warning",
89 | "net_conflict": "warning",
90 | "npth_inside_courtyard": "ignore",
91 | "padstack": "warning",
92 | "pth_inside_courtyard": "ignore",
93 | "shorting_items": "error",
94 | "silk_edge_clearance": "warning",
95 | "silk_over_copper": "warning",
96 | "silk_overlap": "warning",
97 | "skew_out_of_range": "error",
98 | "solder_mask_bridge": "error",
99 | "starved_thermal": "error",
100 | "text_height": "warning",
101 | "text_thickness": "warning",
102 | "through_hole_pad_without_hole": "error",
103 | "too_many_vias": "error",
104 | "track_dangling": "warning",
105 | "track_width": "error",
106 | "tracks_crossing": "error",
107 | "unconnected_items": "error",
108 | "unresolved_variable": "error",
109 | "via_dangling": "warning",
110 | "zones_intersect": "error"
111 | },
112 | "rules": {
113 | "max_error": 0.005,
114 | "min_clearance": 0.0,
115 | "min_connection": 0.0,
116 | "min_copper_edge_clearance": 0.0,
117 | "min_hole_clearance": 0.25,
118 | "min_hole_to_hole": 0.25,
119 | "min_microvia_diameter": 0.19999999999999998,
120 | "min_microvia_drill": 0.09999999999999999,
121 | "min_resolved_spokes": 2,
122 | "min_silk_clearance": 0.0,
123 | "min_text_height": 0.7999999999999999,
124 | "min_text_thickness": 0.08,
125 | "min_through_hole_diameter": 0.3,
126 | "min_track_width": 0.0,
127 | "min_via_annular_width": 0.09999999999999999,
128 | "min_via_diameter": 0.5,
129 | "solder_mask_clearance": 0.0,
130 | "solder_mask_min_width": 0.0,
131 | "solder_mask_to_copper_clearance": 0.0,
132 | "use_height_for_length_calcs": true
133 | },
134 | "teardrop_options": [
135 | {
136 | "td_allow_use_two_tracks": true,
137 | "td_curve_segcount": 5,
138 | "td_on_pad_in_zone": false,
139 | "td_onpadsmd": true,
140 | "td_onroundshapesonly": false,
141 | "td_ontrackend": false,
142 | "td_onviapad": true
143 | }
144 | ],
145 | "teardrop_parameters": [
146 | {
147 | "td_curve_segcount": 0,
148 | "td_height_ratio": 1.0,
149 | "td_length_ratio": 0.5,
150 | "td_maxheight": 2.0,
151 | "td_maxlen": 1.0,
152 | "td_target_name": "td_round_shape",
153 | "td_width_to_size_filter_ratio": 0.9
154 | },
155 | {
156 | "td_curve_segcount": 0,
157 | "td_height_ratio": 1.0,
158 | "td_length_ratio": 0.5,
159 | "td_maxheight": 2.0,
160 | "td_maxlen": 1.0,
161 | "td_target_name": "td_rect_shape",
162 | "td_width_to_size_filter_ratio": 0.9
163 | },
164 | {
165 | "td_curve_segcount": 0,
166 | "td_height_ratio": 1.0,
167 | "td_length_ratio": 0.5,
168 | "td_maxheight": 2.0,
169 | "td_maxlen": 1.0,
170 | "td_target_name": "td_track_end",
171 | "td_width_to_size_filter_ratio": 0.9
172 | }
173 | ],
174 | "track_widths": [
175 | 0.0
176 | ],
177 | "via_dimensions": [
178 | {
179 | "diameter": 0.0,
180 | "drill": 0.0
181 | }
182 | ],
183 | "zones_allow_external_fillets": false
184 | },
185 | "layer_presets": [],
186 | "viewports": []
187 | },
188 | "boards": [],
189 | "cvpcb": {
190 | "equivalence_files": []
191 | },
192 | "erc": {
193 | "erc_exclusions": [],
194 | "meta": {
195 | "version": 0
196 | },
197 | "pin_map": [
198 | [
199 | 0,
200 | 0,
201 | 0,
202 | 0,
203 | 0,
204 | 0,
205 | 1,
206 | 0,
207 | 0,
208 | 0,
209 | 0,
210 | 2
211 | ],
212 | [
213 | 0,
214 | 2,
215 | 0,
216 | 1,
217 | 0,
218 | 0,
219 | 1,
220 | 0,
221 | 2,
222 | 2,
223 | 2,
224 | 2
225 | ],
226 | [
227 | 0,
228 | 0,
229 | 0,
230 | 0,
231 | 0,
232 | 0,
233 | 1,
234 | 0,
235 | 1,
236 | 0,
237 | 1,
238 | 2
239 | ],
240 | [
241 | 0,
242 | 1,
243 | 0,
244 | 0,
245 | 0,
246 | 0,
247 | 1,
248 | 1,
249 | 2,
250 | 1,
251 | 1,
252 | 2
253 | ],
254 | [
255 | 0,
256 | 0,
257 | 0,
258 | 0,
259 | 0,
260 | 0,
261 | 1,
262 | 0,
263 | 0,
264 | 0,
265 | 0,
266 | 2
267 | ],
268 | [
269 | 0,
270 | 0,
271 | 0,
272 | 0,
273 | 0,
274 | 0,
275 | 0,
276 | 0,
277 | 0,
278 | 0,
279 | 0,
280 | 2
281 | ],
282 | [
283 | 1,
284 | 1,
285 | 1,
286 | 1,
287 | 1,
288 | 0,
289 | 1,
290 | 1,
291 | 1,
292 | 1,
293 | 1,
294 | 2
295 | ],
296 | [
297 | 0,
298 | 0,
299 | 0,
300 | 1,
301 | 0,
302 | 0,
303 | 1,
304 | 0,
305 | 0,
306 | 0,
307 | 0,
308 | 2
309 | ],
310 | [
311 | 0,
312 | 2,
313 | 1,
314 | 2,
315 | 0,
316 | 0,
317 | 1,
318 | 0,
319 | 2,
320 | 2,
321 | 2,
322 | 2
323 | ],
324 | [
325 | 0,
326 | 2,
327 | 0,
328 | 1,
329 | 0,
330 | 0,
331 | 1,
332 | 0,
333 | 2,
334 | 0,
335 | 0,
336 | 2
337 | ],
338 | [
339 | 0,
340 | 2,
341 | 1,
342 | 1,
343 | 0,
344 | 0,
345 | 1,
346 | 0,
347 | 2,
348 | 0,
349 | 0,
350 | 2
351 | ],
352 | [
353 | 2,
354 | 2,
355 | 2,
356 | 2,
357 | 2,
358 | 2,
359 | 2,
360 | 2,
361 | 2,
362 | 2,
363 | 2,
364 | 2
365 | ]
366 | ],
367 | "rule_severities": {
368 | "bus_definition_conflict": "error",
369 | "bus_entry_needed": "error",
370 | "bus_to_bus_conflict": "error",
371 | "bus_to_net_conflict": "error",
372 | "conflicting_netclasses": "error",
373 | "different_unit_footprint": "error",
374 | "different_unit_net": "error",
375 | "duplicate_reference": "error",
376 | "duplicate_sheet_names": "error",
377 | "endpoint_off_grid": "warning",
378 | "extra_units": "error",
379 | "global_label_dangling": "warning",
380 | "hier_label_mismatch": "error",
381 | "label_dangling": "error",
382 | "lib_symbol_issues": "warning",
383 | "missing_bidi_pin": "warning",
384 | "missing_input_pin": "warning",
385 | "missing_power_pin": "error",
386 | "missing_unit": "warning",
387 | "multiple_net_names": "warning",
388 | "net_not_bus_member": "warning",
389 | "no_connect_connected": "warning",
390 | "no_connect_dangling": "warning",
391 | "pin_not_connected": "error",
392 | "pin_not_driven": "error",
393 | "pin_to_pin": "warning",
394 | "power_pin_not_driven": "error",
395 | "similar_labels": "warning",
396 | "simulation_model_issue": "ignore",
397 | "unannotated": "error",
398 | "unit_value_mismatch": "error",
399 | "unresolved_variable": "error",
400 | "wire_dangling": "error"
401 | }
402 | },
403 | "libraries": {
404 | "pinned_footprint_libs": [],
405 | "pinned_symbol_libs": []
406 | },
407 | "meta": {
408 | "filename": "diy_robotics_arm.kicad_pro",
409 | "version": 1
410 | },
411 | "net_settings": {
412 | "classes": [
413 | {
414 | "bus_width": 12,
415 | "clearance": 0.2,
416 | "diff_pair_gap": 0.25,
417 | "diff_pair_via_gap": 0.25,
418 | "diff_pair_width": 0.2,
419 | "line_style": 0,
420 | "microvia_diameter": 0.3,
421 | "microvia_drill": 0.1,
422 | "name": "Default",
423 | "pcb_color": "rgba(0, 0, 0, 0.000)",
424 | "schematic_color": "rgba(0, 0, 0, 0.000)",
425 | "track_width": 0.25,
426 | "via_diameter": 0.8,
427 | "via_drill": 0.4,
428 | "wire_width": 6
429 | },
430 | {
431 | "bus_width": 12,
432 | "clearance": 0.2,
433 | "diff_pair_gap": 0.25,
434 | "diff_pair_via_gap": 0.25,
435 | "diff_pair_width": 0.2,
436 | "line_style": 0,
437 | "microvia_diameter": 0.3,
438 | "microvia_drill": 0.1,
439 | "name": "Power24V",
440 | "pcb_color": "rgba(0, 0, 0, 0.000)",
441 | "schematic_color": "rgba(0, 0, 0, 0.000)",
442 | "track_width": 1.5,
443 | "via_diameter": 0.8,
444 | "via_drill": 0.4,
445 | "wire_width": 6
446 | },
447 | {
448 | "bus_width": 12,
449 | "clearance": 0.2,
450 | "diff_pair_gap": 0.25,
451 | "diff_pair_via_gap": 0.25,
452 | "diff_pair_width": 0.2,
453 | "line_style": 0,
454 | "microvia_diameter": 0.3,
455 | "microvia_drill": 0.1,
456 | "name": "Power5V",
457 | "pcb_color": "rgba(0, 0, 0, 0.000)",
458 | "schematic_color": "rgba(0, 0, 0, 0.000)",
459 | "track_width": 1.0,
460 | "via_diameter": 0.8,
461 | "via_drill": 0.4,
462 | "wire_width": 6
463 | },
464 | {
465 | "bus_width": 12,
466 | "clearance": 0.2,
467 | "diff_pair_gap": 0.25,
468 | "diff_pair_via_gap": 0.25,
469 | "diff_pair_width": 0.2,
470 | "line_style": 0,
471 | "microvia_diameter": 0.3,
472 | "microvia_drill": 0.1,
473 | "name": "Stepper",
474 | "pcb_color": "rgba(0, 0, 0, 0.000)",
475 | "schematic_color": "rgba(0, 0, 0, 0.000)",
476 | "track_width": 1.0,
477 | "via_diameter": 0.8,
478 | "via_drill": 0.4,
479 | "wire_width": 6
480 | }
481 | ],
482 | "meta": {
483 | "version": 3
484 | },
485 | "net_colors": null,
486 | "netclass_assignments": {
487 | "/24V": "Power24V",
488 | "/5V": "Power5V",
489 | "/black1": "Stepper",
490 | "/black2": "Stepper",
491 | "/black3": "Stepper",
492 | "/black4": "Stepper",
493 | "/black5": "Stepper",
494 | "/black6": "Stepper",
495 | "/blue1": "Stepper",
496 | "/blue2": "Stepper",
497 | "/blue3": "Stepper",
498 | "/blue4": "Stepper",
499 | "/blue5": "Stepper",
500 | "/blue6": "Stepper",
501 | "/green1": "Stepper",
502 | "/green2": "Stepper",
503 | "/green3": "Stepper",
504 | "/green4": "Stepper",
505 | "/green5": "Stepper",
506 | "/green6": "Stepper",
507 | "/red1": "Stepper",
508 | "/red2": "Stepper",
509 | "/red3": "Stepper",
510 | "/red4": "Stepper",
511 | "/red5": "Stepper",
512 | "/red6": "Stepper"
513 | },
514 | "netclass_patterns": [
515 | {
516 | "netclass": "Power24V",
517 | "pattern": "GND_ESP32"
518 | },
519 | {
520 | "netclass": "Stepper",
521 | "pattern": "/green"
522 | },
523 | {
524 | "netclass": "Stepper",
525 | "pattern": "/black"
526 | },
527 | {
528 | "netclass": "Stepper",
529 | "pattern": "/red"
530 | },
531 | {
532 | "netclass": "Stepper",
533 | "pattern": "/blue"
534 | },
535 | {
536 | "netclass": "Power24V",
537 | "pattern": "/24V"
538 | }
539 | ]
540 | },
541 | "pcbnew": {
542 | "last_paths": {
543 | "gencad": "",
544 | "idf": "",
545 | "netlist": "",
546 | "specctra_dsn": "",
547 | "step": "",
548 | "vrml": ""
549 | },
550 | "page_layout_descr_file": ""
551 | },
552 | "schematic": {
553 | "annotate_start_num": 0,
554 | "drawing": {
555 | "dashed_lines_dash_length_ratio": 12.0,
556 | "dashed_lines_gap_length_ratio": 3.0,
557 | "default_line_thickness": 6.0,
558 | "default_text_size": 50.0,
559 | "field_names": [],
560 | "intersheets_ref_own_page": false,
561 | "intersheets_ref_prefix": "",
562 | "intersheets_ref_short": false,
563 | "intersheets_ref_show": false,
564 | "intersheets_ref_suffix": "",
565 | "junction_size_choice": 3,
566 | "label_size_ratio": 0.375,
567 | "pin_symbol_size": 25.0,
568 | "text_offset_ratio": 0.15
569 | },
570 | "legacy_lib_dir": "",
571 | "legacy_lib_list": [],
572 | "meta": {
573 | "version": 1
574 | },
575 | "net_format_name": "",
576 | "page_layout_descr_file": "",
577 | "plot_directory": "",
578 | "spice_current_sheet_as_root": false,
579 | "spice_external_command": "spice \"%I\"",
580 | "spice_model_current_sheet_as_root": true,
581 | "spice_save_all_currents": false,
582 | "spice_save_all_voltages": false,
583 | "subpart_first_id": 65,
584 | "subpart_id_separator": 0
585 | },
586 | "sheets": [
587 | [
588 | "fb80361b-bbed-469d-a422-8d17a3d00537",
589 | ""
590 | ]
591 | ],
592 | "text_variables": {}
593 | }
594 |
--------------------------------------------------------------------------------
/diy_robotics_arm_pcb/diy_robotics_arm.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_arm_pcb/diy_robotics_arm.zip
--------------------------------------------------------------------------------
/diy_robotics_arm_pcb/fp-info-cache:
--------------------------------------------------------------------------------
1 | 0
2 |
--------------------------------------------------------------------------------
/diy_robotics_arm_pcb/images/pcb_arm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_arm_pcb/images/pcb_arm.png
--------------------------------------------------------------------------------
/diy_robotics_arm_pcb/images/schematic_arm.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_arm_pcb/images/schematic_arm.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/CONCEPT.md:
--------------------------------------------------------------------------------
1 | # Drive Concept
2 | ## Power limitation
3 |
4 | After the gripper got assembled the first time, the powering servo motors quickly overheated and stopped functioning during the first tests. Because the servo can not reach the programmed closing position due to the object blocking further move-ment of the gripper jaws, the servo motor switches to stall operation mode. This cau-ses the servo motor to stall, putting it under maximum stress and leads to its breakdown.
5 | To counteract this, it was decided to use "continuous drive" servos. These servo types do not move to a set angle like the standard models. Instead, the length of the "HIGH" level control signal is set in the code by a value in microseconds. This is then mapped to an equivalent power level of the motor, making it possible to operate the motor at a fraction of its maximum power to prevent it from overloading and crashing. As these servos do not differ externally from the standard version, the drive can be replaced without having to adapt the assembly.
6 |
7 | ## Testing
8 |
9 | When testing the gripper with limited power, the servo withstood approx. 30 % of the maxiumum power for a longer period of time, before breaking down with a higher setting. This setting enables the gripper to close with a force of 6.5 N, which is enough to lift small objects. However, the pinion mounted on the servo's electric mo-tor slipped off the drive shaft several times, which was a major cause of failure, apart from overheating. In hope to get a more realiable solution, there were some more servos of different manufacturers ordered to test them. Therefor they got mounted into a test bar with stop collars to simulate the gripper getting blocked by an object. This simplification oft the servos load when driving the gripper allows to test all servos simultaneously and to wear down only one servo of each kind.
10 |
11 | 
12 |
13 | Servo 0 is the one ordered at the beginning, on which the pinion has come loose. It has plastic gears. Servo 3 is another servo with plastic gearing from a different ma-nufacturer and servos 1 and 2 are servos from different manufacturers with metal gearing.
14 | The closing time is set to 10 s and the opening time is 1 s, whereby the load on the motors is increased by 10% after each test run. A test run is evaluated as passed after 500 cycles (approx. 1.5 h).
15 |
16 | ## Result
17 |
18 | Servo 1 fails after about 100 cycles at 30% power. Servo 0 and Servo 3 fail in the following run at 40% power after about 65 and 140 cycles respectively. Finally, servo 2 fails after about 70 cycles at 50% power. As the servos have different maximum torques, the closing force that the gripper can apply with the respective servomotors installed is now measured when the servomotors are operated within the permissible range (10% below failure).
19 |
20 | Measurements:
21 |
22 | Servo 0: 6.57 N
23 |
24 | Servo 1: 5.18 N
25 |
26 | Servo 2: 6.44 N
27 |
28 | Servo 3: 5.36 N
29 |
30 | Servo 0 offers the best performance with a closing force of 6.57 N. However, due to the loosening gear, the reliability of this servo is rated as insufficient, so the servo with the next highest closing force is selected. Servo 2 has a closing force of 6.44 N, just below that of servo 0. It also has a metal gear, which should give it a longer life
31 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/FinRay_finger_parallel.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/FinRay_finger_parallel.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/README.md:
--------------------------------------------------------------------------------
1 | # Assembly Instructions
2 |
3 | ## 1. get parts
4 | 
5 |
6 |
7 | ① "mounting_adapter" (1 pcs.) -> ->Umbenennung zu "housing"
8 |
9 | ② "laufschiene" (1 pcs.) ->Umbenennung zu "slide rail"
10 |
11 | ③ "rack" (2 pcs.)
12 |
13 | ④ "rack_spacer" (2 pcs.)
14 |
15 | ⑤ "gegenstueck_rack" (2 pcs.) ->Umbenennung zu "jaw holder"
16 |
17 | ⑥ "gear_16_teeth" (2 pcs.)
18 |
19 | ⑦ "finger_50mm" (2 pcs.)
20 |
21 | ⑧ Foam rubber strips (2 pcs.)
22 |
23 | ⑨ Servo-Motors SG90 continuous drive (2 pcs.)
24 |
25 | ⑩ Servo screw for drive socket (2 pcs.)
26 |
27 | ⑪ Servo fastening screw (2 pcs.)
28 |
29 | ⑫ Countersunk head screw M3x8 (4 pcs.)
30 |
31 | ⑬ Screw countersunk head M3x12 (8 pcs.)
32 |
33 |
34 |
35 |
36 |
37 | ## 2. prepare parts
38 | 1. remove support structures
39 | 2. cover the gripper jaws with foam rubber
40 |
41 | 
42 |
43 | ## 3. install servo mounts
44 | NOTE: Due to limited accessibility when the housing is fitted, the drive unit must be assembled beforehand.
45 | 1. rough-turn threads in gear racks
46 | 3. screw "gegenstueck_rack" for the gripper jaws to the racks. (Use 4x screw ⑬). Screw in the spacers in the orientation shown.
47 |
48 | 
49 |
50 |
51 |
52 | ## 4. mount servos
53 | 1. place the gear on the drive socket of the servo and secure with screw ⑩
54 | 2. mount the servos with two fastening screws (⑪) each
55 |
56 | 
57 |
58 | ## 5. mount gripper jaws
59 | Screw the gripper jaws to the holder (Use 4x screw ⑬).
60 |
61 | 
62 |
63 | ## 6. mount housing
64 | Screw the gripper jaws to the holder (Use 4x screw ⑫).
65 | When routing the cable, ensure that it does not get into the gears.
66 |
67 | 
68 | 
69 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/finger_50mm.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/finger_50mm.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/flange.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/flange.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/gear_16_teeth.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/gear_16_teeth.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/gegenstueck_rack.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/gegenstueck_rack.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/gegenstueck_rack.stp:
--------------------------------------------------------------------------------
1 | ISO-10303-21;
2 | HEADER;
3 | FILE_DESCRIPTION((''),'2;1');
4 | FILE_NAME('GEGENSTUECK_RACK','2024-02-12T12:57:30',('Mathias'),(''),
5 | 'CREO PARAMETRIC BY PTC INC, 2021404','CREO PARAMETRIC BY PTC INC, 2021404','');
6 | FILE_SCHEMA(('CONFIG_CONTROL_DESIGN'));
7 | ENDSEC;
8 | DATA;
9 | #2=DIRECTION('',(0.E0,1.E0,0.E0));
10 | #3=VECTOR('',#2,5.E0);
11 | #4=CARTESIAN_POINT('',(2.05E1,-1.1E1,-5.6E0));
12 | #5=LINE('',#4,#3);
13 | #6=DIRECTION('',(0.E0,-1.E0,0.E0));
14 | #7=VECTOR('',#6,5.E0);
15 | #8=CARTESIAN_POINT('',(2.05E1,-6.E0,-2.4E0));
16 | #9=LINE('',#8,#7);
17 | #10=DIRECTION('',(0.E0,0.E0,1.E0));
18 | #11=VECTOR('',#10,1.2E1);
19 | #12=CARTESIAN_POINT('',(3.1E1,-1.1E1,-7.E0));
20 | #13=LINE('',#12,#11);
21 | #14=DIRECTION('',(1.E0,0.E0,0.E0));
22 | #15=VECTOR('',#14,1.35E1);
23 | #16=CARTESIAN_POINT('',(1.75E1,-1.1E1,-7.E0));
24 | #17=LINE('',#16,#15);
25 | #18=CARTESIAN_POINT('',(2.05E1,-1.1E1,-4.E0));
26 | #19=DIRECTION('',(0.E0,1.E0,0.E0));
27 | #20=DIRECTION('',(0.E0,0.E0,1.E0));
28 | #21=AXIS2_PLACEMENT_3D('',#18,#19,#20);
29 | #23=CARTESIAN_POINT('',(2.05E1,-1.1E1,-4.E0));
30 | #24=DIRECTION('',(0.E0,1.E0,0.E0));
31 | #25=DIRECTION('',(0.E0,0.E0,-1.E0));
32 | #26=AXIS2_PLACEMENT_3D('',#23,#24,#25);
33 | #28=CARTESIAN_POINT('',(2.8E1,-1.1E1,-4.E0));
34 | #29=DIRECTION('',(0.E0,1.E0,0.E0));
35 | #30=DIRECTION('',(0.E0,0.E0,1.E0));
36 | #31=AXIS2_PLACEMENT_3D('',#28,#29,#30);
37 | #33=CARTESIAN_POINT('',(2.8E1,-1.1E1,-4.E0));
38 | #34=DIRECTION('',(0.E0,1.E0,0.E0));
39 | #35=DIRECTION('',(0.E0,0.E0,-1.E0));
40 | #36=AXIS2_PLACEMENT_3D('',#33,#34,#35);
41 | #38=DIRECTION('',(0.E0,0.E0,1.E0));
42 | #39=VECTOR('',#38,7.E0);
43 | #40=CARTESIAN_POINT('',(3.1E1,-6.E0,-7.E0));
44 | #41=LINE('',#40,#39);
45 | #42=DIRECTION('',(0.E0,1.E0,0.E0));
46 | #43=VECTOR('',#42,5.E0);
47 | #44=CARTESIAN_POINT('',(3.1E1,-1.1E1,-7.E0));
48 | #45=LINE('',#44,#43);
49 | #46=DIRECTION('',(0.E0,0.E0,-1.E0));
50 | #47=VECTOR('',#46,5.E0);
51 | #48=CARTESIAN_POINT('',(3.1E1,0.E0,5.E0));
52 | #49=LINE('',#48,#47);
53 | #50=DIRECTION('',(0.E0,0.E0,1.E0));
54 | #51=VECTOR('',#50,5.E0);
55 | #52=CARTESIAN_POINT('',(2.5E1,6.E0,0.E0));
56 | #53=LINE('',#52,#51);
57 | #54=CARTESIAN_POINT('',(2.5E1,0.E0,5.E0));
58 | #55=DIRECTION('',(0.E0,0.E0,1.E0));
59 | #56=DIRECTION('',(1.E0,0.E0,0.E0));
60 | #57=AXIS2_PLACEMENT_3D('',#54,#55,#56);
61 | #59=DIRECTION('',(0.E0,1.E0,0.E0));
62 | #60=VECTOR('',#59,1.1E1);
63 | #61=CARTESIAN_POINT('',(3.1E1,-1.1E1,5.E0));
64 | #62=LINE('',#61,#60);
65 | #63=DIRECTION('',(1.E0,0.E0,0.E0));
66 | #64=VECTOR('',#63,1.35E1);
67 | #65=CARTESIAN_POINT('',(1.75E1,-1.1E1,5.E0));
68 | #66=LINE('',#65,#64);
69 | #67=CARTESIAN_POINT('',(0.E0,0.E0,5.E0));
70 | #68=DIRECTION('',(0.E0,0.E0,1.E0));
71 | #69=DIRECTION('',(0.E0,1.E0,0.E0));
72 | #70=AXIS2_PLACEMENT_3D('',#67,#68,#69);
73 | #72=CARTESIAN_POINT('',(2.5E1,0.E0,5.E0));
74 | #73=DIRECTION('',(0.E0,0.E0,-1.E0));
75 | #74=DIRECTION('',(1.E0,0.E0,0.E0));
76 | #75=AXIS2_PLACEMENT_3D('',#72,#73,#74);
77 | #77=CARTESIAN_POINT('',(2.5E1,0.E0,5.E0));
78 | #78=DIRECTION('',(0.E0,0.E0,-1.E0));
79 | #79=DIRECTION('',(-1.E0,0.E0,0.E0));
80 | #80=AXIS2_PLACEMENT_3D('',#77,#78,#79);
81 | #82=CARTESIAN_POINT('',(0.E0,0.E0,5.E0));
82 | #83=DIRECTION('',(0.E0,0.E0,-1.E0));
83 | #84=DIRECTION('',(1.E0,0.E0,0.E0));
84 | #85=AXIS2_PLACEMENT_3D('',#82,#83,#84);
85 | #87=CARTESIAN_POINT('',(0.E0,0.E0,5.E0));
86 | #88=DIRECTION('',(0.E0,0.E0,-1.E0));
87 | #89=DIRECTION('',(-1.E0,0.E0,0.E0));
88 | #90=AXIS2_PLACEMENT_3D('',#87,#88,#89);
89 | #92=DIRECTION('',(1.E0,0.E0,0.E0));
90 | #93=VECTOR('',#92,2.5E1);
91 | #94=CARTESIAN_POINT('',(0.E0,6.E0,5.E0));
92 | #95=LINE('',#94,#93);
93 | #96=DIRECTION('',(0.E0,-1.E0,0.E0));
94 | #97=VECTOR('',#96,6.E0);
95 | #98=CARTESIAN_POINT('',(3.1E1,0.E0,0.E0));
96 | #99=LINE('',#98,#97);
97 | #100=CARTESIAN_POINT('',(2.5E1,0.E0,0.E0));
98 | #101=DIRECTION('',(0.E0,0.E0,-1.E0));
99 | #102=DIRECTION('',(0.E0,1.E0,0.E0));
100 | #103=AXIS2_PLACEMENT_3D('',#100,#101,#102);
101 | #105=DIRECTION('',(1.E0,0.E0,0.E0));
102 | #106=VECTOR('',#105,2.5E1);
103 | #107=CARTESIAN_POINT('',(0.E0,6.E0,0.E0));
104 | #108=LINE('',#107,#106);
105 | #109=CARTESIAN_POINT('',(0.E0,0.E0,0.E0));
106 | #110=DIRECTION('',(0.E0,0.E0,-1.E0));
107 | #111=DIRECTION('',(0.E0,-1.E0,0.E0));
108 | #112=AXIS2_PLACEMENT_3D('',#109,#110,#111);
109 | #114=DIRECTION('',(-1.E0,0.E0,0.E0));
110 | #115=VECTOR('',#114,1.75E1);
111 | #116=CARTESIAN_POINT('',(1.75E1,-6.E0,0.E0));
112 | #117=LINE('',#116,#115);
113 | #118=CARTESIAN_POINT('',(2.5E1,0.E0,0.E0));
114 | #119=DIRECTION('',(0.E0,0.E0,1.E0));
115 | #120=DIRECTION('',(1.E0,0.E0,0.E0));
116 | #121=AXIS2_PLACEMENT_3D('',#118,#119,#120);
117 | #123=CARTESIAN_POINT('',(2.5E1,0.E0,0.E0));
118 | #124=DIRECTION('',(0.E0,0.E0,1.E0));
119 | #125=DIRECTION('',(-1.E0,0.E0,0.E0));
120 | #126=AXIS2_PLACEMENT_3D('',#123,#124,#125);
121 | #128=CARTESIAN_POINT('',(0.E0,0.E0,0.E0));
122 | #129=DIRECTION('',(0.E0,0.E0,1.E0));
123 | #130=DIRECTION('',(1.E0,0.E0,0.E0));
124 | #131=AXIS2_PLACEMENT_3D('',#128,#129,#130);
125 | #133=CARTESIAN_POINT('',(0.E0,0.E0,0.E0));
126 | #134=DIRECTION('',(0.E0,0.E0,1.E0));
127 | #135=DIRECTION('',(-1.E0,0.E0,0.E0));
128 | #136=AXIS2_PLACEMENT_3D('',#133,#134,#135);
129 | #138=DIRECTION('',(1.E0,0.E0,0.E0));
130 | #139=VECTOR('',#138,1.35E1);
131 | #140=CARTESIAN_POINT('',(1.75E1,-6.E0,0.E0));
132 | #141=LINE('',#140,#139);
133 | #142=DIRECTION('',(0.E0,0.E0,1.E0));
134 | #143=VECTOR('',#142,7.E0);
135 | #144=CARTESIAN_POINT('',(1.75E1,-6.E0,-7.E0));
136 | #145=LINE('',#144,#143);
137 | #146=DIRECTION('',(-1.E0,0.E0,0.E0));
138 | #147=VECTOR('',#146,1.35E1);
139 | #148=CARTESIAN_POINT('',(3.1E1,-6.E0,-7.E0));
140 | #149=LINE('',#148,#147);
141 | #150=CARTESIAN_POINT('',(2.05E1,-6.E0,-4.E0));
142 | #151=DIRECTION('',(0.E0,-1.E0,0.E0));
143 | #152=DIRECTION('',(0.E0,0.E0,1.E0));
144 | #153=AXIS2_PLACEMENT_3D('',#150,#151,#152);
145 | #155=CARTESIAN_POINT('',(2.05E1,-6.E0,-4.E0));
146 | #156=DIRECTION('',(0.E0,-1.E0,0.E0));
147 | #157=DIRECTION('',(0.E0,0.E0,-1.E0));
148 | #158=AXIS2_PLACEMENT_3D('',#155,#156,#157);
149 | #160=CARTESIAN_POINT('',(2.8E1,-6.E0,-4.E0));
150 | #161=DIRECTION('',(0.E0,-1.E0,0.E0));
151 | #162=DIRECTION('',(0.E0,0.E0,1.E0));
152 | #163=AXIS2_PLACEMENT_3D('',#160,#161,#162);
153 | #165=CARTESIAN_POINT('',(2.8E1,-6.E0,-4.E0));
154 | #166=DIRECTION('',(0.E0,-1.E0,0.E0));
155 | #167=DIRECTION('',(0.E0,0.E0,-1.E0));
156 | #168=AXIS2_PLACEMENT_3D('',#165,#166,#167);
157 | #170=DIRECTION('',(0.E0,0.E0,-1.E0));
158 | #171=VECTOR('',#170,5.E0);
159 | #172=CARTESIAN_POINT('',(1.75E1,-6.E0,5.E0));
160 | #173=LINE('',#172,#171);
161 | #174=DIRECTION('',(0.E0,1.E0,0.E0));
162 | #175=VECTOR('',#174,5.E0);
163 | #176=CARTESIAN_POINT('',(1.75E1,-1.1E1,5.E0));
164 | #177=LINE('',#176,#175);
165 | #178=DIRECTION('',(0.E0,0.E0,1.E0));
166 | #179=VECTOR('',#178,1.2E1);
167 | #180=CARTESIAN_POINT('',(1.75E1,-1.1E1,-7.E0));
168 | #181=LINE('',#180,#179);
169 | #182=DIRECTION('',(0.E0,-1.E0,0.E0));
170 | #183=VECTOR('',#182,5.E0);
171 | #184=CARTESIAN_POINT('',(1.75E1,-6.E0,-7.E0));
172 | #185=LINE('',#184,#183);
173 | #186=DIRECTION('',(-1.E0,0.E0,0.E0));
174 | #187=VECTOR('',#186,1.75E1);
175 | #188=CARTESIAN_POINT('',(1.75E1,-6.E0,5.E0));
176 | #189=LINE('',#188,#187);
177 | #190=DIRECTION('',(0.E0,0.E0,-1.E0));
178 | #191=VECTOR('',#190,5.E0);
179 | #192=CARTESIAN_POINT('',(0.E0,6.E0,5.E0));
180 | #193=LINE('',#192,#191);
181 | #194=DIRECTION('',(0.E0,0.E0,1.E0));
182 | #195=VECTOR('',#194,5.E0);
183 | #196=CARTESIAN_POINT('',(0.E0,-6.E0,0.E0));
184 | #197=LINE('',#196,#195);
185 | #198=DIRECTION('',(0.E0,1.E0,0.E0));
186 | #199=VECTOR('',#198,5.E0);
187 | #200=CARTESIAN_POINT('',(2.8E1,-1.1E1,-5.6E0));
188 | #201=LINE('',#200,#199);
189 | #202=DIRECTION('',(0.E0,-1.E0,0.E0));
190 | #203=VECTOR('',#202,5.E0);
191 | #204=CARTESIAN_POINT('',(2.8E1,-6.E0,-2.4E0));
192 | #205=LINE('',#204,#203);
193 | #206=CARTESIAN_POINT('',(2.5E1,0.E0,1.45E0));
194 | #207=DIRECTION('',(0.E0,0.E0,-1.E0));
195 | #208=DIRECTION('',(-1.E0,0.E0,0.E0));
196 | #209=AXIS2_PLACEMENT_3D('',#206,#207,#208);
197 | #211=DIRECTION('',(-7.071067811865E-1,0.E0,7.071067811865E-1));
198 | #212=VECTOR('',#211,2.050609665441E0);
199 | #213=CARTESIAN_POINT('',(2.815E1,0.E0,0.E0));
200 | #214=LINE('',#213,#212);
201 | #215=DIRECTION('',(-7.071067811865E-1,0.E0,-7.071067811865E-1));
202 | #216=VECTOR('',#215,2.050609665441E0);
203 | #217=CARTESIAN_POINT('',(2.33E1,0.E0,1.45E0));
204 | #218=LINE('',#217,#216);
205 | #219=DIRECTION('',(0.E0,0.E0,1.E0));
206 | #220=VECTOR('',#219,3.55E0);
207 | #221=CARTESIAN_POINT('',(2.33E1,0.E0,1.45E0));
208 | #222=LINE('',#221,#220);
209 | #223=DIRECTION('',(0.E0,0.E0,-1.E0));
210 | #224=VECTOR('',#223,3.55E0);
211 | #225=CARTESIAN_POINT('',(2.67E1,0.E0,5.E0));
212 | #226=LINE('',#225,#224);
213 | #227=CARTESIAN_POINT('',(2.5E1,0.E0,1.45E0));
214 | #228=DIRECTION('',(0.E0,0.E0,-1.E0));
215 | #229=DIRECTION('',(1.E0,0.E0,0.E0));
216 | #230=AXIS2_PLACEMENT_3D('',#227,#228,#229);
217 | #232=CARTESIAN_POINT('',(0.E0,0.E0,1.45E0));
218 | #233=DIRECTION('',(0.E0,0.E0,-1.E0));
219 | #234=DIRECTION('',(-1.E0,0.E0,0.E0));
220 | #235=AXIS2_PLACEMENT_3D('',#232,#233,#234);
221 | #237=DIRECTION('',(-7.071067811865E-1,0.E0,7.071067811865E-1));
222 | #238=VECTOR('',#237,2.050609665441E0);
223 | #239=CARTESIAN_POINT('',(3.15E0,0.E0,0.E0));
224 | #240=LINE('',#239,#238);
225 | #241=DIRECTION('',(-7.071067811865E-1,0.E0,-7.071067811865E-1));
226 | #242=VECTOR('',#241,2.050609665441E0);
227 | #243=CARTESIAN_POINT('',(-1.7E0,0.E0,1.45E0));
228 | #244=LINE('',#243,#242);
229 | #245=DIRECTION('',(0.E0,0.E0,1.E0));
230 | #246=VECTOR('',#245,3.55E0);
231 | #247=CARTESIAN_POINT('',(-1.7E0,0.E0,1.45E0));
232 | #248=LINE('',#247,#246);
233 | #249=DIRECTION('',(0.E0,0.E0,-1.E0));
234 | #250=VECTOR('',#249,3.55E0);
235 | #251=CARTESIAN_POINT('',(1.7E0,0.E0,5.E0));
236 | #252=LINE('',#251,#250);
237 | #253=CARTESIAN_POINT('',(0.E0,0.E0,1.45E0));
238 | #254=DIRECTION('',(0.E0,0.E0,-1.E0));
239 | #255=DIRECTION('',(1.E0,0.E0,0.E0));
240 | #256=AXIS2_PLACEMENT_3D('',#253,#254,#255);
241 | #258=CARTESIAN_POINT('',(1.75E1,-6.E0,0.E0));
242 | #259=CARTESIAN_POINT('',(3.1E1,-6.E0,0.E0));
243 | #260=VERTEX_POINT('',#258);
244 | #261=VERTEX_POINT('',#259);
245 | #262=CARTESIAN_POINT('',(3.1E1,-6.E0,-7.E0));
246 | #263=VERTEX_POINT('',#262);
247 | #264=CARTESIAN_POINT('',(1.75E1,-6.E0,-7.E0));
248 | #265=VERTEX_POINT('',#264);
249 | #266=CARTESIAN_POINT('',(3.1E1,-1.1E1,-7.E0));
250 | #267=VERTEX_POINT('',#266);
251 | #268=CARTESIAN_POINT('',(1.75E1,-1.1E1,-7.E0));
252 | #269=VERTEX_POINT('',#268);
253 | #270=CARTESIAN_POINT('',(3.1E1,-1.1E1,5.E0));
254 | #271=VERTEX_POINT('',#270);
255 | #272=CARTESIAN_POINT('',(1.75E1,-1.1E1,5.E0));
256 | #273=VERTEX_POINT('',#272);
257 | #274=CARTESIAN_POINT('',(3.1E1,0.E0,5.E0));
258 | #275=CARTESIAN_POINT('',(3.1E1,0.E0,0.E0));
259 | #276=VERTEX_POINT('',#274);
260 | #277=VERTEX_POINT('',#275);
261 | #278=CARTESIAN_POINT('',(1.75E1,-6.E0,5.E0));
262 | #279=VERTEX_POINT('',#278);
263 | #280=CARTESIAN_POINT('',(0.E0,-6.E0,5.E0));
264 | #281=VERTEX_POINT('',#280);
265 | #282=CARTESIAN_POINT('',(0.E0,-6.E0,0.E0));
266 | #283=VERTEX_POINT('',#282);
267 | #284=CARTESIAN_POINT('',(0.E0,6.E0,5.E0));
268 | #285=CARTESIAN_POINT('',(2.5E1,6.E0,5.E0));
269 | #286=VERTEX_POINT('',#284);
270 | #287=VERTEX_POINT('',#285);
271 | #288=CARTESIAN_POINT('',(0.E0,6.E0,0.E0));
272 | #289=CARTESIAN_POINT('',(2.5E1,6.E0,0.E0));
273 | #290=VERTEX_POINT('',#288);
274 | #291=VERTEX_POINT('',#289);
275 | #292=CARTESIAN_POINT('',(2.05E1,-1.1E1,-5.6E0));
276 | #293=CARTESIAN_POINT('',(2.05E1,-6.E0,-5.6E0));
277 | #294=VERTEX_POINT('',#292);
278 | #295=VERTEX_POINT('',#293);
279 | #296=CARTESIAN_POINT('',(2.05E1,-1.1E1,-2.4E0));
280 | #297=VERTEX_POINT('',#296);
281 | #298=CARTESIAN_POINT('',(2.05E1,-6.E0,-2.4E0));
282 | #299=VERTEX_POINT('',#298);
283 | #300=CARTESIAN_POINT('',(2.8E1,-1.1E1,-5.6E0));
284 | #301=CARTESIAN_POINT('',(2.8E1,-6.E0,-5.6E0));
285 | #302=VERTEX_POINT('',#300);
286 | #303=VERTEX_POINT('',#301);
287 | #304=CARTESIAN_POINT('',(2.8E1,-1.1E1,-2.4E0));
288 | #305=VERTEX_POINT('',#304);
289 | #306=CARTESIAN_POINT('',(2.8E1,-6.E0,-2.4E0));
290 | #307=VERTEX_POINT('',#306);
291 | #308=CARTESIAN_POINT('',(2.33E1,0.E0,1.45E0));
292 | #309=CARTESIAN_POINT('',(2.185E1,0.E0,0.E0));
293 | #310=VERTEX_POINT('',#308);
294 | #311=VERTEX_POINT('',#309);
295 | #312=CARTESIAN_POINT('',(2.815E1,0.E0,0.E0));
296 | #313=VERTEX_POINT('',#312);
297 | #314=CARTESIAN_POINT('',(2.67E1,0.E0,1.45E0));
298 | #315=VERTEX_POINT('',#314);
299 | #316=CARTESIAN_POINT('',(2.33E1,0.E0,5.E0));
300 | #317=VERTEX_POINT('',#316);
301 | #318=CARTESIAN_POINT('',(2.67E1,0.E0,5.E0));
302 | #319=VERTEX_POINT('',#318);
303 | #320=CARTESIAN_POINT('',(-1.7E0,0.E0,1.45E0));
304 | #321=CARTESIAN_POINT('',(-3.15E0,0.E0,0.E0));
305 | #322=VERTEX_POINT('',#320);
306 | #323=VERTEX_POINT('',#321);
307 | #324=CARTESIAN_POINT('',(3.15E0,0.E0,0.E0));
308 | #325=VERTEX_POINT('',#324);
309 | #326=CARTESIAN_POINT('',(1.7E0,0.E0,1.45E0));
310 | #327=VERTEX_POINT('',#326);
311 | #328=CARTESIAN_POINT('',(-1.7E0,0.E0,5.E0));
312 | #329=VERTEX_POINT('',#328);
313 | #330=CARTESIAN_POINT('',(1.7E0,0.E0,5.E0));
314 | #331=VERTEX_POINT('',#330);
315 | #332=CARTESIAN_POINT('',(2.05E1,-1.65E0,-4.E0));
316 | #333=DIRECTION('',(0.E0,1.E0,0.E0));
317 | #334=DIRECTION('',(0.E0,0.E0,-1.E0));
318 | #335=AXIS2_PLACEMENT_3D('',#332,#333,#334);
319 | #336=CYLINDRICAL_SURFACE('',#335,1.6E0);
320 | #338=ORIENTED_EDGE('',*,*,#337,.T.);
321 | #340=ORIENTED_EDGE('',*,*,#339,.T.);
322 | #342=ORIENTED_EDGE('',*,*,#341,.T.);
323 | #344=ORIENTED_EDGE('',*,*,#343,.T.);
324 | #345=EDGE_LOOP('',(#338,#340,#342,#344));
325 | #346=FACE_OUTER_BOUND('',#345,.F.);
326 | #347=ADVANCED_FACE('',(#346),#336,.F.);
327 | #348=CARTESIAN_POINT('',(2.05E1,-1.65E0,-4.E0));
328 | #349=DIRECTION('',(0.E0,1.E0,0.E0));
329 | #350=DIRECTION('',(0.E0,0.E0,-1.E0));
330 | #351=AXIS2_PLACEMENT_3D('',#348,#349,#350);
331 | #352=CYLINDRICAL_SURFACE('',#351,1.6E0);
332 | #353=ORIENTED_EDGE('',*,*,#337,.F.);
333 | #355=ORIENTED_EDGE('',*,*,#354,.T.);
334 | #356=ORIENTED_EDGE('',*,*,#341,.F.);
335 | #358=ORIENTED_EDGE('',*,*,#357,.T.);
336 | #359=EDGE_LOOP('',(#353,#355,#356,#358));
337 | #360=FACE_OUTER_BOUND('',#359,.F.);
338 | #361=ADVANCED_FACE('',(#360),#352,.F.);
339 | #362=CARTESIAN_POINT('',(2.425E1,-1.1E1,2.5E0));
340 | #363=DIRECTION('',(0.E0,-1.E0,0.E0));
341 | #364=DIRECTION('',(0.E0,0.E0,-1.E0));
342 | #365=AXIS2_PLACEMENT_3D('',#362,#363,#364);
343 | #366=PLANE('',#365);
344 | #368=ORIENTED_EDGE('',*,*,#367,.F.);
345 | #370=ORIENTED_EDGE('',*,*,#369,.F.);
346 | #372=ORIENTED_EDGE('',*,*,#371,.T.);
347 | #374=ORIENTED_EDGE('',*,*,#373,.T.);
348 | #375=EDGE_LOOP('',(#368,#370,#372,#374));
349 | #376=FACE_OUTER_BOUND('',#375,.F.);
350 | #377=ORIENTED_EDGE('',*,*,#343,.F.);
351 | #378=ORIENTED_EDGE('',*,*,#354,.F.);
352 | #379=EDGE_LOOP('',(#377,#378));
353 | #380=FACE_BOUND('',#379,.F.);
354 | #382=ORIENTED_EDGE('',*,*,#381,.F.);
355 | #384=ORIENTED_EDGE('',*,*,#383,.F.);
356 | #385=EDGE_LOOP('',(#382,#384));
357 | #386=FACE_BOUND('',#385,.F.);
358 | #387=ADVANCED_FACE('',(#376,#380,#386),#366,.T.);
359 | #388=CARTESIAN_POINT('',(3.1E1,-6.E0,5.E0));
360 | #389=DIRECTION('',(1.E0,0.E0,0.E0));
361 | #390=DIRECTION('',(0.E0,0.E0,-1.E0));
362 | #391=AXIS2_PLACEMENT_3D('',#388,#389,#390);
363 | #392=PLANE('',#391);
364 | #394=ORIENTED_EDGE('',*,*,#393,.T.);
365 | #396=ORIENTED_EDGE('',*,*,#395,.T.);
366 | #398=ORIENTED_EDGE('',*,*,#397,.F.);
367 | #400=ORIENTED_EDGE('',*,*,#399,.F.);
368 | #401=ORIENTED_EDGE('',*,*,#367,.T.);
369 | #403=ORIENTED_EDGE('',*,*,#402,.T.);
370 | #404=EDGE_LOOP('',(#394,#396,#398,#400,#401,#403));
371 | #405=FACE_OUTER_BOUND('',#404,.F.);
372 | #406=ADVANCED_FACE('',(#405),#392,.T.);
373 | #407=CARTESIAN_POINT('',(2.5E1,0.E0,0.E0));
374 | #408=DIRECTION('',(0.E0,0.E0,1.E0));
375 | #409=DIRECTION('',(0.E0,-1.E0,0.E0));
376 | #410=AXIS2_PLACEMENT_3D('',#407,#408,#409);
377 | #411=CYLINDRICAL_SURFACE('',#410,6.E0);
378 | #412=ORIENTED_EDGE('',*,*,#393,.F.);
379 | #414=ORIENTED_EDGE('',*,*,#413,.T.);
380 | #416=ORIENTED_EDGE('',*,*,#415,.F.);
381 | #418=ORIENTED_EDGE('',*,*,#417,.T.);
382 | #419=EDGE_LOOP('',(#412,#414,#416,#418));
383 | #420=FACE_OUTER_BOUND('',#419,.F.);
384 | #421=ADVANCED_FACE('',(#420),#411,.T.);
385 | #422=CARTESIAN_POINT('',(1.25E1,0.E0,5.E0));
386 | #423=DIRECTION('',(0.E0,0.E0,1.E0));
387 | #424=DIRECTION('',(1.E0,0.E0,0.E0));
388 | #425=AXIS2_PLACEMENT_3D('',#422,#423,#424);
389 | #426=PLANE('',#425);
390 | #428=ORIENTED_EDGE('',*,*,#427,.T.);
391 | #429=ORIENTED_EDGE('',*,*,#413,.F.);
392 | #430=ORIENTED_EDGE('',*,*,#402,.F.);
393 | #431=ORIENTED_EDGE('',*,*,#373,.F.);
394 | #433=ORIENTED_EDGE('',*,*,#432,.T.);
395 | #435=ORIENTED_EDGE('',*,*,#434,.T.);
396 | #437=ORIENTED_EDGE('',*,*,#436,.F.);
397 | #438=EDGE_LOOP('',(#428,#429,#430,#431,#433,#435,#437));
398 | #439=FACE_OUTER_BOUND('',#438,.F.);
399 | #441=ORIENTED_EDGE('',*,*,#440,.F.);
400 | #443=ORIENTED_EDGE('',*,*,#442,.F.);
401 | #444=EDGE_LOOP('',(#441,#443));
402 | #445=FACE_BOUND('',#444,.F.);
403 | #447=ORIENTED_EDGE('',*,*,#446,.F.);
404 | #449=ORIENTED_EDGE('',*,*,#448,.F.);
405 | #450=EDGE_LOOP('',(#447,#449));
406 | #451=FACE_BOUND('',#450,.F.);
407 | #452=ADVANCED_FACE('',(#439,#445,#451),#426,.T.);
408 | #453=CARTESIAN_POINT('',(2.5E1,6.E0,0.E0));
409 | #454=DIRECTION('',(0.E0,1.E0,0.E0));
410 | #455=DIRECTION('',(-1.E0,0.E0,0.E0));
411 | #456=AXIS2_PLACEMENT_3D('',#453,#454,#455);
412 | #457=PLANE('',#456);
413 | #459=ORIENTED_EDGE('',*,*,#458,.T.);
414 | #460=ORIENTED_EDGE('',*,*,#415,.T.);
415 | #461=ORIENTED_EDGE('',*,*,#427,.F.);
416 | #463=ORIENTED_EDGE('',*,*,#462,.T.);
417 | #464=EDGE_LOOP('',(#459,#460,#461,#463));
418 | #465=FACE_OUTER_BOUND('',#464,.F.);
419 | #466=ADVANCED_FACE('',(#465),#457,.T.);
420 | #467=CARTESIAN_POINT('',(1.25E1,0.E0,0.E0));
421 | #468=DIRECTION('',(0.E0,0.E0,1.E0));
422 | #469=DIRECTION('',(1.E0,0.E0,0.E0));
423 | #470=AXIS2_PLACEMENT_3D('',#467,#468,#469);
424 | #471=PLANE('',#470);
425 | #473=ORIENTED_EDGE('',*,*,#472,.T.);
426 | #474=ORIENTED_EDGE('',*,*,#395,.F.);
427 | #475=ORIENTED_EDGE('',*,*,#417,.F.);
428 | #476=ORIENTED_EDGE('',*,*,#458,.F.);
429 | #478=ORIENTED_EDGE('',*,*,#477,.F.);
430 | #480=ORIENTED_EDGE('',*,*,#479,.F.);
431 | #481=EDGE_LOOP('',(#473,#474,#475,#476,#478,#480));
432 | #482=FACE_OUTER_BOUND('',#481,.F.);
433 | #484=ORIENTED_EDGE('',*,*,#483,.F.);
434 | #486=ORIENTED_EDGE('',*,*,#485,.F.);
435 | #487=EDGE_LOOP('',(#484,#486));
436 | #488=FACE_BOUND('',#487,.F.);
437 | #490=ORIENTED_EDGE('',*,*,#489,.F.);
438 | #492=ORIENTED_EDGE('',*,*,#491,.F.);
439 | #493=EDGE_LOOP('',(#490,#492));
440 | #494=FACE_BOUND('',#493,.F.);
441 | #495=ADVANCED_FACE('',(#482,#488,#494),#471,.F.);
442 | #496=CARTESIAN_POINT('',(1.75E1,-6.E0,0.E0));
443 | #497=DIRECTION('',(0.E0,1.E0,0.E0));
444 | #498=DIRECTION('',(1.E0,0.E0,0.E0));
445 | #499=AXIS2_PLACEMENT_3D('',#496,#497,#498);
446 | #500=PLANE('',#499);
447 | #501=ORIENTED_EDGE('',*,*,#472,.F.);
448 | #503=ORIENTED_EDGE('',*,*,#502,.F.);
449 | #505=ORIENTED_EDGE('',*,*,#504,.F.);
450 | #506=ORIENTED_EDGE('',*,*,#397,.T.);
451 | #507=EDGE_LOOP('',(#501,#503,#505,#506));
452 | #508=FACE_OUTER_BOUND('',#507,.F.);
453 | #509=ORIENTED_EDGE('',*,*,#357,.F.);
454 | #510=ORIENTED_EDGE('',*,*,#339,.F.);
455 | #511=EDGE_LOOP('',(#509,#510));
456 | #512=FACE_BOUND('',#511,.F.);
457 | #514=ORIENTED_EDGE('',*,*,#513,.F.);
458 | #516=ORIENTED_EDGE('',*,*,#515,.F.);
459 | #517=EDGE_LOOP('',(#514,#516));
460 | #518=FACE_BOUND('',#517,.F.);
461 | #519=ADVANCED_FACE('',(#508,#512,#518),#500,.T.);
462 | #520=CARTESIAN_POINT('',(1.75E1,-6.E0,0.E0));
463 | #521=DIRECTION('',(-1.E0,0.E0,0.E0));
464 | #522=DIRECTION('',(0.E0,0.E0,1.E0));
465 | #523=AXIS2_PLACEMENT_3D('',#520,#521,#522);
466 | #524=PLANE('',#523);
467 | #526=ORIENTED_EDGE('',*,*,#525,.F.);
468 | #527=ORIENTED_EDGE('',*,*,#432,.F.);
469 | #528=ORIENTED_EDGE('',*,*,#371,.F.);
470 | #530=ORIENTED_EDGE('',*,*,#529,.F.);
471 | #531=ORIENTED_EDGE('',*,*,#502,.T.);
472 | #532=EDGE_LOOP('',(#526,#527,#528,#530,#531));
473 | #533=FACE_OUTER_BOUND('',#532,.F.);
474 | #534=ADVANCED_FACE('',(#533),#524,.T.);
475 | #535=CARTESIAN_POINT('',(0.E0,-6.E0,0.E0));
476 | #536=DIRECTION('',(0.E0,-1.E0,0.E0));
477 | #537=DIRECTION('',(1.E0,0.E0,0.E0));
478 | #538=AXIS2_PLACEMENT_3D('',#535,#536,#537);
479 | #539=PLANE('',#538);
480 | #540=ORIENTED_EDGE('',*,*,#525,.T.);
481 | #541=ORIENTED_EDGE('',*,*,#479,.T.);
482 | #543=ORIENTED_EDGE('',*,*,#542,.T.);
483 | #544=ORIENTED_EDGE('',*,*,#434,.F.);
484 | #545=EDGE_LOOP('',(#540,#541,#543,#544));
485 | #546=FACE_OUTER_BOUND('',#545,.F.);
486 | #547=ADVANCED_FACE('',(#546),#539,.T.);
487 | #548=CARTESIAN_POINT('',(0.E0,0.E0,0.E0));
488 | #549=DIRECTION('',(0.E0,0.E0,1.E0));
489 | #550=DIRECTION('',(0.E0,1.E0,0.E0));
490 | #551=AXIS2_PLACEMENT_3D('',#548,#549,#550);
491 | #552=CYLINDRICAL_SURFACE('',#551,6.E0);
492 | #553=ORIENTED_EDGE('',*,*,#477,.T.);
493 | #554=ORIENTED_EDGE('',*,*,#462,.F.);
494 | #555=ORIENTED_EDGE('',*,*,#436,.T.);
495 | #556=ORIENTED_EDGE('',*,*,#542,.F.);
496 | #557=EDGE_LOOP('',(#553,#554,#555,#556));
497 | #558=FACE_OUTER_BOUND('',#557,.F.);
498 | #559=ADVANCED_FACE('',(#558),#552,.T.);
499 | #560=CARTESIAN_POINT('',(2.425E1,-8.5E0,-7.E0));
500 | #561=DIRECTION('',(0.E0,0.E0,-1.E0));
501 | #562=DIRECTION('',(-1.E0,0.E0,0.E0));
502 | #563=AXIS2_PLACEMENT_3D('',#560,#561,#562);
503 | #564=PLANE('',#563);
504 | #565=ORIENTED_EDGE('',*,*,#399,.T.);
505 | #566=ORIENTED_EDGE('',*,*,#504,.T.);
506 | #567=ORIENTED_EDGE('',*,*,#529,.T.);
507 | #568=ORIENTED_EDGE('',*,*,#369,.T.);
508 | #569=EDGE_LOOP('',(#565,#566,#567,#568));
509 | #570=FACE_OUTER_BOUND('',#569,.F.);
510 | #571=ADVANCED_FACE('',(#570),#564,.T.);
511 | #572=CARTESIAN_POINT('',(2.8E1,-1.65E0,-4.E0));
512 | #573=DIRECTION('',(0.E0,1.E0,0.E0));
513 | #574=DIRECTION('',(0.E0,0.E0,-1.E0));
514 | #575=AXIS2_PLACEMENT_3D('',#572,#573,#574);
515 | #576=CYLINDRICAL_SURFACE('',#575,1.6E0);
516 | #578=ORIENTED_EDGE('',*,*,#577,.F.);
517 | #579=ORIENTED_EDGE('',*,*,#383,.T.);
518 | #581=ORIENTED_EDGE('',*,*,#580,.F.);
519 | #582=ORIENTED_EDGE('',*,*,#513,.T.);
520 | #583=EDGE_LOOP('',(#578,#579,#581,#582));
521 | #584=FACE_OUTER_BOUND('',#583,.F.);
522 | #585=ADVANCED_FACE('',(#584),#576,.F.);
523 | #586=CARTESIAN_POINT('',(2.8E1,-1.65E0,-4.E0));
524 | #587=DIRECTION('',(0.E0,1.E0,0.E0));
525 | #588=DIRECTION('',(0.E0,0.E0,-1.E0));
526 | #589=AXIS2_PLACEMENT_3D('',#586,#587,#588);
527 | #590=CYLINDRICAL_SURFACE('',#589,1.6E0);
528 | #591=ORIENTED_EDGE('',*,*,#577,.T.);
529 | #592=ORIENTED_EDGE('',*,*,#515,.T.);
530 | #593=ORIENTED_EDGE('',*,*,#580,.T.);
531 | #594=ORIENTED_EDGE('',*,*,#381,.T.);
532 | #595=EDGE_LOOP('',(#591,#592,#593,#594));
533 | #596=FACE_OUTER_BOUND('',#595,.F.);
534 | #597=ADVANCED_FACE('',(#596),#590,.F.);
535 | #598=CARTESIAN_POINT('',(2.5E1,0.E0,7.25E-1));
536 | #599=DIRECTION('',(0.E0,0.E0,-1.E0));
537 | #600=DIRECTION('',(-1.E0,0.E0,0.E0));
538 | #601=AXIS2_PLACEMENT_3D('',#598,#599,#600);
539 | #602=CONICAL_SURFACE('',#601,2.425E0,4.5E1);
540 | #604=ORIENTED_EDGE('',*,*,#603,.T.);
541 | #606=ORIENTED_EDGE('',*,*,#605,.F.);
542 | #607=ORIENTED_EDGE('',*,*,#483,.T.);
543 | #609=ORIENTED_EDGE('',*,*,#608,.F.);
544 | #610=EDGE_LOOP('',(#604,#606,#607,#609));
545 | #611=FACE_OUTER_BOUND('',#610,.F.);
546 | #612=ADVANCED_FACE('',(#611),#602,.F.);
547 | #613=CARTESIAN_POINT('',(2.5E1,0.E0,2.75E0));
548 | #614=DIRECTION('',(0.E0,0.E0,1.E0));
549 | #615=DIRECTION('',(-1.E0,0.E0,0.E0));
550 | #616=AXIS2_PLACEMENT_3D('',#613,#614,#615);
551 | #617=CYLINDRICAL_SURFACE('',#616,1.7E0);
552 | #619=ORIENTED_EDGE('',*,*,#618,.T.);
553 | #620=ORIENTED_EDGE('',*,*,#442,.T.);
554 | #622=ORIENTED_EDGE('',*,*,#621,.T.);
555 | #623=ORIENTED_EDGE('',*,*,#603,.F.);
556 | #624=EDGE_LOOP('',(#619,#620,#622,#623));
557 | #625=FACE_OUTER_BOUND('',#624,.F.);
558 | #626=ADVANCED_FACE('',(#625),#617,.F.);
559 | #627=CARTESIAN_POINT('',(2.5E1,0.E0,2.75E0));
560 | #628=DIRECTION('',(0.E0,0.E0,1.E0));
561 | #629=DIRECTION('',(-1.E0,0.E0,0.E0));
562 | #630=AXIS2_PLACEMENT_3D('',#627,#628,#629);
563 | #631=CYLINDRICAL_SURFACE('',#630,1.7E0);
564 | #632=ORIENTED_EDGE('',*,*,#618,.F.);
565 | #634=ORIENTED_EDGE('',*,*,#633,.F.);
566 | #635=ORIENTED_EDGE('',*,*,#621,.F.);
567 | #636=ORIENTED_EDGE('',*,*,#440,.T.);
568 | #637=EDGE_LOOP('',(#632,#634,#635,#636));
569 | #638=FACE_OUTER_BOUND('',#637,.F.);
570 | #639=ADVANCED_FACE('',(#638),#631,.F.);
571 | #640=CARTESIAN_POINT('',(2.5E1,0.E0,7.25E-1));
572 | #641=DIRECTION('',(0.E0,0.E0,-1.E0));
573 | #642=DIRECTION('',(-1.E0,0.E0,0.E0));
574 | #643=AXIS2_PLACEMENT_3D('',#640,#641,#642);
575 | #644=CONICAL_SURFACE('',#643,2.425E0,4.5E1);
576 | #645=ORIENTED_EDGE('',*,*,#633,.T.);
577 | #646=ORIENTED_EDGE('',*,*,#608,.T.);
578 | #647=ORIENTED_EDGE('',*,*,#485,.T.);
579 | #648=ORIENTED_EDGE('',*,*,#605,.T.);
580 | #649=EDGE_LOOP('',(#645,#646,#647,#648));
581 | #650=FACE_OUTER_BOUND('',#649,.F.);
582 | #651=ADVANCED_FACE('',(#650),#644,.F.);
583 | #652=CARTESIAN_POINT('',(0.E0,0.E0,7.25E-1));
584 | #653=DIRECTION('',(0.E0,0.E0,-1.E0));
585 | #654=DIRECTION('',(-1.E0,0.E0,0.E0));
586 | #655=AXIS2_PLACEMENT_3D('',#652,#653,#654);
587 | #656=CONICAL_SURFACE('',#655,2.425E0,4.5E1);
588 | #658=ORIENTED_EDGE('',*,*,#657,.T.);
589 | #660=ORIENTED_EDGE('',*,*,#659,.F.);
590 | #661=ORIENTED_EDGE('',*,*,#489,.T.);
591 | #663=ORIENTED_EDGE('',*,*,#662,.F.);
592 | #664=EDGE_LOOP('',(#658,#660,#661,#663));
593 | #665=FACE_OUTER_BOUND('',#664,.F.);
594 | #666=ADVANCED_FACE('',(#665),#656,.F.);
595 | #667=CARTESIAN_POINT('',(0.E0,0.E0,2.75E0));
596 | #668=DIRECTION('',(0.E0,0.E0,1.E0));
597 | #669=DIRECTION('',(-1.E0,0.E0,0.E0));
598 | #670=AXIS2_PLACEMENT_3D('',#667,#668,#669);
599 | #671=CYLINDRICAL_SURFACE('',#670,1.7E0);
600 | #673=ORIENTED_EDGE('',*,*,#672,.T.);
601 | #674=ORIENTED_EDGE('',*,*,#448,.T.);
602 | #676=ORIENTED_EDGE('',*,*,#675,.T.);
603 | #677=ORIENTED_EDGE('',*,*,#657,.F.);
604 | #678=EDGE_LOOP('',(#673,#674,#676,#677));
605 | #679=FACE_OUTER_BOUND('',#678,.F.);
606 | #680=ADVANCED_FACE('',(#679),#671,.F.);
607 | #681=CARTESIAN_POINT('',(0.E0,0.E0,2.75E0));
608 | #682=DIRECTION('',(0.E0,0.E0,1.E0));
609 | #683=DIRECTION('',(-1.E0,0.E0,0.E0));
610 | #684=AXIS2_PLACEMENT_3D('',#681,#682,#683);
611 | #685=CYLINDRICAL_SURFACE('',#684,1.7E0);
612 | #686=ORIENTED_EDGE('',*,*,#672,.F.);
613 | #688=ORIENTED_EDGE('',*,*,#687,.F.);
614 | #689=ORIENTED_EDGE('',*,*,#675,.F.);
615 | #690=ORIENTED_EDGE('',*,*,#446,.T.);
616 | #691=EDGE_LOOP('',(#686,#688,#689,#690));
617 | #692=FACE_OUTER_BOUND('',#691,.F.);
618 | #693=ADVANCED_FACE('',(#692),#685,.F.);
619 | #694=CARTESIAN_POINT('',(0.E0,0.E0,7.25E-1));
620 | #695=DIRECTION('',(0.E0,0.E0,-1.E0));
621 | #696=DIRECTION('',(-1.E0,0.E0,0.E0));
622 | #697=AXIS2_PLACEMENT_3D('',#694,#695,#696);
623 | #698=CONICAL_SURFACE('',#697,2.425E0,4.5E1);
624 | #699=ORIENTED_EDGE('',*,*,#687,.T.);
625 | #700=ORIENTED_EDGE('',*,*,#662,.T.);
626 | #701=ORIENTED_EDGE('',*,*,#491,.T.);
627 | #702=ORIENTED_EDGE('',*,*,#659,.T.);
628 | #703=EDGE_LOOP('',(#699,#700,#701,#702));
629 | #704=FACE_OUTER_BOUND('',#703,.F.);
630 | #705=ADVANCED_FACE('',(#704),#698,.F.);
631 | #709=DIMENSIONAL_EXPONENTS(0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,0.E0);
632 | #711=PLANE_ANGLE_MEASURE_WITH_UNIT(PLANE_ANGLE_MEASURE(1.745329251994E-2),#710);
633 | #712=(CONVERSION_BASED_UNIT('DEGREE',#711)NAMED_UNIT(*)PLANE_ANGLE_UNIT());
634 | #714=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(4.245329456317E-3),#708,
635 | 'closure',
636 | 'Maximum model space distance between geometric entities at asserted connectivities');
637 | #715=(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((
638 | #714))GLOBAL_UNIT_ASSIGNED_CONTEXT((#708,#712,#713))REPRESENTATION_CONTEXT
639 | ('ID1','3'));
640 | #717=APPLICATION_CONTEXT(
641 | 'CONFIGURATION CONTROLLED 3D DESIGNS OF MECHANICAL PARTS AND ASSEMBLIES');
642 | #718=APPLICATION_PROTOCOL_DEFINITION('international standard',
643 | 'config_control_design',1994,#717);
644 | #719=DESIGN_CONTEXT('',#717,'design');
645 | #720=MECHANICAL_CONTEXT('',#717,'mechanical');
646 | #721=PRODUCT('GEGENSTUECK_RACK','GEGENSTUECK_RACK','NOT SPECIFIED',(#720));
647 | #722=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('1','LAST_VERSION',#721,
648 | .MADE.);
649 | #726=PRODUCT_CATEGORY('part','');
650 | #727=PRODUCT_RELATED_PRODUCT_CATEGORY('detail','',(#721));
651 | #728=PRODUCT_CATEGORY_RELATIONSHIP('','',#726,#727);
652 | #729=SECURITY_CLASSIFICATION_LEVEL('unclassified');
653 | #730=SECURITY_CLASSIFICATION('','',#729);
654 | #731=CC_DESIGN_SECURITY_CLASSIFICATION(#730,(#722));
655 | #732=APPROVAL_STATUS('approved');
656 | #733=APPROVAL(#732,'');
657 | #734=CC_DESIGN_APPROVAL(#733,(#730,#722,#723));
658 | #735=CALENDAR_DATE(124,12,2);
659 | #736=COORDINATED_UNIVERSAL_TIME_OFFSET(1,0,.AHEAD.);
660 | #737=LOCAL_TIME(12,57,3.E1,#736);
661 | #738=DATE_AND_TIME(#735,#737);
662 | #739=APPROVAL_DATE_TIME(#738,#733);
663 | #740=DATE_TIME_ROLE('creation_date');
664 | #741=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#738,#740,(#723));
665 | #742=DATE_TIME_ROLE('classification_date');
666 | #743=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#738,#742,(#730));
667 | #744=PERSON('UNSPECIFIED','UNSPECIFIED',$,$,$,$);
668 | #745=ORGANIZATION('UNSPECIFIED','UNSPECIFIED','UNSPECIFIED');
669 | #746=PERSON_AND_ORGANIZATION(#744,#745);
670 | #747=APPROVAL_ROLE('approver');
671 | #748=APPROVAL_PERSON_ORGANIZATION(#746,#733,#747);
672 | #749=PERSON_AND_ORGANIZATION_ROLE('creator');
673 | #750=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#746,#749,(#722,#723));
674 | #751=PERSON_AND_ORGANIZATION_ROLE('design_supplier');
675 | #752=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#746,#751,(#722));
676 | #753=PERSON_AND_ORGANIZATION_ROLE('classification_officer');
677 | #754=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#746,#753,(#730));
678 | #755=PERSON_AND_ORGANIZATION_ROLE('design_owner');
679 | #756=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#746,#755,(#721));
680 | #22=CIRCLE('',#21,1.6E0);
681 | #27=CIRCLE('',#26,1.6E0);
682 | #32=CIRCLE('',#31,1.6E0);
683 | #37=CIRCLE('',#36,1.6E0);
684 | #58=CIRCLE('',#57,6.E0);
685 | #71=CIRCLE('',#70,6.E0);
686 | #76=CIRCLE('',#75,1.7E0);
687 | #81=CIRCLE('',#80,1.7E0);
688 | #86=CIRCLE('',#85,1.7E0);
689 | #91=CIRCLE('',#90,1.7E0);
690 | #104=CIRCLE('',#103,6.E0);
691 | #113=CIRCLE('',#112,6.E0);
692 | #122=CIRCLE('',#121,3.15E0);
693 | #127=CIRCLE('',#126,3.15E0);
694 | #132=CIRCLE('',#131,3.15E0);
695 | #137=CIRCLE('',#136,3.15E0);
696 | #154=CIRCLE('',#153,1.6E0);
697 | #159=CIRCLE('',#158,1.6E0);
698 | #164=CIRCLE('',#163,1.6E0);
699 | #169=CIRCLE('',#168,1.6E0);
700 | #210=CIRCLE('',#209,1.7E0);
701 | #231=CIRCLE('',#230,1.7E0);
702 | #236=CIRCLE('',#235,1.7E0);
703 | #257=CIRCLE('',#256,1.7E0);
704 | #337=EDGE_CURVE('',#294,#295,#5,.T.);
705 | #339=EDGE_CURVE('',#295,#299,#159,.T.);
706 | #341=EDGE_CURVE('',#299,#297,#9,.T.);
707 | #343=EDGE_CURVE('',#297,#294,#22,.T.);
708 | #354=EDGE_CURVE('',#294,#297,#27,.T.);
709 | #357=EDGE_CURVE('',#299,#295,#154,.T.);
710 | #367=EDGE_CURVE('',#267,#271,#13,.T.);
711 | #369=EDGE_CURVE('',#269,#267,#17,.T.);
712 | #371=EDGE_CURVE('',#269,#273,#181,.T.);
713 | #373=EDGE_CURVE('',#273,#271,#66,.T.);
714 | #381=EDGE_CURVE('',#305,#302,#32,.T.);
715 | #383=EDGE_CURVE('',#302,#305,#37,.T.);
716 | #393=EDGE_CURVE('',#276,#277,#49,.T.);
717 | #395=EDGE_CURVE('',#277,#261,#99,.T.);
718 | #397=EDGE_CURVE('',#263,#261,#41,.T.);
719 | #399=EDGE_CURVE('',#267,#263,#45,.T.);
720 | #402=EDGE_CURVE('',#271,#276,#62,.T.);
721 | #413=EDGE_CURVE('',#276,#287,#58,.T.);
722 | #415=EDGE_CURVE('',#291,#287,#53,.T.);
723 | #417=EDGE_CURVE('',#291,#277,#104,.T.);
724 | #427=EDGE_CURVE('',#286,#287,#95,.T.);
725 | #432=EDGE_CURVE('',#273,#279,#177,.T.);
726 | #434=EDGE_CURVE('',#279,#281,#189,.T.);
727 | #436=EDGE_CURVE('',#286,#281,#71,.T.);
728 | #440=EDGE_CURVE('',#319,#317,#76,.T.);
729 | #442=EDGE_CURVE('',#317,#319,#81,.T.);
730 | #446=EDGE_CURVE('',#331,#329,#86,.T.);
731 | #448=EDGE_CURVE('',#329,#331,#91,.T.);
732 | #458=EDGE_CURVE('',#290,#291,#108,.T.);
733 | #462=EDGE_CURVE('',#286,#290,#193,.T.);
734 | #472=EDGE_CURVE('',#260,#261,#141,.T.);
735 | #477=EDGE_CURVE('',#283,#290,#113,.T.);
736 | #479=EDGE_CURVE('',#260,#283,#117,.T.);
737 | #483=EDGE_CURVE('',#313,#311,#122,.T.);
738 | #485=EDGE_CURVE('',#311,#313,#127,.T.);
739 | #489=EDGE_CURVE('',#325,#323,#132,.T.);
740 | #491=EDGE_CURVE('',#323,#325,#137,.T.);
741 | #502=EDGE_CURVE('',#265,#260,#145,.T.);
742 | #504=EDGE_CURVE('',#263,#265,#149,.T.);
743 | #513=EDGE_CURVE('',#307,#303,#164,.T.);
744 | #515=EDGE_CURVE('',#303,#307,#169,.T.);
745 | #525=EDGE_CURVE('',#279,#260,#173,.T.);
746 | #529=EDGE_CURVE('',#265,#269,#185,.T.);
747 | #542=EDGE_CURVE('',#283,#281,#197,.T.);
748 | #577=EDGE_CURVE('',#302,#303,#201,.T.);
749 | #580=EDGE_CURVE('',#307,#305,#205,.T.);
750 | #603=EDGE_CURVE('',#310,#315,#210,.T.);
751 | #605=EDGE_CURVE('',#313,#315,#214,.T.);
752 | #608=EDGE_CURVE('',#310,#311,#218,.T.);
753 | #618=EDGE_CURVE('',#310,#317,#222,.T.);
754 | #621=EDGE_CURVE('',#319,#315,#226,.T.);
755 | #633=EDGE_CURVE('',#315,#310,#231,.T.);
756 | #657=EDGE_CURVE('',#322,#327,#236,.T.);
757 | #659=EDGE_CURVE('',#325,#327,#240,.T.);
758 | #662=EDGE_CURVE('',#322,#323,#244,.T.);
759 | #672=EDGE_CURVE('',#322,#329,#248,.T.);
760 | #675=EDGE_CURVE('',#331,#327,#252,.T.);
761 | #687=EDGE_CURVE('',#327,#322,#257,.T.);
762 | #706=CLOSED_SHELL('',(#347,#361,#387,#406,#421,#452,#466,#495,#519,#534,#547,
763 | #559,#571,#585,#597,#612,#626,#639,#651,#666,#680,#693,#705));
764 | #707=MANIFOLD_SOLID_BREP('',#706);
765 | #708=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));
766 | #710=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.));
767 | #713=(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT());
768 | #716=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#707),#715);
769 | #723=PRODUCT_DEFINITION('design','',#722,#719);
770 | #724=PRODUCT_DEFINITION_SHAPE('','SHAPE FOR GEGENSTUECK_RACK.',#723);
771 | #725=SHAPE_DEFINITION_REPRESENTATION(#724,#716);
772 | ENDSEC;
773 | END-ISO-10303-21;
774 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/images/img1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/images/img1.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/images/img2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/images/img2.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/images/img3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/images/img3.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/images/img4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/images/img4.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/images/img5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/images/img5.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/images/img6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/images/img6.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/images/img7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/images/img7.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/images/img8.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/images/img8.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/laufschiene.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/laufschiene.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/mounting_adapter.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/mounting_adapter.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/rack.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/rack.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/rack_spacer.stl:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_cad/rack_spacer.stl
--------------------------------------------------------------------------------
/diy_robotics_gripper_cad/rack_spacer.stp:
--------------------------------------------------------------------------------
1 | ISO-10303-21;
2 | HEADER;
3 | FILE_DESCRIPTION((''),'2;1');
4 | FILE_NAME('RACK_SPACER','2024-02-12T12:58:00',('Mathias'),(''),
5 | 'CREO PARAMETRIC BY PTC INC, 2021404','CREO PARAMETRIC BY PTC INC, 2021404','');
6 | FILE_SCHEMA(('CONFIG_CONTROL_DESIGN'));
7 | ENDSEC;
8 | DATA;
9 | #2=DIRECTION('',(0.E0,0.E0,-1.E0));
10 | #3=VECTOR('',#2,3.1E0);
11 | #4=CARTESIAN_POINT('',(8.2E0,0.E0,3.1E0));
12 | #5=LINE('',#4,#3);
13 | #6=DIRECTION('',(0.E0,0.E0,1.E0));
14 | #7=VECTOR('',#6,3.1E0);
15 | #8=CARTESIAN_POINT('',(4.8E0,0.E0,0.E0));
16 | #9=LINE('',#8,#7);
17 | #10=CARTESIAN_POINT('',(-1.85E1,0.E0,3.1E0));
18 | #11=DIRECTION('',(0.E0,0.E0,1.E0));
19 | #12=DIRECTION('',(0.E0,1.E0,0.E0));
20 | #13=AXIS2_PLACEMENT_3D('',#10,#11,#12);
21 | #15=CARTESIAN_POINT('',(1.85E1,0.E0,3.1E0));
22 | #16=DIRECTION('',(0.E0,0.E0,1.E0));
23 | #17=DIRECTION('',(0.E0,-1.E0,0.E0));
24 | #18=AXIS2_PLACEMENT_3D('',#15,#16,#17);
25 | #20=CARTESIAN_POINT('',(6.5E0,0.E0,3.1E0));
26 | #21=DIRECTION('',(0.E0,0.E0,-1.E0));
27 | #22=DIRECTION('',(-1.E0,0.E0,0.E0));
28 | #23=AXIS2_PLACEMENT_3D('',#20,#21,#22);
29 | #25=CARTESIAN_POINT('',(6.5E0,0.E0,3.1E0));
30 | #26=DIRECTION('',(0.E0,0.E0,-1.E0));
31 | #27=DIRECTION('',(1.E0,0.E0,0.E0));
32 | #28=AXIS2_PLACEMENT_3D('',#25,#26,#27);
33 | #30=CARTESIAN_POINT('',(-1.85E1,0.E0,3.1E0));
34 | #31=DIRECTION('',(0.E0,0.E0,-1.E0));
35 | #32=DIRECTION('',(-1.E0,0.E0,0.E0));
36 | #33=AXIS2_PLACEMENT_3D('',#30,#31,#32);
37 | #35=CARTESIAN_POINT('',(-1.85E1,0.E0,3.1E0));
38 | #36=DIRECTION('',(0.E0,0.E0,-1.E0));
39 | #37=DIRECTION('',(1.E0,0.E0,0.E0));
40 | #38=AXIS2_PLACEMENT_3D('',#35,#36,#37);
41 | #40=DIRECTION('',(0.E0,0.E0,-1.E0));
42 | #41=VECTOR('',#40,3.1E0);
43 | #42=CARTESIAN_POINT('',(-1.85E1,3.875E0,3.1E0));
44 | #43=LINE('',#42,#41);
45 | #44=DIRECTION('',(0.E0,0.E0,1.E0));
46 | #45=VECTOR('',#44,3.1E0);
47 | #46=CARTESIAN_POINT('',(-1.85E1,-3.875E0,0.E0));
48 | #47=LINE('',#46,#45);
49 | #48=CARTESIAN_POINT('',(-1.85E1,0.E0,0.E0));
50 | #49=DIRECTION('',(0.E0,0.E0,-1.E0));
51 | #50=DIRECTION('',(0.E0,-1.E0,0.E0));
52 | #51=AXIS2_PLACEMENT_3D('',#48,#49,#50);
53 | #53=DIRECTION('',(-1.E0,0.E0,0.E0));
54 | #54=VECTOR('',#53,3.7E1);
55 | #55=CARTESIAN_POINT('',(1.85E1,-3.875E0,0.E0));
56 | #56=LINE('',#55,#54);
57 | #57=CARTESIAN_POINT('',(1.85E1,0.E0,0.E0));
58 | #58=DIRECTION('',(0.E0,0.E0,-1.E0));
59 | #59=DIRECTION('',(0.E0,1.E0,0.E0));
60 | #60=AXIS2_PLACEMENT_3D('',#57,#58,#59);
61 | #62=DIRECTION('',(1.E0,0.E0,0.E0));
62 | #63=VECTOR('',#62,3.7E1);
63 | #64=CARTESIAN_POINT('',(-1.85E1,3.875E0,0.E0));
64 | #65=LINE('',#64,#63);
65 | #66=CARTESIAN_POINT('',(6.5E0,0.E0,0.E0));
66 | #67=DIRECTION('',(0.E0,0.E0,1.E0));
67 | #68=DIRECTION('',(-1.E0,0.E0,0.E0));
68 | #69=AXIS2_PLACEMENT_3D('',#66,#67,#68);
69 | #71=CARTESIAN_POINT('',(6.5E0,0.E0,0.E0));
70 | #72=DIRECTION('',(0.E0,0.E0,1.E0));
71 | #73=DIRECTION('',(1.E0,0.E0,0.E0));
72 | #74=AXIS2_PLACEMENT_3D('',#71,#72,#73);
73 | #76=CARTESIAN_POINT('',(-1.85E1,0.E0,0.E0));
74 | #77=DIRECTION('',(0.E0,0.E0,1.E0));
75 | #78=DIRECTION('',(-1.E0,0.E0,0.E0));
76 | #79=AXIS2_PLACEMENT_3D('',#76,#77,#78);
77 | #81=CARTESIAN_POINT('',(-1.85E1,0.E0,0.E0));
78 | #82=DIRECTION('',(0.E0,0.E0,1.E0));
79 | #83=DIRECTION('',(1.E0,0.E0,0.E0));
80 | #84=AXIS2_PLACEMENT_3D('',#81,#82,#83);
81 | #86=DIRECTION('',(-1.E0,0.E0,0.E0));
82 | #87=VECTOR('',#86,3.7E1);
83 | #88=CARTESIAN_POINT('',(1.85E1,-3.875E0,3.1E0));
84 | #89=LINE('',#88,#87);
85 | #90=DIRECTION('',(0.E0,0.E0,-1.E0));
86 | #91=VECTOR('',#90,3.1E0);
87 | #92=CARTESIAN_POINT('',(1.85E1,-3.875E0,3.1E0));
88 | #93=LINE('',#92,#91);
89 | #94=DIRECTION('',(0.E0,0.E0,1.E0));
90 | #95=VECTOR('',#94,3.1E0);
91 | #96=CARTESIAN_POINT('',(1.85E1,3.875E0,0.E0));
92 | #97=LINE('',#96,#95);
93 | #98=DIRECTION('',(1.E0,0.E0,0.E0));
94 | #99=VECTOR('',#98,3.7E1);
95 | #100=CARTESIAN_POINT('',(-1.85E1,3.875E0,3.1E0));
96 | #101=LINE('',#100,#99);
97 | #102=DIRECTION('',(0.E0,0.E0,-1.E0));
98 | #103=VECTOR('',#102,3.1E0);
99 | #104=CARTESIAN_POINT('',(-1.68E1,0.E0,3.1E0));
100 | #105=LINE('',#104,#103);
101 | #106=DIRECTION('',(0.E0,0.E0,1.E0));
102 | #107=VECTOR('',#106,3.1E0);
103 | #108=CARTESIAN_POINT('',(-2.02E1,0.E0,0.E0));
104 | #109=LINE('',#108,#107);
105 | #110=CARTESIAN_POINT('',(-1.85E1,3.875E0,0.E0));
106 | #111=CARTESIAN_POINT('',(1.85E1,3.875E0,0.E0));
107 | #112=VERTEX_POINT('',#110);
108 | #113=VERTEX_POINT('',#111);
109 | #114=CARTESIAN_POINT('',(-1.85E1,3.875E0,3.1E0));
110 | #115=VERTEX_POINT('',#114);
111 | #116=CARTESIAN_POINT('',(1.85E1,3.875E0,3.1E0));
112 | #117=VERTEX_POINT('',#116);
113 | #118=CARTESIAN_POINT('',(1.85E1,-3.875E0,0.E0));
114 | #119=VERTEX_POINT('',#118);
115 | #120=CARTESIAN_POINT('',(1.85E1,-3.875E0,3.1E0));
116 | #121=VERTEX_POINT('',#120);
117 | #122=CARTESIAN_POINT('',(-1.85E1,-3.875E0,0.E0));
118 | #123=VERTEX_POINT('',#122);
119 | #124=CARTESIAN_POINT('',(-1.85E1,-3.875E0,3.1E0));
120 | #125=VERTEX_POINT('',#124);
121 | #126=CARTESIAN_POINT('',(8.2E0,0.E0,3.1E0));
122 | #127=CARTESIAN_POINT('',(8.2E0,0.E0,0.E0));
123 | #128=VERTEX_POINT('',#126);
124 | #129=VERTEX_POINT('',#127);
125 | #130=CARTESIAN_POINT('',(4.8E0,0.E0,3.1E0));
126 | #131=VERTEX_POINT('',#130);
127 | #132=CARTESIAN_POINT('',(4.8E0,0.E0,0.E0));
128 | #133=VERTEX_POINT('',#132);
129 | #134=CARTESIAN_POINT('',(-1.68E1,0.E0,3.1E0));
130 | #135=CARTESIAN_POINT('',(-1.68E1,0.E0,0.E0));
131 | #136=VERTEX_POINT('',#134);
132 | #137=VERTEX_POINT('',#135);
133 | #138=CARTESIAN_POINT('',(-2.02E1,0.E0,3.1E0));
134 | #139=VERTEX_POINT('',#138);
135 | #140=CARTESIAN_POINT('',(-2.02E1,0.E0,0.E0));
136 | #141=VERTEX_POINT('',#140);
137 | #142=CARTESIAN_POINT('',(6.5E0,0.E0,1.E-1));
138 | #143=DIRECTION('',(0.E0,0.E0,-1.E0));
139 | #144=DIRECTION('',(1.E0,0.E0,0.E0));
140 | #145=AXIS2_PLACEMENT_3D('',#142,#143,#144);
141 | #146=CYLINDRICAL_SURFACE('',#145,1.7E0);
142 | #148=ORIENTED_EDGE('',*,*,#147,.T.);
143 | #150=ORIENTED_EDGE('',*,*,#149,.T.);
144 | #152=ORIENTED_EDGE('',*,*,#151,.T.);
145 | #154=ORIENTED_EDGE('',*,*,#153,.T.);
146 | #155=EDGE_LOOP('',(#148,#150,#152,#154));
147 | #156=FACE_OUTER_BOUND('',#155,.F.);
148 | #157=ADVANCED_FACE('',(#156),#146,.F.);
149 | #158=CARTESIAN_POINT('',(6.5E0,0.E0,1.E-1));
150 | #159=DIRECTION('',(0.E0,0.E0,-1.E0));
151 | #160=DIRECTION('',(1.E0,0.E0,0.E0));
152 | #161=AXIS2_PLACEMENT_3D('',#158,#159,#160);
153 | #162=CYLINDRICAL_SURFACE('',#161,1.7E0);
154 | #163=ORIENTED_EDGE('',*,*,#147,.F.);
155 | #165=ORIENTED_EDGE('',*,*,#164,.T.);
156 | #166=ORIENTED_EDGE('',*,*,#151,.F.);
157 | #168=ORIENTED_EDGE('',*,*,#167,.T.);
158 | #169=EDGE_LOOP('',(#163,#165,#166,#168));
159 | #170=FACE_OUTER_BOUND('',#169,.F.);
160 | #171=ADVANCED_FACE('',(#170),#162,.F.);
161 | #172=CARTESIAN_POINT('',(0.E0,0.E0,3.1E0));
162 | #173=DIRECTION('',(0.E0,0.E0,1.E0));
163 | #174=DIRECTION('',(1.E0,0.E0,0.E0));
164 | #175=AXIS2_PLACEMENT_3D('',#172,#173,#174);
165 | #176=PLANE('',#175);
166 | #178=ORIENTED_EDGE('',*,*,#177,.F.);
167 | #180=ORIENTED_EDGE('',*,*,#179,.T.);
168 | #182=ORIENTED_EDGE('',*,*,#181,.F.);
169 | #184=ORIENTED_EDGE('',*,*,#183,.T.);
170 | #185=EDGE_LOOP('',(#178,#180,#182,#184));
171 | #186=FACE_OUTER_BOUND('',#185,.F.);
172 | #187=ORIENTED_EDGE('',*,*,#153,.F.);
173 | #188=ORIENTED_EDGE('',*,*,#164,.F.);
174 | #189=EDGE_LOOP('',(#187,#188));
175 | #190=FACE_BOUND('',#189,.F.);
176 | #192=ORIENTED_EDGE('',*,*,#191,.F.);
177 | #194=ORIENTED_EDGE('',*,*,#193,.F.);
178 | #195=EDGE_LOOP('',(#192,#194));
179 | #196=FACE_BOUND('',#195,.F.);
180 | #197=ADVANCED_FACE('',(#186,#190,#196),#176,.T.);
181 | #198=CARTESIAN_POINT('',(-1.85E1,0.E0,0.E0));
182 | #199=DIRECTION('',(0.E0,0.E0,1.E0));
183 | #200=DIRECTION('',(0.E0,1.E0,0.E0));
184 | #201=AXIS2_PLACEMENT_3D('',#198,#199,#200);
185 | #202=CYLINDRICAL_SURFACE('',#201,3.875E0);
186 | #204=ORIENTED_EDGE('',*,*,#203,.T.);
187 | #206=ORIENTED_EDGE('',*,*,#205,.F.);
188 | #207=ORIENTED_EDGE('',*,*,#177,.T.);
189 | #209=ORIENTED_EDGE('',*,*,#208,.F.);
190 | #210=EDGE_LOOP('',(#204,#206,#207,#209));
191 | #211=FACE_OUTER_BOUND('',#210,.F.);
192 | #212=ADVANCED_FACE('',(#211),#202,.T.);
193 | #213=CARTESIAN_POINT('',(0.E0,0.E0,0.E0));
194 | #214=DIRECTION('',(0.E0,0.E0,1.E0));
195 | #215=DIRECTION('',(1.E0,0.E0,0.E0));
196 | #216=AXIS2_PLACEMENT_3D('',#213,#214,#215);
197 | #217=PLANE('',#216);
198 | #218=ORIENTED_EDGE('',*,*,#203,.F.);
199 | #220=ORIENTED_EDGE('',*,*,#219,.F.);
200 | #222=ORIENTED_EDGE('',*,*,#221,.F.);
201 | #224=ORIENTED_EDGE('',*,*,#223,.F.);
202 | #225=EDGE_LOOP('',(#218,#220,#222,#224));
203 | #226=FACE_OUTER_BOUND('',#225,.F.);
204 | #227=ORIENTED_EDGE('',*,*,#167,.F.);
205 | #228=ORIENTED_EDGE('',*,*,#149,.F.);
206 | #229=EDGE_LOOP('',(#227,#228));
207 | #230=FACE_BOUND('',#229,.F.);
208 | #232=ORIENTED_EDGE('',*,*,#231,.F.);
209 | #234=ORIENTED_EDGE('',*,*,#233,.F.);
210 | #235=EDGE_LOOP('',(#232,#234));
211 | #236=FACE_BOUND('',#235,.F.);
212 | #237=ADVANCED_FACE('',(#226,#230,#236),#217,.F.);
213 | #238=CARTESIAN_POINT('',(-1.85E1,-3.875E0,0.E0));
214 | #239=DIRECTION('',(0.E0,-1.E0,0.E0));
215 | #240=DIRECTION('',(1.E0,0.E0,0.E0));
216 | #241=AXIS2_PLACEMENT_3D('',#238,#239,#240);
217 | #242=PLANE('',#241);
218 | #243=ORIENTED_EDGE('',*,*,#219,.T.);
219 | #244=ORIENTED_EDGE('',*,*,#208,.T.);
220 | #245=ORIENTED_EDGE('',*,*,#183,.F.);
221 | #247=ORIENTED_EDGE('',*,*,#246,.T.);
222 | #248=EDGE_LOOP('',(#243,#244,#245,#247));
223 | #249=FACE_OUTER_BOUND('',#248,.F.);
224 | #250=ADVANCED_FACE('',(#249),#242,.T.);
225 | #251=CARTESIAN_POINT('',(1.85E1,0.E0,0.E0));
226 | #252=DIRECTION('',(0.E0,0.E0,1.E0));
227 | #253=DIRECTION('',(0.E0,-1.E0,0.E0));
228 | #254=AXIS2_PLACEMENT_3D('',#251,#252,#253);
229 | #255=CYLINDRICAL_SURFACE('',#254,3.875E0);
230 | #256=ORIENTED_EDGE('',*,*,#221,.T.);
231 | #257=ORIENTED_EDGE('',*,*,#246,.F.);
232 | #258=ORIENTED_EDGE('',*,*,#181,.T.);
233 | #260=ORIENTED_EDGE('',*,*,#259,.F.);
234 | #261=EDGE_LOOP('',(#256,#257,#258,#260));
235 | #262=FACE_OUTER_BOUND('',#261,.F.);
236 | #263=ADVANCED_FACE('',(#262),#255,.T.);
237 | #264=CARTESIAN_POINT('',(1.85E1,3.875E0,0.E0));
238 | #265=DIRECTION('',(0.E0,1.E0,0.E0));
239 | #266=DIRECTION('',(-1.E0,0.E0,0.E0));
240 | #267=AXIS2_PLACEMENT_3D('',#264,#265,#266);
241 | #268=PLANE('',#267);
242 | #269=ORIENTED_EDGE('',*,*,#223,.T.);
243 | #270=ORIENTED_EDGE('',*,*,#259,.T.);
244 | #271=ORIENTED_EDGE('',*,*,#179,.F.);
245 | #272=ORIENTED_EDGE('',*,*,#205,.T.);
246 | #273=EDGE_LOOP('',(#269,#270,#271,#272));
247 | #274=FACE_OUTER_BOUND('',#273,.F.);
248 | #275=ADVANCED_FACE('',(#274),#268,.T.);
249 | #276=CARTESIAN_POINT('',(-1.85E1,0.E0,1.E-1));
250 | #277=DIRECTION('',(0.E0,0.E0,-1.E0));
251 | #278=DIRECTION('',(1.E0,0.E0,0.E0));
252 | #279=AXIS2_PLACEMENT_3D('',#276,#277,#278);
253 | #280=CYLINDRICAL_SURFACE('',#279,1.7E0);
254 | #282=ORIENTED_EDGE('',*,*,#281,.F.);
255 | #283=ORIENTED_EDGE('',*,*,#193,.T.);
256 | #285=ORIENTED_EDGE('',*,*,#284,.F.);
257 | #286=ORIENTED_EDGE('',*,*,#231,.T.);
258 | #287=EDGE_LOOP('',(#282,#283,#285,#286));
259 | #288=FACE_OUTER_BOUND('',#287,.F.);
260 | #289=ADVANCED_FACE('',(#288),#280,.F.);
261 | #290=CARTESIAN_POINT('',(-1.85E1,0.E0,1.E-1));
262 | #291=DIRECTION('',(0.E0,0.E0,-1.E0));
263 | #292=DIRECTION('',(1.E0,0.E0,0.E0));
264 | #293=AXIS2_PLACEMENT_3D('',#290,#291,#292);
265 | #294=CYLINDRICAL_SURFACE('',#293,1.7E0);
266 | #295=ORIENTED_EDGE('',*,*,#281,.T.);
267 | #296=ORIENTED_EDGE('',*,*,#233,.T.);
268 | #297=ORIENTED_EDGE('',*,*,#284,.T.);
269 | #298=ORIENTED_EDGE('',*,*,#191,.T.);
270 | #299=EDGE_LOOP('',(#295,#296,#297,#298));
271 | #300=FACE_OUTER_BOUND('',#299,.F.);
272 | #301=ADVANCED_FACE('',(#300),#294,.F.);
273 | #305=DIMENSIONAL_EXPONENTS(0.E0,0.E0,0.E0,0.E0,0.E0,0.E0,0.E0);
274 | #307=PLANE_ANGLE_MEASURE_WITH_UNIT(PLANE_ANGLE_MEASURE(1.745329251994E-2),#306);
275 | #308=(CONVERSION_BASED_UNIT('DEGREE',#307)NAMED_UNIT(*)PLANE_ANGLE_UNIT());
276 | #310=UNCERTAINTY_MEASURE_WITH_UNIT(LENGTH_MEASURE(4.551998708826E-3),#304,
277 | 'closure',
278 | 'Maximum model space distance between geometric entities at asserted connectivities');
279 | #311=(GEOMETRIC_REPRESENTATION_CONTEXT(3)GLOBAL_UNCERTAINTY_ASSIGNED_CONTEXT((
280 | #310))GLOBAL_UNIT_ASSIGNED_CONTEXT((#304,#308,#309))REPRESENTATION_CONTEXT
281 | ('ID1','3'));
282 | #313=APPLICATION_CONTEXT(
283 | 'CONFIGURATION CONTROLLED 3D DESIGNS OF MECHANICAL PARTS AND ASSEMBLIES');
284 | #314=APPLICATION_PROTOCOL_DEFINITION('international standard',
285 | 'config_control_design',1994,#313);
286 | #315=DESIGN_CONTEXT('',#313,'design');
287 | #316=MECHANICAL_CONTEXT('',#313,'mechanical');
288 | #317=PRODUCT('RACK_SPACER','RACK_SPACER','NOT SPECIFIED',(#316));
289 | #318=PRODUCT_DEFINITION_FORMATION_WITH_SPECIFIED_SOURCE('1','LAST_VERSION',#317,
290 | .MADE.);
291 | #322=PRODUCT_CATEGORY('part','');
292 | #323=PRODUCT_RELATED_PRODUCT_CATEGORY('detail','',(#317));
293 | #324=PRODUCT_CATEGORY_RELATIONSHIP('','',#322,#323);
294 | #325=SECURITY_CLASSIFICATION_LEVEL('unclassified');
295 | #326=SECURITY_CLASSIFICATION('','',#325);
296 | #327=CC_DESIGN_SECURITY_CLASSIFICATION(#326,(#318));
297 | #328=APPROVAL_STATUS('approved');
298 | #329=APPROVAL(#328,'');
299 | #330=CC_DESIGN_APPROVAL(#329,(#326,#318,#319));
300 | #331=CALENDAR_DATE(124,12,2);
301 | #332=COORDINATED_UNIVERSAL_TIME_OFFSET(1,0,.AHEAD.);
302 | #333=LOCAL_TIME(12,58,0.E0,#332);
303 | #334=DATE_AND_TIME(#331,#333);
304 | #335=APPROVAL_DATE_TIME(#334,#329);
305 | #336=DATE_TIME_ROLE('creation_date');
306 | #337=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#334,#336,(#319));
307 | #338=DATE_TIME_ROLE('classification_date');
308 | #339=CC_DESIGN_DATE_AND_TIME_ASSIGNMENT(#334,#338,(#326));
309 | #340=PERSON('UNSPECIFIED','UNSPECIFIED',$,$,$,$);
310 | #341=ORGANIZATION('UNSPECIFIED','UNSPECIFIED','UNSPECIFIED');
311 | #342=PERSON_AND_ORGANIZATION(#340,#341);
312 | #343=APPROVAL_ROLE('approver');
313 | #344=APPROVAL_PERSON_ORGANIZATION(#342,#329,#343);
314 | #345=PERSON_AND_ORGANIZATION_ROLE('creator');
315 | #346=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#342,#345,(#318,#319));
316 | #347=PERSON_AND_ORGANIZATION_ROLE('design_supplier');
317 | #348=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#342,#347,(#318));
318 | #349=PERSON_AND_ORGANIZATION_ROLE('classification_officer');
319 | #350=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#342,#349,(#326));
320 | #351=PERSON_AND_ORGANIZATION_ROLE('design_owner');
321 | #352=CC_DESIGN_PERSON_AND_ORGANIZATION_ASSIGNMENT(#342,#351,(#317));
322 | #14=CIRCLE('',#13,3.875E0);
323 | #19=CIRCLE('',#18,3.875E0);
324 | #24=CIRCLE('',#23,1.7E0);
325 | #29=CIRCLE('',#28,1.7E0);
326 | #34=CIRCLE('',#33,1.7E0);
327 | #39=CIRCLE('',#38,1.7E0);
328 | #52=CIRCLE('',#51,3.875E0);
329 | #61=CIRCLE('',#60,3.875E0);
330 | #70=CIRCLE('',#69,1.7E0);
331 | #75=CIRCLE('',#74,1.7E0);
332 | #80=CIRCLE('',#79,1.7E0);
333 | #85=CIRCLE('',#84,1.7E0);
334 | #147=EDGE_CURVE('',#128,#129,#5,.T.);
335 | #149=EDGE_CURVE('',#129,#133,#75,.T.);
336 | #151=EDGE_CURVE('',#133,#131,#9,.T.);
337 | #153=EDGE_CURVE('',#131,#128,#24,.T.);
338 | #164=EDGE_CURVE('',#128,#131,#29,.T.);
339 | #167=EDGE_CURVE('',#133,#129,#70,.T.);
340 | #177=EDGE_CURVE('',#115,#125,#14,.T.);
341 | #179=EDGE_CURVE('',#115,#117,#101,.T.);
342 | #181=EDGE_CURVE('',#121,#117,#19,.T.);
343 | #183=EDGE_CURVE('',#121,#125,#89,.T.);
344 | #191=EDGE_CURVE('',#139,#136,#34,.T.);
345 | #193=EDGE_CURVE('',#136,#139,#39,.T.);
346 | #203=EDGE_CURVE('',#123,#112,#52,.T.);
347 | #205=EDGE_CURVE('',#115,#112,#43,.T.);
348 | #208=EDGE_CURVE('',#123,#125,#47,.T.);
349 | #219=EDGE_CURVE('',#119,#123,#56,.T.);
350 | #221=EDGE_CURVE('',#113,#119,#61,.T.);
351 | #223=EDGE_CURVE('',#112,#113,#65,.T.);
352 | #231=EDGE_CURVE('',#141,#137,#80,.T.);
353 | #233=EDGE_CURVE('',#137,#141,#85,.T.);
354 | #246=EDGE_CURVE('',#121,#119,#93,.T.);
355 | #259=EDGE_CURVE('',#113,#117,#97,.T.);
356 | #281=EDGE_CURVE('',#136,#137,#105,.T.);
357 | #284=EDGE_CURVE('',#141,#139,#109,.T.);
358 | #302=CLOSED_SHELL('',(#157,#171,#197,#212,#237,#250,#263,#275,#289,#301));
359 | #303=MANIFOLD_SOLID_BREP('',#302);
360 | #304=(LENGTH_UNIT()NAMED_UNIT(*)SI_UNIT(.MILLI.,.METRE.));
361 | #306=(NAMED_UNIT(*)PLANE_ANGLE_UNIT()SI_UNIT($,.RADIAN.));
362 | #309=(NAMED_UNIT(*)SI_UNIT($,.STERADIAN.)SOLID_ANGLE_UNIT());
363 | #312=ADVANCED_BREP_SHAPE_REPRESENTATION('',(#303),#311);
364 | #319=PRODUCT_DEFINITION('design','',#318,#315);
365 | #320=PRODUCT_DEFINITION_SHAPE('','SHAPE FOR RACK_SPACER.',#319);
366 | #321=SHAPE_DEFINITION_REPRESENTATION(#320,#312);
367 | ENDSEC;
368 | END-ISO-10303-21;
369 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/.gitignore:
--------------------------------------------------------------------------------
1 | .pio
2 | .vscode/.browse.c_cpp.db*
3 | .vscode/c_cpp_properties.json
4 | .vscode/launch.json
5 | .vscode/ipch
6 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See http://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "platformio.platformio-ide"
6 | ],
7 | "unwantedRecommendations": [
8 | "ms-vscode.cpptools-extension-pack"
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/.vscode/settings.json:
--------------------------------------------------------------------------------
1 | {
2 | "cmake.configureOnOpen": false,
3 | "files.associations": {
4 | "*.tcc": "cpp"
5 | }
6 | }
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/README.md:
--------------------------------------------------------------------------------
1 | # diy_robotics_gripper_esp32
2 | This code initializes a system with a gripper controlled by an ESP32 microcontroller. It includes a display (SSD1306) for visual feedback and communicates with a PC over WiFi. The data format for communication between ROS and the ESP32 is defined in ``DataFormat.hpp``. The gripper's state is manipulated based on commands received from the PC, and the system responds with the updated gripper state. The code also handles network connections and displays relevant information on the screen. The main loop is empty as most of the tasks are performed in a separate task named "networkTask."
3 |
4 | 
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/images/Communication.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_esp32/images/Communication.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/lib/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for project specific (private) libraries.
3 | PlatformIO will compile them to static libraries and link into executable file.
4 |
5 | The source code of each library should be placed in a an own separate directory
6 | ("lib/your_library_name/[here are source files]").
7 |
8 | For example, see a structure of the following two libraries `Foo` and `Bar`:
9 |
10 | |--lib
11 | | |
12 | | |--Bar
13 | | | |--docs
14 | | | |--examples
15 | | | |--src
16 | | | |- Bar.c
17 | | | |- Bar.h
18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
19 | | |
20 | | |--Foo
21 | | | |- Foo.c
22 | | | |- Foo.h
23 | | |
24 | | |- README --> THIS FILE
25 | |
26 | |- platformio.ini
27 | |--src
28 | |- main.c
29 |
30 | and a contents of `src/main.c`:
31 | ```
32 | #include
33 | #include
34 |
35 | int main (void)
36 | {
37 | ...
38 | }
39 |
40 | ```
41 |
42 | PlatformIO Library Dependency Finder will find automatically dependent
43 | libraries scanning project source files.
44 |
45 | More information about PlatformIO Library Dependency Finder
46 | - https://docs.platformio.org/page/librarymanager/ldf.html
47 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/platformio.ini:
--------------------------------------------------------------------------------
1 | ; PlatformIO Project Configuration File
2 | ;
3 | ; Build options: build flags, source filter
4 | ; Upload options: custom upload port, speed and extra flags
5 | ; Library options: dependencies, extra library storages
6 | ; Advanced options: extra scripting
7 | ;
8 | ; Please visit documentation for the other options and examples
9 | ; https://docs.platformio.org/page/projectconf.html
10 |
11 | [env:esp32dev]
12 | platform = espressif32
13 | board = esp32dev
14 | framework = arduino
15 | board_build.f_cpu = 240000000L
16 | monitor_speed = 115200
17 | board_build.partitions = huge_app.csv
18 | lib_deps =
19 | fastled/FastLED@^3.6.0
20 | madhephaestus/ESP32Servo@^1.1.1
21 | thingpulse/ESP8266 and ESP32 OLED driver for SSD1306 displays@^4.4.0
22 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/src/Configuration.h:
--------------------------------------------------------------------------------
1 | #ifndef CONFIGURATION_H_
2 | #define CONFIGURATION_H_
3 |
4 | #define NETWORK_SSID "DIY-Robotics"
5 | #define NETWORK_PASSWORD "87654321"
6 | #define IP_ADDRESS 192, 168, 212, 202
7 | #define GATEWAY_IP 192, 168, 212, 1
8 | #define SUBNET_MASK 255, 255, 255, 0
9 |
10 | #endif
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/src/Gripper.hpp:
--------------------------------------------------------------------------------
1 | #ifndef GRIPPER_HPP_
2 | #define GRIPPER_HPP_
3 |
4 | #include
5 | #include
6 |
7 | //#include "OledDisplay.hpp"
8 |
9 |
10 | class Gripper {
11 | private:
12 | Servo myservo0;
13 | Servo myservo1;
14 | int servo0Pin;
15 | int servo1Pin;
16 | //OledDisplay display;
17 |
18 |
19 | public:
20 | int gripperState = 0;
21 |
22 | Gripper()
23 | {
24 | int servo0Pin = 18; // Default pins 12 and 19
25 | int servo1Pin = 19;
26 | myservo0.setPeriodHertz(50); // standard 50 hz servo
27 | myservo1.setPeriodHertz(50);
28 | myservo0.attach(servo0Pin, 500, 2500); // using min/max of 500us and 2500us
29 | // different servos may require different min/max settings
30 | // for an accurate 0 to 180 sweep
31 | myservo1.attach(servo1Pin, 500, 2500);
32 | };
33 |
34 | Gripper(int pin0, int pin1)
35 | {
36 | int servo0Pin = pin0;
37 | int servo1Pin = pin1;
38 | myservo0.setPeriodHertz(50); // standard 50 hz servo
39 | myservo1.setPeriodHertz(50);
40 | myservo0.attach(servo0Pin, 500, 2500); // using min/max of 500us and 2500us
41 | // different servos may require different min/max settings
42 | // for an accurate 0 to 180 sweep
43 | myservo1.attach(servo1Pin, 500, 2500);
44 | };
45 |
46 | ~Gripper(){};
47 |
48 |
49 | void gripperOpen()
50 | {
51 | myservo0.writeMicroseconds(1750); // range: 500-1500 (negative turning direction, 500 = maximum torque, 1500 = torque 0)
52 | myservo1.writeMicroseconds(1750); // 1500-2500 (positive turning direction, 1500 = torque 0, 2500 = maximum torque)
53 | delay(1500);
54 | myservo0.writeMicroseconds(1500); // turn off servo
55 | myservo1.writeMicroseconds(1500);
56 | delay(500);
57 | Serial.println("Gripper opened");
58 | gripperState = 0;
59 | }
60 |
61 | void gripperClose()
62 | {
63 | myservo0.writeMicroseconds(1230);
64 | myservo1.writeMicroseconds(1230);
65 | Serial.println("Gripper closed");
66 | gripperState = 1;
67 | }
68 |
69 |
70 | };
71 |
72 | #endif
73 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/src/OledDisplay.hpp:
--------------------------------------------------------------------------------
1 | #ifndef OledDisplay_HPP_
2 | #define OledDisplay_HPP_
3 |
4 | #include
5 | #include
6 | #include "SSD1306Wire.h"
7 |
8 | class OledDisplay {
9 | private:
10 | SSD1306Wire display;
11 |
12 | public:
13 | OledDisplay(int address = 0x3c, int sda = SDA, int scl = SCL) : display(address, sda, scl) {
14 | // Initialize the display
15 | display.init();
16 | display.flipScreenVertically();
17 | };
18 |
19 | ~OledDisplay() {}
20 |
21 | void DrawDisplay(String text) {
22 | // Clear the display
23 | display.clear();
24 |
25 | // Text
26 | display.setTextAlignment(TEXT_ALIGN_LEFT);
27 | display.setFont(ArialMT_Plain_16);
28 | display.drawString(0, 0, text);
29 |
30 | // Write buffer to the display
31 | display.display();
32 | }
33 | };
34 |
35 | #endif
36 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/src/communication/DataFormat.hpp:
--------------------------------------------------------------------------------
1 | #ifndef DATAFORMAT_HPP_
2 | #define DATAFORMAT_HPP_
3 |
4 | #include
5 | #include
6 |
7 | #ifdef __linux__
8 | #elif ESP32
9 | #endif
10 |
11 |
12 | // Error Codes
13 | enum class ErrorCode : uint8_t {
14 | noError = 0,
15 | errorA,
16 | errorB,
17 | errorC
18 | };
19 |
20 | namespace Communication {
21 |
22 | union PcToRobot_t {
23 | struct __attribute__((packed)) {
24 | uint8_t messageNumber;
25 | bool emergencyStop;
26 | uint8_t reserved[1];
27 |
28 | bool enablePower;
29 | bool setGripper; // 0- Open gripper, 1- Close gripper
30 | };
31 |
32 | uint8_t receiveBuffer[64];
33 | };// request;
34 |
35 |
36 | union RobotToPc_t {
37 | struct __attribute__((packed)) {
38 | uint8_t messageNumber;
39 | enum ErrorCode errorCode;
40 | uint8_t reserved[1];
41 |
42 | bool active;
43 | bool gripperState; // 0- Gripper open, 1- Gripper closed
44 |
45 | };
46 | uint8_t sendBuffer[64];
47 | };// response;
48 | }
49 |
50 | #endif
51 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/src/communication/WiFiConnection.hpp:
--------------------------------------------------------------------------------
1 | #ifndef COMMUNICATION__WiFiConnection_HPP_
2 | #define COMMUNICATION__WiFiConnection_HPP_
3 |
4 | #include
5 | #include
6 | #include
7 | #include
8 | #include
9 | #include
10 | #include
11 | #include
12 | #include
13 |
14 |
15 | #define FORMAT_LITTLEFS_IF_FAILED true
16 |
17 |
18 | class WiFiConnection {
19 | private:
20 | WiFiServer _wifiServer;
21 | bool _enable = false;
22 | WiFiClient _client;
23 |
24 | uint64_t _t_lastMessage;
25 | bool _clientConnected = false;
26 | uint32_t _receivedMessages = 0;
27 |
28 | std::string _ssid;
29 | std::string _password;
30 | uint8_t _port;
31 | std::string _clientName;
32 |
33 | std::function _callback;
34 |
35 | void _initialize() {
36 | _wifiServer = WiFiServer(_port);
37 | _wifiServer.setNoDelay(true);
38 |
39 |
40 | IPAddress ipAddress(IP_ADDRESS);
41 | IPAddress gateway(GATEWAY_IP);
42 | IPAddress subnet(SUBNET_MASK);
43 |
44 | WiFi.config(ipAddress, gateway, subnet);
45 |
46 | // if (!SPIFFS.begin()) delay(10e3);
47 | Serial.println("Connecting\n to WiFi");
48 |
49 | WiFi.persistent(false);
50 |
51 | WiFi.hostname(_clientName.c_str());
52 | WiFi.disconnect();
53 | WiFi.begin(_ssid.c_str(), _password.c_str());
54 | WiFi.setSleep(false);// this code solves my problem
55 |
56 | esp_wifi_set_ps(WIFI_PS_NONE);
57 |
58 | while (WiFi.status() != WL_CONNECTED) {
59 | Serial.print(".");
60 | delay(1000);
61 | }
62 |
63 |
64 | Serial.println("Connected to the WiFi network");
65 | Serial.println(WiFi.localIP());
66 |
67 | _client.stop();
68 | _wifiServer.close();
69 | _wifiServer.begin();
70 | }
71 |
72 | public:
73 | WiFiConnection() {};
74 |
75 | WiFiConnection(const std::string& ssid, const std::string& password, std::function callback, uint8_t socketPort, const std::string& clientName) {
76 | _ssid = ssid;
77 | _password = password;
78 | _port = socketPort;
79 | _clientName = clientName;
80 | _callback = callback;
81 | this->_initialize();
82 | };
83 |
84 | ~WiFiConnection() {
85 | _wifiServer.close();
86 | WiFi.disconnect();
87 | };
88 |
89 | void sendBinaryData(byte * pData, size_t len) {
90 | if (_client.connected()) {
91 | _client.write(pData, len);
92 | // _client.flush();
93 | }
94 | }
95 | void sendData(String data) { if (_client.connected()) _client.write((data + "\n").c_str()); }
96 | bool clientConnected() { return _clientConnected; }
97 |
98 | void loopForever(bool enable = true) {
99 | while(true) {
100 |
101 | if (WiFi.status() != WL_CONNECTED) this->_initialize();
102 |
103 | if (!_client.connected()) _client = _wifiServer.available();
104 |
105 | if (!_enable && enable) Serial.println("Enabled WiFi");
106 | else if (_enable && !enable) Serial.println("Disabled WiFi");
107 |
108 | else if (enable) {
109 | if (_client.connected()) {
110 | if (_clientConnected == false) {
111 | Serial.println("Client has connected");
112 | _receivedMessages = 0;
113 | }
114 |
115 | byte receivedData[64];
116 | byte responseData[64];
117 |
118 | if (_client.available()) {
119 | _client.readBytes(&receivedData[0], sizeof(receivedData));
120 |
121 | if (_callback(&receivedData, sizeof(receivedData), &responseData, sizeof(responseData))) {
122 | _receivedMessages++;
123 | this->sendBinaryData(&responseData[0], sizeof(responseData));
124 | }
125 | }
126 |
127 | _clientConnected = true;
128 |
129 | } else {
130 | if (_clientConnected == true) {
131 | Serial.println("Client has disconnected");
132 | }
133 |
134 | _receivedMessages = 0;
135 | _clientConnected = false;
136 | }
137 | }
138 | // _client.setNoDelay(true);
139 | _enable = enable;
140 | vTaskDelay(1);
141 | }
142 | }
143 | };
144 |
145 | #endif
--------------------------------------------------------------------------------
/diy_robotics_gripper_esp32/src/main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include "SSD1306Wire.h"
4 |
5 | #include "Configuration.h"
6 | #include "communication/WiFiConnection.hpp"
7 | #include "communication/DataFormat.hpp"
8 | #include "Gripper.hpp"
9 |
10 |
11 | // Global Parameters for Gripper
12 | int servo0Pin = 18;
13 | int servo1Pin = 19;
14 | Gripper myGripper(servo0Pin, servo1Pin);
15 |
16 |
17 | // Initialize the Display
18 | SSD1306Wire display(0x3c, SDA, SCL); // default: SCL : GPIO22; SDA: GPIO21
19 |
20 |
21 | void DrawDisplay(String text)
22 | {
23 | // Clear display
24 | display.clear();
25 |
26 | // Text
27 | display.setTextAlignment(TEXT_ALIGN_LEFT);
28 | display.setFont(ArialMT_Plain_16);
29 | display.drawString(0, 0, text);
30 |
31 | // Write the buffer to the display
32 | display.display();
33 | }
34 |
35 |
36 | bool onDataReceived(void *data, size_t len, void *response, size_t responseLen)
37 | {
38 | // Check if the received data has the expected size
39 | if (len != sizeof(Communication::PcToRobot_t))
40 | {
41 | Serial.println("Error: Unexpected size of received data");
42 | return false;
43 | }
44 |
45 | // Copy the received data into the corresponding structure
46 | Communication::PcToRobot_t receivedData;
47 | memcpy(&receivedData, data, sizeof(Communication::PcToRobot_t));
48 |
49 | // Serial.println("Received Data:");
50 | // Serial.println("Enable Power: " + String(receivedData.enablePower));
51 | // Serial.println("Message Number: " + String(receivedData.messageNumber));
52 | // Serial.println("setGripper: " + String(receivedData.setGripper));
53 | DrawDisplay("Received\nsetGripper to \n" + String(receivedData.setGripper) + " from PC");
54 |
55 | if((receivedData.setGripper == 0) && (myGripper.gripperState == 1)) // Open Gripper
56 | {
57 | myGripper.gripperOpen();
58 | }
59 |
60 | else if((receivedData.setGripper == 1) && (myGripper.gripperState == 0)) // Close Gripper
61 | {
62 | myGripper.gripperClose();
63 | }
64 |
65 | // Response for PC:
66 | Communication::RobotToPc_t responseData;
67 | responseData.messageNumber = receivedData.messageNumber + 1;
68 | responseData.errorCode = ErrorCode::noError;
69 | responseData.gripperState = myGripper.gripperState;
70 |
71 | // Copy the response into the response buffer
72 | memcpy(response, &responseData, sizeof(Communication::RobotToPc_t));
73 | return true;
74 | }
75 |
76 |
77 | void networkTask(void * parameter)
78 | {
79 | delay(5e3);
80 | DrawDisplay("Connecting\n to WiFi");
81 | WiFiConnection connection(NETWORK_SSID, NETWORK_PASSWORD, onDataReceived, 80, "ESP32_Server_Gripper");
82 | DrawDisplay("Connected\n to WiFi");
83 | connection.loopForever(true);
84 | };
85 | TaskHandle_t NetworkTask;
86 |
87 |
88 |
89 |
90 | void setup()
91 | {
92 | Serial.begin(115200);
93 |
94 | // Initialize the Display
95 | display.init();
96 | display.flipScreenVertically();
97 |
98 | // Allow allocation of all timers
99 | ESP32PWM::allocateTimer(0);
100 | ESP32PWM::allocateTimer(1);
101 | ESP32PWM::allocateTimer(2);
102 | ESP32PWM::allocateTimer(3);
103 |
104 |
105 | xTaskCreatePinnedToCore(networkTask, "networkTask", 4096*2, NULL, 17, &NetworkTask, 0);
106 | }
107 |
108 | void loop() {}
--------------------------------------------------------------------------------
/diy_robotics_gripper_pcb/README.md:
--------------------------------------------------------------------------------
1 | # diy_robotics_gripper_pcb
2 |
3 | 
4 |
5 |
6 | ① 0.96 Inch OLED Display SSD1306 (1 pcs.)
7 |
8 | ② ESP-32 (1 pcs.)
9 |
10 | ③ 2-Pin Screw Terminal 5mm (2 pcs.)
11 |
12 | ④ Pin Header 1x4 Male 2,54mm (1 pcs.)
13 |
14 | ⑤ Pin Header Female 2,54mm
15 |
16 | (① and ② are plugged into female pin header 2,54mm)
17 |
18 | 5V for the ESP32 power supply must be connected to the "VCC_ESP32" screw terminal. The power supply for the servo must be connected to the "VCC_Servo" screw terminal (6V). The servos are connected to the pin header "gripper servos".
19 |
20 | ### Schamatic
21 | 
--------------------------------------------------------------------------------
/diy_robotics_gripper_pcb/diy_robotics_gripper.kicad_prl:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "active_layer": 0,
4 | "active_layer_preset": "All Layers",
5 | "auto_track_width": true,
6 | "hidden_netclasses": [],
7 | "hidden_nets": [],
8 | "high_contrast_mode": 0,
9 | "net_color_mode": 1,
10 | "opacity": {
11 | "images": 0.75,
12 | "pads": 0.7900000214576721,
13 | "tracks": 1.0,
14 | "vias": 1.0,
15 | "zones": 0.75
16 | },
17 | "selection_filter": {
18 | "dimensions": true,
19 | "footprints": true,
20 | "graphics": true,
21 | "keepouts": true,
22 | "lockedItems": false,
23 | "otherItems": true,
24 | "pads": true,
25 | "text": true,
26 | "tracks": true,
27 | "vias": true,
28 | "zones": true
29 | },
30 | "visible_items": [
31 | 0,
32 | 1,
33 | 2,
34 | 3,
35 | 4,
36 | 5,
37 | 8,
38 | 9,
39 | 10,
40 | 11,
41 | 12,
42 | 13,
43 | 15,
44 | 16,
45 | 17,
46 | 18,
47 | 19,
48 | 20,
49 | 21,
50 | 22,
51 | 23,
52 | 24,
53 | 25,
54 | 26,
55 | 27,
56 | 28,
57 | 29,
58 | 30,
59 | 32,
60 | 33,
61 | 34,
62 | 35,
63 | 36,
64 | 39,
65 | 40
66 | ],
67 | "visible_layers": "fffffff_ffffffff",
68 | "zone_display_mode": 0
69 | },
70 | "meta": {
71 | "filename": "diy_robotics_gripper.kicad_prl",
72 | "version": 3
73 | },
74 | "project": {
75 | "files": []
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_pcb/diy_robotics_gripper.kicad_pro:
--------------------------------------------------------------------------------
1 | {
2 | "board": {
3 | "3dviewports": [],
4 | "design_settings": {
5 | "defaults": {
6 | "board_outline_line_width": 0.09999999999999999,
7 | "copper_line_width": 0.19999999999999998,
8 | "copper_text_italic": false,
9 | "copper_text_size_h": 1.5,
10 | "copper_text_size_v": 1.5,
11 | "copper_text_thickness": 0.3,
12 | "copper_text_upright": false,
13 | "courtyard_line_width": 0.049999999999999996,
14 | "dimension_precision": 4,
15 | "dimension_units": 3,
16 | "dimensions": {
17 | "arrow_length": 1270000,
18 | "extension_offset": 500000,
19 | "keep_text_aligned": true,
20 | "suppress_zeroes": false,
21 | "text_position": 0,
22 | "units_format": 1
23 | },
24 | "fab_line_width": 0.09999999999999999,
25 | "fab_text_italic": false,
26 | "fab_text_size_h": 1.0,
27 | "fab_text_size_v": 1.0,
28 | "fab_text_thickness": 0.15,
29 | "fab_text_upright": false,
30 | "other_line_width": 0.15,
31 | "other_text_italic": false,
32 | "other_text_size_h": 1.0,
33 | "other_text_size_v": 1.0,
34 | "other_text_thickness": 0.15,
35 | "other_text_upright": false,
36 | "pads": {
37 | "drill": 2.1,
38 | "height": 4.0,
39 | "width": 4.0
40 | },
41 | "silk_line_width": 0.15,
42 | "silk_text_italic": false,
43 | "silk_text_size_h": 1.0,
44 | "silk_text_size_v": 1.0,
45 | "silk_text_thickness": 0.15,
46 | "silk_text_upright": false,
47 | "zones": {
48 | "min_clearance": 0.5
49 | }
50 | },
51 | "diff_pair_dimensions": [
52 | {
53 | "gap": 0.0,
54 | "via_gap": 0.0,
55 | "width": 0.0
56 | }
57 | ],
58 | "drc_exclusions": [],
59 | "meta": {
60 | "version": 2
61 | },
62 | "rule_severities": {
63 | "annular_width": "error",
64 | "clearance": "error",
65 | "connection_width": "warning",
66 | "copper_edge_clearance": "error",
67 | "copper_sliver": "warning",
68 | "courtyards_overlap": "error",
69 | "diff_pair_gap_out_of_range": "error",
70 | "diff_pair_uncoupled_length_too_long": "error",
71 | "drill_out_of_range": "error",
72 | "duplicate_footprints": "warning",
73 | "extra_footprint": "warning",
74 | "footprint": "error",
75 | "footprint_type_mismatch": "ignore",
76 | "hole_clearance": "error",
77 | "hole_near_hole": "error",
78 | "invalid_outline": "error",
79 | "isolated_copper": "warning",
80 | "item_on_disabled_layer": "error",
81 | "items_not_allowed": "error",
82 | "length_out_of_range": "error",
83 | "lib_footprint_issues": "warning",
84 | "lib_footprint_mismatch": "warning",
85 | "malformed_courtyard": "error",
86 | "microvia_drill_out_of_range": "error",
87 | "missing_courtyard": "ignore",
88 | "missing_footprint": "warning",
89 | "net_conflict": "warning",
90 | "npth_inside_courtyard": "ignore",
91 | "padstack": "warning",
92 | "pth_inside_courtyard": "ignore",
93 | "shorting_items": "error",
94 | "silk_edge_clearance": "warning",
95 | "silk_over_copper": "warning",
96 | "silk_overlap": "warning",
97 | "skew_out_of_range": "error",
98 | "solder_mask_bridge": "error",
99 | "starved_thermal": "error",
100 | "text_height": "warning",
101 | "text_thickness": "warning",
102 | "through_hole_pad_without_hole": "error",
103 | "too_many_vias": "error",
104 | "track_dangling": "warning",
105 | "track_width": "error",
106 | "tracks_crossing": "error",
107 | "unconnected_items": "error",
108 | "unresolved_variable": "error",
109 | "via_dangling": "warning",
110 | "zones_intersect": "error"
111 | },
112 | "rules": {
113 | "max_error": 0.005,
114 | "min_clearance": 0.0,
115 | "min_connection": 0.0,
116 | "min_copper_edge_clearance": 0.0,
117 | "min_hole_clearance": 0.25,
118 | "min_hole_to_hole": 0.25,
119 | "min_microvia_diameter": 0.19999999999999998,
120 | "min_microvia_drill": 0.09999999999999999,
121 | "min_resolved_spokes": 2,
122 | "min_silk_clearance": 0.0,
123 | "min_text_height": 0.7999999999999999,
124 | "min_text_thickness": 0.08,
125 | "min_through_hole_diameter": 0.3,
126 | "min_track_width": 0.0,
127 | "min_via_annular_width": 0.09999999999999999,
128 | "min_via_diameter": 0.5,
129 | "solder_mask_clearance": 0.0,
130 | "solder_mask_min_width": 0.0,
131 | "solder_mask_to_copper_clearance": 0.0,
132 | "use_height_for_length_calcs": true
133 | },
134 | "teardrop_options": [
135 | {
136 | "td_allow_use_two_tracks": true,
137 | "td_curve_segcount": 5,
138 | "td_on_pad_in_zone": false,
139 | "td_onpadsmd": true,
140 | "td_onroundshapesonly": false,
141 | "td_ontrackend": false,
142 | "td_onviapad": true
143 | }
144 | ],
145 | "teardrop_parameters": [
146 | {
147 | "td_curve_segcount": 0,
148 | "td_height_ratio": 1.0,
149 | "td_length_ratio": 0.5,
150 | "td_maxheight": 2.0,
151 | "td_maxlen": 1.0,
152 | "td_target_name": "td_round_shape",
153 | "td_width_to_size_filter_ratio": 0.9
154 | },
155 | {
156 | "td_curve_segcount": 0,
157 | "td_height_ratio": 1.0,
158 | "td_length_ratio": 0.5,
159 | "td_maxheight": 2.0,
160 | "td_maxlen": 1.0,
161 | "td_target_name": "td_rect_shape",
162 | "td_width_to_size_filter_ratio": 0.9
163 | },
164 | {
165 | "td_curve_segcount": 0,
166 | "td_height_ratio": 1.0,
167 | "td_length_ratio": 0.5,
168 | "td_maxheight": 2.0,
169 | "td_maxlen": 1.0,
170 | "td_target_name": "td_track_end",
171 | "td_width_to_size_filter_ratio": 0.9
172 | }
173 | ],
174 | "track_widths": [
175 | 0.0
176 | ],
177 | "via_dimensions": [
178 | {
179 | "diameter": 0.0,
180 | "drill": 0.0
181 | }
182 | ],
183 | "zones_allow_external_fillets": false
184 | },
185 | "layer_presets": [],
186 | "viewports": []
187 | },
188 | "boards": [],
189 | "cvpcb": {
190 | "equivalence_files": []
191 | },
192 | "erc": {
193 | "erc_exclusions": [],
194 | "meta": {
195 | "version": 0
196 | },
197 | "pin_map": [
198 | [
199 | 0,
200 | 0,
201 | 0,
202 | 0,
203 | 0,
204 | 0,
205 | 1,
206 | 0,
207 | 0,
208 | 0,
209 | 0,
210 | 2
211 | ],
212 | [
213 | 0,
214 | 2,
215 | 0,
216 | 1,
217 | 0,
218 | 0,
219 | 1,
220 | 0,
221 | 2,
222 | 2,
223 | 2,
224 | 2
225 | ],
226 | [
227 | 0,
228 | 0,
229 | 0,
230 | 0,
231 | 0,
232 | 0,
233 | 1,
234 | 0,
235 | 1,
236 | 0,
237 | 1,
238 | 2
239 | ],
240 | [
241 | 0,
242 | 1,
243 | 0,
244 | 0,
245 | 0,
246 | 0,
247 | 1,
248 | 1,
249 | 2,
250 | 1,
251 | 1,
252 | 2
253 | ],
254 | [
255 | 0,
256 | 0,
257 | 0,
258 | 0,
259 | 0,
260 | 0,
261 | 1,
262 | 0,
263 | 0,
264 | 0,
265 | 0,
266 | 2
267 | ],
268 | [
269 | 0,
270 | 0,
271 | 0,
272 | 0,
273 | 0,
274 | 0,
275 | 0,
276 | 0,
277 | 0,
278 | 0,
279 | 0,
280 | 2
281 | ],
282 | [
283 | 1,
284 | 1,
285 | 1,
286 | 1,
287 | 1,
288 | 0,
289 | 1,
290 | 1,
291 | 1,
292 | 1,
293 | 1,
294 | 2
295 | ],
296 | [
297 | 0,
298 | 0,
299 | 0,
300 | 1,
301 | 0,
302 | 0,
303 | 1,
304 | 0,
305 | 0,
306 | 0,
307 | 0,
308 | 2
309 | ],
310 | [
311 | 0,
312 | 2,
313 | 1,
314 | 2,
315 | 0,
316 | 0,
317 | 1,
318 | 0,
319 | 2,
320 | 2,
321 | 2,
322 | 2
323 | ],
324 | [
325 | 0,
326 | 2,
327 | 0,
328 | 1,
329 | 0,
330 | 0,
331 | 1,
332 | 0,
333 | 2,
334 | 0,
335 | 0,
336 | 2
337 | ],
338 | [
339 | 0,
340 | 2,
341 | 1,
342 | 1,
343 | 0,
344 | 0,
345 | 1,
346 | 0,
347 | 2,
348 | 0,
349 | 0,
350 | 2
351 | ],
352 | [
353 | 2,
354 | 2,
355 | 2,
356 | 2,
357 | 2,
358 | 2,
359 | 2,
360 | 2,
361 | 2,
362 | 2,
363 | 2,
364 | 2
365 | ]
366 | ],
367 | "rule_severities": {
368 | "bus_definition_conflict": "error",
369 | "bus_entry_needed": "error",
370 | "bus_to_bus_conflict": "error",
371 | "bus_to_net_conflict": "error",
372 | "conflicting_netclasses": "error",
373 | "different_unit_footprint": "error",
374 | "different_unit_net": "error",
375 | "duplicate_reference": "error",
376 | "duplicate_sheet_names": "error",
377 | "endpoint_off_grid": "warning",
378 | "extra_units": "error",
379 | "global_label_dangling": "warning",
380 | "hier_label_mismatch": "error",
381 | "label_dangling": "error",
382 | "lib_symbol_issues": "warning",
383 | "missing_bidi_pin": "warning",
384 | "missing_input_pin": "warning",
385 | "missing_power_pin": "error",
386 | "missing_unit": "warning",
387 | "multiple_net_names": "warning",
388 | "net_not_bus_member": "warning",
389 | "no_connect_connected": "warning",
390 | "no_connect_dangling": "warning",
391 | "pin_not_connected": "error",
392 | "pin_not_driven": "error",
393 | "pin_to_pin": "warning",
394 | "power_pin_not_driven": "error",
395 | "similar_labels": "warning",
396 | "simulation_model_issue": "ignore",
397 | "unannotated": "error",
398 | "unit_value_mismatch": "error",
399 | "unresolved_variable": "error",
400 | "wire_dangling": "error"
401 | }
402 | },
403 | "libraries": {
404 | "pinned_footprint_libs": [],
405 | "pinned_symbol_libs": []
406 | },
407 | "meta": {
408 | "filename": "diy_robotics_gripper.kicad_pro",
409 | "version": 1
410 | },
411 | "net_settings": {
412 | "classes": [
413 | {
414 | "bus_width": 12,
415 | "clearance": 0.2,
416 | "diff_pair_gap": 0.25,
417 | "diff_pair_via_gap": 0.25,
418 | "diff_pair_width": 0.2,
419 | "line_style": 0,
420 | "microvia_diameter": 0.3,
421 | "microvia_drill": 0.1,
422 | "name": "Default",
423 | "pcb_color": "rgba(0, 0, 0, 0.000)",
424 | "schematic_color": "rgba(0, 0, 0, 0.000)",
425 | "track_width": 0.25,
426 | "via_diameter": 0.8,
427 | "via_drill": 0.4,
428 | "wire_width": 6
429 | },
430 | {
431 | "bus_width": 12,
432 | "clearance": 0.2,
433 | "diff_pair_gap": 0.25,
434 | "diff_pair_via_gap": 0.25,
435 | "diff_pair_width": 0.2,
436 | "line_style": 0,
437 | "microvia_diameter": 0.3,
438 | "microvia_drill": 0.1,
439 | "name": "ESP32_5V",
440 | "pcb_color": "rgba(0, 0, 0, 0.000)",
441 | "schematic_color": "rgba(0, 0, 0, 0.000)",
442 | "track_width": 1.0,
443 | "via_diameter": 0.8,
444 | "via_drill": 0.4,
445 | "wire_width": 6
446 | },
447 | {
448 | "bus_width": 12,
449 | "clearance": 0.2,
450 | "diff_pair_gap": 0.25,
451 | "diff_pair_via_gap": 0.25,
452 | "diff_pair_width": 0.2,
453 | "line_style": 0,
454 | "microvia_diameter": 0.3,
455 | "microvia_drill": 0.1,
456 | "name": "GND",
457 | "pcb_color": "rgba(0, 0, 0, 0.000)",
458 | "schematic_color": "rgba(0, 0, 0, 0.000)",
459 | "track_width": 1.0,
460 | "via_diameter": 0.8,
461 | "via_drill": 0.4,
462 | "wire_width": 6
463 | },
464 | {
465 | "bus_width": 12,
466 | "clearance": 0.2,
467 | "diff_pair_gap": 0.25,
468 | "diff_pair_via_gap": 0.25,
469 | "diff_pair_width": 0.2,
470 | "line_style": 0,
471 | "microvia_diameter": 0.3,
472 | "microvia_drill": 0.1,
473 | "name": "Servo_VCC",
474 | "pcb_color": "rgba(0, 0, 0, 0.000)",
475 | "schematic_color": "rgba(0, 0, 0, 0.000)",
476 | "track_width": 1.0,
477 | "via_diameter": 0.8,
478 | "via_drill": 0.4,
479 | "wire_width": 6
480 | }
481 | ],
482 | "meta": {
483 | "version": 3
484 | },
485 | "net_colors": null,
486 | "netclass_assignments": {
487 | "/5V": "ESP32_5V",
488 | "/GND": "GND",
489 | "/ServoVCC": "Servo_VCC"
490 | },
491 | "netclass_patterns": []
492 | },
493 | "pcbnew": {
494 | "last_paths": {
495 | "gencad": "",
496 | "idf": "",
497 | "netlist": "",
498 | "specctra_dsn": "",
499 | "step": "",
500 | "vrml": ""
501 | },
502 | "page_layout_descr_file": ""
503 | },
504 | "schematic": {
505 | "annotate_start_num": 0,
506 | "drawing": {
507 | "dashed_lines_dash_length_ratio": 12.0,
508 | "dashed_lines_gap_length_ratio": 3.0,
509 | "default_line_thickness": 6.0,
510 | "default_text_size": 50.0,
511 | "field_names": [],
512 | "intersheets_ref_own_page": false,
513 | "intersheets_ref_prefix": "",
514 | "intersheets_ref_short": false,
515 | "intersheets_ref_show": false,
516 | "intersheets_ref_suffix": "",
517 | "junction_size_choice": 3,
518 | "label_size_ratio": 0.375,
519 | "pin_symbol_size": 25.0,
520 | "text_offset_ratio": 0.15
521 | },
522 | "legacy_lib_dir": "",
523 | "legacy_lib_list": [],
524 | "meta": {
525 | "version": 1
526 | },
527 | "net_format_name": "",
528 | "page_layout_descr_file": "",
529 | "plot_directory": "",
530 | "spice_current_sheet_as_root": false,
531 | "spice_external_command": "spice \"%I\"",
532 | "spice_model_current_sheet_as_root": true,
533 | "spice_save_all_currents": false,
534 | "spice_save_all_voltages": false,
535 | "subpart_first_id": 65,
536 | "subpart_id_separator": 0
537 | },
538 | "sheets": [
539 | [
540 | "fb80361b-bbed-469d-a422-8d17a3d00537",
541 | ""
542 | ]
543 | ],
544 | "text_variables": {}
545 | }
546 |
--------------------------------------------------------------------------------
/diy_robotics_gripper_pcb/diy_robotics_gripper.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_pcb/diy_robotics_gripper.zip
--------------------------------------------------------------------------------
/diy_robotics_gripper_pcb/images/pcb_gripper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_pcb/images/pcb_gripper.png
--------------------------------------------------------------------------------
/diy_robotics_gripper_pcb/images/schematic_gripper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/diy_robotics_gripper_pcb/images/schematic_gripper.png
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/Gripper_via_SerialMonitor/.gitignore:
--------------------------------------------------------------------------------
1 | .pio
2 | .vscode/.browse.c_cpp.db*
3 | .vscode/c_cpp_properties.json
4 | .vscode/launch.json
5 | .vscode/ipch
6 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/Gripper_via_SerialMonitor/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See http://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "platformio.platformio-ide"
6 | ],
7 | "unwantedRecommendations": [
8 | "ms-vscode.cpptools-extension-pack"
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/Gripper_via_SerialMonitor/include/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for project header files.
3 |
4 | A header file is a file containing C declarations and macro definitions
5 | to be shared between several project source files. You request the use of a
6 | header file in your project source file (C, C++, etc) located in `src` folder
7 | by including it, with the C preprocessing directive `#include'.
8 |
9 | ```src/main.c
10 |
11 | #include "header.h"
12 |
13 | int main (void)
14 | {
15 | ...
16 | }
17 | ```
18 |
19 | Including a header file produces the same results as copying the header file
20 | into each source file that needs it. Such copying would be time-consuming
21 | and error-prone. With a header file, the related declarations appear
22 | in only one place. If they need to be changed, they can be changed in one
23 | place, and programs that include the header file will automatically use the
24 | new version when next recompiled. The header file eliminates the labor of
25 | finding and changing all the copies as well as the risk that a failure to
26 | find one copy will result in inconsistencies within a program.
27 |
28 | In C, the usual convention is to give header files names that end with `.h'.
29 | It is most portable to use only letters, digits, dashes, and underscores in
30 | header file names, and at most one dot.
31 |
32 | Read more about using header files in official GCC documentation:
33 |
34 | * Include Syntax
35 | * Include Operation
36 | * Once-Only Headers
37 | * Computed Includes
38 |
39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
40 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/Gripper_via_SerialMonitor/lib/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for project specific (private) libraries.
3 | PlatformIO will compile them to static libraries and link into executable file.
4 |
5 | The source code of each library should be placed in a an own separate directory
6 | ("lib/your_library_name/[here are source files]").
7 |
8 | For example, see a structure of the following two libraries `Foo` and `Bar`:
9 |
10 | |--lib
11 | | |
12 | | |--Bar
13 | | | |--docs
14 | | | |--examples
15 | | | |--src
16 | | | |- Bar.c
17 | | | |- Bar.h
18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
19 | | |
20 | | |--Foo
21 | | | |- Foo.c
22 | | | |- Foo.h
23 | | |
24 | | |- README --> THIS FILE
25 | |
26 | |- platformio.ini
27 | |--src
28 | |- main.c
29 |
30 | and a contents of `src/main.c`:
31 | ```
32 | #include
33 | #include
34 |
35 | int main (void)
36 | {
37 | ...
38 | }
39 |
40 | ```
41 |
42 | PlatformIO Library Dependency Finder will find automatically dependent
43 | libraries scanning project source files.
44 |
45 | More information about PlatformIO Library Dependency Finder
46 | - https://docs.platformio.org/page/librarymanager/ldf.html
47 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/Gripper_via_SerialMonitor/platformio.ini:
--------------------------------------------------------------------------------
1 | ; PlatformIO Project Configuration File
2 | ;
3 | ; Build options: build flags, source filter
4 | ; Upload options: custom upload port, speed and extra flags
5 | ; Library options: dependencies, extra library storages
6 | ; Advanced options: extra scripting
7 | ;
8 | ; Please visit documentation for the other options and examples
9 | ; https://docs.platformio.org/page/projectconf.html
10 |
11 | [env:esp32dev]
12 | platform = espressif32
13 | board = esp32dev
14 | framework = arduino
15 | lib_deps =
16 | madhephaestus/ESP32Servo@^1.1.1
17 | thingpulse/ESP8266 and ESP32 OLED driver for SSD1306 displays@^4.4.0
18 | monitor_speed = 115200
19 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/Gripper_via_SerialMonitor/src/Gripper.hpp:
--------------------------------------------------------------------------------
1 | #ifndef GRIPPER_HPP_
2 | #define GRIPPER_HPP_
3 |
4 | #include
5 | #include
6 |
7 | //#include "OledDisplay.hpp"
8 |
9 |
10 | class Gripper {
11 | private:
12 | Servo myservo0;
13 | Servo myservo1;
14 | int servo0Pin;
15 | int servo1Pin;
16 | //OledDisplay display;
17 |
18 |
19 | public:
20 | int gripperState = 0;
21 |
22 | Gripper()
23 | {
24 | int servo0Pin = 18; // Default pins 12 and 19
25 | int servo1Pin = 19;
26 | myservo0.setPeriodHertz(50); // standard 50 hz servo
27 | myservo1.setPeriodHertz(50);
28 | myservo0.attach(servo0Pin, 500, 2500); // using min/max of 500us and 2500us
29 | // different servos may require different min/max settings
30 | // for an accurate 0 to 180 sweep
31 | myservo1.attach(servo1Pin, 500, 2500);
32 | };
33 |
34 | Gripper(int pin0, int pin1)
35 | {
36 | int servo0Pin = pin0;
37 | int servo1Pin = pin1;
38 | myservo0.setPeriodHertz(50); // standard 50 hz servo
39 | myservo1.setPeriodHertz(50);
40 | myservo0.attach(servo0Pin, 500, 2500); // using min/max of 500us and 2500us
41 | // different servos may require different min/max settings
42 | // for an accurate 0 to 180 sweep
43 | myservo1.attach(servo1Pin, 500, 2500);
44 | };
45 |
46 | ~Gripper(){};
47 |
48 |
49 | void gripperOpen()
50 | {
51 | myservo0.writeMicroseconds(1000); // range: 500-1500 (negative turning direction, 500 = maximum torque, 1500 = torque 0)
52 | myservo1.writeMicroseconds(1000); // 1500-2500 (positive turning direction, 1500 = torque 0, 2500 = maximum torque)
53 | delay(500);
54 | myservo0.writeMicroseconds(1500); // turn off servo
55 | myservo1.writeMicroseconds(1500);
56 | delay(500);
57 | Serial.println("Gripper opened");
58 | gripperState = 0;
59 | }
60 |
61 | void gripperClose()
62 | {
63 | myservo0.writeMicroseconds(2000);
64 | myservo1.writeMicroseconds(2000);
65 | Serial.println("Gripper closed");
66 | gripperState = 1;
67 | }
68 |
69 |
70 | };
71 |
72 | #endif
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/Gripper_via_SerialMonitor/src/main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include "SSD1306Wire.h"
4 |
5 | #include "Gripper.hpp"
6 |
7 |
8 | // Global Parameters for Gripper
9 | int servo0Pin = 18;
10 | int servo1Pin = 19;
11 | Gripper myGripper(servo0Pin, servo1Pin);
12 |
13 |
14 | // Initialize the Display
15 | SSD1306Wire display(0x3c, SDA, SCL); // default: SCL : GPIO22; SDA: GPIO21
16 |
17 |
18 | void DrawDisplay(String text)
19 | {
20 | // Clear display
21 | display.clear();
22 |
23 | // Text
24 | display.setTextAlignment(TEXT_ALIGN_LEFT);
25 | display.setFont(ArialMT_Plain_16);
26 | display.drawString(0, 0, text);
27 |
28 | // Write the buffer to the display
29 | display.display();
30 | }
31 |
32 | void gripperControl(int command)
33 | {
34 | DrawDisplay("Received\nsetGripper to \n" + String(command) + " from Serial");
35 |
36 | if ((command == 0) && (myGripper.gripperState == 1)) // Open Gripper
37 | {
38 | myGripper.gripperOpen();
39 | }
40 | else if ((command == 1) && (myGripper.gripperState == 0)) // Close Gripper
41 | {
42 | myGripper.gripperClose();
43 | }
44 | }
45 |
46 |
47 | void setup()
48 | {
49 | Serial.begin(115200);
50 |
51 | // Initialize the Display
52 | display.init();
53 | display.flipScreenVertically();
54 | }
55 |
56 | void loop()
57 | {
58 | if (Serial.available() > 0)
59 | {
60 | int command = Serial.parseInt();
61 | if (command >= 0 && command <= 1)
62 | {
63 | gripperControl(command);
64 |
65 | // Display current gripper state
66 | DrawDisplay("Gripper State: " + String(myGripper.gripperState));
67 | }
68 | else
69 | {
70 | Serial.println("Invalid input. Please enter 0 or 1.");
71 | }
72 | }
73 | }
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/Gripper_via_SerialMonitor/test/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for PlatformIO Test Runner and project tests.
3 |
4 | Unit Testing is a software testing method by which individual units of
5 | source code, sets of one or more MCU program modules together with associated
6 | control data, usage procedures, and operating procedures, are tested to
7 | determine whether they are fit for use. Unit testing finds problems early
8 | in the development cycle.
9 |
10 | More information about PlatformIO Unit Testing:
11 | - https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
12 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/README.md:
--------------------------------------------------------------------------------
1 | # hardwaretest_without_ROS
2 |
3 | The PlatformIO projects [Gripper_via_SerialMonitor](https://github.com/mathias31415/diy_robotics/tree/main/hardwaretest_without_ROS/Gripper_via_SerialMonitor) and [SixAxis_via_SerialMonitor](https://github.com/mathias31415/diy_robotics/tree/main/hardwaretest_without_ROS/SixAxis_via_SerialMonitor) work with the PCB provided in this repo. The gripper can be opened and closed by entering 0 and 1 in the Serial Monitor. The axes can be moved in both directions using the buttons that can be found in the program code. However, the axes must first be enabled with "n" (disable with "m").
4 |
5 |
6 | For the PlattformIO project [StepperTest_ArduinoUno](https://github.com/mathias31415/diy_robotics/tree/main/hardwaretest_without_ROS/StepperTest_ArduinoUno), the stepper and the ArduinoUno must be connected as follows:
7 |
8 | 
9 |
10 | The stepper can be moved via the serial monitor using the "f" and "r" keys. This is helpful when assembling the robot.
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/SixAxis_via_SerialMonitor/.gitignore:
--------------------------------------------------------------------------------
1 | .pio
2 | .vscode/.browse.c_cpp.db*
3 | .vscode/c_cpp_properties.json
4 | .vscode/launch.json
5 | .vscode/ipch
6 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/SixAxis_via_SerialMonitor/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See http://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "platformio.platformio-ide"
6 | ],
7 | "unwantedRecommendations": [
8 | "ms-vscode.cpptools-extension-pack"
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/SixAxis_via_SerialMonitor/Achsensteuerung_per_SerielleDaten.code-workspace:
--------------------------------------------------------------------------------
1 | {
2 | "folders": [
3 | {
4 | "name": "Achsensteuerung_per_SerielleDaten",
5 | "path": "."
6 | }
7 | ],
8 | "settings": {}
9 | }
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/SixAxis_via_SerialMonitor/include/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for project header files.
3 |
4 | A header file is a file containing C declarations and macro definitions
5 | to be shared between several project source files. You request the use of a
6 | header file in your project source file (C, C++, etc) located in `src` folder
7 | by including it, with the C preprocessing directive `#include'.
8 |
9 | ```src/main.c
10 |
11 | #include "header.h"
12 |
13 | int main (void)
14 | {
15 | ...
16 | }
17 | ```
18 |
19 | Including a header file produces the same results as copying the header file
20 | into each source file that needs it. Such copying would be time-consuming
21 | and error-prone. With a header file, the related declarations appear
22 | in only one place. If they need to be changed, they can be changed in one
23 | place, and programs that include the header file will automatically use the
24 | new version when next recompiled. The header file eliminates the labor of
25 | finding and changing all the copies as well as the risk that a failure to
26 | find one copy will result in inconsistencies within a program.
27 |
28 | In C, the usual convention is to give header files names that end with `.h'.
29 | It is most portable to use only letters, digits, dashes, and underscores in
30 | header file names, and at most one dot.
31 |
32 | Read more about using header files in official GCC documentation:
33 |
34 | * Include Syntax
35 | * Include Operation
36 | * Once-Only Headers
37 | * Computed Includes
38 |
39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
40 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/SixAxis_via_SerialMonitor/lib/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for project specific (private) libraries.
3 | PlatformIO will compile them to static libraries and link into executable file.
4 |
5 | The source code of each library should be placed in a an own separate directory
6 | ("lib/your_library_name/[here are source files]").
7 |
8 | For example, see a structure of the following two libraries `Foo` and `Bar`:
9 |
10 | |--lib
11 | | |
12 | | |--Bar
13 | | | |--docs
14 | | | |--examples
15 | | | |--src
16 | | | |- Bar.c
17 | | | |- Bar.h
18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
19 | | |
20 | | |--Foo
21 | | | |- Foo.c
22 | | | |- Foo.h
23 | | |
24 | | |- README --> THIS FILE
25 | |
26 | |- platformio.ini
27 | |--src
28 | |- main.c
29 |
30 | and a contents of `src/main.c`:
31 | ```
32 | #include
33 | #include
34 |
35 | int main (void)
36 | {
37 | ...
38 | }
39 |
40 | ```
41 |
42 | PlatformIO Library Dependency Finder will find automatically dependent
43 | libraries scanning project source files.
44 |
45 | More information about PlatformIO Library Dependency Finder
46 | - https://docs.platformio.org/page/librarymanager/ldf.html
47 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/SixAxis_via_SerialMonitor/platformio.ini:
--------------------------------------------------------------------------------
1 | ; PlatformIO Project Configuration File
2 | ;
3 | ; Build options: build flags, source filter
4 | ; Upload options: custom upload port, speed and extra flags
5 | ; Library options: dependencies, extra library storages
6 | ; Advanced options: extra scripting
7 | ;
8 | ; Please visit documentation for the other options and examples
9 | ; https://docs.platformio.org/page/projectconf.html
10 |
11 | [env:esp32dev]
12 | platform = espressif32
13 | board = esp32dev
14 | framework = arduino
15 | monitor_speed = 115200
16 | lib_deps =
17 | waspinator/AccelStepper@^1.64
18 | thingpulse/ESP8266 and ESP32 OLED driver for SSD1306 displays@^4.4.0
19 |
20 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/SixAxis_via_SerialMonitor/src/main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 | #include
4 |
5 | #include
6 | #include "SSD1306Wire.h"
7 |
8 |
9 | //Motor Pins Config
10 | #define step1 16
11 | #define dir1 13
12 | #define step2 18
13 | #define dir2 17
14 | #define step3 5
15 | #define dir3 19
16 | #define step4 25
17 | #define dir4 23
18 | #define step5 27
19 | #define dir5 26
20 | #define step6 33
21 | #define dir6 32
22 |
23 | #define enableAll 4
24 |
25 | // define Stepper Variables
26 | int mshand = 16;
27 | float sthand = 7.5; //deg per step
28 | float handSpeed = 1000 * mshand/sthand;
29 | float handAcc = 500*mshand/sthand;
30 | int handpos = 360*mshand/sthand;
31 |
32 | int msarm = 16;
33 | float starm = 1.8; //deg per step
34 | float armSpeed = 500 * msarm/starm;
35 | float armAcc = 300*msarm/starm;
36 | int armpos = 360*msarm/starm;
37 |
38 | bool enable = false;
39 |
40 | //init stepper objects
41 | AccelStepper M1(AccelStepper::DRIVER, step1, dir1);
42 | AccelStepper M2(AccelStepper::DRIVER, step2, dir2);
43 | AccelStepper M3(AccelStepper::DRIVER, step3, dir3);
44 | AccelStepper M4(AccelStepper::DRIVER, step4, dir4);
45 | AccelStepper M5(AccelStepper::DRIVER, step5, dir5);
46 | AccelStepper M6(AccelStepper::DRIVER, step6, dir6);
47 |
48 |
49 | // Initialize the display
50 | SSD1306Wire display(0x3c, SDA, SCL);; // default: SCL : GPIO22; SDA: GPIO21
51 |
52 | void setup() {
53 | Serial.begin(115200);
54 |
55 | // Initialize the display
56 | display.init();
57 | // display.flipScreenVertically();
58 |
59 | pinMode(enableAll, OUTPUT);
60 |
61 | pinMode(step1, OUTPUT);
62 | pinMode(dir1, OUTPUT);
63 | M1.setMaxSpeed(armSpeed);
64 | M1.setAcceleration(armAcc);
65 |
66 | pinMode(step2, OUTPUT);
67 | pinMode(dir2, OUTPUT);
68 | M2.setMaxSpeed(armSpeed);
69 | M2.setAcceleration(armAcc);
70 |
71 | pinMode(step3, OUTPUT);
72 | pinMode(dir3, OUTPUT);
73 | M3.setMaxSpeed(armSpeed);
74 | M3.setAcceleration(armAcc);
75 |
76 | pinMode(step4, OUTPUT);
77 | pinMode(dir4, OUTPUT);
78 | M4.setMaxSpeed(handSpeed);
79 | M4.setAcceleration(handAcc);
80 |
81 | pinMode(step5, OUTPUT);
82 | pinMode(dir5, OUTPUT);
83 | M5.setMaxSpeed(handSpeed);
84 | M5.setAcceleration(handAcc);
85 |
86 | pinMode(step6, OUTPUT);
87 | pinMode(dir6, OUTPUT);
88 | M6.setMaxSpeed(handSpeed);
89 | M6.setAcceleration(handAcc);
90 |
91 |
92 | }
93 |
94 | void DrawStateDisplay(String text)
95 | {
96 | // clear the display
97 | display.clear();
98 |
99 | // Text
100 | display.setTextAlignment(TEXT_ALIGN_LEFT);
101 | display.setFont(ArialMT_Plain_16);
102 | display.drawString(0, 0, text);
103 |
104 | // write the buffer to the display
105 | display.display();
106 | }
107 |
108 | void loop() {
109 | M1.run();
110 | M2.run();
111 | M3.run();
112 | M4.run();
113 | M5.run();
114 | M6.run();
115 |
116 | //Serial.println(enable);
117 |
118 | while(Serial.available() > 0){
119 | byte task = Serial.read();
120 |
121 | switch(task){
122 | case 'q':
123 | M1.move(-armpos);
124 | Serial.println("M1 forward");
125 | DrawStateDisplay("M1 forward");
126 | break;
127 | case 'a':
128 | M1.move(armpos);
129 | Serial.println("M1 reverse");
130 | DrawStateDisplay("M1 reverse");
131 | break;
132 | case 'w':
133 | M2.move(armpos);
134 | Serial.println("M2 forward");
135 | DrawStateDisplay("M2 forward");
136 | break;
137 | case 's':
138 | M2.move(-armpos);
139 | Serial.println("M2 reverse");
140 | DrawStateDisplay("M2 reverse");
141 | break;
142 | case 'e':
143 | M3.move(-armpos);
144 | Serial.println("M3 forward");
145 | DrawStateDisplay("M3 forward");
146 | break;
147 | case 'd':
148 | M3.move(armpos);
149 | Serial.println("M3 reverse");
150 | DrawStateDisplay("M3 reverse");
151 | break;
152 | case 'r':
153 | M4.move(-handpos);
154 | Serial.println("M4 forward");
155 | DrawStateDisplay("M4 forward");
156 | break;
157 | case 'f':
158 | M4.move(handpos);
159 | Serial.println("M4 reverse");
160 | DrawStateDisplay("M4 reverse");
161 | break;
162 | case 't':
163 | M5.move(handpos);
164 | Serial.println("M5 forward");
165 | DrawStateDisplay("M5 forward");
166 | break;
167 | case 'g':
168 | M5.move(-handpos);
169 | Serial.println("M5 reverse");
170 | DrawStateDisplay("M5 reverse");
171 | break;
172 | case 'z':
173 | M6.move(-handpos);
174 | Serial.println("M6 forward");
175 | DrawStateDisplay("M6 forward");
176 | break;
177 | case 'h':
178 | M6.move(handpos);
179 | Serial.println("M6 reverse");
180 | DrawStateDisplay("M6 reverse");
181 | break;
182 | case 'n':
183 | digitalWrite(enableAll, HIGH);
184 | Serial.println("Enable all Axis");
185 | DrawStateDisplay("Enable all Axis");
186 | enable = true;
187 | break;
188 | case 'm':
189 | digitalWrite(enableAll, LOW);
190 | Serial.println("Disable all Axis");
191 | DrawStateDisplay("Disable all Axis");
192 | enable = false;
193 | break;
194 | }
195 | }
196 |
197 |
198 |
199 | }
200 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/SixAxis_via_SerialMonitor/test/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for PlatformIO Test Runner and project tests.
3 |
4 | Unit Testing is a software testing method by which individual units of
5 | source code, sets of one or more MCU program modules together with associated
6 | control data, usage procedures, and operating procedures, are tested to
7 | determine whether they are fit for use. Unit testing finds problems early
8 | in the development cycle.
9 |
10 | More information about PlatformIO Unit Testing:
11 | - https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
12 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/.gitignore:
--------------------------------------------------------------------------------
1 | .pio
2 | .vscode/.browse.c_cpp.db*
3 | .vscode/c_cpp_properties.json
4 | .vscode/launch.json
5 | .vscode/ipch
6 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/.vscode/extensions.json:
--------------------------------------------------------------------------------
1 | {
2 | // See http://go.microsoft.com/fwlink/?LinkId=827846
3 | // for the documentation about the extensions.json format
4 | "recommendations": [
5 | "platformio.platformio-ide"
6 | ],
7 | "unwantedRecommendations": [
8 | "ms-vscode.cpptools-extension-pack"
9 | ]
10 | }
11 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/Stepper_w_Accelstepper.ino:
--------------------------------------------------------------------------------
1 | #include
2 | #include
3 |
4 |
5 | const int stepPin = 9;
6 | const int directionPin = 7;
7 | char task;2
8 | const float st = 7.5; // 7.5 = Minibea // 1.8 = NEMA
9 | //const float st = 1.8; // 7.5 = Minibea // 1.8 = NEMA
10 | const int ms =50;
11 |
12 | AccelStepper TestMotor(AccelStepper::DRIVER, stepPin, directionPin);
13 |
14 | void setup() {
15 | Serial.begin(115200);
16 |
17 | pinMode(stepPin, OUTPUT);
18 | pinMode(directionPin, OUTPUT);
19 | pinMode(13, OUTPUT);
20 | digitalWrite(13,HIGH);
21 |
22 | TestMotor.setMaxSpeed(500 * ms/st); //Steps/s
23 | TestMotor.setAcceleration(250*ms/st); //Steps/s²
24 |
25 | }
26 |
27 | void loop() {
28 | TestMotor.run();
29 | //Serial.println(TestMotor.distanceToGo());
30 |
31 |
32 | while (Serial.available() > 0){
33 | task = Serial.read();
34 |
35 | if(task == 'r'){
36 | TestMotor.move(-360*ms/st);
37 | Serial.println("CCW movement");
38 | }
39 | else if(task == 'f'){
40 | TestMotor.move(360*ms/st); //200 = 1 Stepperumdrehung
41 | Serial.println("CW movement");
42 | }
43 |
44 | }
45 |
46 | }
47 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/fritzing_stepper_test.fzz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/hardwaretest_without_ROS/StepperTest_ArduinoUno/fritzing_stepper_test.fzz
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/fritzing_stepper_test.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/hardwaretest_without_ROS/StepperTest_ArduinoUno/fritzing_stepper_test.png
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/include/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for project header files.
3 |
4 | A header file is a file containing C declarations and macro definitions
5 | to be shared between several project source files. You request the use of a
6 | header file in your project source file (C, C++, etc) located in `src` folder
7 | by including it, with the C preprocessing directive `#include'.
8 |
9 | ```src/main.c
10 |
11 | #include "header.h"
12 |
13 | int main (void)
14 | {
15 | ...
16 | }
17 | ```
18 |
19 | Including a header file produces the same results as copying the header file
20 | into each source file that needs it. Such copying would be time-consuming
21 | and error-prone. With a header file, the related declarations appear
22 | in only one place. If they need to be changed, they can be changed in one
23 | place, and programs that include the header file will automatically use the
24 | new version when next recompiled. The header file eliminates the labor of
25 | finding and changing all the copies as well as the risk that a failure to
26 | find one copy will result in inconsistencies within a program.
27 |
28 | In C, the usual convention is to give header files names that end with `.h'.
29 | It is most portable to use only letters, digits, dashes, and underscores in
30 | header file names, and at most one dot.
31 |
32 | Read more about using header files in official GCC documentation:
33 |
34 | * Include Syntax
35 | * Include Operation
36 | * Once-Only Headers
37 | * Computed Includes
38 |
39 | https://gcc.gnu.org/onlinedocs/cpp/Header-Files.html
40 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/lib/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for project specific (private) libraries.
3 | PlatformIO will compile them to static libraries and link into executable file.
4 |
5 | The source code of each library should be placed in a an own separate directory
6 | ("lib/your_library_name/[here are source files]").
7 |
8 | For example, see a structure of the following two libraries `Foo` and `Bar`:
9 |
10 | |--lib
11 | | |
12 | | |--Bar
13 | | | |--docs
14 | | | |--examples
15 | | | |--src
16 | | | |- Bar.c
17 | | | |- Bar.h
18 | | | |- library.json (optional, custom build options, etc) https://docs.platformio.org/page/librarymanager/config.html
19 | | |
20 | | |--Foo
21 | | | |- Foo.c
22 | | | |- Foo.h
23 | | |
24 | | |- README --> THIS FILE
25 | |
26 | |- platformio.ini
27 | |--src
28 | |- main.c
29 |
30 | and a contents of `src/main.c`:
31 | ```
32 | #include
33 | #include
34 |
35 | int main (void)
36 | {
37 | ...
38 | }
39 |
40 | ```
41 |
42 | PlatformIO Library Dependency Finder will find automatically dependent
43 | libraries scanning project source files.
44 |
45 | More information about PlatformIO Library Dependency Finder
46 | - https://docs.platformio.org/page/librarymanager/ldf.html
47 |
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/platformio.ini:
--------------------------------------------------------------------------------
1 | ; PlatformIO Project Configuration File
2 | ;
3 | ; Build options: build flags, source filter
4 | ; Upload options: custom upload port, speed and extra flags
5 | ; Library options: dependencies, extra library storages
6 | ; Advanced options: extra scripting
7 | ;
8 | ; Please visit documentation for the other options and examples
9 | ; https://docs.platformio.org/page/projectconf.html
10 |
11 | [env:uno]
12 | platform = atmelavr
13 | board = uno
14 | framework = arduino
15 | lib_deps = waspinator/AccelStepper@^1.64
16 | monitor_speed = 115200
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/src/main.cpp:
--------------------------------------------------------------------------------
1 | #include
2 |
3 | #include
4 | #include
5 |
6 |
7 | const int stepPin = 9;
8 | const int directionPin = 6;
9 | char task;
10 | const float st = 7.5; // 7.5 = Minibea // 1.8 = NEMA
11 | //const float st = 1.8; // 7.5 = Minibea // 1.8 = NEMA
12 | const int ms =50;
13 |
14 | AccelStepper TestMotor(AccelStepper::DRIVER, stepPin, directionPin);
15 |
16 | void setup() {
17 | Serial.begin(115200);
18 |
19 | pinMode(stepPin, OUTPUT);
20 | pinMode(directionPin, OUTPUT);
21 | pinMode(13, OUTPUT);
22 | digitalWrite(13,HIGH);
23 |
24 | //TestMotor.setMaxSpeed(500 * ms/st); //Steps/s
25 | //TestMotor.setAcceleration(250*ms/st); //Steps/s²
26 | TestMotor.setMaxSpeed(600 * ms/st); //Steps/s
27 | TestMotor.setAcceleration(300*ms/st); //Steps/s²
28 |
29 | }
30 |
31 | void loop() {
32 | TestMotor.run();
33 | //Serial.println(TestMotor.distanceToGo());
34 |
35 | // Serial.println("1");
36 | // TestMotor.move(-360*ms/st);
37 | // Serial.println("2");
38 | // delay(1000);
39 | // Serial.println("3");
40 | // TestMotor.move(360*ms/st); //200 = 1 Stepper rotation
41 | // Serial.println("4");
42 | // delay(1000);
43 |
44 | // control with buttons
45 | while (Serial.available() > 0){
46 | task = Serial.read();
47 |
48 | if(task == 'r'){
49 | TestMotor.move(-360*ms/st);
50 | Serial.println("CCW movement");
51 | }
52 | else if(task == 'f'){
53 | TestMotor.move(360*ms/st); //200 = 1 Stepper rotation
54 | Serial.println("CW movement");
55 | }
56 |
57 | }
58 |
59 | }
--------------------------------------------------------------------------------
/hardwaretest_without_ROS/StepperTest_ArduinoUno/test/README:
--------------------------------------------------------------------------------
1 |
2 | This directory is intended for PlatformIO Test Runner and project tests.
3 |
4 | Unit Testing is a software testing method by which individual units of
5 | source code, sets of one or more MCU program modules together with associated
6 | control data, usage procedures, and operating procedures, are tested to
7 | determine whether they are fit for use. Unit testing finds problems early
8 | in the development cycle.
9 |
10 | More information about PlatformIO Unit Testing:
11 | - https://docs.platformio.org/en/latest/advanced/unit-testing/index.html
12 |
--------------------------------------------------------------------------------
/images/Robot_blur.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/Robot_blur.png
--------------------------------------------------------------------------------
/images/VideoPreview.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/VideoPreview.png
--------------------------------------------------------------------------------
/images/VideoPreviewPfuscher666.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/VideoPreviewPfuscher666.png
--------------------------------------------------------------------------------
/images/application_packages_new.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/application_packages_new.png
--------------------------------------------------------------------------------
/images/description_packages.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/description_packages.png
--------------------------------------------------------------------------------
/images/driver_packages.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/driver_packages.png
--------------------------------------------------------------------------------
/images/image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/image.png
--------------------------------------------------------------------------------
/images/pcb_arm_and_gripper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/pcb_arm_and_gripper.png
--------------------------------------------------------------------------------
/images/staged_build_new.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/mathias31415/diy_robotics/9428eacdf2ee3efc5b5d4357d50fd8f6561f5de5/images/staged_build_new.png
--------------------------------------------------------------------------------