Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1569 connectés 

 


 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  ..  277  278  279  280  281  282
Auteur Sujet :

[arduino] Topic Unique blabla @ Arduino

n°465628
froggycorp
Posté le 01-04-2025 à 15:55:43  profilanswer
 

Reprise du message précédent :
Il y a compatiblité entre les deux, sauf que c'est pas la même taille.
Me souvient plus comment j'ai fait mon bouzin, mais lib SPI+I2C+Serial = cela rentrait pas dedans > 30Ko.
C'est un peu comme l'arduino, tu as les librairies passe partout et si tu veux optimiser, tu es obligé de faire toi même (ou de recupérer une lib si elle existe) et là pour le coup, les optimisations me semblent assez impressionnantes :)

Message cité 1 fois
Message édité par froggycorp le 01-04-2025 à 15:56:37
mood
Publicité
Posté le 01-04-2025 à 15:55:43  profilanswer
 

n°465647
rat de com​bat
attention rongeur méchant!
Posté le 01-04-2025 à 19:16:47  profilanswer
 

froggycorp a écrit :

lib SPI+I2C+Serial = cela rentrait pas dedans > 30Ko.

Ah ouais! :ouch:


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465885
froggycorp
Posté le 04-04-2025 à 13:35:06  profilanswer
 

Hola,

 

C'est encore moua :D

 

Je passe des paramètres dans une fonction via une array :
void ma_fonction(uint8_t *data).

 

Dans l'idée, je trouvais cela bien, mais dans la pratique c'est relou parce que :
ma_fonction({1,2,3,4});

 

Et bien cela ne marche pas, quelqu'un a une solution simple à proposer qui compile sous arduino ? J'ai un peu tout tester comme :
(uint8_t *) {1,2,3,4}
ou uint8_t(&a)

 

A priori, il y a une chtite différence entre arduino & le C classic à ce sujet là

 

Si je fais : ma_fonction((uint8_t[2]) {1, 2});

 

J'ai : error: taking address of temporary array

 

Au pire, j'aurais voulu éviter de faire un truc genre :
uint8_t data[2] = {0}
data[0] = 1;
data[1] = 2;
ma_fonction(data);


Message édité par froggycorp le 04-04-2025 à 13:43:45
n°465888
rat de com​bat
attention rongeur méchant!
Posté le 04-04-2025 à 13:53:27  profilanswer
 

Sauf si il y a mieux en C++ tu peux juste faire:
uint8_t data[2]={1,2};
fonction(data);

 

Par contre attention, ton tableau se transforme en pointeur vers le premier élément -> sizeof ne fonctionne plus (correctement) dans la fonction.

 

Edit: Autres piste? stdarg.h

 

Edit2: Tu peux rajouter un const devant le uint8_t, ça peut permettre au compilo de mieux optimiser. Idem pour ton prototype:
uint8_t (const) * const data
Le second const concerne le pointeur, le premier les variables, à ne pas mettre si elles changent bien sûr :o , mais vu que tu passes des constantes...

 

Edit3 :o
C'est moche mais ça peut servir:

 

#define PARAMETER_SET_1 1,2,3,4
#define PARAMETER_SET_2 9,10,11,12
void func(const uint8_t p1, const uint8_t p2, const uint8_t p3, const uint8_t p4)

 

func(PARAMETER_SET1);


Message édité par rat de combat le 04-04-2025 à 13:58:49

---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465889
froggycorp
Posté le 04-04-2025 à 13:58:23  profilanswer
 

Exact, mais j'ai besoin de plus générique, j'ai plusieurs appel de fonction. Donc si à l'initialisation je peux faire :
uint8_t data[2] = {1,2};
 
Je ne peux plus le faire ensuite :/
 
Sinon je vais faire une fonction ma_fonction(param1, param2) je sens que cela sera plus rapide :D

n°465890
rat de com​bat
attention rongeur méchant!
Posté le 04-04-2025 à 13:59:53  profilanswer
 

Bah si, tant que tu fous pas const devant ton tableau tu peux modifier les élements ensuite. Par contre oui, tu ne pourras (à ma connaissance) pas réutiliser la syntaxe de l'initialisation.
 
Tu as vu tout mes edit?


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465892
froggycorp
Posté le 04-04-2025 à 14:19:58  profilanswer
 

J'ai des constantes et des pas constantes ;)
 
La méthode du #define, c'est ce que j'ai utilisé dans ma première version de capteur pour les atinny85.
Cela permet d'économiser mass de la RAM.
 
Par contre c'est ingérable avec 4 modèles différents :D
Et comme là j'ai de la place et de la RAM avec le STM32, je cherche à faire un truc plus zoli  
 
Au final j'ai fait une fonction bis pour ce cas de figure ;)

n°465894
rat de com​bat
attention rongeur méchant!
Posté le 04-04-2025 à 14:49:42  profilanswer
 

A mon avis tu fais fausse route avec ton tableau, enfin peut-être vu le peu de détails que j'ai. :o  
 
Un tableau = série de valeurs genre mesures etc; sinon c'est pas franchement adapté. Il y a les "struct" aussi sinon pour regrouper des choses. Et tu peux aussi, si c'est adapté à ton cas, utiliser des compilations conditionelles (#ifdef etc).


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465908
froggycorp
Posté le 04-04-2025 à 20:11:57  profilanswer
 

rat de combat a écrit :

A mon avis tu fais fausse route avec ton tableau, enfin peut-être vu le peu de détails que j'ai. :o


 
 
Rhoooo *projet secret defense* de pas du tout.
C'est pour les communications SPI/I2C/USART et pas mal d'autres trucs.
 
Pour un exemple concret, j'ai un truc comme. L'utilisation de *data me sauve de la manip normalement

Code :
  1. void spi_write(uint8_t *data, uint8_t len) {
  2. blablabla;
  3. }
  4. main(){
  5. //cas 1, la version chiante. La taille de data est non fixe, par exemple un registre qui fait 16b voir plus avec un buffer
  6. uint8_t data[2] = {0};
  7. data[0] = 0x01; //le registre
  8. data[1] = 0x02; //valeur du registre qui peut être fixe ou pas
  9. spi_write(data, 2);
  10. //cas2, la version pas chiante mais qui ne marche pas
  11. spi_write(uint8_t {0x01, 0x02}, 2);
  12. }


 
Ce que je comprends pas, c'est que je peux passer des valeurs directement, mais à priori pas une array. J'ai trouvé des exemples sur l'internet mais cela fonctionne po.

n°465909
rat de com​bat
attention rongeur méchant!
Posté le 04-04-2025 à 20:17:58  profilanswer
 

cas2: Ca veut dire quoi "marche pas", quelle erreur? Dans tout les cas c'est pas du C, mais peut-être valide/possible en C++.
 
Sinon spontanément je mettrais du variadic argument dans ton truc, genre
 
#include <stdarg.h>
spi_write(const uint8_t len, ...)
{
blabla :o  
}
 
Nan, les ... ne sont pas une faute de frappe, c'est vraiment la syntaxe!


---------------
Ne laissez pas mourir vos sujets en cours de route!
mood
Publicité
Posté le 04-04-2025 à 20:17:58  profilanswer
 

n°465911
froggycorp
Posté le 04-04-2025 à 20:44:00  profilanswer
 

Pour spi_write(uint8_t {0x01, 0x02}, 2);
 
error: too many initializers for 'uint8_t' {aka 'unsigned char'}
 
Sinon, sur l'internet il y a : spi_write((uint8_t []) {1, 2, 3}, 2); :
 
error: taking address of temporary array

n°465912
Natopsi
☄️Just end it already!☄️
Posté le 04-04-2025 à 20:47:09  profilanswer
 

https://www.geeksforgeeks.org/variadic-functions-in-c/
 
Tu pourra pas balancer un tableau mais ça fera le job.


---------------
ACH/VDSHFRCoin◈1435mm⚡
n°465913
froggycorp
Posté le 04-04-2025 à 21:13:48  profilanswer
 

Le problème c'est que j'ai besoin de balancer une array :'(
Par exemple dans le cas d'un buffer, j'ai une array[] que je remplis en amont avant de l'écrire via le port SPI

 

rdc l'avait proposé, cela répond d'ailleurs à mon interrogation ultime de comment pouvait bien fonctionner printf :D


Message édité par froggycorp le 04-04-2025 à 21:15:27
n°465916
rat de com​bat
attention rongeur méchant!
Posté le 04-04-2025 à 21:20:29  profilanswer
 

Je comprend pas pourquoi tu veux un array? La boule de cristal me dit que tes valeurs viennent d'une autre fonction et que tu sais pas comment faire autrement? :o

 

Regarde (typedef) struct.

 

PS: Les variadic c'est très drôle en C/assembleur mixte aussi. :o

Message cité 1 fois
Message édité par rat de combat le 04-04-2025 à 21:20:54

---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465918
rat de com​bat
attention rongeur méchant!
Posté le 04-04-2025 à 21:31:32  profilanswer
 

Sinon y'a toujours moyen de se compliquer la vie et faire des abominations(?) de ce genre. :o
 

Code :
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdarg.h>
  4. #define FILL_ARRAY_U8(arr, ...) _fill_u8(arr, sizeof(array), __VA_ARGS__)
  5. void _fill_u8(uint8_t * const ptr, const uint8_t len, ...)
  6. {
  7.     uint8_t i;
  8.     va_list va;
  9.     va_start(va, len);
  10.     for(i=0; i<len; i++)
  11.         ptr[i]=(uint8_t)va_arg(va, int);   
  12.     va_end(va);
  13. }
  14. int main(void)
  15. {
  16.     uint8_t array[10];
  17.     uint8_t variable=35;
  18.    
  19.     FILL_ARRAY_U8(array, 1,2,variable,4,5,6,7,8,9,10);
  20.    
  21.     uint8_t i;
  22.     for(i=0; i<10; i++)
  23.     {
  24.         printf("[%2u] %2u\n", i, array[i]);
  25.     }
  26.    
  27.     return 0;
  28. }


 
Edit:

Code :
  1. #include <stdio.h>
  2. #include <stdint.h>
  3. #include <stdarg.h>
  4. #define FILL_ARRAY_U8(arr, ...) _fill_u8(arr, sizeof(array), __VA_ARGS__)
  5. uint8_t * _fill_u8(uint8_t * const ptr, const uint8_t len, ...)
  6. {
  7.     uint8_t i;
  8.     va_list va;
  9.     va_start(va, len);
  10.     for(i=0; i<len; i++)
  11.         ptr[i]=(uint8_t)va_arg(va, int);   
  12.     va_end(va);
  13.    
  14.     return ptr;
  15. }
  16. void pas_spi_du_tout(uint8_t const * const a, const uint8_t l)
  17. {
  18.     uint8_t i;
  19.     printf("This is not code for SPI :o \n" );
  20.     for(i=0; i<l; i++)
  21.         printf("[%2u] %2u\n", i, a[i]);
  22.     printf("\n" );
  23. }
  24. int main(void)
  25. {
  26.     uint8_t array[10];
  27.     uint8_t variable=35;
  28.     uint8_t variable2=53;
  29.    
  30.     FILL_ARRAY_U8(array, 1,2,variable,4,5,6,7,8,9,10);
  31.    
  32.     pas_spi_du_tout(array, 10);
  33.    
  34.     pas_spi_du_tout(FILL_ARRAY_U8(array, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, variable2), 10);
  35.    
  36.     return 0;
  37. }


 
Je sors. :o (quoi que peut-être, peut-être ça peut t'aider...)


Message édité par rat de combat le 04-04-2025 à 21:35:17

---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465920
froggycorp
Posté le 04-04-2025 à 22:41:58  profilanswer
 

rat de combat a écrit :

Je comprend pas pourquoi tu veux un array? La boule de cristal me dit que tes valeurs viennent d'une autre fonction et que tu sais pas comment faire autrement? :o

 

Dans l'exemple d'un buffer de taille indeterminée :)

 

Ton exemple est sympathique, mais j'ai plus vite fait de faire le cas spi(data1, data2); (ce que j'ai fait)

 

:whistle:

 

[edit]Sinon spi("\0\1\2" ); ? ^^
Mais j'ai des char d'un côté, et des bytes de l'autre cote et le compilo est po content
Et bon, une string, c'est une array de char ...


Message édité par froggycorp le 04-04-2025 à 22:59:05
n°465921
rat de com​bat
attention rongeur méchant!
Posté le 05-04-2025 à 01:06:32  profilanswer
 

Mon exemple n'était qu'a moitié sérieux. :o Ca compile, ça tourne, mais je ne parlais pas d'abomination pour rien. :o  
 
Le soucis avec les char c'est que ça peut être signé ou non signé et par défaut (sur mon GCC, pas sûr ce que dit le standard) c'est signé. Donc compilateur qui va râler, ça peut poser des soucis et en plus c'est moche. :o Go différentes fonctions, sachant que tu peux - pour éviter du code en double et faciliter p.ex. le portage vers une autre base hardware - faire une seule fonction send_byte et puis différentes fonctions genre send_array, send_values3(u8, u8, u8), ... qui ne feront qu'appeler (avec une boucle si besoin) la fonction send_byte. C'est un peu l'idée des HAL (hardware abstraction layer). Avec l'optimisation du compilateur ça sera pas mal du tout.
 
D'ailleurs cette optimisation, elle est réglée sur quoi? Arduino utilise toujours GCC non? Je suppose que c'est -Os par défaut, donc taille du code; mais si on peut autant régler sur -O1/-O2 voir -O3 pour gagner en vitesse (plus ou moins) au détriment de la taille du firmware.
 
Et tant que tu bricoles les réglages compilo autant vérifier que -Wall -Wextra sont bien présents, c'est indispensable! Perso mon code final je le compile avec -Werror aussi, mais c'est pas pratique pour du développement en cours, la moindre variable inutilisée p.ex. va faire échouer la compilation (car il y aura un warning qui avec -Werror se transforme en erreur).


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465923
froggycorp
Posté le 05-04-2025 à 08:13:29  profilanswer
 

Faudrait que je les rajoute, mais actuellement je prefere pas trop de warning ;)
 
Ce que je voulais dire par array de char, c'est qu'il l'accepte bien en passage de parametre. Donc pourquoi une array de int cela passe pas

n°465928
rat de com​bat
attention rongeur méchant!
Posté le 05-04-2025 à 11:28:41  profilanswer
 

Les warnings sont là pour t'aider! Un warning = un truc douteux qui ne fera pas ce que tu veux (en gros).
 
Pour le reste j'ai pas compris. :o Un string en mémoire c'est un tableau avec '\0' comme dernier élément, par contre pour le compilateur bah ça reste un string, pas un tableau.


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465929
froggycorp
Posté le 05-04-2025 à 11:40:07  profilanswer
 

un string c'est une suite de byte, donc s'il peut passer une suite de byte en parametre, il devrait pouvoir passer une suite de type {1,2,3}

n°465932
rat de com​bat
attention rongeur méchant!
Posté le 05-04-2025 à 14:29:31  profilanswer
 

Visiblement le C n'est pas fichu ainsi. :o  
 
(Désolé, j'ai le cerveau en compote...)


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°465935
froggycorp
Posté le 05-04-2025 à 14:49:37  profilanswer
 

tu voulais dire qu'il n'est pas fichu ANSI ? :D

n°465936
rat de com​bat
attention rongeur méchant!
Posté le 05-04-2025 à 14:53:00  profilanswer
 

:o


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°466068
crazytiti
http://crazytiti.free.fr/
Posté le 07-04-2025 à 21:55:14  profilanswer
 

Je suis en train de bricoler une useless box avec du caractère.
Je vais faire différentes fonctions qui vont répondre différemment au basculement de l'inter.
Je vais utiliser le générateur aléatoire (seed sur une entrée analogique en l'air) pour déterminer quelle fonction appeler.
 
=> le générateur va me renvoyer un int, comment je fait pour appeler telle ou telle fonction ?
 
Je n'ai pas envie d'avoir une grosse fonction avec un gros case.
Je préférerais éclater chaque mouvement dans sa propre fonction.


---------------
Le PC est une drogue... Téléchargez mes modèles 3D pour que j'ai du filament gratuit :-D https://www.printables.com/fr/@Crazytiti_1456354
n°466070
Natopsi
☄️Just end it already!☄️
Posté le 07-04-2025 à 22:11:40  profilanswer
 

Un tableau de paires <int,pointeur de fonction> ordonnés par clé croissante ( https://en.cppreference.com/w/cpp/container/map quand t'as un vrai proc :o )
Et une fonction qui parcours le tableau tant que la clé est inférieure à la clé tirée au sort et va taper dans la fonction pointée.
 
T'as plus qu'à répartir tes clés entre ton entier min et ton entier max issus de random()  :o


Message édité par Natopsi le 07-04-2025 à 22:11:54

---------------
ACH/VDSHFRCoin◈1435mm⚡
n°466071
froggycorp
Posté le 07-04-2025 à 22:13:46  profilanswer
 

crazytiti a écrit :

Je suis en train de bricoler une useless box avec du caractère.
Je vais faire différentes fonctions qui vont répondre différemment au basculement de l'inter.
Je vais utiliser le générateur aléatoire (seed sur une entrée analogique en l'air) pour déterminer quelle fonction appeler.

 

=> le générateur va me renvoyer un int, comment je fait pour appeler telle ou telle fonction ?

 

Je n'ai pas envie d'avoir une grosse fonction avec un gros case.
Je préférerais éclater chaque mouvement dans sa propre fonction.

 

Fait plutot avec du bois ou du plastique, c'est mieux  :whistle:
J'en ai fait une il y a quelques années, c'est marrant. Je te conseille de faire un debugger avec du telnet ou de l'UART pour pas passer des heures à configurer les mouvements ;)

 

Dans tous les cas, ce sera un switch case ou sinon une série de if elseif, mais cela reviendra au même. Voir une array avec des pointeurs vers tes fonctions, mais cela changera pas grand chose.
Tout dépend de ce que tu veux faire au final, du nombre de moteur, des mouvements multiples en même temps, etc etc

 

La question c'est aussi comment tu vois les actions possibles

 

-----------

 

Sinon sur stm32, c'est rigolo les interruptions. Elles sont définies par ligne. Donc PA0 PB0 PC0 ... sont sur la même ligne. Impossible de savoir qui a lancé l'interruption entre chaque. /o\


Message édité par froggycorp le 07-04-2025 à 22:17:23
n°466072
crazytiti
http://crazytiti.free.fr/
Posté le 07-04-2025 à 22:30:14  profilanswer
 

:lol:
Je pensais à un truc du genre ce qu'a dit Natospi : un tableau avec les pointeurs des fonctions, et j'appelle directement la fonction à l'élément n du tableau.
Bon pour le moment j'ai mis un gros case ...

 

Sinon la uselessbox on me la fournit c'est la classique en bois à 16e sur amazon.
Je vais au plus simple : j'ai démonté un servo pour récupérer l'elec et le potar de positionnement.
Je mets le potar sur l'axe du bras.
Je prends un digispark attiny85
L'idée étant que ça arrive à fonctionner avec les 2 piles d'origine.
Je mets sur l'inter principal l'alimentation du montage en parallèle de l'inter de repos.
Ainsi au repos tout est débranché.
Si on active l'inter principal le montage est sous tension.
Le bras va aller basculer l'interupteur avec un mouvements au pif.
Lorsque l'inter est remis en position "repos" alors le montage est toujours alimenté par l'inter de repos.
Puis le bras va revenir au repos et ça coupera le montage.
Voici la première version ultra beta car je n'ai même pas encore câblé les inters ou collé le potar.
Ya 5 mouvements pour le moment.

 

Nb : pas de debug, l'usb de mon digispark est flingué donc je le programme vis un USBtinyISP.
Nb2 : oui il y a une boucle infinie à la fin car le montage est sensé se mettre hors tension.

 
Code :
  1. /*
  2. * Grunchy box
  3. * useless box un peu vener
  4. */
  5. // PIN
  6. #define servo_pin 3
  7. #define inter_pin 4
  8. #define led_pin 1
  9. // configuration des positions
  10. #define pos_repos 20
  11. #define pos_inter 160
  12. #define pos_entreouvre 40
  13. #define pos_hide 30
  14. #define pos_hesite 120
  15. #define max_move 5
  16. #include "SimpleServo.h"
  17. SimpleServo myservo;  // create servo object to control a servo
  18. int pos = 0;    // variable to store the servo position
  19. int move_nb = 0;  //numéro du mouvement
  20. void setup() {
  21.   pinMode(inter_pin, INPUT);
  22.   pinMode(led_pin, OUTPUT);
  23.   digitalWrite(led_pin, 1);
  24.   myservo.attach(servo_pin);  // attaches the servo
  25.   myservo.setMaximumDegrees(180);
  26.   randomSeed(analogRead(0));
  27.   move_nb = random(0,max_move);
  28. }
  29. void loop() {
  30.   reponse(move_nb); 
  31. }
  32. void reponse(int move_nb){
  33.   switch (move_nb){
  34.     case 0: //classique
  35.       while(digitalRead(inter_pin)){
  36.         myservo.write(pos_inter);
  37.       }
  38.       break;
  39.      
  40.     case 1: //marque 1 pause
  41.       myservo.write(pos_hesite);
  42.       delay(700);
  43.       while(digitalRead(inter_pin)){
  44.         myservo.write(pos_inter);
  45.       }
  46.       break;
  47.      
  48.     case 2: //hesite
  49.       myservo.write(pos_hesite);
  50.       delay(700);
  51.       myservo.write(pos_entreouvre);
  52.       delay(700);
  53.       while(digitalRead(inter_pin)){
  54.         myservo.write(pos_inter);
  55.       }
  56.       break;
  57.      
  58.     case 3: //à couvert
  59.       myservo.write(pos_entreouvre);
  60.       delay(700);
  61.       myservo.write(pos_hide);
  62.       delay(700);
  63.       myservo.write(pos_entreouvre);
  64.       delay(700);
  65.       while(digitalRead(inter_pin)){
  66.         myservo.write(pos_inter);
  67.       }
  68.       break;
  69.     case 4: //revient et surveille
  70.       myservo.write(pos_hesite);
  71.       delay(700);
  72.       while(digitalRead(inter_pin)){
  73.         myservo.write(pos_inter);
  74.       }
  75.       myservo.write(pos_entreouvre);
  76.       delay(700);
  77.       myservo.write(pos_hide);
  78.       delay(700);
  79.       myservo.write(pos_hesite);
  80.       delay(700);
  81.       while(digitalRead(inter_pin)){
  82.         myservo.write(pos_inter);
  83.       }
  84.       break;
  85.      
  86.     default:
  87.       while(digitalRead(inter_pin)){
  88.         myservo.write(pos_inter);
  89.       }
  90.        while(1){
  91.         myservo.write(pos_repos);
  92.       }
  93.   }
  94.   // retour à l'arret
  95.   while(1){
  96.     myservo.write(pos_repos);
  97.   }
  98. }



Message édité par crazytiti le 07-04-2025 à 22:31:45

---------------
Le PC est une drogue... Téléchargez mes modèles 3D pour que j'ai du filament gratuit :-D https://www.printables.com/fr/@Crazytiti_1456354
n°466073
froggycorp
Posté le 07-04-2025 à 22:44:09  profilanswer
 

C'est la version de base, ensuite il y a beaucoup plus simple, mais je sais pas si tu veux la solution.
Sans possibilité de debugger, cela peut etre long pour tester les positions. Si tu as un autre uC, fait peut etre avec lui pour tester ? Les coordonnées restent les mêmes.


Message édité par froggycorp le 07-04-2025 à 22:48:13
n°466074
crazytiti
http://crazytiti.free.fr/
Posté le 07-04-2025 à 22:46:44  profilanswer
 

Vas y balance, je ne suis pas là pour chercher :o  
maintenant que le case est fait c'est pas dit que je modifie mais j'aurais bien voulu savoir.


---------------
Le PC est une drogue... Téléchargez mes modèles 3D pour que j'ai du filament gratuit :-D https://www.printables.com/fr/@Crazytiti_1456354
n°466076
froggycorp
Posté le 07-04-2025 à 23:00:07  profilanswer
 

Rholalalala, les djeunz jvous jure ^^

 
Code :
  1. #define pos_inter 0
  2. #define pos_hesite 0
  3. //etc
  4. #define nombre_de_cas 10
  5. uint16_t mouvement[nombre_de_cas][10] = {//mouvements max = 10/2
  6. //cas 0
  7.   {pos_inter, 0, 0xFFFF, 0xFFFF },
  8. //cas 1
  9. {pos_hesite, 700, pos_inter, 0, 0xFFFF, 0xFFFF}
  10. //etc
  11. };
  12. //la fonction
  13. uint8_t a = 0;
  14. while (mouvement[move_mb][a] != 0xFFFF) {
  15. myservo.write(mouvement[move_mb][a++]);
  16. delay(mouvement[move_mb][a++]);
  17. };
 

[reedit]Si tu veux faire plus compliqué, tu rajoutes des codes conditions genre 0xFFFE :

 
Code :
  1. uint8_t a = 0;
  2. while (mouvement[move_mb][a] != 0xFFFF) {
  3. if (mouvement[move_mb][a] == 0xFFFE) {
  4.       while(digitalRead(inter_pin)){
  5.         myservo.write(pos_inter);
  6.       };
  7. else {
  8. myservo.write(mouvement[move_mb][a++]);
  9. delay(mouvement[move_mb][a++]);
  10. };
  11. }


Message édité par froggycorp le 07-04-2025 à 23:25:33
n°466079
crazytiti
http://crazytiti.free.fr/
Posté le 08-04-2025 à 00:12:17  profilanswer
 

Ok je crois que j'ai capté, mais du coup mon but c'était que ce soit plus lisible, et là c'est l'inverse :lol:


---------------
Le PC est une drogue... Téléchargez mes modèles 3D pour que j'ai du filament gratuit :-D https://www.printables.com/fr/@Crazytiti_1456354
n°466085
froggycorp
Posté le 08-04-2025 à 09:29:16  profilanswer
 

Sur les actions de ce type, je crois pas qu'il y ai plus simple et lisible que de faire défiler une liste de séquence :)
 
Par exemple, le cas 3 :
 
{pos_entreouvre, 700, pos_hide, 700, pos_entrouve, 700, 0xFFFE, 0, 0xFFFF, 0xFFFF}
 
Ensuite c'est toi qui écrit donc faut que ce soit compréhensible pour toi.

n°466119
rat de com​bat
attention rongeur méchant!
Posté le 08-04-2025 à 15:27:03  profilanswer
 

Faut passer par des struct et enum; ça sera clair et concis. Mais pas le temps de pisser un exemple là. :o


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°466122
froggycorp
Posté le 08-04-2025 à 17:22:21  profilanswer
 

Bon, après avoir viré le framework arduino dans platformio, viré les librairies HAL que j'utilise pas.
Le programme passe de 16K à 8K et la RAM de 2K à 800o

 

Et en plus, cela a l'air de fonctionner :D

 

Au final, il a fallu tout refaire (joie) car bizarrement il n'y a pas vraiment de librairie. Mais bon, avec la version "finger in the noize" c'était > 30K


Message édité par froggycorp le 08-04-2025 à 17:23:43
n°466128
rat de com​bat
attention rongeur méchant!
Posté le 08-04-2025 à 18:25:49  profilanswer
 

Beau boulot froggy. :jap:  
 
@crazytiti:
Voila ce que je propose. Non testé. :o
 

Code :
  1. typedef enum
  2. {
  3.     NO_LOOP,
  4.     DO_LOOP_WHILE_INTER
  5. } loop_t;
  6. typedef struct
  7. {
  8.     loop_t do_loop;
  9.     uint16_t pos;
  10.     uint16_t delay_ms;
  11. } servo_move_t;
  12. #define NB_MOVES_MAX 5
  13. typedef struct
  14. {
  15.     uint8_t nb_moves;
  16.     servo_move_t moves[NB_MOVES_MAX];
  17. } move_t;
  18. #define NB_MOVE_CASE 4
  19. void response(const uint8 move_nb)
  20. {
  21.     const move_t moves[NB_MOVE_CASE]=
  22.     {
  23.         { 1, { { DO_LOOP_WHILE_INTER, 160, 0 }, { NO_LOOP, 0, 0 }, { NO_LOOP, 0, 0 }, { NO_LOOP, 0, 0 }, { NO_LOOP, 0, 0 } } },
  24.         { 2, { { NO_LOOP, 120, 700 }, { DO_LOOP_WHILE_INTER, 160, 0 }, { NO_LOOP, 0, 0 }, { NO_LOOP, 0, 0 }, { NO_LOOP, 0, 0 } } },
  25.         //....
  26.     };
  27.     uint8_t i;
  28.     for(i=0; i<moves[move_nb].nb_moves; i++)
  29.     {
  30.         if(moves[move_nb].moves[i].do_loop)
  31.         {
  32.             while(digitalRead(inter_pin))
  33.                 myservo.write(moves[move_nb].moves[i].pos);
  34.         }
  35.         else
  36.             myservo.write(moves[move_nb].moves[i].pos);
  37.         if(moves[move_nb].moves[i].delay_ms)
  38.             delay(moves[move_nb].moves[i].delay_ms);
  39.     }
  40. }


---------------
Ne laissez pas mourir vos sujets en cours de route!
n°466129
crazytiti
http://crazytiti.free.fr/
Posté le 08-04-2025 à 18:49:58  profilanswer
 

Merci, mais trop contraignant.
J'ai des moves vraiment différents avec une trop grande quantité d'actions variables.
Et faut que je le finisse avant jeudi, donc priorité : que ça fonctionne peut importe la gueule du code :bounce:


---------------
Le PC est une drogue... Téléchargez mes modèles 3D pour que j'ai du filament gratuit :-D https://www.printables.com/fr/@Crazytiti_1456354
n°466130
rat de com​bat
attention rongeur méchant!
Posté le 08-04-2025 à 19:27:06  profilanswer
 

crazytiti a écrit :

Et faut que je le finisse avant jeudi, donc priorité : que ça fonctionne peut importe la gueule du code :bounce:

Je connais ça, c'est jamais bien. :o

 

PS: tableau de pointeurs de fonctions?


Message édité par rat de combat le 08-04-2025 à 19:27:52

---------------
Ne laissez pas mourir vos sujets en cours de route!
n°466152
froggycorp
Posté le 09-04-2025 à 09:16:57  profilanswer
 

Non mais il va finir avec des if/elseif degueulasse ;)
 
Au moins, ce n'est pas généré par une IA :D

n°466160
froggycorp
Posté le 09-04-2025 à 10:45:20  profilanswer
 

Bon, j'ai share les librairies de base si jamais :
https://github.com/FroggyCorp/STM32-LL-Libraries/

n°466201
crazytiti
http://crazytiti.free.fr/
Posté le 09-04-2025 à 23:28:21  profilanswer
 

Voila la useless box est terminé avec 1/2h d'avance :whistle:
Avec plus de temps j'aurais mis d'autres moves mais ça faisait partit du challenge.

 

Vidéo démo https://youtu.be/-WEoi6DMTlU
https://rehost.diberie.com/Picture/Get/t/386025

 

Le code sur mon github https://github.com/crazytiti/uselessbox/tree/main
Nb : pas un seul if / else :lol:

 

https://rehost.diberie.com/Picture/Get/t/386023 https://rehost.diberie.com/Picture/Get/t/386024


Message édité par crazytiti le 09-04-2025 à 23:35:29

---------------
Le PC est une drogue... Téléchargez mes modèles 3D pour que j'ai du filament gratuit :-D https://www.printables.com/fr/@Crazytiti_1456354
n°466204
Ivanovitch
I ARE VERY SKILL
Posté le 10-04-2025 à 00:25:04  profilanswer
 

froggycorp a écrit :

un string c'est une suite de byte, donc s'il peut passer une suite de byte en parametre, il devrait pouvoir passer une suite de type {1,2,3}

 
rat de combat a écrit :

Visiblement le C n'est pas fichu ainsi. :o

 

Si, c'est possible en utilisant une compound-litteral (une feature introduite en C99):

 
Code :
  1. void func(int* a)
  2. {
  3.    printf("a[0] = %d \na[1] = %d", a[0], a[1]);
  4. }
  5. int main()
  6. {
  7.     func( (int[]){10, 11} );
  8. }
 

La clé est le "cast" (les parens) autour du type avant la liste d'init.

 

edit: testé sur ardunio ide, en effet avec ce compilo moyen ageux il veux pas.
Il traite en erreur ce qui ne devrait etre qu'un warning (et encore...) "taking address of temporary array"
 [:mikdespe1]

Message cité 2 fois
Message édité par Ivanovitch le 10-04-2025 à 00:37:05
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  ..  277  278  279  280  281  282

Aller à :
Ajouter une réponse
 

Sujets relatifs
* Réparations de vos appareils électroniques & electromenager * 
Plus de sujets relatifs à : [arduino] Topic Unique blabla @ Arduino


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)