Hardware Serial TX/RX und I2C Konflikte?

Ich habe gemeint gelesen zu haben, dass der Arduino Mega bereits 10K verbaut hat. Die Uno's haben nichts.
Heisst das dann, man braucht auf dem Mega einen 10K + 3K und auf dem Uno einen 10K + 3K?

Och menno.

Das kannst auf dem Board - und als Grundlage dient das Schematic.

Ansonsten ist das alles richtig. Nur nicht die internen PULLUPS verwenden.
Und auch nicht Shields -egal was- auf denen Widerstände aufgelötet sind.

Ja, auf dem Schema sind je 10K Pullups drauf für I2C :slight_smile:
Dann solte ich aber nur 3K Pullups einbauen, dann sind es die 2,30K.

Was genau meinst Du mit nicht die internen Pullups verwenden? Kann man diese speziell deaktivieren? Die sind doch fix verbaut die 10K oder nicht?

der AVR hat interne R's.
ich habs jetzt, was Du vermischt....

Wenn Du von internen Widerständen sprichst, wird immer von denen im Chip ausgegangen.
Alles andere ist entweder verbaut oder extern.

Sprachliche Ungenauigkeit - mit fatalen Folgen.

Ach so, alles klar. Nein, ich meinte die 10K Pullup Widerstände als "interne" R.
Aber nochmals...... Ich darf jetzt nur beim Mega einen 3K hinzufügen auf 5V, auf dem Uno ja nicht auch noch 10K + 3K, sonst sind diese doch in Serie?
Und falls ich mal noch ein Display ergänze, dann dürfte ich jetzt nur 3,80K verwenden.

Edit: Blödsinn! Ich setze bei meinem Mega einfach die 3K ein auf 5V und wenn ich ein Display dranhängen werde ein 3,80K, dann passts. Der Uno braucht nix, sind ja sonst auch noch parallel dran!

Ja. Auf beiden Leitungen!

Nein.

Da nicht bekannt ist was da für ein R drauf ist..
N/A

Nein, die sind extern.

Nein, die sind parallel.

Normalerweise brauche ich die OLED Displays SD1306. Je nach Hersteller gibt es hier auch kein Schema, aber das von Adafruit hat auch 10K drauf, wie fast alles I2C Devices.

Vielen Dank an alle! Werde dies mal versuchen.

Na dann rechnen.
Und: Warum sehe ich das Display nicht in deinem Code?

Wir sind jetzt bei #70.
Ich denke, es wäre an der Zeit mal was zu liefern, auf was man aufbauen kann.
Ich höre jetzt auf zu raten.

Nee, das Display ist nur, falls ich das mal ergänzen möchte in Zukunft. Das gibt es noch nicht!
Momentan ist der Aufbau den ich zu Beginn mal gepostet habe in der Skizze, einen Mega mit Xbee, ein Uno und der Roboclaw am Uno.

Ich habe das Beispiel mit der seriellen Eingabe am Monitor angeschaut und versucht einen Sendeteil zu erstellen, dass der Arduino direkt senden kann. Nun empfange ich so nicht korrekt. Wie sendet denn der serielle Monitor am PC zum Arduino? Muss man hier speziell was beachten?
Die Tastatureingabe hat super funktioniert. Jetzt als Array mit Endzeichen nicht mehr.

const byte bufferSize = 10;
char serialBuffer[bufferSize];

const byte DPangle = 158;

void setup()
{
  Serial.begin(115200);
}

void loop() {

  command('E', 10, Serial);
  command('F', 5, Serial);
  command('G', 147, Serial);
  command('H', DPangle, Serial);
  command('#', 33, Serial);
    
}


void command (const char command, const byte value, Stream& stream)
{
  for(byte i = 0; i < sizeof bufferSize; i++){
    serialBuffer[i] = '\0';
  }
  sprintf(serialBuffer, "%c%d<", command, value);
  const size_t characters = strlen(serialBuffer);

  stream.write(serialBuffer, characters);
}

Falls alle Stricke reissen versuche ich alles auf TX/RX umzubauen. Dann sende ich entweder wie bisher und lese es mit parseInt() ein, oder ich nutze dieses super Beispiel das noch ausgebaut werden kann. Ich habe zwar mal was mit Start- und Endmarkern gemacht, aber das funktioniert mal ohne Probleme, dann habe ich mal wieder "falsche" Werte auf dem seriellen Monitor wo ich überprüfe. Ist aber vermutlich weil an zwei Unos getestet und gleichzeitig am seriellen Monitor angezeigt. Dann empfängt es wohl nicht alle Daten und nicht immer korrekt.

Kannst Du für den Arduino keine einfache Einlesen-Ausgeben-Routine schreiben und die empfangenen Werte als HEX ausgeben?
Frage wäre damit beantwortet.

Scheinbar bin ich wirklich zu doof dazu! Ich bekomme im seriellen Monitor das hier übertragen:


H153

<

F5<

<

H153

<

F5<

<

H153

<

F5<

<

H153

<

F47<

<

#33<

1478

<

E10G

mit dem hier:

const byte bufferSize = 10;
char serialBuffer[bufferSize];

const byte DPangle = 158;

void setup()
{
  Serial.begin(115200);
}

void loop() {

  command('E', 10, Serial);
  command('F', 5, Serial);
  command('G', 147, Serial);
  command('H', DPangle, Serial);
  command('#', 33, Serial);
    
}


void command (const char command, const byte value, Stream& stream)
{
  for(byte i = 0; i < sizeof bufferSize; i++){
    serialBuffer[i] = '\0';
  }
  sprintf(serialBuffer, "%c%d<", command, value);
  const size_t characters = strlen(serialBuffer);
  stream.write(serialBuffer, characters);
  //stream.print('\0');
}

Denke ich hier schon viel zu weit?
Ich habe mir heute einen Sendecode zusammengestellt mit Prüfsumme und Rückweisung falscher Werte. Das klappt ganz gut, hat auch nicht viele falsche Werte.

Ja.

bau da drunter mal ein Serial.println(); ein.
Edit - Du hattest das doch schon vorbereitet - dann so:

  stream.write(serialBuffer, characters);
  stream.println();

macht:

20:18:22.422 -> #33<
20:18:22.422 -> E10<
20:18:22.422 -> F5<
20:18:22.422 -> G147<
20:18:22.422 -> H158<
20:18:22.422 -> #33<
20:18:22.422 -> E10<
20:18:22.422 -> F5<

(Arduino MEGA und Serieller Monitor richtig auf 115200 eingestellt)

Das hab ich doch auch versucht..... versuchs nochmals, ging gestern nicht! Hat in etwa die gleiche Ausgabe gegeben wie oben von mir gepostet. Danke, werde es nochmals hochladen und laufen lassen :upside_down_face:

Edit: Das ist die Ausgabe vom Empfangscode mit stream.println(); oder auch println('\0');

<

3310

<

<

<

H<

3<

E<

F5<

G8<

#3E1

0<

G1H1

58<

#3E1

0<

<

Edit2: Keine Ahnung warum, aber wenn ich noch ein '\r' hinter die gesendeten Daten und am Ende dann das '\0' sende, dann kommt alles korrekt an! So läufts.

Sendecode:

const byte bufferSize = 10;
char serialBuffer[bufferSize];

const byte DPangle = 158;

void setup()
{
  Serial.begin(115200);
  
}

void loop() {


  command('E', 10, Serial);
  command('F', 5, Serial);
  command('G', 147, Serial);
  command('H', DPangle, Serial);
  command('#', 33, Serial);
    
}


void command (const char command, const byte value, Stream& stream)
{
  for(byte i = 0; i < sizeof bufferSize; i++){
    serialBuffer[i] = '\0';
  }
  sprintf(serialBuffer, "%c%d<\r", command, value);
  const size_t characters = strlen(serialBuffer);

  stream.write(serialBuffer, characters);
  stream.println('\0');
}

Und den leicht modifizierten Empfängercode, dass das Endzeichen nicht verwendet wird und immer bis zu diesem gelesen wird für die Ausgabe:

bool startProgramm = false;
char zeichenketteRecvBuffer[32] = {0};
char zeichenketteSendBuffer[32] = {0};


void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
}

void loop()
{
  serialReadCommand();
  serialZwischenCommand();
}
void serialReadCommand()
{
  static byte myCharPosition = 0;
  if (Serial.available() > 0)
  {
    char zeichen = Serial.read();
    if (isPrintable(zeichen))
    {
      zeichenketteRecvBuffer[myCharPosition] = zeichen;
      myCharPosition++;
      startProgramm = true;
    }
  }
  if (/*myCharPosition >= 3 ||*/ zeichenketteRecvBuffer[myCharPosition - 1] == '<')
  {
    zeichenketteRecvBuffer[myCharPosition - 1] = '\0';
    memcpy(zeichenketteSendBuffer, zeichenketteRecvBuffer, sizeof(zeichenketteSendBuffer));
    serialWriteCommand();
    memset(zeichenketteRecvBuffer, 0, sizeof(zeichenketteRecvBuffer));
    myCharPosition = 0;
    startProgramm = false;
  }
}

void serialWriteCommand()
{
  Serial.println();
  Serial.println(zeichenketteSendBuffer);
}

void serialZwischenCommand()
{
  const unsigned long intervall = 100;
  static unsigned long lastTime = 0;
  static byte zeichen = 46;
  if (startProgramm)
  {
    if (millis() - lastTime >= intervall)
    {
      lastTime += intervall;
      Serial.println(char(zeichen));
      zeichen++;
      if (zeichen > 100) zeichen = 46;
    }
  }
}