Skip to content

makeabilitylab/makelab-arduino-lib

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Makeability Lab Arduino Library

A library for Arduino that provides useful classes for physical computing projects, including joystick input, OLED graphics, signal filtering, and more. Created for courses at the Makeability Lab, University of Washington.

📖 Interactive textbook: makeabilitylab.github.io/physcomp

What's Included

Class Header Description
ParallaxJoystick ParallaxJoystick.hpp Read input from a Parallax 2-Axis Joystick, with support for different orientations
Button Button.hpp Debounced digital button with press/release detection
Shape, Rectangle, RoundRect, Triangle, Circle, Ball Shape.hpp Drawing primitives with collision detection, velocity, and boundary checking for monochrome OLEDs (Adafruit SSD1306)
ScrollingLineGraph ScrollingLineGraph.hpp Single-value scrolling line graph for OLEDs
ScrollingLineGraphMultiValue ScrollingLineGraphMultiValue.hpp Multi-value scrolling line graph with per-line symbols
MovingAverageFilter MovingAverageFilter.hpp Sliding-window moving average for smoothing sensor input
ColorName ColorName.hpp Named RGB colors with closest-color matching (e.g., for color sensors)
FileUtils FileUtils.hpp SD card file utilities: list, count, and search files by extension

Installation

Option 1: Arduino Library Manager (recommended)

In the Arduino IDE: Sketch → Include Library → Manage Libraries…, then search for "Makeability Lab" and click Install.

This will also automatically install the required dependencies (Adafruit SSD1306 and Adafruit GFX).

Option 2: Clone from GitHub

git clone https://github.com/makeabilitylab/makelab-arduino-lib.git

Then copy (or symlink) the folder into your Arduino libraries directory:

OS Libraries path
Windows C:\Users\<YourName>\Documents\Arduino\libraries\
macOS ~/Documents/Arduino/libraries/
Linux ~/Arduino/libraries/

Verify installation

After installing, open one of the example sketches below (File → Examples → Makeability Lab). If it compiles, you're all set.

Quick Start

Include the header you need at the top of your sketch:

#include <Shape.hpp>            // for Shape, Rectangle, RoundRect, Triangle, Circle, Ball
#include <ParallaxJoystick.hpp> // for joystick input
#include <Button.hpp>           // for debounced buttons

Examples

These example sketches are included with the library (File → Examples → Makeability Lab):

Example What it demonstrates
BallBounceObjectOriented Ball with velocity, boundary detection, isOutOfBoundsX/Y
BallBounceShapes Shows all shape, collision detection with overlaps()
FlappyBird Game loop, subclassing Rectangle, collision with overlaps()
Pong Two-player input (joystick + buttons), ball-paddle collision, scoring
MoveBallJoystickTest ParallaxJoystick controlling a Ball on the OLED
CollisionTest Polymorphism with Shape pointers, mixed Ball/Rectangle collision

Dependencies

Some classes require external libraries. If you installed via the Library Manager, these are handled automatically. Otherwise, install them manually via Sketch → Include Library → Manage Libraries…:

This library class Requires
Shape, Rectangle, RoundRect, Triangle, Circle, Ball Adafruit SSD1306, Adafruit GFX
ScrollingLineGraph, ScrollingLineGraphMultiValue Adafruit SSD1306
FileUtils SD (built-in)
ParallaxJoystick, Button, MovingAverageFilter, ColorName (none — standalone)

Class Reference

ParallaxJoystick

Handles analog input from the Parallax 2-axis joystick, with support for different physical orientations (UP, RIGHT, DOWN, LEFT).

ParallaxJoystick joystick(A0, A1);                    // up/down pin, left/right pin
ParallaxJoystick joystick(A0, A1, 1023, RIGHT);       // with max analog value and orientation

void setup() { }

void loop() {
  joystick.read();
  int upDown = joystick.getUpDownVal();       // 0–1023
  int leftRight = joystick.getLeftRightVal(); // 0–1023
}

Button

Debounced button input with configurable debounce time and active-low/active-high support.

Button myButton(2);           // pin 2, 25ms debounce, internal pull-up, active low

void setup() {
  myButton.begin();           // must call before read()
}

void loop() {
  myButton.read();
  if (myButton.isPressed()) { /* button is held down */ }
  if (myButton.wasPressed()) { /* button was just released */ }
}

Shape / Rectangle / RoundRect / Triangle / Circle / Ball

Drawing primitives for SSD1306 OLEDs with bounding-box collision detection. All shapes support velocity (setSpeed, update, reverseXSpeed, reverseYSpeed) and boundary checking (isOutOfBoundsX, isOutOfBoundsY, forceInside).

Circle ball(64, 32, 5);       // xCenter, yCenter, radius
Rectangle paddle(0, 28, 5, 8); // x, y, width, height

ball.setDrawFill(true);
ball.setSpeed(1, 1);          // any shape can have velocity

void loop() {
  ball.update();

  if (ball.isOutOfBoundsX(0, 128)) ball.reverseXSpeed();
  if (ball.isOutOfBoundsY(0, 64))  ball.reverseYSpeed();
  ball.forceInside(0, 0, 128, 64);

  if (ball.overlaps(paddle)) {
    ball.reverseXSpeed();
  }

  display.clearDisplay();
  ball.draw(display);
  paddle.draw(display);
  display.display();
}

Additional shape classes:

RoundRect button(10, 2, 50, 12, 3);   // x, y, width, height, cornerRadius
Triangle arrow(60, 20, 80, 32, 60, 44); // three (x,y) vertices

Ball is kept for backwards compatibility — it's just a Circle with checkXBounce/checkYBounce convenience methods (equivalent to isOutOfBoundsX/isOutOfBoundsY on any shape).

MovingAverageFilter

Smooths noisy sensor input with a sliding-window average.

MovingAverageFilter filter(10);  // window size of 10

void loop() {
  int raw = analogRead(A0);
  filter.add(raw);
  int smoothed = filter.getAverage();
}

ScrollingLineGraph

Real-time scrolling graph for visualizing sensor data on an OLED.

ScrollingLineGraph graph(128, 64);  // width, height in pixels
graph.setDataLabel("Sensor");

void loop() {
  graph.addData(analogRead(A0));
  display.clearDisplay();
  graph.draw(display);
  display.display();
}

ScrollingLineGraphMultiValue

Like ScrollingLineGraph but supports multiple data series with distinct symbols.

PointSymbol symbols[] = {CIRCLE, SQUARE};
ScrollingLineGraphMultiValue graph(2, symbols);

void loop() {
  graph.addData(0, analogRead(A0));  // line 0
  graph.addData(1, analogRead(A1));  // line 1
  display.clearDisplay();
  graph.draw(display);
  display.display();
}

Author

Jon E. Froehlich Professor, Allen School of Computer Science & Engineering, University of Washington Director, Makeability Lab

License

This library is released under the MIT License.

About

Reusable Arduino code for the Makeability Lab

Resources

License

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages