Iteration 1: Explore Phase

For the first phase of exploration in my Capstone Project, my goals were to…

  • 3 Load Cells connected to HX711 Load Cell Amplifier, connected to Arduino, providing 3 weight readings (6 hours to wire circuit and write code)
  • LEDs wired to Arduino that light up and react to Load Cell Readings for plate interactions (6 hours to wire and write code)
  • Design and model Star Tracker board (4 hours)
  • Model all components to get a better idea for housing design (8 hours of rhino)

Before I get into whether or not I accomplished these goals, I am going to state what did get accomplished during the first exploration phase in this agile development model. I will then use this to reflect on my initial goals and time management

  • Connected 1 Load Cell to HX711 Amplifier (soldered), connected to arduino (jumper wire), and programmed to provide accurate weight readings
    • What I learned: Upon researching how the HX711 hardware works with Load Cells, I saw that often in use one amplifier is used in conjunction with multiple load cells to provide a reading. Assuming this would be the same case for me, I only ordered one HX711 Load Cell Amplifier and three Load Cells. As I set up my first piece of hardware, I realized that I would need three HX711 pieces if I wanted three different Load Cell readings (I could connect three cells to one amplifier for a more accurate reading, but would not be able to get three separate readings). I then had to order more hardware (Sparkfun in Boulder usually allows for local pickup) which took 9 days to ship (ordered 1/25 and shipped 2/3). I should have realized that due to COVID, local pickup would not be an option. My order also coincided with a Raspberry Pi release which delayed its shipping.
      • Lessons Learned:
        • Do more in depth hardware research and order extras of necessities in case one breaks.
        • In the world of COVID I can no longer easily pick up extra pieces I might need, I must therefore plan more and be more methodical when attempting to use new hardware (Not only understanding how the hardware will work but also how it will work within my project specifically – that is where I messed up)
  • Connected LED strip to Arduino, and programmed a variety of LED interactions
    • This one was fairly straightforward, I chose to use the FastLED library for the programming of my LED interactions over the Adafruit Neopixel library. FastLED supports HSV color values and utilizes less memory than the latter.
  • Created a cardboard prototype of my initial product design
    • In order to effectively get feedback from my target users and consumers, I wanted to create a tangible object that explains the goals of my project visually. Something that is the same size and shape of my goal product would provide better feedback than explaining the product or showing drawings
  • Design of Startracker board by gathering the measurements of LEDs, spacing between LEDs, and planning for wood thickness in the design
  • Ordering of what should be the rest of necessary hardware, along with thorough research of said hardware
    • Includes 2 more HX711 load cell amplifiers, 3 QWIC scales (like HX711 but on steroids and does not require soldering to load cells), LCD screen, QWICC cable for LCD screen, and Bi-directional Logic Level Converter for the LCD screen so that it can step down from 5V from the arduino to the 3.3V it requires.
  • Meeting with sponsor – FlaVR, to discuss testing, prototyping and manufacturing

Reflection for Explore Phase: I overall am very satisfied with where I stand after the first explore phase. Although I spent some time on items that were not on my priority list, I believe it was crucial in order to do so for user testing. Spending the time to create a physical model over a 3D one was more time effective for me because I believe that the housing unit design will be what changes the most throughout this project. Having a physical item to show people will also give them a better feel for the product than the 3D models would. Also, by spending more time planning the dimensional design of the star tracker board, it will save me time in the 3D model and manufacturing side of things. I learned this after my hardware mishap, but it was an important lesson to learn early in this agile methodology.

Process Documentation:

Load Cell Set-Up and Weight Readings :

I began my set up by soldering header pins for the use of jumper wires on the HX711 board to make testing easy. I found that the indirect connection from the Load Cell was not providing any reading from the Arduino, so I then soldered the Load Cell’s connection directly onto the necessary HX711 input pins.

To get started, once my load cell was sending a value to my serial plotter, I had to calibrate it so that the weight reading would be accurate. I used the code below to calibrate the load cell. The program came from the SparkFun demo that explains how to use the SparkFun developed HX711 library, installation, and recommendations. The program can be found directly here https://learn.sparkfun.com/tutorials/load-cell-amplifier-hx711-breakout-hookup-guide?_ga=2.236243073.1068752851.1612418050-1260315231.1611556259#installing-the-hx711-arduino-library-and-examples.

//program can be found directly here https://learn.sparkfun.com/tutorials/load-cell-amplifier-hx711-breakout-hookup-guide?_ga=2.236243073.1068752851.1612418050-1260315231.1611556259#installing-the-hx711-arduino-library-and-examples//
//Calibration Sketch is from Sparkfun link above//

#include "HX711.h"

#define DOUT  3
#define CLK  2

HX711 scale;

float calibration_factor = 600000; //

void setup() {
  Serial.begin(9600);
  Serial.println("HX711 calibration sketch");
  Serial.println("Remove all weight from scale");
  Serial.println("After readings begin, place known weight on scale");
  Serial.println("Press + or a to increase calibration factor");
  Serial.println("Press - or z to decrease calibration factor");

  scale.begin(DOUT, CLK);
  scale.set_scale();
  scale.tare(); //Reset the scale to 0

  long zero_factor = scale.read_average(); //Get a baseline reading
  Serial.print("Zero factor: "); //This can be used to remove the need to tare the scale. Useful in permanent scale projects.
  Serial.println(zero_factor);
}

void loop() {

  scale.set_scale(calibration_factor); //Adjust to this calibration factor

  Serial.print("Reading: ");
  Serial.print(scale.get_units(), 3);
  Serial.print(" lbs"); //Change this to kg and re-adjust the calibration factor if you follow SI units like a sane person
  Serial.print(" calibration_factor: ");
  Serial.print(calibration_factor);
  Serial.println();

  if(Serial.available())
  {
    char temp = Serial.read();
    if(temp == '+' || temp == 'a')
      calibration_factor += 10;
    else if(temp == '-' || temp == 'z')
      calibration_factor -= 10;
  }
}

To get my calibration factor, I used 8 quarters on the load cell since I do not own calibration weights. In total, the quarters should have weighed 0.1 lbs, so I increased the float value to three decimal points and played with the calibration factor until the displayed weight matched the known weight.

LED Set-Up and LED Interactions:

Below is the code that is powering these LED interactions. Most of the light displays are based on already existing preset color settings from the FastLED library I am using. I played with making my own color palettes at the bottom of the code where there is a cloudy type one and a hulk themed color display. I will play with the color usage as I get user feedback on different possible LED interactions.

#include <FastLED.h>
#include "HX711.h"



#define LED_PIN     5
#define NUM_LEDS    60
#define BRIGHTNESS  64
#define LED_TYPE    WS2811
#define COLOR_ORDER GRB
CRGB leds[NUM_LEDS];

#define UPDATES_PER_SECOND 100

#define calibration_factor 800000 // obtained by running LoadCellReading and guess and checking this # unitl it matched what I placed on the load cell (I used 8 quarters (.1 lbs)

#define DOUT  3
#define CLK  2

HX711 scale;

CRGBPalette16 currentPalette;
TBlendType    currentBlending;

void setup() {
    delay( 3000 ); // power-up safety delay
    FastLED.addLeds<LED_TYPE, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection( TypicalLEDStrip );
    FastLED.setBrightness(  BRIGHTNESS );
    
    currentPalette = RainbowColors_p;
    currentBlending = LINEARBLEND;
    Serial.begin(9600);
    Serial.println("HX711 scale demo");

    scale.begin(DOUT, CLK);
    scale.set_scale(calibration_factor); //This value is obtained by using the SparkFun_HX711_Calibration sketch
    scale.tare(); //Assuming there is no weight on the scale at start up, reset the scale to 0

    Serial.println("Readings:");

    
}


void loop()
{
    Serial.print("Reading: ");
    Serial.print(scale.get_units(), 3); //scale.get_units() returns a float
    Serial.print(" lbs");
    Serial.println();
    ChangePalettePeriodically();
    
    static uint8_t startIndex = 0;
    startIndex = startIndex + 1; /* motion speed */
    
    FillLEDsFromPaletteColors( startIndex);
    
    FastLED.show();
    FastLED.delay(1000 / UPDATES_PER_SECOND);
}

void FillLEDsFromPaletteColors( uint8_t colorIndex)
{
    uint8_t brightness = 255;
    
    for( int i = 0; i < NUM_LEDS; ++i) {
        leds[i] = ColorFromPalette( currentPalette, colorIndex, brightness, currentBlending);
        colorIndex += 3;
    }
}



// FastLED provides several 'preset' palettes: RainbowColors_p, RainbowStripeColors_p,
// OceanColors_p, CloudColors_p, LavaColors_p, ForestColors_p, and PartyColors_p.

void ChangePalettePeriodically()
{
    uint8_t secondHand = (millis() / 1000) % 60;
    static uint8_t lastSecond = 99;
    
    if( lastSecond != secondHand) {
        lastSecond = secondHand;
        if( secondHand ==  0)  { currentPalette = RainbowColors_p;         currentBlending = LINEARBLEND; }
        if( secondHand == 10)  { currentPalette = RainbowStripeColors_p;   currentBlending = NOBLEND;  }
        if( secondHand == 15)  { currentPalette = RainbowStripeColors_p;   currentBlending = LINEARBLEND; }
        if( secondHand == 20)  { SetupPurpleAndGreenPalette();             currentBlending = LINEARBLEND; }
        if( secondHand == 25)  { SetupTotallyRandomPalette();              currentBlending = LINEARBLEND; }
        if( secondHand == 30)  { SetupBlackAndWhiteStripedPalette();       currentBlending = NOBLEND; }
        if( secondHand == 35)  { SetupBlackAndWhiteStripedPalette();       currentBlending = LINEARBLEND; }
        if( secondHand == 40)  { currentPalette = CloudColors_p;           currentBlending = LINEARBLEND; }
        if( secondHand == 45)  { currentPalette = PartyColors_p;           currentBlending = LINEARBLEND; }

    }
}

// This function fills the palette with totally random colors.
void SetupTotallyRandomPalette()
{
    for( int i = 0; i < 16; ++i) {
        currentPalette[i] = CHSV( random8(), 255, random8());
    }
}

// This function sets up a palette of black and white stripes,
// using code.  Since the palette is effectively an array of
// sixteen CRGB colors, the various fill_* functions can be used
// to set them up.
void SetupBlackAndWhiteStripedPalette()
{
    // 'black out' all 16 palette entries...
    fill_solid( currentPalette, 16, CRGB::Black);
    // and set every fourth one to white.
    currentPalette[0] = CRGB::White;
    currentPalette[4] = CRGB::White;
    currentPalette[8] = CRGB::White;
    currentPalette[12] = CRGB::White;
    
}

// This function sets up a palette of purple and green stripes.
void SetupPurpleAndGreenPalette()
{
    CRGB purple = CHSV( HUE_PURPLE, 255, 255);
    CRGB green  = CHSV( HUE_GREEN, 255, 255);
    CRGB black  = CRGB::Black;
    
    currentPalette = CRGBPalette16(
                                   green,  green,  black,  black,
                                   purple, purple, black,  black,
                                   green,  green,  black,  black,
                                   purple, purple, black,  black );
}

Cardboard Prototype:

Below is the basic prototype I made for my plate out of cardboard. The three sections represent fruit/vegetable portion (big plate), carb (1/4 plate), and protein (1/4 plate). The three sections are also my force plates that will have load cells under them to provide weight readings. The black box on the far right on the model represents where an lcd screen will be embedded in the housing. I will use this prototype to get user feedback.

Below is my sketch plan and dimensions for the star tracker board. This will be laser cut out of wood and painted matte black. There will be embedded interior LED strips that will illuminate the board.

Orders:

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Create your website with WordPress.com
Get started
%d bloggers like this: