Paso 3: programación
Lo que hace
- El programa de puesta en marcha, encender el interruptor de la luz. Espere cinco segundos antes de apagarlo nuevamente. Va a tener su propio interruptor de la luz rave.
- También hay un par de modos de demostración en el programa como se muestra en este video.
Para obtener detalles sobre cómo cablear para cada modo de demostración, por favor consulte el código. Aquí está un resumen de las piezas utilizadas.
- Demo Mode 1 - botón - Simple interruptor Micro encontrado (aquí)
- Sensor de proximidad Demo Mode 2 - Sensor de proximidad - IR encontrado (aquí)
- Demo Mode 3 - fotorresistencia encontrado (aquí)
Cómo descargar el código para el Arduino
Opción 1 - descargar y descomprimir
- Descargar el archivo zip adjunto (05_SESW_Test.zip)
- Descomprímalo en el directorio de sketch de Arduino (por defecto /My documentos/Arduino /)
- Iniciar el entorno de Arduino y cargar el bosquejo (_SESW_Test)
- subir y empezar a jugar
Opción 2 - copiar y pegar
- Copie el código de Arduino desde abajo
- Péguelo en el entorno de desarrollo Arduino.
- subir y empezar a jugar
Cómo usar interruptores de Servo en su propio código
- copiar y pegar las secciones del programa de prueba entre (/ / interruptor Servo - (SESW) preámbulo Inicio) y (/ / interruptor Servo - (SESW) preámbulo final) a la parte superior de su bosquejo
- copiar y pegar las secciones del programa de prueba entre (/ / interruptor Servo - inicio de rutinas (SESW)) y (/ / interruptor Servo - (SESW) final de las rutinas) en la parte inferior del boceto
- Call servoSwitchSetup(); en su rutina de setup()
- luego para utilizar encender() y turnOff()
- pueden hacerse ajustes para apoyar más interruptores de servo.
Apéndice 1 - código de Arduino (_SESW_Test)
Inicio del preámbulo del NUNCHUCK - para más información en profundidad, visite la fuente original de este http://www.windmeadow.com/node/42 código / /---/ * * detalles de cableado * blanco - tierra * rojo - 3.3 + v - 5 voltios parece funcionar * verde - datos - analógico 4 * amarillo - reloj - analógica 5 * / #include #include #undef int #include uint8_t telefonía [6]; array para almacenar arduino salida int cnt = 0; contador utilizado para nunchuck comunicación int ledPin = 13; int nunchuckValues [] = {0,0,0,0,0,0,0,0,0,0}; Una matriz para almacenar los valores de nuncheck / * * el índice de cada valor dentro de la matriz de [] nunchuckValues * ie. XSTICK valor se almacena en nunchuckValues [XSTICK] (0) * / joystick de //The 0 #define XSTICK valores #define YSTICK 1 #define XAXIS 2 //The tres acelerómetro valores #define ejeY respectivamente 3 #define ZAXIS 4 #define ZBUTTON 5 //Front botón (0 cuando presiona) #define CBUTTON 6 #define XAXISDELTA 7 //Change en datos de acelerómetro de última lectura; #define YAXISDELTA 8 #define ZAXISDELTA 9 //Nunchuck G cálculo de constantes de / * * para escalar los valores crudos del nunchuck en valores de G * detalles de calibración y de las matemáticas pueden encontrarse en * http://www.wiili.org/index.php/Motion_analysis (copiado de http://www.wiili.org/index.php/Motion_analysis) cero puntos x_0 = (x_1 + x_2) / 2\, y_0 = (y_1 + y_3) / 2\, z_0 = (z_2 + z_3) / 2\ Puntos uno G x = \frac{x_{raw}-x_0} {x_3 - x_0} y = \frac{y_{raw}-y_0} {y_2 - y_0} z = \frac{z_{raw}-z_0} {z_1 - z_0} * / / * no todos los éstos se utilizan y podrían suprimirse (para hacer la matemática interpretting * más fácil 0-cero G 1-valor al colocar en la tabla 2-valor cuando descansando en la nariz * 3-valor cuando se apoye en el lado (izquierda arriba) * / #define X0 #define 500 X1 500 # definir X2 500 #define X3 711 #define Y0 465 #define 481 Y1 #define Y2 621 #define Y3 449 #define Z0 578 #define Z1 785 #define Z2 575 #define Z3 582 //END NUNCHUCK preámbulo - para más información en profundidad, visite la fuente original de este http://www.windmeadow.com/node/42 código / /---/ /---/ / inicio de ARDUINO controlado SERVO ROBOT (Serbia) preámbulo #include #define LEFTSERVOPIN 10 #define MAXSPEED 10 #define RIGHTSERVOPIN 9 //due para el funcionamiento de los servos de rotación continua velocidad máxima es llegar a un valor mucho menor de 90 (este valor cambiará dependiendo de tus servos) (para servos Parallax) Servo leftServo; Servo rightServo; int leftSpeed = 100; establece la velocidad del robot (izquierdas servos) //a porcentaje entre - MAXSPEED y MAXSPEED int rightSpeed = 100; establece la velocidad del robot (ambos servos) //a porcentaje entre - MAXSPEED y MAXSPEED int velocidad = 100; utilizado para control simple (goForward, goBackward, goLeft y goRight //a porcentaje entre 0 y MAXSPEED / / final de ARDUINO controlado SERVO ROBOT (Serbia) preámbulo / /---lastPrint largo; //a largo variable para almacenar el estado de wiimote era último impreso #define PRINTINTERVAL 1000 //the número de milisegundos entre salir el estado nunchuck sobre el porcentaje usb puerto #define margen de oscilación 20 //A distancia del centro que es interpretado como siendo cero void setup() {Serial.begin(9600); //Starts el puerto serial (usado para depuración sin embargo hace saltos servos) nunchuck_init (); enviar el nunchuck inicialización apretón de manos serbSetup(); agrega los servos y prepara a todos los serbios relacionadas con variables lastPrint = millis(); } void loop() {readNunchuck(); //Reads el estado actual de los nunchucks botones y acelerómetros si ()! getNunValue(ZBUTTON)) {moveWiiAcelerometer(); //moves el deoending de wii en los valores de aceleración de nunchucks} else {moveWiiJoystick();} if((millis() - lastPrint) > PRINTINTERVAL) {//If un segundo ha pasado desde que los últimos valores de nunchuck impresión impresión printData(); //print nunchuck valores Serial.println(); //add un lastPrint de enter = millis(); //store hora actual como lastPrint}} void moveWiiAcelerometer() {moveDifferential(getYGs() * (float)100,getXGs()*(float)100);} void moveWiiJoystick() {moveDifferential(map(getNunValue(YSTICK) , 30,220,-100,100),map(getNunValue(XSTICK),30,220,-100,100)); } //Takes en una velocidad y una dirección de entrada (como un joystick) y lo traduce a velocidad comandos void moveDifferential (int speed1, int direction1) {speed1 = deadBandFilter(speed1); direction1 = deadBandFilter(direction1); setSpeedLeft (speed1 + direction1); setSpeedRight (speed1 - direction1);} int deadBandFilter (int valor) {si (valor > - banda muerta & & valor < banda muerta) {valor = 0;} otro {if(value > 0) {valor = valor - banda muerta * 100 / (100-banda muerta);} más {valor = valor + banda muerta * 100 / (100-margen de oscilación);}} devolver valor;} //START de NUNCHUCK rutinas / /---//Calculates y devuelve la aceleración xAxis en Gs float getXGs() {volver ((float)getNunValue(XAXIS) - X0) / (X 3 - X 0);} //Calculates y devuelve la aceleración ejeY respectivamente en Gs float getYGs() {volver ((float)getNunValue(YAXIS)-Y0) / (Y2 - Y0);} //Calculates y devuelve la aceleración zAxis en Gs flotador getZGs() {volver ((float)getNunValue(YAXIS)-Z0) / (Z1 - Z0);} //START de NUNCHUCK lectura código - para más información en profundidad, visitan el //of fuente original esta http://www.windmeadow.com/node/42 código / /---void readNunchuck() {Wire.requestFrom (0x52 , 6); solicitar datos del nunchuck mientras (Wire.available ()) {telefonía [cnt] = nunchuk_decode_byte (Wire.receive ()); / recibir el byte como un número entero digitalWrite (ledPin, HIGH); / / establece el LED en cnt ++;} / / si hemos recibido los bytes de 6, y luego ir imprimirlos si (cnt > = 5) {nunchuckValues [XSTICK] = telefonía [0]; nunchuckValues [YSTICK] = telefonía [1]; int tempNun_xAxis = telefonía [2] * 2 * 2; int tempNun_yAxis = telefonía [3] * 2 * 2; int tempNun_zAxis = telefonía [4] * 2 * 2; nunchuckValues [ZBUTTON] = 0; nunchuckValues [CBUTTON] = 0; / telefonía byte [5] contiene los bits para botones z y c / / también contiene los bits menos significativos de los datos del acelerómetro / / así que tenemos que comprobar cada bit del byte telefonía [5] si ((telefonía [5] >> 0) & 1) {nunchuckValues [ZBUTTON] = 1;} //checking si se presiona el botón Z (0 = 1 presionado = sin prensar) si ((telefonía [5] >> 1) & 1) {nunchuckValues [CBUTTON] = 1;} //checking si se presiona el botón C (0 = 1 presionado = sin prensar) si ((telefonía [5] >> 2) & 1) {tempNun_xAxis += 2;} //adding segundo bit menos significativo a eje_x (x_axis) si ((telefonía [5] >> 3) & 1) {tempNun_xAxis += 1;} //adding menos significativo bit a eje_x (x_axis) si ((telefonía [5] >> 4) & 1) {tempNun_yAxis += 2;} //adding segundo menos significativo bit a y_axis si ((telefonía [5] >> 5) & 1) {tempNun_yAxis += 1;} //adding menos significativo bit a eje_x (x_axis) si ((telefonía [5] >> 6) & 1) {tempNun_zAxis += 2;} //adding segundo menos significativo poco a z_ eje si ((telefonía [5] >> 7) & 1) {tempNun_zAxis += 1;} ///adding menos significativo poco a eje_x (x_axis) nunchuckValues [XAXISDELTA] = tempNun_xAxis - nunchuckValues [EJEX]; nunchuckValues [EJEX] = tempNun_xAxis; nunchuckValues [YAXISDELTA] = tempNun_yAxis - nunchuckValues EjeY [respectivamente]; nunchuckValues [EjeY respectivamente] = tempNun_yAxis; nunchuckValues [ZAXISDELTA] = tempNun_zAxis - nunchuckValues [ZAXIS]; nunchuckValues [ZAXIS] = tempNun_zAxis; } cnt = 0; send_zero (); enviar la solicitud de los siguientes bytes} int getNunValue(int valueIndex) {return nunchuckValues [valueIndex];} void nunchuck_init () {Wire.begin (); / / join i2c bus con dirección 0x52 Wire.beginTransmission (0x52); / / transmitir al dispositivo 0x52 Wire.send (0 x 40); / / envía la dirección de memoria Wire.send (0 x 00); / / envía envía un cero. Wire.endTransmission (); parada de transmisión} void send_zero () {Wire.beginTransmission (0x52); / / transmitir al dispositivo 0x52 Wire.send (0 x 00); / / envía un byte Wire.endTransmission (); / / interrumpir la transmisión} / / codificar datos para formato que mayoría de wiimote los conductores excepto / sólo necesaria si utilizas uno de los conductores regulares wiimote char nunchuk_decode_byte (char x) {x = (x ^ 0x17) + 0x17; return x;} //END del NUNCHUCK código - para más información en profundidad, visite la fuente de //original de este http://www.windmeadow.com/node/42 código / /---/ /---//START rutinas de ARDUINO controlado SERVO ROBOT (Serbia) / * * configura tu arduino a tu servio utilizando las rutinas incluidas * / void serbSetup() {pinMode (LEFTSERVOPIN, salida); //sets el servo izquierdo señal pin //to salida pinMode (RIGHTSERVOPIN, salida), setSpeed(speed); //sets el leftServo.attach(LEFTSERVOPIN) de salida del servo derecho señal pin //to; //attaches izquierda servo rightServo.attach(RIGHTSERVOPIN); //attaches servo derecho goStop();} / * * ajusta la velocidad del robot entre 0-(stopped) y 100-(velocidad máxima) * Nota : velocidad no va a cambiar la velocidad de la corriente debe cambiar velocidad * entonces llame a uno de los métodos irás antes los cambios ocurren. * / void setSpeed (int newSpeed) {si (newSpeed > = 100) {newSpeed = 100;} //if velocidad es mayor que 100 //make 100 if (newSpeed < = 0) {newSpeed = 0;} //if la velocidad es menos de 0 velocidad //it 0 = newSpeed * MAXSPEED / 100; //scales la velocidad //between 0 y MAXSPEED} / * * ajusta la velocidad de la rightServo de robots entre-100-(reversed) y 100-(forward) * Nota : llama a esta rutina llevará a efecto inmediatamente * / void setSpeedRight (int newSpeed) {si (newSpeed > = 100) {newSpeed = 100;} //if velocidad es mayor que 100 //make 100 if (newSpeed < = -100) {newSpeed = -100;} //if velocidad es menos de -100 //it -100 rightSpeed = newSpeed * MAXSPEED / 100; //scales la velocidad que //between - MAXSPEED y MAXSPEED rightServo.write (90 - rightSpeed); //sends el nuevo valor al servo} / * * ajusta la velocidad de la leftServo de robots entre-100-(reversed) y 100-(forward) * Nota : llama a esta rutina llevará a efecto inmediatamente * / void setSpeedLeft (int newSpeed) {si (newSpeed > = 100) {newSpeed = 100;} //if velocidad es mayor que 100 //make 100 if (newSpeed < = -100) {newSpeed = -100;} //if velocidad es menos de -100 //it -100 leftSpeed = newSpeed * MAXSPEED / 100; //scales la velocidad que //between - MAXSPEED y MAXSPEED leftServo.write (90 + leftSpeed); //sends el nuevo valor al servo} / * * envía el robot remite * / void goForward() {leftServo.write (90 + velocidad); rightServo.write (90 - velocidad);} / * * envía el robot hacia atrás * / void goBackward() {leftServo.write (90 - velocidad); rightServo.write (90 + velocidad);} / * * envía el robot derecha * / void goRight() {leftServo.write (90 + velocidad); rightServo.write (90 + velocidad);} / * * envía el robot izquierda * / void goLeft() {leftServo.write (90 - velocidad); rightServo.write (90 - velocidad);} / * * detiene el robot * / void goStop() {leftServo.write(90); rightServo.write(90);} //END rutinas de ARDUINO controlado SERVO ROBOT (Serbia) / /---//START OF imprimir rutinas (puede eliminar si no se utiliza) / leer---//Prints los Nunchucks últimos datos (debe llamar NUN_readNunchuck(); antes llamada printData() vacío {Serial.print ("XJoy ="); Serial.Print (getNunValue(XSTICK), DEC); Serial.Print ("\t"); Serial.Print ("YJoy ="); Serial.Print (getNunValue(YSTICK), DEC); Serial.Print ("\t"); Serial.Print ("XGs ="); Serial.Print (getXGs() * 1000, DEC); Serial.Print ("\t"); Serial.Print ("YGs ="); Serial.Print (getYGs() * 1000, DEC); Serial.Print ("\t"); Serial.Print ("ZGs ="); Serial.Print (getZGs() * 1000, DEC); Serial.Print ("\t"); Serial.Print ("ZBut ="); Serial.Print (getNunValue(ZBUTTON), DEC); Serial.Print ("\t"); Serial.Print ("YBut ="); Serial.Print (getNunValue(CBUTTON), DEC); Serial.Print ("\t"); } //END OF PRINT ROUTINES //--------------------------------------------------------------------