Cornell University
School of Electrical and Computer Engineering
ENGRG 1060 Explorations in Engineering
Computer Engineering Unit
Prof. Christopher Batten
237 Phillips Hall • July 14–19, 2013
home | lecture | lab | photos | video | sponsors
The field of computer engineering is at the interface between hardware and software and seeks to balance the tension between application requirements and technology constraints. In an earlier lab session, students already became familiar with basic electrical circuits and explored the field of computer engineering from the hardware perspective by building a basic digital adder. In this lab session, students worked in groups of two to explore the field of computer engineering from a software perspective by incrementally building a mobile robot control application using the popular Arduino micro-controller. For detailed information about the lab see the following lab notes and handout. The lab notes review background information while the lab handout was used by students during the lab session.
Lab Overview
Students started by compiling and running a basic Arduino program that simply adds two numbers together. By examining the compiled assembly code, students were able to see first-hand how high-level programming language constructs (e.g., +) are turned into low-level machine instructions (e.g., add instruction). Students then experimented with the light-emitting diodes (LEDs), switches, and potentiometers included as part of the mobile robotic platform, before testing the grayscale analog sensor and drive motors. Once students had a good feel for the basic sensors and actuators on the robot, they incrementally developed the full mobile robot control application in three steps: (1) develop a move-and-stop behavior; (2) develop wander behavior; and (3) develop a wander-to-target behavior.
The following two photos show students working on the lab. The left photo shows two students beginning to program their robot using the Arduino development environment. The right photo shows several groups testing their robots on the playing fields.
Lab Hardware
To support the lab, we developed an Arduino-based mobile robotic platform using the DFRobot Turtle 2WD chasis, official Arduino motor controller shield, and the Maker Shed MakerShield Kit. We also added two mechanical bump switches and an infrared range finder for obstacle avoidance. Finally, we added an analog grayscale sensor to the bottom of the robot for detecting the target. We also built custom U-shaped playing fields measuring approximately 4'x3', with extra movable obstacles for advanced students.
Lab Software
We provided scholars with a simple template defining the appropriate
pin numbers and setup code. Scholars were responsible for writing
the loop
function to implement their mobile robot control
application. The following code illustrates a simple solution to the
lab which causes the robot to wander the playing field, avoid
obstacles, and spin when it finds the target.
void loop() { // Read mechanical bump sensors int bumped_left = digitalRead( pin_bump_left ); int bumped_right = digitalRead( pin_bump_right ); // If robot has bumped into an obstacle, then backup and rotate if ( bumped_left or bumped_right ) { // Make robot go backwards digitalWrite( pin_motor_left_dir, HIGH ); digitalWrite( pin_motor_right_dir, HIGH ); delay(1000); // Make robot rotate digitalWrite( pin_motor_left_dir, LOW ); digitalWrite( pin_motor_right_dir, HIGH ); delay(500); } // Read analog grayscale sensor int light = analogRead( pin_grayscale_sensor ); // If robot is over the target, then spin and stop if ( light > 300 ) { // Make robot spin digitalWrite( pin_motor_left_dir, LOW ); digitalWrite( pin_motor_right_dir, HIGH ); delay(5000); // Make robot stop forever analogWrite( pin_motor_left_speed, 0 ); analogWrite( pin_motor_right_speed, 0 ); while (1); } // Make robot move forward digitalWrite( pin_motor_left_dir, LOW ); digitalWrite( pin_motor_right_dir, LOW ); analogWrite( pin_motor_left_speed, 100 ); analogWrite( pin_motor_right_speed, 100 ); }