Recently a few of the team here at Slant have been working with several teachers to integrate 3D printing and design into classrooms so that they can modify and create parts for the LittleArm arduino robot arm. There are several challenges with this, which we will discuss in the future. But the worst is actually finding 3D design software that teachers, and younger students can get started with easily. There are really only two 3D design, or CAD programs that work well for teachers. Sketchup and TinkerCAD. Other programs such as Autodesk 360 and Solidworks can be too complex to start with for kids below 5th grade. In this post we will try to lay out the good and bad of both programs to help you make a decision. Sketchup Pros -Clear References within the 3D Space - Uses Sketch-Extrude means of creating shapes (like more advanced programs) - Fairly Intuitive Cons -Not 3D Printer Friendly -Unclear is Shapes are Solid or Hollow - Poor dimensioning capabilities Sketchup is actually a design program that was supported by Google. It is a very crisp program that clearly shows how objects are forming, i.e. it shades the sides so kids know which side of a cube is the top and they have reference features in the viewport so that is is easy to know which direction is up or right or left regardless of what angle you are looking at an object from. Sketchup also uses the same methodologies as more advanced design programs to create shapes. They have you draw a sketch on a 2D plane and then that sketch is "extruded" to create a 3D shape. So kids would draw a square on the ground or on the side of an object and then extrude up a square peg. The downside of Sketch-up is that it is not very 3D printer friendly. The Beta Cloud version does not generate .STL or .OBJ files which are necessary to 3D print an object. The Desktop version of the software can export those files, but it is not as simple as other programs. Sketchup is also not a good program for designing real objects because it does not have very easy ways to dimension objects. So kids can't easily tell if they are creating a cube that is 1 inch wide or 1 foot wide. Sketchup also has difficulty displaying whether an object is solid or hollow. It is not always clear whether the cube is solid or just 6 planes folded into the shape of a cube. This will make 3D printing impossible, even if you can export the correct files. Overall Sketchup is a good program for introducing CAD in general to younger ages, but it is not ideal at all for 3D printing. TinkerCAD
TinkerCAD is a program created by Autodesk. As such it has a great deal of support and can prepare kids to graduate into programs such as Autodesk 360 which are very useful in industry. Pros -Easy to Export 3D Printer Files - Easy to Create and Edit Shapes - Great Support from AutoDesk - Fully Cloud Based Cons - Does not work well with Apple - Poor Directional Reference for Beginners - Too Depended on Dimensioning for placing shapes TinkerCAD allows beginners to drag and drop basic shapes into a workspace and then reshape them. So a kid may place a cube into the workspace and then grab the edges and corners to turn it into a board or some other rectangular prism. All the time that a student is reshaping an object, dimensions are displayed on the edges of the shape to show what size it is in mm, in, etc. When it comes time to create a file for 3D printing (.stl, .obj) TinkerCAD allows saving and exporting in only those formats, which is great. TinkerCAD is entirely cloud-based, so schools that have moved away from desktop labs can use it easily. The downsides of TinkerCAD is that is can be difficult to navigate through. You should only use Computers which have mice with two buttons. Apple computers are not ideal machines for Tinkercad as the single-click mouse makes movement in the workspace difficult. TinkerCAD also does not give the user a lot of feedback about the 3D space they are working in. If a student were to draw a shape like a sphere or a cube, they would have little reference as to up-down or left and right inside the workspace. For young kids who are just learning the concept of designing in 3D space this can steepen the learning curve. The other downside of TinkerCAD is that it is highly dependent on dimensioning. There is little in the program to help the kids make their shapes fall together. For example, if a student wants to create 3 cubes which then are stacked on top of each other, they will first place the cubes on the workspace. Ideally after dropping the cubes they could maneuver them around until they "snap" together on top of each other. There is no snapping. Students must observe dimensions and move the cubes around until the distance between two edges is 0. While this issue is not large and it does force the kids to think about dimensioning it is not entirely intuitive and can therefore be difficult. Kids end-up eyeballing parts, which can leave them susceptible to illusion of distance when you can change the shape and location of an object. But overall TinkerCAD is an excellent program to start kids out with. There will be a few hurdles for them to overcome, within about a week nearly any students should be able to create a 3D printable object in TinkerCAD, without too much assistance from a teacher.
3 Comments
We are always looking for new tasks that teachers can get their students to do with the LittleArm. Recently Oreo announced the Oreo Dunk Challenge. The challenge is to create a video of picture of how you dunk your Oreos and share it. We thought it would be great to have kids in several robotics clubs do the challenge. So we tested it out with the littlearm arduino robot arms. Now, the rules of the original challenge are pretty lax. We had to expand on it to make it a cleaner competition with more constraints, just like real engineering. So we assigned points to various parts of the task. This is what they are. Pick Up the Cookie
Dunk the Cookie
Other Rules
This point system ensures that there is a way to measure success. It also gives kids various places to focus. They can design tools for the arm to accomplish more complex tasks or they can work at the programming, tweaking it until it gives the result they want. This is good culmination challenge, because, though it is very simple, there are subtle complexities within it that make it difficult to achieve. We currently have several local robotics clubs working on the Oreo Dunk Challenge with their robots and we hope that we can start posting videos very soon. This post contains all the arduino code for the Littlearm 2C 3D printed robot arm. The code has been heavily commented in order for kids to clearly see what each line of it is for. // LittleArm 2C arduino code
// Allows serial control of the LittleArm 2C 3D printed robot arm // Created by Slant Concepts #include <Servo.h> //arduino library #include <math.h> //standard c library #define PI 3.141 Servo baseServo; Servo shoulderServo; Servo elbowServo; Servo gripperServo; //+++++++++++++++Global Variables+++++++++++++++++++++++++++++++ struct jointAngle{ //a struct is a way for organizing variables into a group int base; int shoulder; int elbow; }; struct jointAngle desiredAngle; //desired angles of the servos int desiredGrip; // disired position of the gripper int gripperPos; //current position of the gripper int command; // the set of joint angles int desiredDelay; // the delay that the servos make btween steps //int ready = 0; // a marker to used to signal a process is done //+++++++++++++++FUNCTION DECLARATIONS+++++++++++++++++++++++++++ int servoParallelControl (int thePos, Servo theServo ); //This is a function for controlling the servos //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ void setup() // Setup prepared the Arduino board for operation { Serial.begin(9600); // Turn on USB communication (Serial Port) and have it communicate at 9600 bits per second baseServo.attach(5); // attaches the servo on pin 5 to the servo object shoulderServo.attach(4); // attaches the servo on pin 4 to the servo object elbowServo.attach(3); // attaches the servo on pin 3 to the servo object gripperServo.attach(2); // attaches the servo on pin 2 to the servo object Serial.setTimeout(50); //Stops attempting to talk to computer is no response after 50 milisenconds. Ensures the the arduino does not read serial for too long Serial.println("started"); // Print to the computer "Started" baseServo.write(90); //intial positions of servos shoulderServo.write(100); elbowServo.write(110); // ready = 0; } //primary arduino loop. This is where all of you primary program must be placed. void loop() { if (Serial.available()){ // If data is coming through the USB port to the arduino then... // ready = 1; // Ready is set to 1 to indicate that a command is being executed // Commands are sent from the computer in the form "#,#,#,#,#,\n" // The code below "parses" that command into integers that correspond with the // base angle, shoulder angle, elbow angle, grip angle, and delay in the servos, respectively. desiredAngle.base = Serial.parseInt(); desiredAngle.shoulder = Serial.parseInt(); desiredAngle.elbow = Serial.parseInt(); desiredGrip = Serial.parseInt(); desiredDelay = Serial.parseInt(); if(Serial.read() == '\n'){ // if the last byte is '\n' then stop reading and execute command '\n' stands for 'done' Serial.flush(); //clear all other commands piled in the buffer Serial.print('d'); //send completion of the command "d" stands for "done executing" } } // These values are the status of whether or not the joint has reached its position yet // variables declared inside of some part of the program, like these, are called "local Variables" int status1 = 0; //base status int status2 = 0; //shoulder status int status3 = 0; //elbow status int status4 = 0; //gripper status int done = 0 ; // this value tells when all the joints have reached thier positions while(done == 0){ // Loop until all joints have reached thier positions && ready == 1 //move the servo to the desired position //This block of code uses "Functions" to make is more condensed. status1 = servoParallelControl(desiredAngle.base, baseServo, desiredDelay); status2 = servoParallelControl(desiredAngle.shoulder, shoulderServo, desiredDelay); status3 = servoParallelControl(desiredAngle.elbow, elbowServo, desiredDelay); status4 = servoParallelControl(desiredGrip, gripperServo, desiredDelay); // Check whether all the joints have reached their positions if (status1 == 1 & status2 == 1 & status3 == 1 & status4 == 1){ done = 1; //When done =1 then the loop will stop } }// end of while } //++++++++++++++++++++++++++++++FUNCTION DEFINITIONS++++++++++++++++++++++++++++++++++++++++++ int servoParallelControl (int thePos, Servo theServo, int theSpeed ){ //Function Form: outputType FunctionName (inputType localInputName) //This function moves a servo a certain number of steps toward a desired position and returns whether or not it is near or hase recahed that position // thePos - the desired position // thServo - the address pin of the servo that we want to move // theSpeed - the delay between steps of the servo int startPos = theServo.read(); //read the current position of the servo we are working with. int newPos = startPos; // newPos holds the position of the servo as it moves //define where the pos is with respect to the command // if the current position is less that the desired move the position up if (startPos < (thePos-5)){ newPos = newPos + 1; theServo.write(newPos); delay(theSpeed); return 0; // Tell primary program that servo has not reached its position } // Else if the current position is greater than the desired move the servo down else if (newPos > (thePos + 5)){ newPos = newPos - 1; theServo.write(newPos); delay(theSpeed); return 0; } // If the servo is +-5 within the desired range then tell the main program that the servo has reached the desired position. else { return 1; } } //end servo parallel control |
Archives
November 2020
|