T: Hjälp med att se över elektronik + kod

chisburg
Inlägg: 41
Blev medlem: 18 januari 2012, 23:48:38

T: Hjälp med att se över elektronik + kod

Inlägg av chisburg »

tjena,

jag har jobbat med ett eget konstprojekt i lite mer än 6 månader som kan liknas med en lampa, då jag har liten erfarenhet av mekatronik, går det extremt långsamt.
Hela konstruktionen bygger på arduino, 6 små stegmotorer, 6 st easydrivers, 6 st mikrobrytare och en sensor.

Alla element funkar enskilt, dock upplever jag att saker 'försämras' med tiden. I och med att jag inte kan felsöka brukar detta resultera i
att jag beställer nya komponenter … (ohållbart …jag vet). :doh:

Jag skrev ett program som som funkade perfekt med 1 motor, nu när jag översätter det till 6 motorer uppstår lite problem, där de största är
att jag inte fattar om det är koden eller komponenterna det är fel på …

Jag tänkte därför höra om någon i Stockholmsområdet kan tänkas hjälpa till med detta, någon som kan slänga ett öga på elektroniken samt hjälpa till med
en fungerande grund för koden som jag kan bygga vidare på.

Detta får tyvärr ses som en hjälpande hand, dvs. jag kan tyvärr inte erbjuda några stora summor pengar som betalning.

Skicka gärna ett PM, jag skulle bli oerhört tacksam.

Mvh
Användarvisningsbild
adent
Inlägg: 4232
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: T: Hjälp med att se över elektronik + kod

Inlägg av adent »

Om du lägger upp scheman och kod och en liten beskrivning här kan nog många kika på det åt dig om du vill.

Själv gissar jag på att Arduinokoden kanske börjar ta lite för mycket tid när det är fler motorer som ska styras, men det kan vara heeeelt fel.

MVH: Mikael
Användarvisningsbild
calmar
Inlägg: 540
Blev medlem: 23 november 2005, 13:14:41
Ort: Göteborg
Kontakt:

Re: T: Hjälp med att se över elektronik + kod

Inlägg av calmar »

Ett litet tillägg: Lägg gärna till några foton på din uppkoppling också.
Användarvisningsbild
gunne
Inlägg: 2088
Blev medlem: 17 juni 2004, 15:00:31
Ort: sthlm
Kontakt:

Re: T: Hjälp med att se över elektronik + kod

Inlägg av gunne »

Är det kanske hemligt? Om inte så lägg upp en projekttråd med mycket bilder så brukar man få gott om hjälp. :)
chisburg
Inlägg: 41
Blev medlem: 18 januari 2012, 23:48:38

Re: T: Hjälp med att se över elektronik + kod

Inlägg av chisburg »

Hej,

superschysst! Jag ska försöka dokumentera felen ikväll, dvs. det är inte alls hemligt. Mitt problem nu är att 2 easydriver-kort gör så att respektive motor endast vibrerar (inte snurrar), ett tredje kort kör motorn, men gör så att den hänger sig i bland för att senare fortsätta snurra.

*****
Uppdatering
*******
filmer
http://videobam.com/LJoZj Översikt
http://videobam.com/Whlsz Visar en fungerande motor + den som hackar
http://videobam.com/qrekG den som hackar tickar även då den har el ansluten


Jag har kommit en bit med koden, men den känns inte så smart gjord. Jag borde kanske använda fler arrays? Nu är det ju fruktansvärt många variablar som defineras. Dock är jag inte helt säker på att hu jag ska arbeta med arrays:

Kod: Markera allt

int brytareArray[] = {vBrytareOne, vBrytareTwo, vBrytareThree, hBrytareOne, hBrytareTwo, hBrytareThree};
tror inte att jag använder den rätt. Te.x här försöker jag hitta om någon av elementen i 'brytareArray' är 'low'
if ( sonar == true && digitalRead(brytareArray[1]) == LOW ) {
När te.x. en motor stängs av (då en brytare är intryckt) går de andra snabbare,
jag använder dessa motorer:
https://www.sparkfun.com/products/10551

Kodens uppbyggnad

1. kör alla motorer tills de slår i sin brytare
2. Nolla alla motorer
3. Ge varje motor en ny pos
4. Kör dom till sin nya pos
5. Börja samla info från sensorn (har inte börjat med detta)

Tusen tacl

Kod: Markera allt

#include <AccelStepper.h>

// Declare variables
int led = 2; 

  //Mikro-brytare
    int hBrytareOne = 8;
    int hBrytareTwo = 9;
    int hBrytareThree = 10;
    int vBrytareOne = 11;
    int vBrytareTwo = 12;
    int vBrytareThree = 13;
    int brytareArray[] = {vBrytareOne, vBrytareTwo, vBrytareThree, hBrytareOne, hBrytareTwo, hBrytareThree};

    int switchState = LOW;
    

  //Motorer
    AccelStepper vStepperOne(1, 45, 44);
    AccelStepper vStepperTwo(1, 49, 48);
    AccelStepper vStepperThree(1, 53, 52);  
    AccelStepper hStepperOne(1, 33, 32);
    AccelStepper hStepperTwo(1, 28, 29);
    AccelStepper hStepperThree(1, 41, 40);

    long hStepperOneCurrentMotorPos;
    long hStepperTwoCurrentMotorPos;
    long hStepperThreeCurrentMotorPos;
    long vStepperOneCurrentMotorPos;
    long vStepperTwoCurrentMotorPos;
    long vStepperThreeCurrentMotorPos;
 
    long hStepperOneNewMotorPos;
    long hStepperTwoNewMotorPos;
    long hStepperThreeNewMotorPos;
    long vStepperOneNewMotorPos;
    long vStepperTwoNewMotorPos;
    long vStepperThreeNewMotorPos;  
 
    long newMotorPos;
    boolean allMotorsReset = false;
    boolean startState = true;
    boolean sonar = false;
    
    long previousMillis = 0;
    long interval = 2; 
// End vars 
 
  void setup() {  
    Serial.begin(115200);    
    pinMode(vBrytareOne, INPUT);
    pinMode(vBrytareTwo, INPUT);
    pinMode(vBrytareThree, INPUT);
    pinMode(hBrytareOne, INPUT);
    pinMode(hBrytareTwo, INPUT);
    pinMode(hBrytareThree, INPUT);
  }
 
/* //////////////
Stepper Setup 
*//////////////
  void stepperSetSpeed () {
    hStepperOne.setMaxSpeed(1000);
    hStepperOne.setAcceleration(1000);
    hStepperTwo.setMaxSpeed(1000);
    hStepperTwo.setAcceleration(1000);
    hStepperThree.setMaxSpeed(1000);
    hStepperThree.setAcceleration(1000);

    vStepperOne.setMaxSpeed(1000);
    vStepperOne.setAcceleration(1000);
    vStepperTwo.setMaxSpeed(1000);
    vStepperTwo.setAcceleration(1000);
    vStepperThree.setMaxSpeed(1000);
    vStepperThree.setAcceleration(1000);

    hStepperOne.setSpeed(500);
    hStepperTwo.setSpeed(500);
    hStepperThree.setSpeed(500);
    vStepperOne.setSpeed(500);
    vStepperTwo.setSpeed(500);
    vStepperThree.setSpeed(500);
  }
  
/* //////////////
Void Startup Kör alla motorer tills alla brytare trycks in
*//////////////
  void stegStart () {           
    //Stanna respektive motor då resp brytare trycks in
     if (digitalRead (hBrytareOne) == HIGH) {
       hStepperOne.runSpeed();	
         Serial.print(hStepperOne.currentPosition());
      }      
      if (digitalRead (hBrytareTwo) == HIGH) {
          hStepperTwo.run();
      }      
      if (digitalRead (hBrytareThree) == HIGH) {
       hStepperThree.runSpeed();	
      }    
     if (digitalRead (vBrytareOne) == HIGH) {
      vStepperOne.runSpeed();
      }      
      if (digitalRead (vBrytareTwo) == HIGH) {
        vStepperTwo.runSpeed();
      }      
      if (digitalRead (vBrytareThree) == HIGH) {
       vStepperThree.runSpeed();	
      }      
   // Om alla brytare är intryckta, reseta motorpositioner
   if (digitalRead(brytareArray[5]) == LOW) {
      startState = false;
       //Serial.print("NU KÖRS ALLA MOT NOLLNING ");
       resetMotorPos ();
    }
  }       
/* //////////////
Void resetMotorPos  Nolla alla motorer
*//////////////
  void resetMotorPos () {           

    hStepperOne.setCurrentPosition(0);
    hStepperTwo.setCurrentPosition(0);
    hStepperThree.setCurrentPosition(0);
    vStepperOne.setCurrentPosition(0);
    vStepperTwo.setCurrentPosition(0);
    vStepperThree.setCurrentPosition(0);
    switchState = HIGH;
    Serial.print("reset");
    Serial.print(hStepperOne.currentPosition());
    stegGroundPos();
    stepperSetSpeed ();
    }      

/* //////////////
Void stegGroundPos Kör alla motorer till en grundposition
*//////////////
  void stegGroundPos () {
    allMotorsReset = true;    
    hStepperOneCurrentMotorPos = hStepperOne.currentPosition();
    hStepperTwoCurrentMotorPos = hStepperTwo.currentPosition();
    hStepperThreeCurrentMotorPos = hStepperThree.currentPosition();
    vStepperOneCurrentMotorPos = vStepperOne.currentPosition();
    vStepperTwoCurrentMotorPos = vStepperTwo.currentPosition();
    vStepperThreeCurrentMotorPos = vStepperThree.currentPosition();

    hStepperOneNewMotorPos = 1000;
    hStepperTwoNewMotorPos = 200;
    hStepperThreeNewMotorPos = 300;
    vStepperOneNewMotorPos = 400;
    vStepperTwoNewMotorPos = 500;
    vStepperThreeNewMotorPos = 600;    

// Uppdatera alla motorer
    setStepperPosition();

    Serial.println("kör mot grundpos");
// När alla motorer nått sin grunpos börja leta efter sensor-info
    if (hStepperOneCurrentMotorPos == hStepperOneNewMotorPos && 
        hStepperTwoCurrentMotorPos == hStepperTwoNewMotorPos && 
        hStepperThreeCurrentMotorPos == hStepperThreeNewMotorPos &&
        vStepperOneCurrentMotorPos == vStepperOneNewMotorPos &&
        vStepperTwoCurrentMotorPos == vStepperTwoNewMotorPos &&
        vStepperThreeCurrentMotorPos == vStepperThreeNewMotorPos ) {
          switchState = LOW;
          allMotorsReset = false;
          Serial.println("GRUNDPOS delay");
          delay (10);
          Serial.println("Börja leta efter sensor-info");

           sonar = true;
     }
  }
  
  void setStepperPosition() {
// Uppdatera alla motorer tills de nått sin nya position

   if(hStepperOneCurrentMotorPos < hStepperOneNewMotorPos)  {
      hStepperOne.runSpeed();	
      hStepperOne.moveTo(hStepperOneNewMotorPos);
    }      
   if(hStepperTwoCurrentMotorPos < hStepperTwoNewMotorPos)  {
      hStepperTwo.runSpeed();	
      hStepperTwo.moveTo(hStepperOneNewMotorPos);
    }      
   if(hStepperThreeCurrentMotorPos < hStepperThreeNewMotorPos)  {
      hStepperThree.runSpeed();	
      hStepperThree.moveTo(hStepperThreeNewMotorPos);
    }      
   if(vStepperOneCurrentMotorPos < vStepperOneNewMotorPos)  {
      vStepperOne.runSpeed();	
      vStepperOne.moveTo(vStepperOneNewMotorPos);
    }   
  Serial.println(vStepperTwoCurrentMotorPos);   
   if(vStepperTwoCurrentMotorPos < vStepperTwoNewMotorPos)  {
      vStepperTwo.runSpeed();	
      vStepperTwo.moveTo(vStepperTwoNewMotorPos);
    }      
   if(vStepperThreeCurrentMotorPos < vStepperThreeNewMotorPos)  {
      vStepperThree.runSpeed();	
      vStepperThree.moveTo(vStepperThreeNewMotorPos);
    }      
 
  }

/* //////////////
Void LOOOOP 
*//////////////

  void loop() {
    if(startState == true) {
      stepperSetSpeed();
      Serial.println("startstate");
      unsigned long currentMillis = millis();
      if(currentMillis - previousMillis > interval) {
        previousMillis = currentMillis;
        stegStart();
       }
     }
      //reseta alla motorer
     else if ( allMotorsReset == true && switchState==HIGH) {   
       unsigned long currentMillis = millis();
         if(currentMillis - previousMillis > interval) {
            previousMillis = currentMillis;
            stegGroundPos();
         }
      }       
       //hämta sensor value, om alla brytare är HIHG & sonar true starta funktion XXXX, denna ska jag snart börja med
       else if ( sonar == true && digitalRead(brytareArray[5]) == HIGH) {   
       Serial.println("sonar körs");
         unsigned long currentMillis = millis();
           if(currentMillis - previousMillis > interval) {
              previousMillis = currentMillis;
           }
        }     
      //Om ngn brytare trycks in medan sonar = true kör startState för att resetta alla motorer  
       else if ( sonar == true && digitalRead(brytareArray[1]) == LOW ) {    
         startState = true;
        }       
    }

Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: T: Hjälp med att se över elektronik + kod

Inlägg av sodjan »

Motorerna stegar bara så snabbt som koden hinner anropa
Run() eller RunSpeed(). Ett "steg" per funktionsanrop.

Så hastigheten blir väldigt beroende på vad koden gör
totalt sett.
Användarvisningsbild
Klas-Kenny
Inlägg: 11759
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: T: Hjälp med att se över elektronik + kod

Inlägg av Klas-Kenny »

Du kan testa att sänka hastigheten på samtliga motorer rätt ordentligt, för att se om det blir någon skillnad.

Sen är koden full med konstigheter också, för den delen.. :)
Mesh
EF Sponsor
Inlägg: 30
Blev medlem: 23 augusti 2011, 07:48:31

Re: T: Hjälp med att se över elektronik + kod

Inlägg av Mesh »

Det är inte så enkelt som att din spänningsmatning inte orkar driva alla motorer samtidigt?
chisburg
Inlägg: 41
Blev medlem: 18 januari 2012, 23:48:38

Re: T: Hjälp med att se över elektronik + kod

Inlägg av chisburg »

tack för svar,

jag matar korten med 13v från aggregatet som syns på bild under. Arduinon, får ström från datorn.

Klas-kenny: Sänker jag endast 'setMaxSpeed' i sådant fall? Jag misstänkte att det var mycket som inte stämmer med koden :doh: . Har du konkreta tips?

sodjan: Betyder det att när en motor stannar så kan de andra motorerna anropa koden snabbare, därav att de går snabbare då vissa motorer är av?
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Andax
Inlägg: 4379
Blev medlem: 4 juli 2005, 23:27:38
Ort: Jönköping

Re: T: Hjälp med att se över elektronik + kod

Inlägg av Andax »

Numera finns ju Stockholm Makerspace. Där finns säkert någon som dy kan diskutera med IRL.
Användarvisningsbild
Klas-Kenny
Inlägg: 11759
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: T: Hjälp med att se över elektronik + kod

Inlägg av Klas-Kenny »

chisburg skrev:Klas-kenny: Sänker jag endast 'setMaxSpeed' i sådant fall? Jag misstänkte att det var mycket som inte stämmer med koden :doh: . Har du konkreta tips?
Det borde räcka, ja.

Konkreta tips, ja till exempel

Kod: Markera allt

// Om alla brytare är intryckta, reseta motorpositioner
   if (digitalRead(brytareArray[5]) == LOW)
Det enda du kollar, är det femte elementet i brytareArray, du borde väl kolla alla elementen.

Rätt kod för att göra det vore om du ska använda arrayen antingen

Kod: Markera allt

if(digitalRead(brytareArray[0] == LOW && digitalRead(brytareArray[1] == LOW && digitalRead(brytareArray[2] == LOW && digitalRead(brytareArray[3] == LOW && digitalRead(brytareArray[4] == LOW && digitalRead(brytareArray[5] == LOW) {
Eller om man vill göra lite (kanske) snyggare, men ineffektivare kod där man faktiskt utnyttjar att man har det i en array, tex.

Kod: Markera allt

boolean AllLow = TRUE;
for (int i = 0; i <=5; i++) {
    if(digitalRead(brytareArray[i] != LOW)
        AllLow = FALSE;
}
if(AllLow == TRUE) {
Fördelen med just det är att det är mycket smidigare att lägga till fler motorer.

Mer konkreta exempel hinner jag inte idag, får tas en annan gång. :P
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: T: Hjälp med att se över elektronik + kod

Inlägg av sodjan »

> sodjan: Betyder det att när en motor stannar så kan de andra motorerna anropa koden snabbare...

Det verkar som att koden kommer att vara låst till ett Run/RunSpeed anrop
medans motorn "stegar". Om anropet ser att motorn redan har nått sitt mål
så borde anropet returnera snabbare, och alltså att anropen till Run/RunSpeed
för de andra motorerna kommer att ske tätare och tätare för varje motor
som kommer "i mål", så att säga.

Så vitt jag kan förstå så är inte stepper rutinerna timer-styrda eller liknande
utan de kör så snabbt den hinner med vid den aktuella processor frekvensen.

Det normala sättet att programmera detta är att ha en timerrutin i botten
där motorstyrningen sker. Sedan ser man till att hela lösningen har tillräckligt
med "headroom" för att klara även den maximala bearbetningen som kan uppstå.
Det ska alltså finnas en del "luft" i koden där processorn inte gör något alls.

Men det kräver å andra sidan en betydligt mer "insatt" analys och design än
vad hela Arduino konceptet är tänkt till från början... :-)

Det du har fungerar ju i alla fall, men motorhastigheten blir lite beroende på
vad koden har för sig för övrigt.
chisburg
Inlägg: 41
Blev medlem: 18 januari 2012, 23:48:38

Re: T: Hjälp med att se över elektronik + kod

Inlägg av chisburg »

Ahh, såklart. ska prova det klas föreslog.

Vad tror ni om matningen, kan den vara en bidragande orsak till att inte alla motorer funkar? (nu funkar endast 3 felfritt).

Ser ni fler saker som är helt galna så säg gärna till.
sodjan
EF Sponsor
Inlägg: 43231
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: T: Hjälp med att se över elektronik + kod

Inlägg av sodjan »

Om det med matningen avses matningsspänningarna, så borde det gå att mäta.
Om det är störningar på matningsspänningarna så kanske det dock inte räcker
med en vanlig multimeter, kanske behövs ett oscilloskop.
chisburg
Inlägg: 41
Blev medlem: 18 januari 2012, 23:48:38

Re: T: Hjälp med att se över elektronik + kod

Inlägg av chisburg »

Hej,

tack för alla tips. Jag ändrade lite i koden efter Klas-kennys tips. Jag installerade även 2 fläktar som kyler motor-styrkorten. Då slutade ena motorn att hacka. :bravo:

Kan det vara så att de 2 andra korten blivit så varma att ngn krets pajat? Alltså, innan fläktarna kunde man inte nudda korten …
Skriv svar