Aller au contenu


Photo
* * * * * 2 note(s)

Passer d'Arduino à Raspberry

arduino programmation ram s ram LED bouton leonardo PROGMEM flash char

34 réponses à ce sujet

#1 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 11 juin 2016 - 12:27

Bonjour,

 

Je ne sais pas si c’est le bon endroit, mais peut être que dans votre groupe vous connaissez quelqu’un qui puisse m’aider !

 

Je suis étudiante en Design Graphique et pour un projet de fin d’année j’ai voulu faire une installation interactive.

L’arduino semblait la bonne alternative car assez répandu, pas cher et facile d’accès !

 

Mon projet est un tableau de 2m de hauteur/ 45cm de large composé de 16/3 cases carrés dans lesquelles j’ai inséré des leds "12mm WS2801 pixel » .Les LED réagissent à 5 boutons. Ces 5 boutons correspondent à des suites de changement de lumières (RGB). 

 

En commençant à coder je me suis rendu compte d’un énorme problème. Pour chaque bouton il faut environ 20 changement de lumières. Ce qui fait 100 variations au total. Ces suites (9K) sont trop lourde et la RAM de mon arduino Leonardo n’est pas suffisante.

 

Je cherche quelqu’un qui puisse retranscrire mon travail sur un appareil plus puissant. Raspberry ?

 

Vous pouvez me contacter pour parler rémunération.

 

Ça sauverai mon projet, dans lequel j’ai dépensé beaucoup de temps et d’énergie…

 

Merci,

 

Romane Pineill

Image(s) jointe(s)

  • IMG_7241.JPG


#2 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 148 messages
  • Gender:Male
  • Location:Autriche

Posté 11 juin 2016 - 01:12

Bonjour Romane,

un petit passage par la case présentation est l'usage par ici :)

Quelques questions :
- tes LEDs sont commandées en ON/OFF ou tu règles un niveau de luminosité ?
- Comment codes-tu tes séquences ?
- Quel type de variables utilises-tu ? Je n'ai pas fait le calcul, mais ça me semble bizarre qu'autant de mémoire soit utilisé. As-tu utilisé les directives préprocesseurs (#define) pour éviter de déclarer des variables ?
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#3 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 020 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 11 juin 2016 - 02:31

En effet, comme le dit R1D1, il est possible qu'uniquement des optimisation de programmation soient suffisant pour sauver ton projet ...
Tu peux poster ton code ici si tu veux qu'on y jette un oeil =)
 

De plus tu utilises quel arduino ? Un petit upgrade genre arduino uno => arduino zero  ou arduino méga => arduino due peut aussi pas mal changer la donne ...


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#4 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 11 juin 2016 - 03:18

Merci pour vos réponses rapides ! 
 
Mes Leds fonctionnent uniquement en variation RGB, je contrôle donc uniquement leur activation en rouge, vert ou bleu.
 
J'avais travaillé avec une personne qui m'avait codé le logiciel de telle façon à ce que je n'ai qu'à changer les couleurs de LED et indiquer le nombre de frame par bouton.
 
J'utilise un Arduino Leonardo. Le problème est que quand je vérifie le code, il me met le message d'erreur suivant : 
 
Le croquis utilise 16 424 octets (57%) de l'espace de stockage de programmes. Le maximum est de 28 672 octets.
Les variables globales utilisent 8 739 octets (341%) de mémoire dynamique, ce qui laisse -6 179 octets pour les variables locales. Le maximum est de 2 560 octets.
 
 
Alors j'ai vu que l'Arduino DUE a les même spécificités que mon arduino Leonardo tout en étant plus puissant, ça aurait été LA bonne solution, mais mes LEDS fonctionnent en 5v.
Peut être qu'il est possible de les brancher indépendamment de l'arduino, sur une alimentation externe..?
 
Voici le code :
 
#define BUTTON1 A0
#define BUTTON2 A1
#define BUTTON3 A2
#define BUTTON4 A3
#define BUTTON5 A4

#define LED1 11
#define LED2 10
#define LED3 9
#define LED4 5
#define LED5 6

#define arr_len( x )  ( sizeof( x ) / sizeof( *x ) )

int laststate=0;
int runtimestate=1;

uint8_t dataPin  = 3;    // Yellow wire on Adafruit Pixels
uint8_t clockPin = 2;    // Green wire on Adafruit Pixels
Adafruit_WS2801 strip = Adafruit_WS2801(50, dataPin, clockPin);

void setup() {

  strip.begin();

  // Update LED contents, to start they are all 'off'
  strip.show();

  //BUTTONS
  pinMode(BUTTON1,INPUT_PULLUP);  
  pinMode(BUTTON2,INPUT_PULLUP);  
  pinMode(BUTTON3,INPUT_PULLUP);  
  pinMode(BUTTON4,INPUT_PULLUP);  
  pinMode(BUTTON5,INPUT_PULLUP);    
  
  // LEDS
  pinMode(LED1,OUTPUT);
  pinMode(LED2,OUTPUT);
  pinMode(LED3,OUTPUT);  
  pinMode(LED4,OUTPUT);
  pinMode(LED5,OUTPUT);

}

void loop() {

  checkButton();     
  showanim();
  
  if(runtimestate==1) fadeLed(LED1);
  if(runtimestate==2) fadeLed(LED2);
  if(runtimestate==3) fadeLed(LED3);
  if(runtimestate==4) fadeLed(LED4);
  if(runtimestate==5) fadeLed(LED5);  
}

void showanim()
{
 // run once 
 if(runtimestate == laststate) return;  
 laststate= runtimestate;
  
 switch(runtimestate) 
 {
  case 1:
   drawAnimation(anim1,anim1_frame_counter);
  break;
  
  case 2:
   drawAnimation(anim2,anim2_frame_counter);
  break;  
  case 3:
   drawAnimation(anim3,anim3_frame_counter);
  break;
  case 4:
   drawAnimation(anim4,anim4_frame_counter);
  break;
  case 5:
   drawAnimation(anim5,anim5_frame_counter);
  break;
  
 }  
  
}

void drawAnimation(int anim[][50], int framecount)
{
 Serial.print("showing animation FRAMES:");
 Serial.println(framecount); 

 for(int i=0;i<framecount;i++)
 {
  //display frame
  for(int x=0;x<50;x++)
  {
    uint32_t c = Color(0,0,0);
    if(anim[i][x]=='r') c = Color(255,0,0);    
    if(anim[i][x]=='g') c = Color(0,255,0);
    if(anim[i][x]=='b') c = Color(0,0,255); 
    
    strip.setPixelColor(x, c);   
  }
  strip.show();
  
  // delay
  delay(animationspeed);

} 

  
}

/* Helper functions */

// Create a 24 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte 
{
  uint32_t c;
  c = r;
  c <<= 8;
  c |= g;
  c <<= 8;
  c |= b;
  return c;
}

void fadeLed(int led)
{
  
ledsoff();

for(int i=0;i<255;i++)
{
    analogWrite(led,i);
    if(bd(2)) return;
}

if(bd(100)) return;


for(int i=255;i>0;i--)
{
   analogWrite(led,i);
   if(bd(2)) return;
}

}

void ledsoff()
{
 analogWrite(LED1,0);
 analogWrite(LED2,0);
 analogWrite(LED3,0);
 analogWrite(LED4,0);
 analogWrite(LED5,0); 
  
}

int checkButton()
{
  
if(!digitalRead(BUTTON1)){ runtimestate=1;    ledsoff(); analogWrite(LED1,255); return 1;}
if(!digitalRead(BUTTON2)){ runtimestate=2;    ledsoff(); analogWrite(LED2,255);return 1;}
if(!digitalRead(BUTTON3)){ runtimestate=3;    ledsoff(); analogWrite(LED3,255);return 1;}
if(!digitalRead(BUTTON4)){ runtimestate=4;    ledsoff();  analogWrite(LED4,255);return 1;}
if(!digitalRead(BUTTON5)){ runtimestate=5;    ledsoff(); analogWrite(LED5,255);return 1;}

 return 0;
}

int bd(int wait)
{


 for(int i =0; i<wait;i++)
 {
   if(checkButton()) return 1;
   delay(1); 
 }  


 return 0 ;
}
Et chaque bouton est codé de cette manière : 


#include "Adafruit_WS2801.h"
#include "SPI.h" // Comment out this line if using Trinket or Gemma

// milliseconds - defines how long each frame is displayed
int animationspeed=800;

// defines how many frames anim1 consists of
int anim1_frame_counter=17;

int anim1[][50]= {


  // frame #1 
  {
  
     'b','b','g','r','r','r','g','g','r','g','r','r','r','g','g','r','r',
     'r','r','r','g','r','g','r','r','r','r','g','r','r','b','b','b','b',
     'b','b','b','g','r','g','g','r','g','r','g','r','g','r','g','r',


  }, 
  {
     'b','b','b','r','r','r','g','g','r','g','r','r','r','g','g','r','r',
'r','r','r','r','g','r','r','r','r','g','r','r','r','b','b','b','b',
'b','b','b','g','r','g','g','r','g','r','g','r','g','g','r','r',


  }, 
  {
     'b','b','b','r','r','r','g','g','r','g','r','r','r','g','g','r','r',
'r','r','r','r','g','r','r','r','r','g','r','r','r','b','b','b','b',
'b','b','b','b','r','g','g','r','g','r','g','r','g','g','r','r',


  }, 
  {
     'b','b','b','r','r','r','g','g','r','g','r','r','r','g','g','r','r',
'r','r','r','r','g','r','r','r','r','g','r','r','b','b','b','b','b',
'b','b','b','b','r','g','g','r','g','r','g','r','g','g','r','r',


  },   
  {
     'b','b','b','r','r','r','g','g','r','g','r','r','r','g','g','r','r',
'r','r','r','r','g','r','r','r','r','g','r','r','b','b','b','b','b',
'b','b','b','b','r','g','g','r','g','r','g','r','g','g','r','r',


  },
  {
     'b','b','b','r','r','r','g','g','r','g','r','r','r','g','g','r','r',
'r','r','r','r','g','r','r','r','r','g','r','r','b','b','b','b','b',
'b','b','b','b','r','g','g','r','g','r','g','r','g','g','r','r',


  },
  {
    
    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','r','r','r',
'r','r','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','r','r',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','r','r','r',
'r','r','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','r','r',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','r','r','r',
'r','r','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','r','r',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','g','g','g',
'g','g','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','g','g',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','r','r','r',
'r','r','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','r','r',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','g','g','g',
'g','g','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','g','g',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','r','r','r',
'r','r','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','r','r',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','g','g','g',
'g','g','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','g','g',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','r','r','r',
'r','r','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','r','r',


  },
  {


    'b','b','b','b','b','r','r','r','g','g','r','g','r','r','g','g','g',
'g','g','r','r','r','r','r','r','g','r','r','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','r','g','r','g','r','g','g','g',


  },
  {


    'b','b','b','b','b','g','r','r','r','g','r','g','r','g','r','g','r',
'r','r','g','r','r','r','r','g','r','r','g','b','b','b','b','b','b',
'b','b','b','b','b','r','g','g','g','r','g','r','g','r','g','g',


  }
};


 
 
Je vous joint des captures d'écran du code, car présenté comme ça c'est peut être un peu fastidieux...
 
Merci beaucoup !

Image(s) jointe(s)

  • Capture d’écran 2016-06-11 à 16.15.49.png
  • Capture d’écran 2016-06-11 à 16.16.04.png
  • Capture d’écran 2016-06-11 à 16.16.20.png
  • Capture d’écran 2016-06-11 à 16.16.33.png
  • Capture d’écran 2016-06-11 à 16.16.44.png
  • Capture d’écran 2016-06-11 à 16.16.54.png
  • Capture d’écran 2016-06-11 à 16.17.03.png


#5 Leon

Leon

    Membre passionné

  • Membres
  • PipPipPipPipPip
  • 1 289 messages
  • Gender:Male

Posté 11 juin 2016 - 04:04

Bonjour, je n'y connais rien en Arduino, mais je programme des microcontrôleurs depuis un bon bout de temps.

 

Plusieurs optimisations te feront gagner ENORMEMENT de place:

 

1) si tu n'as que 4 états par LED (R, G, B, éteint), alors tu peux coder ça sur 2 bits. Donc 4 LEDs par octet définissant tes motifs. Tu gagnes un facteur 4!

 

2) Tes motifs/séquences qui prennent de la place peuvent être stockés en Flash plutôt qu'en RAM. Une variable sera forcément en RAM, donc il ne faut surtout pas déclarer tes motifs/séquences en variable. Ton Arduino a 2,5ko de RAM et 32ko de Flash. Donc même si ton programme consomme 10ko de Flash, et le boot 4ko, il te restera 18ko de flash, soit 72 000 pixels (4 pixels par octet, optimisation n°1)

Je ne sais absolument pas comment on fait pour un Arduino, mais c'est forcément faisable. Peut-être avec des tableaux  "constants".

 

3) Si ça ne rentre toujours pas, alors tu peux stocker tes séquences dans une mémoire externe genre mémoire Flash I2C ou SPI. Tu peux facilement rajouter plusieurs Mo.

 

Leon.


BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)


#6 R1D1

R1D1

    Modérateur et Membre passionné

  • Modérateur
  • PipPipPipPipPip
  • 1 148 messages
  • Gender:Male
  • Location:Autriche

Posté 11 juin 2016 - 05:12

J'ai modifié ton message pour enlever quelques espaces.

Dans ton code, tu définis chaque frame de ton animation. Une solution consiste à considérer non pas les animations par frame mais par case de ton tableau : du coup, en codant comme "r4" le fait de mettre une led à rouge pendant 4 frames, tu gagnes un peu sur la longueur de tes séquences. C'est un peu moins pratique à coder mais ça permet de gagner un peu de place. D'allleurs, il faudrait plutôt dire '21r4' pour "led 21 rouge pendant 4 frames".
Du coup, tes animations ne comportent que les LEDS qui changent plutôt que tout le tableau.
Il faut maintenir en conséquence un tableau de 16 * 3 pour l'état actuel 'r,g,b,off' et un autre pour la durée avec un type suffisant pour la durée maximale d'allumage d'une led dans une anim (1 byte = 1 octet = 255 frames, donc tu as de la marge).
Plutôt qu'un int, utilise des "char"/"byte" quand tu le peux, ils sont plus petits (1 octet contre 4 dans l'implémentation de l'int, de mémoire).

EDIT : grillé par Léon :)
R1D1 - Calculo Sed Ergo Sum -- en ce moment, M.A.R.C.E.L.
Avatar tiré du site bottlebot

#7 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 11 juin 2016 - 07:29

Du coup en modifiant le code comme R1D1 le dis, la mémoire sera suffisante sur mon arduino Leonardo ? La solution parait judicieuse mais j'ai quand même beaucoup de LEDs qui changent de couleur donc à voir..

 

Je n'ai pas les connaissances pour modifier le code seule... La personne avec qui je travaillais avait fait en sorte que ce soit facile pour moi, malheureusement elle est partie en vacances et ne peut plus m'aider sur ce projet.

 

Est-il possible de rencontrer quelqu'un pour me montrer comment faire la modification ? Et voir quelles autres alternatives il y a si cette option ne marche pas.



#8 Leon

Leon

    Membre passionné

  • Membres
  • PipPipPipPipPip
  • 1 289 messages
  • Gender:Male

Posté 11 juin 2016 - 07:44

Même en ne prenant que l'optimisation numéro 2 que je propose, ça rentre allègrement dans les 32ko de Flash de ton Arduino.

 

Leon.


BOB4, mon drone hélicoptère autonome d'intérieur http://heli.bot.free.fr/
BOB3, mon robot autonome d'intérieur avec WiFi + Foxboard Linux http://ze.bot.free.fr/
BOB5, robot bipède simulé, puis tentative de réalisation (fail)


#9 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 11 juin 2016 - 07:48

Ok merci beaucoup, si j'arrive à rencontrer quelqu'un je lui exposerai cette solution également.



#10 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 13 juin 2016 - 04:17

Bonjour la modification peut être faite relativement facilement, et donc seule :)

 

La première chose à faire est de modifier chaque animation de "bouton" (ou chaque occurence si c'est dans un seul fichier)

tu passes le 

int anim1[][50]= {

par 

char anim1[ ][50]= {

et de la même façon (puisque cette méthode utilise tes animations)

void drawAnimation(int anim[][50], int framecount)

par

void drawAnimation(char anim[][50], int framecount) 

avec cette modification, tes tableaux prendrons déjà 2 fois moins de place.

 

 

 

 

 

Si à la compilation ça te dit encore que tu as un manque de place alors il va falloir modifier un peu plus mais toujours très simple:

tu remplaces:

char anim1[][50]= {

qu'on a modifié au dessus par 

PROGMEM prog_char anim1[][50]= {

toujours pour chaque animation de "bouton" et il faut rajouter au tout début du fichier ou tu as rajouté les PROGMEM, la ligne

#include <avr/pgmspace.h>

et dernière modification, tu remplaces dans drawAnimation

void drawAnimation(char anim[][50], int framecount)
{
 Serial.print("showing animation FRAMES:");
 Serial.println(framecount); 

 for(int i=0;i<framecount;i++)
 {
  //display frame
  for(int x=0;x<50;x++)
  {
    uint32_t c = Color(0,0,0);
    if(anim[i][x]=='r') c = Color(255,0,0);    
    if(anim[i][x]=='g') c = Color(0,255,0);
    if(anim[i][x]=='b') c = Color(0,0,255); 
    

par

void drawAnimation(prog_char anim[][50], int framecount)
{
 Serial.print("showing animation FRAMES:");
 Serial.println(framecount); 

 for(int i=0;i<framecount;i++)
 {
  //display frame
  for(int x=0;x<50;x++)
  {
    uint32_t c = Color(0,0,0);
    if(pgm_read_byte_near(anim[i][x])=='r') c = Color(255,0,0);    
    if(pgm_read_byte_near(anim[i][x])=='g') c = Color(0,255,0);
    if(pgm_read_byte_near(anim[i][x])=='b') c = Color(0,0,255); 

et normalement (sauf si les tableaux d'animatons sont utilisées ailleurs mais j'ai vu que ça dans le code fourni), avec cette deuxième modification, tes tableau seront en mémoire flash et plus en RAM.

 

Par contre tu risques de perdre un peu de vitesse d'accès à ces animations.



#11 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 14 juin 2016 - 12:59

Wow ! Je sais pas comment te remercier d'avoir pris le temps de m'écrire ça !!

J'ai essayé la première solution, la vérification du code se passe bien, mais effectivement c'est toujours pas suffisant pour la mémoire.

 

J'ai changé le code comme tu me l'a montré dans la deuxième solution, en revanche là, lors de la vérification j'ai le message d'erreur suivant : 

 

klima_change_flash:17: error: 'prog_char' does not name a type
 PROGMEM prog_char anim1[][50]= {
         ^
klima_change_flash:34: error: 'prog_char' does not name a type
 PROGMEM prog_char anim2[][50]= {
         ^
klima_change_flash:161: error: 'prog_char' does not name a type
 PROGMEM prog_char anim3[][50]= {
         ^
klima_change_flash:299: error: 'prog_char' does not name a type
 PROGMEM prog_char anim4[][50]= {
         ^
klima_change_flash:500: error: 'prog_char' does not name a type
 PROGMEM prog_char anim5[][50]= {
         ^
klima_change_flash:734: error: variable or field 'drawAnimation' declared void
 void drawAnimation(prog_char anim[][50], int framecount)
                    ^
klima_change_flash:734: error: 'prog_char' was not declared in this scope
klima_change_flash:734: error: expected primary-expression before 'int'
 void drawAnimation(prog_char anim[][50], int framecount)
                                          ^
/Users/romanepineill1/Penninghen/ARDUINO/klima_change_flash/klima_change_flash.ino: In function 'void showanim()':
klima_change_flash:710: error: 'anim1' was not declared in this scope
    drawAnimation(anim1,anim1_frame_counter);
                  ^
klima_change_flash:710: error: 'drawAnimation' was not declared in this scope
    drawAnimation(anim1,anim1_frame_counter);
                                           ^
klima_change_flash:714: error: 'anim2' was not declared in this scope
    drawAnimation(anim2,anim2_frame_counter);
                  ^
klima_change_flash:717: error: 'anim3' was not declared in this scope
    drawAnimation(anim3,anim3_frame_counter);
                  ^
klima_change_flash:720: error: 'anim4' was not declared in this scope
    drawAnimation(anim4,anim4_frame_counter);
                  ^
klima_change_flash:723: error: 'anim5' was not declared in this scope
    drawAnimation(anim5,anim5_frame_counter);
                  ^
/Users/romanepineill1/Penninghen/ARDUINO/klima_change_flash/klima_change_flash.ino: At global scope:
klima_change_flash:734: error: variable or field 'drawAnimation' declared void
 void drawAnimation(prog_char anim[][50], int framecount)
                    ^
klima_change_flash:734: error: 'prog_char' was not declared in this scope
klima_change_flash:734: error: expected primary-expression before 'int'
 void drawAnimation(prog_char anim[][50], int framecount)
                                          ^
exit status 1
'prog_char' does not name a type
 
 
 
Peut-être que j'ai mal fait quelque chose.. ?


#12 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 020 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 14 juin 2016 - 02:30

Essaye plutôt :

const PROGMEM char

au lieu de " PROGMEM prog_char  ... 

Et bien penser à le changer partout et à bien mettre l'include. 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#13 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 14 juin 2016 - 03:54

Merci mike118, j'ai essayé avec ton code, ça a résolu le problème de vérification. Du coup j'ai testé sur les LED...et malheur ça ne marche pas !

Certains boutons acceptent d'allumer 3 Led (sur 50) et d'autre n'en allument carrément aucun... J'ai eu un peu peur alors j'ai chargé mon premier test de code qui est nettement plus léger et tout marche normalement  



#14 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 8 020 messages
  • Gender:Male
  • Location:Anglet
  • Interests:Robotique, Entrepreneuriat, Innovation, Programmation, Résolution de problème, Recherche de solutions, Mécanique, Electronique, Créer, Concevoir

Posté 14 juin 2016 - 04:05

hum ... 

Alors : 

 

0) Peux tu poster tes deux code ici: le plus léger complet et le plus lourd complet ( genre dans un zip )  

1) Peux tu faire les même modifications que plus haut mais dans ton code plus léger et vérifier que ça marche toujours ? 

2) Peux tu ajouter les fonctions de ton code le plus lourd au fur et à mesure dans ton code le plus léger ? Et vérifier à chaque fois que tu ajoutes quelque chose que ça marche comme souhaité ? 

3) Reviens nous voir et nous poser des questions en nous donnant des détails sur les erreurs ou autre chose qui ne marchent pas au fur et à mesure,  1 point par 1 point ;)

 ( en gros ton premier problème était un problème de mémoire, et il est résolu. Maintenant il faut trouver les problèmes suivants ;) .Souvent le problème c'est pas de régler le problème, c'est de le voir et de le comprendre! Une fois que tu as compris le problème, tu cherches comment le solutionner puis comment concrètement mettre en place la solution =) et c'est exactement la démarche qu'on a eu ici tous ensemble pour résoudre ton premier problème. Et puis c'est plus gratifiant d'y arriver par toi même ( avec un peu d'aide ;) ) non ? =) ) 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !

 

Les réalisations de Mike118  

 

 

 


#15 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 14 juin 2016 - 04:22

Oui c'est sûr que le faire seule est plus gratifiant.

Je suis vraiment novice donc le problème semblait très difficile à résoudre pour moi, mais c'est vrai qu'avec l'aide que je reçois c'est toute suite moins effrayant :)

 

Je poste mes deux codes en zip.

 

Je vais ajouter les fonctions à mon code plus léger mais je ne peux pas vraiment faire ça au fur et à mesure. Il est plus léger car il comporte moins de variables, je vais transférer la mémoire RAM en flash et voir si tout fonctionne toujours.

Fichier(s) joint(s)



#16 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 14 juin 2016 - 05:03

J'ai fait la modification de la mémoire sur le projet plus léger. Résultat : les Led sont défaillantes aussi. 

 

Le problème vient donc de la mémoire flash... Est-ce possible que ces led ne fonctionnent qu'en utilisant la RAM ?



#17 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 14 juin 2016 - 09:03

Bien vu Mike, effectivement l'utilisation des prog_xxx sont deprecated, je savais pas :)

(bon faut dire j'ai du utiliser ça sur un arduino ya quelques années :P)

 

Alors pour comprendre le problème, il va falloir un peu de debug, a priori ya pas de raison que les leds ne fonctionne qu'en utilisant la RAM puisque c'est pas du tout lié.

Par contre que quand tu récupères les animations en flash, qqc se passe mal c'est fort probable.

 

J'ai pas d'arduino sous la main donc encore en aveugle, dans la méthode drawAnimation, on va modifier un peu le code pour

  • essayer d'eviter de trop acceder à la flash
  • avoir de l'info en retour sur ce qui se passe.

Donc en gros tu remplaces tout depuis serial.print (le début de la méthode) jusqu'à delay(animationspeed); (fin de la méthode) par:

Serial.print("showing animation FRAMES:");
Serial.println(framecount); 
Serial.print("Suite RGB: ");
 for(int i=0;i<framecount;i++)
 {
  //display frame
  for(int x=0;x<50;x++)
  {
    uint32_t c = Color(0,0,0);
    char canim = pgm_read_byte_near(anim[i][x]);
    Serial.print(c);
    if(canim=='r') c = Color(255,0,0);    
    if(canim=='g') c = Color(0,255,0);
    if(canim=='b') c = Color(0,0,255); 
    Serial.print(" ");
    strip.setPixelColor(x, c);
  }
  Serial.println("\n fin de la suite RGB");
  strip.show();
  
  // delay
  delay(animationspeed);
 
 } 

Si tu charge ce code, normalement pendant l'execution d'une animation, tu devrais voir sur la console:

"Suite RGB: " suivi des r/g/b de l'animation choisie puis "fin de la suite RGB".

 

A mon avis c'est la que ce situe le problème, on ne doit pas récupérer correctement les caractères...

 

Et j'oubliais, je ne sais pas si ça a de l'importance, mais dans la déclaration de drawAnimation, j'enleverai le PROGMEM, juste donc un const char anim[][50]



#18 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 14 juin 2016 - 11:24

Merci cocothebo pour ta réponse. Je viens d'essayer, mais les led se comportent toujours de la même façon. La manip n'a transvasé que 1% de mémoire RAM vers la flash.

 

Sinon je me demandais si c'était possible de changer carrément l'arduino avec un Mega 2560 qui à l'aire d'avoir les même spécificités tout en bénéficiant de 8k de RAM ?



#19 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 14 juin 2016 - 02:18

Salut en fait l'idéee était de voir via les Serial.print rajoutés comment se comporte le programme quand les animations sont en flash, donc avec les PROGMEM + les sorties pour voir ce que lit rééellement ton programme.

Donc il faut faire la modif de mon second post après celle du premier, pour essayer de comprendre pourquoi tu ne récupères pas les bonne valeurs.

 

Si tu n'as pas sur l'animation 1 un truc genre "Suite RGB: g r fin de la suite RGB" et ainsi de suite, c'est que la lecture en mémoire flash n'est pas correcte.

 

J'essaye de tester ce soir à la maison pour voir.

 

Bien sur si tu trouves un arduino avec plus de mémoire ça devrait passer, mais le mega je suis pas sur, avec 8k de ram, il faut penser que tu dois en garder pour ton programme lui même, donc faut voir, si tu as genre grand max 6k de tableaux ca devrait passer.



#20 romanepineill

romanepineill

    Nouveau membre

  • Membres
  • 19 messages

Posté 14 juin 2016 - 10:03

J'avoue que j'ai pas tout compris... Où est ce que je dois vérifier la suite RGB ?





Répondre à ce sujet



  



Aussi étiqueté avec au moins un de ces mots-clés : arduino, programmation, ram, s ram, LED, bouton, leonardo, PROGMEM, flash, char

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

0 members, 0 guests, 0 anonymous users