# armCtl ### Summary A suite of software useful in experimenting with small robotic arms. Use as a teaching framework with a low barrier to entry for robotics and programming. ### History Whilst an expansive scope, the principal development and implementation happened over 3 days in the summer of 2019. ## Software Components 1. An Arduino firmware to recieve commands and position the robot arm. * firmware/armCtl/armCtl.ino 1. A streaming serial command & control protocol to communicate with the Arduino from a computer. 1. A Python3 module that is a threaded serial reader/writer, and state machine for the arm. * robot.py 1. An Antlr4 domain-specific scripting language for maneuvering the robot. * ArmControl.g4 1. A Python3 implementation of that language for the Robot module. * ArmCtlListener.py 1. A Python3 module to interface the scripting language to the robot module. When called directly, this module also provides an interactive shell for the scripting language. * armCtl.py ## Hardware Components This BOM is one possible configuration. Substitute parts are available, and any servo controlled arm is acceptable. | Part | Cost | |------|------| | [Arduino Uno](https://store.arduino.cc/usa/arduino-uno-rev3/) | $22 | | [Arduino Sensor Shield V5](https://www.amazon.com/Sensor-Shield-Digital-Arduino-Duemilanove/dp/B01FDH8SM6/ref=sr_1_4?keywords=Arduino+Sensor+Shield+V5&qid=1564509416&s=gateway&sr=8-4)| $7.19 | | [Power Supply 25W 5V 5A](https://www.mouser.com/ProductDetail/?qs=pqZ7J9Gt%2FmqXHOzlkOY2rg%3D%3D)| $9.50 | | [6-Axis Desktop Robotic Arm](https://www.amazon.com/gp/product/B00UMOSQCI/ref=ppx_yo_dt_b_search_asin_title?ie=UTF8&psc=1) | $170 | ## Activities * Control the arm interactively. ```none > ./armCtl.py command# go jib 90 command# wait command# go home ``` * Script a simple sequence of moves. ```bash # my_script.txt go jib 90 wait go home > ./armCtl.py my_script.txt ``` * Write a Python3 script for complex movements. ```python #!/usr/bin/env python3 import armCtl as arm command("go home") arm.r.target = [90, 120, 10, 95, 90, 90] arm.r.move() while arm.r.isMoving(): pass print(arm.r.angle) ```