JANUARY - MAY 2017
Semester long struggle with a Raspberry Pi and its added components.
Source code provided upon request (since this is an ongoing class at CMU).
- Developed loadable kernel modules (LKMs) that allow user-space applications to interact with hardware devices.
- Utilized those LKMs to interface with the board's encoders and motor
- Created a PID controller for the motor controlling speed and position
- Developed a basic kernel for the device, including user space isolation, interrupts, support for programs in the user space, handling of system calls, task scheduling, and synchronization
- Implemented context switching and task management, fixed priority rate-monotonic scheduling with admission control, and real-time synchronization using the highest locker variant of the priority ceiling protocol
- Interacted with Memory Mapped IO by interfacing with embedded peripheral devices
- Implemented support for UART and I2C peripherals for the Raspberry Pi
- Developed a simple impulse detector using the microphone and LEDs of the device
- Developed a frequency detection program (using real-input Discrete Fourier Transforms)
- Interfaced with the board's OLED screen to offer visualizations about the device's status (e.g. tasks running)
For a semester long, I programmed an embedded system from bottom (kernel level) to top (user level). Although the kernel development was interesting to understand how the whole system worked, the most useful part of the course was creating the user applications that interfaced with the various devices on the board. Programming an LKM for the Linux device on the Raspberry Pi allowed me to interface with the various parts on the board, and once that was set up, the user application could interact with the various features implemented through the LKM. So, developing a PID controller to speed up the motor or move it to a particular position was especially challenging, yet applicable.
Aerial view of the device we interfaced with
Some of the devices attached: Motor, rotary dial, microphone, Ethernet port, switches, light sensor, etc.
Motor spinning when turned on by the rotary dial