14-01-2019, 18:36
(Ten post był ostatnio modyfikowany: 14-01-2019, 18:40 przez johnyNapalm.)
Temat przeniosłem z działu "Instalacja i rozwiązywanie problemów", gdyż z początku myślałem że nie jest on spowodowany problemem w kodzie.
A więc tworze autonomicznego robota składającego się z:
- dwóch czujników ultradźwiękowych
- dwóch czujników szczelinowych
- dwóch silników DC
- modułu kart mikro SD
Kod mojego programu:
https://pastebin.com/NgUy9jJu
Problem jest z funkcją timera która służy mi do obliczania prędkości obrotu kół robota
Gdy funkcja jest wywoływana w robocie działa tylko jeden silnik i przy zewnętrznym zasilaniu informacje nie zgrywają się na kartę SD (przy zasilaniu USB informacje się zgrywają).
Natomiast gdy funkcja timera nie jest uruchamiana robot jeździ dobrze.
Zaznaczę również że funkcja timera nie działa nawet gdy nie drukuje w niej informacji do karty SD.
W załączniku schemat (przepraszam że tak mało czytelny ale jestem początkujący), oraz zdjęcia robota.
A więc tworze autonomicznego robota składającego się z:
- dwóch czujników ultradźwiękowych
- dwóch czujników szczelinowych
- dwóch silników DC
- modułu kart mikro SD
Kod mojego programu:
https://pastebin.com/NgUy9jJu
Problem jest z funkcją timera która służy mi do obliczania prędkości obrotu kół robota
Kod:
void setup() {
Serial.begin(9600);
//Ustawienie timera
Timer1.initialize(1000000); // ustawienie timera na sekunde
//zwieksz counter1 gdy pin predkosciomieza jest na Hig
attachInterrupt(digitalPinToInterrupt (motor_A), ISR_count_A, RISING);
//zwieksz counter2 gdy pin predkosciomieza jest na High
attachInterrupt(digitalPinToInterrupt (motor_B), ISR_count_B, RISING);
}
void ISR_timerone(){
Timer1.detachInterrupt(); //Stop timera
Serial.print("Motor1 Speed: ");
float rotation_A = (counter_A / diskslots) * 60.00; //obliczenie obrotow na minute (RPM) dla motor1
Serial.print(RMPtoCmS(rotation_A));
Serial.print(" Cm/s - ");
counter_A = 0;
Serial.print("Motor2 Speed: ");
float rotation_B = (counter_B / diskslots) * 60.00; //obliczenie obrotow na minute (RPM) dla motor2
Serial.print(RMPtoCmS(rotation_B));
Serial.println(" Cm/s");
counter_B = 0;
float srednia_predkosc = (RMPtoCmS(rotation_A) + RMPtoCmS(rotation_B)) /2;
//zapisywanie informacji o prędkości na karcie SD
myFile = SD.open("DaneMapy.txt", FILE_WRITE);
if (myFile) {
Serial.println("Writing to file...");
myFile.print("Motor1: ");
myFile.print(RMPtoCmS(rotation_A));
myFile.print("Motor2: ");
myFile.print(RMPtoCmS(rotation_B));
myFile.print(" Średnia prędkość: ");
myFile.print(srednia_predkosc);
myFile.close();
Serial.println("Done.");
}
Timer1.attachInterrupt(ISR_timerone);
}
Natomiast gdy funkcja timera nie jest uruchamiana robot jeździ dobrze.
Zaznaczę również że funkcja timera nie działa nawet gdy nie drukuje w niej informacji do karty SD.
W załączniku schemat (przepraszam że tak mało czytelny ale jestem początkujący), oraz zdjęcia robota.