![]() Als muzikant en bestuurslid van de Koninklijke Harmonie Concordia Tongeren sta ik in voor de besturing van het showspel dat we tijdens onze themaconcerten brengen. Concreet betekent dit de verlichting, de beeldprojecties (afbeeldingen en videobeelden) en het geluid. Om het een en het ander te automatiseren heb ik destijds op basis van de Velleman K8000 interfacekaart een sturing gebouwd waarmee ik het licht geautomatiseerd kon aansturen. De bedoeling was echter ook de beeldprojecties in deze automatisatie op te nemen, en als het even kon ook de bediening van het geluid. Helaas werd de parallelle poort op PC's met de komst van USB al snel verbannen, en werd wegens gebrek aan tijd het project ergens ver in de kast weggestopt. Op een dag vertelde een collega mij tijdens onze middagwandeling over zijn vorderingen die hij maakte met een eigen project. Hij had op een gegeven moment zijn project helemaal over een andere boeg gegooid. Raspberry PI was het wonderwoord. Het duurde niet lang voordat mijn belangstelling werd gewekt. Voor amper 40 EURO kon ik mijn avontuur weer nieuw leven inblazen. En op deze manier heb ik mijn oude liefde voor elektronica weer een stevige boost gegeven. In deze blog wil ik graag mijn vorderingen met jullie delen, maar ook voor mijzelf bewaren. Ik stelde vast dat ik heel wat dingen vergeten was en zeker nadat ik het stuurkastje van mijn oude project had opengeschroefd. Dus gaandeweg zal ik alle stappen hier een beetje toelichten en de gevonden informatie met iedereen delen. Schetsen en notities zal ik inscannen, en dit met of zonder koffievlekken. Oorspronkelijke (oude) opzet |
Het basissysteem bestaat uit meerdere analoog aangestuurde dimmers (0-10V). Deze worden via een telefoniekabel aangestuurd vanuit de control unit. Deze unit kan standalone de dimmers manueel aansturen. Een ingebouwde controller maakt het mogelijk een beperkt aantal lichtstanden op te slaan.
De control unit kan gekoppeld worden aan een PC zodat de mogelijkheden aanzienlijk uitgebreid worden. Enerzijds kunnen de standen van de schuif potentiometers uitgelezen worden zodat de lichtstanden handmatig ingeregeld kunnen worden en met de druk op een toets van de unit opgeslagen in het programma op de PC. Anderzijds kunnen de standen ook via de muis ingesteld worden via het computerscherm.
De control unit kan gekoppeld worden aan een PC zodat de mogelijkheden aanzienlijk uitgebreid worden. Enerzijds kunnen de standen van de schuif potentiometers uitgelezen worden zodat de lichtstanden handmatig ingeregeld kunnen worden en met de druk op een toets van de unit opgeslagen in het programma op de PC. Anderzijds kunnen de standen ook via de muis ingesteld worden via het computerscherm.
De control unit
Op het stuurpaneel treffen we een display aan waarop de nodige informatie wordt getoond om de lichtstanden lokaal in te programmeren. De toetsen Back en Next dienen om te navigeren, en de Enter toets om de opdracht te bevestigen. In Run modus loopt de sturing autonoom, dus zonder PC. De 8 schuifknoppen komen overeen met 8 kanalen. Softwarematig is een uitbreiding naar meerdere banken mogelijk. De draaiknoppen boven de eerste 4 kanalen maakt het mogelijk deze kanalen te voorzien van een lichtorgel. Ieder orgelkanaal heeft een eigen werkfrequentie. De binnenkant L.O.: 4 kanaals lichtorgel Filter: galvanische scheiding richting geluidsapparatuur M.P.: analoge multiplexer voor het uitlezen van de schuifpotentiometers via 1 ADC K8001: besturingsmodule van Velleman K8000: I2C interfacekaart van Velleman De software Deze userinterface werd geschreven in VB6. Belangrijkste kenmerken: - 8 kanalen - stappenrecorder - geïntegreerd 8 kanaals lichtorgel - patroon sturing - fade in/out (slope sturing) - position recorder - audio spectrum analyser |
de Raspberry PI opent nieuwe mogelijkheden...
Wel erg klein die Raspberry, dacht ik meteen. Even een TV met HDMI erbij gehaald, een muis en keyboard in 2 van de 4 USB poorten. En dan even de power inpluggen. Eh, neen er ontbrak nog de nodige software die je op een mini SD kaartje dient in te schuiven. Dus eerst even surfen naar de website van Raspberry: https://raspberrytips.nl/raspberry-pi-installeren/
Ik was behoorlijk aangenaam verrast toen ik al heel snel het zaakje aan de praat kreeg. Gewoon geweldig wat er allemaal op dat kleine kaartje zit.
Ik was behoorlijk aangenaam verrast toen ik al heel snel het zaakje aan de praat kreeg. Gewoon geweldig wat er allemaal op dat kleine kaartje zit.
Ik koos voor de volgende installaties:
- Rasbian-Jessie
- Etcher op mijn PC voor het 'branden' van de SD
- Alle updates
- node.js LTS 4.x
- Node-RED
Bezorgdheid
De GPIO (General Purpose Input/Output) pennen kennen een spanningsbereik van 0V en +3.3V. De meeste apparaten zoals ondermeer de K8000 werken op een TTL niveau. En volgens de documentatie zou het aanleggen van 5 Volt op een ingang de poort meteen beschadigen.
De GPIO (General Purpose Input/Output) pennen kennen een spanningsbereik van 0V en +3.3V. De meeste apparaten zoals ondermeer de K8000 werken op een TTL niveau. En volgens de documentatie zou het aanleggen van 5 Volt op een ingang de poort meteen beschadigen.
Bron: http://www.mosaic-industries.com/
De communicatie met de K8000 verloopt via een I2C verbinding. Deze verbinding verloopt over 2 lijnen, een klok lijn (SCL) en een bidirectionele data lijn (SDA). In eerste instantie dacht ik de optische verbindingen (optocouplers) te gebruiken die op de K8000 aanwezig zijn. Maar al vlug merkte ik dat de SDA isolatie omwille van de beperkingen van printerpoorten, waarvoor deze oorspronkelijk voor bedoeld was, niet bidirectioneel was opgezet. De SDA lijn wordt naar de buitenwereld omgezet naar 2 lijnen (RX en TX).
De communicatie met de K8000 verloopt via een I2C verbinding. Deze verbinding verloopt over 2 lijnen, een klok lijn (SCL) en een bidirectionele data lijn (SDA). In eerste instantie dacht ik de optische verbindingen (optocouplers) te gebruiken die op de K8000 aanwezig zijn. Maar al vlug merkte ik dat de SDA isolatie omwille van de beperkingen van printerpoorten, waarvoor deze oorspronkelijk voor bedoeld was, niet bidirectioneel was opgezet. De SDA lijn wordt naar de buitenwereld omgezet naar 2 lijnen (RX en TX).
Eerste poging:Opzoek naar een schakeling voor een bidirectionele optocoupling kwam ik op de volgende website terecht:
http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/frequently-asked-questions/i2c-faq.html
Uit een eerste manuele test waarbij de ingang even naar grond werd gekoppeld bleek meteen dat de uitgangsspanning aan de andere zijde niet ver genoeg naar beneden zakte (3V). Om dit op te lossen heb ik aan iedere zijde een diode toegevoegd:
http://www.esacademy.com/en/library/technical-articles-and-documents/miscellaneous/i2c-bus/frequently-asked-questions/i2c-faq.html
Uit een eerste manuele test waarbij de ingang even naar grond werd gekoppeld bleek meteen dat de uitgangsspanning aan de andere zijde niet ver genoeg naar beneden zakte (3V). Om dit op te lossen heb ik aan iedere zijde een diode toegevoegd:
Tweede poging:Het signaal gaat nu mooi naar beneden tot onder 0.8V en zou herkend moeten worden als een LOW. Toch blijkt de verbinding niet te lukken. Dan maar de oscilloscope aangesloten. De signalen aan de GPIO zonder optocoupler zijn mooi van vorm en behoorlijk hoog in baudrate. Bij het aansluiten van de optocoupler ziet het plaatje er heel wat minder fraai uit. Dus toch even de schakeling weer in vraag stellen. Om het een en het ander na te meten is het handig om te werken met een signaalgenerator. Helaas geen toestel meer voorhanden. Ik heb enige tijd terug, gezien ik mijn elektronica hobby had stop gezet, ook een aantal oude zelfbouwprojecten afgedankt. De soundcard van mijn laptop kan hier goed dienst doen als signaalgenerator. http://www.nch.com.au/tonegen/
Even aansluiten en de mooie sinus even doorsturen naar een versterkertrapje. De blokgolf van 0 tot +3.3V met een frequentie van ongeveer 22KHz aan één zijde van de schakeling, en de scope aan beide zijden aangesloten.
Meteen viel al een behoorlijke faseverschuiving op. Aan wat kan dit liggen. Een beetje naslagwerk over de optocoupler leert mij meteen dat we te maken hebben met een ton = 5µsec en toff=15µsec wat ook mooi overeenstemt met het plaatje van de oscilloscope. Dus terug op zoek naar een nieuwe oplossing;Derde keer goede keer...Blijkbaar bestaan er nieuwe componenten (voor mij toch alleszins) waarbij de scheiding capacitief wordt doorgevoerd. Meer hierover via deze link: http://www.ti.com/lit/ds/symlink/iso1540.pdf Maar toch even verder denken, wat was mijn oorspronkelijke doelstelling? het wegwerken van het risico dat 5Volt geïnjecteerd geraakt in de ingangspoort van de Raspberry. Een echte isolatie is hiervoor eigenlijk niet nodig. Ik werd een beetje op dit pad geraakt omdat de K8000 van optocouplers voorzien is. Eigenlijk volstaat het te vermijden dat de spanning van de 5V zijde terug naar de ingang wordt gekoppeld. Dit kunnen we oplossen met een schakeling die in het engels 'bidirectional voltage level shifter' heet. Vrij vertaald, een bidirectionele spanningsniveau verschuiver. Meer hierover vind je terug op https://www.eeweb.com/company-blog/nxp/level-shifting-techniques-in-i2c-bus-design

Met enkele componenten die zelfs nog op zolder liggen was deze schakeling snel gebouwd. De werking is als volgt:
In rusttoestand wordt de linkerzijde via Rp naar +3.3Volt getrokken, en de rechterzijde naar +5.5Volt.
Geen enkel onderdeel trekt de spanning naar beneden en de gate en source staan beiden op het zelfde niveau, dus de Vgs spanning is te laag waardoor de MOS-FET niet geleid. Dus de 5 Volt geraakt niet naar links.
Toestand 2: aan de linkerzijde wordt de lijn naar beneden getrokken door een onderdeel. Daardoor daalt de source spanning en stijgt dus de drempelspanning Vgs waardoor de MOS-FET gaat geleiden. Hierdoor zal ook de rechterzijde naar beneden getrokken worden, en is het lage signaal ook aan de rechterzijde overgedragen.
Toestand 3: aan de rechterzijde wordt de spanning naar beneden getrokken. De drain spanning wordt lager dan de source spanning, en de inwendige diode die gevormd wordt door de drain substraat gaat geleiden en trekt zo de source spanning mee naar beneden. Zodra deze spanning voldoende is gedaald t.o.v. de gate spanning gaat de MOS-FET weer geleiden en wordt de linkerzijde ook volledig naar beneden getrokken.
Het resultaat op de oscilloscoop ziet er alvast veel belovend uit.
In rusttoestand wordt de linkerzijde via Rp naar +3.3Volt getrokken, en de rechterzijde naar +5.5Volt.
Geen enkel onderdeel trekt de spanning naar beneden en de gate en source staan beiden op het zelfde niveau, dus de Vgs spanning is te laag waardoor de MOS-FET niet geleid. Dus de 5 Volt geraakt niet naar links.
Toestand 2: aan de linkerzijde wordt de lijn naar beneden getrokken door een onderdeel. Daardoor daalt de source spanning en stijgt dus de drempelspanning Vgs waardoor de MOS-FET gaat geleiden. Hierdoor zal ook de rechterzijde naar beneden getrokken worden, en is het lage signaal ook aan de rechterzijde overgedragen.
Toestand 3: aan de rechterzijde wordt de spanning naar beneden getrokken. De drain spanning wordt lager dan de source spanning, en de inwendige diode die gevormd wordt door de drain substraat gaat geleiden en trekt zo de source spanning mee naar beneden. Zodra deze spanning voldoende is gedaald t.o.v. de gate spanning gaat de MOS-FET weer geleiden en wordt de linkerzijde ook volledig naar beneden getrokken.
Het resultaat op de oscilloscoop ziet er alvast veel belovend uit.
YESSSSSAls ultieme test heb ik de schakeling tussen de Raspberry en de K8000 interface geplaatst. En bingo, de I2C onderdelen van de K8000 werden herkend!
Op deze experimenteer print is onderstaande schakeling opgebouwd. Beneden links komen de I2C signalen van de Raspberry pi toe en worden via de voltage level shifter omgezet naar een 5V I2C verbinding. Via de blauwe printconnector staat dit I2C signaal beschikbaar voor andere schakelingen zoals onder meer de K8000. Via J2 worden 4 adres bits aangevoerd van de K8000 (4 outputs). Met deze 4 bits wordt een demultiplexer aangestuurd zodat we 16 uitgangen afzonderlijk kunnen aanspreken. De schakeling is zo uitgevoerd dat alle 16 uitgangen standaard H(oog) staan, en dat de geadresseerde poort L(aag) staat, waardoor ook het respectievelijk ledje gaat branden. Van de 16 poorten gebruik ik nu 12 poorten om de 12 DAC's aan te sturen. Meer over de aansturen van de DAC's later.
Voorbereiding van de DAC's (MCP4725
Deze DAC's I2C adressering bestaat uit een device code (1100) gevolgd door 3 bits waarvan de eerste 2 door de fabrikant worden gebrand en de laatste toegankelijk is via een pen van de chip. M.a.w. we kunnen zelf maar 2 verschillende adressen toewijzen. De geleverde DAC's hebben volgend adres meegekregen: 1100 01x waarbij x op de print bepaald wordt door een soldeerbrugje dat naar de GND is verbonden, dus een logische 0. Door dit brugje te verwijderen, en de adres pen te verbinden met de demultiplexer, krijgt de geselecteerde DAC adres 98 (1100 010) aangezien de geadresseerde poort van de demultiplexer op L of 0 staat.
Het los solderen is geen probleem als je gebruik maakt van desoldeerlint. Het aanbrengen van een draadje is wat moeilijker. Het is moeilijk een draadje te bevestigen op het middelste eilandje dat verbonden is met de adrespen van de chip. Ik koos ervoor het kabeltje op het printbaantje aan te brengen. Dus eerst met een freesje voorzichtig de lak verwijderen en dan wat soldeertin aanbrengen. Vervolgens het kabeltje voorzichtig vast solderen. |
Aan de andere zijde van het printje zitten twee brugjes die de pull-up weerstandjes van de CLS en CDA lijnen met de voedingspanning verbinden. Daar de Voltage level shifter reeds is uitgevoerd met pull-ups, zouden 12 bijkomende pull-ups de lijn te sterk belasten. Dus deze kleine brugjes dienen ook verwijderd te worden. Dit kan best met een vergrootglas, veel licht en een breekmesje.
|
Voor het aanbrengen van de printpennen bleken krokodillenklemmen een goede ondersteuning.
Deze eerste test wordt vertoond via onderstaande video en bevat 3 delen.
- Het aansturen van de K8000 via het I2C protocol om zo 4 adres bits aan te sturen van de demultiplexer op de DAC kaart. Op de tablet wordt via het dashboard van node-red een kanaal gekozen. Op de video zie je de LED's wijzigen.
- Het gekozen adres (4bits) sturen de demultiplexer op de DAC aan. Je ziet de respectievelijke LED van het gekozen kanaal oplichten.
- Het laatste beeld op de video toont dat de slider op de tablet de uitgangsspanning van het gekozen kanaal stuurt van 0 tot 5 Volt
De node-red flow is zeer eenvoudig:
[{"id":"cd64b6f8.78fe58","type":"tab","label":"Flow 1"},{"id":"5f059c1.0354264","type":"i2c out","z":"cd64b6f8.78fe58","name":"test","i2cdevice":"b94f5978.78b0a8","address":"56","command":"","payload":"","count":"1","x":502,"y":138,"wires":[]},{"id":"1ac678dc.b2dc37","type":"i2c out","z":"cd64b6f8.78fe58","name":"","i2cdevice":"b94f5978.78b0a8","address":"98","command":"","payload":"","count":"0","x":487,"y":231,"wires":[]},{"id":"73d98058.88b46","type":"ui_numeric","z":"cd64b6f8.78fe58","name":"kanaal","label":"kanaal","group":"30ea9b8e.4f9a44","order":0,"width":0,"height":0,"passthru":true,"topic":"","format":"{{value}}","min":0,"max":"15","step":"1","x":74,"y":138,"wires":[["5f059c1.0354264"]]},{"id":"cfeb0102.279e3","type":"i2c in","z":"cd64b6f8.78fe58","name":"","i2cdevice":"b94f5978.78b0a8","address":"98","command":"","count":"6","x":260,"y":439,"wires":[["2e2aa211.9ab35e","6fb66054.607f5"]]},{"id":"f7cafb0f.cb7348","type":"debug","z":"cd64b6f8.78fe58","name":"","active":true,"console":"false","complete":"payload","x":488,"y":332,"wires":[]},{"id":"2e2aa211.9ab35e","type":"ui_text","z":"cd64b6f8.78fe58","group":"30ea9b8e.4f9a44","order":0,"width":0,"height":0,"name":"","label":"text","format":"{{msg.payload}}","layout":"row-spread","x":466,"y":518,"wires":[]},{"id":"6c388a51.55baf4","type":"inject","z":"cd64b6f8.78fe58","name":"","topic":"","payload":"[0,5,137]","payloadType":"json","repeat":"","crontab":"","once":false,"x":99,"y":329,"wires":[["f7cafb0f.cb7348","cfeb0102.279e3"]]},{"id":"6fb66054.607f5","type":"debug","z":"cd64b6f8.78fe58","name":"","active":true,"console":"false","complete":"false","x":478,"y":439,"wires":[]},{"id":"a31a8137.ab2d2","type":"ui_slider","z":"cd64b6f8.78fe58","name":"","label":"slider","group":"30ea9b8e.4f9a44","order":0,"width":0,"height":0,"passthru":true,"topic":"","min":0,"max":"4095","step":1,"x":77,"y":231,"wires":[["4cec83c6.d892ac"]]},{"id":"4cec83c6.d892ac","type":"function","z":"cd64b6f8.78fe58","name":"","func":"var lsb;\nvar msb=msg.payload/256;\nmsb=Math.floor(msb);\nlsb=msg.payload-(msb*256);\nvar commando={payload:[0,msb,lsb]};\nreturn [commando];","outputs":1,"noerr":0,"x":230,"y":231,"wires":[["1ac678dc.b2dc37"]]},{"id":"b94f5978.78b0a8","type":"i2c-device","z":"","device":"/dev/i2c-1","address":"1"},{"id":"30ea9b8e.4f9a44","type":"ui_group","name":"Group 1","tab":"42fd3a8a.67b724","order":1,"disp":true,"width":6},{"id":"42fd3a8a.67b724","type":"ui_tab","z":"","name":"Home","icon":"dashboard"}]
Omzetting van de waarde naar de I2C stuurcode van de MCP4725 DAC
Eerste VB.NET programma In tegenstelling tot VB6 beschik je in VB.NET ,iet over een component WINSOCK, dus maar eerst even google raadplegen. Er staan heel wat voorbeeldcodes ter beschikking. Uiteraard eerst even onderzoeken wat de opties zijn binnen de beschikbare nodes van Node-red. Er is een server Socket beschikbaar: node-red-contrib-socketio. Na een vlotte installatie en een eerste testrun liep het helemaal mis. Plots kon ik node-red niet meer opstarten. Uiteindelijk heeft een uninstall van socketio en heel wat opruimwerk binnen node-red het spel weer aan de gang gekregen. Vanaf toe heb ik maar wijselijk besloten de node-red zijde als client op te zetten.
Gezien mijn beperkte kennis van SOCKET handeling in VB.NET ben ik aangewezen op het internet om naar voorbeeld code te zoeken. Dit bleek echter moeilijker dan verwacht. De meeste voorbeelden van een server configuratie (listener) zijn gebaseerd op het ontvangen van data, waard dat ik net data wil verzenden. Daar bovenop zijn de voorbeelden soms voorzien met heel wat extra's, die de werking voor niet meteen duidelijk maken. Uiteindelijk heb ik een klein programma geschreven dat de stand van een slider doorgeeft aan node-red (op de raspberry pi) via het thuisnetwerk. Noder-red toont het resultaat vervolgens via het dashboard op mijn tablet.
De gebruikte code:Imports System
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports Microsoft.VisualBasic
Public Class Form1
Public Contact As Boolean
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object,
ByVal e As System.ComponentModel.DoWorkEventArgs) _
Handles BackgroundWorker1.DoWork
Static server As TcpListener
server = Nothing
Try
Static port As Int32 = 1314
Static localAddr As IPAddress = IPAddress.Parse("127.0.0.1")
server = New TcpListener(Net.IPAddress.Any, 1314)
server.Start()
Static client As TcpClient = server.AcceptTcpClient()
Contact = True
Static bytes(1024) As Byte
Static data As String = Nothing
data = Nothing
Static stream As NetworkStream = client.GetStream()
data = "0;"
Static msg As Byte() = System.Text.Encoding.ASCII.GetBytes(data)
While Contact = True
Threading.Thread.Sleep(100)
data = Label2.Text
msg = System.Text.Encoding.ASCII.GetBytes(data)
stream.Write(msg, 0, msg.Length)
End While
Catch ex As Exception
End Try
server.Stop()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Label1.Text = "NOT Connected!"
Contact = False
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Timer1.Enabled = True
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
Contact = False
End Sub
Private Sub Button3_Click_1(sender As Object, e As EventArgs) Handles Button3.Click
Label2.Text = TextBox1.Text + ";"
End Sub
Private Sub Slider1_Scroll(sender As Object, e As EventArgs) Handles Slider1.Scroll
Label2.Text = Slider1.Value & ";"
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If Contact = True Then Label1.Text = "Connected!" Else Label1.Text = "NOT connected!"
End Sub
End Class
Imports System.IO
Imports System.Net
Imports System.Net.Sockets
Imports System.Text
Imports Microsoft.VisualBasic
Public Class Form1
Public Contact As Boolean
Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object,
ByVal e As System.ComponentModel.DoWorkEventArgs) _
Handles BackgroundWorker1.DoWork
Static server As TcpListener
server = Nothing
Try
Static port As Int32 = 1314
Static localAddr As IPAddress = IPAddress.Parse("127.0.0.1")
server = New TcpListener(Net.IPAddress.Any, 1314)
server.Start()
Static client As TcpClient = server.AcceptTcpClient()
Contact = True
Static bytes(1024) As Byte
Static data As String = Nothing
data = Nothing
Static stream As NetworkStream = client.GetStream()
data = "0;"
Static msg As Byte() = System.Text.Encoding.ASCII.GetBytes(data)
While Contact = True
Threading.Thread.Sleep(100)
data = Label2.Text
msg = System.Text.Encoding.ASCII.GetBytes(data)
stream.Write(msg, 0, msg.Length)
End While
Catch ex As Exception
End Try
server.Stop()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Label1.Text = "NOT Connected!"
Contact = False
End Sub
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Timer1.Enabled = True
BackgroundWorker1.RunWorkerAsync()
End Sub
Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
Contact = False
End Sub
Private Sub Button3_Click_1(sender As Object, e As EventArgs) Handles Button3.Click
Label2.Text = TextBox1.Text + ";"
End Sub
Private Sub Slider1_Scroll(sender As Object, e As EventArgs) Handles Slider1.Scroll
Label2.Text = Slider1.Value & ";"
End Sub
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
If Contact = True Then Label1.Text = "Connected!" Else Label1.Text = "NOT connected!"
End Sub
End Class


























