Intellekten Edison/Seeed/Nexus 3WD OmniRover (15 / 16 steg)
Steg 17: Load Test programvara
Nu har vi programmera Edison att styra roboten. Jag kommer att ge några enkla test kod i det här steget för att kontrollera att all hårdvara fungerar och för att låta dig se till att rätt kodaren är associerad med rätt motor kanaler, men kommer att lämna mer komplex programmering upp till dig (och senare inlägg...).
Jag kommer att använda Node.js för att göra det lättare att ansluta till webbtjänster och sådana senare men det är också möjligt att använda C/C++, Python, Arduino eller Java om du vill. Jag tänker också använda MRAA och UPM, några enkla hårdvara gränssnitt bibliotek som tillhandahålls av Intel. Det finns andra alternativ Node.js HW gränssnitt där också, som cylon.js och JohnnyFive, som du kanske vill titta på senare.
Men låt oss ställa in saker för att använda MRAA och UPM. Först, Följ instruktionerna för att uppdatera MRAA och UPM till de senaste versionerna. Du kan hitta dokumentation för detta på webbplatsen för Intel men om du redan har uppdaterat Edison firmware till en någorlunda ny version sedan följande bör ta den senaste versioner från online repor (Obs: Edisons måste ha tillgång till internet först...). Efter att logga in på Edison som root utfärda följande kommandon:
Opkg uppdatering
Opkg uppgradering libmraa0
Opkg uppgradering upm
Då vill du sätta följande skript någonstans på Edison, säger i "omnitest.js" i din hemkatalog och sedan köra den med "nod omnitest.js". Alternativt kan du läsa in denna kod med hjälp av den gratis Intel XDK (IoT Edition), som gör redigera/upload/run cykeln mer praktiskt, ger en debugger om du vill ha det, och lyckas också lösa npm modul beroenden (dock denna testskript avsiktligt undviker med externa moduler än UPM och MRAA för att göra installationen lättare). Laddar XDK-koden anger också det ska köras automatiskt vid uppstart. Jag kommer att visa hur man använder som mer i detalj senare.
Använda detta skript för att se till att kodare, sensorer, motorer och högtalare alla arbetar. I grund och botten skriptet snurrar roboten fram och tillbaka och tillbaka på plats genom att köra alla motorer framåt, då bakåt, sedan körs det varje motor i sin tur. Kontrollera att alla tre kodare räkna och sedan ner i först och tillbaka rörelse. Kontrollera sedan att när varje motor snurrar i sin tur som svarar rätt encoder kanalen. Om inte, antingen byta runt encoder kablar eller ändra pin tilldelningarna i skriptet. Om en av drivkrafterna inte snurrar kan du ha vänt ID: N för två motor förare. Jag rekommenderar ändrar pin tilldelningen i skriptet i stället för att jävlas med ledningarna. Du kan också justera skalning konstanterna för spänning avdelare (om du använder det) för att få en mer exakt avläsning. I princip titta på rå läsningen, titta på den yttre spänning Brocket och anger du rätt konstanterna i skriptet för att beräkna skalning förhållandet.
När detta testskript körs och ovan allt sorteras, bör maskinvaran vara redo för mer sofistikerade kodning!
------
/ * Omnirover demo.
* Övningar motorer, läser data från sensorer och dumpar det till konsolen, tester ljud.
*/
/ === TEST URVAL
var test_motors = sant;
var test_batt = sant;
var test_encoders = sant;
var test_sound = sant;
=== BEROENDEN
var Mraa = require('mraa'); de allmänna HW I/O
var MD = require("jsupm_grovemd"). GroveMD; UPM Grove motor driver
var RE = require("jsupm_rotaryencoder"). RotaryEncoder; UPM Rotary encoder
=== KONFIGURATION
var stiften = {
Batteri ansluts via Grove spänningsavdelare, på /3 inställning
batt: 1, / / analog ingång; totala batterinivå, delat med 3.
Grove "speaker" modul (kan också använda summern modul)
talare: 6, / / kan användas till olika toner med hjälp av modulerade PWM-utgång
Kvadratur pulsgivare för varje hjul (byta runt som behövs för att få rätt kodare på rätt hjul)
encoder_A1: 2, / / hjul 1, en ingång
encoder_B1: 3, / / hjul 1, ingång B
encoder_A2: 8, / / hjul 2, en ingång
encoder_B2: 9, / / hjul 2, B-ingång
encoder_A3: 4, / / hjul 3, en ingång
encoder_B3: 5, / / hjul 3, B-ingång
Motor-drivrutiner
motor_driver_bus: 0, / / buss (hårdvara I2C)
motor_driver_01_id: 15, / / I2C adress för motorer 0 och 1 (kanal 0 används inte)
motor_driver_23_id: 10 / / I2C adress för motorer 2 och 3
};
Console.log("Pins:",Pins);
=== MOTOR TEST
var motor01 = ny MD(pins.motor_driver_bus,pins.motor_driver_01_id);
var motor23 = ny MD(pins.motor_driver_bus,pins.motor_driver_23_id);
Hjälpare funktion att ange motor hastigheter och riktningar lättare
funktion 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);
}
Motoriska test
om (test_motors) {
periodicMotorForward();
} annat {
set_speed(0,0,0,0);
}
funktion periodicMotorForward() {
Console.log ("motorer: alla framåt");
set_speed(0,1,1,1);
setTimeout(periodicMotorStop1,10000);
}
funktion periodicMotorStop1() {
Console.log ("motorer: stopp");
set_speed(0,0,0,0);
setTimeout(periodicMotorBackward,3000);
}
funktion periodicMotorBackward() {
Console.log ("motorer: bakåt");
set_speed(0,-1,-1,-1);
setTimeout(periodicMotorStop2,10000);
}
funktion periodicMotorStop2() {
Console.log ("motorer: stopp");
set_speed(0,0,0,0);
setTimeout(periodicMotorForward_1,3000);
}
Använd följande tre funktioner, tillsammans med encoder test,
för att se är kodare associerade med den korrekta motorer
funktion periodicMotorForward_1() {
Console.log ("motorer: fram MOTOR 1");
set_speed(0,1,0,0);
setTimeout(periodicMotorForward_2,10000);
}
funktion periodicMotorForward_2() {
Console.log ("motorer: fram MOTOR 2");
set_speed(0,0,1,0);
setTimeout(periodicMotorForward_3,10000);
}
funktion periodicMotorForward_3() {
Console.log ("motorer: fram MOTOR 3");
set_speed(0,0,0,1);
setTimeout(periodicMotorForward,10000);
}
=== ENCODER TEST
Läser alla kodare med jämna mellanrum och skriver ut deras nuvarande räknas
om (test_encoders) {
var encoder1 = ny RE(pins.encoder_A1,pins.encoder_B1);
var encoder2 = ny RE(pins.encoder_A2,pins.encoder_B2);
var encoder3 = ny 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);
}
=== BATTERI SENSOR TEST
var batt = nya Mraa.Aio(pins.batt);
var batt_scale = 11.93/0.8; Spänningsavdelare, /3 inställning
funktion read_batt_sensor() {
var br = batt.readFloat();
var bv = batt_scale * br;
Console.log ("raw batt behandlingen:", br);
Console.log("batt:",BV);
}
om (test_batt) {
setInterval(read_batt_sensor,1000);
}
=== LJUDTEST
var högtalare = nya Mraa.Pwm(pins.speaker);
var speaker_duty = 0,5;
var speaker_freq = 600;
var speaker_on_interval = 1000;
var speaker_off_interval = 10000;
om (test_sound) {
Speaker.period(1.0/speaker_freq);
Speaker.write(0.0);
Speaker.enable(true);
start_alarm();
} annat {
Speaker.enable(false);
}
funktion start_alarm() {
Console.log ("alarm på");
Speaker.period(1.0/speaker_freq);
Speaker.write(speaker_duty);
setTimeout(stop_alarm,speaker_on_interval);
}
funktion stop_alarm() {
Console.log ("alarm off");
Speaker.write(1.0);
setTimeout(start_alarm,speaker_off_interval);
}