Day 2: (Aug 29) Temporal Coding
Notes for 2018-08-29. See also the Fall 2018 Calendar.
Notes from Day 1
We have a broad range of experience levels in the class; everybody needs to
identify their own knowledge frontier and help shape the right scope.
Agenda
- Administrative
- Assignments
- In-class
- Introduce the assignments.
- Walk through the 16-223 WordPress.
- Introduction to hobby servos.
- Show Exercise: Servo Sweep.
- Walk through Sample Arduino Sketches.
- Arduino programming discussion.
- Periodic table activity: generate two questions.
- Time permitting: start work on technical demo.
Lecture code samples
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 | // demo the firmware clocks, debugging on the serial port
void setup()
{
Serial.begin(115200);
}
long last_time = 0;
void loop()
{
long now = micros();
Serial.print(millis());
Serial.print(" ");
Serial.print(micros());
Serial.print(" ");
Serial.println(now - last_time);
last_time = now;
}
|
| // demo IDE graphing: see Tools/Serial Plotter
void setup()
{
Serial.begin(115200);
}
void loop()
{
Serial.println(sin(4 * 6.28 * 0.001 * millis()));
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 | // demo use of a library, hobby servo output
#include <Servo.h>
Servo your_chosen_servo_name;
void setup()
{
your_chosen_servo_name.attach(9);
}
void loop()
{
your_chosen_servo_name.write(45);
delay(500);
your_chosen_servo_name.write(135);
delay(500);
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 | // demo use of a lookup table
#include <Servo.h>
const int SERVO_PIN = 9;
Servo svo;
void setup(void)
{
svo.attach(SERVO_PIN);
}
const int angles[12] = { 45, 0, 135, 0, 90, 0, 90, 45, 135, 90, 180, 0 };
void loop(void)
{
for (int idx = 0; idx < 12; idx = idx + 1) {
svo.write(angles[idx]);
delay(500);
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 | // demo use of a trajectory generator function
#include <Servo.h>
const int SERVO_PIN = 9;
Servo wiggling_servo;
void setup(void)
{
Serial.begin(115200);
wiggling_servo.attach(SERVO_PIN);
}
void loop(void)
{
// Perform a smooth movement around the center several times.
for (int i = 0; i < 4; i = i+1) {
// Define a few constants governing the motion. Note that this example
// uses a C++ style of declaration which looks more like a normal variable
// declaration, but whose value cannot be changed.
const float center = 90.0; // in degrees
const float magnitude = 30.0; // in degrees
const float period = 4.0; // in seconds, duration of cycle
const float interval = 0.020; // in seconds, duration of each step
int cycle_steps = period / interval;
for (int step = 0; step < cycle_steps; step++) {
// Compute the 'phase angle' for the sine function. Note that the sin()
// function requires an angle in radians.
float phase = step * (2*M_PI/cycle_steps);
// Compute the angle to send to the servo.
float angle = center + magnitude * sin(phase);
wiggling_servo.write(angle);
// Wait for one sampling period.
delay(1000*interval);
}
}
Serial.println("cycle done.");
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 | // demo use of a differential equation generator function
#include <Servo.h>
const int SERVO_PIN = 9;
Servo svo;
// ================================================================
// Simple Harmonic Motion oscillator, e.g. unit-mass on spring with damping.
const float k = 4*M_PI*M_PI; // 1 Hz; freq = (1/2*pi) * sqrt(k/m); k = (freq*2*pi)^2
const float b = 1.0; // damping
const float q_d = 90.0; // neutral spring position
const float dt = 0.01; // integration time step
float q = 0.0; // initial position
float qd = 0.0; // initial velocity
// ================================================================
void setup(void)
{
Serial.begin(115200);
svo.attach(SERVO_PIN);
}
// ================================================================
void loop()
{
// calculate the derivatives
float qdd = k * (q_d - q) - b * qd;
// integrate one time step
q += qd * dt;
qd += qdd * dt;
// update the servo
svo.write(q);
// logic to reset the oscillator after a cycle has completed
if (fabs(qd) < 0.1 && fabs(q_d - q) < 0.1) q = 0.0;
// print the output for plotting
Serial.println(q);
// delay to control timing
delay((int)(1000*dt));
}
|