Hoe kan ik een geschutstoren 290 graden laten draaien

Discussie in 'Model elektronica' gestart door Herby63, 4 sep 2021.

  1. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    Ik heb even de verkoopspraat doorgenomen.
    Bij een signaal van 500µs en 2500µs is deze inderdaad continu roterend, maar voor een 270° rotatie is een signaal van 520µs tot 2350µs vereist.

    "PWM520~2350us can reach 270degree (if PWM is right at the 500us and 2500us point, the servo would do continuous rotation, which means you use PWM520~2350us will be enough)"

    Door weerstandjes op de pot te solderen verander je echter niet het signaal dat uitgezonden wordt, maar verander je de waarde van de pot. (voor zover ik er iers van begrijp).
    Is dat dan mogelijk? Testen is mogelijk, want ik heb er 4 nodig, en 10 gekocht. :)
     
  2. max z

    max z Vriend van modelbouwforum.nl PH-SAM

    Lid geworden:
    4 dec 2009
    Berichten:
    2.392
    Locatie:
    Boskoop
    Niet helemaal, op de site die ik vond staat er een -R achter het typenummer. En in het "verkooppraatje" wordt nadrukkelijk genoemd dat de servo stopt op een voorgeprogrammeerde 1500 microseconden, plus dat het filmpje duidelijk laat zien dat de servo continu gaat draaien als de puls maar een klein beetje afwijkt van die 1500. Voor mij zegt dat dat er geen pot in zit, maar dat de programmering er voor zorgt dat de servo vooruit-stop-achteruit doet met verschillende snelheden.
    Hetzelfde kun je bereiken door de draadjes van de potmeter los te knippen en er een instelpot aan te solderen, zodat je geen terugkoppeling meer hebt (heb ik wel eens gedaan), maar je moet dan inderdaad die pot zó instellen dat de servo echt stilstaat als de stick in de middenstand staat.

    Maar het ziet er naar uit dat je toch wel de goede versie gekocht hebt, alleen moet je dus de puls zien te verlengen zodat die van 530 tot 2350 microseconden loopt. Of Rick's truuk (laten) toepassen.
     
    Laatst bewerkt: 8 sep 2021
    Herby63 vindt dit leuk.
  3. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    Rick's truuk spreekt me hoe langer hoe meer aan :)
    Benieuwd hoe je in die krappe ruimte nog 2 weerstanden kwijt kan.
     
  4. Rick NL

    Rick NL PH-SAM

    Lid geworden:
    18 apr 2008
    Berichten:
    4.174
    Locatie:
    Gouda
    Een en ander is een beetje onduidelijk. Er zijn blijkbaar 2 versies de DM-S0090D-300 en de DM-S0090D-R.
    Bij de link die @Herby63 geeft staat wel een video van de DM-S0090D-R versie die niet werkt met mijn 'truuk'.
    Maar in de beschrijving staat dat het om een 'gewone' servo gaat met een groot bereik, mits je de aansturing een grotere zwaai geeft dan normaal. Deze kan je met de truuk die ik voorstel wél aanpassen zodat ze met een ongemodificeerde zender werken tot minimaal 270°.

    Twee super kleine SMD weerstandjes zijn er altijd zonder problemen bij te plaatsen, daar heb ik voldoende ervaring mee.
     
  5. Rick NL

    Rick NL PH-SAM

    Lid geworden:
    18 apr 2008
    Berichten:
    4.174
    Locatie:
    Gouda
    Dan ben ik voor een wedstrijd in het buitenland, we regelen wel wat via een PB.
     
    Herby63 vindt dit leuk.
  6. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    Beste hulpvaardige forumleden
    even een update:
    Met de reactie in post 5 van @max z in het achterhoofd en naar aanleiding van een post van @wimo100 in mijn bouwverslag van de Bismarck, was ik even het internet aan het afzoeken, en kwam toevallig op deze, iets budgetvriendelijkere "servo stretcher" terecht.
    PPM/PWM Signal Amplifier 180° 270° Servo Angle Expander 3V-16V for Remote Controller Steering Gear Angle Increase Extender
    Deze kwamen vanmorgen in de brievenbus gevallen :)
    Meteen maar getest, met volgende resultaten:
    - de servo haalt gemakkelijk de gewenste travel bij aansluiting op de rechter slider :)
    IMGP4974.JPG IMGP4975.JPG IMGP4976.JPG
    Nu nog de snelheid zien te reduceren.
    - test met servovertragers: na de servo angle expander: geen uitgebreide reisweg meer (over de andere symptomen nog gezwegen) :( :(
    - test met servovertragers tussen ontvanger en servo angle expander:

    - test met CTI-servovertrager: neutraal verschuift, beweging zeer schokkerig, enkel volledige uitslag naar beide zijden, dus niet meer proportioneel en kan niet meer in neutraal gebracht worden; :( :(
    - test met goedkope servovertragers uit China: neutraalpunt verschuift ongeveer 30°, uitgebreide reisweg blijft, maar is dus naar de ene kant langer dan de andere, niet meer proportioneel, maar met behoud van neutraalstand, beweging licht schokkerig maar mag nog een stuk trager. :(

    @Rick NL weerstandjes solderen zal dus niet nodig zijn, maar toch bedankt voor het aanbod.

    @max z ik blijf dus geïnteresseerd in pogingen om via arduino de passende beweging te genereren.

    veel modelbouwplezier,
     
    wimo100 en Rick NL vinden dit leuk.
  7. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    Ik denk dat maar van mijn focus op servo's afstap en een Arduino ga verkennen.
    Ik bekeek de tutorials van Paul McWorther - Toptechboy.com en kocht enkele weken geleden een Elegoo superstarterkit.
    Na het internet afgezocht te hebben naar tutorials hoe je een RC-reciever kan uitlezen, heb ik vandaag met succes de eerste test gedaan.
    Ik kon een eenvoudig kanaal uitlezen (kanalen 1 en 2) waar een servo op aangesloten wordt, en met de zelfde testcode de kanalen 7 waar een multiswitch module aan gekoppeld is, en kanaal 8 waar een multipropmodule aan gekoppeld is, uitlezen en printen naar de seriële monitor.

    Nu nog uitvogelen hoe ik die 8 waarden per kanaal kan als individuele waarden opslaan in een teller, zodat ik ze kan gebruiken om iets aan te sturen.

    Veel modelbouwplezier,
     
  8. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    Na een 4-tal verschillende codes gevonden en getest te hebben, waarvan de meeste zelfs een fout bij het opladen naar de UNO gaven, of geen enkel resultaat op de serial monitor toonden, ben ik bij onderstaande code terechtgekomen.
    Bedoeld voor een 6-kanaalsontvanger op 2.4 GHz.
    Zonder gehinderd te zijn door enige voorkennis ter zake, heb ik naar eigen inzicht de code enigszins aangepast voor een 8-kanaals ontvanger. Met relatief succes :) nu 8 kolommetjes met waarden :)
    Het resultaat zien jullie rechts, 8 kolommen met waarden, die echter voor mij geen significante betekenis hebben. Bovendien wijzigen deze waarden niet als ik de potmeters of switches op de zender bedien.
    Mijn antieke Futaba werkt op 40MHZ. Heeft dat een invloed op de code? en zo ja wat moet ik aanpassen?

    Bij voorbaat dank voor de hulp, mijn elektronica kennis beperkt zich als het ware ongeveer tot "verbind pin a op de ene component, met pin 1 op de andere component" en mijn programmeerkennis tot" kopieer en plak en duw op enter" :weetnie:

    Test 6 Arduino uitlezen en mappen PPM-signaal.jpg
    Veel modelbouwplezier,
     
  9. max z

    max z Vriend van modelbouwforum.nl PH-SAM

    Lid geworden:
    4 dec 2009
    Berichten:
    2.392
    Locatie:
    Boskoop
    Deze code is bedoeld om een ppm stream uit te lezen, welke verbonden is met pin 2.
    Heb je dat op die manier aangesloten?
    Zo te zien niet, want wat je in de monitor ziet is het tijdsverschil tussen 2 pulsen van één kanaal, en dat geeft inderdaad ongeveer 20 milliseconden, ofwel 20000 microseconden.
     
  10. max z

    max z Vriend van modelbouwforum.nl PH-SAM

    Lid geworden:
    4 dec 2009
    Berichten:
    2.392
    Locatie:
    Boskoop
    Er zijn vele oplossingen om een kanaal uit te lezen, cq. weer als servo-pulse uit te geven, maar deze code werkt goed voor mij. Een ietsje verwarrend is dat de timer op dubbele snelheid loopt, dus bij het manipuleren van de input moet je daar rekening mee houden. E.e.a. is nodig om een stabielere output te creëren.

    Code:
    // Receiver pulse input by means of ISR on hardware interrupt pins 2 and 3 for Uno/Nano
    // Timer is set to run at double speed, all pulse counts are two times normal
    // Servo outputs use delayMicroseconds(), which also runs at double speed, hence outputs are normal again.
    
    // The loop synchronizes on completion of the ch1 pulse count, hence ch1 must be connected to a valid Rx channel.
    
    // By Max Zuijdendorp, July 2022. Based on various sketches by Phil G.
    
    volatile unsigned long timer_ch1, timer_ch2; // all timer variables are unsigned long
    volatile int pulse_time1 = 3000, pulse_time2 = 3000, outpulse1 = 3000, outpulse2 = 3000;
    volatile byte ch1Was = 0, ch2Was = 0, sync = 0;
    
    void setup()
    {
      // set up pin 2 and pin 3 as inputs from Rx (interrupt pins)
      pinMode(2, INPUT); // channel 1 from Rx
      pinMode(3, INPUT); // channel 2 from Rx
     
      // set up A1 and A2 as servo outputs
      pinMode(A1, OUTPUT);
      pinMode(A2, OUTPUT);
      timer_ch1 = 0; timer_ch2 = 0; // ?
     
      TCCR1A = 0;  //reset timer1
      TCCR1B = 0;
      TCCR1B |= (1 << CS11);  //set timer1 to increment every 0,5 us (clkI/O/8 from prescaler)
      attachInterrupt(0, read_pwm, CHANGE); // Pin 2 = interrupt 0
      attachInterrupt(1, read_pwm, CHANGE); // Pin 3 = interrupt 1
    }
    
    void loop()
    {
      while (sync == 0); // ISR sets sync to true when reading ch1 pulse is complete, loop starts.
      sync = 0; // stops loop after one run.
     
      delay(6);  // do the o/p pulses mid-frame, reduces jitter...
      cli();
      outpulse1 = pulse_time1; // do an atomic copy in the quickest way
      outpulse2 = pulse_time2;
      sei();
    
    // INSERT OUTPUT MANIPULATION HERE
     
      constrain(outpulse1, 1040, 4700); // pulse counts are twice normal
      constrain(outpulse2, 1040, 4700);
      digitalWrite(A1, 1); delayMicroseconds(outpulse1); digitalWrite(A1, 0); // servo ch1 out on pin A1
      digitalWrite(A2, 1); delayMicroseconds(outpulse2); digitalWrite(A2, 0); // servo ch2 out on pin A2
    }
    
    // ISR, same for both interrupts. Only one sync on completion pulse for ch1
    void read_pwm(){
      if (PIND & 0b00000100) { // if pin 2 or 3 is interrupting and pin 2 = true
        if (ch1Was == 0) { // and if pin 2 was false previously
          timer_ch1 = micros(); // start timer_ch1
          ch1Was = 1;
        }
      } else {
        if (ch1Was == 1) { // if pin 2 was already true, read timer_ch1
          pulse_time1 = ((volatile int)micros() - timer_ch1);
          ch1Was = 0;
          sync = 1; // start loop (MZ: why on ch1? ch2 is usually later, depending on actual Rx channel nr.)
        }
      }
      if (PIND & 0b00001000) { // if pin 2 or 3 is interrupting and pin 3 = true
        if (ch2Was == 0) {
          timer_ch2 = micros();
          ch2Was = 1;
        }
      } else {
        if (ch2Was == 1) {
          pulse_time2 = ((volatile int)micros() - timer_ch2);
          ch2Was = 0;
        }
      }
    }
    Wat je nog toe moet voegen is een map() functie om de zwaai van de servo's te vergroten,
    en een stappen functie om per loop maar bijvoorbeeld 50 counts meer of minder toe te laten.

    En de invoer op pin 2 en 3 is verplicht (hardware interrupt pins), maar de uitvoer op A1 en A2 kunnen willekeurige digitale of analoge pins zijn (behalve A6 of A7)

    Wees creatief......
     
    Laatst bewerkt: 9 aug 2022
  11. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    jazeker, maar als die pin nu verbonden is of ik trek de connectie er uit, resultaat blijft het zelfde :(

    Ik ga dat meteen eens proberen, hoewel ik bij vele projecten lees dat het voordeel van hun ontwerp is dat de timer niet aangepast moet worden, omdat die anders interfereert met andere componenten die dezelfde timer gebruiken.

    "It's alive" :) maar wat een rare dingen gebeuren er, servo staat constant heen en weer te bewegen, het probleem is dat ik een nauticmodule, aangesloten op kanaal 8 van de zender wil uitlezen, en daaraan zijn 8 potmeters verbonden. De servo krijgt achtereenvolgens de 8 pulsen doorgestuurd, en naargelang ik aan de potmetertjes van de nautic module draai zie je de uitslag veranderen naargelang er meer of minder ghoge waarden doorgestuurd worden.
    Als ik kanaal 1 verbind, doet de servo wel normaal (kanaal voor het roer)

    Grapjas :) , om creatief te zijn moet je weten waar je mee bezig bent, en zoals ik al schreef, ik ben niet gehinderd door enige voorkennis ... :)
     
  12. max z

    max z Vriend van modelbouwforum.nl PH-SAM

    Lid geworden:
    4 dec 2009
    Berichten:
    2.392
    Locatie:
    Boskoop
    Omdat de serial monitor het CH[ ] -array uit blijft lezen, alleen veranderen de individuele kanalen niet meer.

    Ik heb wat in elkaar gedraaid, maar heb het nog niet getest:

    Code:
    // Receiver pulse input by means of ISR on hardware interrupt pins 2 and 3 for Uno/Nano
    // Timer is set to run at double speed, all pulse counts are two times normal
    // Servo outputs use delayMicroseconds(), which also runs at double speed, hence outputs are normal again.
    
    // The loop synchronizes on completion of the ch1 pulse count, hence ch1 must be connected to a valid Rx channel.
    
    // By Max Zuijdendorp, July 2022. Based on various sketches by Phil G.
    
    volatile unsigned long timer_ch1, timer_ch2; // all timer variables are unsigned long
    volatile int pulse_time1 = 3000, pulse_time2 = 3000, outpulse1 = 3000, outpulse2 = 3000;
    volatile byte ch1Was = 0, ch2Was = 0, sync = 0;
    int prevpulse1, prevpulse2, slowstep = 50;
    
    void setup()
    {
      // set up pin 2 and pin 3 as inputs from Rx (interrupt pins)
      pinMode(2, INPUT); // channel 1 from Rx
      pinMode(3, INPUT); // channel 2 from Rx
     
      // set up A1 and A2 as servo outputs
      pinMode(A1, OUTPUT);
      pinMode(A2, OUTPUT);
      timer_ch1 = 0; timer_ch2 = 0; // ?
     
      TCCR1A = 0;  //reset timer1
      TCCR1B = 0;
      TCCR1B |= (1 << CS11);  //set timer1 to increment every 0,5 us (clkI/O/8 from prescaler)
      attachInterrupt(0, read_pwm, CHANGE); // Pin 2 = interrupt 0
      attachInterrupt(1, read_pwm, CHANGE); // Pin 3 = interrupt 1
    }
    
    void loop()
    {
      while (sync == 0); // ISR sets sync to true when reading ch1 pulse is complete, loop starts.
      sync = 0; // stops loop after one run.
     
      delay(6);  // do the o/p pulses mid-frame, reduces jitter...
      cli();
      outpulse1 = pulse_time1; // do an atomic copy in the quickest way
      outpulse2 = pulse_time2;
      sei();
    
      map(outpulse1, 2000, 4000, 1040, 4700); // pulse enlarged to 520 - 2350 microseconds x 2
      map(outpulse2, 2000, 4000, 1040, 4700); // pulse enlarged to 520 - 2350 microseconds x 2
    
      if (outpulse1-prevpulse1 >= slowstep) outpulse1 = prevpulse1 + slowstep; // restrict count rise to slowstep value
      else if(outpulse1-prevpulse1 <= -slowstep) outpulse1 = prevpulse1 - slowstep;// restrict count fall to slowstep value
     
      if (outpulse1-prevpulse2 >= slowstep) outpulse2 = prevpulse2 + slowstep; // restrict count rise to slowstep value
      else if(outpulse2-prevpulse2 <= -slowstep) outpulse2 = prevpulse2 - slowstep;// restrict count fall to slowstep value
    
      // if the last input differs less than the slowstep value from the last step up or down, it remains as is.
     
      prevpulse1 = outpulse1; // keep pulse value for next comparison
      prevpulse2 = outpulse2; // keep pulse value for next comparison
     
      constrain(outpulse1, 1040, 4700); // pulse counts are twice normal
      constrain(outpulse2, 1040, 4700);
      digitalWrite(A1, 1); delayMicroseconds(outpulse1); digitalWrite(A1, 0); // servo ch1 out on pin A1
      digitalWrite(A2, 1); delayMicroseconds(outpulse2); digitalWrite(A2, 0); // servo ch2 out on pin A2
    }
    
    // ISR, same for both interrupts. Only one sync on completion pulse for ch1
    void read_pwm(){
      if (PIND & 0b00000100) { // if pin 2 or 3 is interrupting and pin 2 = true
        if (ch1Was == 0) { // and if pin 2 was false previously
          timer_ch1 = micros(); // start timer_ch1
          ch1Was = 1;
        }
      } else {
        if (ch1Was == 1) { // if pin 2 was already true, read timer_ch1
          pulse_time1 = ((volatile int)micros() - timer_ch1);
          ch1Was = 0;
          sync = 1; // start loop
        }
      }
      if (PIND & 0b00001000) { // if pin 2 or 3 is interrupting and pin 3 = true
        if (ch2Was == 0) {
          timer_ch2 = micros();
          ch2Was = 1;
        }
      } else {
        if (ch2Was == 1) {
          pulse_time2 = ((volatile int)micros() - timer_ch2);
          ch2Was = 0;
        }
      }
    }
     
  13. max z

    max z Vriend van modelbouwforum.nl PH-SAM

    Lid geworden:
    4 dec 2009
    Berichten:
    2.392
    Locatie:
    Boskoop
    Als je Arduino wilt leren, probeer dan het onderstaande stuk van de code te begrijpen met hulp van de reference pagina.
    De rest is meer op truuks en wat uitgebreidere kennis ( die ik ook over een lange periode met veel probeersels en afkijken van anderen vergaard heb) gebaseerd.

    Code:
      map(outpulse1, 2000, 4000, 1040, 4700); // pulse enlarged to 520 - 2350 microseconds x 2
      map(outpulse2, 2000, 4000, 1040, 4700); // pulse enlarged to 520 - 2350 microseconds x 2
    
      if (outpulse1-prevpulse1 >= slowstep) outpulse1 = prevpulse1 + slowstep; // restrict count rise to slowstep value
      else if(outpulse1-prevpulse1 <= -slowstep) outpulse1 = prevpulse1 - slowstep;// restrict count fall to slowstep value
     
      if (outpulse1-prevpulse2 >= slowstep) outpulse2 = prevpulse2 + slowstep; // restrict count rise to slowstep value
      else if(outpulse2-prevpulse2 <= -slowstep) outpulse2 = prevpulse2 - slowstep;// restrict count fall to slowstep value
    
      // if the last input differs less than the slowstep value from the last step up or down, it remains as is.
     
      prevpulse1 = outpulse1; // keep pulse value for next comparison
      prevpulse2 = outpulse2; // keep pulse value for next comparison
     
      constrain(outpulse1, 1040, 4700); // pulse counts are twice normal
      constrain(outpulse2, 1040, 4700);
      digitalWrite(A1, 1); delayMicroseconds(outpulse1); digitalWrite(A1, 0); // servo ch1 out on pin A1
      digitalWrite(A2, 1); delayMicroseconds(outpulse2); digitalWrite(A2, 0); // servo ch2 out on pin A2
     
  14. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    Blijft hetzelfde, servo danst heen en weer op een wisselend patroon als ik aan de potmetertjes draai.
     
  15. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    Huiswerk, zal ik doen :)
     
  16. max z

    max z Vriend van modelbouwforum.nl PH-SAM

    Lid geworden:
    4 dec 2009
    Berichten:
    2.392
    Locatie:
    Boskoop
    Dat zal toch wel door die nautic module komen, die moet dus voortdurend informatie van meerdere schakelaars en potmeters over één kanaal uitsturen. Je zal dus ook een speciale ontvanger/decoder nodig hebben om die informatie weer te scheiden. Maar als je dat niet gebruikt, en gewoon de arduino op kanaal 8 aansluit krijg je dit rare gedrag.
    Let wel, ik heb geen ervaring met dergelijke systemen.
     
  17. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    En die zijn dus maar met heel veel moeite te vinden.
    Ik ga maar eens het internet afschuimen.
    Tot nu had ik dat niet nodig omdat de Beier Soundmodule de nautic multiswitch kan uitlezen, maar met het oog op het bedienen van 8 servo's voor de geschutstorens heb ik recent een multiprop module aangeschaft, en daar kan de Beier module niet mee communiceren, en heeft Arduino er blijkbaar ook een ferme kluif aan.

    Is er echt geen parametertje in de code die ik toonde dat ik kan aanpassen zodat Arduino danst in de maat van het ontvangen signaal?

    PS, op de site van de NVM staat er een code voor het uitlezen van een PPM-signaal, maar die is zo ingewikkeld dat ik er noch kop en staart aan krijg, en als ik ze naar de Arduino oplaad gebeurt er niets.
     
    AHoogendijk vindt dit leuk.
  18. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    Wetronic heeft een redelijk geprijsde vervangmodule om de kanalen te scheiden.
    Maar even weer de creditcard boven gehaald :)
     
  19. max z

    max z Vriend van modelbouwforum.nl PH-SAM

    Lid geworden:
    4 dec 2009
    Berichten:
    2.392
    Locatie:
    Boskoop
    Ik zie alleen maar iets over PWM uitlezing, en dat is een "normale" servopuls.
    In die code wordt gewerkt met de "Servo.h" library, in tegenstelling tot de interrupt methode in mijn code.
     
  20. Herby63

    Herby63

    Lid geworden:
    6 aug 2009
    Berichten:
    4.366
    Locatie:
    Brugge
    kijk eens bij
    Universel NVM MS decoder V1
     

Deel Deze Pagina