Stap 17: Load Test Software
Nu hebben we de Edison om controle van de robot te programmeren. Ik zal sommige eenvoudige test code in deze stap ontworpen om te controleren of alle hardware werkt, en om u te laten zorg ervoor dat de juiste encoder is gekoppeld aan de juiste motor kanalen, maar meer complexe programmering aan jou (en latere berichten...) zal verlaten.
I 'm gonna Node.js later gebruiken om het gemakkelijker te koppelen aan webservices en dergelijke, maar het is ook mogelijk om het gebruik van C/C++, Python, Arduino of Java als u wilt. Ik ben ook gonna toepassing MRAA en UPM, sommige simpele hardware interface bibliotheken geboden door Intel. Er zijn andere Node.js HW interfaceopties er ook, zoals cylon.js en JohnnyFive, die u wellicht wilt kijken later.
Echter, laten we dingen opgezet MRAA en UPM te gebruiken. Ten eerste, volg de instructies MRAA en UPM updaten naar de nieuwste versies. Kunt u documentatie hiervoor op de Intel site maar als je al de Edison-firmware bijgewerkt naar een redelijk recente versie dan de volgende moet grijpen de nieuwste versies van de online repos (Opmerking: Edisons zal moeten beschikken over internettoegang eerst...). Na inloggen op de Edison als root de volgende commando's:
and update
and upgrade libmraa0
and upgrade upm
Dan wilt u zet het volgende script ergens op de Edison, zeggen in "omnitest.js" in je home directory en voer met behulp van "knooppunt omnitest.js". Als alternatief kunt u laden deze code met behulp van de gratis Intel XDK (IoT editie), die maakt het bewerken/upload/run-cyclus handiger, biedt een debugger als u wilt, en ook oplossen npm module afhankelijkheden beheert (echter dit testscript opzettelijk vermijdt installatie om gemakkelijker te maken met behulp van externe modules dan UPM en MRAA). Laden van de code door de XDK ook stelt het automatisch wordt uitgevoerd bij het opstarten. Ik zal laten zien hoe dat in meer detail om later te gebruiken.
Dit script gebruiken om ervoor te zorgen dat de encoders, sensoren, motoren en luidsprekers werken met zijn allen. Kortom, het script draait de robot heen en weer en weer op zijn plaats door het uitvoeren van alle motoren toekomen, dan achteruit, vervolgens uitgevoerd elke motor op zijn beurt. Zorg ervoor dat alle drie encoders, tellen en vervolgens naar beneden in de eerste heen en weer beweging. Controleer dat wanneer elke motor op zijn beurt dat draait de juiste encoder kanaal reageert. Zoniet, wisselen rond encoder kabels of wijzigen van de pin-toewijzingen in het script. Als een van de motoren niet spinnen kan u de id's hebben omgekeerd voor de twee chauffeurs van de motor. Ik beveel de pin toewijzing in het script wijzigen in plaats van het knoeien met de bedrading. U kunt ook tweak de schalen constanten voor de spanning divider (als u het gebruikt) om te krijgen een meer nauwkeurige lezing. In feite kijken naar de ruwe lezing, kijken naar de externe spanning checker en voer vervolgens de juiste constanten in het script voor de berekening van de verhouding tussen de schalen.
Zodra deze testscript wordt uitgevoerd en het bovenstaande is allemaal geregeld, moet de hardware klaar voor meer geavanceerde codering!
------
/ * Omnirover demo.
-De maakt van motoren, leest gegevens van sensoren en stort het aan de console, proeven geluid.
*/
/ === TEST SELECTIE
var test_motors = true;
var test_batt = true;
var test_encoders = true;
var test_sound = true;
=== AFHANKELIJKHEDEN
var Mraa = require('mraa'); algemene HW I/O
var MD = require("jsupm_grovemd"). GroveMD; UPM Grove motorische stuurprogramma
var RE = require("jsupm_rotaryencoder"). RotaryEncoder; UPM Rotary encoder
=== CONFIGURATIE
var pinnen = {}
Accu aangesloten via Grove voltage divider, op /3 instellen
Batt: 1, / / analog input; totale batterijniveau, gedeeld door 3.
Grove "speaker" module (kan ook met zoemer module)
spreker: 6, / / kan worden gebruikt om de output van verschillende tonen met behulp van gemoduleerde PWM
Quadrature encoders voor elk wiel (swap rond zoals nodig om de juiste encoders op juiste wielen)
encoder_A1: 2, / / 1, een input wiel
encoder_B1: 3, / / wiel 1, B-ingang
encoder_A2: 8, / / wiel 2, een input
encoder_B2: 9, / / wiel 2, B-ingang
encoder_A3: 4, / / wiel 3, een vermogen
encoder_B3: 5, / / wiel 3, ingang B
Motor stuurprogramma 's
motor_driver_bus: 0, / / Bus (hardware I2C)
motor_driver_01_id: 15, / / I2C adres voor motoren 0 en 1 (kanaal 0 wordt niet gebruikt)
motor_driver_23_id: 10 / / I2C adres voor motoren 2 en 3
};
console.log("pins:",pins);
=== MOTOR TEST
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);
Helper functie motor snelheden en richtingen gemakkelijker instellen
functie 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);
}
Motor test
Als (test_motors) {}
periodicMotorForward();
} else {}
set_speed(0,0,0,0);
}
functie periodicMotorForward() {}
console.log ("MOTORS: alle vooruit");
set_speed(0,1,1,1);
setTimeout(periodicMotorStop1,10000);
}
functie periodicMotorStop1() {}
console.log ("MOTORS: STOP");
set_speed(0,0,0,0);
setTimeout(periodicMotorBackward,3000);
}
functie periodicMotorBackward() {}
console.log ("MOTORS: naar ACHTEREN");
set_speed(0,-1,-1,-1);
setTimeout(periodicMotorStop2,10000);
}
functie periodicMotorStop2() {}
console.log ("MOTORS: STOP");
set_speed(0,0,0,0);
setTimeout(periodicMotorForward_1,3000);
}
De volgende drie functies, gebruiken in combinatie met het coderingsprogramma test,
Controleer of zijn de encoders gekoppeld aan de juiste motoren
functie periodicMotorForward_1() {}
console.log ("MOTORS: vooruit MOTOR 1");
set_speed(0,1,0,0);
setTimeout(periodicMotorForward_2,10000);
}
functie periodicMotorForward_2() {}
console.log ("MOTORS: FORWARD MOTOR 2");
set_speed(0,0,1,0);
setTimeout(periodicMotorForward_3,10000);
}
functie periodicMotorForward_3() {}
console.log ("MOTORS: vooruit MOTOR 3");
set_speed(0,0,0,1);
setTimeout(periodicMotorForward,10000);
}
=== ENCODER TEST
Leest alle de encoders periodiek en hun huidige graven wordt afgedrukt
Als (test_encoders) {}
var encoder1 = new RE(pins.encoder_A1,pins.encoder_B1);
var encoder2 = new 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);
}
=== ACCUTEST SENSOR
var batt = nieuwe Mraa.Aio(pins.batt);
var batt_scale = 11.93/0.8; Voltage divider, /3 instellen
functie read_batt_sensor() {}
var br = batt.readFloat();
var bv = batt_scale * br;
console.log ("raw batt lezing:", br);
console.log("Batt:",bv);
}
Als (test_batt) {}
setInterval(read_batt_sensor,1000);
}
=== GELUID TEST
var spreker = nieuwe Mraa.Pwm(pins.speaker);
var speaker_duty = 0,5;
var speaker_freq = 600;
var speaker_on_interval = 1000;
var speaker_off_interval = 10000;
Als (test_sound) {}
Speaker.period(1.0/speaker_freq);
Speaker.write(0.0);
Speaker.enable(true);
start_alarm();
} else {}
Speaker.enable(false);
}
functie start_alarm() {}
console.log ("alarm op");
Speaker.period(1.0/speaker_freq);
Speaker.write(speaker_duty);
setTimeout(stop_alarm,speaker_on_interval);
}
functie stop_alarm() {}
console.log ("alarm uitschakelen");
Speaker.write(1.0);
setTimeout(start_alarm,speaker_off_interval);
}