Forum: PC-Programmierung Versuche mit FTDI Relais Board


von Severin F. (s_fr)


Lesenswert?

Hallo zusammen!

Ich Programmiere schon eine ganze weile in VB2010 aber jetzt möchte ich 
zum ersten mal Hardwareprogrammierung versuchen.

Habe mir dazu ein 4-Kanal USB Relaisboard gekauft (FTDI) es gibt dazu 
auch beispiele aber alle in VB6 oder früher

Kennt vielleicht von euch jemand Tutorials die VB2010 und USB 
Programmierung betreffen?


Mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Du brauchst keine USB-Programmierung, denn die FTDI-Bausteine können 
über den dazugehörigen Devicetreiber exakt so wie /serielle 
Schnittstellen/ angesprochen werden.

Reicht das nicht, gibt es auch noch von FTDI eine 
DLL-Programmierschnittstelle, die Dir weitere Möglichkeiten gibt.

Aber mit USB-Programmierung hast Du in beiden Fällen nichts zu tun.

von Severin F. (s_fr)


Lesenswert?

Erstmals vielen dank für die schnelle Antwort!

Und gibt es eine Anleitung wie ich die Schnittstelle anspreche? Also 
Beispielcodes oder dergleichen?


mfg

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Mit dem Stichworten "VB.net serial port programming" sollte sich was 
finden lassen.

Dein Relaisboard wird ja auch nicht komplett ohne Dokumentation gekommen 
sein, oder?

von Severin F. (s_fr)


Lesenswert?

Doch ist komplett ohne Anleitung gekommen. Port öffnen ist mittlerweile 
kein Problem mehr, aber das schreiben macht noch probleme also das 
ansteuern der Relais. Weil ich das ganze Prinzip davon noch nicht 
wirklich verstehe

von Sven L. (sven_rvbg)


Lesenswert?

Da das Gerät wie schon geschrieben wurde als virtueller COM-Port zu 
Verfügung steht, kannst Du grundsätzlich mal mit einem Programm wie 
Putty versuchen die Relais anzusteuern, dann weisst Du auch welche 
Befehle Du senden musst.

Da Du nicht gesagt hast, welche Karte genau und wo es Beispiele inn VB6 
dazu gibt ist das alles Stochern im Nebel

von Sebastian S. (amateur)


Lesenswert?

Würde mich wundern, wenn Du mit Vor- und Nachname der Hardware, bzw. des 
Herstellers, im Internet, nicht Treiber- und Schnittstellenbeschreibung 
finden würdest.

Sollten die Hersteller, was ich nicht glaube, totale Geheimniskrämer 
sein, so sollte der Name des verwendeten Chips ausreichen. Normalerweise 
sprichst Du den Chip von FTDI an und kein Relais.

Wahrscheinlich sind andere Hersteller nicht so verschlossen. Die haben 
vielleicht eine andere Anzahl an Relais auf ihrer Hardware. Das Prinzip 
sollte aber immer gleich sein, da es auf einem Treiber des Herstellers 
basiert.

Übrigens: In vielen Fällen sind die Treiber bereits installiert, da in 
diesem Bereich FTDI groß geschrieben wird.

von Severin F. (s_fr)


Lesenswert?

Also ich bin jetzt Prinzipiell schon einen Schritt weiter, der 
Hersteller hat mir die Commands gesendet, jedoch funktionieren diese 
nicht, oder was wahrscheinlicher ist, ich mache etwas falsch.


Die Commands:
K1
ON: (DEC: 255,1,1)   <- Funktioniert
OFF: (DEC: 255,1,0)  <- Funktioniert Nicht

K2
ON: (DEC: 255,2,1)   <- Funktioniert Nicht
OFF: (DEC: 255,2,0)  <- Funktioniert Nicht

K3
ON: (DEC: 255,3,1)   <- Funktioniert Nicht
OFF: (DEC: 255,3,0)  <- Funktioniert Nicht

K4
ON: (DEC: 255,4,1)   <- Funktioniert Nicht
OFF: (DEC: 255,4,0)  <- Funktioniert Nicht



Angesprochen wird das ganze über den SerialPort:
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click
        Dim bytearray() As Byte = {255, 1, 1}
        SerialPort1.Write(bytearray, 0, bytearray.Length)
    End Sub


Mache ich etwas bei meinem Code falsch oder stimmen die Commands nicht?


Hersteller FTDIChip (SainSmart) FT245RL

SerialPort Einstellungen:

BaudRate: 9600
DataBits: 8
DiscardNulle: False
DTREnable: False
Handshake: None
Parity: None
ParityReplace: 63
PortName: COM3
ReadBufferSize: 4096
ReadTimeOut: -1
ReceivedByte: 1
RTSEnable: False
StopBits: One
WriteBufferSize: 2048
WriteTimeout: -1

: Bearbeitet durch User
von Sebastian S. (amateur)


Lesenswert?

Sind das "echte" ASCII-Zeichenfolgen, seriell verschickt?
-Möglicherweise fehlt der Zeilenumbruch am Ende,
-oder er darf nicht angehängt werden,
-oder man spricht UNIX.

von Severin F. (s_fr)


Lesenswert?

Was heißt "echte" ASCII Zeichenfolgen?

von Karl H. (kbuchegg)


Lesenswert?

Severin F. schrieb:
> Was heißt "echte" ASCII Zeichenfolgen?

schieb mal im Original rüber, was der Hersteller dir gegeben hat.
Du hast auch weiter oben erwähnt, dass es Beispiele in VB6 gäbe. Da kann 
man ja auch mal reinsehen, wie das dort gemacht wird.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Sebastian S. schrieb:
> Sind das "echte" ASCII-Zeichenfolgen, seriell verschickt?
glaub ich eher nicht. Kein Mensch wäre so dämlich, ein Kommado "Set 
Relais Ausgang" mit einer Zahl zu codieren anstatt einem Buchstaben.
Das wird schon eine echte Binärübertragung sein.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Severin F. schrieb:
> es gibt dazu auch beispiele aber alle in VB6

Sieh Dir halt diese Beispiele an. VB6-Code lässt sich mit etwas 
Gehirnschmalz auch in VB.net-Code übersetzen.

von Bastello (Gast)


Lesenswert?

Ich habe auch eine Relaiskarte mit FTDI_Chip.
Da musste ein ByteArray mit zwei Feldern übertragen werden, wobei immer 
nur das erste Byte benutz wurde. Warum auch immer (vielleicht, weil ich 
eine Karte mit 4 Relais hatte, es vom Hersteller aber auch karten mit 8 
Relais gab).

Auf jeden Fall sah so die Funktion zum ein-/ausschalten der einzelnen 
Relais aus (in C# - sollte sich aber einfach an VB.NET anpassen lassen):
1
private void setRelais(int number, bool on) {
2
      switch (number) { 
3
        case 0:
4
          if (on == true)
5
          {
6
            sentBytes[0] = (byte)(sentBytes[0] | 2);
7
          }
8
          else {
9
            sentBytes[0] = (byte)(sentBytes[0] & 253);
10
          }
11
          break;
12
        case 1:
13
          if (on == true)
14
          {
15
            sentBytes[0] = (byte)(sentBytes[0] | 8);
16
          }
17
          else {
18
            sentBytes[0] = (byte)(sentBytes[0] & 247);
19
          }
20
          break;
21
        case 2:
22
          if (on == true)
23
          {
24
            sentBytes[0] = (byte)(sentBytes[0] | 32);
25
          }
26
          else {
27
            sentBytes[0] = (byte)(sentBytes[0] & 223);
28
          }
29
          break;
30
        case 3:
31
          if (on == true)
32
          {
33
            sentBytes[0] = (byte)(sentBytes[0] | 128);
34
          }
35
          else {
36
            sentBytes[0] = (byte)(sentBytes[0] & 127);
37
          }
38
          break;
39
      }
40
      myFtdiDevice.Write(sentBytes, 1, ref receivedBytes);
41
    }

Sieht so wie ich das sehe ähnlich dem aus, was deine Karte erwartet...

von Severin F. (s_fr)


Angehängte Dateien:

Lesenswert?

Also vom Verkäufer habe ich das erhalten, was im Anhang steckt. Darunter 
befindet sich auch die Datei USB 8 Relay Manager v.1.4.exe

Man öffnet das Programm klickt auf OPEN RELAY BOARD und dann gehts los. 
Funktioniert einwandfei!

Ich schreibe in Vb.net folgendes Programm für Relais 1:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As 
System.EventArgs) Handles Button1.Click

        SerialPort1.Open()
        Dim b As Byte() = {1}
        SerialPort1.Write(b, 0, b.Length)
        SerialPort1.Close()

    End Sub

Das ganze also mein Programm funktioniert aber NUR wenn ich vorher in 
der Datei: USB 8 Relay Manager v.1.4.exe auf OPEN RELAY BOARD geklickt 
habe, dann kann ich alles an das Board senden was ich will. Mache ich 
das nicht funktioniert gar nichts ich bekomme auch keine Fehlermeldung.

Muss ich noch etwas anderes tun ausser den Port zu öffnen?

Ich habe wirklich nur die paar Codezeilen die ich hier gepostet habe.

Serialport Einstellungen:
BaudRate: 9600
DataBits: 8
DiscardNulle: False
DTREnable: False
Handshake: None
Parity: None
ParityReplace: 63
PortName: COM3
ReadBufferSize: 4096
ReadTimeOut: -1
ReceivedByte: 1
RTSEnable: False
StopBits: One
WriteBufferSize: 2048
WriteTimeout: -1

Ich hoffe es kann mir jemand helfen

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Severin F. schrieb:
> Muss ich noch etwas anderes tun ausser den Port zu öffnen?

Scheint so.

Sieh doch mal mit Portmon nach, was das "relay manager"-Programm 
anstellt, und vergleiche das mit dem, was Dein Programm macht.

von Rene Z. (renezimmermann)


Lesenswert?

Hallo,

wenn da nicht nur ein FTDI drauf ist kann ich vielleicht helfen.
Wie wäre es mit einem Bild von beiden Seiten?
Bei meinen Relaiskarten wird immer ein Byte gesendet.

Jedes Bit eines Bytes steht für ein Relais. Ist es gesetzt zieht das 
Relais an wenn nicht ist es abgefallen.

Bin 00000001 = Hex 01 = Dec 01
Bin 00000010 = Hex 02 = Dec 02
Bin 00000100 = Hex 03 = Dec 04
Bin 00001000 = Hex 08 = Dec 08
Bin 00010000 = Hex 10 = Dec 16
Bin 00100000 = Hex 20 = Dec 32
Bin 01000000 = Hex 40 = Dec 64
Bin 10000000 = Hex 80 = Dec 128

Will man Relais 1 und 5 einschalten so sendet man 00010001. Bit 5 und 1 
sind gesetzt. Bin 00010001 = Hex 11 = Dec 17. Jetzt brauch man nur noch 
ein wenig Bitmanipulation und fertig.

wert = wert or (oder) Maske setzt das entsprechende Bit,
wert = wert and (und) not (negieren) Maske löscht es.

Ich denke bei dir stimmt die Baudrate, Parity, Anzahl Stopbits nicht.
Oder ich liege total daneben und die Relais hängen an den CBUSxx 
Anschlüssen. Dagegen spricht aber dein Code:
1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
2
   SerialPort1.Open()
3
   Dim b As Byte() = {1}
4
   SerialPort1.Write(b, 0, b.Length)
5
   SerialPort1.Close()
6
End Sub
Wie gesagt Bilder könnten helfen.

>Hersteller FTDIChip (SainSmart) FT245RL
Oh man das habe ich übersehen! Damit sollte dann klar sein das jedes 
Byte was gesendet wird den Zustand der Relais ändert. Jetzt braucht man 
nur noch die Zuordnung der Ausgänge zu den Relais. Mich würde es wundern 
wenn die vertauscht sind. Also Bit 1 Relais 1 usw. Baudrate etc. ist 
dann völlig egal.

Auch sehe ich in deinem Code kein
1
SerialPort1.PortName = "COM1"    // 1,2,3,4, ....
Dir ist schon klar das es mehr wie eine serielle Schnittstelle geben 
kann?

Also Schnittstelle öffnen und genau ein Byte senden und sofort wieder 
schließen damit die Bytes auch gesendet werden und nicht im Sendebuffer 
verhungern.

Gruß Rene

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.