Hi all
I am quite new to arduino and its culture, so forgive for any obvious mistakes that may appear in my following case.
At the moment, I am prototyping for an architecture project, which is embodied in a form of a pavilion. Not many specifics at the moment, just a lot of experiments.
One of the prototypes has arduino at its heart. I have a capacitance sensor hooked up to a pencil drawing (hoping to further develop it into some kind of conductive surface), so that reacts to human's touch. The data in the sensor is transferred into servo motion (which controls some kind of building skin) and LED lights behind the skin. So the function of this prototype is to sense human touch which controls envelop, when there is contact, envelope unfolds exposing lights.
The things that I am struggling with and questions: 1. there seems to be some kind of a problem with LEDs, i have 4 leds in a circuit, each is wired trough 1/4 W resistor to its own digital pin, they respond, but not very bright almost unnoticeable. 2. on this one i think my coding is not right, everything is very jittery and lagging, and serial print freezes, i think thats because the structure of the code is not allowing arduino to process everything at the same time (this concept I am still not understanding, arduino can't process too much information at the same, so the code needs to give it breath room, is that correct?). Otherwise, the whole thing is working, but not very stable.
Code:
#include <Servo.h>
// Pin for the LED
int LEDPin = 13;
int LEDPin1 = 4;
int LEDPin2 = 5;
int LEDPin3 = 6;
int LEDPin4 = 7;
// Pin to connect to your drawing
int capSensePin = 2;
// This is how high the sensor needs to read in order
// to trigger a touch. You'll find this number
// by trial and error, or you could take readings at
// the start of the program to dynamically calculate this.
int touchedCutoff = 18;
Servo servoMotor;
Servo servoMotor1;
Servo servoMotor2;
void setup(){
Serial.begin(9600);
// Set up the LED
pinMode(LEDPin, OUTPUT);
pinMode(LEDPin1, OUTPUT);
pinMode(LEDPin2, OUTPUT);
pinMode(LEDPin3, OUTPUT);
pinMode(LEDPin4, OUTPUT);
digitalWrite(LEDPin, LOW);
digitalWrite(LEDPin1, LOW);
digitalWrite(LEDPin2, LOW);
digitalWrite(LEDPin3, LOW);
digitalWrite(LEDPin4, LOW);
servoMotor.attach(8);
servoMotor1.attach(9);
servoMotor2.attach(10);
}
void loop(){
// If the capacitive sensor reads above a certain threshold,
// turn on the LED
int servoAngle = map(readCapacitivePin(capSensePin), 0, 40, 0, 179);
if (readCapacitivePin(capSensePin) > touchedCutoff) {
digitalWrite(LEDPin, HIGH);
digitalWrite(LEDPin1, HIGH);
digitalWrite(LEDPin2, HIGH);
digitalWrite(LEDPin3, HIGH);
digitalWrite(LEDPin4, HIGH);
}
else {
digitalWrite(LEDPin, LOW);
digitalWrite(LEDPin1, LOW);
digitalWrite(LEDPin2, LOW);
digitalWrite(LEDPin3, LOW);
digitalWrite(LEDPin4, LOW);
}
// Every 500 ms, print the value of the capacitive sensor
if ( (millis() % 200) == 0){
Serial.print("Capacitive Sensor on Pin 2 reads: ");
Serial.println(servoAngle);
servoMotor.write(servoAngle);
servoMotor1.write(servoAngle);
servoMotor2.write(servoAngle);
}
}
// readCapacitivePin
// Input: Arduino pin number
// Output: A number, from 0 to 17 expressing
// how much capacitance is on the pin
// When you touch the pin, or whatever you have
// attached to it, the number will get higher
// In order for this to work now,
// The pin should have a 1+Megaohm resistor pulling
// it up to +5v.
uint8_t readCapacitivePin(int pinToMeasure){
// This is how you declare a variable which
// will hold the PORT, PIN, and DDR registers
// on an AVR
volatile uint8_t* port;
volatile uint8_t* ddr;
volatile uint8_t* pin;
// Here we translate the input pin number from
// Arduino pin number to the AVR PORT, PIN, DDR,
// and which bit of those registers we care about.
byte bitmask;
if ((pinToMeasure >= 0) && (pinToMeasure <= 7)){
port = &PORTD;
ddr = &DDRD;
bitmask = 1 << pinToMeasure;
pin = &PIND;
}
if ((pinToMeasure > 7) && (pinToMeasure <= 13)){
port = &PORTB;
ddr = &DDRB;
bitmask = 1 << (pinToMeasure - 8);
pin = &PINB;
}
if ((pinToMeasure > 13) && (pinToMeasure <= 19)){
port = &PORTC;
ddr = &DDRC;
bitmask = 1 << (pinToMeasure - 13);
pin = &PINC;
}
// Discharge the pin first by setting it low and output
*port &= ~(bitmask);
*ddr |= bitmask;
delay(1);
// Make the pin an input WITHOUT the internal pull-up on
*ddr &= ~(bitmask);
// Now see how long the pin to get pulled up
int cycles = 16000;
for(int i = 0; i < cycles; i++){
if (*pin & bitmask){
cycles = i;
break;
}
}
// Discharge the pin again by setting it low and output
// It's important to leave the pins low if you want to
// be able to touch more than 1 sensor at a time - if
// the sensor is left pulled high, when you touch
// two sensors, your body will transfer the charge between
// sensors.
*port &= ~(bitmask);
*ddr |= bitmask;
return cycles;
}