Hoe kan ik een geschutstoren 290 graden laten draaien

Is er een reden dat je Nano's wilt gebruiken inplaats van de kleinere Pro-Mini?
Dag Bruno,
Ik ben een complete leek in deze materie.
Om me enigszins in te werken ben ik op het internet YouTube-filmpjes gaan afschuimen.
Zo kwam ik op de reeks tutorials van Paul McWorther (Toptechboy.com) terecht die in een uitgebreide reeks de basisbeginselen en eenvoudige projecten uitlegt en demonstreert in een taal die ik zelfs meen te begrijpen.
Op een bepaald moment in de lessenreeks raadt hij de overstap naar de NANO aan om draagbare projecten te realiseren.
Vandaar dat ik een paar NANO's aangeschaft heb.
Het bestaan van de Pro-Mini en de voordelen ervan waren mij niet bekend.
Met haar 1m25 lengte is plaatsgebrek in de Bismarck niet direct een probleem, behalve voor de motoren die direct onder een geschutstoren moeten geplaatst worden, zodat die niet in conflict komen met de aandrijflijn.
 
Helemaal goed!!
Ik zou persoonlijk voor een beter overzicht (naar mijn mening tenminste) het hele stuk in de loop eronder nog een keer met copy/paste geplaatst hebben, en dan daarin alle 0 in 1 veranderd hebben. met name de interrupt call (cli() - sei()) zou dan korter voor de verwerking van de betreffende puls plaats vinden.
En een soortgelijke actie in de setup uiteraard (maar niet de interrupt attach regels natuurlijk)

Een andere vereenvoudiging (maar wederom persoonlijke voorkeur): je kunt de variabelen button...read helemaal weglaten door deze in de twee if {} regels te wijzigen in digitalRead (buttonPin....) == 1, en je kunt zelfs ==1 weglaten omdat de vergelijking dat ook zonder ==1 als True beschouwd. het wordt dan bijvoorbeeld
Hallo Max,
Ik ga je aanbevelingen in overweging nemen.

Nu het werkt (op UNO) zou ik er eigenlijk liefst niets meer aan veranderen, maar morgen, fris en monter, als ik al mijn moed samen raap, ga ik me er waarschijnlijk wel aan wagen. :)

Intussen lukt het niet om de NANO tot leven te brengen.
Mogelijke knelpunten zijn:
- geen gepaste USB->USB-mini kabel, de kabel die ik heb is van een lader van een GSM, en daarin ontbreken mogelijks enkele pinnetjes, ik kan het niet goed zien;
- de gebruikte chip;
- de CH340-driver;
- Bij het solderen van de pinnen de boel oververhit?
- ...
 
Het bestaan van de Pro-Mini en de voordelen ervan waren mij niet bekend.
De ProMini heeft geen usb-aansluiting, je had daar in ieder geval een USB/UART converter voor moeten aanschaffen. Of, met een andere methodiek, een USBasp programmer.
 
Nog een mogelijke vereenvoudiging: de variabele motDir heeft in deze toepassing geen enkele functie. De stap-snelheid wordt bepaald door het aantal stappen per omwenteling en de rotatiesnelheid. Met motDir zou je elke motor meerdere stappen achtereen kunnen laten maken, maar dat is juist wat je niet wil, dan moet de ene motor wachten op de andere. Je kunt dus vereenvoudigen naar step(1) en step(-1), en motDir verwijderen uit de code.
 
De ProMini heeft geen usb-aansluiting, je had daar in ieder geval een USB/UART converter voor moeten aanschaffen. Of, met een andere methodiek, een USBasp programmer.
Omdat ik zo snel mogelijk de bootloader wil verwijderen, kies ik altijd voor de USBasp. Werkt voor mij het handigst...
 
Atmega 328P neem ik aan...
Inderdaad, ik pas het aan in de tekst, dat eventueel geïnteresseerden niet op het verkeerde been gezet worden :)
De ProMini heeft geen usb-aansluiting
Wat een geluk dat ik deze niet aangeschaft heb, trouwens als ik de pinrails niet in de NANO soldeer, kan ik ook de bedrading rechtstreeks aan de in- en uitgangen solderen en in een krimpkousje steken. Ik moet dan wel nog investeren in krimpkous op maat, want die heb ik niet :)
Nog een mogelijke vereenvoudiging: de variabele motDir heeft in deze toepassing geen enkele functie. De stap-snelheid wordt bepaald door het aantal stappen per omwenteling en de rotatiesnelheid. Met motDir zou je elke motor meerdere stappen achtereen kunnen laten maken, maar dat is juist wat je niet wil, dan moet de ene motor wachten op de andere. Je kunt dus vereenvoudigen naar step(1) en step(-1), en motDir verwijderen uit de code.
Dat neem ik straks mee.
Omdat ik zo snel mogelijk de bootloader wil verwijderen, kies ik altijd voor de USBasp.
Chinees voor mij, gelukkig heb ik dus NANO's :)
 
Nog een mogelijke vereenvoudiging: de variabele motDir heeft in deze toepassing geen enkele functie. De stap-snelheid wordt bepaald door het aantal stappen per omwenteling en de rotatiesnelheid. Met motDir zou je elke motor meerdere stappen achtereen kunnen laten maken, maar dat is juist wat je niet wil, dan moet de ene motor wachten op de andere. Je kunt dus vereenvoudigen naar step(1) en step(-1), en motDir verwijderen uit de code.
Dat begrijp ik niet goed Max.
MotDir bepaalt de draairichting, niet de draaisnelheid.
Mogelijks heeft het geen nut om bovenaan const int motDir=1; te zetten, en volstaat const int motDir; omdat de draairichting in de if-statement bepaald wordt.
Bedoel je misschien dat int motSpeed=1; bovenaan de code kan weggelaten worden, en de if-statement kan vereenvoudigd worden naar step(1) en step(-1) ?
 
@max z
Voor zover ik het goed begrepen heb heb ik al je aanbevelingen geïntegreerd voor de code voor de 2 achterste geschutstorens, Caesar en Dora) genummerd met 2 en 3, en dus aangesloten op pots 3 en 4.
Het werkt allemaal, maar de draaisnelheid is 30 seconden, of 2 omwentelingen per minuut.
Toch maar de motSpeed=1 terug geactiveerd, en nu is de draaisnelheid weer 1 omwenteling per minuut ., en de const int motDir=1 gedesactiveerd, zoals je aangaf, en het werkt nog altijd naar wens.
Dit geeft dan onderstaande code.
Ik hoor het graag mocht je nog schoonheidstips hebben :)

Code:
volatile unsigned long timer; // all timer variables are unsigned long
volatile int inpulse, seqnr = 20;
volatile int Plist[16];
int pulse2;
  int pulse3;

#include <Stepper.h>
const int stepsPerRevolution=2048;
int motSpeed=1;
//const int motDir=1;
const int buttonPinSB2=8;
const int buttonPinBB2=9;
  const int buttonPinSB3=A0;
  const int buttonPinBB3=A1;

const int dt=250;
Stepper myStepper2(stepsPerRevolution, 10,12,11,13);
  Stepper myStepper3(stepsPerRevolution, 3,5,4,6);

void setup() {
  // put your setup code here, to run once:
 attachInterrupt(0, read_pwm, CHANGE); // Pin 2 = interrupt 0
  pinMode(2, INPUT);
 
  Serial.begin(9600);
 
  myStepper2.setSpeed(motSpeed);
    myStepper3.setSpeed(motSpeed);

  pinMode(buttonPinSB2, INPUT_PULLUP);
  pinMode(buttonPinBB2, INPUT_PULLUP);
    pinMode(buttonPinSB3, INPUT_PULLUP);
    pinMode(buttonPinBB3, INPUT_PULLUP);
}

void loop() {
 
  cli(); // stop interrupt interference
  pulse2 = Plist[2]; // get latest pulse for stepper 2
  sei(); // release interrupt
    cli(); // stop interrupt interference
    pulse3 = Plist[3]; // get latest pulse for stepper 3
    sei(); // release interrupt
  
  Serial.print (pulse2);
  Serial.print ("   ");
    Serial.println (pulse3);
   if (pulse2 <=1300 && digitalRead(buttonPinSB2)){
      myStepper2.step(1);
    }
    if (pulse2 >=1700 && digitalRead(buttonPinBB2)){
      myStepper2.step(-1);

}
    if (pulse3 <=1300 && digitalRead(buttonPinSB3)){
      myStepper3.step(1);
    }
    if (pulse3 >=1700 && digitalRead(buttonPinBB3)){
      myStepper3.step(-1);

}
}
 
Bedoel je misschien dat int motSpeed=1; bovenaan de code kan weggelaten worden, en de if-statement kan vereenvoudigd worden naar step(1) en step(-1) ?
Ja, dat bedoelde ik.
Toch maar de motSpeed=1 terug geactiveerd, en nu is de draaisnelheid weer 1 omwenteling per minuut
Over motSpeed heb ik alleen gezegd dat de combinatie van stepsPerRevolution ( het aantal stappen voor een hele omwenteling) en motSpeed (de omwentelingssnelheid in rpm) de timing van de steps bepaald, dus je hebt motSpeed wel degelijk nodig als je deze Stepper-library gebruikt.
 
Ik hoor het graag mocht je nog schoonheidstips hebben :)
geen andere dan ik in #239 gegeven heb
Ik zou er dus dit van maken, en zo heb je ook maar één variabele int pulse nodig:
Code:
volatile unsigned long timer; // all timer variables are unsigned long
volatile int inpulse, seqnr = 20;
volatile int Plist[16];
int pulse;
const int stepsPerRevolution=2048;
const int motSpeed=1;
const int buttonPinSB2=8;
const int buttonPinBB2=9;
const int buttonPinSB3=A0;
const int buttonPinBB3=A1;

#include <Stepper.h>
Stepper myStepper2(stepsPerRevolution, 10,12,11,13);
Stepper myStepper3(stepsPerRevolution, 3,5,4,6);

void setup() {
 
  attachInterrupt(0, read_pwm, CHANGE); // Pin 2 = interrupt 0
  pinMode(2, INPUT);
 
  Serial.begin(9600);
 
  myStepper2.setSpeed(motSpeed);
  myStepper3.setSpeed(motSpeed);
 
  pinMode(buttonPinSB2, INPUT_PULLUP);
  pinMode(buttonPinBB2, INPUT_PULLUP);

  pinMode(buttonPinSB3, INPUT_PULLUP);
  pinMode(buttonPinBB3, INPUT_PULLUP);
}

void loop() {

  cli(); // stop interrupt interference
  pulse = Plist[2]; // get latest pulse for stepper 2
  sei(); // release interrupt

  if (pulse <=1300 && digitalRead(buttonPinSB2)){
    myStepper2.step(-1);
  }
  if (pulse >=1700 && digitalRead(buttonPinBB2)){
    myStepper2.step(1);
  }

  cli(); // stop interrupt interference
  pulse = Plist[3]; // get latest pulse for stepper 3
  sei(); // release interrupt

  if (pulse <=1300 && digitalRead(buttonPinSB3)){
    myStepper3.step(-1);
  }
  if (pulse >=1700 && digitalRead(buttonPinBB3)){
    myStepper3.step(1);
  }
 
}

void read_pwm(){
  if (PIND & 0b00000100) { // if pin 2 is high
    timer = micros(); // start timer
  }
  else { // else pin 2 is low
    inpulse = ((volatile int)micros() - timer); // read timer
  
    if (inpulse<950)  seqnr = -1; // reset seqnr for next incoming pulses to start with 0
    else {
      seqnr += 1;
      if (seqnr < 16) Plist[seqnr] = inpulse;
    }
  }
}
 
Laatst bewerkt:
Ik was de _pullup vergeten........staat er nu bij.

Tsja, ik had voor die valkuil gewaarschuwd, en nu was ik er zelf ingevallen. Het blijkt de oorzaak te zijn van het niet functioneren van mijn stepper. Nu doet 'ie 't wel......:)
 
Laatst bewerkt:
Graag gedaan! En ik leer ook weer wat bij over het aansturen van stappenmotoren......
 
Ik heb wat gerommeld in Fusion 360.
Zou dit wat kunnen zijn?
De tandwielen hebben beiden 14 tanden en een buitendiameter van 16,125 mm.
Het linker tandwiel heeft een uitsparing die precies over de as van de stappenmotor zou moeten passen. (ondersteboven)
Het rechter tandwiel schuift in de ronde uitsparing aan de onderzijde van de geschutstoren, is hol vanbinnen (6 mm) om de aansluiting voor de servo voor het verticaal bewegen van de lopen te laten passeren, en heeft een nok om de eindswitches in te drukken. De totale hoogte ervan is 11,5 mm.
Als het realistisch is, moet ik "enkel" nog een bevestigingsplaat ontwerpen voor de stappenmotor en de eindswitches.
Tandwielen voor geschutstorens 1V2.jpg


Mocht het op niks trekken, dan vind ik dit toch al een hele prestatie voor iemand die helemaal geen ingenieursopleiding gevolgd heeft. :)
 
Laatst bewerkt:
De ring waarmee de stepper onder de barbette gemonteerd wordt, zou er dan zo kunnen uitzien:
- de ring schuift onderaan in de barbette;
- de bevestigingsbeugels van de stepper schuiven over de 2 pinnen aan de onderzijde en kunnen gefixeerd worden hetzij met een eindje rubberslang of met een splitpen;
- het off-center gat is voor de motoras;
- door het centergat komt de servokabel naar beneden en kan vrij meedraaien met de geschutstoren.
Dan moet ik alleen nog de exacte positie van de eindschakelaars vaststellen en een paar gaatjes boren of aanbrengen in het ontwerp.
Ring voor bevestiging steppermotor.jpg
Ring voor bevestiging steppermotor boven.jpg

Voor torens Anton en Dora mag de flens volledig rond lopen.
Voor torens Bruno en Caesar moet er een heel stuk af om in de opbouw te passen.

Veel modelbouwplezier :) in al zijn aspecten
 
Heeft er iemand ervaring met die ROHS 28BYJ-48 steppers?
Ik had al begrepen dat steppers relatief gezien grote stroomvreters zijn, en daarom niet via de arduino maar via een afzonderlijke voeding moeten van stroom voorzien worden.
Bij het testen van het volledige systeem met aansturing van 4 servo's en 4 steppers, moet ik steeds vroegtijdig afbreken omdat het voltage inzakt, zelfs met een gestabiliseerde voeding van 13.5V 7/9A. Een pas geladen 6V 7Ah accu gaat in no time onder de 6V.
Wat rondneuzen op tinternet geeft 100mAh tot 240mAh stroomverbruik voor deze steppers (stationair vs in bedrijf?)
Dat zou voor 4 steppers tussen de 0,4 en 1 Ah moeten geven. Pittig maar niet onoverkomelijk.
Als ik mijn multimeter mag geloven trekken ze echter tot 4Ah per stuk, dus 16A als ze alle 4 aangesloten zijn.
Geen wonder dat de stroombronnen er mee worstelen.

Wat doe ik verkeerd waardoor die steppers ongeveer 40x meer verbruiken (in rust) dan de opgegeven specificaties aanduiden?
Veel verkeerd aansluiten kan je niet.
De 4 draden die naar de Arduino gaan zijn correct aangesloten, anders zouden ze niet of niet zoals verwacht draaien, de 2 stroomdraden zijn ook correct verbonden met de onafhankelijke stroombron en beide -polen zijn met elkaar verbonden.
 
Back
Top