Arduino Kommunikation über digital Pins

  • Allgemein

Es gibt 50 Antworten in diesem Thema. Der letzte Beitrag () ist von gfcwfzkm.

    Arduino Kommunikation über digital Pins

    <Dieses Problem ist schon erledigt DANKE :thumbsup: >
    Hallo,
    Ich habe ein Arduino Uno und ein Arduino Mega...
    Ich möchte die beiden miteinander kommunizieren lassen.
    Im Anhang ist die Schaltung...
    Arduino Mega->Sender; Arduino Uno->Empfänger

    (Ja es geht besser und das hier ist vill sogar total dämlich, aber ich möchte damit etwas ausprobieren...)

    Ich wollte nun Fragen, ob dieser Aufbau so in Ordnung ist, oder ich etwas falsch gemacht habe...
    Als ich es austestete wechselten die Verbindungen nur schnell zwischen an und aus... Hier der Arduino Code:

    Spoiler anzeigen

    Quellcode

    1. //Master
    2. #define p1 3
    3. #define p2 4
    4. #define p3 5
    5. #define p4 6
    6. #define p5 7
    7. #define p6 8
    8. #define p7 9
    9. #define p8 10
    10. #define btn 2
    11. void setup()
    12. {
    13. Serial.begin(9600);
    14. pinMode(p1, OUTPUT);
    15. pinMode(p2, OUTPUT);
    16. pinMode(p3, OUTPUT);
    17. pinMode(p4, OUTPUT);
    18. pinMode(p5, OUTPUT);
    19. pinMode(p6, OUTPUT);
    20. pinMode(p7, OUTPUT);
    21. pinMode(p8, OUTPUT);
    22. pinMode(btn, INPUT);
    23. pinMode(13, OUTPUT);
    24. digitalWrite(13, LOW);
    25. digitalWrite(btn, HIGH);
    26. Serial.println("ready...");
    27. }
    28. void loop()
    29. {
    30. if(!digitalRead(btn))
    31. {
    32. digitalWrite(p1, HIGH);
    33. digitalWrite(p2, LOW);
    34. digitalWrite(p3, LOW);
    35. digitalWrite(p4, LOW);
    36. digitalWrite(p5, LOW);
    37. digitalWrite(p6, LOW);
    38. digitalWrite(p7, LOW);
    39. digitalWrite(p8, LOW);
    40. digitalWrite(13, HIGH);
    41. }
    42. else
    43. {
    44. digitalWrite(p1, LOW);
    45. digitalWrite(p2, LOW);
    46. digitalWrite(p3, LOW);
    47. digitalWrite(p4, LOW);
    48. digitalWrite(p5, LOW);
    49. digitalWrite(p6, LOW);
    50. digitalWrite(p7, LOW);
    51. digitalWrite(p8, LOW);
    52. digitalWrite(13, LOW);
    53. }
    54. }




    Spoiler anzeigen

    Quellcode

    1. //slave
    2. #define p1 10
    3. #define p2 9
    4. #define p3 8
    5. #define p4 7
    6. #define p5 6
    7. #define p6 5
    8. #define p7 4
    9. #define p8 3
    10. #define led 11
    11. void setup()
    12. {
    13. pinMode(p1, INPUT);
    14. pinMode(p2, INPUT);
    15. pinMode(p3, INPUT);
    16. pinMode(p4, INPUT);
    17. pinMode(p5, INPUT);
    18. pinMode(p6, INPUT);
    19. pinMode(p7, INPUT);
    20. pinMode(p8, INPUT);
    21. pinMode(led, OUTPUT);
    22. Serial.begin(9600);
    23. }
    24. void loop()
    25. {
    26. char rm[8];
    27. if(digitalRead(p1) == HIGH)
    28. {
    29. rm[0] = 1;
    30. }
    31. else
    32. {
    33. rm[0] = 0;
    34. }
    35. if(digitalRead(p2) == HIGH)
    36. {
    37. rm[1] = 1;
    38. }
    39. else
    40. {
    41. rm[1] = 0;
    42. }
    43. if(digitalRead(p3) == HIGH)
    44. {
    45. rm[2] = 1;
    46. }
    47. else
    48. {
    49. rm[2] = 0;
    50. }
    51. if(digitalRead(p4) == HIGH)
    52. {
    53. rm[3] = 1;
    54. }
    55. else
    56. {
    57. rm[3] = 0;
    58. }
    59. if(digitalRead(p5) == HIGH)
    60. {
    61. rm[4] = 1;
    62. }
    63. else
    64. {
    65. rm[4] = 0;
    66. }
    67. if(digitalRead(p6) == HIGH)
    68. {
    69. rm[5] = 1;
    70. }
    71. else
    72. {
    73. rm[5] = 0;
    74. }
    75. if(digitalRead(p7) == HIGH)
    76. {
    77. rm[6] = 1;
    78. }
    79. else
    80. {
    81. rm[6] = 0;
    82. }
    83. if(digitalRead(p8) == HIGH)
    84. {
    85. rm[7] = 1;
    86. }
    87. else
    88. {
    89. rm[7] = 0;
    90. }
    91. if(rm == "10000000")
    92. {
    93. digitalWrite(led, HIGH);
    94. }
    95. if(rm == "00000000")
    96. {
    97. digitalWrite(led, LOW);
    98. }
    99. Serial.println(rm);
    100. }




    Ich bin Arduino Anfänger also bitte ich um konstruktive Kritik
    Bilder
    • com.png

      270,02 kB, 1.146×1.689, 806 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcel1997“ ()

    Zunächst mal: Dein Code ist so kaputt, weil du ihn nicht im Quellcode-Editor sondern im WYSIWYG-Editor vom VBP geschrieben hast.
    Dann: Was hat die Frage mit VB.net zu tun? Move -> Off-Topic bitte!

    On-Topic:
    Du kannst so keine digitale Datenübertragung realisieren. Du bräuchtest mindestens eine Taktleitung bzw. einen Latch-Pin.
    Dann: So wie du da deine Pins verkabelt hast müsstest du jeden Pin einzeln rausrechnen. Dabei hast erreichst du ne Performance wie nen Stück Holz.
    Wenn schon, würde man direkt auf die Portregister schreiben wollen, aber selbst das ist _wesentlich_ langsamer als die langsamste Serielle/UART, weil der AVR dafür Hardware-unterstützte Puffer hat.

    Also: Was möchtest du denn am Ende erreichen? Der Sinn ist nicht wirklich ersichtlich.

    Viele Grüße,
    Manawyrm

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manawyrm“ ()

    Danke schonmal für deine Antwort :)
    zur Frage... Ich möchte gerne ein wenig rumprobieren, und schauen,
    ob ich so einen "byte" "versenden" kann... Was meinst du mit Taktleitung?
    Und was mit einzeln rausrechnen? (die Performance ist erstmal egal, weil das nur so zum
    Spaß bzw rumprobieren sein soll, und ich keine Tonnen Daten verschicken will...)
    EDIT: Blödsinn. Geht gar nicht.

    Du kannst so keine Datenübertragung realisieren. Du müsstest es schaffen die 8 Taktleitungen exakt syncron zu halten. Das wird nichts. Schon gar nicht in Software...
    Wie wärs stattdessen lieber mit noch ner Clock-Leitung? oder du sagst lieber was du wirklich vor hast und bekommst eine normale Sinnvolle Lösung ;)
    Um Himmels Willen!
    Du weißt aber schon, wie deine Datenpins funktionieren oder?
    Du verbindest da nur über einen 1kOhm Widerstand High und Low Potenzial und verursachst so 5mA/Port = 40mA Strom Sink/Source auf den Seiten.

    Außerdem sehe ich gerade dass du im Schaltplan keine Verbindung zwischen den Massen der beiden Arduinos hast. Ich hoffe doch sehr stark, dass du die nur im Schaltplan vergessen hast, oder? Ohne wär's kein wunder, dass da nur Bullshit passiert xD
    #Ich hab gesagt, ich bin Anfänger ^^#

    Ich hab aber im Internet gelesen, das wenn man die Massen verbindet, was kaputt gehen kann...
    Muss ich diese noch irgendwie absichern??

    (Ja ich habe noch nicht viel Ahnung von Elektronik... )


    Kann da was passieren?????

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Marcel1997“ ()

    Guten Morgen :)

    Jetzt hätte ich da mal eine Software Frage :D
    meine beiden Codes sehen so aus:

    Master (Uno):
    Spoiler anzeigen

    Quellcode

    1. //Master
    2. #define p1 3
    3. #define p2 4
    4. #define p3 5
    5. #define p4 6
    6. #define p5 7
    7. #define p6 8
    8. #define p7 9
    9. #define p8 10
    10. char akt[20] = "";
    11. int i = 0;
    12. void setup()
    13. {
    14. Serial.begin(9600);
    15. pinMode(p1, OUTPUT);
    16. pinMode(p2, OUTPUT);
    17. pinMode(p3, OUTPUT);
    18. pinMode(p4, OUTPUT);
    19. pinMode(p5, OUTPUT);
    20. pinMode(p6, OUTPUT);
    21. pinMode(p7, OUTPUT);
    22. pinMode(p8, OUTPUT);
    23. Serial.println("ready...");
    24. }
    25. void loop()
    26. {
    27. while(Serial.available() > 0)
    28. {
    29. if(Serial.read() == '\n')
    30. {
    31. Serial.read();
    32. }
    33. akt[i] = Serial.read();
    34. i++;
    35. }
    36. if(akt != "")
    37. {
    38. sendmsg();
    39. for(int ii = 0; ii != i+1; ii++)
    40. {
    41. akt[ii] = 0;
    42. }
    43. }
    44. }
    45. void sendmsg()
    46. {
    47. byte barr[20];
    48. for(int ii = 0; ii != i+1; ii++)
    49. {
    50. barr[ii] = akt[ii];
    51. }
    52. for(int iii = 0; iii != i; iii++)
    53. {
    54. if(bitRead(barr[iii], 0) == 1)
    55. {
    56. digitalWrite(p1, HIGH);
    57. }
    58. else
    59. {
    60. digitalWrite(p1, LOW);
    61. }
    62. if(bitRead(barr[iii], 1) == 1)
    63. {
    64. digitalWrite(p2, HIGH);
    65. }
    66. else
    67. {
    68. digitalWrite(p2, LOW);
    69. }
    70. if(bitRead(barr[iii], 2) == 1)
    71. {
    72. digitalWrite(p3, HIGH);
    73. }
    74. else
    75. {
    76. digitalWrite(p3, LOW);
    77. }
    78. if(bitRead(barr[iii], 3) == 1)
    79. {
    80. digitalWrite(p4, HIGH);
    81. }
    82. else
    83. {
    84. digitalWrite(p4, LOW);
    85. }
    86. if(bitRead(barr[iii], 4) == 1)
    87. {
    88. digitalWrite(p5, HIGH);
    89. }
    90. else
    91. {
    92. digitalWrite(p5, LOW);
    93. }
    94. if(bitRead(barr[iii], 5) == 1)
    95. {
    96. digitalWrite(p6, HIGH);
    97. }
    98. else
    99. {
    100. digitalWrite(p6, LOW);
    101. }
    102. if(bitRead(barr[iii], 6) == 1)
    103. {
    104. digitalWrite(p7, HIGH);
    105. }
    106. else
    107. {
    108. digitalWrite(p7, LOW);
    109. }
    110. if(bitRead(barr[iii], 7) == 1)
    111. {
    112. digitalWrite(p8, HIGH);
    113. }
    114. else
    115. {
    116. digitalWrite(p8, LOW);
    117. }
    118. delay(1);
    119. digitalWrite(p1,LOW);
    120. digitalWrite(p2,LOW);
    121. digitalWrite(p3,LOW);
    122. digitalWrite(p4,LOW);
    123. digitalWrite(p5,LOW);
    124. digitalWrite(p6,LOW);
    125. digitalWrite(p7,LOW);
    126. digitalWrite(p8,LOW);
    127. delay(1);
    128. }
    129. }



    Slave (Mega):
    Spoiler anzeigen

    C-Quellcode

    1. //slave
    2. #define p1 23
    3. #define p2 25
    4. #define p3 27
    5. #define p4 29
    6. #define p5 31
    7. #define p6 33
    8. #define p7 35
    9. #define p8 37
    10. //--
    11. #include <TouchScreen.h>
    12. #include <Adafruit_GFX.h>
    13. #include <Adafruit_TFTLCD.h>
    14. #include <SPI.h>
    15. #include <SD.h>
    16. #include <stdint.h>
    17. #define LCD_CS A3
    18. #define LCD_CD A2
    19. #define LCD_WR A1
    20. #define LCD_RD A0
    21. #define LCD_RESET A4
    22. #define YP A1
    23. #define XM A2
    24. #define YM 7
    25. #define XP 6
    26. #define MINPRESSURE 10
    27. #define MAXPRESSURE 1000
    28. //16 bit Farben
    29. #define LIGHTGREY 0xD69A
    30. #define BLACK 0x0000
    31. #define GRAY 0x8410
    32. #define WHITE 0xFFFF
    33. Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
    34. TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);
    35. #ifdef __SAM3X8E__
    36. #define TS_MINX 125
    37. #define TS_MINY 170
    38. #define TS_MAXX 880
    39. #define TS_MAXY 940
    40. #else
    41. #define TS_MINX 150
    42. #define TS_MINY 120
    43. #define TS_MAXX 920
    44. #define TS_MAXY 940
    45. #endif
    46. //--
    47. void setup()
    48. {
    49. pinMode(p1, INPUT);
    50. pinMode(p2, INPUT);
    51. pinMode(p3, INPUT);
    52. pinMode(p4, INPUT);
    53. pinMode(p5, INPUT);
    54. pinMode(p6, INPUT);
    55. pinMode(p7, INPUT);
    56. pinMode(p8, INPUT);
    57. Serial.begin(9600);
    58. tft.reset();
    59. uint16_t identifier = tft.readID();
    60. tft.begin(identifier);
    61. tft.setRotation(1);
    62. tft.fillScreen(BLACK);
    63. tft.setCursor(1,1);
    64. tft.setTextSize(1);
    65. tft.setTextColor(WHITE);
    66. }
    67. void loop()
    68. {
    69. String rm = "";
    70. if(digitalRead(p1) == HIGH)
    71. {
    72. rm = rm + "1";
    73. }
    74. else
    75. {
    76. rm = rm + "0";
    77. }
    78. if(digitalRead(p2) == HIGH)
    79. {
    80. rm = rm + "1";
    81. }
    82. else
    83. {
    84. rm = rm + "0";
    85. }
    86. if(digitalRead(p3) == HIGH)
    87. {
    88. rm = rm + "1";
    89. }
    90. else
    91. {
    92. rm = rm + "0";
    93. }
    94. if(digitalRead(p4) == HIGH)
    95. {
    96. rm = rm + "1";
    97. }
    98. else
    99. {
    100. rm = rm + "0";
    101. }
    102. if(digitalRead(p5) == HIGH)
    103. {
    104. rm = rm + "1";
    105. }
    106. else
    107. {
    108. rm = rm + "0";
    109. }
    110. if(digitalRead(p6) == HIGH)
    111. {
    112. rm = rm + "1";
    113. }
    114. else
    115. {
    116. rm = rm + "0";
    117. }
    118. if(digitalRead(p7) == HIGH)
    119. {
    120. rm = rm + "1";
    121. }
    122. else
    123. {
    124. rm = rm + "0";
    125. }
    126. if(digitalRead(p8) == HIGH)
    127. {
    128. rm = rm + "1";
    129. }
    130. else
    131. {
    132. rm = rm + "0";
    133. }
    134. if(rm != "00000000")
    135. {
    136. int z = rm.toInt();
    137. byte b = byte(z);
    138. char c = char(b);
    139. tft.print(c);
    140. }
    141. }




    Wenn ich dem uno jetzt über den Seriellen Monitor etwas schicken, kommt nur dieser Müll beim Mega raus...
    (Bild im Anhang)

    Wie kann ich Chars am besten in Bytes ver- und zurückwandeln?
    Bilder
    • 20140201_113239.jpg

      485,8 kB, 1.280×960, 327 mal angesehen
    Ich weiss nicht was du sendest und der Code beim Slave ist schrecklich. Binde die Pin's doch zusammen und lies sie auf einmal aus und gibs direkt wieder aus. Bei Arduino weiss ich nicht ganz wie und ob das geht, aber wenn du richtig mit AVR/GCC coden würdest, würdest du einfach den Port auslesen (Kann nix mit Arduino anfangen).

    Überprüf doch alles. Hast sicher ein Multimeter (besser wäre LogicAnalyzer) und gehst alles selber durch (Fehlerprotokoll, Soll/Ist-Wert...)

    mfg

    gfc