so i am trying to make a 9V bubble machine that is motion-sensored and will turn on when someone walks by. Basically, i rewired the wires in the bubble machine such that 2 wires are extruded that when put together will activate the machine. Now i tried to put this on my arduino. But frankly, i am at a loss. What kinds of things should i be looking at for putting on the arduino? Would i need a relay?
solid state relay, power MOSFET, darlington transistor? A suitable circuit will depend on the circuit inside your "bubble machine" that you want to "close".
I decided to mess around with the mosfet and get that working, and it has been quite successful!!
Now the next step would be to make this more interactive, ie using a touch sensor.
So basically, the touch sensor will work with MOSFET to turn on the machine.
the touch sensor code is the following:
// CapSense.pde
// Paul Badger 2007
// Fun with capacitive sensing and some machine code - for the Arduino (or Wiring Boards).
// Note that the machine code is based on Arduino Board and will probably require some changes for Wiring Board
// This works with a high value (1-10M) resistor between an output pin and an input pin.
// When the output pin changes it changes the state of the input pin in a time constant determined by R * C
// where R is the resistor and C is the capacitance of the pin plus any capacitance present at the sensor.
// It is possible when using this setup to see some variation in capacitance when one's hand is 3 to 4 inches from the sensors
// Try experimenting with larger sensors. Lower values of R will probably yield higher reliability.
// Use 1 M resistor (or less maybe) for absolute touch to activate.
// With a 10 M resistor the sensor will start to respond 1-2 inches away
// Setup
// Connect a 10M resistor between pins 8 and 9 on the Arduino Board
// Connect a small piece of alluminum or copper foil to a short wire and also connect it to pin 9
// When using this in an installation or device it's going to be important to use shielded cable if the wire between the sensor is
// more than a few inches long, or it runs by anything that is not supposed to be sensed.
// Calibration is also probably going to be an issue.
// Instead of "hard wiring" threshold values - store the "non touched" values in a variable on startup - and then compare.
// If your sensed object is many feet from the Arduino Board you're probably going to be better off using the Quantum cap sensors.
// Machine code and Port stuff from a forum post by ARP http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1169088394/0#0
int i;
unsigned int x, y;
float accum, fout, fval = .07; // these are variables for a simple low-pass (smoothing) filter - fval of 1 = no filter - .001 = max filter
int ledPin = 10; // LED connected to digital pin 10
void setup() {
Serial.begin(9600);
pinMode(ledPin, OUTPUT);
DDRB=B101; // DDR is the pin direction register - governs inputs and outputs- 1's are outputs
// Arduino pin 8 output, pin 9 input, pin 10 output for "guard pin"
// preceding line is equivalent to three lines below
// pinMode(8, OUTPUT); // output pin
// pinMode(9, INPUT); // input pin
// pinMode(10, OUTPUT); // guard pin
digitalWrite(10, LOW); //could also be HIGH - don't use this pin for changing output though
}
void loop() {
y = 0; // clear out variables
x = 0;
for (i=0; i < 4 ; i++ ){ // do it four times to build up an average - not really neccessary but takes out some jitter
// LOW-to-HIGH transition
PORTB = PORTB | 1; // Same as line below - shows programmer chops but doesn't really buy any more speed
// digitalWrite(8, HIGH);
// output pin is PortB0 (Arduino 8), sensor pin is PortB1 (Arduinio 9)
while ((PINB & B10) != B10 ) { // while the sense pin is not high
// while (digitalRead(9) != 1) // same as above port manipulation above - only 20 times slower!
x++;
}
delay(1);
// HIGH-to-LOW transition
PORTB = PORTB & 0xFE; // Same as line below - these shows programmer chops but doesn't really buy any more speed
//digitalWrite(8, LOW);
while((PINB & B10) != 0 ){ // while pin is not low -- same as below only 20 times faster
// while(digitalRead(9) != 0 ) // same as above port manipulation - only 20 times slower!
y++;
}
delay(1);
}
fout = (fval * (float)x) + ((1-fval) * accum); // Easy smoothing filter "fval" determines amount of new data in fout
accum = fout;
Serial.print((long)x, DEC); // raw data - Low to High
Serial.print( " ");
Serial.print((long)y, DEC); // raw data - High to Low
Serial.print( " ");
Serial.println( (long)fout, DEC); // Smoothed Low to High
if(x > 1) {
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
delay(10); //Delay for good measure! (not strictly necessary but might as well have it)
}
PORTB = PORTB | 1; // Same as line below - shows programmer chops but doesn't really buy any more speed
// digitalWrite(8, HIGH);
vs.
void digitalWrite(uint8_t pin, uint8_t val)
{
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
// If the pin that support PWM output, we need to turn it off
// before doing a digital write.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
if (val == LOW) *out &= ~bit;
else *out |= bit;
}
alright....i tried taking the source pin of the MOSFET and inserting it into the ground of the digital output of the arduino. Also, i connected the negative terminal of the 9V battery of the bubble machine to pin 10. However, it just turns on regardless of whether i touch the capacitive sensor or not.....
@ Grumpy Mike
i actually connected the MOSFET to the breadboard...where exactly on the arduino pin can i insert it?
That is not the way to connect a MOSFET, I find it hard from the description to know what you have done and how you think you are switching on the machine but what you are describing will not work. Can you post a schematic and we can go from there.
alright here is the image of the setup i have so far with the MOSFET connections and the touch sensor setup (minus the LED which goes into pin 10).
on the side with the (+) and (-), that is the touch sensor components, including a wire from pin 8 to (+) a resistor connecting to (-) and another wire from the (-) to pin 9.
It is only a low res photograph not a schematic. Not much use for seeing what you are trying to do.
In an earlier post you said you had some success using a FET but didn't say what you were doing or how.
You need to get the hardware to a state where you can turn it on / off with a simple software statement. Take the blinking LED example and use it to turn your machine on and off say for three seconds at a time.
Only when that is working try to add the capacitive sensor bit working.
You need the -ve of the battery to go to the arduino ground and you want the -ve terminal of what used to connect to the battery (the -ve of your machine) to the drain of the FET. Source of FET to arduino ground, output pin of arduino (the one you want to use) through a resistor to the FET gate. Finally the +ve of your battery to the +ve input of your machine.
It is a bit confusing in words but try and draw it out.
alright....i did according to your instructions, and whenever i connect the (+) terminal of the battery to the (+) of the machine, the machine turns on! Fantastic....
now what would be the next logical step from here? i really am not very good at schematically drawing circuits...so i apologize for that
alright...my bad...i readjusted it and now when i touch the two (+)s it does NOT turn on...alright
i have not yet written the code for the blinking...
would be something like this?
int ledPin = 10; // LED connected to digital pin 10
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin as output
}
void loop()
{
digitalWrite(ledPin, HIGH); // sets the LED on
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // sets the LED off
delay(1000); // waits for a second
}