Une broche hantée fait planter mon code, damned

Bonjour
Bon, je taffe là-dessus depuis vendredi, ça marche super bien: on dirige deux moteurs avec un potard.
Mon algo marche, il fait ce que je voulais, hourra.

Etape suivante, ajouter un servo.
Facile, sauf que dès que je décommente la ligne 58, un moteur ne fonctionne plus.

Arduino Uno, Driver DeekRobot L293d, moteurs de noob, servo SG90, rien de fou.

L’accumulation de sorties PWM en simultanées c’est mauvais?
Le pin 3 n’aime pas être réveillé?

Là vraiment, je pige pas…

// Déclarations servo IR
#include <Servo.h>
Servo MyServo;        //servo des capteurs IR
int USMyServo = 1500; //variable µs de MyServo, centré sur 1500
byte RotMyServo = 10; //vitesse de rotation de MyServo

// STEPPER, définition des pins
#define E1 10   // Enable PWM moteur 1
#define E2 11   // Enable PWM moteur 2
#define I1 8    // pin a moteur 1
#define I2 9    // pin b moteur 1
#define I3 5    // pin a moteur 2
#define I4 6    // pin b moteur 2

// Déclaration capteurs IR
#define IRG 7  //pin IR Gauche
#define IRC 4  //pin IR Centre
#define IRD 2  //pin IR Droite

// Variables binaires lecture capteurs IR
boolean b3, b2, b1; //, b0;
int b = 0;

// Déclarer pin retour analogique MyServo
#define Potard A0 //le retour analogique de MyServo est sur A0

// Positions de référence
int ANLeft = 180;  // valeur du potentiomètre à gauche
int ANMid = 325;   // valeur du pot. au milieu
int ANRight = 490; // val. pot. droite

// Brides moteurs sortie PWM
byte PWMmin = 0;   // vitesse minimum 0-255
byte PWMmax = 135; // vitesse maxi    0-255

// Déclarer témoin Led
#define Led 13 // pin 13

//---------------------------------------------------------------------------

void setup() {

  // Démarrer port série
  Serial.begin(9600);

  // Déclarer la led
  pinMode(Led, OUTPUT);    // Led est une sortie
  digitalWrite(Led, HIGH); // Témoin I/O

 /* // Déclarer entrées des capteurs IR
  pinMode(IRG, INPUT); //IRG
  pinMode(IRC, INPUT); //IRC
  pinMode(IRD, INPUT); //IRD*/


// C'EST ICI QUE CA M**DE
  // Déclarer servo 
// MyServo.attach(3); //cette ligne fait arrêter le moteur d'un côté


  // Commander sens des moteurs
  digitalWrite(I1, HIGH);
  digitalWrite(I2, LOW);
  digitalWrite(I3, HIGH);
  digitalWrite(I4, LOW);
}

//---------------------------------------------------------------------------

void loop() {


  // Convert en régime moteur
  // Lire signal, le mapper dans les limites PWMmin/max, le contraindre dans les memes limites
  analogWrite (E1, constrain (map (analogRead(Potard), ANRight, ANMid,  PWMmin, PWMmax), PWMmin, PWMmax));
  analogWrite (E2, constrain (map (analogRead(Potard), ANMid,   ANLeft, PWMmax, PWMmin), PWMmin, PWMmax)); 

}

Bonjour,

La broche 3 utilise le même Timer que la 11 (Arduino Playground - TimerPWMCheatsheet), qui correspond au PWM de ton 2ème moteur, c'est probablement ça qui pose problème.

Bienvenue dans l'univers arduino et son absence de documentation facilement accessible.

La bibliothèque servo utilise un timer (le 0 je pense, à vérifier).
Donc tu ne peut pas te servir des sorties PWM pilotées par ce timer il est pris par autre chose.

Travail à faire :
2) Vérifier dans le code de la bibliothèque quel timer est utilisé.
3) Vérifier sur Arduino à quoi correspond la pin 3 (de mémoire pour un 328p ce doit être la pin 3 du port D
4) Vérifier dans la datasheet du micro à quel timer est raccordée la pin 3 du Port D.

--> je parle là pour le microcontrôleur 328p, celui des UNO, nano, mini-pro.
Pour un autre micro avr le nom des port peut changer.

La broche 3 utilise le même Timer que la 11

Je ne pense pas que ce soit cela qui gène, la seule imposition est que l'horloge du timer est la même mais c'est toujours le cas.

Bon sang d'bonsoir, c'est toujours compliqué. Je commence à penser que la conception est un peu foireuse, j'ai déjà plus de place pour brancher mon servo...
C'est franchement débile des fois l'organisation des pins, avec un PWM par ici et par là... Un truc qui fait TX, un autre qui fait le café...

Le driver des moteurs prend déjà six broches à lui seul! Est-il possible de virer les câbles qui servent à la marche arrière? ils sont toujours sur LOW...

Deuxième question pour la suite: des capteurs digitaux, si je les mets sur des broches analogiques, je peux les traiter avec digitalRead ou je vais encore devoir me bagarrer pour pouvoir lire du HIGH/LOW ?

Non dé diou

kammo:
Est-il possible de virer les câbles qui servent à la marche arrière? ils sont toujours sur LOW...

Mets les directement sur GDN.... tu as gagné deux pins :smiley:

C'est franchement débile des fois l'organisation des pins, avec un PWM par ici et par là... Un truc qui fait TX, un autre qui fait le café...

Ce genre de réflexion est lassante à force.
Concevoir un microcontrôleur est le travail d'une équipe de spécialistes qui n'ont pas un QI d'huitre.

Donc si le brochage est ce qu'il est c'est qu'il y a des raisons techniques impérieuses.

On est d'accord ?

Deuxième question pour la suite: des capteurs digitaux, si je les mets sur des broches analogiques,

Toujours bienvenue dans la fantastique documentation arduino.

Sache bien une chose chaque E/S possède une fonction principale et une ou plusieurs fonctions secondaires.

  • La fonction principale est d'être une E/S numérique.
  • Les fonctions secondaires peuvent être selon les pins : RX et TX, l'I2C, le SPI, la PWM et la mesure analogique.

Au démarage du micro toutes les E/S sont des E/S NUMERIQUES.

Aucune ne sont analogique --> c'est par l'appel à la fonction Wiring analogRead(), copiée par arduino, que les registres du micro sont modifiés pour activer le mode analogique.

Donc tu gères les E/S A0 à A5 qui sont aussi appelées 14 à 19 comme des entrées numériques.
Ecrire digitalWrite(A0, HIGH) ou digitalWrite(14, HIGH) revient à la même chose.

jfs:
Mets les directement sur GDN.... tu as gagné deux pins :smiley:

Cool, c'est déjà ça ^^

68tjs:
On est d’accord ?

Bah en fait pas spécialement. Ya des tas d’ingénieurs chez Renault et ça fait toujours sapin de Noël quand on freine, Windows est conçu par des tas de gens, et ça marche à moitié, j’en ai d’autres…
Ok sur le principe, mais c’est pas une règle stricte malheureusement.

68tjs:
Donc tu gères les E/S A0 à A5 qui sont aussi appelées 14 à 19 comme des entrées numériques.
Ecrire digitalWrite(A0, HIGH) ou digitalWrite(14, HIGH) revient à la même chose.

Ah bah voilà! J’ai bien lu ça dans la doc, mais j’ai pas compris ça du tout.

C’est sensé et pertinent, merci pour tes explications.

Je suis parti sur un montage avec deux arduino (j’ai une nano qui dort dans une boîte), c’est l’occasion d’essayer.

Désolé de m’emporter un peu, mais depuis vendredi je démonte tout, recommence avec d’autres pins, recommence, j’ai refait trois fois mon programme. Pas moyen de trouver le sommeil hier et je bois trop de café ^^

68tjs:
Je ne pense pas que ce soit cela qui gène, la seule imposition est que l'horloge du timer est la même mais c'est toujours le cas.

Tu as raison, bien sûr.

68tjs:
La bibliothèque servo utilise un timer (le 0 je pense, à vérifier).
Donc tu ne peut pas te servir des sorties PWM pilotées par ce timer il est pris par autre chose.

C'est le Timer1, utilisé par la broche PWM 10.

Donc ça signifie que les sorties PWM sont groupées. une partie en 1 et une partie en 0.
Donc si je veux dépasser deux sorties PWM, j'ai intérêt à utiliser plusieurs arduino ou à multiplexer mes servos.

C'est ça?

Faut que j'anticipe et que je commande le multiplexe pour mon futur bras robotisé....

Je vois plein de robots suiveurs de ligne et éviteurs d'obstacles avec deux moteurs et un servo pour le capteur US...
Je suis vraiment beaucoup plus stupide que je le croyais...

kammo:
Donc ça signifie que les sorties PWM sont groupées. une partie en 1 et une partie en 0.
Donc si je veux dépasser deux sorties PWM, j'ai intérêt à utiliser plusieurs arduino ou à multiplexer mes servos.

C'est ça?

Faut que j'anticipe et que je commande le multiplexe pour mon futur bras robotisé....

Non, c'est pas ça. Regarde la page dont j'ai donné le lien au début, tu verras que les 6 PWM sont répartis sur 3 timers. En supposant que le Timer 1 ne soit pas utilisable à cause du servo, il te reste encore 4 PWM utilisables.

Ah oui d'accord.
Comme c'est en anglais et que c'est assez pointu, je vais chercher un tuto pour comprendre ces nuances.

Merci