Note: these blue boxes are instructions to you to make the documentation, and should not be included in your final submission!
Overall photo for proportion and scale (one per team member)
A clear picture of student 1's transducer with a brief caption and appropriate alt text
A clear picture of student 2's transducer with a brief caption and appropriate alt text
Detail photos of any part that you’d like to highlight (two to five between the team members)
Detail photo 1 with caption and alt text
Detail photo 2 with caption and alt text
Detail photo 3 with caption and alt text
Detail photo 4 with caption and alt text
Submit a video filmed from directly above your board, in horizontal (landscape) format, showing the following features of your device being demonstrated:
The input sensor running through its whole range, slowly, from minimum to maximum and back to minimum
Messing with the middle step (by directly driving the middle-step sensor through its range slowly, minimum to maximum and back to minimum)
Hold the skip-the-middle button and again run your input sensor through its range to show that feature working
Your video should be framed such that the whole board is clearly visible, and the LCD display can be seen by the camera as well.
You may optionally also zoom in to show different aspects of the board running. Film in landscape (horizontal) rather than portrait (vertical). Upload your video file to our class's shared drive and then add it to this page by clicking "Drive" under the Insert pane. (To find the shared drive: go to drive.google.com, expand the "Shared drives" listing on the left column, and select "60-223 f26".)
(one movie per team member)
Student 1 documentation video with caption.
Student 2 documentation video with caption, same advice and requirements as listed above.
Write a simple narrative description (one per team) of the thing and usual operation of the thing—the type of plain and straightforward description that you might write in a letter to a child to explain what you had made. Free of judgment and totally literal and straightforward. Try to use as little technical language as possible. (E.g. “A white plastic box has a switch on the top side. When the user turns it on, a green LED flashes five times showing that the system is ready. A small white flag waves back and forth.”) For a study in the art of using simple language, see Randall Munroe’s wonderful Up Goer Five. To use a simple-language filter yourself, try the Up-Goer Five text editor. Reminder: do not use any generative AI to help write this section.
Four progress images (two per student), each of which could be a step or misstep that happened along the development process, and each with a caption that’s at least a sentence or two long. These images may capture decision points, especially interesting or illustrative mistakes, or other mileposts along the way. The idea is that these medium-quality images (though good pictures work too) are taken along the way to document progress. Sometimes you might understand these as being moments-that-matter only in retrospect!
Each image with caption and alt text.
Each image with caption and alt text.
Each image with caption and alt text.
Each image with caption and alt text.
Discussion (one per team) pertaining to process and outcome. For instance, what was easy, what was hard, what did you learn? What little tweak, in retrospect, would’ve changed the direction entirely? This is an opportunity for you to reflect on your creative and technical growth through the project, and think about what growth you want to aim for next. This shouldn’t be a recital of your process, but rather a meaningful reflection, 3–4 paragraphs in length. Reminder: do not use any generative AI to help write this section.
Functional block diagram and schematic (one per team), drawn in draw.ioref.org using the conventions we discussed in class. Be sure that the images aren't cropped incorrectly (Google Sites will tend to crop without telling you as you resize images.) Samples shown below.
Code submission (one per team), embedded into the project page, and optionally also with a Github or other version control service public-facing link. Your code should be reasonably commented throughout so that people other than you (the author) can better understand it. You don’t need to explain every single line—that would be overkill—but leave useful notes in a reasonable measure. Write a comment block at the top of the code including:
the project title,
(optionally) your names,
a description (short or long) of what the code does,
a pin mapping table that would be useful to somebody else trying to recreate your work (this is a simple table that lists all of the connections to the Arduino pins),
appropriate credit to any other person’s/project’s code that you incorporated into your project, and
(optionally) a license notice (i.e. copyright, CC BY-SA 4.0, the MIT License, release it to the public domain, or just follow your heart). If you have written code that you wish to keep strictly proprietary for any reason, please speak with the instructor about an exception to this documentation requirement.
/*
Project 1: Double Transducer
60-223 Intro to Physical Computing
A photoresistor reads in the amount of light hitting it, and that's used
to drive a servo motor through a 180º range. The servo's output is physically
coupled to a potentiometer shaft. The potentiometer's position is used to
drive a variable frequency output speaker. When a pushbutton is pressed,
the phototoresistor value is used to directly drive the speaker, bypassing
the middle step of the transducer.
Pin mapping:
Arduino pin | role | description
-------------------------------------
A0 input photoresistor
A3 input potentiometer
4 input pushbutton
8 output servo motor
6 output passive buzzer
Sample code by Robert Zacharias, rzachari@andrew.cmu.edu
January 2025
*/
// library for servo motor
#include <Servo.h>
// pin assignments
const int PHOTOPIN = A0,
POTPIN = A3,
BUTTONPIN = 4,
SERVOPIN = 8,
BUZZERPIN = 6;
// input data variables
int photoVal, potVal, buttonVal;
// internal mapping values
int mappedPhotoVal, mappedPotVal;
// output variables
int servoPos, buzzerVal;
// make servo motor variable "servoMotor"
Servo servoMotor;
void setup() {
// initialize servo motor
servoMotor.attach(SERVOPIN);
// set up pin modes
pinMode(PHOTOPIN, INPUT);
pinMode(POTPIN, INPUT);
pinMode(BUTTONPIN, INPUT_PULLUP); // far leg of button to ground
pinMode(BUZZERPIN, OUTPUT);
// start serial connection at 9,600 baud
Serial.begin(9600);
}
void loop() {
// step 1: read all of the sensors
readInputs();
// step 2: make decisions about what to do
updateInternalState();
// step 3: drive all of the outputs
driveOutputs();
// step 4: report data back to the user
reportBack();
// a brief delay at the bottom of the loop is usually a good idea
delay(5);
}
void readInputs() {
// read photoresistor
photoVal = analogRead(PHOTOPIN);
// read potentiometer
potVal = analogRead(POTPIN);
// read button
buttonVal = digitalRead(BUTTONPIN); // will be LOW when pressed
}
void updateInternalState() {
// map the photoresistor value to a range of 0 to 99
mappedPhotoVal = map(photoVal, 0, 1023, 0, 99);
// map the potentiometer value to a range of 0 to 99
mappedPotVal = map(potVal, 0, 1023, 0, 99);
// use the mapped photo value to figure out where the servo should go,
// i.e. map *that* to a 0–180 range
servoPos = map(mappedPhotoVal, 0, 99, 0, 180);
// make a decision about driving the buzzer output based on the button state
if (buttonVal == LOW) {
// if the button is pressed, use the photoresistor data to drive the
// buzzer frequency
buzzerVal = map(mappedPhotoVal, 0, 99, 200, 2000);
} else {
// if the button is *not* pressed, then use the mapped potentiometer value
// to figure out what frequency to drive the buzzer to
buzzerVal = map(mappedPotVal, 0, 99, 200, 2000);
}
}
void driveOutputs() {
// drive the servo motor to the calculated position, but only when the button
// is not pressed (button is HIGH until pressed)
if (buttonVal == HIGH) {
servoMotor.write(servoPos);
}
// buzz the buzzer at the calculated frequency using the tone() command
tone(BUZZERPIN, buzzerVal);
}
void reportBack() {
Serial.print("photoVal = ");
Serial.print(photoVal);
Serial.print(", potVal = ");
Serial.print(potVal);
Serial.print(", buttonVal = ");
Serial.println(buttonVal);
}