Paso 11: Revisión de código
Porque no tengo transistores de la foto que producen señal digital encendido o apagado, era incapaz de usar las interrupciones en el software. Interrupciones me permitiría ejecutar constantemente los limpiaparabrisas y en ningún momento hubo una bola rodando más allá de un par de emisor/detector sensor, algunas medidas podrían tomarse.
Como es utilizan fotodiodos que producen un análogo y no digital señal de encendido/apagado así que tuve que comprobar el estado de los sensores mientras que también envía valores los servos funcionamiento los limpiaparabrisas.
Esto es lo que hice.
Los limpiaparabrisas funcionar constantemente. Hice que la acción de su propia función de
la función se llama "MoveServo" y 3 entradas.
-que servo a mover (generado aleatoriamente)
-Cómo ahora mover el limpiaparabrisas (generado aleatoriamente)
-Cuánto tiempo para hacer una pausa antes de volver a la posición "Inicio"
Dentro de la función, puse el código que comprueba el estado de los sensores entre todo.
El bucle de retardo es pensar donde comprueba más.
Normalmente un retraso sería un comando: delay();
en mi caso hice el sólo un milisegundo de retardo comando y el número de milisegundos del lazo en un retraso de milisegundos para que cada milisegundo me podrian decir el arduino para controlar el estado de los sensores.
Creo que es la más cercana a una interrupción que podría con este tipo de configuración.
El resultado es que el arduino reacciona casi instantáneamente cuando una bola atraviesa un sensor, que es lo que quería.
Esta es la función de MoveServo con algunos comentarios añadido
void MoveServo (int servoNum, largo pos, int pausa)
{
/ / antes que nada leer los sensores
ReadandReport(); / / Esto llama a otra función que lee el estado de los sensores y escribe los valores en serie para la depuración
Si (analogRead(impSensorPin) < 90) {StartMotor();} / esto lee el sensor impulsor y salta a la función StartMotor si la bola es
ReadNailPin(); / esto lee el pin de la pistola de clavos y salta a esa función si la bola es
Si (servoNum > = 50) / / el número aleatorio enviado es entre 1 y 100
{
wiper1.Write(POS); / / decir hasta qué punto el servo #1 para mover
ReadandReport(); / / debug salida
Si (analogRead(impSensorPin) < 90) {StartMotor();} / arriba Compruebe el sensor de impulsor
ReadNailPin(); / / comprobar el sensor de la pistola de clavo
} else { / / obtiene aquí si la elección del limpiador al azar fue menos de 50 así que mueva el servo #2 y compruebe los sensores
wiper2.Write(POS);
ReadandReport();
Si (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
}
Este es el bucle que comprueba los sensores cada milisegundo
para (i = 0; i / / esta pausa es esperar para el servo mover y para hacer una pausa al final antes de regresar a "casa"
{
ReadandReport();
Si (analogRead(impSensorPin) < 90) {StartMotor();} / / igual que arriba
ReadNailPin(); / / igual que arriba
retardo (1); / / este es el retardo real
}
}
A CONTINUACIÓN AQUÍ ES EL CÓDIGO FUENTE TODO
#include
int nailPin = 0; Este es el pin utilizado para activar la pistola de clavos
int LEDpin = 13; indicador LED indica que la máquina está funcionando
int fogPin = 20; este pin activa la máquina de la niebla
int nailSensorPin = 17; Esto está conectado con el Detector de infrarrojos delante de la pistola de clavos
int impSensorPin = 16; Esto está conectado con el detector de IR delante del impulsor de la bola
largo rndSrvoPos; variable para almacenar la posición del servo
largo rndPause; tiempo de pausa al azar
largo whichServo; elegir qué servo para mover
int i = 0; variable de tipo entero genérico
int nailTriggerValue; valor de lectura de disparador de infrarrojos LED para pistola de clavos
int pos; variable de posición del servo
Servo wiper1; primer objeto de limpiaparabrisas de servo
Servo wiper2; segundo objeto de limpiaparabrisas de servo
Servo impellerServo; servo para el empuje del botón de impulsor
void setup()
{
randomSeed(analogRead(3)); semilla del generador de números aleatorios
Serial.Begin(9600); serial de instalación
pinMode (LEDpin, salida); configurar los modos de pin
pinMode(fogPin,OUTPUT);
pinMode(nailPin,OUTPUT);
pinMode(nailSensorPin,INPUT);
pinMode(impSensorPin,INPUT);
wiper1.Attach(14); se fija el servo en el pin 14 al primer objeto de servo de limpiaparabrisas
wiper2.Attach(15); se fija el servo en el pin 15 para el segundo objeto de servo de limpiaparabrisas
impellerServo.attach(12); Fije al servo en el pin 12 para el empujador de botón impulsor
Blink3x(); parpadeará 3 veces para indicar Inicio - especie de una energía en autoprueba
}
void loop()
{
barrer los servos al azar ascienden hasta 80 grados
Pausar un periodo aleatorio de tiempo entre 10 y 250 ms
rndSrvoPos = random(0,22);
rndPause = random(250,500);
whichServo = random(100);
ReadandReport();
Si (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
MoveServo(whichServo,0,rndPause);
MoveServo(whichServo,80,rndPause);
}
void StartMotor()
{
empezar a niebla
digitalWrite(fogPin,HIGH);
Delay(750);
impellerServo.write(112);
Delay(450);
impellerServo.write(90);
digitalWrite(fogPin,LOW);
para (i = 0; i < 2000; i ++) / este retraso es un intento de evitar que el motor ejecuta asp muy a menudo cuando la bola rebota hacia fuera
{
ReadandReport();
ReadNailPin();
Delay(1);
}
ReadandReport();
}
void FireNailGun()
{
ReadandReport();
Serial.println ("Firing ciclo");
Delay(250);
digitalWrite(nailPin,HIGH);
Delay(10);
digitalWrite(nailPin,LOW);
}
void MoveServo (int servoNum, largo pos, int pausa)
{
ReadandReport();
Si (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
Si (servoNum > = 50)
{
wiper1.Write(POS);
ReadandReport();
Si (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
} else {}
wiper2.Write(POS);
ReadandReport();
Si (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
}
para (i = 0; i {}
ReadandReport();
Si (analogRead(impSensorPin) < 90) {StartMotor();}
ReadNailPin();
retardo (1);
}
}
void ReadNailPin()
{
pernos de leer y responder - sólo el clavo pin...
se trata de un intento de un interruptor manual
Si (analogRead(nailSensorPin) < 60) {FireNailGun();}
}
void Blink3x()
{
Ciclo Power en Self Test
ReadandReport();
digitalWrite(nailPin,HIGH);
Delay(250);
digitalWrite(nailPin,LOW);
digitalWrite(fogPin,HIGH);
digitalWrite(LEDpin,HIGH);
Delay(250);
digitalWrite(LEDpin,LOW);
Delay(250);
digitalWrite(LEDpin,HIGH);
Delay(250);
digitalWrite(LEDpin,LOW);
Delay(250);
digitalWrite(LEDpin,HIGH);
Delay(250);
digitalWrite(LEDpin,LOW);
digitalWrite(fogPin,LOW);
wiper1.Write(80);
wiper2.Write(80);
impellerServo.write(90);
impellerServo.write(112);
Delay(250);
impellerServo.write(90);
}
void ReadandReport()
{
Serial.Print ("impSensorPin:");
Serial.println(analogRead(impSensorPin));
Serial.Print ("nailSensorPin:");
Serial.println(analogRead(nailSensorPin));
}