├── .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 | [![Video abspielen](images/VideoPreview.png)](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 | ![Robot_blur](images/Robot_blur.png) 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 | ![img7](diy_robotics_gripper_cad/images/img7.png) 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 | ![pcb_arm_and_gripper](images/pcb_arm_and_gripper.png) 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 | [![Video abspielen](images/VideoPreviewPfuscher666.png)](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 | ![description_packages](../images/description_packages.png) 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 | ![driver_packages](../images/driver_packages.png) 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 | ![application_packages](../images/application_packages_new.png) 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 | ![staged_build](../images/staged_build_new.png) 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 | ![Communication](images/Communication.png) 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 | ![pcb_arm](images/pcb_arm.png) 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 | ![schametic_arm](images/schematic_arm.png) 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 | ![img8](images/img8.png) 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 | ![img1](images/img1.png) 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 | ![img2](images/img2.png) 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 | ![img3](images/img3.png) 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 | ![img4](images/img4.png) 57 | 58 | ## 5. mount gripper jaws 59 | Screw the gripper jaws to the holder (Use 4x screw ⑬). 60 | 61 | ![img5](images/img5.png) 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 | ![img6](images/img6.png) 68 | ![img7](images/img7.png) 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 | ![Communication](images/Communication.png) -------------------------------------------------------------------------------- /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 | ![pcb_gripper](images/pcb_gripper.png) 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 | ![schametic_gripper](images/schematic_gripper.png) -------------------------------------------------------------------------------- /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 | ![fritzing_stepper_test](StepperTest_ArduinoUno/fritzing_stepper_test.png) 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 --------------------------------------------------------------------------------