In this class we build hardware-based input and output (I/O) devices. You will build several physical circuits that implement—by means of their low-level components (i.e., diodes, transistors, integrated-circuits, etc)—the core functionalities of a fully functional & interactive hardware device. We will be implementing two classes of devices: (1) input devices—by crafting the necessary circuitry and low-level code needed to implement devices such as keyboards, pressure sensors, accelerometers, etc, and (2) output devices, by crafting the necessary circuitry and low-level code needed to drive OLED displays, sound DAC chips, etc. In order for you to be successful in building your own I/O device we will: (1) study and program 8-bit / 32-bit microntrollers, (2) electrically wire analog/digital sensors and actuators, (3) write ADC filters for sampling data from sensors, (4) implement machine learning models (tinyML) inside of a microcontroller, (5) explore low-level protocols for data transfer and communication with modern operating systems (e.g., Serial over USB, Serial over Bluetooth, and inter-chip I2C/SPI).
How much work this class entails? A lot. This class is comprised of graded weekly assignments and a final project. The weekly graded assignments all involve either code (low-level firmware, a C-like syntax built for ARM microcontrollers) or code+hardware (in this class we solve this via breadboard or soldered circuits—see the more advanced class for fully machine-manufactured printed circuit boards). Additionally, taking the role of a final exam, you will implement a functional & standalone I/O device (hardware, alongside its low-level code) that you will document (by submitting code, hardware files and a write-up), stress-test (e.g., run simple evaluations to understand its performance) and demonstrate (e.g., write interactive programs that allow a user to perform the functionality of your device). Finally, the class is also complemented with labs and quizzes.
This class requires you to have taken CMSC 15400. Moreover, this class is about the physical side of computing, involving a lot of hardware and some basics of electricity. While not mandatory, it helps if you have taken any physics-level course that includes electricity/electromagnetism (PHYS 13100-13200-13300, PHYS 14100-14200-14300, PHYS 22500-22700). Also, keep in mind that this class will not teach you programming, it assumes you are comfortable with all its basics concepts (e.g., knowing python is useful, but we assume you will also comfortable with using some C/C++). Additionally, while not mandatory, knowledge in operating systems is useful (e.g., we will use some concepts that are covered in our OS-based system’s classes, such as threading, queues/polling, memory/program spaces, ROM vs. RAM allocation, and so forth). Conversely, since this might be, most likely, your first hardware we will spend some time wiyj concepts that you might be less familiar, such as low-level code (how does assembly look for an ARM microprocessor?), power modes (e.g., what does sleep mode mean?), and how to implement byte-level communication (e.g., error correction?).
Continuing your low-level systems adventure. This class is the single most important prerequisite for CMSC 23230 / CMSC 33230. Students who have taken this class have priority over all the other req-requisites for the next class. As such, if your goal is to expand your hardware, electrical engineering, and low-level systems knowledge, you should take both classes as a sequence.
Additional remarks regarding class capacity: This class is smaller than our other HCI classes, due to its complex logistics. Essentially every week, every student receives a custom goodie bag with new electronic components, new circuits to build, new microcontrollers to explore, and so forth—all of this takes tremendous effort to deploy and to assist you with debugging your circuits. As such, this class has been always at maximum capacity (we understand—it is a fairly unique class at our school) and we apologize in advance if you cannot get a spot. Note that it is rare that anyone drops out in the first weeks, as such, even being in the waiting list might still not enable you to ensure a spot. Moreover, due to the hardware costs we cannot have students audit this class
This course was developed by Pedro Lopes. All teaching materials in this class, including course slides, homeworks, assignments, practice exams and quizzes, are copyrighted. Reproduction, redistribution and other rights solely belong to the instructor. In particular, it is not permissible to upload any or part of these materials to public or private websites without the instructor's explicit consent. Violating this copyright policy will be considered an academic integrity violation.
The University of Chicago has formal policies related to academic honesty and plagiarism. We abide by these standards in this course. Depending on the severity of the offense, you risk being dismissed altogether from the course. All cases will be referred to the Dean of Students office, which may impose further penalties, including suspension and expulsion. In addition, we expect that everyone handles their fellow students and staff members with respect, following the norms of proper behavior by members of the University of Chicago community.
If you have a impariment of any kind please communicate it to the instructor and you will do the best to accomodate it, e.g., you will be provided with the suitable course materials.