Skocz do zawartości

Program, problem z serwem.


zioloiso

Pomocna odpowiedź

Zastanawiam się dlaczego po dodaniu biblioteki do serva, kompilator nie kompiluje kodu, bo chce serwo wykorzystać jako kierownice.

#define od_ch1 3  //numer pinuodbiornika
#define od_ch2 6 // drugi kanal
#define PWM 10 // wyjscie z jaka predkoscia jedzie
#define A_d 4 // kierunki obrotow
#define B_d 8

#include <Servo.h> // biblioteka serwa
Servo serwomechanizm; // obiet dzieki ktoremu mozemy sie odwolac do serwa



int ch1 = 0; // zmienne z odbiornika
int ch2 = 0; // zmienne z odbiornika

int szybkosc = 0; // zmienna do pwm szybkosci


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

 serwomechanizm.attach(9); // serwomechanizm podlaczony do pinu X
 serwomechanizm.write(100); // pozycja zero serwa

 pinMode(od_ch1,INPUT);
 pinMode(od_ch2,INPUT);

 pinMode(PWM, OUTPUT); //Sygnał PWM silnika
 pinMode(A_d, OUTPUT); //Sygnały sterujące kierunkiem obrotów silnika nr 1
 pinMode(B_d, OUTPUT);

 //timer
 cli();
 TCCR1A = 0;
 TCCR1B = 0;
 TCNT1  = 0; 
 OCR1A = 3200;  // probkowanie co okolo 200 ms
 TCCR1B |= (1 << WGM12); 
 TCCR1B |= (1 << CS12) | (1 << CS10);    
 TIMSK1 |= (1 << OCIE1A);
 sei();

}//setup


ISR(TIMER1_COMPA_vect){

 driver( &szybkosc, ch2 );
 pilot( &ch1, &ch2 );

}

void pilot( int *ch1, int * ch2 )
{
 *ch1 = pulseIn(od_ch1, HIGH); 
 *ch2 = pulseIn(od_ch2, HIGH); 
}

void driver( int * szybkosc, int ch2 )
{
 *szybkosc = map(ch2, 1000, 2000, -255, 255);
 if( *szybkosc >= -50 && *szybkosc <= 50 ){    
   digitalWrite(A_d,LOW);
   digitalWrite(B_d,LOW); 
 }

 if( *szybkosc >= 50 )
 {
   digitalWrite(A_d,HIGH);
   digitalWrite(B_d,LOW);
 }
 if( *szybkosc < 0 )
 {
 *szybkosc = abs( *szybkosc );
 if( *szybkosc >= 50 ){
   digitalWrite(A_d,LOW);
   digitalWrite(B_d,HIGH);
 }
 }
}

void kierowanie( int * ch2 ) 
{

}

void loop() 
{

}

__________

Komentarz dodany przez: Treker

Link do komentarza
Share on other sites

A czemu nie wkleisz tego co kompilator wyrzucił w konsoli?

W tym przypadku może to być bardziej pomocne od kodu programu (może przydać się też info o tym skąd jest biblioteka - tak tylko głośno myślę).

--- dodane

ciągle się uczę, że trzeba się domyślić kod przekleić i ...

libraries\Servo\avr\Servo.cpp.o (symbol from plugin): In function `ServoCount':

(.text+0x0): multiple definition of `__vector_11'

sketch\DigitalReadSerial.ino.cpp.o (symbol from plugin)🙁.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1

Błąd kompilacji dla płytki Arduino/Genuino Uno

---

Google mówi coś o konflikcie z timerem.

https://forum.arduino.cc/index.php?topic=443192.0

Sorry chciałem dobrze a wyszło, że "nie wiem, ale się wypowiem" 🤯

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

W tym projekcie obejdzie się bez timera, ale w następnym by się przydał, bo będę chciał zrobić, aby model sam jeździł, bez sterowania na czujniku ultra dźwiękowym. Zastanawiam się jak to przeskoczyć.

Link do komentarza
Share on other sites

https://arduino-info.wikispaces.com/Timers-Arduino

Timer0: 8bit timer.

In the Arduino world timer0 is been used for the software Sketch timer functions, like __delay()__, __millis()__ and __micros()__. If you change timer0 registers, this may influence the Arduino timer function. So you should know what you are doing.

Timer1: 16bit timer.

In the Arduino world the __Servo library__ uses timer1 on Arduino Uno (timer5 on Arduino Mega).

Timer2: 8bit timer like timer0.

In the Arduino world the __tone()__ function uses timer2.

Timer3, Timer4, Timer5: 16bit Timers

Timer 3,4,5 are only available on Arduino Mega boards.

Musisz wykorzystać wolny timer (czyli np. numer 2 jeśli masz płytkę z 328p).

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Ok, a jak zrobić, aby mikro serwo po każdym włączeniu ustawiało się w tym samy miejscu? Bo mam tak, że nie jest zawsze tak samo, nie będę przecież tego pozycjonował za każdym razem.

Link do komentarza
Share on other sites

Ok, a jak zrobić, aby mikro serwo po każdym włączeniu ustawiało się w tym samy miejscu?

To dziwna sprawa, powinno ustawiać się dla danej długości impulsu sterującego zawsze w tej samej pozycji - oczywiście z poprawką na dokładność pozycjonowania + zakładam, że nie ma na ramieniu serwa jakiegoś dużego obciążenia.

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • 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.