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
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
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
Christian schrieb: > Hat dein Arduino eine RS485 Schnittstelle? Ja wenn ich mich nicht verlesen habe. Gruss Dani
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.