GEINTEGREERDE PROEF Dossier



Vergelijkbare documenten
S88XPressNetLI v1.0. Installatie- en gebruikershandleiding en naslagwerk KDesign Electronics, PCB ontwerp door RoSoft

LocoServo Handleiding

Velbus DIN-rail RS232 & USB interface

Locobuffer Handleiding

RGB wand bedieningspaneel DMX sturing en PWM output

LocoServo Handleiding

IDAgeChecker BDX118T11xx Manual V02.00

DIGITALE MODE MET POWER SDR

Gebruiksaanwijzing AVR910 USB Programmer

Tinyserir-RC5. Datasheet. Tinyserir-RC5 Page: 1 of 8

Vermogen Elektronica : Stappenmotor

Trea Winter van Faassen Joost van den Brink

AVR-DOPER MINI ASSEMBLAGE HANDLEIDING + LAYOUT. Geschreven door: Tom Vocke

Informatiebundel ADuC832 Motor interface bord MGM/[dp]

Besturingspaneel v Raam E-systeem functie omschrijving v109

Seriële bluetooth verbinding ATmega128

In dit artikel zal ik u uitleggen hoe u rechtstreeks vanuit Troublefree Retail kan afdrukken

GEÏNTEGREERDE PROEF. VTI Sint-Laurentius. Pakketweegschaal. Industriële informatie & communicatietechnologie SCHOOLJAAR

Opgave Tussentijdse Oefeningen Jaarproject I Reeks 4: Lcd Interface & Files

Installatie responsbox bij Windows XP en Windows Vista

GPS repeater. Inleiding

INHOUDSTAFEL... 2 VOORWOORD... 3 INLEIDING... 4 GEBRUIK VAN MOTOREN... 9 DE HERHAALFUNCTIE ZELF EEN BLOK MAKEN... 11

Installatiehandleiding

Voeler ingang van de ilog recorder. Stop de temperatuurvoeler

DATA SHEET C2-20. Besturing voor elektrische actuators. DATA SHEET C2-20 A&E Trading b.v. 1

Installatie-instructies

Deze handleiding is alleen bedoeld voor flightsimulatie doeleinden en mag NOOIT worden gebruikt in een echt vliegtuig. De auteurs zijn niet

Gebruikershandleiding MJK Link 2.15 Index

12.1 Input/output-kaart IOK. Informatieblad 12 input/output-kaart versie 1.0. Beperking aansprakelijkheid

MiniPlex-41 NMEA-0184 multiplexer Handleiding

voordat we verder gaan raad ik aan om in ieder geval te zorgen dat je het volgende hebt:

GEINTEGREERDE PROEF DE COMPUTER ALS TV AFSTANDSBEDIENING

Accelerometer project 2010 Microcontroller printje op basis van de NXP-LPC2368

Minimum vereisten. Connectie met RPS. PC: Windows Vista (RPS 5.6); Windows XP SP2 ; Windows 2000 SP4 ;.NET ; MSXML (laatste 2 zijn meegeleverd op CD)

Installatiehandleiding

Problemen met de stand-by tijd van uw iphone met ios 7.

Arduino CURSUS. door Willy - 09-juni-2017

Netwerk Interfacing Data Logging.

Voeler ingang van de ilog recorder. Stop de temperatuurvoeler

Boe-Bots - Arduino robots

ThoRiTemp. Installatie Handleiding. Versie 1.00 NL

Stappenmotor Interface. Controller

Installatie & Snelstart Gids iais Wireless(draadloos) AIS Ontvanger en NMEA Server

In deze mannual zal ik het voorbeeld van de Led cube gebruiken maar de principes zijn op alles toepasbaar.

MULTIMEDIABOX.nl Custom made solutions hardware & software. Advanced Menu

Opgave 1 Opbouwen van een stappenmotor-systeem

g. Je kan nu door op de play knop te drukken je programma versturen naar de EV3 brick waarna het zal uitgevoerd worden.

1-poorts RS232 seriële adapter kaart met UART

Goedkope RS232. MSX Computer Magazine nummer 53- april Scanned, ocr ed and converted to PDF by HansO, 2001

MIDI STURING voor SERVO s

Montagevoorschriften

Nieuw toegevoegd: Uitleg driver (her) installeren nadat Windows 8 en Windows 8.1 automatisch de driver heeft geüpdatet.

12.1 Stapsgewijs uw Bluetooth monitoring systeem installeren.

GIP. De computer gestuurde trein

Wireless PC Interface installatie handleiding

MAKERKLAS WORKSHOP ARDUINO. Maandag 7 december 2015

PWM50/3. Dubbele motor sturing. DIGITAAL HANDLEIDING. Motion Control Systems

Handleiding: instelling en werking E-Drive LCD display

Aansluiten en configureren stofsensor

HANDLEIDING Windows XP Deel 1

Koppelen Centix Datacollecter aan RS-232 device d.m.v. de W&T 58631

Opgave 1 Opbouwen van een servomotor-systeem

Uitleg van de Systeeminstellingen in Ubuntu.

Het koppelen van de Wago aan de AC500-eco via Modbus RTU. A quick start guide. Jaap Ruiten

DinaSys Turntable Controller

A R D U I N O. addendum bij: Leren programmeren, meten en sturen met de Arduino. 3 e druk INHOUD

Logo quiz Project Inleiding op de Logo!

Installeren van een software update in je Garmin GPS

Snel aan de slag met de Mini Squirrel datalogger

Formulieren maken met Dreamweaver CS 4/CS 5

VTI Sint-Laurentius De school voor Wetenschap, Techniek en Technologie Pr. Thuysbaertlaan Lokeren info@vti-lokeren.

Installatiehandleiding Kassa-betaalautomaat koppeling

Beginnersles 2 Computerles Windows 7

Installatie van Linux Mint 13

Handleiding voor installatie en gebruik van

Handleiding Icespy MR software

Alvorens men het remsysteem kan programmeren, heeft men een aantal gegevens nodig.

Installeren van het stuurprogramma USB-Audiostuurprogramma Installatiehandleiding (Windows)

2-poort USB naar RS232 RS422 RS485 Seriële Adapter met COM-behoud. StarTech ID: ICUSB

Installatie handleiding Centrale Deurvergrendeling De Basis unit. Schema type 1

Summa Cutter Tools. 1 Cutter tools. Met dit programma kunnen twee dingen geïnstalleerd worden:

Spanningdriver LEDVD5CH20A-V7 Real Time Clock met LCD scherm

U krijgt nu opnieuw beide bestanden op uw scherm : README Setup_ASR_Antenna_Tool_1.0.1 (maar met het logo SR Mecatronic vooraf)

Spanningsdriver 11 WiFi interface met LCD display

VMB1USB. USB-interface voor het VELBUS-systeem. Velbus manual VMB1USB edition 1 rev.1.0

Wind, Sun & Rain Sensor Instructions

Gebruiksaanwijzing stroomprint JGA1009D 1.0L

De Arduino-microcontroller in de motorvoertuigentechniek (6)

Koppelen Centix Datacollecter aan RS-485 device d.m.v. de W&T 58631

Het aansluiten van uw Victron op een computer; met VE Bus Quick Configure

LED Digitale display. Algemeen installatiediagram. Sensoren bereik. Display Gevaar Veilig Veilig Alarm.

VMB1BLS 1-kanaals rolluiksturing voor universele montage. Handleiding

Handleiding: instelling en werking E-Drive LCD display

TRUST AMI MOUSE 250S OPTICAL

DCC Servo decoder met Arduino voor dummy s

1 van :43

2010 Handleiding MS12s

BLReactions. Copyright 2016 by B-Logicx. All Rights Reserved.

HANDLEIDING BEDIENINGSPANEEL

Gebruiksaanwijzing stroomprint JGA i. Inhoudsopgave

Transcriptie:

VRIJ TECHNISCH INSTITUUT VTI VTI2 VZW Katholiek Secundair Onderwijs Waregem Anzegem Avelgem TOEKOMSTSTRAAT 75 8790 WAREGEM GEINTEGREERDE PROEF Dossier ONDERWERP: PC-sturing voor servomotoren STUDIERICHTING: Industriële ICT KLAS: 6ICT SCHOOLJAAR: 2005-2006 LEERLING(EN): De Reycke Rob TECHNISCH MENTOR: Mevr. Van Heghe B. TAALMENTOR: Mevr. De Staercke H. 2DA705_BAC GIP-standaard voorblad

Woord vooraf Dit rapport werd geschreven in het kader van mijn studies als laatstejaarsleerling industriële ICT. In het laatste jaar is het zowat de traditie een eindwerk te maken waarin de opgedane kennis uit het middelbaar onderwijs gebruikt wordt. Dit eindwerk bood mij de kans om te tonen waartoe ik na dit schooljaar in staat ben. Ik hoop ook dat dit een goed hulpmiddel zal zijn voor mensen die willen leren hoe je servomotoren kan aansturen, want je vindt niet direct een duidelijk overzicht over het onderwerp. Ik zou bij deze ook enkele mensen willen bedanken voor hun inzet. Allereerst mijn mentor voor haar deskundig advies: Mevr. Van Heghe Brenda. Ook Mevr. Vervaeke Sofie heeft mij goede tips gegeven. Zij heeft mij bovendien geholpen bij het zoeken naar een onderwerp dat mij aansprak. Verder wil ik nog Mevr. Dumazy Lolita bedanken om mij de kneepjes van het solderen te leren. Daarnaast wil ik ook iedereen bedanken die mij steunde toen ik het moeilijk had. (Dit rapport werd verwerkt met Microsoft Word 2003).

Inhoudsopgave 1. Inleiding...4 2. Servomotoren...5 2.1. Nut...5 2.2. Samenstelling...5 2.3. Specificaties...6 2.4. Positionering...7 2.5. Continue rotatie...7 2.6. Aansturing...8 3. De servocontroller (ede FT639)...9 3.1. Nut...9 3.2. IC...9 3.3. Seriële aansturing...10 3.4. Modes en commando s...10 4. Hardware...14 4.1. Printplaat voor de servocontroller...14 4.2. Seriële poort...14 5. Software...15 5.1. Setup...15 5.2. Hoofdprogramma...16 5.3. Opties...17 5.4. Broncode...19 6. De draadloze seriële dataoverdracht (m.b.v. het ER400TRS IC)...33 7. Besluiten...35 8. Bronnen...36 9. Bijlagen...36

1. Inleiding In dit GIP-boek wordt het aansturen van servomotoren verduidelijkt voor zowel gewone als continue servomotoren. Dit komt doordat ik beide soorten heb gebruikt tijdens het werken aan het project (wat initieel niet de bedoeling was). De aansturing gebeurt met een servocontroller. Het is dus aan te raden eerst de werking en aansturing van de controller (hoofdstuk 3) en de beide soorten motoren (positionering en continu) onder de knie te krijgen. Ook de hardware moet eerst gerealiseerd worden (hoofdstuk 4). Dan volgt de software (op PC) die de motoren kan sturen door middel van een draadloze interface (hoofdstuk 5 en 6). De controller krijgt zijn commando s van de computer en niet van een Basic Stamp-controller zoals dat meestal het geval is. Dit betekent ook dat in een andere programmeertaal moet worden geprogrammeerd dan de gebruikte taal bij de Basic Stamp. Ik heb gekozen voor C++.

2. Servomotoren 2.1. Nut Een servomotor is een elektrische motor die relatief eenvoudig aanstuurbaar is en uitermate geschikt is voor positionering. Toepassingen: Robotarmen, allerlei industriële apparaten, computerapparatuur, speelgoed, Kortom: daar waar precies gepositioneerd moet worden. Soms dienen ze ook in speelgoed om de wielen aan te drijven. Daarvoor moeten ze aangepast worden om continu (360 ) te kunnen draaien. Dit komt in veel mindere mate voor. In deze laatste toepassing verliest men immers het hoofddoel van deze motoren uit het oog en benut men de voordelen van servomotoren niet ten volle. Een meer logische toepassing van continue servomotoren is bijvoorbeeld wanneer je niet tevreden bent met een bereik van slechts 180. Het wordt dan wel moeilijker om nog nauwkeurig te positioneren. Voordelen: - nauwkeurig positioneren, - klein in omvang (er bestaan ook grote modellen); - relatief eenvoudig aanstuurbaar op vele manieren; - zachtere overgang naar een andere positie dan bij stappenmotoren en toch voldoende snel; - terugkoppeling, - vele soorten, - In vergelijking met een stappenmotor biedt een servomotor dus wel een aantal voordelen. De aansturing is iets moeilijker geworden maar is nog altijd behoorlijk eenvoudig realiseerbaar. 2.2. Samenstelling Een standaard servomotor heeft 3 aansluitingen: - een commandolijn waar de stuursignalen op komen (meestal wit); - Vcc (rood), - GND (zwart). De terugkoppeling zit hier niet bij. Die is ofwel in de motor geïntegreerd, ofwel extern gemonteerd. 5

Indien de motor voorzien is van een terugkoppeling krijg je informatie over zijn snelheid en zijn positie. Volgend schema kan dit wat verduidelijken: Figuur 2.2.1.: Terugkoppeling De position feedback (terugkoppeling van de positie) gebeurt met een encoder of resolver. Deze bestaat uit een soort glazen schijfje met zeer fijne lijnen op. Een optische encoder telt deze lijnen telkens de motor verdraait. Zo weet men hoeveel posities de motor verdraaid is. Door de tijd tussen het opmerken van een lijn te meten kan de snelheid bepaald worden. Dit is de algemene samenstelling van een servo. Er kunnen natuurlijk zaken verschillen naargelang het type. Voor meer informatie hierover, zie hoofdstuk 2.3: Specificaties. 2.3. Specificaties Hiervoor hadden we het over de algemene samenstelling van een servomotor. Meer details die afhankelijk zijn van het type motor kunnen we uit de respectievelijke datasheet halen. Als voorbeeld bekijken we even de specificaties van een standaard servomotor die ik gebruik. Merk op dat dit mini-servomotoren zijn en dat de specificaties van grote motoren hier beduidend van afwijken. Voorbeeld 1: positioneringmotor: (Velleman mini servo [MOTSER1]) Weight (gewicht): 16 g Power supply (voeding): 6V DC max Torque (koppel): 1,50 kg/cm Speed (snelheid): 0,16s/60 Dimensions (afmetingen): 28 x 13 x 28.5mm 6

Voorbeeld 2: continu rotatie motor: (Parallax Continuous Rotation Servo #900-00008) Weight (gewicht): 45,0 g Power supply (voeding): 6V DC max Torque (koppel): 3,40 kg/cm Speed (snelheid): 60 rotaties/minuut met 5V en zonder koppel Dimensions in mm (afmetingen): 40.5 x 20.0 x 38.0 (LxBxH) 2.4. Positionering Hier wordt besproken hoe de positionering van een servomotor gebeurt. Het positioneren van een servomotor gaat als volgt in zijn werk: De huidige positie van de motor is controleerbaar met een soort interne potentiometer. Deze positie wordt vergeleken met de gewenste waarde. Als dus door een grote belasting de motor wat verdraait, wordt dit gedetecteerd door de potentiometer. Vervolgens wordt ervoor gezorgd dat de motor terug naar de gewenste positie wordt gebracht. Men kan ook positioneren m.b.v. stappenmotoren, maar deze zijn meestal minder nauwkeurig en hebben geen terugkoppeling. Met de terugkoppeling kan men controleren of de motor daadwerkelijk op de gewenste positie terecht is gekomen of niet, wat heel belangrijk kan zijn bij volledig geautomatiseerde processen. In deze GIP zullen we deze terugkoppeling echter niet gebruiken. De aansturing van positioneringmotoren kan je vinden in hoofdstuk 2.6: Aansturing. 2.5. Continue rotatie In een voorgaand hoofdstuk werd al vermeld dat je servomotoren kan aanpassen voor continue rotatie. Men verwijdert dan de sensor die de positiefeedback geeft en men vervangt deze door een gelijkaardig circuit. De motor denkt dan dat hij op 90 staat. Dit is net tussen 0 en 180. Door hem naar een waarde onder 90 te sturen zal hij dus naar de ene kant draaien en bij een hogere waarde naar de andere kant. De motor zal echter niet op die positie stoppen, omdat de sensor is verwijderd. Bijgevolg zal hij gewoon verder blijven draaien. Belangrijk: We kunnen de motor m.b.v. positiecommando s een bepaalde richting en snelheid meegeven, maar dit kan evengoed door zijn startpositie te veranderen. Positioneringcommando s zijn dus niet nodig en bijgevolg zal de motor draaien vanaf het moment dat hij wordt bekrachtigd. Meer informatie over hoe je zelf een standaard servomotor kan aanpassen voor continue rotatie vind je op de volgende website: http://www.seattlerobotics.org/guide/servohack.html 7

2.6. Aansturing De aansturing werkt volgens het principe van PWM (Pulse Width Modulation) of PBM (Puls Breedte Modulatie). Een servomotor verwacht om de 20ms een puls. Dit betekent niet 20ms tussen iedere puls, maar 20ms tussen het begin of de stijgende flank van iedere puls! De lengte van de puls bepaalt de positie die de servomotor zal innemen. De lengte van zo n puls ligt standaard ongeveer tussen 0,5 en 2,5ms. De grenswaarden van de pulslengte voor de startpositie van de FT639 servocontroller liggen op 0,147ms en 2,037ms. Pas op: dit geldt enkel voor de startposities. De geselecteerde positie zal de pulslengte ook beïnvloeden, maar die waarden worden niet vermeld. Dit is niet echt belangrijk. Hier volgt een signaalverloop voor de minimum- en maximumwaarde en voor het midden (90 ) indien we met 0,5ms en 2,5ms als grenzen werken. Pas op bij het overschrijden van de grenswaarden. Dan kan je namelijk je motor permanent beschadigen. Dit wordt ook wel overdrive genoemd. De aansturing blijft dus eigenlijk gelijk qua signaal voor positionering- en continue motoren. De ondernomen actie verschilt wel, maar dat komt door de hardwarematige samenstelling van de motor. Een standaard servo kan je op deze manier tot 360 laten draaien. Dit komt omdat je zijn startpositie moet kunnen vastleggen en t.o.v. die positie 90 of 180 moet kunnen draaien. De FT639 heeft een aantal vaste pulslengtes die hij naar de servo s kan sturen als startpositie. Daarnaast zal hij zijn pulslengtes aanpassen naargelang de gekozen relatieve positie. De interne elektronica in de servomotor zorgt ervoor dat hij deze signalen kan gebruiken om op de juiste positie terecht te komen. Wij moeten er enkel voor zorgen dat hij de geschikte signalen krijgt. Werk je met een servocontroller? Geef hem dan het commando om de juiste pulsen uit te sturen, maar besef steeds wat de controller voor je doet en wat je zelf moet doen! 8

3. De servocontroller (ede FT639) 3.1. Nut Een servomotor is aanstuurbaar met de PC. Je kunt hem natuurlijk niet zomaar aan je PC aansluiten. Als je dan ook nog eens meerdere servomotoren tegelijk wil gebruiken, is dit niet zo eenvoudig meer om aan je computer te koppelen. Daarom gebruik ik een servocontroller. Zo wordt het relatief eenvoudig om tot 5 servomotoren tegelijk aan te sturen. Dit maakt het project bruikbaar voor vele doeleinden. Met de FT639 kan de sturing veel simpeler en je hebt maar één poort nodig van de PC. In deze GIP koos ik voor de seriële poort, omdat dit eenvoudig is en omdat de servocontroller serieel zijn commando s dient te ontvangen. Door opkomst van nieuwe technologieën zou sturing via USB een mogelijke uitbreiding voor het project zijn. 3.2. IC Het IC van de FT639-servocontroller is een 8-pins DIL uitvoering. Het bevat de volgende klemmen: - V++ = klem voor de voedingsspanning; deze mag 3 tot 5,5 Volt bedragen. Ik gebruik 5 Volt aangezien dit een standaard is en makkelijk te verkrijgen is met een 7805 spanningsregelaar; - Gnd = de ground; - Com = hier komen de stuursignalen binnen; - De klemmen met nummers 1 tot 5 zijn uitgangen naar de servomotoren. Op de afbeelding aan de rechterkant zie je de 8 klemmen van de FT639 servocontroller. 9

3.3. Seriële aansturing De FT639 dient serieel aangestuurd te worden. Aan deze informatie hebben we echter niet voldoende. We moeten nog met het volgende rekening te houden: - baudrate: 2400 baud, - 8 databits, - 1 stopbit, - geen pariteit, - geen flowcontrol. Nu weten we hoe we de seriële aansturing moeten verzorgen, maar we weten nog niet wat we moeten sturen. De verschillende opties en commando s van de controller worden besproken in hoofdstuk 3.4: Modes en commando s. Via C++ kunnen we de seriële poort aansturen. Nu moeten we nog de pariteit, baudrate, aantal start- en stopbits e.d. instellen in de COMPORT-component. Dan moeten we de informatie aanbieden op de juiste lijn van de poort (TxD) en op een correcte manier zodat de servocontroller verstaat welke commando s we geven. De juiste bekabeling is dus ook belangrijk. Je moet er altijd voor zorgen dat je TxD lijn vanuit de PC aan de COM-ingang van de FT639 geraakt. De massa moet ook verbonden zijn. 3.4. Modes en commando s De FT639 kent 2 modes. De mode waarin de controller zich bevindt, bepaalt hoe de servocontroller reageert; wat hij op dat ogenblik kan doen en wat niet. De 2 modes heten Setup en Active mode. Zoals de namen doen vermoeden zal de controller in setup mode geen acties ondernemen, maar wel instellingen toelaten en zal hij in active mode zijn motoren aansturen. Logischerwijze zal de controller bij het aanleggen van de voedingsspanning altijd in setup mode staan. Nu volgt een volledige bespreking van wat je allemaal kan en niet kan in de 2 modes. Om het niet direct te ingewikkeld te maken, nemen we de makkelijkste mode eerst. 10

3.4.1 Active mode (Om deze mode te gebruiken moet binair 117 aangeboden worden aan de controller.) Opties: - terug naar setup mode, - de motoren bekrachtigen, - positioneringcommando s geven, De eerste 2 opties zijn vanzelfsprekend, maar de 3 de zullen we best even bestuderen. - Positioneren: De controller kan de motoren 256 verschillende posities laten aannemen, dus kunnen we de gewenste positie meedelen aan de controller met één byte. We moeten één byte (de gewenste positie) zenden naar de motor, maar we moeten ook kunnen zeggen naar welke motor. Daarom wordt de byte verzonden in 2 bytes. - De meest beduidende bit (MSB) duidt aan of je de upper of lower nibble van de positiebyte krijgt. (nibble = een binair woord van 4 bits.) - De 3 bits die de MSB opvolgen, duiden aan welke motor we gebruiken. Motor 1 = 000, motor 2 = 001, - Met de laatste 4 bits geven we een helft van de positiebyte door. Hier kan je nog eens duidelijk zien hoe de 2 verzonden bytes eruitzien: - Lower Byte = 0sssxxxx, - Upper Byte = 1sssyyyy. sss = het servonummer xxxx = het onderste deel van de door te geven positiebyte yyyy = het bovenste deel van de door te geven positiebyte De lower byte wordt eerst verzonden, daarna de upper byte. Eenmaal de controller dit heeft ontvangen, start hij een pulstrein naar de motor die gepositioneerd moet worden. De lengte van de puls is afhankelijk van de gekozen positie en van het gekozen positioneringbereik (90 of 180 ). De controller zorgt hier voor, dus wij hoeven ons hier geen zorgen over te maken, maar het is voordelig als je hier toch iets van af weet. Met deze pulstrein weet de motor genoeg. De rest van het positioneringproces wordt afgehandeld door zijn interne elektronica. 11

3.4.2 Setup mode (initiële mode) (Om deze mode te gebruiken moet binair 122 aangeboden worden aan de controller.) Opties: Instellen van volgende zaken: - de startpositie, - de pulslengte (bereik van 90 of 180 ), - de initiële positie. Uiteraard kan ook worden overgegaan naar active mode. - Startpositie: De headerlengte, zoals men dit noemt, bepaalt de startpositie van de motor. De standaardwaarde hiervan is 12. De waarde van de startpositie kan je instellen door de controller een waarde vanaf 96 (maar dan binair) te geven. Dit commando ziet er als volgt uit: 0110xxxx Een x stelt een bit voor. De waarde kan van 0 tot 15 gaan. Er zijn namelijk 16 verschillende startposities. 96 = 01100000 97 = 01100001 Belangrijk: De motor weet welke startpositie hij moet innemen door een vastgelegde pulslengte die voor iedere startpositie verschilt. Al deze waarden vind je terug in de datasheet van de controller. - Pulslengte: De pulslengte houdt sterk verband met de startpositie. Men heeft 2 categorieën, namelijk de korte en de lange pulslengte. Deze overlappen elkaar qua waarden Op het eerste zicht is dit nogal vreemd, maar als je dit goed bestudeert, zal je de logica wel inzien. De pulslengte is het enige dat de motor interpreteert. Daarom zijn de startposities niets meer dan enkele vastgelegde pulslengtes. Afhankelijk van de keuze voor korte of lange pulslengte zal de controller ervoor zorgen dat het verschil tussen de pulslengtes van 2 opeenvolgende positioneringwaarden aangepast wordt voor een bereik van 90 of 180. Bij de FT639 liggen de waarde, van de pulslengte voor de startposities tussen 0,147 en 1,227ms. Bij lange pulslengte is dit tussen 0,237 en 2,037ms. Dit houdt ook in dat je bij korte pulslengte (en een bereik van 90 ) de startpositie ook slechts 90 kan verdraaien. Het totaal bereik bedraagt dus 180. Bij lange pulslengte (en een bereik van 180 ) kan je de startpositie 180 verdraaien. Hier is het totaal bereik dus 360. 12

Kort samengevat: - Korte pulslengte zorgt voor een positioneringbereik van 90 en een totaal bereik van 180. De keuze van 1 van de 16 vastgelegde waarden bepaalt de startpositie van de motor. Je selecteert korte pulslengte door binair 85 aan te bieden aan de controller. - Lange pulslengte zorgt voor een positioneringbereik van 180 en een totaal bereik van 360. De keuze van 1 van de 16 vastgelegde waarden bepaalt de startpositie van de motor. Je selecteert korte pulslengte door binair 85 aan te bieden aan de controller. Voor het standaardbereik van de pulslengte kijk je best even naar hoofdstuk 2.6: Aansturing. - Initiële positie: De initiële positie ligt relatief t.o.v. de startpositie. De hoek hiertussen wordt bepaald door het gegeven positioneringcommando in setup mode. De initiële positie is dus de ligging van het gegeven positioneringcommando in setup-mode. De motor zal hiernaar verdraaien wanneer hij wordt bekrachtigd. Figuur 3.4.1: Startpositie (rood) t.o.v. initiële positie van 90 (groen). (Bij een motor die in tegenwijzerzin draait) Hoe maakt de controller het verschil uit tussen gewone en positioneringcommando s? Als je het hoofdstuk Active mode hebt gelezen, weet je nog dat de 3 bits na de MSB gebruikt werden om het motornummer mee te geven bij het positioneren. Bij andere commando s zijn deze echter allemaal 1. Dit is meer dan 4 (het nummer van de hoogste motor), dus niet meer voor motoraansturing. De controller weet dan dat een commando, waarvan die 3 bits hoger zijn dan 4 (100 in binaire vorm), geen positioneringcommando s zijn. Bijgevolg bevat dit gebied de commando s voor de andere gereserveerde functies van de controller. Deze functies kan je allemaal terugvinden in de datasheet, maar het is belangrijk hen goed te bestuderen. Soms is hun functie verwarrend of anders op te vatten. 13

4. Hardware 4.1. Printplaat voor de servocontroller Om de motoren, de servocontroller en computer aan elkaar te koppelen hebben we uiteraard een interface nodig. Dit vertolkt zich in de vorm van een printplaatje. Hier zie je het printplaatje met de componenten. Je ziet ook de koperbanen. Het grootste deel van het plaatje is zwart. Dat is het koperdeel; het zal dus beschermd moeten worden tegen oxidatie. Een voordeel is wel dat je een groot massa- (of ground-) oppervlak hebt, maar het is fijn soldeerwerk... Dit printje is een ontwerp van het magazine Elektuur. Met de opstelling van dit printje krijgen we spijtig genoeg geen terugkoppeling van de servomotoren. We kunnen ervan uitgaan dat de motor wel op zijn positie terechtkomt omdat dit niet voor belangrijke toepassingen kan worden gebruikt. In grotere toepassingen waar je zeker moet zijn van de werkelijke positie van de motor is een terugkoppeling een must. Servomotoren vragen over het algemeen tamelijk veel stroom. Dit hangt natuurlijk sterk af van het type. Voor dit eindwerk gebruik ik miniservomotoren, dus de specificaties t.o.v. een grote servomotor wijken beduidend af. Zie hoofdstuk 2.3: Specificaties voor meer informatie. Netspanning is gewenst, maar als deze niet beschikbaar is, kun je ook een zware (grote Ah), heroplaadbare batterij gebruiken. Een batterij vanaf 5V is eigenlijk voldoende, maar indien je informatie wil via de seriële poort over het al dan niet aangesloten zijn van spanning heb je toch zeker 9V nodig (in feite gebruik je dan best 12V). De spanning mag wat hoger zijn dan 5V omdat we een 7805-spanningsregelaar gebruiken. Hou er wel rekening mee dat je de maximale spanning over de 7805 niet overschrijdt. 4.2. Seriële poort Nu het printplaatje af is moet de PC nog verbonden worden met het printje. Dit wordt hier even kort besproken. Als je dit draadloos wilt maken, kijk je best even naar hoofdstuk 6: De draadloze seriële dataoverdracht. Ik heb een vrouwelijke seriële poort connector geplaatst bij mijn printplaatje en alle te verbinden pinnen zitten op dezelfde plaats bij zowel de PC als de connector bij de print. Op die manier kan je gewone rechtdoor kabels gebruiken. 14

De volgende pinnen moeten worden verbonden: - pin 5 (GND): De ground van de seriële poort hang je aan de ground op de printplaat. - pin 3 (TxD): Over deze lijn komen de signalen binnen. Ze moet verbonden worden met de data-ingang van de printplaat. - pin 8 (CTS): Deze pin verbind ik aan de V++ klem van de print. Indien daar geen spanning is, kan de software dat controleren. Bij pc s die moeten communiceren is dit wat moeilijker omdat ze op elkaar afgestemd moeten worden. Hier hoeft dat niet. De communicatie verloopt in één richting. Dat maakt het eenvoudiger. Dit betekent ook dat je zonder veel moeite kan overschakelen naar USB. De Universal Serial Bus werkt namelijk ook serieel en is momenteel zeer populair! 5. Software Het doel van de software is een eenvoudige en intuïtieve sturing te voorzien voor de gebruiker die een project met servomotoren wil aansturen. Ook wordt de mogelijkheid voorzien de hardware te testen. Dit is handig als er ineens problemen beginnen. Je kunt enkele simpele tests uitvoeren voor je aan het meten slaat. Het is belangrijk de software gemakkelijk verstaanbaar te maken voor iedereen, want niet iedereen kan even goed met de computer overweg. Ik kon zoals vele anderen een login-systeem gemaakt hebben, maar voor dit project is dat niet handig en zelfs tijdrovend. Het programma lijkt wat minder groot, maar in feite is de broncode goed geoptimaliseerd en zal je weinig tot geen problemen ondervinden! Ik heb gezorgd dat het programma niet enkel werkt als je het juist gebruikt, maar dat het onder alle omstandigheden werkt. 5.1. Setup De installatie van het programma moet niet te veel onnodige zaken bevatten en de standaardinstellingen moeten ook de beste zijn, want vele mensen klikken bij een setup direct op next zonder ernaar te kijken. De setup werd gemaakt met Installshield Express for Borland C++ Builder 3. Er is zowel een dynamische als een statische setup beschikbaar. Wat de beste keuze is, hangt af van hoeveel Borland C++ 3 applicaties je gebruikt op je PC. Als je veel zo n programma s hebt, kies je beter dynamisch omdat de DLL s voor al die programma s gedeeld zijn en de applicatie kleiner is. Als het de enige applicatie is die met Borland C++ Builder 3 gemaakt werd, neem je beter statisch omdat alles in de toepassing (het exe-bestand) zelf zit en de totale grootte dan kleiner is. Het programma installeert zich standaard onder Program Files in de map FT639 Control Panel. Er wordt een icoon in het startmenu en één op het bureaublad gezet. 15

5.2. Hoofdprogramma Wanneer je het programma opent, kom je op het volgende scherm terecht (figuur 5.2.1): Figuur 5.2.1: Het hoofdprogramma Menu: - Connectie: Hier kan je de seriële poort selecteren. Enkel de vrije, aanwezige poorten worden getoond. De knop Verbinding maken/verbreken schakelt de geselecteerde seriële poort aan of uit. Voor het gemak kan je Ctrl + C drukken - Extra: Hieronder vind je de koppeling Opties die je naar het instellingenformulier brengt. - Help: Informatie over de ontwerper van het programma en links voor ondersteuning en extra informatie vind je onder Info. Als op Setup of Active wordt gedrukt (na verbinding te hebben gemaakt), krijg je alle mogelijkheden die je in die mode kan gebruiken voorgeschoteld. Figuur 5.2.2 toont de GUI als er connectie is gemaakt. 16

Figuur 5.2.2: Mogelijkheden in de 2 modes van de controller Je ziet hier alle mogelijkheden. Bij active mode verdwijnt de groupbox Instellingen. Er zijn standaard reeds enkele instellingen gebeurd. Dit zijn de standaardinstellingen van de FT639. Je kunt ook zonder instellingen te doen naar active mode gaan. Naast de scrollbalken voor de positie-instelling krijg je extra informatie over de huidige positie. Als laatste kan je nog softwarematig de controller zijn standaardinstellingen meegeven met de knop Reset controller. Zo hoef je niet voortdurend de voeding te onderbreken als je hem wil resetten. In de statusbalk onderaan zie je extra informatie over de geselecteerde poort en de toestand van de controller. Dit is afhankelijk van de instellingen. Vragen en waarschuwingen komen tevoorschijn m.b.v. een messagebox. 5.3. Opties Figuur 5.3.1: Opties 17

Bij Opties kan je kiezen voor de standaard configuratie. Die zal van kracht zijn telkens na het starten van het programma. Enkel tijdens de huidige sessie zijn onderstaande instellingen van kracht. Als je echter kiest voor Aangepast zullen ook de volgende keer dat je het programma start de huidige instellingen van kracht zijn. Simulatie is een optie voor mensen die het programma willen bekijken zonder dat de motoren aangestuurd worden. Ook als je geen seriële poort hebt of als deze bezet is, kan simulatie handig zijn. De instellingen die je deed tijdens simulatie zullen eenmaal je uit simulatie gaat nog steeds geselecteerd zijn en je kunt dan je controller direct in Active mode zetten. Uiteraard is dit enkel mogelijk als op dat moment een seriële poort beschikbaar is. De controle op de voedingsspanning is ook handig zodat je niet zomaar commando s stuurt als je controller toch af lag. Als het programma merkt dat geen spanning aanwezig is dit gebeurt via de CTS-lijn zal het alle componenten uitschakelen totdat er weer spanning is en zal dan automatisch de controller herinstellen zoals voorheen. Zorg er dan wel voor dat de CTS-lijn aangesloten is aan de voedingsklem van de print en dat je zeker 9V voedingsspanning aanbiedt. Zoniet zal je deze optie niet kunnen gebruiken. De seriële poort heeft namelijk liefst 12V om als 1 te interpreteren. Met 9V lukt dit ook nog. Bij het gebruiken van de draadloze kits mag je deze optie niet gebruiken! De kits gebruiken de CTS-lijn zelf al voor hun onderlinge communicatie. Dit zou het programma storen 18

5.4. Broncode 5.4.1 Project1.cpp #include <vcl.h> #pragma hdrstop USERES("Project1.res"); USEFORM("..\..\..\..\..\..\MIJNDO~1\School\6ICT\GIP\test\HOOFDP~1\Unit1.cpp ", frmmain); USEFORM("..\..\..\..\..\..\MIJNDO~1\School\6ICT\GIP\test\HOOFDP~1\Unit2.cpp ", frmoptions); USEFORM("Unit3.cpp", frmabout); WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) try Application->Initialize(); Application->Title = "Servosturing"; Application->CreateForm( classid(tfrmmain), &frmmain); Application->CreateForm( classid(tfrmoptions), &frmoptions); Application->CreateForm( classid(tfrmabout), &frmabout); Application->Run(); catch (Exception &exception) Application->ShowException(&exception); return 0; 5.4.2 Unit1.h #ifndef Unit1H #define Unit1H #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <Buttons.hpp> #include "ComPort.hpp" #include <Menus.hpp> #include <ExtCtrls.hpp> #include <ComCtrls.hpp> class TfrmMain : public TForm published: // IDE-managed Components TComPort *COM; TGroupBox *gbmodeselectie; TSpeedButton *btnsetup; TSpeedButton *btnactive; TTimer *Timer1; TMainMenu *MainMenu; TMenuItem *btnconnectie; TMenuItem *rbcom1; 19

TMenuItem *rbcom2; TMenuItem *N1; TMenuItem *btnconnect; TMenuItem *btnextra; TMenuItem *btnhelp; TMenuItem *btnopties; TGroupBox *gbactive; TGroupBox *gbsetup; TSpeedButton *btnlongpulse; TSpeedButton *btnshortpulse; TLabel *lblservo1; TLabel *lblservo2; TLabel *lblservo3; TLabel *lblservo4; TLabel *lblservo5; TScrollBar *scrollservo1; TScrollBar *scrollservo2; TScrollBar *scrollservo3; TScrollBar *scrollservo4; TScrollBar *scrollservo5; TLabel *infoposition1; TLabel *infoposition2; TLabel *infoposition3; TLabel *infoposition4; TLabel *infoposition5; TStatusBar *StatusBar1; TMenuItem *btninfo; TLabel *Lbl0; TLabel *lblmax; TLabel *lblcenter; TLabel *lblstartpositie; TLabel *Label1; TLabel *Label3; TLabel *Label4; TLabel *infodegrees1; TLabel *infodegrees2; TLabel *infodegrees3; TLabel *infodegrees4; TLabel *infodegrees5; TButton *btnreset; TShape *Shape1; TShape *Shape2; TTrackBar *StartPos; TLabel *Label2; TLabel *Label5; TLabel *Label6; TLabel *Label7; TLabel *Label8; TLabel *Label9; TImage *Image1; TShape *Shape3; void fastcall FormCreate(TObject *Sender); void fastcall FormClose(TObject *Sender, TCloseAction &Action); void fastcall btnconnectclick(tobject *Sender); void fastcall btnsetupclick(tobject *Sender); void fastcall btnactiveclick(tobject *Sender); void fastcall btnshortpulseclick(tobject *Sender); void fastcall btnlongpulseclick(tobject *Sender); void fastcall rbcom1click(tobject *Sender); void fastcall rbcom2click(tobject *Sender); 20

void fastcall btnoptiesclick(tobject *Sender); void fastcall scrollservo1change(tobject *Sender); void fastcall scrollservo2change(tobject *Sender); void fastcall scrollservo3change(tobject *Sender); void fastcall scrollservo4change(tobject *Sender); void fastcall scrollservo5change(tobject *Sender); void fastcall COMCTSChange(TObject *Sender); void fastcall btnresetclick(tobject *Sender); void fastcall StartPosChange(TObject *Sender); void fastcall btninfoclick(tobject *Sender); private: // User declarations public: // User declarations float pulsduur; unsigned short headervar; unsigned short i; unsigned short uv; unsigned short lv; unsigned short bereik; void fastcall Positioneer(short servo, int waarde); void fastcall Disconnect(TObject *Sender); void fastcall AdjustDegrees(TObject *Sender); void fastcall EnableComponents(TObject *Sender); void fastcall InstellingenToepassen(TObject *Sender); fastcall TfrmMain(TComponent* Owner); ; extern PACKAGE TfrmMain *frmmain; #endif 5.4.3 Unit1.cpp #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include "Unit2.h" #include "Unit3.h" #pragma package(smart_init) #pragma link "ComPort" #pragma link "ComPort" #pragma resource "*.dfm" TfrmMain *frmmain; fastcall TfrmMain::TfrmMain(TComponent* Owner) : TForm(Owner) //COMPORT-component afstemmen op de controller COM->Active=false; COM->BaudRate=br2400; COM->Parity=paNone; COM->StopBits=sb1; COM->DataBits=db8; lblcenter->caption="45 "; lblmax->caption="90 "; lblcenter->width=473; 21

StartPos->Position=12;//12 is de standaardpositie van de controller. bereik=90;//korte pulslengte (90 ) is het standaardbereik v/d controller. void fastcall TfrmMain::FormCreate(TObject *Sender) //Controle op de compoorten try rbcom2->checked=true; rbcom2->visible=true; COM->Active=false; COM->DeviceName="COM2"; COM->Active=true; StatusBar1->Panels->Items[0]->Text="Poort: COM2"; catch(...) rbcom2->visible=false; rbcom2->checked=false; try rbcom1->checked=true; rbcom1->visible=true; COM->Active=false; COM->DeviceName="COM1"; COM->Active=true; StatusBar1->Panels->Items[0]->Text="Poort: COM1"; catch(...) rbcom1->visible=false; rbcom1->checked=false; //Er wordt van achter naar voren afgelopen zodat de eerste geldige poort aangevinkt zou blijven. COM->Active=false; //Indien 2 poorten geldig, 2de afchecken en 1ste gebruiken. if(rbcom1->visible==true && rbcom2->visible==true)rbcom2->checked=false; void fastcall TfrmMain::FormClose(TObject *Sender, TCloseAction &Action) /*Vragen of de motoren moeten stoppen bij verlaten v/h programma. Bij Ja : naar setup mode.*/ if(application->messagebox("wilt u de motoren stilleggen vooraleer het programma te beëindigen?", "Vraag", MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON1)==IDYES) try if(frmoptions->cbsimulatie->checked==false) COM->Active=true; COM->WriteByte(122);//setup mode 22

catch(...)//melden dat motoren niet konden stil worden gelegd. Application->MessageBox("De controller kon niet bereikt worden. De seriële poort is mogelijk in gebruik door een ander programma.", "Fout", MB_OK + MB_ICONERROR + MB_DEFBUTTON1); COM->Close(); frmoptions->iofile.close();//zorgen dat dit bestand zeker afgesloten werd. void fastcall TfrmMain::btnConnectClick(TObject *Sender) if(btnconnect->caption=="&verbinding maken") try if(frmoptions->cbsimulatie->checked==false) COM->Active=true; if(frmoptions->cbcts->checked==true) if(com->modemstatus.contains(mscts)) //Als de controller voeding krijgt(zie hardware) StatusBar1->Panels->Items[1]->Text="Controller: aangesloten"; EnableComponents(0); else StatusBar1->Panels->Items[1]->Text="Controller: afgeschakeld"; else StatusBar1->Panels->Items[1]->Text="Controller: De software krijgt geen gegevens over de controllertoestand."; EnableComponents(0); btnconnect->caption="&verbinding verbreken"; catch(...) if(application->messagebox("er zijn geen seriële poorten gevonden of deze zijn al in gebruik door een ander programma.\nwilt u het programma simuleren?", "Vraag", MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON1) == IDYES) frmoptions->cbsimulatie->checked=true; frmoptions->formcreate(0); else Disconnect(0); 23

void fastcall TfrmMain::rbCOM1Click(TObject *Sender) bool COMaanuit; if(com->active==true)comaanuit=true; else COMaanuit=false; //Toestand v/d poort onthouden. rbcom1->checked=true; rbcom2->checked=false; COM->Active=false; COM->DeviceName="COM1"; if(comaanuit==true)com->active=true; StatusBar1->Panels->Items[0]->Text="Poort: COM1"; void fastcall TfrmMain::rbCOM2Click(TObject *Sender) bool COMaanuit; if(com->active==true)comaanuit=true; else COMaanuit=false; rbcom1->checked=false; rbcom2->checked=true; COM->Active=false; COM->DeviceName="COM2"; if(comaanuit==true)com->active=true; StatusBar1->Panels->Items[0]->Text="Poort: COM2"; void fastcall TfrmMain::btnOptiesClick(TObject *Sender) frmoptions->showmodal(); void fastcall TfrmMain::btnSetupClick(TObject *Sender) if(frmoptions->cbsimulatie->checked==false)com->writebyte(122); //Controller in setup mode zetten gbsetup->visible=true; gbactive->visible=true; void fastcall TfrmMain::btnActiveClick(TObject *Sender) if(frmoptions->cbsimulatie->checked==false) InstellingenToepassen(0); COM->WriteByte(117);//Controller in active mode zetten gbsetup->visible=false; gbactive->visible=true; void fastcall TfrmMain::btnShortPulseClick(TObject *Sender) lblcenter->caption="45 "; lblcenter->width=473; 24

lblmax->caption="90 "; bereik=90; AdjustDegrees(0); void fastcall TfrmMain::btnLongPulseClick(TObject *Sender) lblcenter->caption="90 "; lblcenter->width=473; lblmax->caption="180 "; bereik=180; AdjustDegrees(0); void fastcall TfrmMain::scrollServo1Change(TObject *Sender) Positioneer(1, scrollservo1->position); infoposition1->caption=scrollservo1->position; AdjustDegrees(0); void fastcall TfrmMain::scrollServo2Change(TObject *Sender) Positioneer(2, scrollservo2->position); infoposition2->caption=scrollservo2->position; AdjustDegrees(0); void fastcall TfrmMain::scrollServo3Change(TObject *Sender) Positioneer(3, scrollservo3->position); infoposition3->caption=scrollservo3->position; AdjustDegrees(0); void fastcall TfrmMain::scrollServo4Change(TObject *Sender) Positioneer(4, scrollservo4->position); infoposition4->caption=scrollservo4->position; AdjustDegrees(0); void fastcall TfrmMain::scrollServo5Change(TObject *Sender) Positioneer(5, scrollservo5->position); infoposition5->caption=scrollservo5->position; AdjustDegrees(0); void fastcall TfrmMain::Positioneer(short servo, int waarde) uv=integer(waarde/16); //Byte wordt gedeeld door 16 om de hoogste 4 bits over te houden. lv=waarde-(uv*16); //De laagste 4 bits worden bekomen door de afgeronde waarde van de originele af te trekken. uv=uv + 128 + (servo-1)*16; //MSB op 1 zetten voor de upper byte + motorselectie 25

lv=lv + (servo-1)*16;//motorselectie if(frmoptions->cbsimulatie->checked==false) COM->WriteByte(lv);//De bytes naar de controller sturen beginnende met lv (=lower value), daarna uv (=upper value). COM->WriteByte(uv); void fastcall TfrmMain::COMCTSChange(TObject *Sender) if(frmoptions->cbsimulatie->checked==false/*controle voor de zekerheid*/) if(frmoptions->cbcts->checked==true) if(com->modemstatus.contains(mscts)) StatusBar1->Panels->Items[1]->Text="Controller: aangesloten"; EnableComponents(0); //Instellingen opnieuw geven want de spanning was weggevallen. COM->WriteByte(122); InstellingenToepassen(0); if(btnactive->down==true)com->writebyte(117); else StatusBar1->Panels->Items[1]->Text="Controller: afgeschakeld"; btnsetup->enabled=false; btnactive->enabled=false; btnreset->enabled=false; //Componenten disablen scrollservo1->enabled=false; scrollservo2->enabled=false; scrollservo3->enabled=false; scrollservo4->enabled=false; scrollservo5->enabled=false; btnshortpulse->enabled=false; btnlongpulse->enabled=false; StartPos->Enabled=false; void fastcall TfrmMain::Disconnect(TObject *Sender) try if(frmoptions->cbsimulatie->checked==false) /*COM niet beschikbaar bij het starten? Dan is nog geen poort geselecteerd. Dus poortselectie!*/ if(frmmain->rbcom1->checked==false && frmmain->rbcom2->checked==false)frmmain->formcreate(0);//poortselectie frmmain->com->active=true; frmmain->statusbar1->panels->items[1]->text="controller: NIET VERBONDEN. MAAK CONNECTIE!"; 26

frmmain->btnsetup->allowallup=true; frmmain->btnsetup->down=false; frmmain->btnactive->down=false; frmmain->btnsetup->allowallup=false; frmmain->btnsetup->enabled=false; frmmain->btnactive->enabled=false; frmmain->btnreset->enabled=false; frmmain->btnconnect->caption="&verbinding maken"; frmmain->gbactive->visible=false; frmmain->gbsetup->visible=false; frmmain->com->active=false; catch(...) /*Als de COM-poort niet beschikbaar is als je uit simulatie komt, moet hij in simulatie blijven (error toegang geweigerd).*/ Application->MessageBox("Er zijn geen seriële poorten gevonden of deze zijn al in gebruik door een ander programma.\nhet programma blijft in simulatie tot een seriële poort vrij is.", "Waarschuwing: COM-poort is niet vrij!", MB_OK + MB_ICONWARNING + MB_DEFBUTTON1); frmoptions->cbsimulatie->checked=true; void fastcall TfrmMain::AdjustDegrees(TObject *Sender) infodegrees1->caption=(int)(((float)scrollservo1->position/255)*bereik); infodegrees2->caption=(int)(((float)scrollservo2->position/255)*bereik); infodegrees3->caption=(int)(((float)scrollservo3->position/255)*bereik); infodegrees4->caption=(int)(((float)scrollservo4->position/255)*bereik); infodegrees5->caption=(int)(((float)scrollservo5->position/255)*bereik); infodegrees1->caption=infodegrees1->caption + " "; infodegrees2->caption=infodegrees2->caption + " "; infodegrees3->caption=infodegrees3->caption + " "; infodegrees4->caption=infodegrees4->caption + " "; infodegrees5->caption=infodegrees5->caption + " "; void fastcall TfrmMain::EnableComponents(TObject *Sender) btnsetup->enabled=true; btnactive->enabled=true; btnreset->enabled=true; //Na wegvallen v/d spanning de instellingen opnieuw doorgeven. scrollservo1->enabled=true;/*de positie wordt opnieuw doorgegeven bij het event van de Active-knop.*/ scrollservo2->enabled=true; scrollservo3->enabled=true; scrollservo4->enabled=true; scrollservo5->enabled=true; btnshortpulse->enabled=true; btnlongpulse->enabled=true; StartPos->Enabled=true; //Voor controle op Down-eigenschap eerst enablen! if(btnactive->down==true)btnactiveclick(0); if(btnsetup->down==true)btnsetupclick(0); 27

void fastcall TfrmMain::btnResetClick(TObject *Sender) if(frmoptions->cbsimulatie->checked==false) COM->WriteByte(122);//setup COM->WriteChar(85);//korte pulslengte COM->WriteChar(108);//startpositie 12 scrollservo1->position=0;scrollservo1change(0); scrollservo2->position=0;scrollservo2change(0); scrollservo3->position=0;scrollservo3change(0); scrollservo4->position=0;scrollservo4change(0); scrollservo5->position=0;scrollservo5change(0); btnshortpulseclick(0); btnshortpulse->down=true; StartPos->Position=12; btnsetupclick(0);/*nu pas setupclick omdat de positionering anders beïnvloed wordt. Het setup commando werd echter al eerder gegeven.*/ btnsetup->down=true; void fastcall TfrmMain::InstellingenToepassen(TObject *Sender) //Naar setup voor instellingen COM->WriteByte(122); //Eerst pulslengte vastleggen, pas daarna de startpositie. if(btnshortpulse->down==true)com->writechar(85); else if(btnlongpulse->down==true)com->writechar(90); for(i=1, headervar=96;i<=16;i++, headervar++) if(startpos->position==i)com->writechar(headervar); //Pulslengtewaarde selecteren. Dit bepaalt de startpositie v/d motoren. /*Initiële posities setten (= positiecommando's onafhankelijk v/d mode v/d controller). Ook in setup kunnen positiecommando's gegeven worden.*/ Positioneer(1, scrollservo1->position); Positioneer(2, scrollservo2->position); Positioneer(3, scrollservo3->position); Positioneer(4, scrollservo4->position); Positioneer(5, scrollservo5->position); void fastcall TfrmMain::StartPosChange(TObject *Sender) StartPos->Hint=StartPos->Position; void fastcall TfrmMain::btnInfoClick(TObject *Sender) frmabout->showmodal(); 28

5.4.4 Unit2.h #ifndef Unit2H #define Unit2H #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> #include <fstream.h> class TfrmOptions : public TForm published: // IDE-managed Components TButton *btnok; TRadioGroup *rgsaveconfig; TGroupBox *gbcurrentsettings; TCheckBox *cbsimulatie; TCheckBox *cbcts; void fastcall FormCreate(TObject *Sender); void fastcall btnokclick(tobject *Sender); void fastcall cbsimulatieclick(tobject *Sender); void fastcall FormShow(TObject *Sender); void fastcall cbctsclick(tobject *Sender); private: // User declarations public: // User declarations fastcall TfrmOptions(TComponent* Owner); fstream iofile; struct Settings bool simulatie; bool CTS; ; unsigned short veranderd,veranderdcbcts; ; extern PACKAGE TfrmOptions *frmoptions; #endif 5.4.5 Unit2.cpp #include <vcl.h> #include <fstream.h> #pragma hdrstop #include "Unit2.h" #include "Unit1.h" #include "Unit3.h" #pragma package(smart_init) #pragma resource "*.dfm" TfrmOptions *frmoptions; Settings record; 29

fastcall TfrmOptions::TfrmOptions(TComponent* Owner) : TForm(Owner) //Configuratie ophalen uit bestand. iofile.open("config.ini", ios::binary ios::in ios::out); if(!iofile)application->terminate(); iofile.seekg(0,fstream::end); int eind=iofile.tellg(); iofile.seekg(0); int begin=iofile.tellg(); if(begin!=eind)//als er een configuratie opgeslaan is, deze instellen. //Staat nog in het begin om te lezen. iofile.read((char*)&record, sizeof(settings)); if(record.simulatie==1)frmoptions->cbsimulatie->checked=true; else frmoptions->cbsimulatie->checked=false; if(record.cts==1)frmoptions->cbcts->checked=true; else frmoptions->cbcts->checked=false; rgsaveconfig->itemindex=1;//eigen instellingen else rgsaveconfig->itemindex=0;//standaard instellingen iofile.close(); veranderd=1;veranderdcbcts=1;//aanleggen voor volgende functies. frmoptions->btnokclick(0); frmmain->btnconnectclick(0);//okclick had de connectie aangelegd, nu weer afleggen. veranderd=0;veranderdcbcts=0;//nu weer afleggen. void fastcall TfrmOptions::FormCreate(TObject *Sender) if(frmoptions->cbsimulatie->checked==false) frmmain->caption="servomotorsturing voor FT639 interface"; frmmain->statusbar1->panels->items[1]->text="controller: NIET VERBONDEN. MAAK CONNECTIE!"; frmmain->btnconnectie->enabled=true; frmmain->btnsetup->enabled=false; frmmain->btnactive->enabled=false; frmmain->btnreset->enabled=false; //selectie van de juiste poort if(frmmain->rbcom1->checked==true) frmmain->com->devicename="com1"; frmmain->statusbar1->panels->items[0]->text="poort: COM1"; else if(frmmain->rbcom2->checked==true) frmmain->com->devicename="com2"; frmmain->statusbar1->panels->items[0]->text="poort: COM2"; else if(application->messagebox("er zijn geen seriële poorten gevonden of deze zijn al in gebruik door een ander programma.\nhet programma draait nu in simulatie.", "Waarschuwing: COM-poort is niet vrij!", MB_OK + MB_ICONWARNING + MB_DEFBUTTON1) == IDOK) 30

frmoptions->cbsimulatie->checked=true; frmoptions->formcreate(0); //FormCreate wordt herhaald, maar komt hier nadien terug, dus hier mag geen code meer komen! else frmmain->btnsetup->enabled=true;//bruikbaar maken voor simulatie. frmmain->btnactive->enabled=true; frmmain->btnreset->enabled=true; frmmain->statusbar1->panels->items[1]->text="controller: wordt niet gebruikt (softwaresimulatie)"; frmmain->statusbar1->panels->items[0]->text="poort: \\"; frmmain->caption="servomotorsturing voor FT639 interface simulatie"; frmmain->btnconnectie->enabled=false; void fastcall TfrmOptions::btnOKClick(TObject *Sender) if(frmoptions->cbsimulatie->checked==true && veranderd%2==1 && frmmain- >btnactive->down==true)// veranderd kijkt als je iets aangepast hebt. if(application->messagebox("wilt u de motoren stilleggen vooralleer naar simulatie te gaan?", "Vraag", MB_YESNO + MB_ICONQUESTION + MB_DEFBUTTON1)==IDYES) try frmmain->com->active=true; frmmain->com->writebyte(122); catch(...)//melden dat motoren niet konden stil worden gelegd. Application->MessageBox("De controller kon niet bereikt worden. De seriële poort is mogelijk in gebruik door een ander programma.", "Fout", MB_OK + MB_ICONERROR + MB_DEFBUTTON1); if(veranderd%2==1 veranderdcbcts%2==1) frmmain->disconnect(0);//alles afleggen vóór naar simulatie te gaan. FormCreate(0);//Instellingen doen afhankelijk v/d checkboxes. frmmain->btnconnectclick(0);//opnieuw connectie maken. if(frmoptions->rgsaveconfig->itemindex==1) iofile.open("config.ini", ios::binary ios::in ios::out); if(!iofile)application->terminate(); if(frmoptions->cbsimulatie->checked==true)record.simulatie=1; else record.simulatie=0; if(frmoptions->cbcts->checked==true)record.cts=1; else record.cts=0; iofile.seekg(0); iofile.write((char*)&record, sizeof(settings)); iofile.close(); 31

else if(frmoptions->rgsaveconfig->itemindex==0) iofile.open("config.ini", ios::trunc ios::binary ios::out); iofile.close(); void fastcall TfrmOptions::cbSimulatieClick(TObject *Sender) veranderd++; void fastcall TfrmOptions::FormShow(TObject *Sender) veranderd=0; veranderdcbcts=0; void fastcall TfrmOptions::cbCTSClick(TObject *Sender) veranderdcbcts++; 5.4.6 Unit3.h #ifndef Unit3H #define Unit3H #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> #include <ExtCtrls.hpp> class TfrmAbout : public TForm published: // IDE-managed Components TLabel *lblcopyright; TImage *Image1; TLabel *lblversion; TLabel *lbltitle; TLabel *Label3; TLabel *Label4; TLabel *Label5; void fastcall FormClick(TObject *Sender); void fastcall FormCreate(TObject *Sender); private: // User declarations public: // User declarations fastcall TfrmAbout(TComponent* Owner); ; extern PACKAGE TfrmAbout *frmabout; #endif 32

5.4.7 Unit3.cpp #include <vcl.h> #pragma hdrstop #include "Unit3.h" #include "Unit1.h" #include "Unit2.h" #pragma package(smart_init) #pragma resource "*.dfm" TfrmAbout *frmabout; fastcall TfrmAbout::TfrmAbout(TComponent* Owner) : TForm(Owner) void fastcall TfrmAbout::FormClick(TObject *Sender) frmabout->close(); void fastcall TfrmAbout::FormCreate(TObject *Sender) Label3->Width=frmAbout->ClientWidth; Label5->Width=frmAbout->ClientWidth; 6. De draadloze seriële dataoverdracht (m.b.v. het ER400TRS IC) Om de servocontroller te besturen, maken we een verbinding met de seriële poort van de PC. Als je het project wil toepassen op een bepaalde afstand van je PC kan je beter draadloos werken. Hiervoor komt de ER400TRS van pas. Een leuk voordeel is dat je met deze kits zowel data kan verzenden als ontvangen. Dan kan je kiezen welke kit je als transmitter en welke je als receiver gebruikt. Eén kit wordt aangesloten op de PC, de andere aan het printje. Het is aan te raden eerst de communicatie tussen 2 pc s te testen, zo weet je tenminste wat de ontvanger krijgt. Je moet ook de juiste kabels gebruiken. Dit hangt af van je instellingen of de kits en op PC. Hier zullen we niet echt diep op ingaan, want het draadloos deel is slechts een extra optioneel onderdeel van deze GIP. Toch vond ik het interessant dit eens te integreren om een idee te krijgen van de complexiteit hiervan. De kits moeten gevoed worden, maar echt veel verbruiken ze niet. Je kunt ze eventueel op batterij aansluiten In ontvangstmode verbruiken ze ongeveer 12,5mA. Ik heb ondervonden dat je de kits best apart voedt. De instellingen veranderen soms als je de voeding die naar de print gaat, deelt met de kit. In de ER400TRS-02 reeks zijn dergelijke problemen zoals verlies van instellingen verholpen. Belangrijk: De CTS-lijn kan bij draadloze overdracht niet gebruikt worden voor controle op de voedingsspanning! De kits gebruiken deze lijnen zelf voor hun onderlinge communicatie. De software (FT639 Control Panel) is niet in staat te bepalen als je de kits gebruikt of niet, 33

dus moet je bij draadloze overdracht de optie Controle op de voedingsspanning uitschakelen. Als we met de draadloze kits werken, moeten we eigenschappen als baudrate, stopbits e.d. ook nog per kit instellen. Er is hiervoor een programmaatje beschikbaar waarmee je dit kan instellen: Easy-Radio MyLPRS. Figuur 6.1: Easy Radio MyLPRS software Deze software kan ook de volgende generatie van deze tranceivers aansturen, dus krijg je enkele opties die je bij de gewone ER400TRS-kits niet kan gebruiken. Een overzicht van de software en zijn commando s kan je vinden in de datasheets: ER400TRS Software Guide en LPRS commands. De kits stel je best apart in. Zorg dat slechts degene die je instelt voeding krijgt, zodat er geen communicatie optreedt die je instellingen zou kunnen verstoren. Alle gangbare instellingen zoals baudrate, flow control e.d. moeten nu ook op de kits ingesteld worden. Aangezien onze communicatie in één richting verloopt (simplex) en we rechtdoor kabels gebruiken, kunnen we handshaking afleggen en de test mode op RAW RX Data Test zetten. Zorg ook dat de frequentie bij beide kits dezelfde is. 34