Arduino Nano 33 IoT kann nicht erkannt werden [gelöst]

Hallo,

ich bin auf ein Problem gestoßen, bei dem ich nicht mehr weiter weiß und eure Hilfe brauche.

Ich habe einen neuen Arduino Nano 33 IoT an meinen PC angeschlossen und ein einfaches Programm zum Testen hochgeladen. Das hat funktioniert.

Nachdem ich dann aber ein größeres Programm hochgeladen habe konnte der Nano nicht mehr gefunden werden.
Wenn ich den Nano neu an den PC anschließe, taucht eine Info-Meldung mit Fehlerhaftem USB-Gerät auf (siehe Anhang).
Der Arduino Nano ist auch im Gerätemanager nicht zu finden.

Kann es sein, dass der Arduino durch ein hochgeladenes Programm kaputt geht?

Fehler USB device.png

Fehler USB device.png

dustin_the_wind:
Kann es sein, dass der Arduino durch ein hochgeladenes Programm kaputt geht?

Kaputt nicht, aber es kann durchaus sein, dass ein Sketch die Schnittstelle blockiert.

Und durch welche Sketch Zeilen kann das zB. passieren oder an welchen Stellen sollte man da aufpassen?

Auf dem Uno Wifi rev2 läuft das Programm...

dustin_the_wind:
Und durch welche Sketch Zeilen kann das zB. passieren oder an welchen Stellen sollte man da aufpassen?

Auf dem Uno Wifi rev2 läuft das Programm…

Sorry, ich kann nicht hellsehen. Ich kenne deinen Sketch nicht.

Wenn du es nicht weißt, dann solltest du den hier posten.
Setze deinen Sketch bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken, oder [ code] davor und [ / code] dahinter ohne Leerzeichen.
Oder im IDE-Fenster rechte Maustaste und für “Forum kopieren klicken”, danach hier einfügen.

Damit wird dieser für alle besser lesbar.

dustin_the_wind:
Kann es sein, dass der Arduino durch ein hochgeladenes Programm kaputt geht?

Nicht unbedingt.
Möglicherweise hats einfach die firmware zerhackt.
Neu drauf schreiben.

Sketch Teil 1

#include "Wire.h"
#define TCAADDR 0x70
#define NumberOfValues 10
#define Datenreihen 8

const int Sensor1adrr = 0x68; // I2C address of the MPU-6050
const int Sensor2adrr = 0x68; // I2C address of the MPU-6050
const int Sensor3adrr = 0x68; // I2C address of the MPU-6050
const int Sensor4adrr = 0x68; // I2C address of the MPU-6050 //Sensor einzeln in SM
const int Sensor5adrr = 0x69; // I2C address of the MPU-6050 //Sensor auf der Kabelklemme (misst nur Beschleunigung)
int16_t AcX1, AcY1, AcZ1;
int16_t AcX2, AcY2, AcZ2;
int16_t AcX3, AcY3, AcZ3;
int16_t AcX4, AcY4, AcZ4;
int16_t AcX5, AcY5, AcZ5;

unsigned long setMillis1, setMillis2, setMillis3 = 0, setMillis4, setMillis5; //1. Print Data 2. Measure Angle 3. Flash Alarm 4. Clock 5. Debouncing Delay
unsigned long timePassedRaw;
float timePassed;
int checkAngleOne, checkAngleTwo;
int timeDelayPrint = 10;
int angleToleranceX = 10; // angleTolerance of the X-Achse in °
int alarmDelay = 100;
int noAlarmArea[] = {90, 18, 28}; // No X-Angle-Alarm in the angleTolerance at 90° of the Y-Achse. {X1, X2, X3}
int flashAlarm = 0;

float AcX1Zeroms2, AcY1Zeroms2, AcZ1ms2;
float accOnemax = 0, accOnemin = 0;
float AcX2Zeroms2, AcY2Zeroms2, AcZ2ms2;
float AcX2max = 0, AcX2min = 0;
float AcX3Zeroms2, AcY3Zeroms2, AcZ3ms2;
float AcX3max = 0, AcX3min = 0;

float angleX1, angleY1, angleX2, angleY2, angleX3, angleY3, angleX4, angleY4;

const int green = 18;
const int red = 6;
const int strengthMember1 = 45;
const int strengthMember2 = 41;
const int strengthMember3 = 37;
const int strengthMember4 = 35;
//const int strengthMember5 = 31;   //Überwachung SM anderes Kabel
const int button = 11;
const int switchRelais = 10;

const float angleOffsetX1 = -2.75;
const float angleOffsetY1 = 0.4;
const float angleOffsetX2 = 0.6;
const float angleOffsetY2 = -1.93;
const float angleOffsetX3 = -1;
const float angleOffsetY3 = 0.25;
const float angleOffsetX4 = 0;
const float angleOffsetY4 = 0;

float offsetRangeUpPositiveY[] = {1.0, 5.09, 28.14, 42.51, 53.35, 62.44, 66.12, 69.98, 73.53, 76.05, 77.19, 78.3, 79.36, 80.71, 81.54, 82.88, 83.76, 85.44, 86.11, 87.05, 87.79, 88.31, 88.99, 90.93, 91.64, 92.66, 93.6, 95.95, 97.03, 98.13, 99.44, 100.13, 101.35, 102.83, 104.89, 107.19, 110.95, 115.58, 120.41, 123.99, 128.87, 141.12, 156.01, 166.24, 169.44, 173};
float offsetRangeUpPositiveX[] = {1.10, 1.5, 2.46, 3.46, 4.47, 5.48, 6.49, 7.47, 8.54, 9.55, 10.6, 11.43, 12.42, 13.54, 14.72, 17.03, 19.48, 25.95, 29.79, 38.03, 48.17, 55.27, 57.59, 48, 42.3, 33.93, 26.71, 16.52, 12.59, 10.64, 8.44, 7.56, 6.55, 5.01, 4.04, 2.69, 1.62, 0.69, 0.01, -0.49, -0.98, -2.02, -3, -3.9, -3.01, -2.45};

float Sensordaten[NumberOfValues][Datenreihen];
float SortierteSensordaten[NumberOfValues][Datenreihen];
float medianArray [Datenreihen];
float angleXSet [3];
float acZset [2];

float offsetFactor, offsetValue;
float angleXOffset;


void clockAndReset() {
  timePassedRaw = (millis() - setMillis4);
  timePassed = ((double)timePassedRaw / 1000.00);

  if (digitalRead(button) == 0) {
    setMillis5 = millis();
  }
  if ((millis() - setMillis5) > 10) {
    setMillis4 = millis();
  }
}

void tcaselect(uint8_t i)
{
  if (i > 7) return;
  Wire.beginTransmission(TCAADDR);
  Wire.write(1 << i);
  Wire.endTransmission();
}

void collectData() {

  //Wire (21/22) 0x68 Sensor 1
  tcaselect(5);
  Wire.beginTransmission(Sensor1adrr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  tcaselect(5);
  Wire.beginTransmission(Sensor1adrr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(Sensor1adrr, 6, true); // request a total of 14 registers
  AcX1 = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY1 = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ1 = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)

  //Wire (21/22) 0x68 Sensor 2
  tcaselect(6);
  Wire.beginTransmission(Sensor2adrr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  tcaselect(6);
  Wire.beginTransmission(Sensor2adrr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(Sensor2adrr, 6, true); // request a total of 14 registers
  AcX2 = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY2 = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ2 = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)

  //Wire (21/22) 0x68 Sensor 3
  tcaselect(7);
  Wire.beginTransmission(Sensor3adrr);
  Wire.write(0x6B);  // PWR_MGMT_1 register
  Wire.write(0);     // set to zero (wakes up the MPU-6050)
  Wire.endTransmission(true);
  tcaselect(7);
  Wire.beginTransmission(Sensor3adrr);
  Wire.write(0x3B);  // starting with register 0x3B (ACCEL_XOUT_H)
  Wire.endTransmission(false);
  Wire.requestFrom(Sensor3adrr, 6, true); // request a total of 14 registers
  AcX3 = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
  AcY3 = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
  AcZ3 = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
}

Sketch Teil 2

void calcAngle () {

  angleY1 = (((atan2(AcX1, AcZ1)) * RAD_TO_DEG) - angleOffsetY1) * -1;
  angleX1 = (atan2(AcY1, AcZ1)) * RAD_TO_DEG - angleOffsetX1;
  angleY2 = (((atan2(AcX2, AcZ2)) * RAD_TO_DEG) - angleOffsetY2) * -1;
  angleX2 = (atan2(AcY2, AcZ2)) * RAD_TO_DEG - angleOffsetX2;
  angleY3 = (((atan2(AcX3, AcZ3)) * RAD_TO_DEG) - angleOffsetY3) * -1;
  angleX3 = (atan2(AcY3, AcZ3)) * RAD_TO_DEG - angleOffsetX3;
  angleY4 = (atan2(AcX4, AcZ4)) * RAD_TO_DEG - angleOffsetY4;
  angleX4 = (atan2(AcY4, AcZ4)) * RAD_TO_DEG - angleOffsetX4;

  if (angleX1 > 90 || angleX1 < -90) {
    angleX1 = 180 * (angleX1 / abs(angleX1)) - angleX1;
  }
  if (angleX2 > 90 || angleX2 < -90) {
    angleX2 = 180 * (angleX2 / abs(angleX2)) - angleX2;
  }
  if (angleX3 > 90 || angleX3 < -90) {
    angleX3 = 180 * (angleX3 / abs(angleX3)) - angleX3;
  }
  if (angleX4 > 90 || angleX4 < -90) {
    angleX4 = 180 * (angleX4 / abs(angleX4)) - angleX4;
  }


  if (angleY1 > 90 || angleY1 < -90) {
    angleY1 = 180 * (angleY1 / abs(angleY1)) - angleY1;
  }
  if (angleY2 > 90 || angleY2 < -90) {
    angleY2 = 180 * (angleY2 / abs(angleY2)) - angleY2;
  }
  if (angleY3 > 90 || angleY3 < -90) {
    angleY3 = 180 * (angleY3 / abs(angleY3)) - angleY3;
  }
  if (angleY4 > 90 || angleY4 < -90) {
    angleY4 = 180 * (angleY4 / abs(angleY4)) - angleY4;
  }
}

void sortData()
{
  memcpy(SortierteSensordaten, Sensordaten, sizeof(Sensordaten));
  for (int k = 0; k < Datenreihen; k++)
  {
    for (int y = 1; y < NumberOfValues; y++)
    {
      for (int i = 0; i < NumberOfValues - y; i++)
      {
        if (SortierteSensordaten[i][k] > SortierteSensordaten[i + 1][k])
        {
          float temp = SortierteSensordaten[i][k];
          SortierteSensordaten[i][k] = SortierteSensordaten[i + 1][k];
          SortierteSensordaten[i + 1][k] = temp;
        }
      }
    }
  }
}

void angleAlarm() {

  for (int i = 0; i < Datenreihen - 2; i = i + 2)
  {
    angleXSet[i / 2] = medianArray[i];
    if (medianArray[i + 1] > noAlarmArea[i / 2])  //If Y-Value größer als Y-noAlarmArea
    {
      angleXSet[i / 2] = 0;
    }
  }
}

void accAlarm() {

  AcX1Zeroms2 = ((AcX1) / 16384.0) * 9.81 - 0.2;
  AcY1Zeroms2 = ((AcY1) / 16384.0) * 9.81 - 0.56;
  AcX2Zeroms2 = ((AcX2) / 16384.0) * 9.81 - 0.2;
  AcY2Zeroms2 = ((AcY2) / 16384.0) * 9.81 - 0.67;
  AcX3Zeroms2 = ((AcX3) / 16384.0) * 9.81 - 0.2;
  AcY3Zeroms2 = ((AcY3) / 16384.0) * 9.81 - 0.37;

  //Acc Z um Hüpfen zu tracken
  AcZ2ms2 = ((AcZ2) / 16384.0) * 9.81 - 0.53;
  AcZ3ms2 = ((AcZ3) / 16384.0) * 9.81 + 0.61;

}

void monitoringSM() {
  if ((digitalRead(strengthMember1) == 0 || digitalRead(strengthMember2) == 0 || digitalRead(strengthMember3) == 0  || digitalRead(strengthMember4) == 0) && flashAlarm != 1) {
    digitalWrite(green, LOW);
    digitalWrite(red, HIGH);
  }
  if (digitalRead(strengthMember1) == 0 || digitalRead(strengthMember2) == 0 || digitalRead(strengthMember3) == 0  || digitalRead(strengthMember4) == 0) {
    digitalWrite(switchRelais, LOW);
  }
}
void calcAccZ () {
  float accZOffset[] = {0.16, 0.12};
  acZset[0] = medianArray[6];
  acZset[1] = medianArray[7];
  for (int i = 0; i < 2; i++) {
    acZset[i] += 9.81 + accZOffset[i];
    if (medianArray[i + 6] > 0 || medianArray[2 * i + 3] > 10 ) {
      acZset[i] = 0;
    }
  }
}
void printData () {
  if ((millis() - setMillis1) >= timeDelayPrint) {

    Serial.print(timePassed); Serial.print(",");
    Serial.print(angleX1); Serial.print(",");
    Serial.print(angleY1); Serial.print(",");
    Serial.print(angleX2); Serial.print(",");
    Serial.print(angleY2); Serial.print(",");
    Serial.print(angleX3); Serial.print(",");
    Serial.print(angleY3); Serial.print(",");
    Serial.print(AcZ2ms2); Serial.print(",");
    Serial.print(AcZ3ms2); Serial.print(",");
    for (int i = 0; i < Datenreihen; i++) //Print Median
    {
      Serial.print(medianArray[i]); Serial.print(",");
    }
    for (int z = 0; z < 3; z++) //Print X-Angle Comp Area
    {
      Serial.print(angleXSet[z]); Serial.print(",");
    }
    for (int k = 0; k < 2; k++) //Print Acc Z Set
    {
      Serial.print(acZset[k]); Serial.print(",");
    }
    Serial.print("\r\n");
    setMillis1 = millis();
  }
}

void setup() {
  Serial.begin(9600);

  pinMode(green, OUTPUT);
  pinMode(red, OUTPUT);
  pinMode(switchRelais, OUTPUT);
  digitalWrite(green, HIGH);
  digitalWrite(red, LOW);
  digitalWrite(switchRelais, HIGH);      //Manuell Relais Schalten default HIGH
  pinMode(strengthMember1, INPUT);
  pinMode(strengthMember2, INPUT);
  pinMode(strengthMember3, INPUT);
  pinMode(strengthMember4, INPUT);
  //pinMode(strengthMember5, INPUT);
  pinMode(button, INPUT);
  Wire.begin(); // SDA1 pin 21, SCL1 pin 22
}

void loop() {
  clockAndReset ();
  collectData ();
  calcAngle ();
  for (int y = 0; y < NumberOfValues - 1; y++)
    for (int k = 0; k < Datenreihen; k++)
      Sensordaten[y][k] = Sensordaten[y + 1][k];
  Sensordaten[NumberOfValues - 1][0] = angleX1;
  Sensordaten[NumberOfValues - 1][1] = angleY1;
  Sensordaten[NumberOfValues - 1][2] = angleX2;
  Sensordaten[NumberOfValues - 1][3] = angleY2;
  Sensordaten[NumberOfValues - 1][4] = angleX3;
  Sensordaten[NumberOfValues - 1][5] = angleY3;
  Sensordaten[NumberOfValues - 1][6] = AcZ2ms2;
  Sensordaten[NumberOfValues - 1][7] = AcZ3ms2;

  sortData();

  for (int i = 0; i < Datenreihen; i++)
  {
    medianArray[i] = (SortierteSensordaten[(NumberOfValues / 2) - 1][i] + SortierteSensordaten[NumberOfValues / 2][i]) / 2;
  }
  angleAlarm ();
  accAlarm ();
  monitoringSM ();
  calcAccZ();
  printData ();
}

Ich vermute mal, das liegt am anderen Controller.
Da wird einiges nicht passen.

Allerdings muss ich hier auch passen.

Nach einem Doppelklick auf die Reset Taste wird der Nano jetzt wieder erkannt und läuft auch wieder mit dem einfachen Programm.

Fakt ist also, dass der Fehler bei meinem Sketch liegt...

dustin_the_wind:
Nach einem Doppelklick auf die Reset Taste wird der Nano jetzt wieder erkannt und läuft auch wieder mit dem einfachen Programm.

Fakt ist also, dass der Fehler bei meinem Sketch liegt…

Ja, das ist sicher. Der hat ja keinen AVR sondern einen ARM drauf. Da musst du sicher einiges beachten.

dustin_the_wind:
Nach einem Doppelklick auf die Reset Taste wird der Nano jetzt wieder erkannt und läuft auch wieder mit dem einfachen Programm.

Fakt ist also, dass der Fehler bei meinem Sketch liegt…

Nö.
Nach einem Reset per Taste läuft der Sketch, der hochgeladen wurde, wieder ab initialisierung an.

Variante1: Während des hochladens ist die Verbindung mit dem bootloader abgebrochen - der vorherige Sketch ist noch drauf. Dann gehts natürlich nach’m manulellem Reset wieder.
Das hätte ich aber grundsätzlich zuerst ausprobiert.

Folgende Fehlermeldung wird angezeigt, wenn ich versuche den Sketch hochzuladen:

Sketch uses 29720 bytes (11%) of program storage space. Maximum is 262144 bytes.
Global variables use 4912 bytes (14%) of dynamic memory, leaving 27856 bytes for local variables. Maximum is 32768 bytes.
Atmel SMART device 0x10010005 found
Device       : ATSAMD21G18A
Chip ID      : 10010005
Version      : v2.0 [Arduino:XYZ] Apr 19 2019 14:38:48
Address      : 8192
Pages        : 3968
Page Size    : 64 bytes
Total Size   : 248KB
Planes       : 1
Lock Regions : 16
Locked       : none
Security     : false
Boot Flash   : true
BOD          : true
BOR          : true
Arduino      : FAST_CHIP_ERASE
Arduino      : FAST_MULTI_PAGE_WRITE
Arduino      : CAN_CHECKSUM_MEMORY_BUFFER
Erase flash
done in 1.048 seconds

Write 29720 bytes to flash (465 pages)
[==============================] 100% (465/465 pages)
done in 0.214 seconds

Verify 29720 bytes of flash with checksum.
Verify successful
done in 0.028 seconds
CPU reset.
Board at COM8 is not available

my_xy_projekt:
Nö.
Nach einem Reset per Taste läuft der Sketch, der hochgeladen wurde, wieder ab initialisierung an.

Aber ich habe die Reset Taste ja auch 2x gedrückt...

Sketch läuft. :slight_smile:

Hatte teilweise die Pinbelegung vom Arduino Uno übernommen.
Mit den Pins 35; 37; 41 und 45 konnte der Nano natürlich nichts anfangen. :-X

dustin_the_wind:
Sketch läuft. :slight_smile:
Mit den Pins 35; 37; 41 und 45 konnte der Nano natürlich nichts anfangen. :-X

Na bitte!

Danke für die Rückmeldung - schreib mal noch in Dein erstes Post in die Subjektzeile ein [gelöst] rein - dann lesen und finden später vielleicht noch ein paar User, die genau da hängen bleiben...

dustin_the_wind:
Sketch läuft. :slight_smile:

Hatte teilweise die Pinbelegung vom Arduino Uno übernommen.
Mit den Pins 35; 37; 41 und 45 konnte der Nano natürlich nichts anfangen. :-X

Könnte der UNO auch nicht.
Bei dem ist schon bei 19 Ende im Gelände

dustin_the_wind:
Folgende Fehlermeldung wird angezeigt, wenn ich versuche den Sketch hochzuladen:

Board at COM8 is not available

Das ist gar keine Fehlermeldung.
Ganz im Gegenteil!
Das sagt dir ganz deutlich, dass das hochladen geklappt hat.
Und dass er seinen Com Port verliert, ist auch ganz normal, bei einem Reset eines µC mit nativen USB Port