Rock it model aansturen

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 9
Geregistreerd: 05 Aug 2014, 18:06
Woonplaats: budel

Rock it model aansturen

Berichtdoor jobbomodels » 05 Aug 2014, 18:52

Beste Forumleden,

Ik zal me even snel voorstellen ben namelijk nieuw op dit forum.
Ik ben Job, 18 jaar en kom uit budel. Mijn hobby is het na bouwen van kermisattracties.
website: www.jobbomodels.nl
Facebook: https://www.facebook.com/Jobbomodels

Momenteel ben ik bezig met het na bouwen van de Rock it.
Mechanisch en de verlichting werkt alles al top! alleen de aansturing ontbreekt nog.

Hierbij een filmpje:
https://www.youtube.com/watch?v=u8B--hi ... rHdKNRToVw

Heel de rock it werkt op een voeding van 12VDC.
Het schommelgedeelte van de attractie doe ik nu handmatig en via een schakelaartje het motortje ompolen. (motor 12VDC)
Dit wil ik graag automatisch laten gebeuren. Ik heb al begrepen dat je iets nodig hebt waardoor je kunt weten in welke positie de arm zich bekeert daarom heb ik een encoder geplaats in de arm die mee draait:
(de encoder: http://nl.farnell.com/alps/ec11e15244g1 ... 11E15244G1 )
Afbeelding

Nu is nog de vraag hoe krijg ik het werkend?
Via mede modelbouwers ben ik er achtergekomen dat je dit makkelijk kunt oplossen via een Arduino.
Helaas heb ik hier totaal geen kaas van gegeten dus ik hoop dat jullie mij kunnen helpen!

Het mooiste zou zijn als jullie me hier mee kunnen helpen:
Cyclus maken voor het rit programma:
- Podium omlaag
- Gondels draaien
- Arm slingeren
- Arm stil zetten
- Gondels stil
- Podium omhoog

Vooral het arm slingeren lijkt me de grootste uitdaging.

Ik heb deze arduino besteld:
http://www.kiwi-electronics.nl/arduino- ... Uno%20Rev3

Wie zou mij hier mee willen helpen?

Groetjes,
Job

Advertisement

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

Re: Rock it model aansturen

Berichtdoor shooter » 08 Aug 2014, 23:05

de kiwi is een beetje duur, maar wel een prima uno bordje hoor.

je hebt dus twee motoren in je machine zitten
een voor de arm, en een voor de gondeldraaien.
kun je prima oplossen met een motorshield bijv een L298N
wat zijn de stromen die de motoren opnemen?
voor de encoder bestaat prima library, uit de datasheet blijkt 15 PPR, de resolutie is dus 4*15 = 60 dus 360/60 =6 graden,kun je wel zien maar is geen probleem, in jouw toepassing.
de motorshield gebruik je dus voor de draairichting , en voor de snelheid een PWM signaal. (die gaat naar de enable ingang van de L298N), dat is helemaal electronisch dus kan heel erg snel.
omdat er twee volledig gescheiden circuits inzitten kun je de gondel ook nog mooi aansturen, mooi langzaam starten, en als de gondels open staan de lege gondel naar de kassa draaien.
de podium motor kun je natuurlijk ook aansturen met een brug, of via een relais de brug misbruiken voor meerdere motoren.

nu de encoder:
de encoder met een pootje aan de gnd aansluiten,
de beide andere pinnen aansluiten op een input pullup aansluiten.
als eerste kun je gewoon lekker testen:
CW
als A laag is en B gaat omlaag dan puls++,
als A hoog is en B gaat omhoog dan puls++
als B laag is en A gaat omhoog dan puls++
als B hoog is en A gaat omlaag dan puls++
CCW
ja die schrijf je maar zelf.
dat gaat kun je zien aan de pin als deze anders is dan de vorige scan. (zoek maar naar encoder library)

dus dan weet je de positie van de arm als je 60 pulsen hebt gezien staat het geheel weer in de uitgangspositie.
dus jij kunt gewoon de zaak op nul zetten aan het begin. pulsen tel je in een INT

dan je programma:
start door podium omlaag
als podium omlaag (zit hier een eindschakelaar op?
dan start sequentie
:
stap 1
gewenst is 1
als 1 puls bereikt is dan
gewenst is -2
als deze bereikt is dan
gewenst 3
dan weer
gewenst -4
etc.

als je puls 30 hebt bereikt dan even 10 seconden stilstaan op zijn kop.
en zo kun je dus een hele volgorde maken.

regeling
als positie < dan gewenst dan H brug richting1 ON PWM op bijv 100 van de 255 zetten
als pos > gewenst dan richting2 high en richting1 is low

aks dit werkt dan kun je een PID regeling gaan proberen waarbij zowel de richting als het vermogen geregeld wordt, dan loopt het allemaal heel gesmeerd, nog beter als wat het nu doet. Je moet hierbij wel uitkijken dat het nog een mooie sinus blijft (de regeling probeert het natuurlijk recht te krijgen.
paul deelen
shooter@home.nl

Berichten: 9
Geregistreerd: 05 Aug 2014, 18:06
Woonplaats: budel

Re: Rock it model aansturen

Berichtdoor jobbomodels » 14 Aug 2014, 19:03

Bedankt voor de reactie!
de L298N lijkt me wel makkelijk! kun je dan ook de snelheid van de motor bepalen?
De motoren gebruiken max 1A
Door je uitleg over de encoder begrijp ik hoe die werkt en wat ik er nu precies mee kan.
Helaas heb ik totaal geen verstand van die code's dus ik zou niet weten hoe ik hiervan een programma moet gaan maken...

Het was me laatst gelukt om via arduino dingen te time en zo heb ik de rock it even automatisch aan het schommelen gekregen. het werkt maar niet echt soepel. Ik zou het graag willen proberen met hoe jij hebt uitgelegd! het lijkt me wel te doen zo!!

Kun je me misschien helpen met het maken van de code?

Gr,
Job

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

Re: Rock it model aansturen

Berichtdoor shooter » 14 Aug 2014, 19:45

wil je een mail sturen naar shooter@home.nl
ik ben voor rick van riel bezig om precies hetzelfde te maken maar dan met 13 motoren in een robot.
het timen is heel eenvoudig hoor, de pendelsnelheid blijft hetzelfde, in het echt niet maar bij jou wel.
met een 298 kun je inderdaad heel eenvoudig de kracht bepalen door er een PWM signaal op te zetten,door naar een pwm pin analogWrite (pinnummer,pwmsignaal) te schrijven
pwmsignaal is tussen de 0 en 255.
wel eerst de pin als uitgang maken PinMode (pinnummer, OUTPUT);
het omdraaien doe je door de beide richtingen telkens omdraaien
paul deelen
shooter@home.nl

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

Re: Rock it model aansturen

Berichtdoor shooter » 30 Aug 2014, 23:28

zo ik heb wat software voor je geschreven:
cpp code
/* motorsequence program for rockit
writer paul deelen
2014/08/16


*/
// Motor 01 (arm movement)
#define M01d1 5 // goes to in1
#define M01d2 6 // goes to in2
int encoderPinA = 2 ;
int encoderPinB = 3 ;
int speedM01 = 0 ; // speed of motor01
int setpointM01 = 0 ;

// Motor 02 (disc rotation)
#define M02d1 9 // goes to in3
#define M02d2 10 // goes to in4
int speedM02 = 0 ; // speed of motor01
int setpointM02 = 0 ;

int setpoint = 0 ;
int step = 0; // stepnumber in sequence
int state = 0; //state of program
volatile int encoderPos = 0;
int lastReportedPos = 1;
boolean A_set = false;
boolean B_set = false;
boolean startbutton;
int StartPin = 8 ;
int StopPin = 7 ;


// Interrupt on A changing state
void doEncoderA(){
// Test transition
A_set = digitalRead(encoderPinA) == HIGH;
// and adjust counter + if B follows A
encoderPos += (A_set != B_set) ? +1 : -1;
}
// Interrupt on B changing state
void doEncoderB() {
// Test transition
B_set = digitalRead(encoderPinB) == HIGH;
// and adjust counter + if B follows A
encoderPos += (A_set == B_set) ? +1 : -1;
}

int direction(int _setpoint, int _encoderPos)
{
int goal=0;

if (_setpoint < _encoderPos)
{
analogWrite (M01d2,0);
analogWrite (M01d1, speedM01);
if (speedM01 <= setpointM01) { speedM01 += +1; return 0 ; }
}
if (_setpoint > _encoderPos) {
analogWrite (M01d1,0);
analogWrite (M01d2, speedM01);
if (speedM01 <= setpointM01) { speedM01 += +1; return 0 ; }
}
if (_setpoint == _encoderPos) { speedM01 = 0 ; return 1 ; }
}

void setup()
{
pinMode(M01d1, OUTPUT);
pinMode(M01d2, OUTPUT);
pinMode(M02d1, OUTPUT);
pinMode(M02d2, OUTPUT);

Serial.begin(9600); // start for serial to PC for debug

// encoder on arm
pinMode(encoderPinA, INPUT); //encoder is input
pinMode(encoderPinB, INPUT);
digitalWrite(encoderPinA, HIGH); // turn on pullup resistor
digitalWrite(encoderPinB, HIGH);

// encoder pin on interrupt 0 (pin 2)
// if the pin changes lowhigh or highlow an interupt is started to check a counter
attachInterrupt(0, doEncoderA, CHANGE);
// encoder pin on interrupt 1 (pin 3)
attachInterrupt(1, doEncoderB, CHANGE);
pinMode(StartPin,INPUT);
digitalWrite (StartPin, HIGH);
pinMode(StopPin,INPUT);
digitalWrite (StopPin, HIGH);
}

void loop()
{
startbutton = digitalRead (StartPin) ;
if (startbutton == HIGH){state = 1 ; } //if startbutton pressed state begins at 1

int reached = direction (setpoint, encoderPos);

switch (state)
{
case 1:
setpoint = 1 ;
if (reached == 1 ) {state = 2 ; Serial.println (state); }
break;
case 2:
setpoint = -2 ;
if (reached == 1 ) {state = 3 ; Serial.println (state); }
break;
case 3:
setpoint = 3 ;
if (reached == 1 ) {state = 4 ; Serial.println (state); }
break;
case 4:
setpoint = -4 ;
if (reached == 1 ) {state = 5 ; Serial.println (state); }
break;
case 5:
setpoint = 5 ;
if (reached == 1 ) {state = 6 ; Serial.println (state); }
break;
case 6:
setpoint = -6 ;
if (reached == 1 ) {state = 7 ; Serial.println (state); }
break;
case 7:
setpoint = 7 ;
if (reached == 1 ) {state = 8 ; Serial.println (state); }
break;
case 8:
setpoint = -8 ;
if (reached == 1 ) {state = 9 ; Serial.println (state); }
break;
case 9:
setpoint = 9 ;
if (reached == 1 ) {state = 10 ; Serial.println (state); }
break;
case 10:
setpoint = -10 ;
if (reached == 1 ) {state = 11 ; Serial.println (state); }
break;
case 11:
setpoint = -11 ;
if (reached == 1 ) {state = 12 ; Serial.println (state); }
break;
case 12:
setpoint = 12 ;
if (reached == 1 ) {state = 13 ; Serial.println (state); }
break;
case 13:
setpoint = -13 ;
if (reached == 1 ) {state = 14 ; Serial.println (state); }
break;
case 14:
setpoint = 14 ;
if (reached == 1 ) {state = 15 ; Serial.println (state); }
break;
case 15:
setpoint = -15 ;
if (reached == 1 ) {state = 16 ; Serial.println (state); }
break;
case 16:
setpoint = 15 ;
if (reached == 1 ) {
analogWrite (M02d1, setpointM02); // start the chairmotor
state = 15 ; Serial.println (state);
}
break;
// so far so good, now it keeps swinging between left and right.
// rest comes after this is correct.


}
}
paul deelen
shooter@home.nl

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 6 gasten