It is currently Thu Feb 27, 2020 5:21 pm
       


All times are UTC + 1 hour




Post new topic Reply to topic  [ 3 posts ] 
Author Message
 Post subject: Arexx mini robot (programeer?) problemen
PostPosted: Mon May 21, 2012 12:27 pm 
Offline
New User

Joined: Fri Apr 20, 2012 8:16 pm
Posts: 2
Hallo,

Dit is het Nederlands forum toch???

In elk geval, ik zit met een probleem. Meerdere eigenlijk, maar 1 ding tegelijk.
Ik wil een programma maken zodat je de robot kan programmeren via de meegeleverde keyboard door posities in te geven en dat de robot dan deze posities 1 voor 1 afwerkt. Dit lijkt te werken, maar om 1 of andere reden werkt de aansturing van servo 6 niet goed. Hier de code die ik geknutseld heb:
Code:
/*
* ****************************************************************************
* Robotarm - ROBOT BASE PROGRAM
* ****************************************************************************
* Example: Robotarm keyboard
* Author(s): Hein wielink
           Huy Nguyen
           Arjan Vuik
* ****************************************************************************
* Description:
* In this program you can control the Robotarm with an external keyboard, store
* up to 64 positions and let it run those 64 positions.
*
* ############################################################################
* ATTENTION: Make sure you have calibrated the Robotarm or else you
* can damage de servos!!!
* You can calibrate the servos with the selftest program. (press c)
* ############################################################################
* ****************************************************************************
*/

/*****************************************************************************/
// Includes:

#include "RobotArmBase\RobotArmBaseLib.h"// The Robotarm Robot Library.
                               // Always needs to be included!

int aantalpos = 1;     //variables for positioning
int apos[6][64];
int werkpos = 1;
int opposa = 0;
int oppos[6];
int Pos_Servo[6];

int8_t fnt;    //variables for buttons
int8_t bck;
int16_t right;
int16_t t_right;
int8_t left;
int8_t status;
int16_t speed;

void Event0( int x ) //button collection subroutine 1
{

   switch(x)
   {
      case 1: { Pos_Servo[1]++; mSleep(speed); break;}
      case 2: { Pos_Servo[1]--; mSleep(speed); break;}
      case 3: { Pos_Servo[2]--; mSleep(speed); break;}
      case 4: { Pos_Servo[2]++; mSleep(speed); break;}
      case 5: { Pos_Servo[3]++; mSleep(speed); break;}
      case 6: { Pos_Servo[3]--; mSleep(speed); break;}
      case 7: { Pos_Servo[4]--; mSleep(speed); break;}
      case 8: { Pos_Servo[4]++; mSleep(speed); break;}
      case 9: { Pos_Servo[5]--; mSleep(speed);break;}
      case 10: { Pos_Servo[5]++; mSleep(speed);break;}
      case 11: { Pos_Servo[6]--; mSleep(speed);break;}
      case 12: { Pos_Servo[6]++; mSleep(speed);break;}
      case 13: { fnt++; mSleep(speed); break;}
      case 14: { bck++; mSleep(speed); break;}
      case 15: { right++; mSleep(speed); break;}
      case 16: { left++; mSleep(speed); break;}
   }
   
   //for(int x = 1; x < 7; x++)  //limit the positions to not destroy another servo.(not yet active)
   //{
   //   if(Pos_Servo[x] > 2000)
   //   {
   //   Pos_Servo[x] = 2000;
   //   }
   //   else if(Pos_Servo[x] < 1000)
   //   {
   //   Pos_Servo[x] = 1000;
   //   }
   //}
   Pos_Servo_1 = Pos_Servo[1]; //set the positions
   Pos_Servo_2 = Pos_Servo[2];
   Pos_Servo_3 = Pos_Servo[3];
   Pos_Servo_4 = Pos_Servo[4];
   Pos_Servo_5 = Pos_Servo[5];
   Pos_Servo_6 = Pos_Servo[6];
}

void Event1( int x ) //button collection subroutine 2
{

   switch(x)
   {
      case 13: { fnt++; mSleep(speed); break;}
      case 14: { bck++; mSleep(speed); break;}
      case 15: { right++; mSleep(speed); break;}
      case 16: { left++; mSleep(speed); break;}
   }

}

void Event2( int x ) //button collection subroutine 3
{

   switch(x)
   {
      case 15: { right++; mSleep(speed); break;}
   }

}

/*****************************************************************************/
// Main function - The program starts here:

int main(void)
{
   initRobotBase();    // Always call this first! The Processor will not work
                  // correctly otherwise.      
   mSleep(1000);        // delay 1s to allow things to settle

   speed = 1; //Speed for servo from '0'(fast) - '10'(slow)
   Power_Servos();  //Use this function to power the servo motors on
                //When you want to power off the servos, you need to call function Power_Off_Servos();

   //Move(1, 0);
   //Move(2, 0);
   //Move(3, -450);
   //Move(4, 450);
   //Move(5, 200);
   //Move(6, 0);

   Pos_Servo[1] = 1500; //initial position variable Pos_Servo
   Pos_Servo[2] = 1350;
   Pos_Servo[3] = 1050;
   Pos_Servo[4] = 1900;
   Pos_Servo[5] = 1700;
   Pos_Servo[6] = 1500;
   Pos_Servo_1 = Pos_Servo[1]; //initial position to servo timers
   Pos_Servo_2 = Pos_Servo[2];
   Pos_Servo_3 = Pos_Servo[3];
   Pos_Servo_4 = Pos_Servo[4];
   Pos_Servo_5 = Pos_Servo[5];
   Pos_Servo_6 = Pos_Servo[6];
   apos[1][1] = 1500; //initial position variable Pos_Servo
   apos[2][1] = 1350;
   apos[3][1] = 1050;
   apos[4][1] = 1900;
   apos[5][1] = 1700;
   apos[6][1] = 1500;
   status = 0; // 0 = free movement, 1 = store position, 2 = run program, 3 = clean stored positions
   PowerLEDgreen(); //indicate mode 0

   
/*****************************************************************************/
   // Main loop:
   while(true)
   {
      switch (status)
      {
         case 0: //mode 0, you can freely move and store positions here
         {   
            Event0(scan_keyboard()); //see if there are any keys pressed

            if (fnt >= 1) //and process them
            {
               status = 1;
               PowerLEDred(); //indicate mode 1
               mSleep(500);
               fnt = 0;
            }
            else if (bck >= 1)
            {
               status = 2;
               PowerLEDorange(); //indicate mode 2
               werkpos = 1;
               bck = 0;
               speed = 0;
               mSleep(500);
            }
            else if (right >= 1)
            {
               status = 3;
               PowerLEDred(); //indicate mode 3
               mSleep(500);
               right = 0;
            }
            else if (left >= 1)
            {
               left = 0;
            }
            
            break;
         }
         case 1: //mode 1: store current position
         {
            if (aantalpos == 64)
            {
               PowerLEDoff();
               mSleep(250);
               PowerLEDred();
               mSleep(250);
               PowerLEDgreen();
               status = 0;
               mSleep(1000); //extra time to release button
            }
            else
            {
               aantalpos++;
               apos[1][aantalpos] = Pos_Servo[1];
               apos[2][aantalpos] = Pos_Servo[2];
               apos[3][aantalpos] = Pos_Servo[3];
               apos[4][aantalpos] = Pos_Servo[4];
               apos[5][aantalpos] = Pos_Servo[5];
               apos[6][aantalpos] = Pos_Servo[6];
               mSleep(500);
               PowerLEDgreen();
               status = 0;
               mSleep(1000); //extra time to release button
            }
            break;
         }
         case 2: //automatic run mode with the stored positions
         {
            Event1(scan_keyboard());
            
            if (fnt >= 1) //back to mode 0
            {
               fnt = 0;
               status = 0;
               PowerLEDgreen();
               mSleep(1000);
            }
            
            if (bck >= 1)
            {
               bck = 0;
            }
            
            if (right >= 1)
            {
               right = 0;
            }
            
            if (left >= 1)
            {
               left = 0;
            }
            
            for (short servo = 1; servo > 6; servo++)
            {
               if(apos[servo][werkpos] > Pos_Servo[servo]) // servo in position?
               {
                  Pos_Servo[servo]++;
               }
               else if(apos[servo][werkpos] < Pos_Servo[servo])
               {
                  Pos_Servo[servo]--;
               }
               else if(apos[servo][werkpos] == Pos_Servo[servo] && oppos[servo] == 0) // If servo is in position let it know
               {
                  opposa++;
                  oppos[servo] = 1;
               }
            }
            
            Pos_Servo_1 = Pos_Servo[1]; //set work positions into the real positions
            Pos_Servo_2 = Pos_Servo[2];
            Pos_Servo_3 = Pos_Servo[3];
            Pos_Servo_4 = Pos_Servo[4];
            Pos_Servo_5 = Pos_Servo[5];
            Pos_Servo_6 = Pos_Servo[6];
               
            if (opposa == 6) //we reached the stored positions, let's reset all and do the next one.
            {
               if (werkpos == aantalpos)
               {
                  werkpos = 1;
                  opposa = 0;
                  oppos[1] = 0;
                  oppos[2] = 0;
                  oppos[3] = 0;
                  oppos[4] = 0;
                  oppos[5] = 0;
                  oppos[6] = 0;
               }
               else
               {
                  werkpos++;
                  opposa = 0;
                  oppos[1] = 0;
                  oppos[2] = 0;
                  oppos[3] = 0;
                  oppos[4] = 0;
                  oppos[5] = 0;
                  oppos[6] = 0;
               }
            }
            
            break;
         }
         
         case 3: //clear all positions
         {
               aantalpos = 1;
               status = 0;
               PowerLEDgreen();
            break;
         }
         
      }
      
   // End of main loop!
   // ---------------------------------------
   }
}


Het probleem is dat de 'Pos_Servo[6]' variabele wel af wil tellen, maar deze maar maximaal 150 wil optellen, om een reden die ik niet kan vinden. Ik heb dit gecontroleerd door de waarde van Pos_Servo[6] naar de terminal te laten schrijven en ook de uit lezing van de keyboard routine. Key 12, in dit geval, komt wel netjes binnen, maar de Pos_Servo[6]++ lijkt niet (goed) te werken.

Het positioneren gaat ook niet goed, maar dat lijkt ook met het verplaatsen van servo 6 te maken te hebben, dus vandaar 1 ding tegelijk ;)

Let wel, ik ben pas sinds 2 á 3 weken met C bezig(Sinds dat ik deze robot probeer te programmeren), dus ik zie ongetwijfeld iets over het hoofd en mijn manier van programmeren zal ongetwijfeld een rotzooi zijn. Alle positieve kritiek neem ik ook graag aan.

met vriendelijke groet,

Arjan Vuik.


Top
 Profile E-mail  
 
 Post subject: Re: Arexx mini robot (programeer?) problemen
PostPosted: Mon May 21, 2012 4:56 pm 
Offline
arexx.com user
User avatar

Joined: Sun Jan 14, 2007 6:02 pm
Posts: 139
Location: Stuttgart
Hallo

int apos[6][64];
...
int oppos[6];
int Pos_Servo[6];

In C startet der Index bei 0! Ein Array mit 6 Elementen zählt so: [0], [1],...,[5]

Einfache Lösung:

int apos[7][65];
...
int oppos[7];
int Pos_Servo[7];

Gruß

mic


Top
 Profile  
 
 Post subject: Re: Arexx mini robot (programeer?) problemen
PostPosted: Tue May 22, 2012 6:01 am 
Offline
New User

Joined: Fri Apr 20, 2012 8:16 pm
Posts: 2
Hallo Mic.

Vielen Dank für die Erklärung, wann ich zeit habe solst ich deine lösung mal ausprobieren.

Gruss,

Arjan Vuik.


Top
 Profile E-mail  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 3 posts ] 

All times are UTC + 1 hour


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group