Ovdje pročitajte kako se registrirati na forum.

Damba i Servo.h biblioteka

Tehnička podrška za Croduino 8-bitne pločice: Basic, Basic2, NOVA, miniNOVA, Damba, ETA
Odgovorite
domagoj#7440
Hobist
Hobist
Postovi: 53
Pridružen/a: ned tra 15, 2018 2:59 pm

Damba i Servo.h biblioteka

Post Postao/la domagoj#7440 » ned svi 12, 2019 8:24 pm

Pozdrav!
Dobivam compile grešku za Dambu kada uključim Servo.h datoteku. Naravno, kod Basic2 nema problema. Postoji li način da se Servo.h koristi s Dambom ili neka druga biblioteka?
Još program nisam ni počeo pisati, samo sam uključio biblioteku:
#include <Servo.h>
U nastavku je tekst greške.
Pozdrav, Domagoj

Kod: Označite sve

Arduino: 1.8.5 (Windows 7), Board: "ATtiny25/45/85, ATtiny85, Internal 8 MHz"

D:\Program Files (x86)\arduino-1.8.5\libraries\Servo\src\avr\Servo.cpp: In function 'void __vector_3()':

D:\Program Files (x86)\arduino-1.8.5\libraries\Servo\src\avr\Servo.cpp:82:44: error: cannot convert 'volatile uint8_t* {aka volatile unsigned char*}' to 'volatile uint16_t* {aka volatile unsigned int*}' for argument '2' to 'void handle_interrupts(timer16_Sequence_t, volatile uint16_t*, volatile uint16_t*)'

   handle_interrupts(_timer1, &TCNT1, &OCR1A);

D:\Program Files (x86)\arduino-1.8.5\libraries\Servo\src\avr\Servo.cpp: In function 'void initISR(timer16_Sequence_t)':

D:\Program Files (x86)\arduino-1.8.5\libraries\Servo\src\avr\Servo.cpp:129:5: error: 'TCCR1B' was not declared in this scope

     TCCR1B = _BV(CS11);     // set prescaler of 8

D:\Program Files (x86)\arduino-1.8.5\libraries\Servo\src\avr\Servo.cpp:136:5: error: 'TIFR1' was not declared in this scope

     TIFR1 |= _BV(OCF1A);     // clear any pending interrupts;

D:\Program Files (x86)\arduino-1.8.5\libraries\Servo\src\avr\Servo.cpp:137:5: error: 'TIMSK1' was not declared in this scope

     TIMSK1 |=  _BV(OCIE1A) ; // enable the output compare interrupt

exit status 1
Error compiling for board ATtiny25/45/85.
Avatar
david.zovko#5448
e-radionica.com team
e-radionica.com team
Postovi: 188
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: Damba i Servo.h biblioteka

Post Postao/la david.zovko#5448 » ned svi 12, 2019 11:11 pm

Bok Domagoj!

Nismo još nikada probali tu kombinaciju, sad nemam blizu Attiny85, ali kako bi što brže dao odgovor; na netu javljaju da uspješno radi kombinacija librarya SoftwareServo i Attiny85: https://playground.arduino.cc/ComponentLib/Servo/

Example:

Kod: Označite sve

#include <SoftwareServo.h>

SoftwareServo servo;

void setup()
{ 
  servo.attach(0);}

void loop() {
    int pos;
    for(pos = 0; pos < 180; pos += 1) { 
        servo.write(pos);              
        delay(50);                      
        SoftwareServo::refresh();
    } 
    for(pos = 180; pos>=1; pos-=1) {                                
        servo.write(pos);              
        delay(50);                      
        SoftwareServo::refresh();
    } 
}
Molim te javi kada probaš! :)
domagoj#7440
Hobist
Hobist
Postovi: 53
Pridružen/a: ned tra 15, 2018 2:59 pm

Re: Damba i Servo.h biblioteka

Post Postao/la domagoj#7440 » pon svi 13, 2019 10:18 am

Hvala Davide!
Svakako javim.
domagoj#7440
Hobist
Hobist
Postovi: 53
Pridružen/a: ned tra 15, 2018 2:59 pm

Re: Damba i Servo.h biblioteka

Post Postao/la domagoj#7440 » pon svi 13, 2019 10:38 pm

Viva Damba!
Ona biblioteka koju je David naveo u gornjem postu radi, ali sam morao napraviti malu preinaku. Kada sam je uključio onakva kakva je javljala se compile greška da ne može naći WProgram.h datoteku. Onda sam malo googlao i našao da se u nekim situacijama (nisam istraživao koje) uzima ili WProgram.h ili Arduino.h datoteka. Editirao sam SoftwareServo.h i WProgram.h stavio u komentar a dodao Arduino.h. Evo koda:

Kod: Označite sve

#ifndef SoftwareServo_h
#define SoftwareServo_h

//#include <WProgram.h> //ovo isključiti
#include <Arduino.h> //ovo sam dodao
//dalje ništa ne treba dirati

#include <inttypes.h>

class SoftwareServo
{
  private:
    uint8_t pin;
    uint8_t angle;       // in degrees
    uint16_t pulse0;     // pulse width in TCNT0 counts
    uint8_t min16;       // minimum pulse, 16uS units  (default is 34)
    uint8_t max16;       // maximum pulse, 16uS units, 0-4ms range (default is 150)
    class SoftwareServo *next;
    static SoftwareServo* first;
  public:
    SoftwareServo();
    uint8_t attach(int);     // attach to a pin, sets pinMode, returns 0 on failure, won't
                             // position the servo until a subsequent write() happens
    void detach();
    void write(int);         // specify the angle in degrees, 0 to 180
    uint8_t read();
    uint8_t attached();
    void setMinimumPulse(uint16_t);  // pulse length for 0 degrees in microseconds, 540uS default
    void setMaximumPulse(uint16_t);  // pulse length for 180 degrees in microseconds, 2400uS default
    static void refresh();    // must be called at least every 50ms or so to keep servo alive
                              // you can call more often, it won't happen more than once every 20ms
};

#endif
Nakon toga compile je prošao bez greške. E, sad kako svoje Damba programe uglavnom testiram na Basic2 jer koristim blagodati serial monitora, onda volim koristiti #ifdef naredbe kako bi već kod compiliranja odredio ide li progam na Dambu ili Basic2. I tu mi se dogodila jedna compile greška koju nisam do sada sreo, a bila je ta da compiler nije prepoznavao osnovne naredbe, npr. digitalRead, analogRead itd. i to samo kada Damba nije bila definirana s #define naredbom, odnosno kada bi program copilirao za Basic2. Za Dambu je radilo bez greške. Budući da nije prepoznavao osnovne naredbe, dodao sam #include <Arduino.h> i sve je prošlo. Ne mogu objasniti u čemu je kvaka, ali ovako radi. Zanimljivo, kada program ne bi imao #ifdef naredbe, odnosno kada bi bio samo za Basic2, onda ne treba dodavati Arduino.h.
A sad ukratko koja je uloga programa. Pomoću malog servo motora mislim kontrolirati gas na trimeru za košenje trave. Trimer ima mehančku blokadu gasa ali tada je prejak, a osim toga, ovako ga mogu fino podešavati bez da rekonstruiram trimer. Trimer je leđne izvedbe, tj. motor je na leđima, a ručka i glava su preko pužnog mehanizma spojeni s motorom. Kako imam dosta strmog terena, ovo je super rješenje jer ručka s glavom nema neku težinu. Negativna strana je što nema ni balansa. Naime, standardni trimeri koriste motor kao protuuteg, a ovdje je motor na leđima, pa kada dodam gas, onda je okretni moment tako jak da baca u stranu. I kada se još uzme u obzir da se radi o strmini po kojoj teško i samo hodati, a kamoli i kositi, onda je držanje gasa konstantnim prava umjetnost. Nadam se da bi ovo rješenje moglo pomoći. Dakle, u igri su još jedno tipkalo i jedan potenciometar. Pritiskom na tipklao servo sluša potenciometar i mogu ga podesiti na željenu vrijednost. Ponovo stiskanje tipkala vraća servo u nulu i tako u krug. U stvari biram između ler gasa i gasa po volji a da pri tome ne moram držati ručicu gasa jer zbog strmine optimalan položaj ruku nije uvije isti.
Evo i programa:

Kod: Označite sve

#define Damba

#ifdef Damba
  #include <SoftwareServo.h>
  SoftwareServo GasServo;
  #define prekidac 0
#else
  #include <Arduino.h>
  #include <Servo.h>
  Servo GasServo;
  #define prekidac 2
#endif

#define potPin A1

int potVal;
int kut;
bool servo_aktivan,prekidac_stanje;
bool PN_Edge(bool, bool);

void setup() {
pinMode(prekidac,INPUT);
prekidac_stanje=digitalRead(prekidac); //početno stanje digitalnog ulaza
#ifdef Damba
  GasServo.attach(1);
#else
  GasServo.attach(13);
  Serial.begin(9600);
#endif
} //end setup

void loop() {
  prekidac_stanje=PN_Edge(digitalRead(prekidac),prekidac_stanje); //pročitaj stanje digitalnog ulaza
  potVal = analogRead(potPin);
  kut = map(potVal, 0, 1023, 0, 179);
  if(servo_aktivan)
    kut=map(potVal, 0, 1023, 0, 179);
  else
    kut=0;
  GasServo.write(kut);
  delay(15);
#ifdef Damba
  SoftwareServo::refresh();
#endif

#ifndef Damba
  Serial.print("Pot: ");
  Serial.print(potVal);
  Serial.print(", kut: ");
  Serial.println(kut);
#endif
} //end loop

bool PN_Edge(bool DI, bool DI_state) {
  //Iz LOW u HIGH
  if(DI!=DI_state && DI_state==LOW) {
    //ovdje dodaj kod za izvršenje P brida
    servo_aktivan=!servo_aktivan; //invertiraj stanje
    return HIGH;
  }//end if LOW u HIGH

  //Iz HIGH u LOW
    //ako ima više DI_state varijabli ovdje dodad if() pitallicu koja će razdjelidi DI variablu
    if(DI!=DI_state && DI_state==HIGH) {
    //ovdje dodaj kod za izvršenje N brida
    return LOW;
  }//end if HIGH u LOW

return DI_state; //vrati nepromijenjeno zadnje stanje
}//end PN_Edge
Prva faza je gotova, program radi upravo ono što treba. Sad još da to montiram na trimer, poslikam i javim imal li kakve koristi od toga.
LP, Domagoj
Avatar
dekip#1492
Hobist
Hobist
Postovi: 44
Pridružen/a: pon srp 30, 2018 10:04 pm
Lokacija: Beograd
Kontakt:

Re: Damba i Servo.h biblioteka

Post Postao/la dekip#1492 » uto svi 14, 2019 8:38 am

Motorni trimer za travu? E živo me interesuje šta si smislio. :)

Mada verujem da je i kod vas vreme idealno za košenje trave. :D
Avatar
david.zovko#5448
e-radionica.com team
e-radionica.com team
Postovi: 188
Pridružen/a: ned tra 15, 2018 2:59 pm
Lokacija: Osijek, Croatia
Kontakt:

Re: Damba i Servo.h biblioteka

Post Postao/la david.zovko#5448 » sri svi 15, 2019 9:48 am

Ha, jako fora! Praktične primjene su mi najdraže :)

Ali da, kao što kaže Dejan, mislimo da nećeš još jedno vrijeme moći testirati :lol:
Odgovorite