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

 
 
 

Languages