Paso 17: Software de pruebas de carga
Ahora tenemos que programar el Edison para controlar el robot. Doy prueba simple código en este paso diseñado para comprobar que funciona todo el hardware y permitirle Asegúrese de que el codificador correcto está asociado con los canales de motor correcto, pero dejará más complejo de programación hasta (y más tarde puestos...).
Voy a utilizar Node.js para que sea más fácil conectarse a servicios web y tal más adelante pero también es posible utilizar C y C++, Python, Java o Arduino. También voy a usar MRAA y UPM, algunas bibliotecas de interfaz de hardware simple proporcionadas por Intel. También, hay otras opciones de la interfaz HW Node.js hay como cylon.js y JohnnyFive, que puede mirar más tarde.
Sin embargo, vamos a configurar cosas para utilizar MRAA y UPM. En primer lugar, siga las instrucciones para actualizar MRAA y UPM a las últimas versiones. Puede encontrar documentación para esto en el sitio de Intel pero si ya tienes actualizan el firmware de Edison a una versión razonablemente reciente entonces lo siguiente debe agarrar la últimas versiones de los repositorios en línea (Nota: Edisons tendrá que tener acceso a internet primero...). Después de iniciar sesión en el Edison como root ejecute los siguientes comandos:
actualización de OPKG
libmraa0 actualización de OPKG
OPKG actualización upm
Entonces usted quiere poner el siguiente script en alguna parte en el Edison, dicen en "omnitest.js" en tu directorio home y luego ejecutarlo con "nodo omnitest.js". Alternativamente usted puede cargar este código usando el XDK Intel gratis (edición Internet), que hace más conveniente el ciclo editar/cargar/ejecutar, proporciona a un depurador si quieren y también logra resolver las dependencias de módulo de MNP (sin embargo, esta secuencia de comandos de prueba intencionalmente evita el uso de módulos externos distintos de UPM y MRAA para facilitar la instalación). Carga del código por el XDK también configura lo para funcionar automáticamente en el arranque. Voy a mostrar cómo utilizar con más detalle más adelante.
Utilice esta secuencia de comandos para asegurarse de que están trabajando los codificadores, sensores, motores y bocinas. Básicamente, el guión hace girar el robot hacia adelante y hacia atrás en el lugar mediante la ejecución de todos los motores hacia adelante y hacia atrás, entonces se ejecuta cada motor a su vez. Asegúrese de que todos tres codificadores cuentan para arriba y luego abajo en la primera ida y vuelta de movimiento. Compruebe que cuando el motor gira a su vez el canal codificador correcto está respondiendo. Si no, intercambiar alrededor de cables de codificador o cambiar las asignaciones de pines en el script. Si uno de los motores no gira usted puede han revertido los identificadores para los controladores de motor de dos. Te recomiendo cambiar la asignación de pines en la secuencia de comandos en lugar de meterse con el cableado. También puede ajustar las constantes de escalamiento para el divisor de tensión (si lo usas) para obtener una lectura más precisa. Mira básicamente la lectura cruda mira el corrector de voltaje externo y después entra el derecho constantes en el script para calcular la relación de escala.
Una vez que se ejecuta esta secuencia de comandos de prueba y la anterior está todo resuelto, el hardware debería estar listo para una codificación más sofisticada!
------
/ * Omnirover demo.
* Ejercicios motores, Lee los datos de los sensores y descargas a la consola, pruebas de sonido.
*/
/ === PRUEBA SELECCIÓN
var test_motors = true;
var test_batt = true;
var test_encoders = true;
var test_sound = true;
=== LAS DEPENDENCIAS
var Mraa = require('mraa'); General hardware I/O
var MD = require("jsupm_grovemd"). GroveMD; Conductor del motor de UPM Grove
var RE = require("jsupm_rotaryencoder"). RotaryEncoder; Codificador rotatorio de UPM
=== LA CONFIGURACIÓN
pernos de var = {}
Batería conectada a través del divisor de tensión de arboleda, en configuración de 3
batería: 1, / / analógica de entrada; nivel de la batería total, dividido por 3.
Módulo de "altavoz" de Grove (también se puede utilizar el módulo zumbador)
altavoces: 6, / / se puede utilizar para varios tonos utilizando PWM modulada de salida
Codificadores de cuadratura para cada rueda (swap alrededor como sea necesario para obtener codificadores correcta en las ruedas de la correctas)
encoder_A1: 2 / / 1, una entrada de la rueda
encoder_B1: 3 / / 1, B de entrada de la rueda
encoder_A2: 8 / / 2, una entrada de la rueda
encoder_B2: 9, / / de la rueda 2, B de entrada
encoder_A3: 4 / / 3, una entrada de la rueda
encoder_B3: 5 / / 3, B de entrada de la rueda
Controladores de motor
motor_driver_bus: 0, / / Bus (hardware I2C)
motor_driver_01_id: 15, / la dirección de I2C para motores de 0 y 1 (canal 0 no se usa)
motor_driver_23_id: 10 / la dirección de I2C para motores de 2 y 3
};
Console.log("Pins:",pins);
=== PRUEBA MOTOR
var motor01 = new MD(pins.motor_driver_bus,pins.motor_driver_01_id);
var motor23 = new MD(pins.motor_driver_bus,pins.motor_driver_23_id);
Función auxiliar para establecer direcciones y velocidades de motor más fácilmente
función set_speed(m0,m1,m2,m3) {}
var abs_m0 = Math.floor(255*Math.abs(m0));
var abs_m1 = Math.floor(255*Math.abs(m1));
var abs_m2 = Math.floor(255*Math.abs(m2));
var abs_m3 = Math.floor(255*Math.abs(m3));
¿var dir_m0 = (m0 > 0)? MD. DIR_CW: MD. DIR_CCW;
¿var dir_m1 = (m1 > 0)? MD. DIR_CW: MD. DIR_CCW;
¿var dir_m2 = (m2 > 0)? MD. DIR_CW: MD. DIR_CCW;
¿var dir_m3 = (m3 > 0)? MD. DIR_CW: MD. DIR_CCW;
motor01.setMotorSpeeds(0,0);
motor01.setMotorDirections(dir_m0,dir_m1);
motor01.setMotorSpeeds(abs_m0,abs_m1);
motor23.setMotorSpeeds(0,0);
motor23.setMotorDirections(dir_m2,dir_m3);
motor23.setMotorSpeeds(abs_m2,abs_m3);
}
Prueba del motor
Si (test_motors) {}
periodicMotorForward();
} else {}
set_speed(0,0,0,0);
}
función periodicMotorForward() {}
Console.log ("motores: todos hacia delante");
set_speed(0,1,1,1);
setTimeout(periodicMotorStop1,10000);
}
función periodicMotorStop1() {}
Console.log ("motores: parada");
set_speed(0,0,0,0);
setTimeout(periodicMotorBackward,3000);
}
función periodicMotorBackward() {}
Console.log ("motores: hacia atrás");
set_speed(0,-1,-1,-1);
setTimeout(periodicMotorStop2,10000);
}
función periodicMotorStop2() {}
Console.log ("motores: parada");
set_speed(0,0,0,0);
setTimeout(periodicMotorForward_1,3000);
}
Utilizar las siguientes tres funciones, junto con la prueba de codificador,
para asegurarse de que los codificadores se asocian a los motores correcta
función periodicMotorForward_1() {}
Console.log ("motores: MOTOR delantero 1");
set_speed(0,1,0,0);
setTimeout(periodicMotorForward_2,10000);
}
función periodicMotorForward_2() {}
Console.log ("motores: MOTOR delantero 2");
set_speed(0,0,1,0);
setTimeout(periodicMotorForward_3,10000);
}
función periodicMotorForward_3() {}
Console.log ("motores: MOTOR delantero 3");
set_speed(0,0,0,1);
setTimeout(periodicMotorForward,10000);
}
=== PRUEBA CODIFICADOR
Lee todos los codificadores periódicamente e imprime sus cuentas actuales
Si (test_encoders) {}
encoder1 var = nuevo RE(pins.encoder_A1,pins.encoder_B1);
encoder2 var = nuevo RE(pins.encoder_A2,pins.encoder_B2);
var encoder3 = new RE(pins.encoder_A3,pins.encoder_B3);
{setInterval(function()}
Console.log ("encoder1:", encoder1.position());
Console.log ("encoder2:", encoder2.position());
Console.log ("encoder3:", encoder3.position());
}, 1000);
}
=== PRUEBA DE SENSOR BATERÍA
batt var = nuevo Mraa.Aio(pins.batt);
var batt_scale = 11.93/0.8; Divisor de tensión, 3 establecer
función read_batt_sensor() {}
br de var = batt.readFloat();
var bv = batt_scale * br;
Console.log ("lectura de batt crudo:", br);
Console.log("BATT:",BV);
}
Si (test_batt) {}
setInterval(read_batt_sensor,1000);
}
=== PRUEBA SONIDO
altavoz de var = nuevo Mraa.Pwm(pins.speaker);
var speaker_duty = 0,5;
var speaker_freq = 600;
var speaker_on_interval = 1000;
var speaker_off_interval = 10000;
Si (test_sound) {}
Speaker.period(1.0/speaker_freq);
Speaker.Write(0.0);
Speaker.Enable(true);
start_alarm();
} else {}
Speaker.Enable(false);
}
función start_alarm() {}
Console.log ("alarma en");
Speaker.period(1.0/speaker_freq);
Speaker.Write(speaker_duty);
setTimeout(stop_alarm,speaker_on_interval);
}
función stop_alarm() {}
Console.log ("alarma desactivada");
Speaker.Write(1.0);
setTimeout(start_alarm,speaker_off_interval);
}