Autres arduino et programmation rc

  • Auteur de la discussion cedreatlas
  • Date de début
J

jpbbricole

Compagnon
Il faut que tu me mettes le programme complet pour que je puisse rechercher les erreurs.
 
C

cedreatlas

Ouvrier
ce programme (que tu m'a fait) fonctionnait il y a deux jours, je ne comprends plus...

/************************************************************************
RC 6/SERVOS + Mixage 8/BOUTONS EMETTEUR

Radio TRUC 6S_8B_1M
Permet d'avoir :
1,2,3,4,5 ou 6 voies proportionnelles.
Un mixage des voies 1 et 2 peut être actionné ou pas grâce à un inter.
1,2,3,4,5,6,7 ou 8 voies TOR qui pourra actionner des relais

*************************************************************************/

#include <SPI.h>
#include "RF24.h"
RF24 radio(9,10);
const uint64_t pipe = 0xE8E8F0F0E1LL;

typedef struct { uint8_t Msg0; uint8_t Msg1; uint8_t Msg2; uint8_t Msg3;
uint8_t Msg4; uint8_t Msg5; uint8_t MsgBt; }MsgSt_t;
MsgSt_t MonMessage;

#define NB_ELTS_DANS_TABLE(Table) (sizeof(Table) / sizeof(Table[0]))
int potpin_0 = A0; int potpin_1 = A1; int potpin_2 = A2;
int potpin_3 = A3; int potpin_4 = A4; int potpin_5 = A5;
#define poussoir 2
int val_0; int val_1; int val_2; int val_3; int val_4; int val_5;
int i;
int m; // Message
int val_1x; int val_2x; int diff;
int neutre = 90;
int posmin = 45; int posmax = 135; // Ligne à valider pour une rotation de 90° des servos ou Ligne à supprimer pour 180°
//int posmin = 0; int posmax = 180; // Ligne à valider pour une rotation de 180° des servos ou Ligne à supprimer pour 90°

int b_t[] = {2,2,3,4,5,6,7,8}; // tableau des Boutons
int b[] = {2,2,3,4,5,6,7,8}; // Tableau bite de message
//----------------------------------------------------------------
void setup(void)
{
Serial.begin(9600);
pinMode(poussoir,INPUT);
for (i = 0; i < NB_ELTS_DANS_TABLE(b_t); i ++)
{ pinMode(b_t, INPUT); digitalWrite(b_t, HIGH);}

radio.begin();
radio.openWritingPipe(pipe);
}
//----------------------------------------------------------------
void loop()
{
for (i = 0; i < NB_ELTS_DANS_TABLE(b_t); i ++) {
if (digitalRead(b_t)) { b = bitClear(m,i); }
else { b = b = bitSet(m,i); }
}
val_0 = (analogRead(potpin_0)); val_0 = map(val_0, 0, 1023, posmin, posmax);
val_1 = (analogRead(potpin_1)); val_1 = map(val_1, 0, 1023, posmin, posmax);
val_2 = (analogRead(potpin_2)); val_2 = map(val_2, 0, 1023, posmin, posmax);
val_3 = (analogRead(potpin_3)); val_3 = map(val_3, 0, 1023, posmin, posmax);
val_4 = (analogRead(potpin_4)); val_4 = map(val_4, 0, 1023, posmin, posmax);
val_5 = (analogRead(potpin_5)); val_5 = map(val_5, 0, 1023, posmin, posmax);
//----------------------------------------------------------------------------
if (digitalRead(poussoir)== LOW ) {
val_1x = val_1; // Donne à la variable (val_1x) la valeur de (signal) lue sur le pin2
val_2x = val_2; // Donne à la variable (val_2x) la valeur de (signal) lue sur le pin2

diff = (val_2x - neutre); // Calcule l'ecart entre les deux servos
val_1 = val_1x - diff; val_2 = val_1x + diff; // Calcule la position des servos
val_1=constrain(val_1, posmin, posmax); // Calibre les valeurs pour le servo1 dans la plage acceptée
val_2=constrain(val_2, posmin, posmax);
}
MonMessage.Msg0 = val_0; MonMessage.Msg1 = val_1; MonMessage.Msg2 = val_2;
MonMessage.Msg3 = val_3; MonMessage.Msg4 = val_4; MonMessage.Msg5 = val_5;
//----------------------------------------------------------------------------
MonMessage.MsgBt = m;

Serial.print("Tx: " + String(val_0) + "-" + String(val_1) + "-" + String(val_2) + "-");
Serial.println(String(val_3) + "-" + String(val_4) + "-" + String(val_5) + "-" + String(m));

radio.write(&MonMessage, sizeof(MonMessage));
}

//============================= FIN DE PROGRAMME ======================
 
J

jpbbricole

Compagnon
Salut @cedreatlas
J'ai essayé ton programme, sans problème.
A l'avenir, mets les programmes dans des fenêtres de code, parceque, sans ça, il y a des modifications intempestives du code, regarde mon post #109.
Pour ce faire, dans l'IDE Arduino, copier l'entier du code dans le presse-papier, dans la réponse du forum, sélectionner
upload_2017-6-7_18-27-46.png

upload_2017-6-7_18-28-19.png

et coller le contenu du presse-papier dans la fenêtre code:
upload_2017-6-7_18-29-9.png


Cordialement
jpbbricole
 
C

cedreatlas

Ouvrier
bonsoir
Et quand je rajoute ton programme post 179, j'ai ces erreurs:

Arduino : 1.8.2 (Windows 10), Carte : "Arduino Nano, ATmega328"

sketch_jun07b:79: error: 'val_0' does not name a type

val_0 = (analogRead(potpin_0)); val_0 = map(val_0, 0, 1023, posmin, posmax);

^

sketch_jun07b:79: error: 'val_0' does not name a type

val_0 = (analogRead(potpin_0)); val_0 = map(val_0, 0, 1023, posmin, posmax);

^

sketch_jun07b:80: error: 'Serial' does not name a type

Serial.println("Pot: " + String(val_0));

^

sketch_jun07b:81: error: 'val_1' does not name a type

val_1 = (analogRead(potpin_1)); val_1 = map(val_1, 0, 1023, posmin, posmax);

^

sketch_jun07b:81: error: 'val_1' does not name a type

val_1 = (analogRead(potpin_1)); val_1 = map(val_1, 0, 1023, posmin, posmax);

^

exit status 1
'val_0' does not name a type

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.
 
C

cedreatlas

Ouvrier
salut
non, c'est bon , je l'avais mal placé, maintenant , j'ai les valeurs du post 189
cordialement
Ph
 
C

cedreatlas

Ouvrier
salut
En fait, j'ai mis comme valeurs 250-523 et le servo fait presque 180°, donc c'est bon pour cette partie de programme, mon fils(bucherondu11) me l'avait dit, jpb, il ne te lache pas et il est patient le gars..
encore merci
Ph
 
C

cedreatlas

Ouvrier
salut
J'ai un potentiomètre "barette", je voudrais le regler à 180° pour le servo, mais comment régler par rapport aux valeurs du sérial?
cordialement
Ph
 
J

jpbbricole

Compagnon
et il est patient le gars..
@bucheronze a raison, il aurait pû ajouter têtu:wink:, mais tout ça avec le plaisir de partager.

J'ai un potentiomètre "barette", je voudrais...
Si la méthode pour le joystick (val_0) a joué, reproduis-la pour chaque entrée analogique, en déplaçant la ligne

val_1 = (analogRead(potpin_1)); val_1 = map(val_1, 0, 1023, posmin, posmax);
Serial.println("Pot: " + String(val_1));

et ainsi de suite

Cordialement
jpbbricole
 
C

cedreatlas

Ouvrier
oui, mais les valeurs de mon post 193, je les ai mise au pif et j'ai bidouillé mais quelle est la logique de mes valeurs 250-523 par rapport au post 189??
 
J

jpbbricole

Compagnon
je les ai mise au pif
!!!
Tout est dans le post #179. justement pour éviter de travailler au pif.
Quand tu as fait la manipuéation du post#179., tu as eu quelles valeurs (dans le sérial POT: xxx) min et max?

Tu répètes la même chose pour les entrées suivantes en déplacant la ligne comme indiqué au poste #195.
Après tu peux supprimer le ligne Serial.println("Pot: ...., devenue inutile.

Cordialement
jpbbricole
 
C

cedreatlas

Ouvrier
j'ai dans le pot 50-175, mais quand j'enregistre ces valeurs, le servo fait 2-3 fois l'aller retour, estce que ça provient du servo qui est un servo de robot et non de modelisme?
 
J

jpbbricole

Compagnon
Essayes de mettre un servo de modelliste à la place et observe sa réaction.

Cordialement
jpbbricole
 
C

cedreatlas

Ouvrier
Alors, un servo analogique claque sans bouger, idem pour un servo digital modelisme
cordialement
Ph
 
J

jpbbricole

Compagnon
Mets-moi en ligne ce bloc de lignes de l'émetteur
val_0 = (analogRead(potpin_0)); val_0 = map(val_0, 0, 1023, posmin, posmax);
val_1 = (analogRead(potpin_1)); val_1 = map(val_1, 0, 1023, posmin, posmax);
val_2 = (analogRead(potpin_2)); val_2 = map(val_2, 0, 1023, posmin, posmax);
val_3 = (analogRead(potpin_3)); val_3 = map(val_3, 0, 1023, posmin, posmax);
val_4 = (analogRead(potpin_4)); val_4 = map(val_4, 0, 1023, posmin, posmax);
val_5 = (analogRead(potpin_5)); val_5 = map(val_5, 0, 1023, posmin, posmax);

Côté récepteur
if (radio.available())
{
erreur_reception = 0;
while(!radio.read(&MonMessage, sizeof(MonMessage)));
val_0= MonMessage.Msg0; val_1= MonMessage.Msg1; val_2= MonMessage.Msg2;
val_3= MonMessage.Msg3; val_4= MonMessage.Msg4; val_5= MonMessage.Msg5;
m = MonMessage.MsgBt;

Serial.print("Rx: " + String(val_0) + "-" + String(val_1) + "-" + String(val_2) + "-");
Serial.println("-" + String(val_3) + "-" + String(val_4) + "-" + String(val_5) + "-" + String(m));

}
Est-ce-que tu as ces 2 lignes en gras, si non mets les.
Bouges les 2 manches de l'émetteur et mets en ligne ce qu'il y a dans le sérial.
Regardes les valeurs reçues, sont elles compatibles avec tes servos, sachant que le premier servo fonctionne, est-ce-que les valeurs reçues pour le 2ème, sont elles plausibles?

Cordialement
jpbbricole
 
C

cedreatlas

Ouvrier
Oui, j'ai ces 2 lignes


j'ai relevé ces 2 valeurs 91-680 que j'ai appliqué, mais le servo (robot) acheté pour 180° ne parcours que 90°, alors que celui acheté pour 270° parcours 180°, ce que j'avais remarqué avec une télécommande rc classique, mais hier, le 180° parcourait les 180° avec d'autres valeurs mais pas aujourd'hui!!
mais j'ai remarqué que ces valeurs changeaient, donc c'est compliqué
 
J

jpbbricole

Compagnon
Salut cedreatlas
Voilà, la petite pause est terminée. J'avais pas mal de choses autres à faire comme des cours informatiques aux personnes agées, le Repair café etc.

Pour ton problème, pour changer le débattement d'un servo, remplace les variables posmin et posmax (45 et 135) par des valeurs et ce sur la ligne qui concernèe.

Par exemple:
val_0 = (analogRead(potpin_0)); val_0 = map(val_0, 91, 680, 30, 180);

Cordialement
jpbbricole
 
Dernière édition:
C

cedreatlas

Ouvrier
Salut
donc , j'y vais au pif et je cherche les bons angles, c'est bien ça?
Ph
 
C

cedreatlas

Ouvrier
c'est ce que je fais depuis 2-3 soirs, c'est compliqué car selon les potentiomètres, barettes, joystick, et les servos, toutes les mesures sont différentes..pas de logique !
Ph
 
C

cedreatlas

Ouvrier
quand je televerse, j'ai souvent ça qui s'affiche:

Televersement vers la carte E/S
upload_2017-6-14_13-57-40.png


apres je reteleverse et tout est bon??
 
S

speedjf37

Compagnon
Bonjour,

Fermer le moniteur série avant de re-télécharger .

Cordialement JF
 
J

jpbbricole

Compagnon
c'est compliqué car selon les potentiomètres, barettes,
Le programme émetteur, au départ, est fait pour des périfériques (joystick / servo) homogènes, d'où les variables posmin et posmax.
Dans ton cas avec des péréfériques hétéroclites, laisse tomber ces 2 variables, fixe, une fois pour toute quel potentiomètre ou joystick correspond, au récepteur, à quel servo et "bidouille" chaque canal, donc ces lignes:
val_0 = ...
val_1 = ...
...

avec les outils, info des post précédents.

Cordialement
jpbbricole
 
C

cedreatlas

Ouvrier
Chose curieuse, j'arrive à faire 180° avec des servos donnés pour 270°, mais les servos donnés pour 180° ne vont qu'à 90°, j'en ai ouvert un mais pas de butée mécanique donc impossible à modifier mécaniquement,il me semble bien qu'un jour j'avais testé un programme qui fonctionnait à 180°, tu vois ce que je veux dire?
Et t'es un peu loin pour que j'aille au repair café, haha
Ph
 

Sujets similaires

A
Réponses
5
Affichages
2 152
jpbbricole
J
J
Réponses
18
Affichages
4 441
jpbbricole
J
V
Réponses
56
Affichages
10 837
vibram
V
Haut