Bonjour,
Après avoir enseigné le génie civil pendant 15 ans, je mets à la poubelle toute mon expérience et mon savoir pour enseigner l'électronique en STI2D (ceci est dit pour bien comprendre mon grand désarroi et mon incompétence en électronique).
Donc ce qui suit n'est pas le prof qui enseigne, mais le profélève qui veut apprendre.
Le lycée dispose du robot Moway que je souhaiterais utiliser pour mes cours. J'ai d'abord utilisé le GUI (interface intuitive du logiciel graphique qui permet de programmer facilement le robot et de télécharger le programme via le port USB).
Mais les possibilités sont un peu limitées. Il y a sur internet des exemples pour suivre une ligne, mais j'avais l'idée d'utiliser le micro (capteur de sons).
Je souhaitais écrire un programme (d'abord simple), qui ferai avancer le robot lorsqu'on frappe dans les mains, puis qui s'arrête en frappant à nouveau dans les mains (on pourra toujours compliquer les choses ensuite en frappant 2 fois ça tourne à gauche, 3 fois ça tourne à droite 4 fois ça fait marche arrière … 319 fois ça fait … (non ! je plaisante)).
Avec le GUI, j'ai réussi à faire avancer le Moway, en produisant un bruit (claquement dans les mains), mais il s'arrête rapidement à cause de son propre bruit. Mon problème étant l'intensité du son.
J'ai donc voulu programmer en C, mais ça ne change rien. Pour être plus précis, je ne sais pas accéder au "ADC" comme la documentation le précise.
Extrait de la documentation :
unsigned char SEN_MIC_ANALOG(void)
OUTPUT : Sound intensity.
The SEN_MIC_ANALOG function captures the analog value that depends on the sound intensity from the microphone. To achieve this, function follows these steps:
• Activate the ADC.
• Wait for the data acquisition process to end (100us).
• Read the analog value.
Le problème, est comment on active le ADC ?
Je ne l'ai pas trouvé dans la documentation et … pas sur internet non plus.
Voilà le programme que j'ai écrit (enfin c'est un bien grand mot ! que j'ai essayé d'adapter à ce que je souhaite faire. Car les premières lignes étaient dans un exemple donné, et je n'y comprends rien.
Entre
#include "p18f86j50.h" //Moway microcontroller
…
Et
//low priority interrupt code
}
Le message reste très mystérieux pour moi et si quelqu'un a une info là dessus, je suis preneur.
C'est surtout dans le "MAIN" que j'ai essayé de modifier.
Voilà le programme (se concentré sur le MAIN essentiellement) :
#include "p18f86j50.h" //Moway microcontroller
#include "lib_mot_moway.h" //Engines library
#include "lib_sen_moway.h" //Sensor library
#include "delays.h"
//****************************** ****************************** ****************************** **********************//
// JUMPING THE BOOTLOADER
//****************************** ****************************** ****************************** **********************//
#define REMAPPED_RESET_VECTOR_ADDRESS 0x1000 //Reset adress for the correct bootloader jump
#define REMAPPED_HIGH_INTERRUPT_VECTOR _ADDRESS 0x1008 //High priority interruption adress for the correct bootloader jump
#define REMAPPED_LOW_INTERRUPT_VECTOR_ ADDRESS 0x1018 //Low priority interruption adress for the correct bootloader jump
void YourHighPriorityISRCode(); //Function that executes the needed code in case of the high priority interruption jumps.
void YourLowPriorityISRCode(); //Function that executes the needed code in case of the low priority interruption jumps.
//*********************RESET, HIGH AND LOW PRIORITY INTERRUPTION REMAP************************* ***//
extern void _startup (void);
#pragma code REMAPPED_RESET_VECTOR = REMAPPED_RESET_VECTOR_ADDRESS
void _reset (void)
{
_asm goto _startup _endasm
}
#pragma code
#pragma code REMAPPED_HIGH_INTERRUPT_VECTOR = REMAPPED_HIGH_INTERRUPT_VECTOR _ADDRESS
void Remapped_High_ISR (void) { _asm goto YourHighPriorityISRCode _endasm }
#pragma code REMAPPED_LOW_INTERRUPT_VECTOR = REMAPPED_LOW_INTERRUPT_VECTOR_ ADDRESS
void Remapped_Low_ISR (void) { _asm goto YourLowPriorityISRCode _endasm }
#pragma code
#pragma interrupt YourHighPriorityISRCode
void YourHighPriorityISRCode() {
//high priority interrupt code
}
#pragma interruptlow YourLowPriorityISRCode
void YourLowPriorityISRCode() {
//low priority interrupt code
}
//****************************** ******[MAIN]****************************** ********************
void main()
{
char a = 0;
int compt = 0;
//**********SENSOR CONFIGURATION************//
SEN_CONFIG();
// enregistrer un son
// SEN_MIC_ANALOG()
Ici je fais une boucle pour augmenter le temps de saisie du bruit que je veux enregistrer.
for (compt = 0; compt <5; compt ++);{
J'allume une LED pour me donner le signal d'enregistrement du son.
LED_FRONT_ON();
Je mets dans une variable "a" l'intensité du son (mais là, j'ai l'impression que ça ne marche pas).
a= SEN_MIC_ANALOG();
Je laisse un peu de temps pour l'enregistrement du son. Tant que la LED est allumée, je produit un son.
Delay10KTCYx (500);
}
J'éteins la LED pour signaler qu'il faut interrompre le bruit (il doit être enregistré maintenant)
LED_FRONT_OFF();
Une petite boucle pour une petite pause
for (compt = 0; compt <5; compt ++);{
Delay10KTCYx (100);
}
J'allume une autre LED pour indiquer le passage à l'étape suivante
for (compt = 0; compt <5; compt ++);{
LED_TOP_GREEN_ON();
Delay10KTCYx (500);
}
Test sur l'intensité du bruit. S'il est supérieur à "a", la LED doit s'allumer.
C'est vraiment ici qu'il y a un preblème
while(1){
if (SEN_MIC_ANALOG()==a ) {
LED_FRONT_ON();}
}
}
Ce qui se passe, c'est que même sans générer de bruit, la LED s'allume.
Si quelqu'un maitrise bien le Moway ou le PIC 18f86j50 et peut me renseigner, je serais preneur et très reconnaissant.
Et si quelqu'un a des idées mettant en œuvre le capteur de température ou de lumière, ça serait le top.
Pour info, j'ai lu (plutôt survolé) : Christian Dupaty, noxyben, PBelectronique (video), Fabrice Sincère, Pascal Mayeux, Bigonoff …
Documents généralement très complets mais qui nécessitent beaucoup de temps pour maitriser les microcontroleurs. Mon ambition est bien plus limitée que la portée de ces documents.
Je veux limiter à l'algorithmique du programme de STI2D tronc commun. Juste ce petit programme : avancer et arrêter en frappant dans les mains.
En remerciant tous ceux qui pourraient m'apporter des renseignements et les autres aussi pour avoir pris la peine de me lire (je sais c'était un peu long).
-----