VTI Sint-Laurentius De school voor Wetenschap, Techniek en Technologie Pr. Thuysbaertlaan 1 9160 Lokeren www.vti-lokeren.be
[email protected]
GEÏNTEGREERDE PROEF
Pakketweegschaal
Industriële informatie & communicatietechnologie SCHOOLJAAR 2010-2011
Robbe Vehent
2
VTI Sint-Laurentius De school voor Wetenschap, Techniek en Technologie Pr. Thuysbaertlaan 1 9160 Lokeren www.vti-lokeren.be
[email protected]
GEÏNTEGREERDE PROEF
Pakketweegschaal
Industriële informatie & communicatietechnologie SCHOOLJAAR 2010-2011 3 Robbe Vehent
1. Voorwoord Dit project boeide mij omdat het een project is waar veel werk en tijd is ingestoken en het echt iets is wat ik zelf heb gemaakt. Vooral dat zelf maken geeft een zekere drang om er aan verder te werken. Het is niet alleen omdat het voor een groot stuk meetelt qua punten maar vooral om het af te krijgen en dan ook trots te kunnen zijn op je eigen werk.
4
Inhoudsopgave 1.
Voorwoord ........................................................................................ 4
2.
Inleiding ........................................................................................... 6
3.
Omschrijving ..................................................................................... 7
4.
Hardware .......................................................................................... 8 4.1. De gebruikte componenten .............................................................. 8 4.2 Uitleg hoe de meting wordt uitgevoerd ............................................... 8
5.
Microcontrollersoftware ..................................................................... 16 5.1 Flowcharts .................................................................................... 16 5.2 Code............................................................................................ 18 5.3 uitleg van de code ......................................................................... 21 5.4 Uitleg over Timer 1 ........................................................................ 22
6.
Graphical User Interface ................................................................... 24 6.1 Code met figuur ............................................................................ 24
7.
Databladen ..................................................................................... 29 7.1 Datasheet PIC 16F877 van Microchip ............................................... 29
8.
Bronvermeldingen ............................................................................ 31
9.
Logboek.......................................................................................... 31
5
2. Inleiding Als opdracht heb ik voor een pakketweegschaal gekozen. Daarmee kan je een pakket tot maximum 10 kg wegen op 1 g nauwkeurig. Bij deze opdracht maken we gebruik van een capacitieve sensor. Ik gebruik een oudere digitale weegschaal waarin die capacitieve sensor zit ingebouwd. Er is een pinnetje op het printplaatje van de oude weegschaal waar je een blokgolf kan aftakken waarvan de frequentie veranderd naarmate je meer of minder gewicht op de weegschaal legt. Deze blokgolf, waarvan de periode door een microcontroller wordt geteld, schommelt tussen 15 kHz en 30 kHz. De gemeten periode wordt doorgestuurd naar de PC via RS232. De pc zet de periode om in een frequentie en aan de hand van die frequentie wordt het gewicht berekend. Het gewicht wordt op het scherm getoond.
6
3. Omschrijving Mijn project is een pakketweegschaal die het gewicht van pakketten meet, dat gewicht doorstuurt naar de PC en het gewicht op het scherm toont. Om te starten met mijn project heb ik, zoals ik bij hardware uitleg, eerst gebruikt gemaakt van een potentiometer ter afwachting van de levering van mijn sensor. Daarna ben ik overgestapt van een krachtsensor naar een capacitieve sensor.
7
4. Hardware 4.1. De gebruikte componenten Bij de hardware worden de volgende componenten gebruikt: -
µcontroller
-
oude weegschaal met capacitieve sensor
-
Moederbordje voor de µcontroller
4.2 Uitleg hoe de meting wordt uitgevoerd Dit deel wordt niet meer gebruik. Dit is het opzoekwerk van voor ik de plannen wijzigde. De opstelling die wel is gebruikt staat op pagina 12 en verder. In dit onderdeel wordt de werking van de Force Sensing Resistor uitgelegd. Deze component is een weerstand die verminderd in waarde naarmate de kracht die er op uitgeoefend wordt groter wordt. Aangezien ik nog geen FSR had, begon ik alvast met die te vervangen door een potentiometer van 100 K Ω. Je kunt dan de weerstandskarakteristieken van de FSR testen op de voorlopige schakeling met de potentiometer. Hieronder zie je een afbeelding die de schakeling van de FSR illustreert.
Figuur 1: RG is een terugloopweerstand en FSR is als een potentiometer.
De weerstand aangeduid als FSR is in de voorlopige schakeling vervangen door een potentiometer van 100 KΩ. 8
De karakteristieken van de FSR worden in volgende grafieken weergegeven.
Figuur 2: RG values zijn waarden van de RG weerstand van in figuur 1.
Figuur 3: Op deze figuur zie je duidelijk dat de weerstand verminderd als er meer kracht komt op te staan.
9
In figuur 1 zie je dat er ook een opamp in de schakeling gebruikt wordt. Ik heb een LM324 IC gebruikt om die opamp te schakelen.
Figuur 4: De weerstandswaarde van 0 tot 10 kg.
Figuur 5: De weerstandswaarde van 0 tot 1 kg.
Nieuwe sensor: Soehnle Weegschaal Capacitieve sensor. Deze sensor wordt wel gebruik maar niet in deze opstelling. De opstelling die wel is gebruikt staat op pagina 12 en verder.
De sensor die ik nu gebruik is een sensor uit een oude weegschaal (zie foto).
Figuur 6: oude weegschaal waar de capacitieve sensor uit komt.
10
Figuur 7: het plaatje verbonden met de rode draad is de "ground" van de schakeling.
Deze sensor maakt gebruik van een capaciteitsmeting. Daarmee bedoelt men dat de capaciteit van deze (grote) beweegbare condensator gemeten wordt zonder belasting en opgeslagen in de µController. Dan wordt de capaciteit gemeten met belasting en vergeleken met de opgeslagen waarde.
De eerste bedoeling was om alle drie de plaatjes te gebruiken, maar ik ga nu maar twee plaatjes gebruiken. Het plaatje dat met de rode draad verbonden is, is een niet bewegend plaatje wanneer je de weegschaal induwt op het vlak dat daar voor dient. Zie figuur 6.
Figuur 8: schakeling van capacitieve sensor met 2 metalen plaatjes.
11
Om deze sensor te maken ga ik de plaatjes gebruiken die op figuur 7 verbonden zijn met de rode draad en de gele draad. De schakeling hiervan zie je in figuur 8. Voor de schmitt-trigger gebruiken we een IC met allemaal inverterende schmitttriggers. Zie figuur 9.
Figuur 9: IC met inverterende schmitt-triggers (links), schakeling van 1 schmitt-trigger (rechts).
Verandering van plan. Al het voorgaande ga ik niet gebruiken. Ik ga wel nog de weegschaal en de bijhorende schakeling gebruiken (zie figuur 7 en figuur 6). Op dat plaatje tak ik een blokgolf af op pin 2, waarvan de frequentie wijzigt naarmate de kracht op de weegschaal veranderd.
12
Figuur 10: Frequentie met gewicht op de weegschaal. Frequentie is ongeveer 26 kHz.
Figuur 10 is de meting van het signaal op pin 2 als er een gewicht op de weegschaal ligt.
Figuur 11: Frequentie zonder gewicht op de weegschaal. Frequentie is ongeveer 18 kHz.
Figuur 11 is de meting van het signaal op pin 2 als er geen gewicht op de weegschaal ligt.
13
Het is nu de bedoeling dat ik die periode meet met de PIC 16f877 controller. Die periode kan ik in mijn GUI omzetten naar frequentie en dan kan ik kalibreren.
4.3 Werking van capacitieve sensor
Figuur 11a: Werkingsprincipe van een capacitieve versnellings-opnemer (tek. Seat).
De werking van Capacitieve sensoren zoals hierboven is afgebeeld: Deze sensor werkt met 2 condensatoren. Van die condensatoren moet op een of andere manier de capaciteit gemeten worden. Er zijn 2 formules om de capaciteit van een condensator te weten.
en C=
.
In de eerste formule staat de C voor de capaciteit van de condensator, de Q staat voor de lading energie die opgeslagen wordt en de U voor de spanning. C wordt uitgedrukt in Farrad (F) Q wordt uitgedrukt in Coulomb (C) U wordt uitgedrukt in Volt (V) In e twee e formule staat e ε (epsilon) voor het iëlektricum dat is de constante die een eigenschap is van isolatiemateriaal. A staat voor de loodrecht parallelle gemeenschappelijke oppervlakte van de 2 platen, en d staat voor de afstand tussen de 2 platen. Het iëlektricum (ε) wor t uitge rukt in farra per meter (F/m). 14
A wordt uitgedrukt in vierkante meter (m²) d wordt uitgedrukt in meter (m) Om in de eerste formule de spanning te kunnen berekenen, want enkel de spanning kunnen we meten, moeten we ook nog de Q berekenen. Dat gaat met volgende formule: Q=I.t I is de stroom uitgedrukt in Ampère (A) t is de tijd uitgedrukt in seconden (s) Deze tijd is de tijd dat de stroom nodig heeft om de condensator volledig op te laden. De I bereken je in een kring door de spanning te delen door de weerstand. Die weerstand moet groot zijn. Bij een grote weerstand wordt de condensator traag geladen. Dus kiezen we voor een grote weerstand.
Op afbeelding 11a kan je zien dat als je de afstand tussen de verplaatsbare plaat en een vaste plaat veranderd, de afstand tussen de beweegbare en de andere vaste plaat ook veranderd.
15
5. Microcontrollersoftware 5.1 Flowcharts
In de oneindige lus gebeurt er niets omdat dat eigenlijk niet nodig is, het zou van geen enkel belang zijn.
16
17
5.2 Code
Figuur 12: start µ controllerprogramma.
Figuur 13: hoofdprogramma.
18
Figuur 14: Interrupt configuratie.
19
Figuur 15: ISR (interrupt service routine).
20
Figuur 16: wachttijd voor verzenden.
Zoals je in het begin van het programma kan zien, gebruik ik de PIC 16F877 als controller.
5.3 uitleg van de code Bespreking van het microcontroller programma:
Bij de start van het programma worden 2 tellers aangemaakt. Deze worden later gebruikt. Dan start het hoofdprogramma. Daarin wordt eerst de subroutine intConfig aangeroepen. Die subroutine zorgt er voor dat poort RB0 ingesteld wordt als interrupt ingang. Die interrupt komt er pas als er een stijgende flank is gedetecteerd. Ook wordt de prescaler waarde ingesteld op 1:1. Dat wil zeggen dat de gebruikte klok niet wordt gedeeld, daardoor wordt geteld op een gewone klokimpuls. De klok die geselecteerd is, is de interne klok van de microcontroller. Timer 1 wordt hier ook nog aangezet. Dan wordt de RS232 communicatie ingesteld. Daarna nog een flush van RCREG maar die is niet echt nodig. Terug in het hoofdprogramma wordt aan de tellers een waarde gegeven. Nadat dat gebeurt is springt het programma in een oneindige loop. 21
De enige manier om daar uit te geraken is door de interrupt op RB0. Als er een stijgende flank gedetecteerd wordt, zal de interrupt routine aangeroepen worden. In die interrupt routine wordt er eerst gekeken of Timer 1 wel aan staat. Staat die niet aan dan wordt die aangezet en wordt Timer 1 gecleared.
5.4 Uitleg over Timer 1 Timer 1:
Figuur 17: blokschema van timer 1.
Hieronder bespreek ik hoe het blokschema van timer 1 in elkaar zit. TMR1H en TMR1L vormen samen het timer 1 register. De pijl die omhoog gaat vanuit het timer register is de overflow vlag. Als die uitgang op 1 staat wilt dat zeggen dat de timer Figuur 18
Figuur 19
op zijn maximum is. In de afbeelding hiernaast zie je een AND poort en een multiplexer. De AND poort heeft twee ingangen. Als TMR1ON op 1 staat laat deze poort de uitgang van de multiplexer door. Deze MUX heeft ingangen, 1 uitgang en 1controle ingang. Deze controle ingang kijkt naar de TMR1CS bit. Als die bit op nul staat wordt hij gewoon genegeerd en dan gebruikt timer 1 de interne klok. Als TMR1CS op 1 staat en de TMR1SYNC staat op 22
1 dan is er geen synchronisatie met de externe klok. Staat de TMR1SYNC op 0 dan wordt de externe klok wel gesynchroniseerd.
Hier zie je vanwaar de MUX ingangen komen. Het Synchronize blok dient om de externe klok te synchroniseren. Bij Prescaler kan je een Prescalerwaarde instellen.
Figuur 20
23
6. Graphical User Interface 6.1 Code met figuur
private void InitializeControlValues() { cmbPortName.Items.Clear(); foreach (string s in SerialPort.GetPortNames()) cmbPortName.Items.Add(s); if (cmbPortName.Items.Contains(Settings.Default.PortName)) cmbPortName.Text = Settings.Default.PortName; else if (cmbPortName.Items.Count > 0) cmbPortName.SelectedIndex = 0; else { MessageBox.Show(this, "There are no COM Ports detected on this computer.\nPlease install a COM Port and restart this app.", "No COM Ports Installed", MessageBoxButtons.OK, MessageBoxIcon.Error);
24
this.Close(); } } //Enable/disable controls based on the app's current state private void EnableControls() { // Enable/disable controls based on whether the port is open or not gbPortSettings.Enabled = !comport.IsOpen; if (comport.IsOpen) btnOpenPort.Text = "&Close Port"; else btnOpenPort.Text = "&Open Port"; }
private void Display(string msg1, string msg2, string msg3) { lblHexWaarde.Invoke(new EventHandler(delegate { lblHexWaarde.Text = msg1; })); lblDecWaarde.Invoke(new EventHandler(delegate { lblDecWaarde.Text = msg2; })); lblaantalGram.Invoke(new EventHandler(delegate { lblaantalGram.Text = msg3; }));
}
25
private void aboutToolStripMenuItem2_Click(object sender, EventArgs e) { (new frmAbout()).ShowDialog(this); } private void helpToolStripMenuItem1_Click(object sender, EventArgs e) { (new frmHelp()).ShowDialog(this); }
26
public partial class frmHelp : Form { public frmHelp() { InitializeComponent(); } private void Help_Load(object sender, EventArgs e) { textBox1.Text = " If you have any questios, please contatct Robbe Vehent at
[email protected]. Please make the subject:
." + "\r\n" + "\r\n" + " Als u Vragen of problemen heeft, contacteer dan Robbe Vehent via [email protected]. Maak wel dat u het onderwerp noemt. "; } private void btnCloseHelp_Click(object sender, EventArgs e) { this.Close(); } }
public partial class frmAbout : Form {
27
public frmAbout() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { this.Close(); } private void frmAbout_Load(object sender, EventArgs e) { tbxAbout.Text = " Ik ben Robbe Vehent, dit programma is een deel van mijn GIP (Geïntegreerde proef). Het programma is geschreven in C# met het programma Microsoft Visual C# 2010 Express. Het is getest op Windows Vista® en Windows 7®. Meer vragen kan je beantwoord krijgen op www.robbevehent.be of op [email protected] . "; } }
private void afsluitenToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); }
28
7. Databladen
7.1 Datasheet PIC 16F877 van Microchip
29
30
8. Bronvermeldingen http://www.circuitsonline.net/forum/view/65301 http://msmvps.com/blogs/coad/archive/2005/03/23/SerialPort_2800_RS_2D00_232-Serial-COM-Port_2900_-in-C_2300_-.NET.aspx http://www.microchip.com
9. Logboek 09/11/2010 -- informatie opzoeken over bruikbare componenten. 16/11/2010 -- keuze maken bruikbare componenten. 24/11/2010 -- opbouw gipdossier + bespreking opdracht. 03/12/2010 -- schrijven aan dossier. 27/12/2010 -- opstellen elektrische schakeling. 11/01/2011 -- uitmeten elektrische kring met voorlopige componenten. 18/01/2011 -- verdere uitmeting elektronische schakeling. 31
21/01/2011 -- Update site: logboek, uitzoeken gepaste elektronische schakeling 26/01/2011 -- begin aan µC programma en flowchart Main. 01/02/2011 -- solderen permanente component en elektronische schakeling met permanente componenten. 04/02/2011 -- werkend maken Olimex bordje met PIC16f877 met ADC programma in. 05/02/2011 -- grote update website. 11/02/2011 -- soehnle weegschaal: begin tekenen van elektrisch schema. 15/02/2011 -- verder tekenen aan elektrisch schema. 02/03/2011 -- schrijven µC programma: RB0 = interrupt; aanpassen dossier. 04/03/2011 -- optimaliseren µC programma 15/03/2011 -- uittesten programma met klok van 1Hz, 10Hz, 100Hz en 1 kHz. 29/03/2011 -- uitesten programma met uitgang van de Soehnle weegschaal. 01/04/2011 -- fout zoeken waarom meting met factor 10 verkeerd is. 08/04/2011 -- fout gevonden factor 10. 11/04/2011 -- volledige uittekening elektrisch schema. 13/04/2011 -- volledige uittekening van elektrisch schema in TINA. 02/05/2011 -- update website. 05/05/2011 -- werken aan seriële communicatie in GUI. 17/05/2011 -- oplossing zoeken voor onder elkaar krijgen van ingelezen data in GUI. 20/05/2011 -- updaten website + verder werken aan inlezing van de data die doorgestuurd is. 24/05/2011 -- Update website (foto about us; links Articles; logboek)
32
33