Sunteți pe pagina 1din 8

Arduino - WikiDecolector

Login
Titles Text

WikiDecolector Arduino
● RecentChanges ● FindPage ● HelpContents ● Arduino

Immutable PageInfoAttachments More Actions: Raw Text Do

Estos son algunos programas en arduino y processing que se han realizado para los proyectos de este semestre. esperamos que
sean útiles más adelante, o para otras personas trabajando con estas herramientas.

Detección de bordes

Técnica básica de detección de bordes con un sensor de presencia.

/* Este programa usa un sensor de presencia conectado a un pin digital para detectar movimiento.
*usa la tecnica de detección de bordes para saber cuando ha pasado una persona por el sensor.
*Camilo Martinez: cmrtnz@gmail.com
*/

int sensPin=4; // Pin del sensor.


int state = 0; // Estado actual del sensor(metodo de detecion de bordes).
int state1 = 0;// Estado pasado del sensor(metodo de detecion de bordes).

int persona = 0;//guarda el numero de personas que han pasado

void setup(){
pinMode(sensPin, INPUT);
Serial.begin(9600);
}
void loop(){
state = digitalRead(sensPin);
Serial.println(state);
/* Si el sensor se prende, se compara con el estado anterior,
si estaba apagado, el sensor se acaba de prender.*/
if (state == 1){
if(state1 == 0){
Serial.println("prendido");
}
}
/* Si el sensor se apaga, se compara con el estado anterior,
si estaba prendido, el sensor se acaba de apagar.*/
if (state == 0){
if (state1 == 1){
Serial.println("apagado");
persona ++; //agrega uno a la variable.
Serial.print("persona #: ");
Serial.println(persona);
}
}

state1 = state; // Se guarda el el estado actual en el anterior para poder hacer la comparacion.
delay(100);
}

Sensor de presencia

Con fotocelda y un puntero laser.

/* Este programa usa una fotocelda y un laser para hacer un sensor de presencia.
* Se usa el metodo de deteccion de bordes para registrar el momento exacto en que el usuario
* se bloquea o desbloquea el haz del laser, si se desbloquea se prende un led. Basado en un ejemplo de Physical Computing
de O'sullivan y Igoe.
* Camilo Martinez cmrtnz@gmail.com

http://wiki.decolector.net/Arduino (1 de 8) [27/07/2010 21:09:31]


Arduino - WikiDecolector

*/

int fotoPin = 5; //Pin de la fotocelda (analogo).


int ledPin = 13; //Pin del led.
int valor = 0; // Lectura actual de la fotocelda.
int umb = 600; //Si se sube o baja de este valor, se detecta el evento.
int valor1 = 0; //Lectura anterior de la fotocelda.
int bloq = 0; // Se cuentan los bloqueos (Momento en que el usuario desbloquea el haz del laser, es decir termina el bloqueo).

void setup(){
pinMode(fotoPin, INPUT);
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}

void loop(){
valor=analogRead(fotoPin);
Serial.println(valor);
// Se avalua el estado actual de la fotocelda, si es menor que el umbral...
if (valor<umb){
//...se compara el valor anterior de la fotocelda con el umbral, si es mayor, hay una presion.
if (valor1>umb){
digitalWrite(ledPin, LOW);
Serial.println("press");
}
}
//Si el valor de la fotocelda es mayor que el umbral...
if (valor>umb){
//... y el valor anterior menor que el umbral...
if(valor1<umb){
//... se prende el led y hay desbloqueo del haz del laser.
digitalWrite(ledPin, HIGH);
Serial.println("release");
bloq = bloq +1;// Se cuenta el numero de veces que se ha bloqueado.
Serial.println("bloqueos");
Serial.println (bloq);
}
}
valor1=valor;// Se guarda el valor actual en el anterior para hacer la comparacion siguiente.

delay(10); //10 milisegundos de espera para no saturar la comunicacion serial


}

Detección de bordes

Técnica popular para detectar cambios en sensores análogos como si fueran "botones".

/* Este programa usa el metodo de deteccion de bordes para pasarle voltajes a una contestadora digital y grabar o
reproducir mensajes.
* Camilo Martinez cmrtnz@gmail.com
*/

int fotoPin = 5; // Pin de la fotocelda


int valor = 0;// Valor de la lectura de la fotocelda
int umb = 600; // Umbral para comparar con el valor de la fotocelda y activar una evento.
int state1 = 0; // Valor anterior de la fotocelda.
int presiones = 0; //Numero de "presiones" o desbloqueos de la fotocelda.
// Pines de los leds para avisar la operacion en curso.
int ledPlay = 2;
int ledRec = 3;
int ledMsg = 4;
int ledPin4 = 5;

void setup(){
pinMode(fotoPin, INPUT);
pinMode(ledPlay, OUTPUT);
pinMode(ledRec, OUTPUT);

http://wiki.decolector.net/Arduino (2 de 8) [27/07/2010 21:09:31]


Arduino - WikiDecolector

pinMode(ledMsg, OUTPUT);
pinMode(ledDel, OUTPUT);
Serial.begin(9600);
}
void loop(){
valor=analogRead(fotoPin);
Serial.println(valor);
if (valor>umb){
if (state1<umb){
digitalWrite(ledRec, HIGH); // Graba
Serial.println("record");
delay(20000);//20 segs para grabar el mensaje
digitalWrite(ledRec, LOW);
Serial.println("StopRecording");
digitalWrite(ledMsg, HIGH);//Mensaje almacenado
}
}
if (valor<umb){
if(state1>umb){
digitalWrite(ledMsg, LOW);//Cuando se escuha el mensaje este led se apaga
presiones = presiones +1;
Serial.println (presiones);
digitalWrite(ledPlay, HIGH);//Reproduce el mensaje
Serial.println("Play");
delay(10);
digitalWrite(ledPlay, LOW);//Para la reproduccion
delay(20000);
digitalWrite(ledPlay, HIGH);// Repite la reproduccion.
Serial.println("Play");
delay(10);
digitalWrite(ledPlay, LOW);
delay(20000);
digitalWrite(ledDel, HIGH);//Borra el mensaje despues de ser escuchado
delay (10);
Serial.println("delete");
digitalWrite(ledDel,LOW);
}
}

state1=valor;
delay(10);
}

Movimiento activa un motor

Sensor de presencia que activa un motor paso a paso.

/* Este programa usa un sensor de presencia conectado a un pin digital para detectar movimiento.
*Cuando el sensor se prende dos vences durante un lapso de tiempo de 15 segundos o menos,
*se prende un motor paso a paso.
*Camilo Martinez: cmrtnz@gmail.com
*/

int sensPin=2; // Pin del sensor.


int state = 0; // Estado actual del sensor(metodo de detecion de bordes).
int state1 = 0;// Estado pasado del sensor(metodo de detecion de bordes).
int detect = 0; //deteccion numero uno .
int detect1 = 0; //deteccion numero dos.
long time; // Tiempo de la detecion uno.
long time1; // Tiempo de la deteccion 2.
int rest; // Resta de los dos tiempos.

#include <Stepper.h> // importamos la libreria Stepper de Tommy Igoe.

#define motorSteps 24 //Pasos dados en una vuelta de 360 grados del motor.

// Define los pines que van al motor


#define motorPin1 5

http://wiki.decolector.net/Arduino (3 de 8) [27/07/2010 21:09:31]


Arduino - WikiDecolector

#define motorPin2 6
#define motorPin3 7
#define motorPin4 8

//se crea una instancia de la libreria con los parametros anteriores.

Stepper myStepper(motorSteps, motorPin1,motorPin2,motorPin3,motorPin4);

void setup(){
pinMode(sensPin, INPUT);
// la velocidad del motor.
myStepper.setSpeed(60);
Serial.begin(9600);
}
void loop(){
state = digitalRead(sensPin);
/* Si el sensor se prende, se compara con el estado anterior,
si estaba apagado, el sensor se acaba de prender.*/
if (state == 1){
if(state1 == 0){
Serial.println("prendido");
}
}
if (state == 0){
if (state1 == 1){
Serial.println("apagado");
//Si es la primera deteccion, detect = 1, si es la segunda, detect1 = 1.
if(detect == 0){
detect = 1;
Serial.println("primera deteccion");
//Se registra el tiempo de la primera deteccion.
time = millis();
}else if(detect == 1){
// Se resetea el valor de la primera deteccion, para poder iniciar de nuevo el proceso.
detect = 0;
detect1 = 1;
// Se registra el tiempo en milisegundos de la segunda deteccion.
time1 = millis();
Serial.println("segunda deteccion");
// En la segunda se resta el segundo menos el primer tiempo.
rest = time1 - time;
Serial.println(rest);
// Si la resta da mas de 15 segs, se activa el motor
if(rest>15000){
Serial.println("Forward");
myStepper.step(50);
delay(500);
// Step backward 100 steps:
Serial.println("Backward");
myStepper.step(-50);
delay(500);
Serial.println("Motor prender");
rest=0;
// Si da menos de 15 segs, se resetea el valor y continua la deteccion.
}else if(rest<15000){
rest=0;
Serial.println(rest);
}
}
}
}
state1 = state; // Se guarda el el estado actual en el anterior para poder hacer la comparacion.
}

Encoder de Rotación

El siguiente ejemplo usa un Encoder de rotación o "Potenciometro sin fin" enviando datos por el serial. El código usa
interrupciones. Se debe conectar el pin de la derecha (mirando el encoder con la perilla hacia el frente) a tierra, el del centro al pin
2 digital y el de la izquierda al pin 4 digital. No se usa ninguna resistencia.

http://wiki.decolector.net/Arduino (4 de 8) [27/07/2010 21:09:31]


Arduino - WikiDecolector

mas info aqui

/* read a rotary encoder with interrupts


Encoder hooked up with common to GROUND,
encoder0PinA to pin 2, encoder0PinB to pin 4 (or pin 3 see below)
it doesn't matter which encoder pin you use for A or B

uses Arduino pullups on A & B channel outputs


turning on the pullups saves having to hook up resistors
to the A & B channel outputs

*/

#define encoder0PinA 2
#define encoder0PinB 4

volatile unsigned int encoder0Pos = 0;

void setup() {

pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor

attachInterrupt(0, doEncoder, CHANGE); // encoder pin on interrupt 0 - pin 2


Serial.begin (9600);
Serial.println("start"); // a personal quirk

void loop(){
// do some stuff here - the joy of interrupts is that they take care of themselves
}

void doEncoder(){
if (digitalRead(encoder0PinA) == HIGH) { // found a low-to-high on channel A
if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way

http://wiki.decolector.net/Arduino (5 de 8) [27/07/2010 21:09:31]


Arduino - WikiDecolector

// encoder is turning
encoder0Pos = encoder0Pos - 1; // CCW
}
else {
encoder0Pos = encoder0Pos + 1; // CW
}
}
else // found a high-to-low on channel A
{
if (digitalRead(encoder0PinB) == LOW) { // check channel B to see which way
// encoder is turning
encoder0Pos = encoder0Pos + 1; // CW
}
else {
encoder0Pos = encoder0Pos - 1; // CCW
}

}
Serial.println (encoder0Pos, DEC); // debug - remember to comment out
// before final program run
// you don't want serial slowing down your program if not needed
}

/* to read the other two transitions - just use another attachInterrupt()


in the setup and duplicate the doEncoder function into say,
doEncoderA and doEncoderB.
You also need to move the other encoder wire over to pin 3 (interrupt 1).
*/

Arduino envía a Processing

int botoPin = 7;
int botoPin2 = 8;
int ledPin = 6;
int estado = 0;
int estado1 = 0;

void setup(){
pinMode(botoPin, INPUT);
pinMode(ledPin, OUTPUT);
pinMode(botoPin2, INPUT);
Serial.begin(9600);
}

void loop(){
estado = digitalRead(botoPin);
estado1 = digitalRead(botoPin2);
if (estado == 1){
digitalWrite(ledPin, HIGH);
serialWrite('A');
//Serial.println(estado);
}else{
digitalWrite(ledPin, LOW);
//Serial.println(estado);
}
if (estado1 == 1){
digitalWrite(ledPin, HIGH);
serialWrite('B');
}else{
digitalWrite(ledPin, LOW);
}
delay(100);
}

Sensor de Presion

Compre este sensor (MPX10D de motorola) pensando que servia para medir la presión aplicada por una persona sobre una

http://wiki.decolector.net/Arduino (6 de 8) [27/07/2010 21:09:31]


Arduino - WikiDecolector

superficie, pero en realidad mide presion de aire o de liquido. En todo caso es un buen sensor para medir la presion del arie que
pasa por una manguera, por ejemplo. Este es un sensor diferencial por lo que tiene des pines de datos, estos dos arrojan
dos numeros que deben restarse para obtener la medicion. Para ver mas sobre el pinado consultar el datasheet

Basado en: http://itp.nyu.edu/blogs/ago218/2008/03/24/pressure-sensor/

int timer = 700;


int positivoPin = 5;
int negativoPin = 4;
int valPos = 0;
int valNeg = 0;
int val = 0;

void setup () {
Serial.begin (9600);
}

void loop (){


valPos = analogRead (positivoPin);
valNeg = analogRead (negativoPin);
val = (varPos - varNeg);
delay(timer);
if (val == 7){
Serial.println ("normal");
}
else if (val == 6){
Serial.println("normal");
}
else{
Serial.println ("cambio");
}
Serial.println (val);
delay (10);

// the code gives out 6s and the difference in pressure is when that value goes up and usually comes down before getting to 6 again

Pin Mapping

http://wiki.decolector.net/Arduino (7 de 8) [27/07/2010 21:09:31]


Arduino - WikiDecolector

Recursos externos

Led Display con Arduino

Liquid Crystal Display con Arduino la fácil.

WinDVIG :Interfaz para captura de video en windows a travez de Quicktime, indispensable para trabajar con video en
Processing sobre Windows. }

Motor Paso a Paso de 6 cables, diagrama de circuito.

http://www.arduino.cc/en/Reference/StepperUnipolarCircuit

Tutorial de altred para reconocer los motores paso a paso para conectarlos al arduino.

http://www.altred.net/altred/Como-ArduinoPAP

WikiDecolector: Arduino (last edited 2009-03-04 05:21:17 by cmart)

Immutable PageInfoAttachments More Actions: Raw Text Do

MoinMoin PoweredPython PoweredValid HTML 4.01

http://wiki.decolector.net/Arduino (8 de 8) [27/07/2010 21:09:31]

S-ar putea să vă placă și