Skocz do zawartości

Problem z wykonywaniem programu Arduino A4988 CNC


kacperblaszczuk

Pomocna odpowiedź

Cześć, od jakiegoś czasu pracuję nad projektem, który polega na zaprojektowaniu, zbudowaniu i zaprogramowaniu plotera do skanowania pola magnetycznego. Elektronika układu to Arduino Uno R3 oraz CNC Shield ze sterownikami A4988, czujnik to magnetometr GY-271. Problem polega na tym, że kod który napisałem dziś przestał działać a nie modyfikowałem go od ostatniego razu kiedy wszystko było w porządku, nie wiem gdzie może być błąd ale wydaje mi się, że w kodzie dotyczącym obsługi czujnika magnetycznego próbowałem go zmienić ale niestety bez powodzenia tak jakby kod utkną w pętli while. Kod do obsługi czujnika zapożyczyłem od Jastrzębskiego ze strony http://www.jarzebski.pl/arduino/czujniki-i-sensory/3-osiowy-magnetometr-hmc5883l.html Całość kodu poniżej.

#include <Wire.h> //biblioteka do komunikacji z czujnikiem przez I2C
#include <HMC5883L.h>  //biblioteka do obsługi czujnika

#define dirPin_X 5
#define stepPin_X 2
#define dirPin_Y 6
#define stepPin_Y 3
#define enable 8

int kroki_X = 400;          //kroki silnika osi X, 400 kroków =  przesunięcie o 1mm 
int kroki_Y = 80;           //kroki silnika ois Y, 80 kroków = przesuięcie o 1mm
int rozmiar_X = 2;          //liczba wykoania pętli for ruchu silnika osi X
int rozmiar_Y = 20;         //liczba wykoania pętli for ruchu silnika osi Y
int predkosc_X = 2000;      //szybkości z jaką będzie obracał się silnik osi X
int predkosc_Y = 2000;      //szybkości z jaką będzie obracał się silnik osi X
int LiczbaProbek = 1;       //liczba pomiarów do wykanania wzdłuż osi Y
int koniec = 6;             //warunek kończący pracę skanera
int pozycja_x;              //pusty zbiór do zapisu pozycji silnika osi X
int pozycja_y;              //pusty zbiór do zapisu pozycji silnika osi Y
String odebraneDane = "";   // pusty ciąg odebranych danych 

HMC5883L czujnik;           //zmienna globalna

void setup() {
  Serial.begin(9600);       //rozpoczęcie komunikacji

  // Inicjalizacja HMC5883L
  Serial.println("Initialize HMC5883L");
  while (!czujnik.begin())
  {
    Serial.println("Nie odnaleziono HMC5883L, sprawdz polaczenie!");
    delay(500);
  }
  // Ustawienie zakresu pomiarowego
  // +/- 0.88 Ga: HMC5883L_RANGE_0_88GA
  // +/- 1.30 Ga: HMC5883L_RANGE_1_3GA (domyslny)
  // +/- 1.90 Ga: HMC5883L_RANGE_1_9GA
  // +/- 2.50 Ga: HMC5883L_RANGE_2_5GA
  // +/- 4.00 Ga: HMC5883L_RANGE_4GA
  // +/- 4.70 Ga: HMC5883L_RANGE_4_7GA
  // +/- 5.60 Ga: HMC5883L_RANGE_5_6GA
  // +/- 8.10 Ga: HMC5883L_RANGE_8_1GA
  czujnik.setRange(HMC5883L_RANGE_1_3GA);
 
  // Ustawienie trybu pracy
  // Uspienie:              HMC5883L_IDLE
  // Pojedynczy pomiar:     HMC5883L_SINGLE
  // Ciagly pomiar: HMC5883L_CONTINOUS (domyslny)
  czujnik.setMeasurementMode(HMC5883L_CONTINOUS);
 
  // Ustawienie czestotliwosci pomiarow
  //  0.75Hz: HMC5883L_DATARATE_0_75HZ
  //  1.50Hz: HMC5883L_DATARATE_1_5HZ
  //  3.00Hz: HMC5883L_DATARATE_3HZ
  //  7.50Hz: HMC5883L_DATARATE_7_50HZ
  // 15.00Hz: HMC5883L_DATARATE_15HZ (domyslny)
  // 30.00Hz: HMC5883L_DATARATE_30HZ
  // 75.00Hz: HMC5883L_DATARATE_75HZ
  czujnik.setDataRate(HMC5883L_DATARATE_15HZ);
 
  // Liczba usrednionych probek
  // 1 probka:  HMC5883L_SAMPLES_1 (domyslny)
  // 2 probki: HMC5883L_SAMPLES_2
  // 4 probki: HMC5883L_SAMPLES_4
  // 8 probki: HMC5883L_SAMPLES_8
  czujnik.setSamples(HMC5883L_SAMPLES_1);
  
  pinMode(stepPin_X, OUTPUT);   //Ustawienie stepPin_X jako wyjście
  pinMode(dirPin_X, OUTPUT);    //Ustawienie dirPin_X jako wyjście
  pinMode(stepPin_Y, OUTPUT);   //Ustawienie stepPin_Y jako wyjście
  pinMode(dirPin_Y, OUTPUT);    //Ustawienie dirPin_X jako wyjście
  pinMode(enable, HIGH);        //Ustawienie stanu wyskoiego na enable 
}
void loop(){

  if(Serial.available() > 0) {                      //Czy arduino odebrało dane?
                                                    //jeżeli tak to odczytaj je do znaku końca linii i zapisz w zmiennej odebrane dane
    odebraneDane = Serial.readStringUntil('\n');
    
    for(int i = 0;odebraneDane == "start";i++){     //Jeżeli odebrane słowo to start rozpocznij program poniżej
      if (pozycja_x < koniec){                           //Warunek zatrzymania programu

      for (int i = 0; i < rozmiar_Y; i++){                  //Pętla odpowiedzialna za ruch silnika wzdłuż osi Y+
        kroki_plus1mm_Y();
        Vector norm = czujnik.readNormalize();      //pomiar pola magnetycznego wykonywany co 1mm
        pozycja_y = pozycja_y + LiczbaProbek;                  //Zapisywanie pozycji silnika osi Y
        Serial.print("x_");                         //Wyświetlenie aktualnej pozycji osi X
        Serial.print(pozycja_x); 
        Serial.print(" Y_");                        //Wyświetlenie aktualnej pozycji osi Y    
        Serial.print(pozycja_y);
        Serial.print("   pomiar = ");               //Wyświetlenie wyniku pomiaru pola magnetycznego
        Serial.print(norm.ZAxis);
        Serial.println( );
       }
       
      for (int i = 0; i < rozmiar_X; i++){                   //Pętla odpowiedzialna za ruch silnika wzdłuż osi x+
        kroki_plus1mm_X();    
        pozycja_x = pozycja_x + 1;                  //Zapisywanie pozycji silnika osi X
       }
      for (int i = 0; i < rozmiar_Y; i++){                 //Pętla odpowiedzialna za ruch silnika wzdłuż osi Y-
        kroki_minus1mm_Y();
        Vector norm = czujnik.readNormalize();      //pomiar pola magnetycznego wykonywany co 1mm
        pozycja_y = pozycja_y - LiczbaProbek;                  //Zapisywanie pozycji silnika osi Y
        Serial.print("x_");                         //Wyświetlenie aktualnej pozycji osi X
        Serial.print(pozycja_x); 
        Serial.print(" Y_");                        //Wyświetlenie aktualnej pozycji osi Y
        Serial.print(pozycja_y);
        Serial.print("   pomiar = ");               //Wyświetlenie wyniku pomiaru pola magnetycznego
        Serial.print(norm.ZAxis);
        Serial.println( );
       }
      for (int i = 0; i < rozmiar_X; i++){                   //Pętla odpowiedzialna za ruch silnika wzdłuż osi x+
        kroki_plus1mm_X();    
        pozycja_x = pozycja_x + 1;                  //Zapisywanie pozycji silnika osi X
       }
      }
      else{
        Serial.println("SKANOWANIE ZAKOŃCZONO");
        delay(5000);      
      }
    }
  }
}
void kroki_plus1mm_X(){
  digitalWrite(dirPin_X, HIGH);  //ustwaienie kierunku wirowania silnika x zgodnie ze wskazówkami zegara

  for (int i = 0; i <kroki_X; i++) {    //400 kroków przesunięcie o +1mm
    digitalWrite(stepPin_X, HIGH); //jeden krok silnika  
    delayMicroseconds(predkosc_X);
    digitalWrite(stepPin_X, LOW);
    delayMicroseconds(predkosc_X);    
  }
}
void kroki_plus1mm_Y(){
  digitalWrite(dirPin_Y, HIGH);  //ustwaienie kierunku wirowania silnika Y zgodnie ze wskazówkami zegara

  for (int i = 0; i <kroki_Y; i++) {    //5 kroków przesunięcie o +1mm
    digitalWrite(stepPin_Y, HIGH); //jeden krok silnika  
    delayMicroseconds(predkosc_Y);
    digitalWrite(stepPin_Y, LOW);
    delayMicroseconds(predkosc_Y); 
  }
}
void kroki_minus1mm_X(){
  digitalWrite(dirPin_X, LOW);  //ustwaienie kierunku wirowania silnika X przeciwnie do ruchu wskazówek zegara

  for (int i = 0; i <kroki_X; i++) {    //400 kroków przesunięcie o -1mm
    digitalWrite(stepPin_X, HIGH); //jeden krok silnika  
    delayMicroseconds(predkosc_X);
    digitalWrite(stepPin_X, LOW);
    delayMicroseconds(predkosc_X);
  }
}
void kroki_minus1mm_Y(){
  digitalWrite(dirPin_Y, LOW);  //ustwaienie kierunku wirowania silnika y przeciwnie do ruchu wskazówek zegara

  for (int i = 0; i <kroki_Y; i++) {    //5 kroków przesunięcie o -1mm
    digitalWrite(stepPin_Y, HIGH); //jeden krok silnika  
    delayMicroseconds(predkosc_Y);
    digitalWrite(stepPin_Y, LOW);
    delayMicroseconds(predkosc_Y);  
  }
}

 

Link do komentarza
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.