Go Down

Topic: wieder mal Led/Serial problem (Read 718 times) previous topic - next topic

Medolino73

Ich hab folgendes Problem, unzwar wie in den anderen Threas schon fast gelöst, geht es darum die WS2812 über den Teensy zu Steuern, die 4 Ringe haben alle einen eigenen Attiny85 auf dennen einige Animationen gespeichert sind, über i2c funktioniert das ganz gut, auch unterschiedlich zusammengestellte animationen werden Super aufgerufen, nun möcht ich auch einen Motor per PWM ansteuern, die eingabe erfolgt über einen Nextion, es sind 10 Tasten bei dem ich die id der Tasten ans Teensy schick um es auszuwerten, aber irgendwas steht da im Konflikt, Motor funktioniert top, aber jetzt werden die Ringe nicht korrekt gesteuert, man muß öfters auf die Taste Drücken bis alle die befehle empfangen haben

Code: [Select]
#include <Wire.h>
const byte bufferSize = 64;
#include <FrequencyTimer2.h>
int Motor = 6;

void setup() {
  Serial2.begin(57600);
  Wire.begin();
  pinMode(Motor, OUTPUT);
  analogWriteResolution(8);
  analogWriteFrequency(Motor, 100);
  analogWrite(Motor, 229);
  Serial2.print("bt0.val=0");
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}

void loop() {

  static uint8_t bIndex;
  static uint8_t buffer[bufferSize];
  bool complett = false;
  if (Serial2.available()) {
    uint8_t inChar = Serial2.read();
    buffer[bIndex++] = inChar;
    if (inChar == 0xFF && (bIndex >= (*buffer == 0x71 ? 8 : 3)) &&
        buffer[bIndex - 2] == 0xFF && buffer[bIndex - 3] == 0xFF) {
      complett = true;
    } else {
      complett = (bIndex == bufferSize);
    }
  }
  if (complett) {
    switch (buffer[1]) {
      case 0  :
        analogWrite(Motor, 229);
        Serial2.print("t0.txt=");
        Serial2.write(0x22);
        Serial2.print("Aus");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;
      case 1  :
        analogWrite(Motor, 26);
        Serial2.print("t0.txt=");
        Serial2.write(0x22);
        Serial2.print("Ein");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;
      case 4  : //Fade Red
        Wire.beginTransmission(1);
        Wire.write('g');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('g');
        Wire.endTransmission();
        break;
      case 5  :  //Comet
        Wire.beginTransmission(1);
        Wire.write('a');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('a');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('a');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('a');
        Wire.endTransmission();
        break;
      case 8  :  //Police
        Wire.beginTransmission(1);
        Wire.write('b');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('b');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('b');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('b');
        Wire.endTransmission();
        break;
      case 7  :  //Knight
        Wire.beginTransmission(1);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('c');
        Wire.endTransmission();
        break;
      case 9  :  //Start
        Wire.beginTransmission(1);
        Wire.write('a');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('a');
        Wire.endTransmission();
      case 11  :  //Fire
        Wire.beginTransmission(1);
        Wire.write('b');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('b');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('b');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('b');
        Wire.endTransmission();
        break;
        break;
    }
    bIndex = 0;
  }
}

my_xy_projekt

Code: [Select]
     Wire.endTransmission();
      case 11  :  //Fire

break; fehlt

Code: [Select]
        break;
        break;
    }


Ach da isses ja.

Aber was passiert, wenn Du auf 2 oder 3 drückst?

Medolino73

#2
Apr 08, 2020, 01:57 pm Last Edit: Apr 08, 2020, 03:51 pm by Medolino73
das wars fast, die Befehle dringen immer noch nicht an alle Teilnemher, also 2 und 3 sind im Nextion noch nicht eingepflegt, was aber komisch ist, sobald ich umschalte auf einer anderen Animation, dimmt er um gut 70% die LED´s runter, und dabei bleibt es auch bis ich Spannung wegnehm und wieder anleg, vielleicht liegt es aber auch in der beschaltung ??

HotSystems

Ich sehe keine Freilaufdiode an deinem Motor. Die solltest du einsetzen, damit dir nix wegstirbt.
Und es können durchaus Störungen des Motors auf deinen Controller einwirken, die deinen Sketch durcheinander bringen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

my_xy_projekt

das wars fast, die Befehle dringen immer noch nicht an alle Teilnemher, also 2 und 3 sind im Nextion noch nicht eingepflegt, was aber komisch ist, sobald ich umschalte auf einer anderen Animation, dimmt er um gut 70% die LED´s runter, und dabei bleibt es auch bis ich Spannung wegnehm und wieder anleg, vielleicht liegt es aber auch in der beschaltung ??
Das möglicherweise auch.

Wenn Du 2 oder 3 oder sonst irgendeine Taste drückst die die Bedingung NICHT erfüllt, kommst Du aus dem case nicht mehr sauber raus.



Medolino73

#5
Apr 08, 2020, 07:55 pm Last Edit: Apr 08, 2020, 07:56 pm by Medolino73
Das möglicherweise auch.

Wenn Du 2 oder 3 oder sonst irgendeine Taste drückst die die Bedingung NICHT erfüllt, kommst Du aus dem case nicht mehr sauber raus.



achso, das muß ich gleich mal testen, es ist auch im moment kein Motor angeschlossen, es ist auch so das 2 Stellig zahlen garnicht erkannt werden

my_xy_projekt

achso, das muß ich gleich mal testen, es ist auch im moment kein Motor angeschlossen, es ist auch so das 2 Stellig zahlen garnicht erkannt werden
Ich schrub heute morgen schon in #1
Quote
Aber was passiert, wenn Du auf 2 oder 3 drückst?
Hm.

Bis Du zweistellig Tasten fehlerfrei auswertest, wollte ich wenigstens einstellig funktonsfähig haben.

Na dann...

Medolino73

#7
Apr 08, 2020, 08:28 pm Last Edit: Apr 08, 2020, 08:53 pm by Medolino73
ja also wenn man sich den code mal anschaut, ich drücke auf der taste mit id 8, ruft er auch die 8 auf, wenn ich aber die id 14 aufruf, dann ruft er wiederrum die 8, aber warum weis ich leider nicht

hier auch ein leicht aktualisierter code
Code: [Select]
#include <Wire.h>
const byte bufferSize = 64;
#include <FrequencyTimer2.h>
int Motor = 6;

void setup() {
  Serial2.begin(57600);
  Wire.begin();
  pinMode(Motor, OUTPUT);
  analogWriteResolution(8);
  analogWriteFrequency(Motor, 100);
  analogWrite(Motor, 229);
  Serial2.print("bt0.val=0");
  Serial2.write(0xff);
  Serial2.write(0xff);
  Serial2.write(0xff);
}

void loop() {

  static uint8_t bIndex;
  static uint8_t buffer[bufferSize];
  bool complett = false;
  if (Serial2.available()) {
    uint8_t inChar = Serial2.read();
    buffer[bIndex++] = inChar;
    if (inChar == 0xFF && (bIndex >= (*buffer == 0x71 ? 8 : 3)) &&
        buffer[bIndex - 2] == 0xFF && buffer[bIndex - 3] == 0xFF) {
      complett = true;
    } else {
      complett = (bIndex == bufferSize);
    }
  }
  if (complett) {
    switch (buffer[1]) {
      case 0  :
        analogWrite(Motor, 229);
        Serial2.print("t0.txt=");
        Serial2.write(0x22);
        Serial2.print("Aus");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;

      case 1  :
        analogWrite(Motor, 26);
        Serial2.print("t0.txt=");
        Serial2.write(0x22);
        Serial2.print("Ein");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;

      case 4  : //Fade Red
        Wire.beginTransmission(1);
        Wire.write('a');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('a');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('a');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('a');
        Wire.endTransmission();
        Serial2.print("t1.txt=");
        Serial2.write(0x22);
        Serial2.print("FadeRed");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;

      case 8  :  // Stop
        Wire.beginTransmission(1);
        Wire.write('i');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('i');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('i');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('i');
        Wire.endTransmission();
        Serial2.print("t1.txt=");
        Serial2.write(0x22);
        Serial2.print("Stop");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;

      case 14  :  //Start
        Wire.beginTransmission(1);
        Wire.write('f');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('f');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('f');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('f');
        Wire.endTransmission();
        Serial2.print("t1.txt=");
        Serial2.write(0x22);
        Serial2.print("Start");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;

      case 7  :  //Police
        Wire.beginTransmission(1);
        Wire.write('e');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('e');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('e');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('e');
        Wire.endTransmission();
        Serial2.print("t1.txt=");
        Serial2.write(0x22);
        Serial2.print("Police");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;

      case 9  :  //Sparkle
        Wire.beginTransmission(1);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(2);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(3);
        Wire.write('c');
        Wire.endTransmission();
        Wire.beginTransmission(4);
        Wire.write('c');
        Wire.endTransmission();
        Serial2.print("t1.txt=");
        Serial2.write(0x22);
        Serial2.print("Sparkle");
        Serial2.write(0x22);
        Serial2.write(0xff);
        Serial2.write(0xff);
        Serial2.write(0xff);
        break;
    }
    bIndex = 0;
  }
}

postmaster-ino

Hi

Lasse Du Dir 'buffer[1]' anzeigen - denke, Du rechnest irgendwo falsch oder kommst (eh dann dort hin).
Überall, wo buffer[1] geändert werden kann, eine Ausgabe - dann siehst Du, woher der Arduino rennt und wo Er den Wert, mit Dem Du daraufhin verzweigst, manipuliert.

MfG
Dein Problem, Dein Sketch, Deine Bilder.
Ob ich ohne Diese an Deinem Problem arbeiten will, entscheide aber immer noch ich.
Große Buchstaben? Immer wieder, neben Punkt und Komma, gerne gesehen.

Medolino73

#9
Apr 08, 2020, 09:09 pm Last Edit: Apr 08, 2020, 09:48 pm by Medolino73
tut mir echt leid, ich hab so ein leichtsinnsfehler gemacht, ich hab ja die buttons untereinnannder kopiert, und habs übersehen auch den richtigen button und die id abzufragen, jetzt funktioniert es,
mit den 2 stelligen Zahlen, aber das problem mit der synchronen übertragung hängt noch, oder man drück öffters drauf bis alle ihre befehle erhalten haben, noch komischer ist es, wenn ich den reset knopf auf dem teensy drücke, dann funktioniert es garnichtmehr, erst spannung komplett abschalten und wieder ein, dann läuft alles wieder, ich vermute mal das mit der schaltung was nicht stimmt, den motor hab ich vorerstmal weggelassen und stattessen zu testzwecken eine led drangehängt


Medolino73

#10
Apr 09, 2020, 12:59 am Last Edit: Apr 09, 2020, 12:59 am by Medolino73
kleine Rückmeldung, hab mal die frequenz auf 400khz gesetzt, und siehe da, auf einmal funktioniert alles genauso wie ich mir das vorstell, keine aussetzer mehr und alle werden wunderbar angesteuert, was es aber damit aufsich hat, ist mir erlichgesagt ein Rätsel

Go Up