Forum: Mikrocontroller und Digitale Elektronik Schnittstelle Arduino Software


von Feuerwerkszündanlage mit Arduino (Gast)


Lesenswert?

Hallo liebe Gemeinde!

Will mir ne voll programmierbare Feuerwerkszündanlage aufbauen.

Als Sw. auf dem Laptop bietet mir PyroingnitionControll eine gute Basis.

Allerdings ein "Gründschnabel" in der Digitaltechnik.

Die Verbindung erfolgt per RS 485

Das Standart Protokoll von PIC. schaut so aus:


255 AA BB CCC

255: Startbedingung
AA: Zündkanal
BB: Verteiler (Zündmodul ID)
CCC: CRC8 Checksumme

Also:
1111 1111 Alle Module "horchen" zu
0000 0001 Kanal 1 wird angesprochen
0000 0010 Zündmodul 2 zündet wenn die Checksumme paast?
1111 1111 Checksumme?

Richtig so?

Wenn ich falsch liege bin ich über hilfreiche Tipps dankbar!

Wie sollte das C-Programm für den Arduino ausschauen?

Und die Ansteuerung für die FET´S:

Werden die Pull-Up und Pull-Down Widerstände bei einem Logic Fet 
benötigt?

Der FET sollte auch auf jeden Fall "High" Aktiv geschalten sein nicht 
das alle Zündungen ausgelöst werden wenn der Duino aus irgend einem 
Grund abschalten oder alle Ausgänge auf null gesetzt werden.

Low Aktiv macht für mich keinen Sinn
Richtig so?



Muss nicht für diesen Silvester fertig sein!

Anforderungen an das System:

8 Module (Erweiterbar) mit jeweils 40 Kanälen


Danke im Voraus!

Gruss

Daniel

von Karl H. (kbuchegg)


Lesenswert?

Feuerwerkszündanlage mit Arduino schrieb:
> Hallo liebe Gemeinde!
>
> Will mir ne voll programmierbare Feuerwerkszündanlage aufbauen.
>
> Als Sw. auf dem Laptop bietet mir PyroingnitionControll eine gute Basis.
>
> Allerdings ein "Gründschnabel" in der Digitaltechnik.
>
> Die Verbindung erfolgt per RS 485
>
> Das Standart Protokoll von PIC. schaut so aus:
>

Standard.
Das hat nichts mit der Kunst (=engl. "Art") zu stehen (to stand) zu tun. 
Oder der Kunst einen Verkaufsstand zu betreiben.

> 255 AA BB CCC
>
> 255: Startbedingung
> AA: Zündkanal
> BB: Verteiler (Zündmodul ID)
> CCC: CRC8 Checksumme
>
> Also:
> 1111 1111 Alle Module "horchen" zu

Fast.
Es ist eher so, dass alle Module gleichgültig bleiben, egal was auf der 
Schnittstelle reinkommt. Erst wenn sie dieses 0xFF sehen, 'denkt' sich 
der µC: Holla die Waldfee, jetzt gehts los; das nächste Byte wird mir 
sagen, ob ich gemeint bin oder nicht.

> 0000 0001 Kanal 1 wird angesprochen
> 0000 0010 Zündmodul 2 zündet wenn die Checksumme paast?
> 1111 1111 Checksumme?

Das wäre ein grossartiger Zufall, wenn die Checksumme ausgerechnet 0xFF 
ergeben würde. Die Checksumme dient dir als Bestätigung, dass die 
Übertragung einigermassen zuverlässig fehlerfrei war.

> Wie sollte das C-Programm für den Arduino ausschauen?

Das Programm arbeitet grundsätzlich in einem von 2 Modi
* entweder es ist passiv. In diesem Modus holt es 1 Byte von der 
Schnittstelle ab, wenn eines da ist. Der Inhalt des Bytes interessiert 
aber nicht weiter. Mit einer Ausnahme. Wenn das Byte den Wert 0xFF (=255 
dezimal) hat, dann wird in den anderen Modus geschaltet
* in diesem Modus ist das Programm soweit aktiv, dass es sich ein auf 
der Schnittstelle einlangendes Byte holt und auch auswertet. Dabei zählt 
das Programm mit, das wievielte Byte das war. Das erste Byte nach dem 
Umschalten in den Modus ist die Kanalnummer, das 2. Byte ist das 
Zündmodul und das 3.te Byte ist die Checksumme.

Ist das Programm im 'aktiv' Modus beim 3.ten Byte angelangt, dann wird 
verglichen, ob dieser Ardunio damit gemeint war und wenn ja, wird die 
Aktion ausgeführt. War dieser Arduino nicht gemeint, dann passiert eben 
nichts. Anschliessend geht das Programm wieder in den passiven Modus aus 
dem es dann der Empfang eines 0xFF wieder in den aktiven Modus schaltet

ungefähr so
1
uint8_t inMsg; 
2
uint8_t byteCount;
3
uint8_t channel;
4
uint8_t modul;
5
uint8_t checksum;
6
7
...
8
9
void setup()
10
{
11
  ...
12
  inMsg = FALSE;
13
}
14
15
void loop()
16
{
17
  if( serial.available() > 0 ) {     // gibt es an der Schnittstelle was?
18
19
    uint8_t receivedByte = serial.read();
20
21
    if( !inMsg ) {   // sind wir passiv?
22
      if( receivedByte == 0xFF ) {     // holla die Waldfee!
23
        byteCount = 0;                 // noch nichts empfangen
24
        inMsg = TRUE;                  // und in aktiven Modus schalten
25
      }
26
    } 
27
28
    else {           // wir sind aktiv. Das empfangene Byte erst mal speichern
29
      if( byteCount == 0 )
30
        channel = receivedByte;
31
      else if( byteCount == 1 )
32
        modul = receivedByte;
33
      else if( byteCount == 2 )
34
        checksum = receivedByte;
35
36
      // war das schon alles ?
37
      if( byteCount < 2 )
38
        byteCount++;    // nein war nicht alles. Zaehler weiterstellen
39
                        // damit das nächste empfangene Byte richtig zugeordnet
40
                        // wird.
41
42
      else {    // ja das war alles. Alle Bytes sind da ... auswerten!
43
44
        // bin ich gemeint?
45
        if( channel == ...... ) {
46
47
          // hey, das war tatsächich für mich.
48
          // eigentlich sollte jetzt noch die Checksumme geprüft werden
49
          // und wenn die auch noch stimmt, dann rummst es beim Modul mit
50
          // der Modulnummer 'modul'
51
52
          ....
53
        }
54
55
        inMsg = FALSE;  // Nachrichgt fertig abgearbeitet. Wieder passiv bleiben
56
      }
57
    }
58
  }
59
}

: Bearbeitet durch User
von Daniel (Gast)


Lesenswert?

Vielen Dank für die Antwort!!!

Tüfftel mal über die Feiertage mit meinem Arduino an der Software.

Noch ne Frage zu nem USB to RS485 Converter:

http://at.rs-online.com/web/p/entwicklungskits-interface/6877837/

Wenn ich die Software auf dem Duino hab und der Converter mit dem PC und 
Duino verbunden ist hab ich schon ne Funktionierende Übertragung oder 
fehlt da noch mehr?

Nochmals Danke!

Gruss

Daniel

von Christian (Gast)


Lesenswert?

Hat dein Arduino eine RS485 Schnittstelle?

von Daniel (Gast)


Lesenswert?

Christian schrieb:
> Hat dein Arduino eine RS485 Schnittstelle?

Ja wenn ich mich nicht verlesen habe.

Gruss

Dani

von Christian (Gast)


Lesenswert?

Welchen Arduino nutzt du denn?

von Daniel (Gast)


Lesenswert?

Hab mir gerade den SainSmart Mega2560 bestellt

Gruss

Daniel

von PittyJ (Gast)


Lesenswert?

Hm, ich verstehe das nicht.
So ein Arduino hat doch nur serielle Schnittstellen. Aber kein RS485 
Level.
Oder hatte ich das bisher übersehen. Ich dachte, dafür bräuchte man noch 
etwas Schaltung?

Und ich dachte auch, dass man so USB-RS485 Konverter nicht an einem 
Arduino betreiben kann. So ein Modul muss ja an einen Host angeschlossen 
werden, und der Arduino ist meist nur Device.
Kann der Ardiuno jetzt auch also Host dienen, und ich jedes USB-Gerät 
anstecken? Also z.B. eine USB-Festplatte?

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.