APPLICATIEBOUW 5E COLLEGE: LEJOS DEEL 2 Onderdeel van SmartProducts
INHOUD COLLEGE 5 Bespreking opdrachten & DPU2 LeJOS deel 2 Opdracht 5 Vanmiddag review DPU2 module4.io.utwente.nl/applicatiebouw Applicatiebouw, Industrieel Ontwerpen 20-6-2016 2
PROTOTYPE VS. UITEINDELIJK PRODUCT DPU S 2 EN 3 APPLICATIEBOUW: ONTWERPEN EN BOUWEN SOFTWARE PROTOTYPE DPU1: Specificaties voor uiteindelijk product DPU2 en 3: Ontwerp & bouw voor prototype Met prototype toon je werking aan en demonstreer je functies voor (potentiele) opdrachtgevers Prototype kan subset van functies uiteindelijk product hebben Niet vergeten: materiaal DPU2 inleveren! BlackBoard: Applicatiebouw > DPU's/opdrachten inleveren Applicatiebouw, Industrieel Ontwerpen 20-6-2016 3
Vanmiddag review DPU2 DPU2 : TESTVERSIE APPLICATIE DPU 2 Realiseer eerste testversies* van: De Userinterface (kan ism. Ergonomie) Het proefmodel (Lego model) Applicatie voor de systeembesturing (Java) DPU 1 Software specificaties Classontwerp + pseudocode Programma regels (code) { boek: 4.8-4.11, 6.1-6.4 } * Resultaat: eerste versie applicatie die enkele basisfuncties van het proefmodel demonstreert. Deze hoeven dus nog niet volledig functioneel (af) te zijn, maar tonen de werking/het plan aan. Applicatiebouw, Industrieel Ontwerpen 20-6-2016 4
BESPREKING OPDRACHTEN Zelf declareren van variabelen Wat is het type? (basis typen, classes zijn ook typen!) Denk aan afwerking: formatteer code, geef applicatie een titel (JFrame), voeg commentaar toe Type variabele Naam variabele Object // Voorbeelden declaratie basis typen: int x; double getal; // Voorbeelden waarbij type een class is: String s; Bal b; DifferentialPilot pilot; LightSensor l; Applicatiebouw, Industrieel Ontwerpen 20-6-2016 5
BESPREKING OPDRACHTEN OPDRACHT 4 Besturen robot: methoden Motor-class gebruiken: Motor.C.forward(); Delay.msDelay(200); Motor.C.flt(); Methoden voor aansturen robot bedenken Naam? Waarde terug? Parameters? public void methode( ) { // ga vooruit draaien // wacht even // stop met draaien Wel waarde terug: boolean void: Geen waarde terug public boolean methode( ) { return... } Booleaanse expressie: levert waar of niet waar op Applicatiebouw, Industrieel Ontwerpen 20-6-2016 6
BESPREKING OPDRACHTEN OPDRACHT 4 Declareren objecten Initialisatie in constructor Declareer een object voor de lichtsensor en initialiseer deze. public class Catapult { Declaratie object lichtsensor Constructor van de class Catapult LightSensor lichtsensor; public Catapult() {... lichtsensor = new LightSensor(SensorPort.S2);... } Initialisatie object lichtsensor Applicatiebouw, Industrieel Ontwerpen 20-6-2016 7
BESPREKING OPDRACHTEN OPDRACHT 4 Meten lichtwaarde Wat is de lichtwaarde? Declareer een variabele voor lichtwaarde en vraag lichtwaarde aan sensor. Heeft de lichtwaarde een bepaalde waarde? Variabele: lichtwaarde int lichtwaarde=lichtsensor.getlightvalue(); if (lichtwaarde>20) {... } Van een object kan je een methode aanroepen Als lichtwaarde groter dan 20, dan code { } uitvoeren Applicatiebouw, Industrieel Ontwerpen 20-6-2016 8
HET ONTWERPEN VAN EEN KLASSE HOOFDSTUK 6 BOEK Stappen (College 3): 1. Object analyseren 2. Klasse ontwerpen (wat is wat kan hoe?) 3. Klasse uitwerken (types attributen, parameters & resultaat methoden) 4. Methoden invullen (body) wat is... Vergelijking: Class = recept voor object Boek: bouwtekening wat kan... een object Boek: wat zijn de verantwoordelijkheden? en hoe? Applicatiebouw, Industrieel Ontwerpen 20-6-2016 9
ONTWERPMETHODEN VOOR SOFTWARE HST 5, 6 EN 7 Klasse diagram, mbv UML Andere: Functie decompositie Data flows State diagram (toestands overgang diagram) Flow chart (stroomschema) {5} Applicatiebouw, Industrieel Ontwerpen 20-6-2016 10
UML DIAGRAMMEN HOOFDSTUK 6.2 BOEK - dag:int - maand:int - jaar:int Datum + getdag():int + getmaand():int + setdag( dag:int ) Naam class class-variabelen (eigenschappen) Methoden + public - private type achter de : Applicatiebouw, Industrieel Ontwerpen 20-6-2016 11
UML: UNIFIED MODELING LANGUAGE VOORBEELDEN VAN UML DIAGRAMMEN Applicatiebouw, Industrieel Ontwerpen 20-6-2016 12
IN ECLIPSE: OBJECTAID CLASS DIAGRAM PLUGIN 1. Kies Help > Install New Software uit menu 2. Vul update site http://www.objectaid.net/update in bij Work with 3. Expand ObjectAid UML Explorer, selecteer 1e 2 opties, Druk op Next (2x) 4. Accepteer licentie, Finish 3) 2) Gebruik: File > New > Other, kies Object Aid UML Diagram > Class Diagram More info: objectaid.com/installation Applicatiebouw, Industrieel Ontwerpen 20-6-2016 13
OBJECTAID CLASS DIAGRAM MAKEN Class diagram is verplicht bij inleveren DPU3 (bijlage verslag) Sleep met muis classes vanuit Package Explorer in het diagram: Klaar? Diagram opslaan als afbeelding: klik met rechtermuisknop in diagram > Save Image objectaid.com/class-diagram Applicatiebouw, Industrieel Ontwerpen 20-6-2016 14
THEORIE: VAN DOMEINKLASSE TOT IMPLEMENTATIE HOOFDSTUK 7 BOEK Boek: voorbeelden van ontwerp tot uiteindelijk resultaat (programma) Domeinmodel: relaties tussen set klassen Relaties kan je weergeven in UML mbv. klassendiagram Applicatiebouw, Industrieel Ontwerpen 20-6-2016 15
LIJSTEN: ARRAY Lijst van primitive typen Bijv. int, double Altijd initialiseren met new Class voor het bijhouden van universele lijsten: ArrayList // declaratie lijst van 4 integers: int[] dout = new int[4]; // eerste element in lijst krijgt een waarde: dout[0] = 0; // Test de LED's door ze 1 voor 1 aan te doen: for (int i = 0; i < 4; i++) { dout[i] = 1; superpro.write(dout); Tools.delay(1_000); // wacht 1 sec. } Applicatiebouw, Industrieel Ontwerpen 20-6-2016 16
ARRAYLIST PARAGRAAF 7.3, 7.4 BOEK Opdracht 4b: stuiterende ballen Lijsten van objecten bijhouden Opdracht 6: zie Controller Methoden: add(object) get(int) size() // Lijst met alle ballen in het Panel: ArrayList<Bal> ballen; // Maak een nieuwe bal: Bal b = new Bal(); // Voeg de Bal toe aan de lijst met ballen: ballen.add(b); // Haal bal nummer 5 uit de lijst: Bal b = ballen.get(5); In deze lijst mogen alleen objecten van type Bal // Hoeveel ballen zitten er in de lijst?: System.out.println("Aantal ballen: "+ballen.size() ); Applicatiebouw, Industrieel Ontwerpen 20-6-2016 17
ARRAYLIST VOORRAADBEHEER: CONTROLLER OPDRACHT 6 ArrayList<Product> producten; // lijst van producten // voeg nieuw Product toe aan de lijst: producten.add(new Product(name, prijs)); private boolean controleerbetaling() { // Haal het product uit de lijst: Product p = producten.get(gekozenitem); // Als het saldo hoger of gelijk aan de prijs van het gekozen items is, // geven we accoord voor de betaling: if (saldo >= p.getprijs()) { return true; } gui.displaymessage("onvoldoende saldo"); return false; In opdracht: check methoden van de class Product om de naam en de prijs van een product op te vragen Applicatiebouw, Industrieel Ontwerpen 20-6-2016 18
ARRAYLIST Opdracht 4b: stuiterende ballen Lijst doorlopen mbv for-each lus: public void paintcomponent(graphics g) { super.paintcomponent(g); // Teken alle ballen door van elke bal // de paintcomponent() aan te roepen: } for (Bal b : ballen) { // for-each b.paintcomponent(g); // teken de bal } for-each lus: paragraaf 7.3.8 boek Applicatiebouw, Industrieel Ontwerpen 20-6-2016 19
JAVA VOOR LEGO MINDSTORMS NXT Sensoren, events Rijdende robots besturen DifferentialPilot class Ritgegevens Gedrag Classes Behavior en Arbitrator lejos.org: tutorial en API documentatie Applicatiebouw, Industrieel Ontwerpen 20-6-2016 20
VOORBEELDEN LEJOS Samples-project van lejos: File > Import Uitleg samples voor Eclipse Zoeken in voorbeelden: 21
SENSOREN: ULTRASOON Class: UltrasonicSensor Methode: public int getdistance() In samples-project van lejos: UltrasonicSensor sensor = new UltrasonicSensor(SensorPort.S1); int afstand = 0; while (!Button.ESCAPE.isDown()) { afstand = sensor.getdistance(); LCD.clear(3); LCD.drawInt( afstand, 0, 3); Delay.msDelay(1_000); // 1 sec wachten } 20-6-2016 22
SENSOREN: TOUCH Class: TouchSensor Methode: public boolean ispressed() Levert true als de touchsensor is ingedrukt, anders false TouchSensor touch = new TouchSensor(SensorPort.S1); // wacht zolang touchsensor niet is ingedrukt: while (!touch.ispressed()) ; LCD.drawString("Finished", 3, 4); Leeg Java statement: spatie+; = doe niets Applicatiebouw, Industrieel Ontwerpen 20-6-2016 23
SENSOREN: LICHT Class: LightSensor Methode: public int readvalue() Levert percentage tussen gekalibreerde waarden (er zijn meer methoden) LightSensor light = new LightSensor(SensorPort.S1); while (Button.ENTER.isUp()) { // zolang niet op Enter is gedrukt LCD.drawInt( light.readvalue(), 4, 0, 0); Delay.msDelay(1_000); // 1 sec wachten } Applicatiebouw, Industrieel Ontwerpen 20-6-2016 24
EVENTS IN LEJOS OPDRACHT 5 Listener: luistert naar events EventHandler voor een button-press Button.ESCAPE.addButtonListener(new ButtonListener() { public void buttonpressed(button b) { LCD.drawString("ESCAPE pressed", 0, 0); // stoppen door snelheid op 0 te zetten } // gereden afstand bepalen // gereden afstand weergeven // even wachten // stop het programma: System.exit(1); public void buttonreleased(button b) { } }); Thread: is taak die parallel loopt aan je programma Een Listener is een speciale taak: luistert naar events Applicatiebouw, Industrieel Ontwerpen 20-6-2016 25
RIJDENDE ROBOTS Voor robots met 2 aangedreven wielen Alleen voor aansturing motoren Rekent met afstanden De DifferentialPilot class Eenheid parameters bepaald eenheid waarmee gerekend wordt! Parameters: Wieldiameter Trackbreedte Motoren DifferentialPilot p = new DifferentialPilot(5.6f, 12.3f, Motor.A, Motor.C ); trackbreedte Trackbreedte (cm) Wieldiameter (cm) Applicatiebouw, Industrieel Ontwerpen 20-6-2016 26
RIJDENDE ROBOTS: RIJDEN DIFFERENTIALPILOT CLASS Basis commando s net als bij motoren Afstand afleggen: travel( ) Snelheid instellen setrotatespeed( ) settravelspeed( ) DifferentialPilot p = new DifferentialPilot(5.6f, 12.3f, Motor.A, Motor.C ); p.setrotatespeed(360); p.settravelspeed(20); p.forward(); p.stop(); p.travel(200); // snelheid in graden per seconde // snelheid in cm per seconde // rijd een afstand van 2 m Applicatiebouw, Industrieel Ontwerpen 20-6-2016 27
RIJDENDE ROBOTS: STUREN DIFFERENTIALPILOT CLASS Om eigen as draaien rotate( ) Sturen, cirkelvormig pad afleggen steer(int turnrate) steer(int turnrate, int angle) p.steer(-100, 90); // stuur naar rechts p.steer(100, 90); // stuur naar links Motor L -200-100 0 100 200 turnrate turnrate = -200 turnrate = 0 turnrate = 200 Motor R Applicatiebouw, Industrieel Ontwerpen 20-6-2016 28
RIJDENDE ROBOTS: RITGEGEVENS METHODEN DIFFERENTIALPILOT CLASS Nodig eind opdracht 5 Starten met meten, teller op nul: reset() Wat is de snelheid? float gettravelspeed() Gereden afstand? float getmovement().getdistancetraveled() Hoek waaronder de robot nu staat? // verlaat methode als snelheid ingesteld op 0: if ( p.gettravelspeed() == 0 ) return; int getmovement().getangleturned() Applicatiebouw, Industrieel Ontwerpen 20-6-2016 29
GEDRAG GEDRAG VAN EEN ROBOT BESCHRIJVEN EN REGELEN Definitie van gedrag: Behavior Gedrag regelaar (bemiddelaar): Arbitrator Applicatiebouw, Industrieel Ontwerpen 20-6-2016 30
BEHAVIOR CLASS class Behavior is een interface = abstracte class die voorschrijft hoe een afgeleide class er uit moet zien Behavior gedrag1 = new DriveForward(); class implements Behavior Object van type (class) DriveForward Interface: Hoofdstuk 11 van het boek Applicatiebouw, Industrieel Ontwerpen 20-6-2016 31
METHODEN BEHAVIOR CLASS takecontrol() bepaald wanneer dit gedrag geactiveerd wordt (levert true als conditie vervuld wordt) action() bepaald wat er moet gebeuren als dit gedrag geactiveerd wordt suppress() bepaald wat er moet gebeuren als dit gedrag onderdrukt moet worden Dit zijn verplichte methoden voor een Behavior class Applicatiebouw, Industrieel Ontwerpen 20-6-2016 32
BEHAVIOR CLASS public class HitWall implements Behavior { TouchSensor touch; DifferentialPilot pilot; public HitWall(DifferentialPilot p) { // constructor touch = new TouchSensor(SensorPort.S2); pilot = p; } Object aangemaakt in hoofdprogramma, wordt doorgegeven aan dit object public boolean takecontrol() { return touch.ispressed(); } // wanneer wordt dit gedrag actief? public void suppress() { // wat doen als dit gedrag wordt onderdrukt? pilot.stop(); } } public void action() { // dit doen als we geactiveerd worden pilot.travel(-10); // 10cm terug pilot.steer(100, -90); // bochtje achteruit } Applicatiebouw, Industrieel Ontwerpen 20-6-2016 33
BEHAVIOR CLASS takecontrol(): gedrag wordt actief als voorwaarde waar (true) wordt Voorwaarde = Sensor: vergelijk sensorwaarde Touch: is ingedrukt? Ultrasoon: is dichtbij? Of: is ver weg? public boolean takecontrol() { // we worden actief als er een obstakel dichtbij is... return ultrasoon.getdistance() < 45; } Methode levert true op als afstand < 45 Applicatiebouw, Industrieel Ontwerpen 20-6-2016 34
ARBITRATOR CLASS = BEMIDDELAAR Slaat alle Behavior-objecten op Laat ze aan de beurt komen (action) als de voorwaarde (takecontrol) vervuld wordt Prioriteiten zijn niet mogelijk Zelf goed ontwerpen Niet dezelfde/concurrerende voorwaarden Voorbeelden in Samples project lejos: LineFollower: lijn volger BumperCar: eenvoudige versie Explorer Applicatiebouw, Industrieel Ontwerpen 20-6-2016 35
PROJECT: EXTRA ELEKTRONICA ARDUINO/NXSHIELD/RFID MODULE Dit is allemaal te leen bij docent Arduino: extra elektronica gebruiken, bouwen NXT-Shield: Arduino combineren met NXT Voorbeeld: RFID module icm. Arduino Nano, gebruiken in Java App Met NX-shield/Ev-shield kan je arduino gebruiken ipv NXT voor aansturen Lego-motoren, en gebruiken Lego sensoren Tutorials! Applicatiebouw, Industrieel Ontwerpen 20-6-2016 36
VOLGENDE WEEK NODIG VOOR OPDRACHT 6 VUL INDIEN NODIG BIJ ELEKTRONICA JE KIT AAN! Het SuperPro board, Bijbehorende componenten: minimaal 4 leds, 4 schakelaars, een potmeter, 4 weerstanden van 10K en 4 van 220 Ohm en voldoende draadjes Het externe LCD display Een volle accu, minimaal 2 uur aan oplader geweest Volgend college is dinsdagochtend! Applicatiebouw, Industrieel Ontwerpen 20-6-2016 37
AAN DE SLAG OPDRACHT 5 Explorer programmeren Bouwgids: nxtprograms.com/nxt2/explorer Bouwen: iets dikkere accu => kleine aanpassingen maken Uitvoeren in groepjes van 2, of individueel Doe je geen SmartProducts: opdracht 5b Explorer nxtprograms.com Volgend college is as. dinsdagochtend! Vanmiddag gesprekken DPU2 module4.io.utwente.nl/applicatiebouw Applicatiebouw, Industrieel Ontwerpen 20-6-2016 38