Courses in embedded systems can approach the subject from a variety of perspectives, ranging from emphasis on hardware, emphasis on software, or emphasis on system design. This paper describes a course in embedded systems that requires students to develop software to control a system that is physically available in the laboratory. The hardware models a rapid transit system that is controlled using a distributed system consisting of five independent microcontrollers, communicating with each other via Ethernet. Designing the control software includes communicating with the other microcontrollers via UDP packets, communicating with the system hardware, and providing a web page to report status and accept system parameters such as tram speed and station waiting time. Students use an open-source operating system for their software, which they write in the C language; the operating system uses cooperative threads and provides library functions for serial and Ethernet input/output. The semester goal is to properly control as many trams as possible, with safety interlocks implemented. The physical system allows students to see the results of their software.