Aller au contenu


Photo

FourBarQuad525 - Toujours plus rapide


  • Veuillez vous connecter pour répondre
182 réponses à ce sujet

#141 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 07 décembre 2020 - 11:01

Voici une vidéo qui propose de piloter un servo, sans la librairie Servo.h.

Le code est disponible ici, https://engineersasy...spreadsheet/818

J'aimerais bien avoir votre avis. Cela me parait assez simple.

 

Sandro, j'ai intégré ton code dans mon programme. Je n'ai pas testé. J'espère pouvoir, aujourd'hui. Là, je suis sur un parking, à me cailler dans ma voiture . . . 

 



#142 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 07 décembre 2020 - 11:59

Non seulement tu augment la tension, mais le courant devrait pouvoir augmenter aussi. Ca pourrait bien te permettre de passer à 10s. Tu pourras faire une vidéo ?



#143 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 07 décembre 2020 - 12:00

Voici une vidéo qui propose de piloter un servo, sans la librairie Servo.h.

Le code est disponible ici, https://engineersasy...spreadsheet/818

J'aimerais bien avoir votre avis. Cela me parait assez simple.

 

Sandro, j'ai intégré ton code dans mon programme. Je n'ai pas testé. J'espère pouvoir, aujourd'hui. Là, je suis sur un parking, à me cailler dans ma voiture . . . 

 

 

La encore dans cet exemple de code, les servos sont pilotés à tour de rôle, si j'ai bien lu.

 

L'approche de Sandro est bien meilleure.



#144 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 07 décembre 2020 - 12:15

L'approche de Sandro est bien meilleure.

Je n'en doute pas ! 

 

 

Tu pourras faire une vidéo ?

Absolument !



#145 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 07 décembre 2020 - 12:30

Voici le code. Merci de me dire si tout va bien ou s'il y a une erreur grossière. La compile est ok.

 

 

// FourBar525-Sandro-V2 n'utilise pas la bibli Servo.h - 07/12/2020
 
//équivalences pin/port
//  2   PD2
//  3   PD3
//  4   PD4
//  5   PD5
//  6   PD6
//  7   PD7
//  8   PB0
//  9   PB1
 
//octets avec un 0 à l'endroit correspondant à un pin dans les registres et 1 ailleurs
#define ZERO_DU_PIN_2 B11111011
#define ZERO_DU_PIN_3 B11110111
#define ZERO_DU_PIN_4 B11101111
#define ZERO_DU_PIN_5 B11011111
#define ZERO_DU_PIN_6 B10111111
#define ZERO_DU_PIN_7 B01111111
#define ZERO_DU_PIN_8 B11111110
#define ZERO_DU_PIN_9 B11111101
 
//nom du pot correspondant à chaque pin
#define PORT_DE_PIN_2 PORTD
#define PORT_DE_PIN_3 PORTD
#define PORT_DE_PIN_4 PORTD
#define PORT_DE_PIN_5 PORTD
#define PORT_DE_PIN_6 PORTD
#define PORT_DE_PIN_7 PORTD
#define PORT_DE_PIN_8 PORTB
#define PORT_DE_PIN_9 PORTB
 
#define PERIODE_US 20000  //période
 
unsigned long start_time;
uint16_t duree_pulse_us[10]={0,0,1700, 1700, 1700, 1700, 1700, 1700, 1700, 1700};   //position initiale
 
uint16_t duree_pulse_us_min[10]={0,0,1000, 1000, 1000, 1000, 1000, 1000, 1000, 1000};
uint16_t duree_pulse_us_max[10]={0,0,2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000};
int angle_min[10]={0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int angle_max[10]={0, 0, 180, 180, 180, 180, 180, 180, 180, 180};
 
#include <Servo.h>
unsigned long temp=0, start=0;
int Speed=500;                         // Speed determines le speed 
const int nb=8;                         // Number of servos
int OnOff[nb]={1,1,1,1,1,1,1,1};        // Servos table on/off
//int OnOff[nb]={0,0,0,0,0,0,0,0};        // Servos table on/off
 
int FRLS=0, FRRS=1, FLLS=2, FLRS=3, BRLS=4, BRRS=5, BLLS=6, BLRS=7;
//***************** Correction for 90° LS and RS servos position     **************************************
// servos      FRLS  FRRS  FLLS  FLRS  BRLS  BRRS  BLLS  BLRS modify these values according to your servos
int Err[nb]={   0,    6,    0,    7,    0,    10,    12,   1    };  
//*********************************************************************************************************
 
// 06/12/2020 - symetric Soucoupe volante V13-2 - Ay=145, a1=104, c1=88, Speed=500
int FRx[]= { 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10,  5,  0, -5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70,-75,-80,    -80,-75,-70,-65,-60,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80};
int FLx[]= { 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10,  5,  0, -5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70,-75,-80,    -80,-75,-70,-65,-60,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80};
int BRx[]= {-80,-75,-70,-65,-60,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80,     80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10,  5,  0, -5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70,-75,-80};
int BLx[]= {-80,-75,-70,-65,-60,-55,-50,-45,-40,-35,-30,-25,-20,-15,-10, -5,  0,  5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80,     80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20, 15, 10,  5,  0, -5,-10,-15,-20,-25,-30,-35,-40,-45,-50,-55,-60,-65,-70,-75,-80};
 
int FRy[]= {  0,-10,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-10,  0,      0,  4,  7,  9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 18, 17, 16, 15, 13, 11,  9,  7,  4,  0};
int FLy[]= {  0,  4,  7,  9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 18, 17, 16, 15, 13, 11,  9,  7,  4,  0,      0,-10,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-10,  0};
int BRy[]= {  0,  4,  7,  9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 18, 17, 16, 15, 13, 11,  9,  7,  4,  0,      0,-10,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-10,  0};
int BLy[]= {  0,-10,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-15,-10,  0,      0,  4,  7,  9, 11, 13, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 20, 19, 18, 17, 16, 15, 13, 11,  9,  7,  4,  0};
 
int lgTab = sizeof(FRx)/sizeof(int);
         
void  setup() {
  pinMode(0,INPUT_PULLUP);                // start/reset button attachment
  Serial.begin(115200);
  for(int i=2;i<=9;i++)
  {
    pinMode(i,OUTPUT);
  }
 
  Serial.print("\n\t To start, click on the Start button");
  while( digitalRead(0) );  delay(400);       // waiting for start button pressed 
  Serial.print("\n\t Started");
  start=millis();
}
 
int i=0;        // !!!!!!!!!!!!!!!!!!!!!!!!!!
 
void loop() {
unsigned long duration=micros()-start_time;
  envoyer_pulse();
  calculer_nouvelle_position(i);
  i++;
 
  //attendre la fin de la période
  while(duration < PERIODE_US)  {/*ne rien faire*/}   // !!!!!!!!!!!!!!!!!!!!!!!!!
}
 
void calculer_nouvelle_position(int index)
{
    int i=index % lgTab; //index croit indéfiniment, i correspond à l'index dans la période
    InverseKinematics(FRx[i],FRy[i],FRLS,FRRS);
    InverseKinematics(BLx[i],BLy[i],BLLS,BLRS);
    InverseKinematics(FLx[i],FLy[i],FLLS,FLRS);
    InverseKinematics(BRx[i],BRy[i],BRLS,BRRS);
}
 
void InverseKinematics(int Px, int Py, int LS, int RS){
  const float A1x=0, A1y=145, A2x=0, A2y=145;                   // Values of servos positions
  const float a1=104, c1=88, a2=104, c2=88;                     // Values of leg sizes lengths
 
  float d=A1y-Py, e=Px;                                   // Calculation of inverse kinematics
  float b=sqrt((d*d)+(e*e));                              // Calculation of inverse kinematics
  float S=acos(d/b);  if(e<0)S=(-S);                      // Calculation of inverse kinematics
  float A12=acos(((b*b)+(c1*c1)-(a1*a1))/(2*b*c1));       // Calculation of inverse kinematics
  float A22=acos(((b*b)+(c2*c2)-(a2*a2))/(2*b*c2));       // Calculation of inverse kinematics
  float A11=(PI/2)-A12+S;                                 // Calculation of inverse kinematics
  float A21=(PI/2)-A22-S;                                 // Calculation of inverse kinematics
  int S1=round(A11*57.296);                               // left servo angle in degree
  int S2=round(180-(A21*57.296));                         // right servo angle in degree
 
// DEBUG
//  Serial.print("\n\n\t Position to reach : Px=");Serial.print(Px);Serial.print("  Py=");Serial.print(Py);
//  Serial.print("\n\t d=");Serial.print(d);Serial.print("\t\t e=");Serial.print(e);
//  Serial.print("\t\t b=");Serial.print(b);Serial.print("\t\t S=");Serial.print(S*57.296);
//  Serial.print("\n\t A11=");Serial.print(A11*57.296);Serial.print("\t\t A12=");Serial.print(A12*57.296);
//  Serial.print("\t\t A22=");Serial.print(A22*57.296);Serial.print("\t\t A21=");Serial.print(A21*57.296);
//  Serial.print("\n\t Result of calculations, angles of the servos");
//  Serial.print("\n\t S1=");Serial.print(S1);Serial.print("°\t\t\t S2=");Serial.print(S2);Serial.print("°");
 
  if ( b>(a1+c1) ){
    Serial.print("\n\t Target point Px=");Serial.print(Px);Serial.print(" Py=");Serial.print(Py);Serial.print("\t b=");Serial.print(b);Serial.print(" > ");
    Serial.print(a1+c1);Serial.print(" is too long. Target impossible to reach   !!!!!");
    return;
  }
  if (S1+Err[LS]<0){
    Serial.print("\n\t Position to reach : Px=");Serial.print(Px);Serial.print("  Py=");Serial.print(Py);Serial.print("\t angle S1<0° is not reachable   !!!!!");
    return;
  }
  if (S2+Err[RS]>180){
    Serial.print("\n\t Position to reach : Px=");Serial.print(Px);Serial.print("  Py=");Serial.print(Py);Serial.print("\t angle S2<0° is not reachable   !!!!!");
    return;
  }
  if (S1+Err[LS]>120){
    Serial.print("\n\t Position to reach : Px=");Serial.print(Px);Serial.print("  Py=");Serial.print(Py);Serial.print("\t angle S1>140° is not reachable   !!!!!");
    return;
  }
  if (S2+Err[RS]<60){
    Serial.print("\n\t Position to reach : Px=");Serial.print(Px);Serial.print("  Py=");Serial.print(Py);Serial.print("\t angle S2<40° is not reachable   !!!!!");
    return;
  }
//  Serial.print("\t executed command");
  if (OnOff[LS]) set_position_degrees(LS,S1+Err[LS]);   // set target Left servo position if servo switch is On
  if (OnOff[RS]) set_position_degrees(RS,S2+Err[RS]);   // set target Right servo position if servo switch is On
}
 
void envoyer_pulse()
{
  start_time=micros();
  //mise à 1 de tous les pins
  PORTD |= B11111100; //mise à 1 des pins 2 à 7 du port D (ie pins 2 à 7 de l'arduino)
  PORTB |= B00000011; //mise à 1 des pins 0à 1 du port B (ie pins 8 et 9 de l'arduino)
  
  while( (PORTD & 0B11111100) | (PORTB & 0B00000011) )  //tant qu'au moins un des pins est à 1
  {
    unsigned long duree_actuelle_du_pulse=micros()-start_time;  //durée écoulée depuis le début du pulse
    if(duree_actuelle_du_pulse>=duree_pulse_us[2])
      PORT_DE_PIN_2 &= ZERO_DU_PIN_2;
 
    if(duree_actuelle_du_pulse>=duree_pulse_us[3])
      PORT_DE_PIN_3 &= ZERO_DU_PIN_3;
      
    if(duree_actuelle_du_pulse>=duree_pulse_us[4])
      PORT_DE_PIN_4 &= ZERO_DU_PIN_4;
 
    if(duree_actuelle_du_pulse>=duree_pulse_us[5])
      PORT_DE_PIN_5 &= ZERO_DU_PIN_5;
 
    if(duree_actuelle_du_pulse>=duree_pulse_us[6])
      PORT_DE_PIN_6 &= ZERO_DU_PIN_6;
 
    if(duree_actuelle_du_pulse>=duree_pulse_us[7])
      PORT_DE_PIN_7 &= ZERO_DU_PIN_7;
 
    if(duree_actuelle_du_pulse>=duree_pulse_us[8])
      PORT_DE_PIN_8 &= ZERO_DU_PIN_8;
 
    if(duree_actuelle_du_pulse>=duree_pulse_us[9])
      PORT_DE_PIN_8 &= ZERO_DU_PIN_9;
  }
}
 
void set_position_degrees(byte pin, int angle_deg)
{
  uint16_t duree_us=map(angle_deg, angle_min[pin], angle_max[pin], duree_pulse_us_min[pin], duree_pulse_us_max[pin]);
  duree_pulse_us[pin]=duree_us;
}

 



#146 Sandro

Sandro

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 1 321 messages
  • Gender:Male

Posté 07 décembre 2020 - 02:54

Bonjour,

pour ton adaptation de mon code, il y a une erreur que j'ai vue :

int FRLS=0, FRRS=1, FLLS=2, FLRS=3, BRLS=4, BRRS=5, BLLS=6, BLRS=7;

Il faut utiliser les numéros de pins, donc 2 à 9 au lieu de 0 à 7

 

A part ça, je n'ai rien vu comme problème avec une lecture rapide (pour le reste, on verra après test si jamais ça bug).

 

 

Pour le lien de ta vidéo, c'est un seul servo qui est piloté, avec une période de 20ms, donc peu utile pour toi (j'ai repris le même principe, mais en en gérant plusieurs en même temps)
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#147 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 07 décembre 2020 - 06:44

J'ai réussi à téléverser le programme sur l'UNO, ça fonctionnait, les pattes bougeaient très doucement, mais cela avait l'air bon. Sauf pour la patte arrière gauche, les valeurs des angles n'étaient visiblement pas correctes.

Puis j'ai fait une modif, j'ai voulu téléverser une nouvelle fois, et depuis, ça me dit, ça, quelque soit le programme.

Je crois que le UNO est mort.

 

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Arduino : 1.8.13 (Windows 10), Carte : "Arduino Uno"
Le croquis utilise 7302 octets (22%) de l'espace de stockage de programmes. Le maximum est de 32256 octets.
Les variables globales utilisent 1292 octets (63%) de mémoire dynamique, ce qui laisse 756 octets pour les variables locales. Le maximum est de 2048 octets.
avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0xdd
avrdude: stk500_getsync() attempt 2 of 10: not in sync: resp=0x07
avrdude: stk500_getsync() attempt 3 of 10: not in sync: resp=0xdd
avrdude: stk500_getsync() attempt 4 of 10: not in sync: resp=0x07
avrdude: stk500_getsync() attempt 5 of 10: not in sync: resp=0xdd
avrdude: stk500_getsync() attempt 6 of 10: not in sync: resp=0x07
avrdude: stk500_getsync() attempt 7 of 10: not in sync: resp=0xdd
avrdude: stk500_getsync() attempt 8 of 10: not in sync: resp=0x07
avrdude: stk500_getsync() attempt 9 of 10: not in sync: resp=0xdd
avrdude: stk500_getsync() attempt 10 of 10: not in sync: resp=0x07
 
Une erreur est survenue lors du transfert du croquis
Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 



#148 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 07 décembre 2020 - 06:57

Dans la fonction envoyer_pulse(), tu fais cette instruction :

 

while( (PORTD & 0B11111100) | (PORTB & 0B00000011) )

 

Ne serait-ce pas plutôt celle là que tu veux faire ?

 

while( (PORTD & 0B11111100) || (PORTB & 0B00000011) )

 

 

Je ne comprends pas ces #define. Ils sont identiques ! 

 

//nom du pot correspondant à chaque pin
#define PORT_DE_PIN_2 PORTD
#define PORT_DE_PIN_3 PORTD
#define PORT_DE_PIN_4 PORTD
#define PORT_DE_PIN_5 PORTD
#define PORT_DE_PIN_6 PORTD
#define PORT_DE_PIN_7 PORTD
#define PORT_DE_PIN_8 PORTB
#define PORT_DE_PIN_9 PORTB
 
 

 



#149 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 07 décembre 2020 - 07:21

Tu as réussi à verser le code, ou toujours pas ?

 

Lorsqu'il y a un boucle sans fin dans le code utilisateur (bug), le bootloader n'est plus disponible. Ca arrive !  Est-ce que tu as moyen de reprogrammer le bootloader ?

 

Patrick.



#150 Sandro

Sandro

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 1 321 messages
  • Gender:Male

Posté 07 décembre 2020 - 07:56

 

Dans la fonction envoyer_pulse(), tu fais cette instruction :

 

while( (PORTD & 0B11111100) | (PORTB & 0B00000011) )

 

Ne serait-ce pas plutôt celle là que tu veux faire ?

 

while( (PORTD & 0B11111100) || (PORTB & 0B00000011) )

Les deux fonctionnent ici, même s'ils ne font pas exactement la même chose :

Ce qui est commun :

- PORTD est un octet qui pour les pins 0 à 7 vaut 1 si le pin est à 5V, 0 sinon. Par exemple PORTD =B10001111 (le B signifie que c'est un nombre en binaire) signifie que les pins 0 à 3 et le pin 7 sont à 5V, les autres à 0V

- (PORTD & 0B11111100) : on mets a zéro les 2 derniers bits (qui correspondent aux pins 0 et 1 qui ne nous intéressent pas). Nommons le résultat A

- PORTB est la même chose que portD, mais pour les pins de 8 à 13 (PORTB=B00000001 correspond au pin 8 à 5V)

-  (PORTB & 0B00000011): on mets a zéro tous les bits sauf les 2 derniers bits (qui correspondent aux pins 8 et 9, les seuls qui ne nous intéressent sur ce port). Nommons le résultat B.

 

Ensuite, on a deux choix :

- C = A | B : on prend le OU bit à bit : le while sera exécuté si C est différent de 0

- C = A || B : on calcule A : si A est non nul, alors le résultat est true, sinon, on calcule B et C vaut true si B!=0 et false si B==0 ; le while est exécuté si C est true

 

Qu'est-ce qui est mieux, je l'ignore.

la solution avec "|" rajoute un "if" implicite, mais ne calcule pas B si A est déja non null. Je penses (mais j'en suis pas sur, il faudrait voir l'assembleur) que la solution avec "|" est plus rapide en moyenne, mais plus lente dans le pire des cas. Celle avec "||" prends toujours une durée fixe

 

 

 

Je ne comprends pas ces #define. Ils sont identiques ! 

 

//nom du pot correspondant à chaque pin
#define PORT_DE_PIN_2 PORTD
#define PORT_DE_PIN_3 PORTD
#define PORT_DE_PIN_4 PORTD
#define PORT_DE_PIN_5 PORTD
#define PORT_DE_PIN_6 PORTD
#define PORT_DE_PIN_7 PORTD
#define PORT_DE_PIN_8 PORTB
#define PORT_DE_PIN_9 PORTB

Non, les defines ne sont pas tous identiques : pour les deux derniers c'est un B à la fin à la place du D (je sais, c'est pas facile à voir, d'autant moins que B et D se ressemblent pas mal de loin)



 

Tu as réussi à verser le code, ou toujours pas ?

 

Lorsqu'il y a un boucle sans fin dans le code utilisateur (bug), le bootloader n'est plus disponible. Ca arrive !  Est-ce que tu as moyen de reprogrammer le bootloader ?

 

Patrick.

Non, sauf erreur de ma part, l'arduino est prémuni contre ce problème là, vu que c'est le second microcontroleur (celui qui fait l'interface USB) qui tire le pin reset à 0.

Les seuls moyens que je connaisse pour planter une arduino en soft sont :

- désactiver le pin de reset

- une boucle qui force un reboot permanant (par exemple avec un watchdog timer plus court que le temps de boot, un jmp 0 dans le setup, ...)

 

 

 

@Oracid : essaye de jouer avec le bouton reset en même temps que tu upload (reset pressé, puis resset relaché puis upload ; reseet présé, upload, resset relaché, ...)

Vérifie bien aussi que tu es sur le bon port, et que tu as bien précisé le bon type d'arduino (Uno, nano (attention, il y a 3 options de processeurs/bootloaders pour la nano, il faut choisir la bonne))
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#151 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 07 décembre 2020 - 09:07

- Concernant le OU, de mémoire, je ne suis pas certain que le résultat soit identique, mais je voulais juste m'assurer que ce n'était pas une erreur.

- Concernant le #define, ce qui me choque, c'est qu'ils aient la même valeur.

- Est-ce que PORTD et PORTB sont des mots réservés, dans le monde Arduino ?

 

Tu as réussi à verser le code, ou toujours pas ?

Lorsqu'il y a un boucle sans fin dans le code utilisateur (bug), le bootloader n'est plus disponible. Ca arrive !  Est-ce que tu as moyen de reprogrammer le bootloader ?

Oui, j'ai réussi à verser le code. Et non, je n'ai pas les moyens de reprogrammer le bootloader.

 

Je vais tenter de presser le Reset pendant le téléversement, on verra bien.

Si le UNO est cramé ou le Shield, j'en profiterai pour changer de Shield et mettre celui qui permet de se passer de l'UBEC.



#152 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 07 décembre 2020 - 09:11

Ok, j'ai trouvé pour le PORTD et PORTB, https://www.arduino....ortManipulation



#153 Sandro

Sandro

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 1 321 messages
  • Gender:Male

Posté 07 décembre 2020 - 09:47

Si tu arrives à verser le code, alors le problème est résolu, non? Du coup plus la peine de t'embêter avec le reset.

- Concernant le OU, de mémoire, je ne suis pas certain que le résultat soit identique, mais je voulais juste m'assurer que ce n'était pas une erreur.

( (PORTD & 0B11111100) | (PORTB & 0B00000011) )    et   ( (PORTD & 0B11111100) || (PORTB & 0B00000011) ) ne sont généralement pas égaux. En revanche, si l'un est nul, alors l'autre aussi. Du coup, mis dans un while (ou dans un if), qui ne regarde que si c'est 0 ou pas, le comportement du programme sera le même.

Si tu veux rajouter la seconde barre verticale, pas de problème, la différence dans un sens ou dans l'autre sera infime
 

- Concernant le #define, ce qui me choque, c'est qu'ils aient la même valeur.

Pour chaque pin, j'ai deux defines : un qui donne le port (PORTD ou PORTB), et un second qui correspond à la position du pin dans le port (que j'ai représenté sous forme d'un octet avec des 1 partous sauf à la position du bit correspondant, vu que ça me facilitait ensuite les calculs). La combinaison de ces deux informations permet de définir de manière unique chaque pin
 

- Est-ce que PORTD et PORTB sont des mots réservés, dans le monde Arduino ?

Oui, c'est deux registres qui permettent de manipuler directement les ports (en mode output, on écrit la valeur, en mode input, sauf erreur de ma part, ils activent ou désactivent la résistance de pull-up)
 


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#154 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 08 décembre 2020 - 07:38

Si tu arrives à verser le code, alors le problème est résolu, non? Du coup plus la peine de t'embêter avec le reset.

J'ai réussi à téléverser le programme deux fois, depuis, cela ne fonctionne plus.

 

Merci pour tes explications.



#155 Sandro

Sandro

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 1 321 messages
  • Gender:Male

Posté 08 décembre 2020 - 07:59

Dans ce cas, ça vaut le coup d'essayer avec le reset.

Sinon, tu as bien vérifié que dans le logiciel arduino, tu as précisé le bon type d'arduino, le bon processeur (si c'est une arduino nano), et le bon port?

 

Si ça ne marche toujours pas, je te suggère d'enlever l'arduino du shield pour voir si par hasard ça résoud le problème


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#156 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 08 décembre 2020 - 02:33

Dans ce cas, ça vaut le coup d'essayer avec le reset.

Sinon, tu as bien vérifié que dans le logiciel arduino, tu as précisé le bon type d'arduino, le bon processeur (si c'est une arduino nano), et le bon port?

Si ça ne marche toujours pas, je te suggère d'enlever l'arduino du shield pour voir si par hasard ça résoud le problème

Oui, bien entendu, j'ai fait tout cela. Au final, j'ai pioché dans mon stock d'Arduino.

J'en ai profité pour tout démonter et faire une nouvelle version, du Quad. Plus légère, environ 500g.

J'espère terminer ce soir ou demain et pour commencer, tester mon programme dessus.



#157 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 09 décembre 2020 - 09:07

Je me bats avec un problème idiot ! J'ai monté mon ancien Shield qui accepte le 8,3V d'une 2S en direct, sur mon Arduino Uno. Donc, sans UBEC intermédiaire.

Lorsque je connecte l'ensemble, Uno+Shield, alimenté par une 2S, avec le câble USB, mon PC plante méchamment.

Lorsque je connecte l'ensemble, Uno+Shield, alimenté par un UBEC en 7.4V, lui-même alimenté par une 2S, avec le cable USB, mon PC ne bronche pas.

 

Avez-vous une idée du problème ?

L'objectif est de me passer de l'UBEC.



#158 Sandro

Sandro

    Membre chevronné

  • Modérateur
  • PipPipPipPip
  • 1 321 messages
  • Gender:Male

Posté 09 décembre 2020 - 09:16

Bonjour,

est-ce que tu peux être un peu plus précis?

Sur le PC, qu'est-ce qui plante : juste l'interface Arduino, ou tout le PC? Dans le second cas, je te déconseille vivement de poursuivre les tests avant d'avoir vérifier que tu n'as pas de tensions dangereuses sur l'USB (j'ai cramé une ordinateur portable très probablement à cause d'une tension dangereuse remontée par l'USB depuis un arduino).

 

Est-ce que tu aurais un lien vers le shield que tu utilise (sinon, est-ce que tu sais comment il alimente l'arduino (tension directe sur Vin? 5V sur le pin 5V?))

 

Pour d'éventuels tests supplémentaires selon les réponses, est-ce que tu possède :

- un multimètre

- un oscilloscope

- des résistances

- un condensateur


Aidez-nous à vous aider : partagez toutes les informations pertinentes : description précise du problème, contexte, schéma de câblage, liens vers la documentation des composants, votre code (ou encore mieux un code minimal reproduisant le bug), ...

Vous recevrez ainsi plus de réponses, et elles seront plus pertinentes.


#159 pat92fr

pat92fr

    Membre passionné

  • Membres
  • PipPipPip
  • 796 messages
  • Gender:Male

Posté 09 décembre 2020 - 09:17

Quelle est la référence de ton Shield ? Est-ce qu'il y a un cavalier de configuration pour sélectionner la source d'alimentation externe ?



#160 Oracid

Oracid

    Pilier du forum

  • Modérateur
  • PipPipPipPipPip
  • 7 030 messages
  • Gender:Male

Posté 09 décembre 2020 - 11:52

Oui, c'est bien le PC qui plante ! Oui, j'ai un multimètre.

Il s'agit du très classique Sensor Shield V5.0 que l'on peut voir ici sur la vidéo du bas, https://www.robot-ma...duino/?p=101444

 

J'ai regardé cette vidéo une nouvelle fois. Je laissais le cavalier comme indiqué à 1'54". Ce qui provoquait le plantage.

Mais je me suis ravisé et j'ai retiré le cavalier comme indiqué à 0'55". Du coup, plus de problème, ça ne plante plus !

Il faut donc, bien, retirer le cavalier si on veut connecter le UNO au PC par l'USB. Malheureusement, il n'en parle pas dans la vidéo.

 

Merci, quand même, pour votre réactivité.






1 utilisateur(s) li(sen)t ce sujet

0 members, 1 guests, 0 anonymous users