Hoop Dreams: Building Pains

Though the concept for my interactive basketball hoop project is quite simple, the most frustrating part was building the actual unit. The finished product has four main components:

1. The computer and MakeyMakey: the brains of the product.

2. The stand: a small box my vacuum cleaner came in.  The backboard hangs from the top of the box, and houses and protects the MakeyMakey and some of the wiring.  I also placed a bunch of heavy books in it to weigh it down and keep it stable.

Inside the stand: housing the MakeyMakey

Inside the stand: housing the MakeyMakey

3. The backboard, hoop, and ball: I purchased these as a set from Amazon and attached a bottomless plastic contained to the rim to funnel the ball so that it goes straight down; and,

4. The landing ramp: which consists of a small box top to which I embedded two arcade buttons, and used a cardboard paper towel tube as a beam so that it would hang from an angle.

By far the landing ramp was the most difficult component to create and went through a few incarnations before I designed the most optimal model.  My first idea was to embed the arcade buttons in a piece of foam core measuring approximately 3″ by 5″.  This was difficult to use from the get-go because I could not figure out an effective way to bind it to the stand at an angle, and sometimes the ball would miss the ramp completely because it was too short.

My next idea was to create a sort of landing pad on the floor.  For this I used an 11″ x 8 1/2″ x 2″ box made of strong cardboard and embedded the buttons on top of the box and simply laid it on the floor.  This was more problematic because the landing pad was further from the base of the funnel giving the ball more time to go off course and miss the button.  I also found that the box itself was too flexible so when the ball did make contact with a button, sometimes the button wouldn’t be pressed because the box could not provide enough resistance to the force of the ball coming down onto it.  I also found that, occasionally, the ball would bounce too much on the box and push the button twice, or push both buttons.  This was frustrating, and at that point, my wife told me to take a break for the rest of that particular night.

I came up with this disaster of an idea prior to the landing pad

I came up with this disaster of an idea prior to the landing pad. The problems here are self-evident.

Landing Pad

Landing Pad

Landing Pad 2

Landing Pad 2

In the end, I decided to combine my first two ideas.  I cut the top off the box, leaving the front and side flaps intact.  I attached the back of the box top to the stand using cable ties.  I took the cardboard roll from a roll of paper towels and bound one end to the front flap of the box top and the stand, again, using cable ties.  The cardboard roll serves as a beam for the landing ramp, maintaining its angle, and helps reduce some of the flexibility issues previously discussed.

The support beam and buttons underneath the landing ramp

The support beam and buttons underneath the landing ramp

The final product

The final Product

I did my final experiment and I made 100 shots sitting from about four feet away.  The hoop stands about a foot and a half off the ground.  Of the 100 made shots, the buttons were set off 82 times, and only one shot bounced on the button twice, double counting the point (I only counted that as 1). The design still is not perfect.  I have found that when the ball goes straight through the hoop from an angle, it is less likely to hit a button than a ball that bounces or rattles through.  Sometimes the ball will hit in between the buttons when it goes straight in.  I was also found that sometime the ball just did not hit the button accurately enough to push it.  Ultimately, what I needed was a larger button.  One that was four inches in diameter would have been more helpful and would have led to more accurate scoring.

Screen shot of Final Experiment

Screen shot of Final Experiment in Presentation Mode, it reads 83 only because one shot double-counted, it should read 82.

Going through the process of creating this basketball hoop, I came to appreciate the workmanship and ingenuity that go into creating arcade games like whack-a-mole, skee ball, and pinball.  The unfortunate thing is that we don’t often associate “workmanship” and “ingenuity” with these kinds of games.  I don’t exactly know why.  Perhaps its because of their slow-but-inevitable obsolescence with the advent of  home video game systems like XBox and Playstation 4, superior technology.  It could also be that they’re associated with the waste of time and money with visions of children popping quarters to best the current high score.  Putting aside the ethics of profiting off childhood game addiction (which is still very much an issue today), the creators of these games deserve recognition for the work that they have done.  Creating my basketball hoop was challenging, and took many hours to conceptualize and build, and it’s still not working properly.  I don’t know that I am inspired by their work because, ultimately, these games do little to improve the overall quality of life of their communities, but I do appreciate the technology and creativity that has gone into them, and let’s face it, they’re freaking fun.

Advertisements

Improved Max 6 Patch for the Interactive Basketball Hoop

Simply copy the following raw data and paste it into your own Max 6 patch.  Back to Hoop Dreams: Programming Problems.

{
“boxes” : [ {
“box” : {
“maxclass” : “newobj”,
“text” : “trigger 0 l”,
“id” : “obj-16”,
“fontname” : “Arial”,
“numinlets” : 1,
“numoutlets” : 2,
“fontsize” : 12.0,
“outlettype” : [ “int”, “” ],
“patching_rect” : [ 498.0, 51.0, 61.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “0”,
“id” : “obj-13”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 12.0,
“outlettype” : [ “” ],
“patching_rect” : [ 120.5, 445.0, 32.5, 18.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “1”,
“id” : “obj-6”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 12.0,
“outlettype” : [ “” ],
“patching_rect” : [ 279.75, 343.0, 32.5, 18.0 ]
}
}
,  {
“box” : {
“maxclass” : “comment”,
“text” : “RESET”,
“presentation” : 1,
“id” : “obj-68”,
“fontname” : “Arial”,
“frgb” : 0.0,
“numinlets” : 1,
“numoutlets” : 0,
“fontsize” : 20.0,
“presentation_rect” : [ 684.0, 86.5, 230.0, 29.0 ],
“patching_rect” : [ 564.0, 11.0, 230.0, 29.0 ]
}
}
,  {
“box” : {
“maxclass” : “comment”,
“text” : “SCORE”,
“presentation” : 1,
“id” : “obj-46”,
“fontname” : “Arial”,
“frgb” : 0.0,
“numinlets” : 1,
“numoutlets” : 0,
“fontsize” : 20.0,
“presentation_rect” : [ 409.5, 21.0, 236.0, 29.0 ],
“patching_rect” : [ 564.0, 209.5, 236.0, 29.0 ]
}
}
,  {
“box” : {
“maxclass” : “number”,
“varname” : “number”,
“presentation” : 1,
“id” : “obj-39”,
“fontname” : “Arial”,
“parameter_enable” : 0,
“numinlets” : 1,
“numoutlets” : 2,
“fontsize” : 72.0,
“presentation_rect” : [ 409.5, 52.0, 163.0, 87.0 ],
“outlettype” : [ “int”, “bang” ],
“patching_rect” : [ 564.0, 96.0, 163.0, 87.0 ]
}
}
,  {
“box” : {
“maxclass” : “newobj”,
“text” : “counter”,
“id” : “obj-32”,
“fontname” : “Arial”,
“numinlets” : 5,
“numoutlets” : 4,
“fontsize” : 12.0,
“outlettype” : [ “int”, “”, “”, “int” ],
“patching_rect” : [ 311.75, 163.0, 73.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “number”,
“id” : “obj-14”,
“fontname” : “Arial”,
“parameter_enable” : 0,
“numinlets” : 1,
“numoutlets” : 2,
“fontsize” : 12.0,
“outlettype” : [ “int”, “bang” ],
“patching_rect” : [ 381.5, 59.0, 50.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “newobj”,
“text” : “key”,
“id” : “obj-12”,
“fontname” : “Arial”,
“numinlets” : 0,
“numoutlets” : 4,
“fontsize” : 12.0,
“outlettype” : [ “int”, “int”, “int”, “int” ],
“patching_rect” : [ 279.75, 11.0, 59.5, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “newobj”,
“text” : “select 32”,
“id” : “obj-10”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 2,
“fontsize” : 12.0,
“outlettype” : [ “bang”, “” ],
“patching_rect” : [ 279.75, 59.0, 59.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “button”,
“id” : “obj-4”,
“numinlets” : 1,
“numoutlets” : 1,
“outlettype” : [ “bang” ],
“patching_rect” : [ 279.75, 96.0, 20.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “live.gain~”,
“varname” : “live.gain~”,
“presentation” : 1,
“id” : “obj-5”,
“parameter_enable” : 1,
“numinlets” : 2,
“fontface” : 0,
“numoutlets” : 5,
“fontsize” : 12.0,
“showname” : 0,
“presentation_rect” : [ 480.5, 278.0, 54.0, 136.0 ],
“outlettype” : [ “signal”, “signal”, “”, “float”, “list” ],
“patching_rect” : [ 50.5, 445.0, 54.0, 136.0 ],
“saved_attribute_attributes” : {
“valueof” : {
“parameter_unitstyle” : 4,
“parameter_mmax” : 6.0,
“parameter_mmin” : -70.0,
“parameter_initial” : [ -70 ],
“parameter_type” : 0,
“parameter_initial_enable” : 1,
“parameter_shortname” : “live.gain~”,
“parameter_longname” : “live.gain~”
}
}
}
}
,  {
“box” : {
“maxclass” : “ezdac~”,
“prototypename” : “helpfile”,
“presentation” : 1,
“id” : “obj-7”,
“local” : 1,
“numinlets” : 2,
“border” : 1.75,
“numoutlets” : 0,
“presentation_rect” : [ 480.5, 428.0, 44.0, 44.0 ],
“bgcolor” : [ 1.0, 1.0, 1.0, 1.0 ],
“patching_rect” : [ 50.5, 595.0, 44.0, 44.0 ],
“bordercolor” : [ 0.501961, 0.501961, 0.501961, 1.0 ]
}
}
,  {
“box” : {
“maxclass” : “newobj”,
“text” : “sfplay~ 2”,
“id” : “obj-43”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 3,
“fontsize” : 13.0,
“outlettype” : [ “signal”, “signal”, “bang” ],
“patching_rect” : [ 50.5, 398.0, 89.0, 21.0 ],
“save” : [ “#N”, “sfplay~”, “”, 2, 40320, 0, “”, “;” ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “open”,
“id” : “obj-41”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 13.0,
“outlettype” : [ “” ],
“patching_rect” : [ 50.5, 352.0, 39.0, 19.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “set 0”,
“presentation” : 1,
“id” : “obj-66”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 20.0,
“presentation_rect” : [ 619.0, 86.5, 55.0, 27.0 ],
“outlettype” : [ “” ],
“patching_rect” : [ 498.0, 11.0, 54.0, 27.0 ]
}
}
 ],
“lines” : [ {
“patchline” : {
“source” : [ “obj-66”, 0 ],
“destination” : [ “obj-16”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-6”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-5”, 0 ],
“destination” : [ “obj-7”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-5”, 1 ],
“destination” : [ “obj-7”, 1 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-43”, 0 ],
“destination” : [ “obj-5”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-43”, 1 ],
“destination” : [ “obj-5”, 1 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-43”, 2 ],
“destination” : [ “obj-13”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-41”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-4”, 0 ],
“destination” : [ “obj-6”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-4”, 0 ],
“destination” : [ “obj-32”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-32”, 0 ],
“destination” : [ “obj-39”, 0 ],
“hidden” : 0,
“midpoints” : [ 321.25, 195.0, 549.0, 195.0, 549.0, 93.0, 573.5, 93.0 ],
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-16”, 1 ],
“destination” : [ “obj-39”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-16”, 0 ],
“destination” : [ “obj-32”, 3 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-13”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“midpoints” : [ 130.0, 465.0, 117.0, 465.0, 117.0, 429.0, 36.0, 429.0, 36.0, 393.0, 60.0, 393.0 ],
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-12”, 0 ],
“destination” : [ “obj-14”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-12”, 0 ],
“destination” : [ “obj-10”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-10”, 0 ],
“destination” : [ “obj-4”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
 ],
“appversion” : {
“major” : 6,
“minor” : 0,
“revision” : 8
}
}

Problematic Max 6 Patch for the Interactive Basketball Hoop

Simply copy and paste the following raw data into your own Max 6 patch.  Back to Hoop Dreams: Programming Problems. 
{
“boxes” : [ {
“box” : {
“maxclass” : “comment”,
“text” : “RESET”,
“presentation” : 1,
“id” : “obj-68”,
“fontname” : “Arial”,
“frgb” : 0.0,
“numinlets” : 1,
“numoutlets” : 0,
“fontsize” : 20.0,
“presentation_rect” : [ 684.0, 86.5, 230.0, 29.0 ],
“patching_rect” : [ 740.0, 283.0, 230.0, 29.0 ]
}
}
,  {
“box” : {
“maxclass” : “comment”,
“text” : “SCORE”,
“presentation” : 1,
“id” : “obj-46”,
“fontname” : “Arial”,
“frgb” : 0.0,
“numinlets” : 1,
“numoutlets” : 0,
“fontsize” : 20.0,
“presentation_rect” : [ 409.5, 21.0, 236.0, 29.0 ],
“patching_rect” : [ 766.0, 176.0, 236.0, 29.0 ]
}
}
,  {
“box” : {
“maxclass” : “number”,
“varname” : “number”,
“presentation” : 1,
“id” : “obj-39”,
“fontname” : “Arial”,
“parameter_enable” : 0,
“numinlets” : 1,
“numoutlets” : 2,
“fontsize” : 72.0,
“presentation_rect” : [ 409.5, 52.0, 163.0, 87.0 ],
“outlettype” : [ “int”, “bang” ],
“patching_rect” : [ 787.5, 39.0, 163.0, 87.0 ]
}
}
,  {
“box” : {
“maxclass” : “newobj”,
“text” : “counter”,
“id” : “obj-32”,
“fontname” : “Arial”,
“numinlets” : 5,
“numoutlets” : 4,
“fontsize” : 12.0,
“outlettype” : [ “int”, “”, “”, “int” ],
“patching_rect” : [ 318.0, 163.0, 73.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “toggle”,
“presentation” : 1,
“id” : “obj-40”,
“parameter_enable” : 0,
“numinlets” : 1,
“numoutlets” : 1,
“presentation_rect” : [ 402.0, 184.0, 20.0, 20.0 ],
“outlettype” : [ “int” ],
“patching_rect” : [ 280.0, 351.0, 20.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “button”,
“id” : “obj-33”,
“numinlets” : 1,
“numoutlets” : 1,
“outlettype” : [ “bang” ],
“patching_rect” : [ 400.0, 118.0, 20.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “number”,
“id” : “obj-14”,
“fontname” : “Arial”,
“parameter_enable” : 0,
“numinlets” : 1,
“numoutlets” : 2,
“fontsize” : 12.0,
“outlettype” : [ “int”, “bang” ],
“patching_rect” : [ 354.0, 58.0, 50.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “newobj”,
“text” : “key”,
“id” : “obj-12”,
“fontname” : “Arial”,
“numinlets” : 0,
“numoutlets” : 4,
“fontsize” : 12.0,
“outlettype” : [ “int”, “int”, “int”, “int” ],
“patching_rect” : [ 307.0, 18.0, 59.5, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “newobj”,
“text” : “select 32”,
“id” : “obj-10”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 2,
“fontsize” : 12.0,
“outlettype” : [ “bang”, “” ],
“patching_rect” : [ 258.5, 49.0, 59.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “button”,
“id” : “obj-4”,
“numinlets” : 1,
“numoutlets” : 1,
“outlettype” : [ “bang” ],
“patching_rect” : [ 286.0, 87.0, 20.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “toggle”,
“id” : “obj-6”,
“parameter_enable” : 0,
“numinlets” : 1,
“numoutlets” : 1,
“outlettype” : [ “int” ],
“patching_rect” : [ 454.5, 391.0, 20.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “loop $1”,
“id” : “obj-2”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 13.0,
“outlettype” : [ “” ],
“patching_rect” : [ 454.5, 422.0, 54.0, 19.0 ]
}
}
,  {
“box” : {
“maxclass” : “comment”,
“text” : “play/stop current file”,
“presentation” : 1,
“id” : “obj-9”,
“fontname” : “Arial”,
“frgb” : 0.0,
“numinlets” : 1,
“numoutlets” : 0,
“fontsize” : 13.0,
“presentation_rect” : [ 434.0, 184.0, 147.0, 25.0 ],
“bubble” : 1,
“patching_rect” : [ 300.0, 351.0, 147.0, 25.0 ]
}
}
,  {
“box” : {
“maxclass” : “comment”,
“text” : “open an audio file “,
“id” : “obj-27”,
“fontname” : “Arial”,
“frgb” : 0.0,
“numinlets” : 1,
“numoutlets” : 0,
“fontsize” : 13.0,
“bubble” : 1,
“patching_rect” : [ 102.5, 351.0, 137.0, 25.0 ]
}
}
,  {
“box” : {
“maxclass” : “live.gain~”,
“varname” : “live.gain~”,
“presentation” : 1,
“id” : “obj-5”,
“parameter_enable” : 1,
“numinlets” : 2,
“fontface” : 0,
“numoutlets” : 5,
“fontsize” : 12.0,
“showname” : 0,
“presentation_rect” : [ 480.5, 278.0, 54.0, 136.0 ],
“outlettype” : [ “signal”, “signal”, “”, “float”, “list” ],
“patching_rect” : [ 50.5, 445.0, 54.0, 136.0 ],
“saved_attribute_attributes” : {
“valueof” : {
“parameter_unitstyle” : 4,
“parameter_mmax” : 6.0,
“parameter_mmin” : -70.0,
“parameter_initial” : [ -70 ],
“parameter_type” : 0,
“parameter_initial_enable” : 1,
“parameter_shortname” : “live.gain~”,
“parameter_longname” : “live.gain~”
}
}
}
}
,  {
“box” : {
“maxclass” : “ezdac~”,
“prototypename” : “helpfile”,
“presentation” : 1,
“id” : “obj-7”,
“local” : 1,
“numinlets” : 2,
“border” : 1.75,
“numoutlets” : 0,
“presentation_rect” : [ 480.5, 428.0, 44.0, 44.0 ],
“bgcolor” : [ 1.0, 1.0, 1.0, 1.0 ],
“patching_rect” : [ 50.5, 595.0, 44.0, 44.0 ],
“bordercolor” : [ 0.501961, 0.501961, 0.501961, 1.0 ]
}
}
,  {
“box” : {
“maxclass” : “button”,
“id” : “obj-42”,
“numinlets” : 1,
“numoutlets” : 1,
“outlettype” : [ “bang” ],
“patching_rect” : [ 120.5, 523.0, 20.0, 20.0 ]
}
}
,  {
“box” : {
“maxclass” : “newobj”,
“text” : “sfplay~ 2”,
“id” : “obj-43”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 3,
“fontsize” : 13.0,
“outlettype” : [ “signal”, “signal”, “bang” ],
“patching_rect” : [ 50.5, 398.0, 89.0, 21.0 ],
“save” : [ “#N”, “sfplay~”, “”, 2, 40320, 0, “”, “;” ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “seek 300”,
“id” : “obj-34”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 13.0,
“outlettype” : [ “” ],
“patching_rect” : [ 444.0, 571.0, 65.0, 19.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “seek 300 600”,
“id” : “obj-35”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 13.0,
“outlettype” : [ “” ],
“patching_rect” : [ 420.0, 538.0, 89.0, 19.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “resume”,
“id” : “obj-36”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 13.0,
“outlettype” : [ “” ],
“patching_rect” : [ 454.0, 482.0, 55.0, 19.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “pause”,
“id” : “obj-37”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 13.0,
“outlettype” : [ “” ],
“patching_rect” : [ 462.5, 455.0, 47.0, 19.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “open”,
“id” : “obj-41”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 13.0,
“outlettype” : [ “” ],
“patching_rect” : [ 50.5, 351.0, 40.0, 19.0 ]
}
}
,  {
“box” : {
“maxclass” : “message”,
“text” : “set 0”,
“presentation” : 1,
“id” : “obj-66”,
“fontname” : “Arial”,
“numinlets” : 2,
“numoutlets” : 1,
“fontsize” : 20.0,
“presentation_rect” : [ 619.0, 86.5, 55.0, 27.0 ],
“outlettype” : [ “” ],
“patching_rect” : [ 543.0, 218.0, 54.0, 27.0 ]
}
}
,  {
“box” : {
“maxclass” : “textbutton”,
“hint” : “”,
“id” : “obj-11”,
“fontname” : “Arial”,
“rounded” : 60.0,
“parameter_enable” : 0,
“textcolor” : [ 0.34902, 0.34902, 0.34902, 1.0 ],
“textovercolor” : [ 0.2, 0.2, 0.2, 1.0 ],
“numinlets” : 1,
“border” : 0,
“fontface” : 1,
“numoutlets” : 3,
“fontsize” : 13.0,
“text” : “2”,
“outlettype” : [ “”, “”, “int” ],
“background” : 1,
“bgcolor” : [ 1.0, 0.788235, 0.470588, 1.0 ],
“patching_rect” : [ 260.0, 351.0, 20.0, 20.0 ],
“ignoreclick” : 1,
“bordercolor” : [ 0.0, 0.0, 0.0, 1.0 ]
}
}
,  {
“box” : {
“maxclass” : “textbutton”,
“hint” : “”,
“id” : “obj-93”,
“fontname” : “Arial”,
“rounded” : 60.0,
“parameter_enable” : 0,
“textcolor” : [ 0.34902, 0.34902, 0.34902, 1.0 ],
“textovercolor” : [ 0.2, 0.2, 0.2, 1.0 ],
“numinlets” : 1,
“border” : 0,
“fontface” : 1,
“numoutlets” : 3,
“fontsize” : 13.0,
“text” : “1”,
“outlettype” : [ “”, “”, “int” ],
“background” : 1,
“bgcolor” : [ 1.0, 0.788235, 0.470588, 1.0 ],
“patching_rect” : [ 30.5, 351.0, 20.0, 20.0 ],
“ignoreclick” : 1,
“bordercolor” : [ 0.0, 0.0, 0.0, 1.0 ]
}
}
 ],
“lines” : [ {
“patchline” : {
“source” : [ “obj-66”, 0 ],
“destination” : [ “obj-39”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-66”, 0 ],
“destination” : [ “obj-32”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-6”, 0 ],
“destination” : [ “obj-2”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-5”, 0 ],
“destination” : [ “obj-7”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-5”, 1 ],
“destination” : [ “obj-7”, 1 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-43”, 0 ],
“destination” : [ “obj-5”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-43”, 1 ],
“destination” : [ “obj-5”, 1 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-43”, 2 ],
“destination” : [ “obj-42”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-41”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-40”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-4”, 0 ],
“destination” : [ “obj-40”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-4”, 0 ],
“destination” : [ “obj-32”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-37”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-36”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-35”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-34”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-33”, 0 ],
“destination” : [ “obj-32”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-32”, 0 ],
“destination” : [ “obj-39”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-2”, 0 ],
“destination” : [ “obj-43”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-12”, 0 ],
“destination” : [ “obj-14”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-12”, 0 ],
“destination” : [ “obj-10”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-10”, 0 ],
“destination” : [ “obj-4”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
,  {
“patchline” : {
“source” : [ “obj-10”, 1 ],
“destination” : [ “obj-33”, 0 ],
“hidden” : 0,
“disabled” : 0
}
}
 ],
“appversion” : {
“major” : 6,
“minor” : 0,
“revision” : 8
}
}

Hoop Dreams: Programming Problems

In my initial plan, I had a vision of creating a hoop that could record both made shots and misses.  I had to almost threw this idea out because it was too difficult program the hoop to differentiate between a made shot and missed shot.  One idea was to attach buttons or sensors to the backboard but obviously a user could bank a shot and get it through the hoop.  Another idea was to use vibration sensors but the hoop vibrates significantly even when the ball goes in because of the flimsiness of the basket, the flexibility of the rim, and its overall light weight.  The other challenge was to record air balls, balls that don’t touch the rim or backboard.  This would require different technology like a camera that would be programmed to see the ball and basket and see it miss the hoop.  This would have taken weeks to program, not to mention the fact I have no idea how to program such an idea.

I am using Max 6 software to provide the sound effects and keep score.  Initially, I wanted to use sounds from the commentator off of Midway’s NBA Jam, and give the hoop a bit of a retro feel and pay tribute to one of the most entertaining sports video games of all time.  I found one website that had those sound bytes on a Flash soundboard.  There was not a clear way to download these sounds so I tried some programs that would supposedly allow me to rip the sounds like Soundflower and Jack but to no avail.  So I had to settle for using a free license sound byte from SoundBible.com of a crowd cheering in lieu of a commentator.  Now I could have still used the soundboard by hovering the cursor over one of the icons and clipped the MakeyMakey to receive mouse click messages and have the NBA Jam sounds come that way.  I decided not to do that since I didn’t want to have so many components to the project and I could only have one NBA sound byte going at the same time.  The NBA Jam sound bytes get really annoying if you hear one over and over repeatedly.

Another issue I had was a little more technical in nature.  I was able to create a counter on Max 6 to keep score, along with a reset button.  The challenge I had was that the counter would not count the first press of the button, it was only after the second press that it would count “1.”  I also struggled with the toggle switch on Max because the toggle switch would turn the sound effects on and off.  Therefore, when the arcade button is pressed, it triggers the toggle switch which will turn the sound effect on; however, if the sound effect is still playing and the button is struck again, it will turn the sound effect off.  What I wanted was the button to only turn the sound effect on.

I contacted Bill Turkel about these issues and he was able to tweak my patch and fix the issues. What he did was replace the toggle with a message that communicates to the sfplay to only play the sound clip.  He also added a trigger between the counter and integer  that tells it to goes directly to “1” when the button is struck.  See the before and after images below.  If you would like to play with the patches on your own computers, here’s a link to the raw data for the old patch and the new patch.

Problematic Max 6 patch for the interactive basketball hoop

Problematic Max 6 patch for the interactive basketball hoop

Functional Max 6 Patch for the interactive basketball hoop

Functional Max 6 Patch for the interactive basketball hoop

Basically, the programming problems are resolved.  The next blog post will continue to talk about the construction of the basketball hoop itself.

Hoop Dreams

Earlier this week I made my first attempt at creating an interactive basketball hoop.  I went into the lab with Bill Turkel to do some preliminary testing to see what we could do.  My initial idea for this hoop came back in January, and now I’ve finally made some headway on this project.  As a hoop I am using a mini Baden glow-in-the dark basketball hoop.  The brand or the fact that it glows in the dark doesn’t matter for this project, but it’s a durable little hoop, and the ball is made of a synthetic, leather-like material, stuffed with synthetic cotton, like unto what you would find in a stuffed toy.

Baden glow-in-the-dark mini basketball hoop

Baden glow-in-the-dark mini basketball hoop

In order for it to be interactive, we are also involving the use of the MakeyMakey, an easy-to-use invention kit that allows users to send keyboard and mouse messages using arcade buttons and joysticks, and unconventional items such as Play-Doh, fruit, and tin foil.  For this project, I am not using any unconventional items.  The idea is simply that when the basketball goes through the hoop, it makes contact with an arcade button, triggering a sound effect and a score tally.  The MakeyMakey is connected to the laptop via USB cable, and the arcade buttons are connected to the MakeyMakey using wires with alligator clips on each end.  Each button requires two wires to function, one to ground the circuit, and the other to transmit the keyboard or mouse message (see the images below).  In order to keep score and store sound effects, I am also using Max 6 programming software which I will talk about later.

 

Back of MakeyMakey and Alligator Clips

Back of MakeyMakey and Alligator Clips

Front of MakeyMakey

Front of MakeyMakey

The first challenge I came across was that when the ball goes through the hoop, it doesn’t go straight down.  Especially, if it goes straight through (swish), the mesh doesn’t offer much resistance and cannot force the ball straight down.  As you can see in the images above and below, we initially tried to create a cardboard receptacle to receive the ball, but the ball would completely miss the receptacle.  We also found that the receptacle was a little flimsy and the plastic clip we were using to hang the receptacle wasn’t strong enough to handle the pummeling of multiple shots.

Cardboard receptacle with arcade buttons inside

Cardboard receptacle with arcade buttons inside

To resolve the waywardness of the ball, I purchased a simple food storage container from the dollar store with a similar circumference to the basketball rim,  and cut off the base using a Japanese saw.  I then cut three holes in the top rim of the container and attached the container to the basketball rim using cable ties.

Container and Japanese saw

Container and Japanese saw

I am now at a point now where when the ball goes into the hoop, it pretty well funnels down into the same place.  The challenge is to place the buttons in such a way that the ball will strike them every time it goes through the hoop.

 

 

Smack Talk

The progress on my interactive basketball hoop is very slow due to weather conditions in Pennsylvania that have delayed the shipment of the hoop I plan to use for this project.  In the meantime, I did some research on basketball-reference.com since I want the hoop to “trash talk” the user if he/she misses a shot, or encourage the user if he/she makes a basket. I wanted these messages to reflect on basketball players in both the present and the past, hence the use of basketball-reference.  These messages will be communicated on the computer screen that accompanies the basketball hoop using Max 6.  The messages that I have come up with follow.

Encouraging Messages

1. I didn’t know Phoenix Suns guard Steve Nash was playing this game, dang! Career 90% free throw shooter.

2. With the way you’re shooting, you’re well on your way to beating 76ers Wilt Chamberlain’s single game scoring record (100 points).

3. Holy clutch!  You’re shooting like Ray Allen in Game 6 of the 2013 NBA Finals!

4. Your form is as smooth as Michael Jordan’s fade-away

5. Reggie Miller hit 68-straight free throws, have you hit more?

Trash Talk

1. Houston Rockets Center Hakeem Olajuwon had over 3800 blocks in his career, is he guarding you?

2. Shaquille O’Neal of the Los Angeles Lakers shot 53% from the free throw line in his career, are you trying to be worse?

3. Golden State Warriors guard Rick Barry shot his free throws underhand.  Maybe give that a try…

4. Orlando Magic guard Nick Anderson choked and missed four consecutive in the 1995 NBA Finals. Don’t feel too bad about yourself…

5. Clank! Are we in Detroit? Is Andre Drummond in the house?

I don’t expect this product to be highly educational, I just want it to be fun for both hoop fans, and non-hoop fans.  In my next post I hope to let you know of the actual progress of the hoop itself and the programming that will go along with it.

Makey-Makeying the Bucket

Last class I had my first experience with a MaKey MaKey.  A MaKey MaKey is an invention kit that really has endless possibilities.  It can be used to create a musical instrument made of fruit, a joystick for video games, or a drum kit made of Play-Doh.  Check out their website to get a sense of what other creative items you could make.

For my Interactive Exhibit Design course in Western’s Public History program,  we played with MaKey MaKeys for the first time. With my colleague Stacey Devlin, we created some crude cutouts of a basketball hoop and a basketball player and managed–with the help of the MaKey MaKey and Max 6 software, were able to make it so that when the basketball player made contact  with the rim of the basketball hoop, a sound bite of a crowd cheering would go off.  I won’t bore you with the technical aspects of this project, because, well, I couldn’t adequately explain them to you anyway.  The point is that this activity gave me the inspiration for what I think will be my final project for Interactive Exhibit Design.

You know those basketball hoops that you see in arcades?  like this one?

Arcade Basketball Hoop

Arcade Basketball Hoop, image courtesy of Sears

I thought I would create a more portable version for the bored office worker out one of those small basketball hoops a teenager might put on his wall, like this one below.

Mini basketball hoop

Mini basketball hoop

The dream is that we’ll be able to hook up some kind of sensor to the mesh of the hoop that will record how baskets the shooter has made, as well as calculate the current streak (number of shots made in a row without missing), and the percentage of shots made in the shooters’s turn, or session (field goal percentage, for you basketball junkies out there).  I’m not quite sure how I’ll pull this off, but I have a sneaking suspicion that Max 6 will be involved, and maybe the MaKey MaKey, provided that there is a sensor out there that is compatible with both.  I think Max 6 would be involved to organize the sound bites and to manage the message, as well as serve as the display for the statistics I want to show.

On top of this, I would also hope that when a basket is made, I could make a sound bite go off that cheers for the shooter or says something like “boom goes the dynamite” or “He’s on fire!”  If the shooter misses, it would be funny if the sound clip would say “brick!” or “Not in my house!”

I think it would just be a hoot and a laugh if I could get this thing to work.  Will it cure cancer? No.  Will it improve literacy among at-risk children? Absolutely not.  However, I think it has the potential to make a small corner of the world a little more fun, a little more hilarious, and a little more bearable.  If I can accomplish that, I would consider it a success, even if it’s only my small corner.