Autres arduino et programmation rc

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

Rebus

Compagnon
Re,

Je voulais poser une question à jpbricole, qui semble avoir pas mal d'avance en programmation.
Est-ce que tu as déjà pratiqué les tables d'accélération ?
Un peu comme pour les moteurs pas à pas mais j'aimerai les utiliser pour des moteurs DC.

Au fait je suis passé à la vitesse supérieure, j'ai migré la réception vers une carte Mega2560 !

C'est pas que mon soft débordait la capacité de la Nano, mais les E/S devenaient un peu justes, là c'est l'abondance.
 
Dernière édition:
C

cedreatlas

Ouvrier
bonjour
oui, j'en avais acheté 3 , je pense que un est mort suite à une erreur, mais pas de voyant sur ces module, comment savoir s'ils sont ok?
pour jjbbricole:
sur ta photo ( en recepteur), j'ai fixé le RF24 car ça ne fonctionne pas sur le nano
 
C

cedreatlas

Ouvrier
voici une nouvelle picture, on voit le 5v et le gdn tout au bout à droite

IMG_20170521_105229[1].jpg
 
J

jpbbricole

Compagnon
Je vois qu'on a attaqué tôt ce matin
Et fini très très tôt ce matin aussi!
Il faut bien ça si l'on veut que la broyeuse de @cedreatlas broie autre chose que du noir:7dance:
j'ai migré la réception vers une carte Mega2560 !
Oui superbe machine, je l'ai utilisée partout où il fallait des "chevaux", je me lance aussi dans un montage à base de RF24, mais avec Nano parceque c'est de l'étude et surtout essentiellement avec des interfaces sur bus i2C, je me suis déjà gravé le PCB de l'émetteur.
Est-ce que tu as déjà pratiqué les tables d'accélération
Non mais je suis prêt à apprendre, expliques en 2 mots.
voici une nouvelle picture,
Voilà qui est nettement plus net:wink:


Cordialement
jpbbricole
 
R

Rebus

Compagnon
Non mais je suis prêt à apprendre, expliques en 2 mots.

jpbbricole

Moi aussi !!!!

En fait il s'agit de transformer la variation linéaire d'une valeur (sur 8bits) en variation suivant une courbe exponentielle ou logarithmique.
Sur un certain micro (qui date un peu) il y avait une instruction dédiée movc A,@A+DPTR
On allait chercher dans une table dont le début était pointée par un registre 16bits (DPTR) on se décalais de la valeur entrante (index @A) et on récupérais une valeur de la table dans A.

Des heures pour construire la table mais .....transcodage de n'importe quelle valeur 8bits en n'importe quelle autre valeur sur 8bits et en quelques microsecondes sans aucun calcul.

Comment faire cela en langage Arduino ???
 
V

vax

Modérateur
C'est un peu vieux pour moi (je ne programme plus depuis des années) ce que tu demandes ressemble sacrément à de l'adressage indexé, non ?
Une adresse de référence de début de table et un index de décalage te donne la valeur corrigé que tu veux...
 
C

cedreatlas

Ouvrier
Je ne me rappel plus les paroles mais c'est un truc comme ça: noir c'est noir, il y a de l'espoir, non?
et puisque vous appréciez mes photos, voici la TX, mais toujours pas de connection entre les 2

IMG_20170521_113833[1].jpg
 
R

Rebus

Compagnon
C'est un peu vieux pour moi (je ne programme plus depuis des années) ce que tu demandes ressemble sacrément à de l'adressage indexé, non ?
Une adresse de référence de début de table et un index de décalage te donne la valeur corrigé que tu veux...

Tiens bonjour Vax !

Aurais-tu terminé la découpe de mes lopins de bronze ?
Parce que depuis le mois d'octobre on en est à 7 mois ... l'accouchement ne devrait pas tarder !
Voir ma demande "Echange Codeur Stegman"
 
J

jpbbricole

Compagnon
En fait il s'agit de transformer la variation...
@cedreatlas excuses du parasitage!
ce que tu demandes ressemble sacrément à de l'adressage indexé, non
Ou bêtement à un tableau rempli à la main, en l'occurence.
C'est un peu vieux pour moi (je ne programme plus depuis des années)
Si tu t'est arrêté du temps des Vax, c'est sûre que ça fait long:7dance:

Voilà un exemple.


Cordialement
jpbbricole
 
J

jpbbricole

Compagnon
et puisque vous appréciez mes photos
Oh oui, je suis admiratif de tes progrèe, après 3 photos, déjà des photos nettes:roxxx:

Plaisanterie mise à part, on a le départ des fils depuis le Nano mais pas l'arrivée sur le module.
Concernant ma remarque à propos du port 0 ou Rx, évite de faire les essais avec le câble USB connecté et n'oublies pas de mettre un 0v (GND) sur la pin 0 pour déclencher l'émission.
Eventuellement, à l'avenir, on pourrait sacrifier une entrée TOR pour éviter ces petits problèmes.

Cordialement
jpbbricole
 
C

cedreatlas

Ouvrier
chaque jour qui passe, je progresse, mais ma mémoire régresse..
les branchements en question

IMG_20170521_121625[1].jpg
 
R

Rebus

Compagnon
J

jpbbricole

Compagnon
je viens d'apprendre quelque chose d'important
Et moi, en fouillant les programmes utilisés par @cedreatlas, c'est
typedef struct{
qui permet presque de faire de l'orienté objets dans l'Arduino.

D'où l'utilité des forums.

Bonne après-midi.
jpbbricole
 
Dernière édition:
C

cedreatlas

Ouvrier
oui, je suis très content d'avoir contribué à vos projets, bien malgré moi, haha
 
C

cedreatlas

Ouvrier
je ne comprend pas pourquoi il y a cette erreur, sans me la nommer!!

Arduino : 1.8.2 (Windows 10), Carte : "Arduino Nano, ATmega328"
Le croquis utilise 5624 octets (18%) de l'espace de stockage de programmes. Le maximum est de 30720 octets.
Les variables globales utilisent 408 octets (19%) de mémoire dynamique, ce qui laisse 1640 octets pour les variables locales. Le maximum est de 2048 octets.
Une erreur est survenue lors du transfert du croquis


#include <Wire.h>
#define adress1 0x20
#define adress2 0x39
#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 Msg6; uint8_t Msg7; uint8_t MsgTOR; }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; int potpin_6 = A6; int potpin_7 = A7;
#define poussoir 0
int val_0; int val_1; int val_2; int val_3; int val_4; int val_5; int val_6; int val_7;
int i;
int m; // Message
// int nbi =8; // Nombre de boutons (ici 8)
int b_t[] = {1,2,3,4,5,6,7}; // tableau des Boutons
int b[] = {1,2,3,4,5,6,7}; // Tableau bite de 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°
//----------------------------------------------------------------
void setup(void)

{
Serial.begin(9600);
for (i = 0; i < NB_ELTS_DANS_TABLE(b_t); i ++)
{ pinMode(b_t, INPUT); digitalWrite(b_t, HIGH);}
pinMode(poussoir,INPUT);
Wire.begin(); 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, 335, 665, posmin, posmax); val_0 = constrain(val_0, posmin, posmax);
val_1 = (analogRead(potpin_1)); val_1 = map(val_1, 335, 665, posmin, posmax); val_1 = constrain(val_1, posmin, posmax);
val_2 = (analogRead(potpin_2)); val_2 = map(val_2, 335, 665, posmin, posmax); val_2 = constrain(val_2, posmin, posmax);
val_3 = (analogRead(potpin_3)); val_3 = map(val_3, 335, 665, posmin, posmax); val_3 = constrain(val_3, posmin, posmax);
val_4 = (analogRead(potpin_4)); val_4 = map(val_4, 335, 665, posmin, posmax); val_4 = constrain(val_4, posmin, posmax);
val_5 = (analogRead(potpin_5)); val_5 = map(val_5, 335, 665, posmin, posmax); val_5 = constrain(val_5, posmin, posmax);
val_6 = (analogRead(potpin_6)); val_6 = map(val_6, 335, 665, posmin, posmax); val_6 = constrain(val_6, posmin, posmax);
val_7 = (analogRead(potpin_7)); val_7 = map(val_7, 335, 665, posmin, posmax); val_7 = constrain(val_7, posmin, posmax);
//----------------------------------------------------------------------------
Serial.println(val_0);
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.MsgTOR = m;
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.Msg6 = val_6; MonMessage.Msg7 = val_7; radio.write(&MonMessage, sizeof(MonMessage));
}
 
J

jpbbricole

Compagnon
Une erreur est survenue lors du transfert du croquis
Il n'y a aucune erreur dans le programme.
C'est clairement un problème de communications sur Tx et/ou Rx, c'est le danger quand on utilise les ports 0 et 1 pour des E/S

#define poussoir 0

nt b_t[] = {1,2,3,4,5,6,7}; // tableau des Boutons

for (i = 0; i < NB_ELTS_DANS_TABLE(b_t); i ++)
{ pinMode(b_t, INPUT); digitalWrite(b_t, HIGH);}
pinMode(poussoir,INPUT);


Le risque est, si on met des boutons dessus avec des polarités, quand on veut téléverser un programme, ces polarités "bouffent" le signal venant ou allant ver l'USB. Il y a des résistances de 1k les signaus (Tx Rx) de l'USB et les ports 0 et 1.

upload_2017-5-21_18-26-34.png

Alors, avant de téléverser, s'assurer qu'il n'y aie rien sur ces 2 pin.

Cordialement
jpbbricole
 
J

jpbbricole

Compagnon
Un petit truc que je viens de découvrir!!!
C'est fou ce que j'apprends grâce au post de @cedreatlas.

L'utilité de poster du code dans une fenâtre code:

devient, en dehors d'une fenêtre code (en collant du presse-papier), ceci:

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); }
}

Ce qui risque de changer des choses!

Cordialement
jpbbricole
 
C

cedreatlas

Ouvrier
Il n'y a aucune erreur dans le programme.
C'est clairement un problème de communications sur Tx et/ou Rx, c'est le danger quand on utilise les ports 0 et 1 pour des E/S

#define poussoir 0

nt b_t[] = {1,2,3,4,5,6,7}; // tableau des Boutons

for (i = 0; i < NB_ELTS_DANS_TABLE(b_t); i ++)
{ pinMode(b_t, INPUT); digitalWrite(b_t, HIGH);}
pinMode(poussoir,INPUT);


Le risque est, si on met des boutons dessus avec des polarités, quand on veut téléverser un programme, ces polarités "bouffent" le signal venant ou allant ver l'USB. Il y a des résistances de 1k les signaus (Tx Rx) de l'USB et les ports 0 et 1.

Voir la pièce jointe 339803
Alors, avant de téléverser, s'assurer qu'il n'y aie rien sur ces 2 pin.

Cordialement
jpbbricole

ça fonctionne maintenant merci

 
C

cedreatlas

Ouvrier
Un petit truc que je viens de découvrir!!!
C'est fou ce que j'apprends grâce au post de @cedreatlas.

L'utilité de poster du code dans une fenâtre code:

devient, en dehors d'une fenêtre code (en collant du presse-papier), ceci:

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); }
}

Ce qui risque de changer des choses!

Cordialement
jpbbricole
et ce n'est pas fini, vous aller en apprendre encore, haha
 
C

cedreatlas

Ouvrier
Bonjour à vous !

Je vois qu'on a attaqué tôt ce matin, hélas toujours pas de liaison Radio....
Question : est-ce que tu as commandé plusieurs modules Nrf24L01 ?
Moi j'en avais commandé 6, dont 4 avec antenne extérieure et deux avec antenne intégrée.
Je les ai intervertis et j'en ai 1 qui ne fonctionne pas du tout.

Tu devrais essayer tes sorties TOR d'abord car le risque d'erreur de câblage est minime, une led+résistance coté récepteur et un simple strap coté émetteur.

Comme tous les montages électroniques, si la led s'allume ... c'est bon.
la led s'allume mais comment tester le module RF24L??
 
R

Rebus

Compagnon
la led s'allume mais comment tester le module RF24L??

Bonjour,

Si la led s'allume en fonction de la position du strap sur la partie émission c'est que la liaison Radio est opérationelle !

Il faut alors te pencher sur le câblage des Joysticks :
Chacun des points milieu des potentiomètres est raccordé à une entrée Analogique A0, A1, A2 .....
Les bornes extrêmes des potentiomètres étant connectées respectivement au +5V et à la masse.

Pour tester la liaison Radio (couverture) il faut éloigner l'émetteur du récepteur et à un moment les servos vont brutalement se remettre en position médiane (ou à une autre position que tu peux définir toi même) car il y a dans le sketch une sécurité :

erreur_reception = erreur_reception + 1;
if (erreur_reception > 20)
{
val_0 = 90; val_1 = 90; val_2 = 90; val_3 = 90; val_4 = 90; val_5 = 90; val_6 = 90; val_7 = 90;
erreur_reception = 1; action();
}

Petit inconvénient l'information de perte de liaison n'est disponible que coté réception alors qu'elle serait bien plus utile coté émission.
Ce qui est certainement adaptable car les modules NRF24L01 sont bi-directionnels.
 
Dernière édition:
C

cedreatlas

Ouvrier
Si la led s'allume en fonction de la position du strap sur la partie émission c'est que la liaison Radio est opérationelle !
Bonjour
je n'ai plus rien dans le sérial ce matin, il faut que je revois ça..
cordialement
 
J

jpbbricole

Compagnon
Salut @cedreatlas
En bidouillant le RF24, j'ai essayé les exemples.
Dans l'IDE Arduino, tu charges Fichier/Exemples/RF24-master/GettingStarted
tu mets toutes les lignes de la void loop(void), en remarque et tu charges dans ton Nano.
Au redémarrage de l'Arduino ou après un reset dans le fenêtre moniteur tu dois voirs les registres du module RF24 ainsi (pas forcément les mêmes valeurs)
Si ne programme ne "voit" pas le module RF24

STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xe7e7e7e7e7 0xf0f0f0f0d2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xe7e7e7e7e7
RX_PW_P0-6 = 0x00 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x4c
RF_SETUP = 0x07
CONFIG = 0x0f
DYNPD/FEATURE = 0x00 0x00
Data Rate = 1MBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_HIGH

Si ne programme ne "voit" pas le module RF24

STATUS = 0xff RX_DR=1 TX_DS=1 MAX_RT=1 RX_P_NO=7 TX_FULL=1
RX_ADDR_P0-1 = 0xffffffff7f 0xffffffffff
RX_ADDR_P2-5 = 0x7f 0xff 0x7f 0xff
TX_ADDR = 0xffffffffff
RX_PW_P0-6 = 0xff 0x7f 0xff 0x7f 0xff 0x7f
EN_AA = 0xff
EN_RXADDR = 0xff
RF_CH = 0xff
RF_SETUP = 0xff
CONFIG = 0x7f
DYNPD/FEATURE = 0x7f 0xff
Data Rate = 1MBPS
Model = nRF24L01
CRC Length = 16 bits
PA Power = PA_HIGH

Où il y a 0xFF ou 0x7f j'ai parfois vu 0x00

A essayer.

Bonne soirée
jpbbricole
 
C

cedreatlas

Ouvrier
salut jpbbricole
désolé, je ne comprends rien de rien
cordialement
Ph
 
J

jpbbricole

Compagnon
Sites moi les termes que tu ne comprends pas.

Cordialement
Jpbbricole
 
C

cedreatlas

Ouvrier
Dans l'IDE Arduino, tu charges Fichier/Exemples/RF24-master/GettingStarted
tu mets toutes les lignes de la void loop(void), en remarque et tu charges dans ton Nano.
Au redémarrage de l'Arduino ou après un reset dans le fenêtre moniteur tu dois voirs les registres du module RF24 ainsi (pas forcément les mêmes valeurs)
Et en plus j'ai du courcircuiter la nano, elle s'allume très faiblement.. j'en ai racheté 2 autres il y a quelques jours au cas ou..

Quand je l'aurais , je vais tout revoir pas à pas avec les quelques pages de conseils précédentes..
 
J

jpbbricole

Compagnon
Salut @cedreatlas
Je suis, actuellement, en vacances à St. Petersbourg, pour 8 jours, c'est moins facile pour faire un topo détaillé, alors, au retour, je te fais ça.

Cordialement
jpbbricole
 

Sujets similaires

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