Go Down

Topic: 1 carte arduino, 2 moteurs, 3 roulettes et hop... (Read 2 times) previous topic - next topic

Jean-François

Mar 25, 2009, 07:33 pm Last Edit: Jul 19, 2013, 09:58 pm by Jean-François Reason: 1
mes premiers mouvements avec une Arduino.

mouvements

un moteur pas à pas pour la direction, un moteur DC pour la traction, trois roulettes de trotinettes, un peu de bricolage et voilà.... ça amuse bien ma fille.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Jean-François

#1
Mar 28, 2009, 09:10 pm Last Edit: Mar 28, 2009, 09:11 pm by jfs Reason: 1
Je viens d'installer des fins de course pour mettre la roue directrice en position milieu.
La routine pour cette opération est appelée dans le setup().
La roue directrice se remet a zéro à chaque reset ou mise en tension.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

churchill

Chapeau, c'est super. Qu'as-tu utilisé comme contrôleur de moteur ?

churchill

Jean-François

#3
Apr 08, 2009, 10:54 pm Last Edit: Apr 08, 2009, 10:55 pm by jfs Reason: 1
Le moteur de traction est un moteur DC d'une imprimante, pour le "controler" j'utilise un "motor control shield".

Pour la direction c'est un moteur 48 pas unipolaire (5 fils) d'une imprimante également, pour le contrôler j'utilise un ULN2003 et 4 TIP120.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

ludo85

bonsoir à tous


nouveau sur le site, je trouve vraiment sympa le travail de jean- françois..  je cherche dans la même direction.. ;)

la question est : pensez vous qu'avez un "Y" de type magic box
 je peux pas poster le lien.. ;)

(suffit de chercher magic box servo )

on puisse commander plus de deux servos en même temps..?

ps: jean françois j'ai essayé d'envoyer MP  mais ça ne marche pas..

ravi d'être parmi vous  :)

bonne soirée

ludo85

ludo85

bonjour voici le lien

de la magic box servo (quadruple commande)

dont je parlé hier..

http://www.gotronic.fr/catalog/robotique/robframe.php?page_cible=servo.htm

qu'en pensez vous..?

je cherche autour de multiple commande servo à ce que je sache d'un motor shield on ne peut gérer que 2 servos en simultanés..

comment faire..?

en vous souhaitant une bonne journée

ludo85 ;)

Jean-François

#6
Mar 03, 2010, 11:41 pm Last Edit: Mar 03, 2010, 11:41 pm by jfs Reason: 1
Je m'aperçois que je n'avais jamais mis le code que j'avais utilisé.

J'avais fait une fonction pour mettre le moteur PAP en position milieu à chaque démarrage de la carte, avec deux switchs à chaque fin de course.

Pour le moteur DC un motorshield.

Code: [Select]
#include <Wire.h>
#include <string.h>
#include <stdio.h>

uint8_t outbuf[6];

int cnt = 0;
int ledPin = 13;

int dirbpin = 12; // Direction pinpour le moteur DC Digital 12
int speedbpin = 9; // vitesse pin for motor DC  Digital 9 (PWM) (motorshield)
int pinA = 8;      // Moteur PAP
int pinB = 7;      // Moteur PAP
int servoPin3 = 6;
int servoPin2 = 5;
int servoPin = 3;

int pin_stop = 4;   // Stepper motor interrupteur de zerotage
int stepper_count = 0;
int stepper_return=0;

int encoderpin = 2;  // lecture de la roue codeuse moteur DC Digital 2
   // moteur PAP
int etatPinA[8] = {0,   1,   1,   0}; //Séquence moteur PAP
int etatPinB[8] = {1,   1,   0,   0}; //Séquence moteur PAP
int pas_suivant = 1;
int Old_time=0;
int pos_stepper = 0;
int delai_entre_pas = 0 ;  // 8000 microseconds mini pour le démarrage.
int pos_joy = 0;
volatile int state = 0;
   //fin moteur PAP

int speed = 0;

float encoderpos = 0;
int dir = 0;
int dir_pap = 0;


int pulseWidth = 500;
int pulseWidth2 = 1500;
int pulseWidth3 = 500;

long lastPulse = 0;
long lastPulse2 = 0;
long lastPulse3 = 0;

int z_button = 0;
int c_button = 0;

int refreshTime = 0;

int minPulse = 1400;
int minPulse2 = 100;
int minPulse3 = 100;

int dtime=10;

#define pwbuffsize 10
long pwbuff[pwbuffsize];
long pwbuffpos = 0;
long pwbuff2[pwbuffsize];
long pwbuffpos2 = 0;
long pwbuff3[pwbuffsize];
long pwbuffpos3 = 0;

void setup()
{
   pinMode(dirbpin, OUTPUT);

   beginSerial (38400);
   Wire.begin ();
     nunchuck_setpowerpins(); // use analog pins 2&3 as fake gnd & pwr
   nunchuck_init ();
   pinMode(servoPin, OUTPUT);
   pinMode(servoPin2, OUTPUT);
   pinMode(servoPin3, OUTPUT);
   pinMode (encoderpin,INPUT);
   pinMode(pinA, OUTPUT); // Moteur PAP
   pinMode(pinB, OUTPUT); // Moteur PAP
   pulseWidth = minPulse;
   pulseWidth2 = minPulse2;
   pulseWidth3 = minPulse3;
  // Serial.print ("Finished setup\n");
    pinMode(pin_stop, INPUT);
 digitalWrite(pin_stop, LOW);
 mise_a_zero();

}

void nunchuck_init()
{
   Wire.beginTransmission (0x52);
   Wire.send (0x40);
   Wire.send (0x00);  
   Wire.endTransmission ();
}

void send_zero()
{
   Wire.beginTransmission (0x52);
   Wire.send (0x00);
   Wire.endTransmission ();
}

int t = 0;

void loop()
{
   t++;
   long last = millis();

   if( t == 1) {

       t = 0;

       Wire.requestFrom (0x52, 6);

       while (Wire.available ()) {
           outbuf[cnt] = nunchuk_decode_byte (Wire.receive ());
           digitalWrite (ledPin, HIGH);
           cnt++;
       }

       if (cnt >= 5) {

   // printNunchuckData();

           int z_button = 0;
           int c_button = 0;

           if ((outbuf[5] >> 0) & 1)
               z_button = 1;
           if ((outbuf[5] >> 1) & 1)
               c_button = 1;

           switch (c_button) {
           case 1:
               switch (z_button) {
               case 0:
                   break;
               case 1:
                   muovi();
                   motorDC();
                   Motor_PAP();
                   break;
               }
               break;
           case 0:
               switch (z_button) {
               case 0:
                   delay(10000);
                   break;
               case 1:
                   delay(3000);
                   break;
               }
               break;
           }
       }

       cnt = 0;
       send_zero();

   } // if(t==)

   updateServo();

   delay(dtime);
}


void updateServo() {

   if (millis() - lastPulse >= refreshTime) {

       digitalWrite(servoPin, HIGH);
       delayMicroseconds(pulseWidth);
       digitalWrite(servoPin, LOW);

       digitalWrite(servoPin2, HIGH);
       delayMicroseconds(pulseWidth2);
       digitalWrite(servoPin2, LOW);
       
        digitalWrite(servoPin3, HIGH);
       delayMicroseconds(pulseWidth3);
       digitalWrite(servoPin3, LOW);

       lastPulse = millis();
   }
}

int i=0;
void printNunchuckData()
{
   int joy_x_axis = outbuf[0];
   int joy_y_axis = outbuf[1];
   int accel_x_axis = outbuf[2]; // * 2 * 2;
   int accel_y_axis = outbuf[3]; // * 2 * 2;
   int accel_z_axis = outbuf[4]; // * 2 * 2;

   int z_button = 0;
   int c_button = 0;

   if ((outbuf[5] >> 0) & 1)
       z_button = 1;
   if ((outbuf[5] >> 1) & 1)
       c_button = 1;
   if ((outbuf[5] >> 2) & 1)
       accel_x_axis += 2;
   if ((outbuf[5] >> 3) & 1)
       accel_x_axis += 1;

   if ((outbuf[5] >> 4) & 1)
       accel_y_axis += 2;
   if ((outbuf[5] >> 5) & 1)
       accel_y_axis += 1;

   if ((outbuf[5] >> 6) & 1)
       accel_z_axis += 2;
   if ((outbuf[5] >> 7) & 1)
       accel_z_axis += 1;

  /* Serial.print (i,DEC);
   Serial.print ("\t");

   Serial.print ("X: ");
   Serial.print (joy_x_axis, DEC);
   Serial.print ("\t");

   Serial.print ("Y: ");
   Serial.print (joy_y_axis, DEC);
   Serial.print ("\t");

   Serial.print ("AccX: ");
   Serial.print (accel_x_axis, DEC);
   Serial.print ("\t");

   Serial.print ("AccY: ");
   Serial.print (accel_y_axis, DEC);
   Serial.print ("\t");

   Serial.print ("AccZ: ");
   Serial.print (accel_z_axis, DEC);
   Serial.print ("\t");

   Serial.print (z_button, DEC);
   Serial.print (" ");
   Serial.print (c_button, DEC);
   Serial.print ("\r\n");
   */
   
   int val[5];
   Serial.print ("A");
   val[0]=joy_x_axis*4;
   Serial.print( val[0] );
Serial.print( "B" );
val[1]=joy_y_axis*4;
Serial.print( val[1] );
Serial.print( "C" );
val[2]=z_button;
Serial.print( val[2] );
Serial.print( "D" );
val[3]=accel_x_axis*4;
Serial.print( val[3] );
Serial.print( "E" );
val[4]=accel_y_axis*4;
Serial.print( val[4] );
Serial.print( "F" );
val[5]=accel_z_axis*4;
Serial.print( val[5] );
   
   
   i++;
}

char nunchuk_decode_byte (char x)
{
   x = (x ^ 0x17) + 0x17;
   return x;
}

void muovi (){
   float tilt = (700 - outbuf[3]*2*2);
   float tilt2 = outbuf[2]*2*2;
   float tilt3 = outbuf[4]*2*2;

   tilt = (tilt);
   pulseWidth = (tilt * 5) + minPulse;

   tilt2 = (tilt2-288);
   pulseWidth2 = (tilt2 * 5) + minPulse2;
   
   tilt3 = (tilt3-288);
   pulseWidth3 = (tilt3 * 5) + minPulse3;

   pwbuff[pwbuffpos] = pulseWidth;
   pwbuff2[pwbuffpos2] = pulseWidth2;
   pwbuff3[pwbuffpos3] = pulseWidth3;
   
   if( ++pwbuffpos == pwbuffsize ) pwbuffpos = 0;
   if( ++pwbuffpos2 == pwbuffsize ) pwbuffpos2 = 0;
   if( ++pwbuffpos3 == pwbuffsize ) pwbuffpos3 = 0;


   pulseWidth=0;
   pulseWidth2=0;
   pulseWidth3=0;

   for( int p=0; p<pwbuffsize; p++ ){
       pulseWidth += pwbuff[p];
       pulseWidth2 += pwbuff2[p];
       pulseWidth3 += pwbuff3[p];
   }

   pulseWidth /= pwbuffsize;
   pulseWidth2 /= pwbuffsize;
   pulseWidth3 /= pwbuffsize;

}


void motorDC()
{
 if (outbuf[1]>=144)
 {
 dir = 1 ;  
 speed =  (outbuf[1]*2*2-508)/2;
 if (digitalRead(encoderpin) == LOW) {  //incremente la position
      encoderpos++;
 }
 
 }
else if (outbuf[1]<=135)
{
  dir = 0 ;
  speed =  (510-outbuf[1]*2*2)/2;
 
  if (digitalRead(encoderpin) ==LOW ) {   //decremente la position
      encoderpos--;
 }
 }
 else {speed = 0 ; }
 //else { speed =  0; }
 if (speed >=255){speed = 254 ;}
 if (speed <=0){speed = 0 ;}
digitalWrite(dirbpin, dir); // set direction
analogWrite(speedbpin, speed); // set speed (PWM)
//dir = ((dir == 0) ? 1 : 0); // change direction
//delay(10000); // 10 seconds
/* Serial.print (outbuf[0], DEC);
Serial.print ("   ");
Serial.println (speed, DEC);*/
 Serial.println (encoderpos,DEC);
}

// Uses port C (analog in) pins as power & ground for Nunchuck
static void nunchuck_setpowerpins()
{
#define pwrpin PC3
#define gndpin PC2
   DDRC |= _BV(pwrpin) | _BV(gndpin);
   PORTC &=~ _BV(gndpin);
   PORTC |=  _BV(pwrpin);
   delay(100);  // wait for things to stabilize        
}

A suivre ....
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Jean-François

Code: [Select]
...La suite

void Motor_PAP(){
 if (outbuf[0]>=125)
 {
 dir_pap = 1 ;  
 pos_joy =  (outbuf[0]-125)*79/125;
 
 }
else if (outbuf[0]<=100)
{
  dir_pap = 2 ;
  pos_joy =  (outbuf[0]-100)*79/83;
 
 }
 else {pos_joy = 0 ;dir_pap=0; }
 if (pos_stepper!= pos_joy){
 delai_entre_pas= micros()-Old_time;
 if (delai_entre_pas >= 8000){         //delayMicroseconds(8000);
   Old_time=micros();
   
 digitalWrite(pinA, etatPinA[pas_suivant]);
 digitalWrite(pinB, etatPinB[pas_suivant]);
 switch (dir_pap){
   case 0:
   if (pos_stepper<=0){
 pas_suivant++;
 pos_stepper++;
 if(pas_suivant >=4){
 pas_suivant=0;
 }}
 else     if (pos_stepper>=0){
 pas_suivant--;
 pos_stepper--;
 if(pas_suivant <0){
 pas_suivant=3;
 }}
   
etatPinA,state;
etatPinB,!state;
state=!state;
 break;
   case 1:
   if (pos_stepper<pos_joy){
 pas_suivant++;
 pos_stepper++;
 if(pas_suivant >=4){
 pas_suivant=0;
 }}
 break;
     case 2:
     if (pos_stepper>pos_joy){
 pas_suivant--;
 pos_stepper--;
 if(pas_suivant <0){
 pas_suivant=3;
 }}
 break;

 }
}
 }
 Serial.print (pos_stepper);
 Serial.print ("  ");
 Serial.print (outbuf[0],DEC);
 Serial.print ("  ");
 Serial.println (pos_joy);
}


void mise_a_zero(){
 delay (200);
 ////////////////////////////////touche a gauche
 while (digitalRead(pin_stop)==HIGH){
 
   delai_entre_pas= micros()-Old_time;
 if (delai_entre_pas >= 10000){         //delayMicroseconds(8000);
   Old_time=micros();
   
 digitalWrite(pinA, etatPinA[pas_suivant]);
 digitalWrite(pinB, etatPinB[pas_suivant]);
 pas_suivant--;
 if(pas_suivant <0){pas_suivant=3;}
 }
 }
 
 while (stepper_return<=15){
    delai_entre_pas= micros()-Old_time;
 if (delai_entre_pas >= 10000){         //delayMicroseconds(8000);
   Old_time=micros();
   
 digitalWrite(pinA, etatPinA[pas_suivant]);
 digitalWrite(pinB, etatPinB[pas_suivant]);
 pas_suivant++;
 stepper_return++;
 if(pas_suivant >=4){pas_suivant=0;}
 }}
 stepper_return=0;
 /////////////////////// fin de touche a gauche
 ///// touche a droite
 while (digitalRead(pin_stop)==HIGH){
 
 delai_entre_pas= micros()-Old_time;
 if (delai_entre_pas >= 10000){         //delayMicroseconds(8000);
   Old_time=micros();
   
 digitalWrite(pinA, etatPinA[pas_suivant]);
 digitalWrite(pinB, etatPinB[pas_suivant]);
 pas_suivant++;
 stepper_count++;
 if(pas_suivant >=4){pas_suivant=0;}
}}
///// fin de touche a droite

/// positionnement a zero
stepper_count= stepper_count/2;
pos_stepper=stepper_count;
while (stepper_count>=-4){
    delai_entre_pas= micros()-Old_time;
 if (delai_entre_pas >= 10000){         //delayMicroseconds(8000);
   Old_time=micros();
   
 digitalWrite(pinA, etatPinA[pas_suivant]);
 digitalWrite(pinB, etatPinB[pas_suivant]);
 pas_suivant--;
 
 stepper_count--;
 pos_stepper--;
 if(pas_suivant <0){pas_suivant=3;}
}
}
/// fin de positionnement a zero

}

MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

churchill


Jean-François

#9
Mar 10, 2010, 07:52 am Last Edit: Mar 10, 2010, 07:53 am by jfs Reason: 1
Une petite précision encore, comme je n'utilise que le joystick du nunchuck, il y a toute une partie du code qui ne sert à rien.
J'ai laissé le code dans son intégralité car je prévois d'utiliser l'accéléromètre et je compte remplacer mon moteur DC par un bruschless.
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

PEPI

Bonjour Jean-François
Je débute avec arduino et comme tu peu imaginer j'ai quelques problemes. Je tombe sur ton montage et c'est exactement ce que je soihaite pouvoir faire.
1er problème la mise à jour des biblihotèques.
Peutu me guider? Merci

Pepi Genève

Jean-François

Normalement elle sont à jour dans le pack Arduino que tu installes  :-?

Je comprends peut-être mal ta question ?
MacBook intel core 2 duo  os X snow Leopard 10.6<br/> eMac PPc G4  os X Leopard 10.5<br/>powerbook G4 os X Leopard 10.5
imac PPC G3 os X Pa

Go Up