rotary table

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 5
Geregistreerd: 27 Dec 2021, 22:22

rotary table

Berichtdoor adcnc » 27 Dec 2021, 23:05

aansturen rotary table software probleem. Hoop dat ik niet teveel vraag....
1. Bedoeling de draaitafel een opgegeven aantal graden te laten draaien, CW (clockwise) , CCW (counter clockwise)
2. Probleem zit in het tegen de klok, CCW, aansturen. Negatieve getallen voor de hoek (angleR )
waarschijnlijk heb ik ook - steppermotorCW(); - op de verkeerde plaats staan
3. De stukken software van Bristolwatch.com en Mechatronics.
4. onderdelen Arduino uno - LCD1602 - rotory encoder/ switch - DRV8825 - stappenmotor

Het programma:
Code: Alles selecteren
/*
  LiquidCrystal 1602 + Rotary encoder incl.switch + steppermotor
 *
 * The circuit:
*/

// include the library LCD code:
#include <LiquidCrystal.h>
// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 10, d5 = 9, d6 = 8, d7 = 7;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// input rotary encoder and switch
#define stepR 2        //  interrupt 0 (=pin D2)
#define dirR 3         //  CW / CCW                 
int switchR = 6;       //switchR = switch
int switchState = 0;       
int lastswitchState = 0;
int angleR = 0; //reading angle LCD1602
int x = 0;

// steppermotor
const int dirMPin = 4;   // direction Motor
const int stepMPin = 5;  // 1600 steps 1 rev. motor = 8*200
int steps = 0;       // 6400 steps 1 turn rotary-table (reduction 1 : 4)

void setup(){     
  lcd.begin(16, 2); // set up the LCD's number of columns 16 and rows 2
  pinMode(stepR, INPUT);   // encoder rotary step
  pinMode(dirR, INPUT);    // encoder rotary direction
  pinMode(switchR,INPUT);
 
  attachInterrupt(0, read_rotary, FALLING);  // interrupt 0 = pin D2
  lcd.print("angle= ");    // print hoek op regel 0

  pinMode(stepMPin,OUTPUT); // step steppermotor
  pinMode( dirMPin,OUTPUT); // direction steppermotor
}
void loop(){

  lcd.setCursor(8,0);  // column 8 row 0
  lcd.print(angleR);  // print getal op display kolom 7 op rij 0 kolom 1
  lcd.print(" ");

  delayMicroseconds(1000);{ 
    switchState = digitalRead(switchR); // read pin D6, not pushed =low

    if (switchState != lastswitchState){ 
       if (switchState == LOW){    // switch pressed
 
         steppermotorCW();
       
        }
     }
    }
     lastswitchState = switchState;
 }
 
void read_rotary() { 
 
  if (digitalRead(dirR)) angleR--;// angle -1  on LCD1602
    else angleR++;                // angle +1  on LCD1602
}


void steppermotorCW(){
 
 digitalWrite(dirMPin,LOW); // LOW is CW rotation
 steps=map(angleR,0,360,0,6400); //
 
   for(int x = 0; x < steps; x++){ // motor x steps
    digitalWrite(stepMPin,HIGH); // make 1 step
    delayMicroseconds(500);
    digitalWrite(stepMPin,LOW);
    delayMicroseconds(500);
   }
   
 delay(500);
}

void steppermotorCCW(){
 
  digitalWrite(dirMPin,HIGH);  // HIGH is CCW rotation
 
  steps=map(angleR,0,360,0,6400);

  for (int x = 0; x < steps; x++){   // motor "x" steps
   digitalWrite(stepMPin,HIGH);      // make 1 step
   delayMicroseconds(500);
   digitalWrite(stepMPin,LOW);
   delayMicroseconds(500);
  }
  delay(500);
}
 


Afbeelding

Afbeelding

Afbeelding

Advertisement

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: rotary table

Berichtdoor ctunes » 29 Dec 2021, 04:37

adcnc schreef:
Code: Alles selecteren
void loop(){

  delayMicroseconds(1000);   // totale waanzin, waarom gebruik je dit?

  switchState = digitalRead(switchR);

  if (switchState != lastswitchState){ 
    if (switchState == LOW){   
           steppermotorCW(); 
      }
    lastswitchState = switchState;
  }
}



Ik heb niets veranderd in je syntax, ik heb alleen de grammatica wat aangepast.

Zie je nu waarom je geen CCW aansturen kunt?

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: rotary table

Berichtdoor ctunes » 29 Dec 2021, 04:55

Hier is een breinbreker:

Code: Alles selecteren
loop()
  a = key();
  static b;
  If (a=!a=b) steppermotorCCW();
  else steppermotorCW;
  b = a;
}


Veel eleganter en verdient tenminste een vermelding in de https://www.ioccc.org

(Het werkt, maar vraag me niet hoe.)

HINT:
"assignment" gaat van rechts naar links.

Berichten: 5
Geregistreerd: 27 Dec 2021, 22:22

Re: rotary table

Berichtdoor adcnc » 29 Dec 2021, 23:43

ctunes, bedankt voor de genomen tijd. Zal nog wel even duren voor ik vermelding op die website krijg. ;)
delayMicroseconds..... heb ik verwijderd. Had geen functie.

Ja, er moet een if .... else statement in.
Het lukt me nog niet om je voorstel werkend er in te krijgen.
Ga het nog verder uitzoeken.

Bij steppermotorCCW is de uitgelezen hoek (angleR ) negatief die moet postief worden voor de steps.
ik denk (ja daar gaat het fout...) dat er zoiets bij moet: angleR = abs(angleR)

Berichten: 5
Geregistreerd: 27 Dec 2021, 22:22

Re: rotary table

Berichtdoor adcnc » 30 Dec 2021, 17:36

ctunes bedankt voor de genomen tijd.
delay 1000 microseconden verwijdert.
delay(500) bij de steppermotoren ook verwijdert.

ben nog naar de breinbreker aan het kijken.
met de if / else statement

de negatieve hoek (angleR) moet voor de steps positief worden.

bij tweakers4all kijk ik hoe dat programmeren gaat, beginners....

ik doe het rustig aan, ben 77+ en wijsheid komt met de jaren al merk ik daar niet veel van. ;)
kom denk ik nog niet voor een vermelding op de genoemde website in aanmerking. :?

Berichten: 3789
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: rotary table

Berichtdoor shooter » 01 Jan 2022, 20:46

wijsheid komt met jaren maar het duurt ook jaren tegenwoordig.
en wat ctunes schrijft is gewoon FOUT vergelijken doe je met == en iets hetzelfde maken doe je met 1 = en niet met twee ==.
lukt het nu een beetje met je tafel?
paul deelen
shooter@home.nl

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: rotary table

Berichtdoor ctunes » 02 Jan 2022, 23:39

adcnc schreef:kom denk ik nog niet voor een vermelding op de genoemde website in aanmerking. :?


Soms komt de eerste prijs volkomen onverwacht.

Ik dat dat deze link je helpen.
http://www.mathertel.de/Arduino/RotaryEncoderLibrary.aspx

shooter schreef:wijsheid komt met jaren maar het duurt ook jaren tegenwoordig.
en wat ctunes schrijft is gewoon FOUT vergelijken doe je met == en iets hetzelfde maken doe je met 1 = en niet met twee ==.



Code: Alles selecteren
  a = key();
  static b;
  If (a=!a=b) b = false;
  else b = true;
  b = a;


Ik vergelijk niet, ik kijk naar de uitkomst van een assignment. "NULL" is false, en al het andere is waar.
Laatst gewijzigd door ctunes op 02 Jan 2022, 23:55, in totaal 1 keer gewijzigd.

Berichten: 114
Geregistreerd: 26 Aug 2015, 11:57

Re: rotary table

Berichtdoor Frits1956 » 02 Jan 2022, 23:48

ctunes schreef:Hier is een breinbreker:

Code: Alles selecteren
loop()
  a = key();
  static b;
  If (a=!a=b) steppermotorCCW();
  else steppermotorCW;
  b = a;
}


Veel eleganter en verdient tenminste een vermelding in de https://www.ioccc.org

(Het werkt, maar vraag me niet hoe.)



HINT:
"assignment" gaat van rechts naar links.


Heb de "volledige" code gekopieerd, niets aan gewijzigd en.... Het werkt niet. Heb geen behoefte aan reacties dus reageer niet en vraag me niets.
Laatst gewijzigd door Frits1956 op 03 Jan 2022, 00:24, in totaal 1 keer gewijzigd.

Berichten: 287
Geregistreerd: 15 Apr 2021, 20:05

Re: rotary table

Berichtdoor ctunes » 03 Jan 2022, 00:01

Frits1956 schreef:Heb de "volledige" code gekopieerd, niets aan gewijzigd en.... Het werkt niet.


Nee, natuurlijk niet.
Maar door uit te vinden wat waarom niet werkt, kun je begrip kweken.

"Het werkt niet": is zo'n vage indicatie van een probleem, dat het eigenlijk niet eens serieus genomen kan worden.

Ergo: dat stukje code werkt perfect, doet precies wat het moet doen.

Berichten: 114
Geregistreerd: 26 Aug 2015, 11:57

Re: rotary table

Berichtdoor Frits1956 » 03 Jan 2022, 00:21

ben nog naar de breinbreker aan het kijken.
met de if / else statement

de negatieve hoek (angleR) moet voor de steps positief worden.


Wellicht dat de procedure als volgt aangepast wel werkt.
Anders zou ik proberen om de dirpin LOW te maken want als ik het juist heb is dir HIGh clockwise en LOW counterclockwise.

void steppermotorCCW(){

digitalWrite(dirMPin,HIGH); // HIGH is CCW rotation

steps=map(angleR,0,360,0,6400);

// for (int x = 0; x < steps; x++){ // motor "x" steps
for (int x = steps; x > 0; x--){ // motor "x" steps
digitalWrite(stepMPin,HIGH); // make 1 step
delayMicroseconds(500);
digitalWrite(stepMPin,LOW);
delayMicroseconds(500);
}
delay(500);
}

Volgende

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten