Go Down

Topic: Automated Dust Collection (Read 2197 times) previous topic - next topic

gladewater2016

/*
 * This code is for the project at
 * http://www.ilimakestuff.com/how-to-automate-a-dust-collection-system-arduino
 * All of the components are list on the url above.
 *
This script was created by Bob Clagett for I Like To Make Stuff
For more projects, check out ilimakestuff.com

Includes Modified version of "Measuring AC Current Using ACS712"
http://henrysbench.capnfatz.com/henrys-bench/arduino-current-measurements/acs712-arduino-ac-current-tutorial/

Parts of this sketch were taken from the keypad and servo sample sketches that comes with the keypad and servo libraries.

Uses https://github.com/adafruit/Adafruit-PWM-Servo-Driver-Library
*/
#include <Wire.h>
#include <Adafruit_PWMServoDriver.h>
 
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

// Depending on your servo make, the pulse width min and max may vary, you
// want these to be as small/large as possible without hitting the hard stop
// for max range. You'll have to tweak them as necessary to match the servos you
// have!

// our servo # counter
uint8_t servoCount = 6;
uint8_t servonum = 0;

const int OPEN_ALL = 100;
const int CLOSE_ALL = 99;

boolean buttonTriggered = 0;
boolean powerDetected = 0;
boolean collectorIsOn = 0;
int DC_spindown = 3000;

const int NUMBER_OF_TOOLS = 3;
const int NUMBER_OF_GATES = 6;

String tools[NUMBER_OF_TOOLS] = {"Miter Saw","Table Saw","Band Saw"}; //, "Floor Sweep"
int voltSensor[NUMBER_OF_TOOLS] = {A1,A2,A3};
long int voltBaseline[NUMBER_OF_TOOLS] = {0,0,0};

//DC right, Y, miter, bandsaw, saw Y, tablesaw, floor sweep
//Set the throw of each gate separately, if needed
int gateMinMax[NUMBER_OF_GATES][2] = {
  /*open, close*/
  {250,415},//DC right
  {230,405},//Y
  {230,405},//miter
  {285,425},//bandsaw
  {250,405},//saw y
  {250,415},//floor sweep
};

//keep track of gates to be toggled ON/OFF for each tool
int gates[NUMBER_OF_TOOLS][NUMBER_OF_GATES] = {
  {1,0,1,0,0,0},
  {1,1,0,0,1,1},
  {1,1,0,1,0,0},
};

const int dustCollectionRelayPin = 11;
const int manualSwitchPin = 12; //for button activated gate, currently NOT implemented

int mVperAmp = 100; // use 100 for 20A Module and 66 for 30A Module
double ampThreshold = .20;

double Voltage = 0;
double VRMS = 0;
double AmpsRMS = 0;

//button debouncing
int state = HIGH;      // the current state of the output pin
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers

void setup(){
  Serial.begin(9600);
  pinMode(dustCollectionRelayPin,OUTPUT);
  pwm.begin();
  pwm.setPWMFreq(60);  // Default is 1000mS
 
 //record baseline sensor settings
 //currently unused, but could be used for voltage comparison if need be.
  delay(1000);
  for(int i=0;i<NUMBER_OF_TOOLS;i++){
    pinMode(voltSensor,INPUT);
    voltBaseline = analogRead(voltSensor);
  }
 
}

void loop(){
  // use later for button debouncing
  reading = digitalRead(manualSwitchPin);

  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH){
      state = LOW;
     buttonTriggered = false;
    } else{
      state = HIGH;
     buttonTriggered = true;
    time = millis();   
    }
  }
  previous = reading;
   Serial.println("----------");
   //loop through tools and check
   int activeTool = 50;// a number that will never happen
   for(int i=0;i<NUMBER_OF_TOOLS;i++){
      if( checkForAmperageChange(i)){
        activeTool = i;
        exit;
      }
      if( i!=0){
        if(checkForAmperageChange(0)){
          activeTool = 0;
          exit;
        }
      }
   }
  if(activeTool != 50){
    // use activeTool for gate processing
    if(collectorIsOn == false){
      //manage all gate positions
      for(int s=0;s<NUMBER_OF_GATES;s++){
        int pos = gates[activeTool];
        if(pos == 1){
          openGate(s);   
        } else {
          closeGate(s);
        }
      }
      turnOnDustCollection();
    }
  } else{
    if(collectorIsOn == true){
        delay(DC_spindown);
      turnOffDustCollection(); 
    }
  }
}
boolean checkForAmperageChange(int which){
   Voltage = getVPP(voltSensor[which]);
   VRMS = (Voltage/2.0) *0.707;
   AmpsRMS = (VRMS * 1000)/mVperAmp;
   Serial.print(tools[which]+": ");
   Serial.print(AmpsRMS);
   Serial.println(" Amps RMS");
   if(AmpsRMS>ampThreshold){
    return true;
   }else{
    return false;
   }
}
void turnOnDustCollection(){
  Serial.println("turnOnDustCollection");
  digitalWrite(dustCollectionRelayPin,1);
  collectorIsOn = true;
}
void turnOffDustCollection(){
  Serial.println("turnOffDustCollection");
  digitalWrite(dustCollectionRelayPin,0);
  collectorIsOn = false;
}
 
float getVPP(int sensor)
{
  float result;
 
  int readValue;             //value read from the sensor
  int maxValue = 0;          // store max value here
  int minValue = 1024;          // store min value here
 
   uint32_t start_time = millis();
   while((millis()-start_time) < 500) //sample for 1 Sec
   {
       readValue = analogRead(sensor);
       // see if you have a new maxValue
       if (readValue > maxValue)
       {
           /*record the maximum sensor value*/
           maxValue = readValue;
       }
       if (readValue < minValue)
       {
           /*record the maximum sensor value*/
           minValue = readValue;
       }
   }
   
   // Subtract min from max
   result = ((maxValue - minValue) * 5.0)/1024.0;
     
   return result;
 }

void closeGate(uint8_t num){
  Serial.print("closeGate ");
  Serial.println(num);
  pwm.setPWM(num, 0, gateMinMax[num][1]);
}
void openGate(uint8_t num){
  Serial.print("openGate ");
  Serial.println(num);
    pwm.setPWM(num, 0, gateMinMax[num][0]);
    delay(100);
    pwm.setPWM(num, 0, gateMinMax[num][0]-5);
}
The monitor is showing the dust collector coming on and going off but not the gates opening

gladewater2016

Miter Saw: 9.60 Amps RMS
Table Saw: 0.02 Amps RMS
Miter Saw: 9.55 Amps RMS
Band Saw: 0.02 Amps RMS
Miter Saw: 9.51 Amps RMS
openGate 0
closeGate 1
openGate 2
closeGate 3
closeGate 4
closeGate 5
turnOnDustCollection

gladewater2016

It is showing it is opening the gate

groundFungus

Code: [Select]
// called this way, it uses the default address 0x40
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

The above was what I posted to change the I2C address.

Code: [Select]
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

Your code is not the same.  You have used the default constructor which uses the default address, 0x40.

Please post code in code tags.  Do you look at your posts after you send them?

gladewater2016

Im missing something. I dont see the difference.

gladewater2016

// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40);

I couldnt figure out what you are talking about so I unsoldered the jumper.
Is this right?

groundFungus

#66
May 20, 2018, 10:19 pm Last Edit: May 20, 2018, 10:20 pm by groundFungus
To set the address to the default, yes.
Did it work?  Did you run the I2C scanner again to see if the address changed?

gladewater2016

Yes. I ran the scanner again, but it still doesnt work

gladewater2016

I2C scanner. Scanning ...
Found address: 65 (0x41)
Found address: 112 (0x70)
Done.
Found 2 device(s).
 This is what it shows now

gladewater2016

I ran the adafruit servo test program and none of the servos are working

groundFungus

Quote
Found address: 65 (0x41)
The address of the servo shield is still 0x41.  It appears the the blob removal was not effective.

Until you get the address in the code to match the address of the shield it won't work. 

gladewater2016

I put the blob back on.Then I ran the scan again.This is what I got.
I2C scanner. Scanning ...
Found address: 65 (0x41)
Found address: 112 (0x70)
Done.
Found 2 device(s).
Why is it showing two different devices?


// called this way, it uses the default address 0x41
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

Im sorry Im not understanding what I need to do. Is this how it is suopposed to be?
I really do appreciate you help!!

groundFungus

#72
May 21, 2018, 12:26 am Last Edit: May 21, 2018, 12:27 am by groundFungus
Code: [Select]
// called this way, it uses the default address 0x40
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);


The double slashes (//) in front of a line tells the compiler to ignore that line.  The line is a comment and is said to be commented out.  In your rcode all of the lines except
Code: [Select]
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
are commented out. The line that is not commented is the the default constructor and assigns the default address (0x40) because there is no parameter for Adafruit_PWMServoDriver().


This is the code that I posted
Code: [Select]
// called this way, it uses the default address 0x40
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);

The first 3 lines are commentd out (ignored).  The only line that is not commented out is the last line.
Code: [Select]
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);
That constructor includes a parameter for Adafruit_PWMServoDriver(0x41) to set the address to 0x41.

Idon't know what the other device address is for.  What else is connected to your project?

gladewater2016

The only other thing connected is the acs712 and the relay

gladewater2016

// called this way, it uses the default address 0x40
//Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver();
// you can also call it with a different address you want
Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x41);   

Is this how it is supposed to be?

Go Up