Vai al contenuto
PLC Forum


Problema con arduino mega non va una funzione


Chris41

Messaggi consigliati

Ciao a tutti 

Rieccomi con un problema per me di difficile risoluzione visto che le mie capacita nella programmazione di arduino sono limitate , di questo mi scuso in partenza con tutti voi.

Sto cercando di realizzare un altra macchina spela taglia filo , la prima funziona correttamente grazie al vostro aiuto , ma è più un giocattolo , vorrei realizzare una macchina più performante e che si adatti più facilmente alle varie misure dei fili da tagliare .

Ho trovato un progetto molto interessante che adatterò sia nella parte software che meccanica alle mie esigenze , per or sono ancora allo stato embrionale del progetto ho programmato arduino e sto provando le varie parti e funzionalità , per ora ho trovato un paio di difetti :

1 ) a volte il display non funziona correttamente appaiono caratteri strani ed incomprensibili 

     anche resettando arduino non si sistema il difetto , va spento e riacceso per tornare ad un funzionamento regolare 

2 ) nel programma caricato in arduino c'è la possibilità di settare il punto zero per la distanza della lama . con la possibilità di 

     settare la corsa della spelatura e la corsa del taglio filo , ma non funziona , non mi appare da nessuna parte questa funzione .

Premetto che ho programmato arduino collegato il display oled 16x2 un encoder il sensore magnetico e nulla più , mi funziona la possibilità di inserire tutti i valori di quantità , misura filo e misura spelatura e quando do il run mi parte il taglio con il conteggio dei pezzi da tagliare ma non mi appare la pagina di regolazione punto zero .

Qualcuno sa aiutarmi .

Allego lo schizzo caricato in arduino 

#include <Adafruit_CharacterOLED.h>
#include <AccelStepper.h>
#include <Bounce2.h>
#include <Encoder.h>

// READ ME READ ME 
// This is a slightly modified version of the original E14 project From student workers at Weber State University Automotive program. That being said, the wiring is VERY similar, and we will have a seperate file that is specifically
// for the schools specific system for our systems differs from the Element14 version in mechanical operation, but again has extremely similar wiring. There was real effort to follow the instructions as close as possible, and reflect it in our builds. Please file an issue on github if you need assistance, though turn around times may vary.
// 
//For the buttons and encoder info, we built a break out board to handle the repeated need for the 5v and GND bus, as long as the pins match, 
//and requirements are followed for the pins, it should be fine. While looking at the bottom of the encoder with the pins being on the bottom looking at the pcb, the goes as- 
//follows, pin 1 is GND, pin 2 is 5V, pin 3 to pin 4 on arduino, pin 4 to pin 3 on arduino, pin 5 to pin 2 on arduino. We found that the button we have installed next to the encoder-//
//on the panel seems to not have a use at this time.
#define ENCODER_DO_NOT_USE_INTERRUPTS
#define PIN_ENABLE_FEED 21 // this is the enable for the feed stepper motor, make sure is installed, labeled as th EN slot on the driver, and has a brown wire in our case with our wiring harness. 
#define PIN_ENC_A 3 //for the encoder switch 
#define PIN_ENC_B 2 // for the encoder switch
#define PIN_BUTTON_ENC 4 //the actual button in the encoder that is clicked
#define PIN_BUTTON_RED 13 //again, not used we think, will adjust accordingly. 
#define PIN_LED 13   // we dont know what this does yet. 
#define PIN_SENSOR A8 //moved to a8 due to a0 being occupied (RED wire to 5V, BLACK wire to GND, BLUE wire to A8) https://www.farnell.com/datasheets/47017.pdf
#define WIRE_QUANT_MIN 1
#define WIRE_QUANT_MAX 100
#define WIRE_MIN_LEN 5 
#define WIRE_AWG 22


Adafruit_CharacterOLED lcd(OLED_V2, 6, 7, 8, 9, 10, 11, 12); //from the back of the screen, from left to right, the pins are as follows, pin 1 goes to GND, pin 2 to 5v, pin 3 to pin 12 arduino,- 
//- pin4 to pin 11 arduino, pin 5 to pin 10 arduino, pin 6 to pin 9 arduino, pin 7&8&9&10 unused. pin 11 to pin 8 arduino, pin 12 to pin 7 arduino, pin 13 to pin 6 arduino, pin 14 unused, pin 15 to 5v, pin 16 to GND 

AccelStepper stepCut(1, 19, 18); // (DRIVER, STEP, DIR)// the "1" after stepCut indicates the use of a motor driver module, pins to the arduino are as follows, 5V to 5V, step to arduino pin 19, dir to arduino pin 18, we dont have a current resistor and is set to OPEN. 
// for the stepper motor to the driver for the cutter on the larger motor driver, red to a, blue to a-, green to b, black to b-,  

AccelStepper stepFeed(1, 15, 14); // (DRIVER Type, step, dir) pinouts are as follows, DIR (Blue) to pin 14 on arduino, STEP (grey) to arduino pin 15, EN aka engage (brown) to arduino pin 21, COMM (yellow) to 5v, GND (black) to 24V GND, V+ (red) to 24V+. 
//3 wires are unused: TXD(green), RXD(black), CHOP (white).  
// for the stepper motor to the driver for the feeder, blue to b2, red to b1, green to a2, black to a1     https://www.omc-stepperonline.com/nema-17-bipolar-59ncm-84oz-in-2a-42x48mm-4-wires-w-1m-cable-and-connector.html?search=17hs19-2004s1//

Encoder encoder(PIN_ENC_A, PIN_ENC_B); 
Bounce buttonOK = Bounce();
Bounce buttonRED = Bounce();


int curSpool = 0; // in future, give each spool a unique id and track total length cut ( we are working on this, but is a later addition to our machine.)
int curSpoolRemaining = 0;

int mainMode = 0;
int subMode = 0;
int lastSubMode = -99;
int scrollPos = 0;
int lastScrollPos = -99;
long encPos = -999;
long lastEncPos = 0;

long retractPos = -3600; // how much should i be open, lower the number, smaller the hole, and make sure the blades are always touching. remove the "-" if needed the cutter head to move opposite direction.
long stripPos = -1000; // how small the gap for stripping. remove the "-" if needed the cutter head to move opposite direction.
long stripFeedDistance = 0;
long lengthFeedDistance = 0;
long cutPos = 200; //is the " how far do i need to go to make sure i cut it." remove the "-" if needed the cutter head to move opposite direction. add more to ensure a good clean cut, 
long targetPos = 0;
boolean isHomed = false;
int bladeCycleState = 0;
int sensorVal = 0;

uint16_t wireQuantity = 0;
uint16_t wireLength = 0; // in milimeters
uint16_t wireStripLength = 0; 
uint16_t wiresCut = 0;

float conductor_diam = 0.64516; // 22 AWG
float feed_diam = 22.0; // uncalibrated!
float feed_circum = PI * feed_diam; // 69.115mm per rev
//float feed_res = feed_circum / 200.0; // .346mm per step
float feed_res = 0.346;

// Z travel is 1/16" (1.5875mm) per revolution
// both motors are 1.8deg per step (200 per revolution)
// the cut motor driver has a noncofigurable default 10x microstepping rate
// so z resolution = 0.00079375mm per "full" step sent
// leaving us with ~1260 steps per mm z travel

boolean ledState = 0;
long curTime = 0;
long lastTime = 0;
int deltaTime = 100;

void setup(){

  Serial.begin(115200);
  lcd.begin(16, 2);
  lcd.print("AWCS READY!");
  stepCut.setPinsInverted(true, true);
  stepFeed.setPinsInverted(true, true);
  stepFeed.setMaxSpeed(2000);
  stepFeed.setAcceleration(6000);
  stepCut.setMaxSpeed(20000);
  stepCut.setAcceleration(40000);
  pinMode(PIN_ENABLE_FEED, OUTPUT);
  pinMode(PIN_BUTTON_ENC, INPUT_PULLUP);
  pinMode(PIN_BUTTON_RED, INPUT_PULLUP);
  pinMode(PIN_LED, OUTPUT);
  buttonOK.attach(PIN_BUTTON_ENC);
  buttonRED.attach(PIN_BUTTON_RED);
  buttonOK.interval(5);
  buttonRED.interval(5);
  
  digitalWrite(PIN_ENABLE_FEED, LOW);
  delay(200);
  digitalWrite(PIN_ENABLE_FEED, HIGH);
  delay(200);
  digitalWrite(PIN_ENABLE_FEED, LOW);
  //setZHOME():
  setBlade('H');
  //lcd.clear();
  printMenu();
  printCursor(0);
  subMode = 5;
  setBlade('R');
}

void loop(){
 // be sure to turn to comment below here during normal operation
  /*curTime = millis(); // VERY BASIC Calibration measurement
  if (curTime - lastTime > deltaTime){
    lastTime = curTime;
     getInput();
    //lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("POS:   ");
    lcd.setCursor(4, 0);
    lcd.print(scrollPos);
    lcd.setCursor(0, 1);
    lcd.print("SEN:    ");
    lcd.setCursor(4, 1);
    lcd.print(sensorVal);
    cutPos = 63 * scrollPos;
    stepCut.moveTo(cutPos);
  }
*/
  //be sure to turn to comment above here suring normal operation
  stepCut.run();
  
  getInput();
  
  switch(mainMode){
    
    case 0: // MAIN MENU
        switch(subMode){
          case 0: // choose quantity
            if( scrollPos != lastScrollPos){
              if (scrollPos > 999)scrollPos = 1;
              if (scrollPos < 1)scrollPos = 999;
              lastScrollPos = scrollPos;
              wireQuantity = scrollPos;
              lcd.setCursor(5, 0);
              lcd.print("   "); // clear
              lcd.setCursor(5, 0);
              lcd.print(wireQuantity);
            }
            if (buttonOK.fell())returnToMenu();
          break;
          case 1: // choose length (resolution of 5mm)
            if( scrollPos != lastScrollPos){
              if (scrollPos > 99)scrollPos = 0;
              if (scrollPos < 0)scrollPos = 99;
              lastScrollPos = scrollPos;
              wireLength = scrollPos * 5;
              lcd.setCursor(13, 0);
              lcd.print("   "); // clear
              lcd.setCursor(13, 0);
              lcd.print(wireLength);
            }
            if (buttonOK.fell())returnToMenu();
          break;
          case 2: // choose strip length (default strip both ends)
            if( scrollPos != lastScrollPos){
              if (scrollPos > 999)scrollPos = 0;
              if (scrollPos < 0)scrollPos = 999;
              lastScrollPos = scrollPos;
              wireStripLength = scrollPos;
              lcd.setCursor(5, 1);
              lcd.print("   "); // clear
              lcd.setCursor(5, 1);
              lcd.print(wireStripLength);
            }
            if (buttonOK.fell())returnToMenu();
          break;
          case 3: // run
              subMode = 5;
              mainMode = 1; // RUN!
              lcd.clear();
              lcd.home();
              lcd.print("NOW CUTTING:");
              printJobStatus();
              setBlade('R');
              stepFeed.setCurrentPosition(0);
              stripFeedDistance = 32* round(float(wireStripLength)/feed_res); // if you need to spin the motors the other way, add a "-" in front o fthe 32 to change direction on both
              lengthFeedDistance = 32* round((2.0*float(wireStripLength))/feed_res); // this was a problem child, might work for your application, replace with version in next line if problems arise as this so far "works" needs better testing for us
              // lengthFeedDistance = -(32* ((wireLength - 2*(wireStripLength))/feed_res));
              Serial.print("FEED STEPS: ");Serial.println(stripFeedDistance);
              Serial.print("FEED DIST: ");Serial.println(lengthFeedDistance);
              
          break;
          case 4: // clear
            resetParameters();
            printMenu();
            returnToMenu();
          
          break;
          case 5: // scrolling
            if( scrollPos != lastScrollPos){
              if (scrollPos > 4)scrollPos = 0;
              if (scrollPos < 0)scrollPos = 4;
              lastScrollPos = scrollPos;
              printCursor(scrollPos);
              }
              if (buttonOK.fell()){
                subMode = scrollPos;
                //delay(200);
            }
          break;
        }
    break;
    
    case 1: // RUN
    
      // loop through quantity, allow mid-job canceling
      switch (bladeCycleState){
        case 0: // initial retract, then feed length of strip
          if (stepCut.distanceToGo() == 0){ // allow the blade to retract
            printJobStatus(); // show wire X of N wires
            bladeCycleState++;
            stepFeed.setCurrentPosition(0);
            stepFeed.moveTo(stripFeedDistance); // feed length of strip
          }
        break;
        case 1: // feed, then strip
          if (stepFeed.distanceToGo() == 0){ // allow strip length to fininsh feeding
            bladeCycleState++;
            setBlade('S');
          }
        break;
        case 2: // strip, then retract
          if (stepCut.distanceToGo() == 0){ // allow time to strip
            bladeCycleState++;
            setBlade('R');
          }
        break;
        case 3: // retract, then feed length of wire
          if (stepCut.distanceToGo() == 0){ // allow retraction
            bladeCycleState++;
            stepFeed.setCurrentPosition(0);
            stepFeed.moveTo(lengthFeedDistance);
          }
        break;
        case 4: // feed, then strip
          if (stepFeed.distanceToGo() == 0){ // allow feed movement etc.
            bladeCycleState++;
            setBlade('S');
          }
        break;
        case 5: // strip, then retract
          if (stepCut.distanceToGo() == 0){ // allow feed movement etc.
            bladeCycleState++;
            setBlade('R');
          }
        break;
         case 6: // retract, then feed
          if (stepCut.distanceToGo() == 0){ // allow feed movement etc.
            bladeCycleState++;
            stepFeed.setCurrentPosition(0);
            stepFeed.moveTo(stripFeedDistance);
          }
        break;
        case 7: // retract, then feed
          if (stepFeed.distanceToGo() == 0){ // allow feed movement etc.
            bladeCycleState++;
            setBlade('C');
          }
        break;
        case 8: // cut, then retract and loop if more wires need to run.
          if (stepCut.distanceToGo() == 0){ // allow feed movement etc.
            bladeCycleState = 0;
            wiresCut++;
            setBlade('R');
          }
        break;
      }
 
      // return to main menu when done or cancel the job
      if (buttonRED.fell() || wiresCut >= wireQuantity){
        mainMode = 0;
        resetParameters();
        subMode = 5;
        returnToMenu();
        printMenu();
        printCursor(0);
      }
    break;
    
  }
  // the motors only really move if there is a remaning position to travel,
  // and this needs to be called often enough that nesting it 
  // inside some other function doesn't . much, so we'll just keep the .run() here
  stepFeed.run();
  stepCut.run();
  
  

} // END MAIN LOOP

void printJobStatus(){
   lcd.setCursor(0, 1);
   lcd.print("WIRE     OF   ");
   lcd.setCursor(5, 1);
   lcd.print(wiresCut+1);
   lcd.setCursor(11, 1);
   lcd.print(wireQuantity);
}

void setBlade(char bladePos){
  switch (bladePos){
    case 'H': // home
      while (!isHomed){
        curTime = millis();
        if (curTime - lastTime > 100){
          lastTime = curTime;
          sensorVal = analogRead(PIN_SENSOR);
          if (sensorVal < 430){  //change me to adjust the home 
            targetPos += 63; //this is how fast and accurate i find home (which is a closed cutter with no gaps)
            stepCut.moveTo(targetPos);
          } else {
            isHomed = true;
            stepCut.setCurrentPosition(0);
          } 
        }
        stepCut.run();
      }
    break;
    case 'R': // retract
      stepCut.moveTo(retractPos);
    break;
    case 'S': // strip
      stepCut.moveTo(stripPos);
    break;
    case 'C': // cut
      stepCut.moveTo(cutPos);
    break;
  }
}

void returnToMenu(){
  scrollPos = subMode;
  subMode = 5;
}

void printCursor(int cursorPos){
  //clear old cursor positions
  lcd.setCursor(0, 0);
  lcd.print(" ");
  lcd.setCursor(8, 0);
  lcd.print(" ");
  lcd.setCursor(0, 1);
  lcd.print(" ");
  lcd.setCursor(8, 1);
  lcd.print(" ");
  lcd.setCursor(12, 1);
  lcd.print(" ");
  switch(cursorPos){
    case 0:
      lcd.setCursor(0, 0);
      lcd.print(">");
    break;
    case 1:
      lcd.setCursor(8, 0);
      lcd.print(">");
    break;
    case 2:
      lcd.setCursor(0, 1);
      lcd.print(">");
    break;
    case 3:
      lcd.setCursor(8, 1);
      lcd.print(">");
    break;
    case 4:
      lcd.setCursor(12, 1);
      lcd.print(">");
    break;
  }
}

void printMenu(){
  lcd.setCursor(0, 0);
  lcd.print(" QTY:    WRL:   ");
  lcd.setCursor(0, 1);
  lcd.print(" STL:    RUN CLR");
}

void resetParameters(){
  wireQuantity = 0;
  wireLength = 0;
  wireStripLength = 0;
  wiresCut = 0;
  bladeCycleState = 0;
  stripFeedDistance = 0;
  lengthFeedDistance = 0;
}

void getInput(){
  buttonOK.update();
  buttonRED.update();
  if (buttonOK.fell()){
    ledState = !ledState;
    digitalWrite(PIN_LED, ledState);
  }
  encPos = encoder.read();
  if (abs(encPos - lastEncPos) > 4){ // did the encoder move one detent?
    if (encPos - lastEncPos > 0){ // positive
      scrollPos++;
    } else { // negative
      scrollPos--;
    }
    lastEncPos = encPos;
  }
  sensorVal = analogRead(PIN_SENSOR);
}

Grazie a ttti 

Link al commento
Condividi su altri siti


11 ore fa, Chris41 ha scritto:

a volte il display non funziona correttamente appaiono caratteri strani ed incomprensibili 

     anche resettando arduino non si sistema il difetto , va spento e riacceso per tornare ad un funzionamento regolare 

 

Questo è un preblema noto e tipico dovuto all'assoluta mancanza di immunità ECMsia di arduino, sia dei moduli visualizzatori paralleli o I2C indifferentemente.

Questo problema si può, se non eliminare totalmente, limitare di molto con un adeguato filtraggio delle alimentazioni.

Rimane però ilproblema dei disturbi irradiatii. Il filtraggio della alimentazioni elimina i disturbi condotti, ma non quelli irradiati.

Quando si usano questi dispositivi per applicazioni in cui sono naturalmente presenti forti disturbi, dovuti alla commutazione di carichi reattivi, la parte irradiata di questi disturbi causa malfunzionamenti deifficili da eliminare.

 

12 ore fa, Chris41 ha scritto:

Qualcuno sa aiutarmi .

 

francamente ora non ho ne il tempo e nemmeno la voglia, di analizzare ettagliatamente il programma.

Purtroppo quando si usano programmi preconfezionati senza avere conoscenza della loro architettura dei dettagli, può capitare che non si riesca a farli funzionare a dovere.

Ti consiglio di analizzare il programma e spezzarlo a blocchi funzionali.

Il programma sembra ben strutturato, quindi se questa funzione esiste la dovresti riconoscere abbastanza facilmente.

Per curiosità puoi indicare dove lo hai reperito? un link sarebbe gradito.

Link al commento
Condividi su altri siti

16 ore fa, Chris41 ha scritto:

1 ) a volte il display non funziona correttamente appaiono caratteri strani ed incomprensibili 

     anche resettando arduino non si sistema il difetto , va spento e riacceso per tornare ad un funzionamento regolare 

Anche a me capitava. Risolvevo filtrando alimentazione, e accorciando il più possibile i collegamenti tra display e la scheda col microcontrollore. Non si resetta, riavviando il microcontrollore, perché i dati corrotti sono nel micro o nella memoria del display.

Modificato: da Gennar0
Link al commento
Condividi su altri siti

41 minuti fa, Gennar0 ha scritto:

perché i dati corrotti sono nel micro o nella memoria del display.

 

Esatto. Sui display che hanno interfaccia parallela a volte è presente in morsettiera il reset Hw che puoi comandare dal micro, così da avere il il reset di entrambi.

Però rimane il problema di fondo della totale mancanza di immunità ECM dei moduli arduino. Non è un difetto del modulo, visto che è stato progettato come sistema disviluppo a basso costo, quindi per imieghi in ambienti poco soggetti a disturbi. Quando lo si impiega in ambienti no idoneii si hanno di questi problemi.

Il filtraggio delle alimentazioni risolve il problema dei disturbi condotti, però permane quello dei disturbi irradiati.

Link al commento
Condividi su altri siti

8 minuti fa, Livio Orsini ha scritto:

però permane quello dei disturbi irradiati.

...ma per curiosità, le schermature che si usavano una volta non funzionano più ? 

Link al commento
Condividi su altri siti

3 ore fa, NovellinoXX ha scritto:

le schermature che si usavano una volta non funzionano più ? 

 

Quali schermature? E la scheda stessa che è sensibile ai disturbi EMC.

Non so se hai avuto modo di vedere, o comunque di documentarti sulle modalità che si adottano nella progettazione dei circuiti stampati per apparecchiature industriali, proprio per soddisfare alle direttive EMC relative all'imunità ai disturbi irradiati. Le prove di accettazione / certificazione sono molto severe sia in ordine ai disturbi condotti, sia ai disturbi irradiati; si controllano le emissioni ma anche, e soprattutto, l'immunità alle ricezioni.

A volte le dimensioni fisiche di una scheda industriale sembrano più che ridontanti rispetto alla componentistica, ma lo spazio in pù serve proprio per garantire le protezioni.

 

I moduli della famiglia arduino sono nati come un sistema di sviluppo Sw a basso costo, poi gli amatori ed i così detti "makers" se ne sono impossessati per realizzare opere amatoriali anche di notevole complessità. Però il tallone di achille originale è rimasto.

Il gruppo fondatore di arduino ha anche svuluppato un arduino di grado industriale, credo sia basato su di un micro a 32 bit (se ricordo bene) ma il costo è decisamente molto al disopra non solo dei cloni cinesi di arduino, ma anche dei moduli originali.

 

Contro i disturbi ricevuti da irradiazione non c'è altro da fare che racchiudere l'apparato in un contenitore schermante messo a terra. Poi però bisogna assicurarsi che ogni filo che entra ed esce sia adeguatamente filtrato e separato, perchè altrimenti quello che si tiene fuori dalla porta entra dagli spifferi delle finestre.🙂

Link al commento
Condividi su altri siti

Buongiorno a tutti o meglio buonasera

Grazie a tutti per il prezioso aiuto , ho provato ad usare un alimentatore da banco con dei filtri e sembra che il problema display con scritte strane si sia risolto , ho fatto diverse accensioni / reset da scheda arduino e tutto funziona correttamente , non ho più il problema di scritte strane .

Rimane il problema legato alla funzione di taratura lama punto zero , come dice il signor Livio Orsini scomporrò il programma fino a trovare la parte che riguarda questa funzione cercando di capire il motivo del suo mal funzionamento , spero di avere anche il vostro aiuto come sempre molto prezioso .

Adesso inizio e poi vi faccio sapere .

Grazie ancora a tutti questo è il link dove ho trovato il codice  https://community.element14.com/challenges-projects/element14-presents/project-videos/w/documents/3977/episode-368-arduino-automatic-wire-cutter-and-stripper

Link al commento
Condividi su altri siti

2 ore fa, Livio Orsini ha scritto:

Contro i disturbi ricevuti da irradiazione non c'è altro da fare che racchiudere l'apparato in un contenitore schermante messo a terra.

Proprio perchè conosco bene come vengono costruiti gli strumenti professionali (sotto: Wandel & Goltermann)

mi meraviglio che oggi sembrano passati di moda alcuni accorgimenti elementari.

 

 

image.jpeg.394c368a2b22c2cded6a9e74c54de2c1.jpeg

Link al commento
Condividi su altri siti

Da un indagine preliminare sul codice ho notato questa parte di codice :

 /*curTime = millis(); // VERY BASIC Calibration measurement
  if (curTime - lastTime > deltaTime){
    lastTime = curTime;
     getInput();
    //lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("POS:   ");
    lcd.setCursor(4, 0);
    lcd.print(scrollPos);
    lcd.setCursor(0, 1);
    lcd.print("SEN:    ");
    lcd.setCursor(4, 1);
    lcd.print(sensorVal);
    cutPos = 63 * scrollPos;
    stepCut.moveTo(cutPos);
  }
  stepCut.run();*/

Dalla riga 121 alla 138 sembra scritta come commento . a me sembra invece che sia questa parte di codice che da le istruzioni per fare la taratura ho provato a

spostare */ ora le righe appaiono come istruzioni di codice ma il risultato non cambia . proseguo con la ricerca 

Link al commento
Condividi su altri siti

21 minuti fa, Chris41 ha scritto:

ho provato a

spostare */

I commenti sono preceduti da // ogni linea e da /* , */ , per indicare inizio e fine più linee di commenti. Spostandola hai trasformato linee commento in codice.

Modificato: da Gennar0
Link al commento
Condividi su altri siti

10 minuti fa, Gennar0 ha scritto:

I commenti sono preceduti da // ogni linea e da /* , */ , per indicare inizio e fine più linee di commenti. Spostandola hai trasformato linee commento in codice.

Però spostando */ messo come dalla riga di codice qui sotto appare la pagina di taratura solo non funziona correttamente si accavallano le scritte e non funziona

 /**/curTime = millis(); // VERY BASIC Calibration measurement
Link al commento
Condividi su altri siti

43 minuti fa, Gennar0 ha scritto:

I commenti sono preceduti da // ogni linea e da /* , */ , per indicare inizio e fine più linee di commenti. Spostandola hai trasformato linee commento in codice.

Però spostando */ messo come dalla riga di codice qui sotto appare la pagina di taratura solo non funziona correttamente si accavallano le scritte e non funziona

 /**/curTime = millis(); // VERY BASIC Calibration measurement

Si lo avevo immaginato poi altra cosa strana è questa 

//lcd.clear();

Comunque se elimino /**/ dal codice e il doppio // davanti ad lcd .clear (); appare la pagina della taratura è funziona sembra in modo corretto , solo che non funziona più tutto il resto 

Link al commento
Condividi su altri siti

11 ore fa, NovellinoXX ha scritto:

Proprio perchè conosco bene come vengono costruiti gli strumenti professionali (sotto: Wandel & Goltermann)

mi meraviglio che oggi sembrano passati di moda alcuni accorgimenti elementari.

 

 

Wandel Und Golterman sono un ricordo di quasi 60 anni fa, era il mio primo impiego ed ero addetto ad un laboratorio metrologico di una multinazionale delle telecomunicazioni. Per farmi uno scherzo, i colleghi più anziani,mi affibbiarono come primo lavoro la riparazione di una eterodina W & G che aveva dato filo da torcere. Forse la fortuna del principiante, forse l'inesperienza che mi portò a seguire la procedura passo per passo, ma beccai il guasto saltuarioe feci una bellissima figura.

Di questi strumenti e dei R & S, ricordo la meccanica accuratissima, con tanti cassetti, cassettini, scatole escatolette.Tutto per schermare, segregarei vari circuiti; con condenstori passanti per accoppiare senza avere "buchi" nella schermatura.

 

Non è che son passati di moda, è che questi accorgimenti costano!

Oggi in ambito industriale si usano accorgimenti sofisticati ma meno costosi come, ad esempio le plastiche rivestite da sottili fogli di mumetal; hanno un ottimo effetto schermo, sono leggerisimi e, soprattutto, costano molto meno.

 

Per un amatore dilettante queste tecnologie non sono disponibili, a meno che con molta pazienza ed abilità se le costruisca. Deve per forza ricorrere, dove serve alla schermatura metallica.

 

PS Ti occupi di strumentazione professionale?

Link al commento
Condividi su altri siti

11 ore fa, Chris41 ha scritto:

ho provato ad usare un alimentatore da banco con dei filtri e sembra che il problema display con scritte strane si sia risolto ,

 

Diciamo meglio: è stato ridotto drasticamente.

Usando un buon alimentatore hai eliminato la via più facile per i disturbi, tanto per dare qualche numero si può ipotizzare una riduzione dello 80%.

 

Io solitamente uso un sistema, che mi ha sempre dato ottimi risultati. Uso un alimentatore SMPS che mi fornisce 12Vcc, in cascata metto un regolatore serie LM7809 che mi va ad alimentare arduino. Prima del 7809 metto un filtro "pgreco" con condesatore elettrolitico da 47µF, con bassissimo esr, un'induttore serie da 220µHy e un condensatore ceramico multistrato da 0,33µF; un filtro analogo li inserisco tra lm7809 ed arduino. Crando in modo maniacale i collegamenti di zero volt. I valori non sono critici, importante èusare induttori a bassissima resistenza interna.

 

Questo sbarra una via facile all'ingresso dei disturbi.

poi bisogna curare tutti gli ingressi e le uscite verso il campo, separando tutto galvanicamente.

Attenzione: i relè anche se asicurano una separazione galvanica, permettono lo scavalcamentoproprio per come sono disposti i contatti e l'avvolgimento.

Quindi separare il tutto con fotoaccoppiatori, tenere alimentazioni completamente distinte, anche nei percorsi dei cavi, di tutto quello che va in campo. Meglio ancora usare anche un'altra separazione per tutte quelle alimentazioni che commutano carichi reattivi.

 

Una precisazione Sw.

Il compilatore di arduino segue quasi tutte le regole dei compilatori "C", quindi i commenti sono eseguiti con "//" tipico per commentare una riga o parte di riga.Il commento "/* .... */" Si usa, solitamente per commentare più righe. Attenzione qunado si scrive /* tutto quello che segue è interpretato come commento sino alla chiusura con */. Se ci si dimentica, o si cancella la chiusura */, il compilatore lo interpreta come commento quindi non esegue la compilazione di tutte le righe.

Link al commento
Condividi su altri siti

1 ora fa, Livio Orsini ha scritto:

Ti occupi di strumentazione professionale?

Per svariati anni ho lavorato in ASST. Avevo a disposizione tutti gli strumenti 

del campo, prima per FDM  poi PCM . Mi e' capitato di riparare, un po come e capitato a te,  l'SPM-19.

Qui tocchiamo un tasto dolente, quando l'ASST fu soppressa, alla società subentrante interessava solo acquisire la rete nazionale.

Della strumentazione non interessava niente e mando' tutto in discarica.

Mi hanno riferito che gli operai incaricati lanciavano questi strumenti da 1' piano direttamente nel cassone

dell'autocarro diretto in discarica. Meno male che non ero presente quel giorno, li avrei uccisi!.

Un collega che ha assistito alla scena, conoscendomi, ha abbrancato un Tektronix 465 e lo ha nascosto e poi me lo ha portato a casa.

 

Modificato: da NovellinoXX
Link al commento
Condividi su altri siti

9 ore fa, NovellinoXX ha scritto:

Meno male che non ero presente quel giorno, li avrei uccisi!.

 

Effettivamente è un delitto da pena capitale, però il vero colpevole è il mandante, non gli esecutori comandati.😀

 

Certo che chi ha ordinato lo scempio doveva essere un vero idiota. Se proprio non sapeva che farsene poteva regalarli a qualche scuola professionale.

Link al commento
Condividi su altri siti

Il 5/6/2023 alle 20:15 , Gennar0 ha scritto:

I commenti sono preceduti da // ogni linea e da /* , */ , per indicare inizio e fine più linee di commenti. Spostandola hai trasformato linee commento in codice.

Però spostando */ messo come dalla riga di codice qui sotto appare la pagina di taratura solo non funziona correttamente si accavallano le scritte e non funziona

 /**/curTime = millis(); // VERY BASIC Calibration measurement

Si lo avevo immaginato poi altra cosa strana è questa 

//lcd.clear();

Comunque se elimino /**/ dal codice e il doppio // davanti ad lcd .clear (); appare la pagina della taratura è funziona sembra in modo corretto , solo che non funziona più tutto il resto

Buona eratutti 

Dopo svariate prove sul codice non sono arrivato a risolvere il problema , oggi poi ho ricevuto una risposta da un utente dal sito dove cera il codice , in realtà ho scoperto che ci sono due versioni di questo codice una si trova sul sito githube una dal sito che ho meso il link e l'utente con entrambi i codici a riscontrato lo stesso problema e anche lui non è riuscito a risolvere il problema , secondo lui il codice non è completo ne manca una parte che esegue il punto zero .

Diciamo che la cosa non è incoraggiante per me , proverò in questi giorni di fare ancora qualche prova ma non nutro grandi speranza .

grazie ancora a tutti , se ho delle novità vi terrò aggiornati 

Modificato: da Livio Orsini
Link al commento
Condividi su altri siti

10 ore fa, Chris41 ha scritto:

Diciamo che la cosa non è incoraggiante per me , proverò in questi giorni di fare ancora qualche prova ma non nutro grandi speranza .

grazie ancora a tutti , se ho delle novità vi terrò aggiornati 

 

Se tutto il resto funziona regolarmente è probabile che manchi proprio questa funzione.

Io ho fatto un'analisi un po' frettolosa, ma credo proprio che manchi questa funzione.

 

Io ti consiglierei di scriverla, non è difficile da farsi, se hai dei problemi possiamo aiutarti a realizzarla.

Link al commento
Condividi su altri siti

10 ore fa, Livio Orsini ha scritto:

 

Se tutto il resto funziona regolarmente è probabile che manchi proprio questa funzione.

Io ho fatto un'analisi un po' frettolosa, ma credo proprio che manchi questa funzione.

 

Io ti consiglierei di scriverla, non è difficile da farsi, se hai dei problemi possiamo aiutarti a realizzarla.

Buonasera

Sig Livio Orsini la ringrazio per la disponibilità ,sabato con un del tempo in più provo a scrivere questa funzione effettivamente non dovrebbe essere complicato e se poi posso contare sul vostro aiuto ancor meglio , grazie ancora , in queste sere provo a rileggermi il codice e capire bene cosa fa effettivamente il sensore magnetico perchè sembra avere una funzione in questa regolazione ma non mi è ben chiaro quale sia , poi da li posso avere una base da cui partire ..

 

Link al commento
Condividi su altri siti

Se pubblichi i dati relativi acome è fatta la macchina; ad esempio se c'è un encoder e quali sono le sue caratteristiche, tipo di motore, sensori per limite corsa, etc., si può avere un'idea migliore di cosa ti serve.

Link al commento
Condividi su altri siti

Crea un account o accedi per commentare

Devi essere un utente per poter lasciare un commento

Crea un account

Registrati per un nuovo account nella nostra comunità. è facile!

Registra un nuovo account

Accedi

Hai già un account? Accedi qui.

Accedi ora
×
×
  • Crea nuovo/a...