Show Posts
Pages: 1 ... 41 42 [43] 44 45 ... 93
631  International / Français / Re: [Automatisme] Portail et arduino on: September 25, 2013, 07:23:42 am
La solution d'artouste est très pertinente. En effet, tu vas déballer 600€, donc mieux vaut partir sur des bases qui marchent toutes seules, plutôt que de regretter d'avoir acheté des moteurs que tu n'arrives pas à commander, découragements, prises de tête... enfin on connaît.

les PC télécommandées sont à base d'un relais, donc top pour ce que tu veux faire. avec en plus selon les modèles, un chip qui propose plusieurs sorties mais dont une seule est utilisée, hack facile et prometteur...
632  International / Français / Re: Comment incrémenter ceci 0x0100 on: September 25, 2013, 05:11:52 am
Une façon d'optimiser ta mémoire, ça ne change en rien le reste du code...

Code:
#define SIZE_COU 15  // taille de cou[]
#define SIZE_LON 15  // taille de lon[]
#define SIZE_LAT 15  // taille de lat[]
#define SIZE_ALT 15  // taille de alt[]
#define SIZE_TIM 14  // taille de time[]
#define SIZE_VEL 6  // taille de vel[]
#define SIZE_STA 2  // taille de sta[]

char cou[SIZE_COU];
char lon[SIZE_LON];
char lat[SIZE_LAT];
char alt[SIZE_ALT];
char time[SIZE_TIM];
char vel[SIZE_VEL];
char sta[SIZE_STA];

// 24LC236
#define EPROM_COU 0x0000  // autant commencer au début de la mémoire...
#define EPROM_LON EPROM_COU+SIZE_COU // 15 octets plus loin (taille de cou[15] enregistré précédemment)
#define EPROM_LAT EPROM_LON+SIZE_LON // même raisonnement pour les adresses suivantes
#define EPROM_ALT  EPROM_LAT+SIZE_LAT // ...
#define EPROM_TIM EPROM_ALT+SIZE_ALT //
#define EPROM_VEL EPROM_TIM+SIZE_TIM //
#define EPROM_STA EPROM_VEL+SIZE_VEL  //

#define EPROM_INC EPROM_STA+SIZE_STA  // Incrementation de façon à ce que le prochain enregistrement se fasse directement à la suite
unsigned int mask=0x0000;
const byte rom = 0x50;    // Address of 24LC256 eeprom chip


Maintenant, un enregistrement n'occupera plus que 80 octets au lieu des 256 avant (soit 409 enregistrements possibles au lieu de 128, soit 6h50' environ). L'avantage de ce genre de déclaration, c'est que si à un moment tu changes la taille d'un enregistrement (par exemple cou[15] devient cou[6], il te suffit de ne changer que la première ligne par

Code:
#define SIZE_COU 6  // taille de cou[]
et tout ton code suivra (par contre, ce genre de modif rend tout ce qu'il y avait avant dans l'EPROM inutilisable, mais il te suffira de refaire un enregistrement pour réécraser le tout...). ça réorganisera totalement l'adressage en ROM de façon à toujours utiliser au mieux ta mémoire (dans cet exemple de passer cou à 6, tu passerais à 461 enregistrements...)

Autre idée, pour l'indexation dans get_gps(), tu devrais déclarer une variable genre word index_EPROM = 0; et réécrire ces codes :

Code:
       writeEEPROM(rom,(EPROM_INC*index_EPROM)+EPROM_STA,sta); // No worries about the value of sta, it's work, it not my worries

       index_EPROM++;  // incrément de l'index
Ton premier enregistrement se fera pour index_EPROM = 0, le suivant pour index_EPROM = 1 etc etc...

Niveau lecture, pareil, pour récupérer par exemple time sur le 9ième enregistrement, il suffira de faire

Code:
  // le premier enregistrement étant à 0, le 9ième se trouve à 8, logique...
  readEPROM(rom, (EPROM_INC*8)+EPROM_TIM, time);   // enfin selon comment tu gères ta lecture de l'EPROM...

si ça peut t'aider...

PS : encore un bonus :
Après la ligne #define EPROM_INC, mets ça :
Code:
#define EPROM_SIZE 32768  // taille de l'EPROM en octets
const word EPROM_MAX = (EPROM_SIZE/EPROM_INC)-1;  // limite du nombre d'enregistrements
EPROM_MAX contient précisément le dernier index possible pour les enregistrements (et toujours en phase avec la taille de tes variables, donc si index_EPROM > EPROM_MAX, c'est que la mémoire est pleine.
633  International / Français / Re: Upgrade Arduino à distance on: September 25, 2013, 04:06:55 am
Oui, c'est sûrement possible... il faudrait juste modifier le booltoader, qu'il puisse aller regarder sur la carte SD s'il y a un fichier de maj, et si oui, alors copier ce fichier dans la flash. Mais bon courage, car ça va pas être facile.

Via les prog_mem, on peut écrire dans la flash, donc si tu as accès à un fichier hex, alors tu peux facilement copier le code, mais en sachant exactement où tu es, car si tu écris directement sur ton code, peut-être que ça va planter...

débutant s'abstenir...
634  International / Français / Re: Bogue avec la bibliothèque Servo, comment corriger ce problème ??? on: September 25, 2013, 04:01:33 am
Par contre, il doit y avoir un câblage particulier du 298, car il faut jouer avec trois entrées pour contrôler un moteur. le schéma page 6 te conviendrait, mais ils se sont gourés dans leur petit tableau de fonctionnement...


et encore, je ne suis pas trop sûr, mais si tu as une doc pour ton circuit complet, ça devrait être indiqué dessus.
Et vu la complexité du truc, tes soucis de marche / arrêt viennent sûrement du câblage...

Concernant les autres questions...

Non, je n'ai pas fait de lib LCD, mais c'est en cours...

ATTENTION A TON BRANCHEMENT!!!! ARDUIBO_VIN             : LCD_1_J7_1, (+5V) vin = 9V dans ton cas! il vaut mieux alimenter ton LCD à partir de la pin +5V...


635  International / Français / Re: Bogue avec la bibliothèque Servo, comment corriger ce problème ??? on: September 25, 2013, 03:32:05 am
Que de réponses et questions...

Pour faire de la PWM avec la mega, dans ton cas, deux solutions :

1 : utiliser notre code servo.
 avec en bonus, une troisième PWM dispo puisque le timer est configuré...
Code:
// initialisation
  timersReset();  // important, car sans ça, il est possible que ça ne marche pas...
  servoInit(N1, 127, false);  // F = 7,8KHz
  servoInit(N2, 127, false);  // N1 et N2 sur le même timer bien sûr!

// (...)

  servoN1 = val1;  // 1 < val1 < 254
  servoN2 = val2;  // 1 < val2 < 254

2 : utiliser le timer 2 (qui n'a que 2 PWM possible en 8 bits)
  entièrement compatible avec le code servo : ça utilise un timer libre... mais attention, car beaucoup de libs utilisent le timer2, et là, c'est le drame!...
Code:
#define pwm9 OCR2B   // accès registre pwm timer2
#define pwm10 OCR2A  // accès registre pwm timer2

void pwmTimer2Init(byte prescaler){
// prescaler = 1 à 7 (Fpwm = [1 => 62,5KHz; 2 => 7,8KHz; 3 => 2KHz; 4 => 1KHz; 5 => 488Hz; 6 => 244Hz; 7 => 61Hz])
  cli();
  DDRH |= 0x40;  // pin9 en sortie
  PORTH &= 0xBF;  // pin9 = 0
  DDRB |= 0x10;  // pin10 en sortie
  PORTB &= 0xEF;  // pin10 = 0
  TIMSK2 = 0x00;
  ASSR &= 0xBF;  // désactiver timer ext_clk.
  TCCR2A = 0x03;
  TCCR2B = prescaler;  // mode WGM2 = 3 = fast PWM 8 bits, CS2 = prescaler.
  sei();
}

void pwm2Set(byte pin, byte value){  // pin = 9 ou 10, 0 < value < 255
  if (value < 2) {  // sortie = 0
    if (pin == 9) {
      TCCR2A &= 0xCF;
      PORTH &= 0xBF;  // pin9 = 0
    } else if (pin == 10) {
      TCCR2A &= 0x3F;
      PORTB &= 0xEF;  // pin10 = 0
    }
  } else {                   // sortie = PWM
    if (pin == 9) {
      TCCR2A |= 0x20;  // activer OC2B sur pin 9
      pwm9 = value;
    } else if (pin == 10) {
      TCCR2A |= 0x80;  // activer OC2A sur pin 10
      pwm10 = value;
    }
  }
}

void setup(){
  pwmTimer2Init(2);  // initialiser la PWM à 7,8KHz sur pins 9 et 10
}

void loop(){
  pwm2Set (9, 127); // pwm 50% sur pin 9
  pwm2Set (10, 64); // pwm 25% sur pin 10

// on peut aussi accéder directement aux valeurs pwm9 et pwm10 :
  pwm9 = 127; // pwm 50% sur pin 9
  pwm10 = 64; // pwm 25% sur pin 10
// mais dans le cas où la valeur est inférieure à 2, c'est plus compliqué, mieux vaut passer par pwm2Set
}

Tu vas me demander pourquoi j'ai pris le temps de faire ce code? simplement car j'en ai besoin moi aussi... je n'ai pas testé, mais pas de raison que ça ne marche pas!
636  International / Français / Re: Bogue avec la bibliothèque Servo, comment corriger ce problème ??? on: September 24, 2013, 03:09:59 pm
Alors oui!

J'imagine que tu y mets du coeur et un max d'énergie, c'est tout bon! Je ne rejette rien, c'est juste que je n'ai pas beaucoup de temps, et que je ne peux pas me mettre en mode debugg sur des codes qui ne correspondent pas à ma façon de faire (j'ai déjà du mal pour moi-même...).

Peut-être une idée : tu définis des long là où on attend des word. de plus, je ne comprends pas tes valeurs min et max. si le max est 254, un byte suffit. pour faire de la PWM, il faut envoyer une valeur entre 1 (min) et ICRn (max, n = numéro du timer). là, tu auras une vraie PWM à la fréquence 1/T.

je ne sais pas comment tu as câblé des moteurs, mais est-ce que la fréquence est compatible avec tes drivers? (si T = 17500, F = 57,14Hz). tu peux essayer avec T = 255 (F = 3,9KHz), ça te fera une belle PWM sur 8 bits.

tu n'as pas un oscillo sous la main? c'est très pratique pour vérifier que tes signaux sont conformes à ta prog et pouvoir incriminer l'électronique qui suit...

ATTENTION : liquidChristal n'est pas mieux que la lib servo...
637  International / Français / Re: [arduino] PWM, harmonique et afficheur LCD. une histoire de compatibilité on: September 24, 2013, 11:53:49 am
Pour utiliser un tableau 8 fois plus petit :

Code:
byte tableau[125];

boolean lit_tableau(word index){
  return (tableau[index >> 3] & (1 << (index % 8)));
}

void ecrit_tableau(word index, boolean valeur){
  if (valeur) {
    tableau[index>>3] |= (1 << (index % 8)) ;
  } else { 
    tableau[index>>3] &= ~(1 << (index % 8)) ;
  }
}

Il doit y avoir plus rapide, mais c'est une idée.
638  International / Français / Re: calcule deux mosfet on: September 24, 2013, 06:36:11 am
Non 1 metre de led par mosfet

tu as la doc de ton ruban? car ça ressemble à de la petite led, genre 25mA par groupe de 3 leds, et dans les 60 led/m, donc 500mA/m (6W/m). avec un mosfet de 20A, tu peux donc gérer 40m de ruban... mais bon, c'est le ruban qui va pas aimer, et c'est plutôt lui qui demande à être coupé par tranches d'1m, ses pistes doivent être limitées à 500mA. Mais rien ne t'interdit de mettre tes mètres de ruban en //...

EDIT : avec deux résistances de 150 pour 3 leds, en effet, on arriverait à 20mA par branche...
639  International / Français / Re: Bogue avec la bibliothèque Servo, comment corriger ce problème ??? on: September 24, 2013, 05:36:14 am
un #define n'est pas une instruction, mais une déclaration de compilation, donc il n'a rien à faire dans le case 9:

Ensuite, tout l'interrêt du .h est de déclarer les fonctions avant leurs defs. Du coup, avant de passer au .cpp, le compilateur sait qu'il existe une telle fonction, et ira la chercher dans le .cpp

J'ai bien peur qu'en voulant réécrire un code qui marchait tu n'aies mis des loups un peu partout...

Quote
Mais comment cela fonction dans la fonction loop (), si « servo9 = 2222; », alors la valeur « OCR1A » devrait être remplacée par « 2222 », mais au lieu de cela, c'est la valeur « 2222 » qui est écrite dans le registre « OCR1A » ?!?
Et c'est exactement ce que ça doit faire.

Attention à ne pas mélanger le PHP et le C!!!! s'ils se ressemblent, ils ne fonctionnent pas du tout pareil. le PHP est interprété, le C est compilé... dans le C, toutes tes variables sont remplacées par des adresses mémoire, leurs noms n'existent plus dans la flash...
640  International / Français / Re: [arduino] PWM, harmonique et afficheur LCD. une histoire de compatibilité on: September 24, 2013, 05:21:14 am
Pour ton tableau de boolean, tu peux regrouper 8 bool dans un octet, il deviendra donc

byte Tab_Sens[125];  //tableau de mesure de sens  --> première optimisation... 125 octets au lieu de 1000.

Ensuite, pour Tab_Mes[] qui prend déjà 2000 octets, as-tu vraiment besoin d'int? est-ce que des valeurs sur 8 bits ne te suffiraient pas?

Je ne saisis pas trop pourquoi tu fais des tableaux à deux dimensions, car la seconde dimension est inutile (n'a qu'une valeur possible...)


Sinon, j'ai trouvé ce qui cloche.

Tu as mis une capa directement sur la pin 10, et tu utilises le régulateur de la carte pour alimenter ton système, donc quand tu mets la pin 10 à 1, ça fait un balaise d'appel de courant, le régulateur s'écrase, et tu fais tomber ton alim suffisamment pour faire des choses zarbis.

Pareil pour ton potar entre les pins 3 et 5 et la masse, c'est pas du tout une bonne idée si ces pins sont des sorties...

Je pense que tu as fais une erreur de schéma, car ton LCD ne peut pas marcher branché comme ça (et je ne vois pas de 5V arriver dessus...)
641  International / Français / Re: [RESOLU] besoin d'aide des physicos-musiciens on: September 23, 2013, 07:20:04 pm
le temps d'intégrer une "table de mixage", et je vous donne tout...
642  International / Français / Re: Bogue avec la bibliothèque Servo, comment corriger ce problème ??? on: September 23, 2013, 07:16:33 pm
Là, tu m'en demandes beaucoup... J'ai déjà du boulot avec mes codes, alors les codes des autres, c'est une toute autre histoire (en plus, chacun a sa façon d'écrire, et ça demande un certain temps à comprendre).

Tu devrais repartir à 0, en incluant les choses une par une, dès que ça bug, c'est le dernier truc que tu as rajouté qui déconne. c'est le meilleur moyen d'avancer... Une fois que toutes tes fonctions marchent, le loop() est un jeu d'enfant!
643  International / Français / Re: calcule deux mosfet on: September 23, 2013, 07:04:58 pm
pourquoi 2 mosfet? parce que tu as 1m de fil? mets du gros fil et un petit mosfet...

ton ruban s'alimente en 12V et ne consomme rien du tout.
644  International / Français / Re: [arduino] PWM, harmonique et afficheur LCD. une histoire de compatibilité on: September 23, 2013, 07:01:50 pm
dans mode_manu() :

Code:
analogWrite(Var,val/4);

est-ce que justement  tu n'écris pas sur une pin du LCD?

sinon, tu n'optimises pas trop tes variables. Tu n'es pas sur un PC, tu m'as pas 2Go de RAM + 10Go d'échange... à mon avis, il y a peut-être un pb de ce côté-là, à voir...

L'autre cause de ton souci : comment alimentes-tu ton montage? (papier crayon photo!)
645  International / Français / Re: 4 servos, 4 boutons, une carte arduino uno R3 on: September 23, 2013, 05:25:39 am
et hop, un 20/20!  smiley-zipper
Pages: 1 ... 41 42 [43] 44 45 ... 93