### Activity Description

#### Learning Goals

• Interpret and edit the code of a computer model of a block sliding down a ramp
• Use vectors to describe the motion of a block on a ramp and the forces acting upon it
• Apply Newton's 2nd Law to relate the acceleration of a block on a ramp to the forces acting on it

#### Prior Knowledge Required

• 2-Dimensional kinematics
• Newton's 2nd Law
• Friction
• Coefficient of friction $\mu$

#### Code Manipulation

• Interpretation of preexisting code
• Changing values of given code
• Creation of new lines of code

### Activity

#### Handout

##### Block on a Ramp

Part 1
We’ve used forces to predict the motion of objects on level surfaces. What happens when the object is on a ramp? Click here to open the code for a model of a block on a ramp. Copy and paste the code into your own Glowscript program.

1. What is the angle of the ramp?
2. What else can you change about the ramp?
3. What is the distance along the ramp that the block will travel?
4. What is the while loop used for?
5. What are the components of the net force vector?
6. What are the components of the acceleration vector for the block? Where does the acceleration of the block show up within the code?

Part 2
Observe and explain what happens when you change physical features of the ramp and block.

1. What happens to the net force as the block slides down the ramp? How do you know?
2. What happens if you increase the angle of the ramp? Why does that happen?
3. What happens to the motion of the block if you increase the mass? How can you be sure?

Part 3
The simulation currently shows a block sliding down a frictionless ramp.

1. Modify the code so that the ramp now has a coefficient of friction equal to 0.3. Then create and label an arrow to represent the frictional force acting on the block
2. Challenge: create a model including static friction

#### Code

GlowScript 2.7 VPython#Call the library for Motion Mapget_library('https://rawgit.com/perlatmsu/physutil/master/js/physutil.js') #Window setupscene.range = 15scene.background = vector(1, 1, 0.8)  #the values below can be adjusted to change the properties of the rampramp_angle = 23 * pi/180ramp_depth = 6ramp_width = 30ramp_position = vec(-15, -10, 0) #the code below draws the ramp (lines 17 - 45)ramp_color = color.gray(0.3)edge_thickness = 0.05edge_color = color.black a = vertex(pos=vec(0, 0, 0)+ramp_position, color=ramp_color, opacity=.5)b = vertex(pos=vec(0, 0, ramp_depth)+ramp_position, color=ramp_color, opacity=.5)c = vertex(pos=vec(ramp_width, 0, 0)+ramp_position, color=ramp_color, opacity=.5)d = vertex(pos=vec(ramp_width, 0, ramp_depth)+ramp_position, color=ramp_color, opacity=.5)e = vertex(pos=vec(0, ramp_width * tan(ramp_angle), 0)+ramp_position, color=ramp_color, opacity=.5)f = vertex(pos=vec(0, ramp_width * tan(ramp_angle), ramp_depth)+ramp_position, color=ramp_color, opacity=.5) ramp_base = quad(v0=a, v1=b, v2=d, v3=c)ramp_surface = quad(v0=e, v1=f, v2=d, v3=c)ramp_back = quad(v0=e, v1=f, v2=b, v3=a)ramp_side_near = triangle(vs=[a, c, e])ramp_side_far = triangle(vs=[b, d, f]) def edge(v1, v2, r):    cylinder(pos = v1.pos, axis = v2.pos-v1.pos, radius = r, color = edge_color) ab = edge(a, b, edge_thickness)ac = edge(a, c, edge_thickness)bd = edge(b, d, edge_thickness)cd = edge(c, d, edge_thickness)ae = edge(a, e, edge_thickness)bf = edge(b, f, edge_thickness)ef = edge(e, f, edge_thickness)df = edge(d, f, edge_thickness)ec = edge(e, c, edge_thickness)  #The values below can be changed to modify the dimensions of the blockblock_width = 3block_height = 3block_depth = 3 #Create the block on the rampblock = box( pos=vector(0.5*(block_width**2+block_height**2)**0.5 * cos(atan(block_height/block_width) - ramp_angle), ramp_width * tan(ramp_angle) + 0.5*(block_width**2+block_height**2)**0.5 * sin(atan(block_height/block_width) - ramp_angle), 0.5*ramp_depth) + ramp_position,             axis=vector(ramp_width, -ramp_width * tan(ramp_angle), 0),             size=vector(block_width,block_height,block_depth),            color = vector(0.65, 0.15, 0.15),            texture = textures.wood_old,            opacity = 0.7)  #Set up the physical properties like the mass and velocity of the block, the acceleration due to gravity, and time.mblock = 50vblock = vector(0, 0, 0)g = vector(0,-9.8,0)t = 0tf = 5dt = .001 #Define the force vectors acting on the blockFgrav = mblock * gFnorm = vector(mag(Fgrav) * cos(ramp_angle)*sin(ramp_angle), mag(Fgrav)*cos(ramp_angle)*cos(ramp_angle), 0)Fnet = Fgrav + Fnorm #Create arrows to show the forces with labelsFgravArrow = arrow(pos = block.pos, axis=Fgrav/mblock, shaftwidth=0.3, color = color.green)FnormArrow = arrow(pos = block.pos, axis=Fnorm/mblock, shaftwidth=0.3, color = color.green)FgravLabel = label(pos=FgravArrow.pos, text='Fg', xoffset=-20, yoffset=-50, space=30, height=16, border=4, font='sans', line=False, color = color.black)FnormLabel = label(pos=FnormArrow.pos, text='Fn', xoffset=20, yoffset=50, space=30, height=16, border=4, font='sans', line=False, color = color.black) #Slide the block down the rampwhile block.pos.y > ( ramp_position.y+ 0.5*(block_width**2+block_height**2)**0.5 * cos(atan(block_width/block_height) - ramp_angle) ):    rate(500)      block.pos = block.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2      FgravArrow.pos = FgravArrow.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2    FnormArrow.pos = FnormArrow.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2    FgravLabel.pos = FgravLabel.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2    FnormLabel.pos = FnormLabel.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2     vblock = vblock + (Fnet/mblock)*dt    t = t + dt

#### Handout

Part 1

1. Line 11
2. Width, depth, position
1. Lines 12-14
3. We currently know the ramp angle and ramp width. Using trigonometry, we can solve for the distance along the ramp (i.e. the hypotenuse):
1. The formula relating angle, width, and hypotenuse is $\cos(\theta) = \dfrac{\text{width}}{\text{hypotenuse}}$
2. This can be rearranged as: $\text{hypotenuse} = \dfrac{\text{width}}{\cos(\theta)}$
3. Plugging in what we know: $\text{hypotenuse} = \dfrac{\text{30}}{\cos(23°)} = 32.6$
4. The while loop moves the block down the ramp by updating its position according to the following kinematic equation: $x = x_0 + v_0t + \dfrac{1}{2}at^2$
5. The net force vector (“Fnet”, line 73) is the sum of the gravitational force vector (“Fgrav”, line 71) and the normal force vector (“Fnorm”, line 72)
1. $\text{Fgrav} = \text{<0, -490, 0>}$
2. $\text{Fnorm} = \text{<173.2, 415.2, 0>}$
3. $\text{Fnet} = \text{<173.2, -74.8, 0>}$
6. According to Newton's 2nd Law, force equals mass multiplied by acceleration. To find the acceleration vector, we can divide the net force vector “Fnet” by the mass of the block “mblock”
1. $\vec{a} = \dfrac{\text{Fnet}}{\text{mblock}}=\dfrac{\text{<173.2, -74.8, 0>}}{\text{50}} = \text{<3.5, -1.5, 0>}$

Part 2

1. The net force stays the same, since the gravitational force and the normal force remain constant
2. The box will accelerate faster; As the angle of the ramp increases, the x-component of the normal force becomes larger while the y-component of the normal force becomes smaller. Essentially, the ramp becomes steeper and gravity will have a stronger effect on the block
3. The motion of the block is not affected by changing the mass. Fgrav is defined using the mass and Fnorm is defined using Fgrav, so Fnet can be written entirely in terms of Fgrav. So when the code divides Fnet by the mass to find the acceleration, the mass cancels out altogether. Think of Galileo's Leaning Tower of Pisa experiment; the principle is the same.

Part 3

1. See highlighted lines below
1. Lines 66, 74, 75, 80, 83, 95, & 98

#### Code

GlowScript 2.7 VPython#Call the library for Motion Mapget_library('https://rawgit.com/perlatmsu/physutil/master/js/physutil.js') #Window setupscene.range = 15scene.background = vector(1, 1, 0.8)  #the values below can be adjusted to change the properties of the rampramp_angle = 23 * pi/180ramp_depth = 6ramp_width = 30ramp_origin = vec(-15, -10, 0) #the code below draws the ramp (lines 17 - 45)ramp_color = color.gray(0.3)edge_thickness = 0.05edge_color = color.black a = vertex(pos=vec(0, 0, 0)+ramp_origin, color=ramp_color, opacity=.5)b = vertex(pos=vec(0, 0, ramp_depth)+ramp_origin, color=ramp_color, opacity=.5)c = vertex(pos=vec(ramp_width, 0, 0)+ramp_origin, color=ramp_color, opacity=.5)d = vertex(pos=vec(ramp_width, 0, ramp_depth)+ramp_origin, color=ramp_color, opacity=.5)e = vertex(pos=vec(0, ramp_width * tan(ramp_angle), 0)+ramp_origin, color=ramp_color, opacity=.5)f = vertex(pos=vec(0, ramp_width * tan(ramp_angle), ramp_depth)+ramp_origin, color=ramp_color, opacity=.5) ramp_base = quad(v0=a, v1=b, v2=d, v3=c)ramp_surface = quad(v0=e, v1=f, v2=d, v3=c)ramp_back = quad(v0=e, v1=f, v2=b, v3=a)ramp_side_near = triangle(vs=[a, c, e])ramp_side_far = triangle(vs=[b, d, f]) def edge(v1, v2, r):    cylinder(pos = v1.pos, axis = v2.pos-v1.pos, radius = r, color = edge_color) ab = edge(a, b, edge_thickness)ac = edge(a, c, edge_thickness)bd = edge(b, d, edge_thickness)cd = edge(c, d, edge_thickness)ae = edge(a, e, edge_thickness)bf = edge(b, f, edge_thickness)ef = edge(e, f, edge_thickness)df = edge(d, f, edge_thickness)ec = edge(e, c, edge_thickness)  #The values below can be changed to modify the dimensions of the blockblock_width = 3block_height = 3block_depth = 3 #Create the block on the rampblock = box( pos=vector(0.5*(block_width**2+block_height**2)**0.5 * cos(atan(block_height/block_width) - ramp_angle), ramp_width * tan(ramp_angle) + 0.5*(block_width**2+block_height**2)**0.5 * sin(atan(block_height/block_width) - ramp_angle), 0.5*ramp_depth) + ramp_origin,             axis=vector(ramp_width, -ramp_width * tan(ramp_angle), 0),             size=vector(block_width,block_height,block_depth),            color = vector(0.65, 0.15, 0.15),            texture = textures.wood_old,            opacity = 0.7)  #Set up the physical properties like the mass and velocity of the block, the acceleration due to gravity, time and the coefficient of friction.mblock = 50vblock = vector(0, 0, 0)g = vector(0,-9.8,0)cof = 0.3   #coefficient of friction#t = 0tf = 5dt = .001 #Define the force vectors acting on the block, including kinetic frictionFgrav = mblock * gFnorm = vector(mag(Fgrav) * cos(ramp_angle)*sin(ramp_angle), mag(Fgrav)*cos(ramp_angle)*cos(ramp_angle), 0)Ffr = vector(-cof*mag(Fnorm)*cos(ramp_angle), cof*mag(Fnorm)*sin(ramp_angle), 0) Fnet = Fgrav + Fnorm + Ffr #Create arrows to show the forces with labelsFgravArrow = arrow(pos = block.pos, axis=Fgrav/mblock, shaftwidth=0.3, color = color.green)FnormArrow = arrow(pos = block.pos, axis=Fnorm/mblock, shaftwidth=0.3, color = color.green)FfrArrow = arrow(pos = block.pos, axis=Ffr/mblock, shaftwidth=0.3, color = color.green)FgravLabel = label(pos=FgravArrow.pos, text='Fg', xoffset=-20, yoffset=-50, space=30, height=16, border=4, font='sans', line=False, color = color.black)FnormLabel = label(pos=FnormArrow.pos, text='Fn', xoffset=-10, yoffset=70, space=30, height=16, border=4, font='sans', line=False, color = color.black)FfrLabel = label(pos=FfrArrow.pos, text='Ffr', xoffset=-30, yoffset=30, space=30, height=16, border=4, font='sans', line=False, color = color.black)  #Slide the block (and arrows) down the ramp until it reaches the end of the rampwhile block.pos.y > ( ramp_origin.y+ 0.5*(block_width**2+block_height**2)**0.5 * cos(atan(block_width/block_height) - ramp_angle) ):    rate(500)      block.pos = block.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2      FgravArrow.pos = FgravArrow.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2    FnormArrow.pos = FnormArrow.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2    FfrArrow.pos = FfrArrow.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2    FgravLabel.pos = FgravLabel.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2    FnormLabel.pos = FnormLabel.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2    FfrLabel.pos = FfrLabel.pos + vblock*dt + 0.5*(Fnet/mblock)*dt**2     vblock = vblock + (Fnet/mblock)*dt    t = t + dt