Documente Academic
Documente Profesional
Documente Cultură
Login
Titles Text
WikiDecolector Arduino
● RecentChanges ● FindPage ● HelpContents ● Arduino
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
/* 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
*/
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
/* 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
*/
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.
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
*/
void setup(){
pinMode(fotoPin, INPUT);
pinMode(ledPlay, OUTPUT);
pinMode(ledRec, OUTPUT);
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);
}
/* 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
*/
#define motorSteps 24 //Pasos dados en una vuelta de 360 grados del motor.
#define motorPin2 6
#define motorPin3 7
#define motorPin4 8
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.
*/
#define encoder0PinA 2
#define encoder0PinB 4
void setup() {
pinMode(encoder0PinA, INPUT);
digitalWrite(encoder0PinA, HIGH); // turn on pullup resistor
pinMode(encoder0PinB, INPUT);
digitalWrite(encoder0PinB, HIGH); // turn on pullup resistor
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
// 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
}
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
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
void setup () {
Serial.begin (9600);
}
// 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
Recursos externos
WinDVIG :Interfaz para captura de video en windows a travez de Quicktime, indispensable para trabajar con video en
Processing sobre Windows. }
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