Skocz do zawartości

Program, problem z serwem.


Pomocna odpowiedź

Napisano

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

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

Jeżeli zakomentujesz te fragmenty z timerem, które dodałeś to program się skompiluje. Ale czy będzie działał tak jak zamierzałeś?

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ć.

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

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.

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.

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