Show Posts
Pages: 1 ... 42 43 [44] 45 46 ... 93
646  International / Français / Re: [RESOLU] besoin d'aide des physicos-musiciens on: September 23, 2013, 05:24:37 am
tout de suite les grands mots... autant en acheter un tout fait alors...  smiley-mr-green

Bon, j'ai pas pu résister, je l'ai fait... Merci excel pour le calcul des valeurs des timers...

J'arrive donc à partir de mon UNO à jouer 62 notes (soit 5 octaves quand même). un poussoir fait note_on / note_off et un potar fait la hauteur de la note. Le son généré sort des 6 pin PWM : la fondamentale + 5 harmoniques (H0, H1, H2, H3, H4 et H6). avec des résistances au pif, j'ai réussi à faire un son d'accordéon... Mais je pense mettre un petit circuit en plus et des potars pour mixer les signaux (avec un facteur de -1 à +1 pour chaque signal). A voir, mais ça pourrait être rigolo... d'ailleurs, il me reste un potar numérique qui permettrait d'avoir des configs toutes faites...

Pas de midi bien sûr, mais pourquoi pas plus tard? smiley-lol
647  International / Français / Re: [RESOLU] besoin d'aide des physicos-musiciens on: September 23, 2013, 01:07:52 am
Un petit déterrage... puisque tu en parlais...

moi, j'aurais pris un manche à balais, sur lequel j'aurais mis des boutons poussoirs en guise de trous. demande à ta nièce les combinaisons de "trous à boucher" pour chaque note. Tu devrais alors en avoir 11 (de DO à SI, en passant par tous les # ou b). le capteur de pression en tête pour déterminer l'octave, et c'est joué.

en gros, les boutons te donnent le numéro de la note de 1 à 11 auquel tu rajoutes 12 si on souffle plus fort. Pour le midi, c'est tout ce que tu as à faire, tu n'as besoin que d'envoyer un numéro de note + noteON ou noteOFF.

Si tu veux faire encore mieux, tu peux rajouter une sortie sonore à l'aide d'un tone() ou en direct sur un timer, la formule de la fréquence est une suite arithmétique très simple (mais moins simple à programmer) :

Fn+1 = Fn x racine_douzième(2).
Fn+2 = Fn x racine_douzième(2) x racine_douzième(2).
Fn-1 = Fn / racine_douzième(2).

exemple :
Fn+12 = Fn x racine_douzième(2)12, soit Fn+12 = Fn x 2, c'est bien une octave.

Pour jouer directement sur un timer, la période sera :

Tn+1 = Tn / racine_douzième(2). (T = 1/F)

Tu pars d'une référence : un LA440 : F = 440Hz... donc LA# = LA x racine12(2) = 440 x 1,0594630943592952645618252949461 = 446,1637Hz...

tu es prêt à ressortir ta flûte? moi, ça me donne envie d'essayer tiens...
648  International / Français / Re: Bogue avec la bibliothèque Servo, comment corriger ce problème ??? on: September 23, 2013, 12:37:27 am
Bonjour Super_Cinci,

As-tu une préférence comme nom de bibliothèque entre « Servo_Super_Cinci » ou « ServoCinci » ?

L'ami René
servoCini, car l'autre, ça fait vraiment trop long... Puis cinci, ça veut dire 5 en roumain, donc les libs de la "série 5" ? ...

pour ce qui est du passage en libs, là, je suis gros débutant. il y a une question de C / C++ je crois.

Il faut regarder du côté de la nano, si par tout zazar elle ne tournerait pas en 8MHz, dans ce cas, le valeur de ICR1 est à revoir (ICR1 = T pour 8MHz). tu peux rajouter un #if F_CPU == 8000000 pour compiler en fonction de l'horloge CPU.

Je regarde tes fichiers et te tiens au courant. j'ai testé mon .ino sur la toute dernière version de l'IDE (1.5 je crois)

Ca compile, mais je n'ai pas encore testé...
649  International / Le bar / Re: [CDG] tout peut s'optimiser! on: September 22, 2013, 05:17:55 pm
On est bien d'accord, la team a du mérite d'avoir su monter la mayo arduino, mais avec tous les développeurs qu'ils ont maintenant sous la main, ils pourraient gagner à faire bosser les gens qui savent. Tout est une affaire de $$$$.

Il faudra que j'essaie ton int main(), ça m'intrigue... C'est fait. 316 octets contre 682 avant. Reste que sur les 316, il doit y en avoir encore de trop, non? et s'il a reconnu mon DDRF, c'est donc qu'il y a des #include cachés qui trainent encore.
Ha ba tient, voila un exemple parfait de mon commentaire sur les optimisations LTO.
Avec un AVR-GCC à jour j'obtiens 458 octets de base et 148 octets en mode éditeur de texte.
Comme quoi il serait bon que la team arduino se bouge un peu pour ça.
J'ai créé mon cinciduino. J'ai copié le UNO dans boards.txt en changeant le répertoire build.core avec un nouveau dans lequel j'ai mis main.cpp, arduino.h, io.h, sfr_defs.h, iom328p.h, inttypes.h et stdint.h, tous repris en virant un max de trucs (surtout les #include). Normalement, il ne me reste que les defs des types, registres et interruptions, soit que des #define.

compilation du même code avec la carte UNO habituelle : 476 octets en 5 secondes
avec la carte cinciduino UNO : 194 octets en... ben ça a été tellement rapide, j'ai pas eu le temps de compter...

Je suis en bonne voie... C'est donc depuis le main.cpp que tout se joue, et j'ai réussi (enfin je crois)...
650  International / Le bar / Re: [CDG] tout peut s'optimiser! on: September 22, 2013, 08:40:32 am
Nous sommes d'accord, Sky.

Un coup de gueule, c'est une râlerie qui a pour but d'extérioriser un peu. Oui je tenterai d'écrire un core, mais il ne faudra pas y chercher de digitalWrite ou analogRead... il n'y aura rien dedans, que de la définition de registres. il y aura une fonction delay(), mais je l'imagine déjà comme étant un simple timer qui au bout d'un certain temps mettra un boolean à true

Code:
  instruction1();  // on fait un truc,
  cinciDelay(100);  // il faut attendre 100 ms avant de faire l'instruction2,
  mais_là_on_a_d_autres_trucs_à_faire();  // en attendant, peut-être que?
  while(delay);  // on attend que le timer de cinciDelay mette la variable delay à 1 si ce n'est déjà fait...
  instruction2();

je vois déjà le même principe pour un analogWrite() etc etc. Mais je le fais pour ma gueule, pas pour les autres, je n'ai pas envie de passer ma vie à répondre à des emails de gugusses qui n'arriveraient pas à s'en servir... (encore merci pour l'info sur boards.txt dans le topic du 644...)

Il faudra que j'essaie ton int main(), ça m'intrigue... C'est fait. 316 octets contre 682 avant. Reste que sur les 316, il doit y en avoir encore de trop, non? et s'il a reconnu mon DDRF, c'est donc qu'il y a des #include cachés qui trainent encore.

En effet, l'arduino est fait pour les gros débutants (le prenez pas mal les gars, hein!), et quand on voit que même la team utilise des int 16bits signés pour de simples variables sur un proc 8bits, ça me fait vraiment peur...
651  International / Français / Re: µC compatible avec l'IDE arduino? on: September 22, 2013, 08:16:27 am
Bien vu Skywood, ça va aussi dans mon sens... comment rajouter une carte dan arduino :

http://code.google.com/p/arduino/wiki/Platforms C'est pas très à jour, mais on doit pouvoir s'en inspirer.
652  International / Français / Re: Erreur de compilation. on: September 22, 2013, 05:39:02 am
Bonjour smiley

Tu n'aurais pas installé un autre compilateur entre temps, ou un soft qui ne ferait pas bon ménage avec l'IDE et ses petites affaires?
653  International / Le bar / [CDG] tout peut s'optimiser! on: September 22, 2013, 05:35:47 am
Oui, encore une fois, je râle sur la façon dont nous utilisons nos pauvres arduinos...

Pour rigoler, j'ai fait ce sketch :

Code:
void setup() {
  // put your setup code here, to run once:
  DDRF = 0xAA;
}

void loop() {
  // put your main code here, to run repeatedly:
  DDRF = !DDRF;
}
Il ne fait rien du tout, mais l'idée était de voir comment l'IDE allait me traiter tout ça. alors je suis allé chercher le fichier Hex qu'il m'a pondu, et je l'ai décortiqué à l'aide de ReAVR, un petit soft qui transforme les .hex en assembleur. Je ne vous donne pas tout le coe asm, mais j'ai fini par retrouver mon setup() et loop() dedans.

J'y ai surtout vu ce que le core arduino rajoutait, comme l'interruption du timer0 pour le comptage de milliseconds(), et je peux vous dire que cette interruption, elle prend beaucoup de place, juste pour incrémenter une variable de type long (4 octets) en SRAM...

Puis j'ai aussi vu la façon dont le compilateur compilait, ben c'est bien loin d'être optimsé! Si on fait deux opérations à suivre sur un même registre, il va aller copier ce registre, faire l'opération, le remettre à sa place, puis le reprendre et faire la seconde opération et enfin le remettre à sa place. ce n'est qu'une des nombreuses bourdes que j'ai relevées... si j'ai le temps, je ferai la même chose avec un digitalWrite() pour voir...  smiley-mr-green

Je me suis amusé à réécrire le code asm sur une petite partie, et surprise : entre ce que le core arduino dit en C et l'assembleur que je ponds, il y a un rapport 2 (mon code est deux fois plus court, donc deux fois plus rapide). smiley-roll-blue

Bref, CDG = Coup De Gueule smiley-twist : d'une, le core est très mal écrit, et de deux, le compilateur n'optimise pas si bien que ça...

Ce qui me pousse de plus en plus à revoir entièrement les choses en créant mon propre core... et ça ne va pas tarder...
654  International / Français / Re: µC compatible avec l'IDE arduino? on: September 22, 2013, 02:24:33 am
Moi aussi j'ai eu à me poser la question de la taille du proc, car même le MEAG2560 devenait trop juste. J'ai acheté deux STM32, c'est tellement pas cher... Mais ça fait un an que je les ai, et elles sont encore dans leurs boîtes scellées. Je n'ose pas m'y mettre car niveau prog, c'est complètement différent de l'arduino, et c'est tout un nouvel et long apprentissage qui m'attend je pense (je suis autodidacte en prog...).

pour ce qui est de l'IDE-0018, il faut tester les nouvelles libs, il y a des chances que ça bug un peu...
655  International / Français / Re: Bogue avec la bibliothèque Servo, comment corriger ce problème ??? on: September 22, 2013, 01:27:13 am
Cette bibliothèque utilise largement la modification directe des registres des puces Atmel pour modifier ou ajuster le fonctionnement des cartes Arduino. Un registre c'est une forme de mémoire vive qui indique l'état de fonctionnement de multiple composante du circuit intégré Armel et par conséquent ce que fait notre carte Arduino. Comme un registre n'est souvent que l'état d'un seul bit (0 ou 1), alors l'utilisation d'une variable de un octet 8 ou deux octets 16 bits, permet de modifier par une seule affectation d'une variable plusieurs paramètres de notre carte Arduino.

Par exemple, le registre « DDRF » touche l'état de 8 bits, soit de DDF0 à DDF7 et permet de modifier en une seule commande, 8 paramètres de notre carte Arduino. Pour cet exemple cela permet de modifier la direction de chacune des 8 pins du port F (entrée ou sortie), équivalent à la fonction pinMode().

Attention quand même à ne pas faire trop peur aux gens smiley-wink L'idée première de la lib est l'utilisation des ressources matérielles en direct pour optimiser le code et la précision. Mais je te joindrai une doc de la lib qui explique le pourquoi du comment. Si j'avais le temps, je réécrirais complètement le core arduino, car il ne me convient pas du tout (bien trop poussif à mon goût).

Je créerais bien des nouvelles cartes : la cinciduino UNO et MEGA. Ces cartes seraient tout simplement la UNO et la MEGA classiques, mais dont le core serait complètement dépouillé de toute pré-initialisation et fonctions inutiles. Par exemple, dans le core arduino, les registres de timers ne sont pas à 0 après initialisation, d'où ma fonction timersReset() sans quoi ça ne marcherait pas... Ah oui, la leonardo aussi, car je risque de l'utiliser aussi, c'est une petite carte intéressante plus "puissante" et moins chère que la UNO.

Et c'est pour ça aussi que je pensais mettre cinci en premier dans le nom des libs. Mais à vrai dire, je m'en tape complètement, et il est temps que je te responsabilise un peu : C'est toi qui choisis le nom!

Il serait pas mal de réfléchir à un truc qui manque cruellement dans arduino, c'est une sorte de sentinelle qui prévient de la non compatibilité des libs (un très gros souci quand deux libs utilisent les mêmes ressources! C'est d'ailleurs pour ça que l'on ne touchera jamais au timer0, car les fonctions delay(), milliseconds() etc sont basées dessus.) Il y a les #warning qui pourraient dans un premier temps informer une double utilisation d'une ressource à la compilation...
656  International / Français / Re: µC compatible avec l'IDE arduino? on: September 21, 2013, 04:24:48 pm
j'ai regardé la sanguino, et malgré un 644 bien large, la carte est toute petite (pas de fioritures). Et ton 644 peut tourner à 3,3V, mais dans ce cas limité à 12MHz (ça doit pas changer beaucoup si c'est juste un problème de mémoire).

Réécrire un bootloader, ça doit pas être trop dur, il suffit de reprendre celui du 328, et d'adapter la taille mémoire. Par contre, le core arduino aura peut-être du mal. Sanguino propose un bootloader ainsi qu'un core, adaptable à la version 018 de l'IDE. Je ne vois aucune différence entre les versions de l'IDE, à part des traductions maladroites et risibles en Français. Tu peut installer l'IDE 018, ça ne changera rien à ta config sur les autres IDE, ça s'installe dans des répertoires différents.
657  International / Français / Re: Bogue avec la bibliothèque Servo, comment corriger ce problème ??? on: September 21, 2013, 04:09:17 pm
Bon, fiou... heu...

dans le désordre, car les réponses devraient être simples...

Nombre de PWM utilisable pour les servos :

MEGA ou UNO, même combat, c'est une question de résolution, et tout est purement matériel. les timers 8 bits ne permettent pas de faire du "hard-servo" convenablement. En effet, si on veut pondre un signal de 15ms, la résolution ne serait que d'une dizaine de points sur la course du servo avec un timer 8bits. La UNO n'a qu'un seul timer 16bits et seulement deux outpoutCompare dessus.

La MEGA ne permet donc que 12 servos, car 4 timers 16bits x 3 OutputCompare. de plus, les timers 8 bits n'offrent que 2 outputCompare (MEGA et UNO). Les autres "pwm" annoncées ne sont que factices et du coup gérées par soft, donc inutilisables car imprécises à souhait.

sur l'une des premières pages du datasheet, on a les correspondances pin / sorties timers, et c'est matériel, on ne peut pas changer ces assignations.

cela répond aussi à la question des broches 9 et 10 de la MEGA qui se reportent à des timers 8bits.

Pour les pin analogiques en l'air :

Oui, bon... dans mon cas, j'avais un seul potar dispo, et pour ne pas passer mon temps à reloader le programme, j'avais un loop du genre :
Code:
servo2 = analogRead(A0);
servo3 = analogRead(A1);
servo5 = analogRead(A2);
(...)
servo46 = analogRead(A11);
forcément, tous les servos réagissaient à leurs entrées analog respectives, mais une entrée analogique en l'air a tendance à prendre la valeur de sa copine d'à côté. Il suffit de ne pas lire les broches qui ne sont pas raccordées, c'est tout smiley-wink . D'ailleurs, quel intérêt de faire un analogRead() sur une pin où rien n'est connecté?

La question n'a pas de sens si on la vois comme ça. si tu te contentes de ne lire que les pin utiles, tu n'auras pas ce problème...

pour le reste, la PWM, je propose d'ouvrir un autre topic dans les projets, ici, on essaiera de ne parler que servos.

Bonne lecture!
658  International / Français / Re: µC compatible avec l'IDE arduino? on: September 21, 2013, 12:09:42 pm
Un ATMEGA reste un ATMEGA, et la transition ne doit pas être bien compliquée, surtout qu'il ressemble bougrement au 328 au niveau ressources hard, les registres sont peut-être aux mêmes adresses (on peut rêver...)?
659  International / Le bar / Re: recherche composant timer... on: September 21, 2013, 03:20:01 am
Bon, après un rapide tour d'horizon...

Je pense que je vais m'orienter vers le TLC5940. chacune de mes barres sera donc équipée d'un 328p et d'un TLC5940. Il faudra donc rajouter quelques petits transistors (Si je reste sur mes leds, un simple 2N2905 (NPN en collecteur ouvert) devrait pouvoir driver chaque bloc de led, et on reste compatible avec les sorties du TLC). Alimenté par une petite alim 12V apacher, il suffira de brancher chaque rampe sur le 220 et chaîner le DMX. Ce qui va me coûter le plus cher, ce sont les prises ou le boîtier (mais j'ai des copains bien placés)...

ça permettra de coupler les rampes au bon gré de mon plaisir sur les canaux DMX.

Reste à définir le nombre de voies sur chaque rampe, 8, 10, 12, 16... une question de taille aussi, longueur = 60mm x nbre modules... bah 16, c'est pas mal, ça fait une rampe de 1m pour 100W de leds...
660  International / Français / Re: 4 servos, 4 boutons, une carte arduino uno R3 on: September 20, 2013, 02:33:41 pm
Je travaille justement sur une lib pour servo avec l'ami rené, mais 4 servos sur une uno, ça sera chaud si tu veux de la précision...
Pages: 1 ... 42 43 [44] 45 46 ... 93