Welcome! I’m very excited to be teaching Physical Computing again this year. It’s material I love and use a lot. I’m curious about every aspect of how things are made – how materials can be shaped into useful and beautiful forms, how sensors can perceive the world, how code can be crafted to run on processors and affect the world.
Recently there’s been an explosion in tools available to beginners for embedding computation into just about any project imaginable. It can be a bit overwhelming – electronics! programming! so many boards to choose from! – but this course lays a foundation for you to build amazing things now and continue developing creative and technical skills over a lifetime.
Class Times
Important note: We are not meeting in person the first week of class, September 8th! I have an unavoidable conflict.
The introductory class typically covers information about the syllabus and class structure. I’ve posted a video about that here.
The first class is also a chance for me to meet you, and for you to meet the other students in the class. To that end, I’ve scheduled three 1-hour open zoom hangouts:
Friday September 3, 12 noon
Thursday September 9, 3PM
Monday September 13, 3PM
Drop in to any (or all!) of these sessions to say hi, introduce yourself, and meet other students in the class. The zoom meeting details were shared in an email. If you can’t make any of the sessions, email me and we’ll find a way to connect.
The regularly scheduled classes will resume on Wednesday, September 15th.
Wednesdays: 12:20 PM – 2:50 PM NYC time (GMT-4, until Nov. 1, then GMT-5). Room 410.
Contacting Me
My NYU office hours calendar. You’ll need to sign in with your NYU login to see it. I will schedule regular office hour appointment slots which you can book automatically once the semester starts.
My email: jeff@fddrsn.net, jf543@nyu.edu
Outside of office hours, email me and we can discuss issues and find a time to connect if necessary. Even before covid I did the majority of my office hours via video or over email. That said, I don’t work full time at NYU, and try to keep “normal” business hours balanced with other work and life.
This image since the board didn’t label its pins (on top)!
Pin out for the Nano 33 IoT
A note on how to use this site
There’s a lot, lot! of information at itp.nyu.edu/physcomp. Then there’s the whole rest of the internet, starting with Arduino HQ, going on to great sites like learn.adafruit.com and learn.sparkfun.com, not to mention infinite how-tos on YouTube (even Vimeo), data sheets for every component ever made, etc… It can get overwhelming.
With the ITP site, we’ve tried to do two things:
Provide a week-by-week syllabus for the semester that takes you through the physical computing material in a logical progression. Each week has clear tasks, assignments for the following week, and links to labs, write-ups, and videos that support or explain the current material. Follow along here and you’ll be fine.
Provide an organized set of materials covering the core physical computing topics, to serve as a first resource for any questions you may have as you study the subject. These live under the Topics, Videos, Resources, and Labs tabs. These materials are also linked to from the syllabus, but here they’re organized by subject matter, whereas the week-by-week syllabus is chronological.
Class Documentation
You’ll keep a blog online with documentation of your work for the class. This will include midterm and final documentation, responses to specific prompts in the syllabus, and periodic updates on lab work. While you’re not strictly required to post an update every single week, it is very helpful to post regularly so I can keep track of how you’re doing in the class. If I see an issue come up for multiple students we can make time to address it in the class.
Email me with direct links to your documentation for this class. Note: please set up tags, categories, or whatever so the link goes directly to the documentation specifically for this class, and not every class, or your personal blog, etc.
You’ll know I got your link when it shows up here!
Wednesdays, 9:10 AM – 11:40 AM, 370 Jay Street, Room 410 Wednesdays, 3:30 PM – 6:00 PM, 370 Jay Street, Room 409
Contact
Book office hours with me on my calendar. I will schedule regular office hour appointment slots which you can book automatically once the semester starts. You’ll need to sign in with your NYU login to see it.
Feel free to email me at danny.rozin@nyu.edu if you have any questions or things you want to talk about.
1-Chang,Leia with Ratanavanh,Spencer , with Arthur Jr.,Bruce 2-Goel,Megha with Trebisacci,Tatiana Tash 3-Guang,Kelin with Zhou,Peiyu Eva 4-Rong,Luhan with Xu,Shuchen with Han,Yuwen 5-Sodre,Pedro with Sun,Lindsey with with Ngiam,Vivian 6-Lee,Kevin with with Selvabarathy,Suraj
Afternoon:
1-Hodge,La’Kay 2-Hu,Meijie 3-Ji,Ziwei 4-Ke,Xiaoyu (Rockey) with Li,Tony 5-Lu,Julia Margaret 6-Oh,Yeseul 7-Wang,Lifei with Zhang,Yvonne 8-Williams,Maya 9-Worthington,Addison with Aga, Adnan 10-Cappelli,Christina 11- Mai,Angel with Rodriguez Ostia,Lorena
The most valuable thing we can do when we are in person or online in a class meeting together is to discuss and practice the subject that you’re learning. Any “lecture material” is on this site in video or written form, and assigned for the weeks where we will discuss it. I will expect that you’ve done the readings or watched the videos and tried the lab exercises assigned in advance of each class, and are coming to the class meetings with questions. Class meetings will be mainly discussions and shared demonstrations or experiments, not lectures. Use class time to get me or your classmates to clarify things you didn’t understand from the assigned material.
It’s okay if you couldn’t get a lab exercise or a project to work. When that happens, try to debug it, explain what you did in your blog, and come to class prepared to talk about the details and ask specific questions. Pay attention to your classmates’ work and their questions; quite often, they’ll be asking the same thing as you.
Fantasy Device – As a class, we’ll make a list of fantasy devices; things that don’t exist, but that we wish did. For today, we’ll ignore technical feasibility and concentrate on how you’d operate these devices if they did exist. You’ll be divided into groups of 3. Pick a fantasy device from the list. Design a control interface for this device and demonstrate it in class.
It is sometimes useful to think in terms of WH questions and try to answer them in your design:
WHO? WHEN? WHERE? WHAT?
Lets take an example, A popular fantasy device in movies and books is a time machine. In movies and TV, the production has to imagine what these devices look like and how they are controlled:
“Back to the future” movie:
Time Machine control panel
Time Machine in “Back to the future” movie
So thinking about the WH questions:
WHAT is it ? – A car. WHO gets to go ? – anyone in the car. WHERE does it take you ? Set in the control panel. WHEN does it activate ? When the car reaches 80 MPS.
Stewie from “Family Guy” time machine:
Stewie’s time machineStewey’s time machine cabinetStewie’s time machine control panel
Here the designers decided the machine is a cabinet, but they also added a disc that goes with Stewie and is used to get back:
WHAT? – A cabinet and a disc WHO gets to go? Anyone in the cabinet or on the disc. WHEN does it activate ? Not sure, but there is a big red button… WHERE does it take you? There is a control panel, note that the control seems to be relative, so you can go forwards and backwards, not absolute like in “Back to the future”
“Spongebob Squarepants” time machine:
https://www.youtube.com/watch?v=mJZXCBLbNkU
video of Spongebob Squarepants episode – Time machine at 2:20
Here the machine is the freezer from the Crusty Crab, note that the whole freezer travels through time and it is ripped from it’s surroundings
WHAT is it ? A freezer. WHO gets to go ? Whoever is in the freezer. WHERE does it go? Hard to say, looks like two levers and no display. WHEN does it activate? Hard to say, but it has some buttons.
To book office hours, check my calendar. You’ll need to sign in with your NYU login to see it. I will schedule regular office hour appointment slots which you can book automatically once the semester starts.
My email: tom.igoe@nyu.edu
Outside of office hours, I am generally working from 9 AM to 6 PM NYC time Monday-Friday. I’m usually on campus Tues – Thurs, and work at home other days. If you contact me outside of working hours, I’ll try to get back to you as soon as my next working time allows.
How Class Will Be Run
The most valuable thing we can do when we are in person or online in a class meeting together is to discuss and practice the subject that you’re learning. Any “lecture material” is on this site in video or written form, and assigned for the weeks where we will discuss it. I will expect that you’ve done the readings or watched the videos and tried the lab exercises assigned in advance of each class, and are coming to the class meetings with questions. Class meetings will be mainly discussions and shared demonstrations or experiments, not lectures. Use class time to get me or your classmates to clarify things you didn’t understand from the assigned material.
It’s okay if you couldn’t get a lab exercise or a project to work. When that happens, try to debug it, explain what you did in your blog, and come to class prepared to talk about the details and ask specific questions. Pay attention to your classmates’ work and their questions; quite often, they’ll be asking the same thing as you.
I will share any tools that we find useful on the Resources section of this site.
Sensor Reports – reports on a variety of sensors and how to use them, from the Tangible Interaction class, and from the former Sensor Workshop class.
A Few Good Reads
These are not on the main reading list or the Related Books and Articles page, but I think they’re excellent reads if you’re thinking about physical interface design.
Bret Victor on Doug Engelbart and why Engelbart matters. A lovely tribute.
Ben Rubin’s redesign of the sounds in the NYC subway, circa 1998. In these, Ben looked at the sounds that are used to cue users of the subway and noted their limitations, then redesigned them to make them more understandable and useful. Video 1 and video 2 show the whole interaction. Thanks to Alden Jones for finding them again.
Brenda Laurel’s Computers as Theatre, 2nd edition (NYU Library permalink). I first read this book in about 1993. It had a big impact on me, as I was working in theatre at the time, and it gave me a thorough, yet well explained, introduction to what computer interaction is all about, using theatre practice as an metaphor to explain it. Laurel stresses how it’s the action that is key to what we make, and the physical devices, controls, etc. set the stage for that. The 2nd edition, released in 2014, is a great update to a classic. Her writing is appropriately scholarly in its reference to the thinking of others in the field, yet very conversational, making it clearer than most theoretical writing.
A quick example of how to run three things at three different rates:
int ledInterval = 3000;
int servoInterval = 20;
long lastLEDChange = 0;
long lastServoChange = 0;
int lastButtonState = 0;
int LED = 3;
void setup() {
Serial.begin(9600);
pinMode (2, INPUT);
pinMode(LED, OUTPUT);
}
void loop() {
// read a button, see if it has changed
int buttonState = digitalRead(2);
if (buttonState != lastButtonState) {
// change the LED
ledState = !ledState;
lastButtonState = buttonState;
}
// blink an LED every three seconds
if (millis() - lastLEDChange > ledInterval) {
digitalWrite(LED, ledState);
lastLEDChange = millis();
}
// update the servo's angle only one degree every second:
if (millis() - lastAngleChange > angleInterval) {
// update the angle:
if (angle > minAngle && angle < maxAngle) {
angle++;
} else {
angle = 0;
}
}
// update a servo motor every 20 seconds no matter what:
if (millis() - lastServoChange > servoInterval) {
// move the servo
servo.write(pin, angle);
lastServoChange = millis();
}
}
13 Oct 2021
Mentioned in the morning class:
HTML for Conndev – a repository of materials for my Connected Devices class
Lab: OLED Display – a lab on this site showing how to connect a small screen (screens available in ER checkout)
Clock Club – a repository of clock and time-related projects
Lab: Rotary Encoder – A lab on this site showing how to use a rotary encoder
20 Oct 2021
/*
Serial port selector
uses DOM elements to make a serial port selector
created 20 Oct 2020
by Tom Igoe
*/
// variable to hold an instance of the serialport library:
let serial;
// HTML Select option object:
let portSelector;
let receivedData;
var vesper;
function setup() {
createCanvas(320, 240);
serial = new p5.SerialPort(); // new instance of the serialport library
serial.on("list", printList); // callback function for serialport list event
serial.on("data", serialEvent); // callback function for serialport data event
serial.on("open", portOpen);
serial.list(); // list the serial ports
}
function draw() {
background(255);
fill(color(0, 0, 0, vesper));
text("Word", width / 2, height / 2);
if (vesper > 0) {
vesper--;
console.log("faded");
}
}
// make a serial port selector object:
function printList(portList) {
// create a select object:
portSelector = createSelect();
portSelector.position(10, 10);
// portList is an array of serial port names
for (var i = 0; i < portList.length; i++) {
// add this port name to the select object:
portSelector.option(portList[i]);
}
// set an event listener for when the port is changed:
portSelector.changed(mySelectEvent);
}
function mySelectEvent() {
let item = portSelector.value();
// give it an extra property for hiding later:
portSelector.visible = true;
// if there's a port open, close it:
if (serial.serialport != null) {
serial.close();
}
// open the new port:
serial.open(item);
}
function portOpen() {
console.log("The port is open, people! Rejoice!");
}
function keyPressed() {
serial.write(key);
// if port selector is visible hide, else show:
if (portSelector) {
if (portSelector.visible) {
portSelector.hide();
portSelector.visible = false;
} else {
portSelector.show();
portSelector.visible = true;
}
}
}
function serialEvent() {
console.log("got a new value");
var input = serial.read();
if (input) {
vesper = input;
}
}
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop routine runs over and over again forever:
void loop() {
int sensor = analogRead(A0) / 4;
if (sensor > 200) {
Serial.write(sensor);
}
}
27 Oct 2021
The MAX30105 Sensor is the sensor I showed in the afternoon class today. Designed as a smoke detector particle sensor, it does a great job as a pulse oximetry sensor. Here is the Sparkfun breakout board for it I have on hand, and here is a Pimoroni version I have tried as well. There’s also a more expensive Sparkfun board with an additional sensor which I have not tried, and this one, with big solder pads. . It’s a useful sensor for those interested in getting heart rate, and can give you more than just the raw readings of the sensor. I use the Sparkfun MAX3010x library with it.
Fridays, 9:00 AM – 11:30 AM NYC time (GMT-4, until Nov. 1, then GMT-5) Instructor: David Rios Contact: dar436@nyu.edu , @rios on ITP/IMA Discord Office Hours link
Contact David
Office hours
Click here for office hours and to know my general schedule for the week. You’ll need to sign in with your NYU login to see it. I will schedule regular office hour appointment slots which you can book automatically once the semester starts. If you’d like to schedule a time to meet that is not on my calendar, email me well in advance of when you’d like to meet and I’d be happy to try to accommodate your request.
Email
Outside of office hours, I am generally available via email. I’ll do my best to respond to emails within 24 hours of receiving it.
Discord
I use the ITP/IMA discord and can communicate there as well. If you @ me I’ll do my best to respond within 24 hours
How Class Will Be Run
The most valuable thing we can do when we are in person or online in a class meeting together is to discuss and practice the subject that you’re learning. The class is “flipped” meaning, any “lecture material” is on this site in video or written form, and assigned for the weeks where we will discuss it. I will expect that you’ve done the readings or watched the videos and tried the lab exercises assigned in advance of each class, and are coming to the class meetings with questions. Class meetings will be mainly discussions and shared demonstrations or experiments, not lectures. Use class time to get me or your classmates to clarify things you didn’t understand from the assigned material.
Assignments are due 24 hours in advance of the next class, and should be submitted as documentation posts on your blogs. It’s okay if you couldn’t get a lab exercise or a project to work. When that happens, try to debug it, explain what you did in your blog, and come to class prepared to talk about the details and ask specific questions. Pay attention to your classmates’ work and their questions; quite often, they’ll be asking the same thing as you.
When class meetings are conducted online, I might record the Zoom meetings, if it is useful to the class and if all students consent. We will pause the recording when the discussion needs more privacy, and I will share the recording links only with our class, and set them to expire after the semester. If a question comes up in class or in online office hour meetings that is broadly useful, I may ask you if we can record the answer for others. Your comfort and consent are important, however, so please let me know if you have concerns.
Class Tools
Since this class will be meeting remotely via Zoom this semester, there are a few other tools I’ll be using that you might want to get familiar with:
NYU Google App suite – you’ll need to know these for most of NYU interaction. You have access to the whole suite through your NYU account. Search for NYU Drive. We’ll use mail, calendar, docs, sheets, drive, and slides.
Tinkersphere (overpriced) in Lower East Side and Micro Center are nearby places you can go to shop or take a look at various electronic parts in person.
Topics: physical computing, interaction, class structures
You can view the slides when you log-in with your NYU account. Please use them only for your own reference and don’t distribute them without my permission.
Class 2 (September 11, 2019)
Figure 1 and Figure 2 show the LED circuit I demonstrated during the class, which you can use for your LED+switch circuit project. You don’t need to use a breadboard for this assignment unless you want to, but it should be useful for prototyping at least. The value of the resistor in the images is 220 ohm, which is the smallest value you have in your kit. If you want the LED to be brighter, you can use a 80~100 ohm resistor instead. You can break any point of the circuit and insert your switch that will enable you to turn on and off the LED.
Serial Communication: Arduino to p5.js (see Table 2)
When you send a stream of data that is between 0 and 255, you can simply use Serial.write() from Arduino and serial.read() from p5.js to send and receive 1 byte at a time. No parsing involved.
When you send numbers that is out of range of 0-255 or characters, you need to package each data by putting each data on each line–to do that, use Serial.println() from Arduino. To unpack the data, use serial.readLine() from p5.js. To use it as a number, use Number() function on p5.js.
Data to Send
A single value
within 0-255
(< 2^8 = 1 byte)
Larger numbers & characters in Ascii Table,
Multiple values
Send as:
Binary
Ascii
Arduino ->
Serial.write()
Serial.println()
-> p5.js
serial.read()
serial.readLine()
=readStringUntil('\r\n')
Table 2. Serial Communication: Arduino to p5.js Notes about sending Ascii data: *Using Serial.println() on Arduino and serial.readLine() on p5.js is one of many different ways of sending Ascii data from Arduino to p5.js with serial communication. *If you want to use the value as a numeric value not a string, convert the value into number by using Number().
Codes from the in-class lab: see your email
Class 7 (October 16, 2019)
Serial Communication: p5.js to Arduino (see Table 3)
“The serial.write() function is versatile. If you give it a variable or literal that’s a numeric data type, it will send it as its raw binary value. If you give it a string, however, it will send out that ASCII string” (quoted from Lab: Serial output from p5.js
To do:Narrow your ideas, make playtesting pototype, make BOM, Schedule, space and interaction diagrams
Interaction Design / play test – week 2 (Week 11 of semester)
To do: Reevaluate idea and interaction after playtesting, adjust BOM and diagrams accordingly, order stuff, learn required skills (special sensors and such)
Implementation -week 4 ( Week 12 of semester)
To do: Build functional prototype (maybe not 100% fabricated exterior)
Usability testing week 5 (Week 13)
To do: Reevaluate usability after usability test, make changes, finish prototype including fabrication
Final presentation week 6 (Week 14)
To do: Celebrate! (and document)
Week 9 – Loads
AC Loads:
Any AC load can be controlled with Arduino using a relay, including motors, fans, lights, computers,
Welcome! I’m very excited to be teaching Physical Computing again this year. It’s material I love and use a lot. In the past few years there’s been an explosion in tools available to beginners for embedding computation in any imaginable project. It can be a bit overwhelming – electronics! programming! so many boards to choose from! – but this course lays a foundation for you to build amazing things and continue developing creative and technical skills in the future.
I have calendar slots available to meet in person on Wednesdays and Thursdays, the days I teach. Please sign up at least an hour in advance, as I don’t work at ITP full time and may not stick around if nothing is scheduled.
I am also available by Skype/hangout/chat/email/call etc. almost any time with prior arrangement. I’ve found that video meetings work well for physical computing, so my office hour policy is to make arrangements as needed. Email me and we can set up a time to talk further. On the occasions I can be on the floor outside of class times, I’ll email the class list to let you know.
This image since the board didn’t label it’s pins (on top)!
Nano 33 IOT with pin labels (source: arduino forum, user pak)
A note on how to use this site
There’s a lot, lot! of information at itp.nyu.edu/physcomp. Then there’s the whole rest of the internet, starting with Arduino HQ, going on to great sites like learn.adafruit.com and learn.sparkfun.com, not to mention infinite how-tos on YouTube (even Vimeo), data sheets for every component ever made, etc… It can get overwhelming.
With the ITP site, we’ve tried to do two things:
Provide a week-by-week syllabus for the semester that takes you through the physical computing material in a logical progression. Each week has clear tasks, assignments for the following week, and links to labs, write-ups, and videos that support or explain the current material. Follow along here and you’ll be fine.
Provide an organized set of materials covering the core physical computing topics, to serve as a first resource for any questions you may have as you study the subject. These live under the Topics, Videos, Resources, and Labs tabs. These materials are also linked to from the syllabus, but here they’re organized by subject matter, whereas the week-by-week syllabus is chronological.
Class Documentation
You’ll keep a blog online with documentation of your work for the class. This will include midterm and final documentation, responses to specific prompts in the syllabus, and periodic updates on lab work. While you’re not strictly required to post an update every single week, it is very helpful to post regularly so I can keep track of how you’re doing in the class. If I see an issue come up for multiple students we can make time to address it in the class.
Email me with direct links to your documentation for this class. Note: please set up tags, categories, or whatever so the link goes directly to the documentation specifically for this class, and not every class, or your personal blog, etc.
You’ll know I got your link when it shows up here!
I’ll post materials from in class here. You can access Google Slides with your NYU account. Presentation material from class is meant to be presented in person by me, so is not necessarily made to stand alone as a reference. It’s included here in case it can be of any use at all.
Class 1 slides (we didn’t get all the way though in class)
Class 3 board shown below. Note that the schematic shows the functional aspects of the circuit, but may differ from the physical layout. This is usually the case – schematics are not arranged the same as physical circuits. The colored boxes highlight which part of the schematic goes with which part of the board.
Arduino on breadboard, with digital and analog input and output circuits and equivalent schematic. The microcontroller provides 3.3V from pin 2 to the breadboard. It connects to the ground bus on the breadboard with pins 14 and 19. Digital pin 2 connects to a resistor and LED in series to ground, showing digital output. Digital pin 3 connects to a switch and 10K resistor to ground. The other pole of the switch connects to 3.3V. Pin A7 connects to the wiper of a potentiometer, which has it’s A and B pins connected to 3.3V and ground. Two additional analog input circuits are also on the breadboard, but not connected to the Arduino. One has a phototransistor connected to 3.3V in series with a 10K resistor to ground, and the second has an LDR from 3.3V in series with a 10K resistor to ground. Either could be used as an analog input using a connection between the series parts.
Class 4 board
Class 4 Breadboard, extending circuit from class 3 above, adding servo, RGB led, and speaker.
Class 6
Some midterm examples from last year’s class:
Qice and Fenfen – Caged? Great interaction, totally physical.
Lydia and SJ – Interaction demonstrating computer to a physical device
David and Joseph – Ghost Loofa. Physical controller sending input to computer game:
Two Youtube makers of note:
Mark Rober – engineer who frequently uses Arduino. His dart board code is online, including serial; here he debunks a fake maker project.
Simone Giertz – often uses Arduino, projects online go from simple to sophisticated and personally meaningful
Screen shot of the serial output from the student pair selector.
The student pairs (as text):
Julian and…Caren are partners for the Midterm!
Song and…Ben are partners for the Midterm!
Abby and…Tianxu are partners for the Midterm!
Shannel and…Hanyi are partners for the Midterm!
Rae and…Schuyler are partners for the Midterm!
Lizzy and…Elizabeth are partners for the Midterm!
Christina and…Yiting are partners for the Midterm!
Melissa and…Daniel are partners for the Midterm!
Simone and…Sam are partners for the Midterm!
Ann Hamilton’s Armory exhibit the event of a thread was an interactive piece mentioned in class.
TinkerCad is a virtual circuit builder and simulator from Autodesk.