Nouvelles:

Bienvenue au Forum de discussion Électro-Bidouilleur! Inscrivez-vous pour participer aux discussions!: 
https://forum.bidouilleur.ca/index.php?action=signup Les demandes d'inscription sont révisées quotidiennement.

Menu principal
Menu

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.

Voir les contributions Menu

Messages - maximeh

#1
Bonjour,

voici mon problème:
je suis avec un pic18f1220
j'ai réussi a envoyer depuis le pic un message en uart sur un arduino nano
j'ai réussi a faire fonctionner un lcd i2c sur le pic qui affiche un message

mais si je veux envoyer un message par uart ou si j'inscrit le pic en esclave il je réagit pas


sur le datasheet je vois que interrupt existe pour les pic18f1220

j'ai tenté avec version payante chat gpt et claude ai malheureusement pas de résultat

Est il possible de faire du rx tx avec un pic18f1220 ou déclarer une pin en input et qui fonctionne?

Voici le code qui a été injecté dans le pic

#include <xc.h>

// Configuration des bits
#pragma config OSC = INTIO2    // Oscillateur interne
#pragma config WDT = OFF       // Watchdog timer désactivé
#pragma config LVP = OFF       // Low Voltage Programming désactivé
#pragma config PWRT = ON       // Power-up timer activé
#pragma config BOR = OFF       // Brown-out reset désactivé

#define _XTAL_FREQ 4000000     // Fréquence de l'oscillateur interne (4MHz)
#define LED_PIN LATAbits.LATA0 // LED sur RA0

// Variable globale pour compter les impulsions
volatile unsigned char pulseCount = 0;

// Routine d'interruption
void __interrupt() ISR(void)
{
    // Vérifier l'interruption INT0
    if(INTCONbits.INT0IF)
    {
        // Incrémenter le compteur d'impulsions
        pulseCount++;
       
        // Effacer le drapeau d'interruption
        INTCONbits.INT0IF = 0;
    }
}

void main(void)
{
    unsigned char i, count;
   
    // Configuration de l'oscillateur interne
    OSCCON = 0x60;  // 4MHz
   
    // Configuration des ports
    TRISA = 0x00;   // PORTA tout en sortie
    TRISB = 0x01;   // RB0 en entrée
   
    // Désactiver les fonctions analogiques
    ADCON1 = 0x0F;  // Toutes les broches en mode numérique
   
    // Pour le PIC18F1220, utiliser une résistance externe de pull-up
    // ou configurer le front descendant sans pull-up interne
   
    // Initialisation des sorties
    LATA = 0x00;
    LATB = 0x00;
   
    // Configuration de l'interruption externe INT0
    INTCONbits.INT0IF = 0;     // Effacer le drapeau d'interruption
    INTCON2bits.INTEDG0 = 0;   // Front descendant pour INT0
    INTCONbits.INT0IE = 1;     // Activer l'interruption INT0
   
    // Activer les interruptions globales
    INTCONbits.GIE = 1;
   
    // Boucle principale
    while(1)
    {
        // Si des impulsions ont été reçues
        if(pulseCount > 0)
        {
            // Désactiver temporairement les interruptions
            INTCONbits.GIE = 0;
           
            // Copier le nombre d'impulsions
            count = pulseCount;
            pulseCount = 0;
           
            // Réactiver les interruptions
            INTCONbits.GIE = 1;
           
            // Faire clignoter la LED le nombre de fois correspondant
            for(i = 0; i < count; i++)
            {
                LED_PIN = 1;         // Allumer la LED
                __delay_ms(300);     // Attendre
                LED_PIN = 0;         // Éteindre la LED
                __delay_ms(300);     // Attendre
            }
        }
       
        // Petit délai dans la boucle principale
        __delay_ms(10);
    }
}
#2
Bonjour,

j'utilise cettedécoupeuse depuis  23 oct. 2019

j'ai mis un isolateur pour le câble anode du tube



j'ai juste voulu changer de carte pour me permettre d'éviter les sons des moteurs pas a pas

donc pas une histoire d'isolation, juste un parasite, le son est déjà pas l'électrique, non je vais brancher tout ca et on verra si c'est l'alimentation qui était a l'origine du problème
#3
Bonjour,

Je suis totalement rassuré.

Je m'y attendais pas mais j'ai reçu très rapidement une nouvelle alimentation  vevor 50w qui as les même connectique que l'alimentation 40w de K40.
J'ai plusieurs cartes car je veux avoir mes tmc2209 pour éviter les vibrations des steppers qui au final perturbent la découpe.
Avec  la stm32 pour k40 Mini Gerbil v3m j'ai réussi a avoir une découpeuse qui ne faisait presque aucun bruit car j'ai tout fait pour limiter le bruit, changement de ventilateurs et système d'évacuation optimisé.

Mais après un certain temps un son parasite comme le son que fait un robinet quand l'eau sort avec un certain débit phonétiquement un chhhhhhhhhh qui avait comme conséquence une perte de puissance qui limitait a 10ma même si je demandais à 20 ou 25.
Au tout début avec cette carte j'avais exactement ce son et ca conséquence, mais un jour j'ai trouvé l'origine qui était le câble usb qui touchait les câbles du secteur.
On peut donc penser que c'est  soucis d'isolation.
Grace a la nouvelle alimentation je vais découvrir plus de données pour isoler le problème.
Je vous tiens au courant, merci encore pour vos réponses rapide.





#4
Je vous remercie pour votre réponse si rapide.

Si j'ose, avez vous déjà utilisé une alimentation de machine c02 c'est a dire 20kv-25kv?

merci d'avance
#5
Bonjour,

Voici l'alimentation :
https://www.mycloud.ch/l/L005597B693DA1C21CBD759121F38A4FC946D70C6E5778DC99559949C11925C8B

j'utilise comme carte de control un nano avec Shield pour grbl

Depuis la pin du Shield z- un signal pwm est envoyé chaque fois que le laser doit découper ou graver.

Je n'ai pas besoin du pwm, il me faut juste avoir un signal pour que je puisse faire basculer le 5v à GND donc.

en électronique quel est pour vous la solution la  plus simple et le plus rapide.

petite question, je n'ai pas trouvé la solution pour insérer une image dans mon post, j'ai bien upload l'image je trouve bien la balise "insérer une image" mais ensuite que faut il faire

Merci d'avance








#6
Bonjour,

Merci pour votre réponse.

Pour répondre il faut commencer par analyser le point 14 du datasheet page 67, et me dire ce que vous en pensez !
#7
Bonjour, bonne année, j'ai besoin d'aide pour extraire des fonctions qui se trouvent dans le datasheet de tmc2209, il y a qu'une librairie disponible et selon moi elle est totalement a coté de la plaque.

datasheet https://www.analog.com/media/en/technical-documentation/data-sheets/TMC2209_datasheet_rev1.09.pdf
gthub https://github.com/janelia-arduino/TMC2209

Selon moi ce driver de stepper est une vrai avancée dans le monde des stepper.
#8
Ouf je ne comprenais pas pourquoi 7 quand 6 digit pour remove et substring

en fait le string est réceptionné par un http.request et a cause de ca il y a en plus du string 1 espace au début et à  la fin donc j'ai juste fait str.remove(0,1); str.remove(str.length() -1 ,str.length()); et maintenant les remove et substring sont bien 6 et plus 7

dernière modification..
au final a la place de mettre par exemple 002000 je mets __2000 c'est a cause de -02000 car avec _ ca donne _-2000, beaucoup plus claire, dans le code c'est bien entendu traité par la fonction replace(). inputString.replace("_", "");

pour les modérateurs ? j'ai pas mal de questions a poser lié à  des problèmes comme ca,  plus algorithmique que électronique mais c'est quand même sur des microcontrôleurs donc il me semble que c'est  lié du coup ou dois je les poster sur ce forum? aussi j'ai appris dans ce post que je vais prendre une grande attention aux questions et répondre a toutes.

#9
Ca ne correspond pas au message dans ton premier post. Chaque champ avait un nombre de digits variable.

réponse : comme expliqué, j'ai cherché une solution après avoir posé la question et après réflexion j'ai compris que j'avais besoin de 6 digit, avec 3600 pas ils font 201.34 mm

Tu es sur que ça compile?
En supposant que arrastring[titi] contient bien la bonne chaîne de caractère, la bonne formulation serait

réponse : ce code fonctionne à  merveille.je peux maintenant envoyer le nombre de positions des 2 moteurs comme je veux. plus limité a 64 charactères.
               arraystring[titi]; est int   j'ai laissé string dans le nom mais c'est int
               converti dans void serialEvent
                if (inputString.length() == 7) {
                 arraystring[toto] = inputString.toInt();
                 inputString.remove(0,7);
                 toto++;
    }

#10
Hello Kamill

Merci pour tes questions.

Pourquoi 50, je peux te répondre pourquoi pas 200 ou plus.

Désolé mais en même temps que je pose une question je recherche la solution, j'ai justement indiqué que j'avais aussi pensé a un moment découper le string et les envoyer séparément afin de ne pas atteindre les 64 caractères maximum apparemment.

Pourquoi 7 ben c'est en fait 6 digits car dans la fonction remove() tu dois faire nombre de caractères +1 donc 7 c'est en fait le nombre de pas de deux stepper sur un véhicule ROV, donc de -99999 à  999999.

Si j'ai fait ces 3 Serial-print c'est juste pour me démontrer que ca fonctionne. maintenant c'est ca :

if (stringComplete) {
   

long positions[2];

  stepper_driver.initialize();
  int titi = 0;
  for (int i = 0; i < toto /2; ++i) {
  positions[0] = arraystring[titi];
  titi++;
  positions[1] = arraystring[titi];
  titi++;

  steppers.moveTo(positions);
  steppers.runSpeedToPosition();
  stepper1.setCurrentPosition(0);
  stepper2.setCurrentPosition(0);

}
    inputString = "";
    toto = 0;
    stringComplete = false;
}}



Vraiment désolé de ne pas vous donner tout le code, c'est pas pour une histoire que je veux pas partager mais les autres paramètres n'ont aucune influence sur ce problème que j'avais.

Je te remercie infiniment pour "inputString=Serial.readStringUntil('\n');"

Quels sont tes langages que tu maitrises?

#11
et pour finir j'ai modifié pour ne pas être limité au niveau de la taille max d'un string en mettant dans un tableau

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete
int toto = 0;
String arraystring[50];
void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
   
    Serial.println(arraystring[1]);
    Serial.println(arraystring[2]);
    Serial.println(arraystring[3]);
    inputString = "";
    toto = 0;
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
     if (inputString.length() == 7) {
      arraystring[toto] = inputString;
      inputString.remove(0,7);
      toto++;
    }
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}
#12
Un grand merci pour vos réponses.
J'ai pensé effectivement de couper le string et d'envoyer l'un après l'autre.

j'envois comme ça;

String myArrayStr[50];

void setup()
{
  Serial.begin(9600);
  pinMode(4, INPUT_PULLUP); 


void loop()
{
if (digitalRead(4) == LOW) {
    String str1 ="123422125472";
    int nb_order = str1.length() /6 ;
    for (int i = 0; i < nb_order; ++i) {
    myArrayStr = str1.substring(0 ,7);
    Serial.print(myArrayStr);
    str1.remove(0,7);
    delay(400); 
    }}}
 

mais le problème c'est au niveau de la réception

void setup()
{
  Serial.begin(9600); 


void loop() { 
if (Serial.available() > 0) 
  {   
    String recData = " "; 
    while(Serial.available())
    {
      char c = Serial.read();
        recData += c;   
      delay(10);     
    } 
    Serial.println(recData);
}}

c'est idiot, j'ai trouvé la olution dans l'exemple serial event dans arduino

String inputString = "";         // a String to hold incoming data
bool stringComplete = false;  // whether the string is complete

void setup() {
  // initialize serial:
  Serial.begin(9600);
  // reserve 200 bytes for the inputString:
  inputString.reserve(200);
}

void loop() {
  // print the string when a newline arrives:
  if (stringComplete) {
    Serial.println(inputString);
    // clear the string:
    inputString = "";
    stringComplete = false;
  }
}

/*
  SerialEvent occurs whenever a new data comes in the hardware serial RX. This
  routine is run between each time loop() runs, so using delay inside loop can
  delay response. Multiple bytes of data may be available.
*/
void serialEvent() {
  while (Serial.available()) {
    // get the new byte:
    char inChar = (char)Serial.read();
    // add it to the inputString:
    inputString += inChar;
    // if the incoming character is a newline, set a flag so the main loop can
    // do something about it:
   
    if (inChar == '\n') {
      stringComplete = true;
    }
  }
}

il faut juste que j'envoi un Serial.println(); a la fin de mon envoi pour que le receveur sache que j'ai fini.

un grand merci encore de votre attention.


#13
J'ai besoin de transférer par serial entre un esp01s et un Arduino nano une message comme celui ci :2300_1111_3400_5012_4500_8913_5600_12814_6700_16715_7800_20616_8900_24517_10000_28418_11100_32319_12200_36220_13300_40121_11.
il peut être indéfiniment plus long ou plus petit.

avec la façon standard ci dessous c'est limité a 64, du coup comment faire pour que je puisse envoyer un tel message par serial? un grand merci d'avance

if (Serial.available() > 0) 
{
 
   
   String recData = " ";
    String recData2 = " ";

   while(Serial.available())
   {
     char c = Serial.read();
     if (Serial.available() > 0)
     {
       
     recData += c;
       
     delay(10);
     
   }
#14
comme pour la sd une clé usb pour y mettre les fichier pour l'impression
#15
Vos projets et Montages d'Électronique / De sd to USB
Octobre 26, 2022, 02:19:25 AM
Bonjour,

J'ai une imprimante résine sla laser. Elle a seulement une sortie sd pour les fichiers contenant les gcodes, j'aimerai convertir par une sortie usb. Quelle solution imaginez vous?
merci d'avance