Recent Posts

Pages: [1] 2 3 ... 10
1
Français / Re: Problème alimentation ardu...
Last post by PBZOOM - Today at 10:02 pm
bonsoir

la prise USB du Smartphone  doit être au moins  compatible
USB OTG  voir USB Host)
apparemment ce n'est pas le cas du Samsung A3 2017).
2
Am i better off creating a .h file all the main.ino functions that will be called externally like you would in ANSI C?
3
Motors, Mechanics, and Power / Re: My stepper won't run
Last post by Sere - Today at 10:01 pm
Please post your program and also post a link to the datasheet for your stepper motor.

These links may help
Stepper Motor Basics
Simple Stepper Code



Please display your image(s) in your post so we can see it(them) without downloading it(them). See this  Simple Image Guide

...R
Sure, sorry. I just modified my post. Hope someone will have some ideas.
4
Français / Re: Compter un signal pwm
Last post by Artouste - Today at 10:00 pm
Oui voilà c'est ça!
OK
Je vais essayer de remettre la main demain sur mon ancienne manip
5
Hello everyone,

I'm not very experienced at Arduino. Reading here onthe forums I noticed that using #define instead of defining a byte for pin numbers would save memory, hence why I'm trying to do this.

My application is not supposed to do anything specific yet, except from testing some stepper motors I bought online, through my RAMPS 1.4 driver board.

My question is: Why does my program not compile with following code (?):

Code: [Select]

#define X_STEP_PIN    = 54;
#define X_DIR_PIN     = 55;
#define X_ENABLE_PIN  = 38;
#define X_LS_LOW      = 3;
#define X_LS_HIGH     = 2;

void setup() {
  pinMode(X_STEP_PIN, OUTPUT);
}

void loop() {

}


When it can compile the following code (?):

Code: [Select]

byte X_STEP_PIN    = 54;
#define X_DIR_PIN     = 55;
#define X_ENABLE_PIN  = 38;
#define X_LS_LOW      = 3;
#define X_LS_HIGH     = 2;

void setup() {
  pinMode(X_STEP_PIN, OUTPUT);
}

void loop() {

}


Also I would like to know if it is correct to use 54 and 55 as digital inputs when using A0 and A1 as pinMode, INPUT, but I'll just test this if you guys don't have an answer for that.

Thanks in advance!
6
You create a header file with the function prototypes you need (function declarations). The location of the implementation (function definition) doesn't matter, as long as it's available to the linker.

Code: (main.ino) [Select]
#include "otherstuff.h"

int functionb() {
   return= a+b;
}

void setup() {}

void loop () {
  functiona();
}


Code: (otherstuff.h) [Select]
#pragma once

int functionb();


Code: (otherstuff.cpp) [Select]
#include "otherstuff.h"

void functiona() {
   z = functionb();
}


Pieter
7
Deutsch / Re: Zeigt her eure geilen Proj...
Last post by Rentner - Today at 09:57 pm
Also hier der Sketch, passte nicht mehr

Code: [Select]

/*
  Autor Heinz Baumstark Sept. 2018
  Simuliert eine Regelstreke PT2 mit einem PI Regler.
  Der Recheninterval beträgt 100ms. Nennbereiche sind -100..+100
  Die Parameter können über die serielle Schnttstelle mit
  Befehlen eingestellt werden. Folgende Befehle stehen zur Verfügung:

   soll=xx.x  Sollwert ändern (-100....+100)
   T1=xx.x    Verzögerung des ersten PT1 Glieds der Strecke
   T2=xx.x    Verzögerung des ersten PT2 Glieds der Strecke
   KS=xx.x    P-Verstärkung der Stecke
   KP=xx.x    P-Anteil des PI Reglers
   TN=xx.x    I-Anteil des PI Reglers Nachstellzeit  s
   CL=1 /CL=0 closed loop Regelkreis offen=0 geschlossen=1
   anz=xx     Anzeige Interval in ms
   start      startet den Lauf neu
   stop       stopt den Lauf

   mit den voreingestellte Parametern wird die Srungantwort der
   Strecke ausgegeben mit der Eingangsgrösse 10% und die
   Streckenverstärkung KS=1 und den Zeiten T1=3s, T2=3s


   ----------------------------------------------------------
*/

int CL = 0;      // closed loop
float t, ex, tdiv; // allgem. Variablen
bool lauf = LOW;  // Status run / stop

// Strecke Parameter
float Ue1, Ua1; // E/A Grössen 1. PT1 Glied
float Ue2, Ua2; // E/A Grössen 2. PT1 Glied
float T1 = 3.0; // Parameter Verzägerung 1. PT1 Glied
float T2 = 3.0; // Parameter Verzögerung 2. PT1 Glied
float KS = 1.0; // Proportional Wert der Gesamtstrecke

//Regler Parameter
float Yp, Yi, Y; // Ausgang Regelanteile
float Soll = 10.0;// Sollwert
float Rd; // Regeldifferenz
float Ist; // Regler Istwert Rückführung
float KP = 1.0; // P-Anteil
float TI = 0.0; // I-Anteil Nachstellzeit

String eingabe = "";
unsigned long startzeit; // Anfangszeit der der Simulation
unsigned long altzeit, paltzeit; // Hilfswerte
unsigned long anzinterval = 500; // Anzeigeintervall

void setup() {
  Serial.begin(9600);
  startzeit = millis();
  // Ausgabe der voreingestellte Werte
  Serial.println("Startparameter");
  Serial.print ("Sollwert "); Serial.println(Soll);
  Serial.print ("Strecke 1. Verz. T1 (s)"); Serial.println(T1);
  Serial.print ("Strecke 2. Verz. T2 (s)"); Serial.println(T2);
  Serial.print ("P-Verst. Strecke KS    "); Serial.println(KS);
  Serial.print ("Regler    KP "); Serial.println(KP);
  Serial.print ("Regler TN (s)"); Serial.println(TI);
  Serial.print ("Closed Loop  "); Serial.println(CL);
  Serial.print ("Anzeige Interval (ms) "); Serial.println(anzinterval);
  Serial.println("Eingabebefehl start / stop");

}

void loop() {

  if (millis() - altzeit >= 100UL && lauf == true) { // 100 ms
    tdiv = (millis() - altzeit) / 1000.0; // Zeitintervall
    altzeit = millis();
    t = (millis() - startzeit) / 1000.0; // Laufzeit gesamt

    // Regler bearbeiten
    if (CL == 1) { // Istwer benutzen colsed loop
      Ist = Ua2;
    }
    else { // open loop
      Ist = 0;
    }

    Rd = Soll - Ist;// Regeldifferen bilden
    Yp = Rd * KP; // P-Anteil
    if (TI > 0) Yi = Yi + Rd  * tdiv / TI; else Yi = 0; // Integral bilden

    if (Yi > 100) Yi = 100 ;  // I Anteil begrenzen
    if (Yi < -100) Yi = -100;

    Y = Yp + Yi; // PI Regler // gesamt Regler bilden und begrenzen
    if (Y > 100) Y = 100 ;
    if (Y < -100) Y = -100;

    // Strecke bearbeiten
    Ue1 = Y * KS;// Eingang verbinden mit Reglerausgang
    // erstes PT1 Glied
    ex = T1 / tdiv;
    Ua1 = ((Ua1 * ex) + Ue1) / (ex + 1);

    // zweites PT1 Glied
    Ue2 = Ua1; // Eingang verbinden mit Ausgang Ua1
    ex = T2 / tdiv;
    Ua2 = ((Ua2 * ex) + Ue2) / (ex + 1);

    if (millis() - paltzeit >= anzinterval) { // AnzeigeInterval
      paltzeit = millis();
      anzeige();
    }
  }
  lesen(); // Benutzer Eingabe lesen
}

void anzeige () {
  Serial.print(t); Serial.print("\t");
  Serial.print(Soll); Serial.print("\t");
  Serial.print(Y); Serial.print("\t");
  Serial.print(Ua2);
  Serial.println();
}

void lesen() {
  while (Serial.available()) { // Wenn was angekommen ist

    char zeichen = char (Serial.read());
    eingabe += zeichen; // Eingabestring bilden
    if (zeichen == '\n') { // ende erkannt
      Serial.print(eingabe); // Kontroll-Ausgabe

      // auswerten
      if (eingabe.startsWith ("start") && !lauf) { // Status laüft
        lauf = true;
        startzeit = millis();
        altzeit = millis();
        Serial.println("t\t Soll\t Y \t Ist"); // Kopfzeile ausgeben

      }
      if (eingabe.startsWith("stop")) {  // Status stop
        lauf = false;
        Serial.print(" T1="); Serial.print(T1);
        Serial.print(" T2="); Serial.print(T2);
        Serial.print(" KS="); Serial.print(KS);
        Serial.print(" KP="); Serial.print(KP);
        Serial.print(" TN="); Serial.print(TI);
        Serial.print(" CL="); Serial.print(CL);
        Serial.println();
        Serial.println("------------------------");
      }

      if (eingabe.startsWith("anz=")) {  // Anzeigeinterval
        String s = eingabe.substring(4);
        anzinterval = s.toInt();
      }

      if (eingabe.startsWith("soll=")) {  // Sollwert einlesen
        String s = eingabe.substring(5);
        Soll = s.toFloat();
      }
      if (eingabe.startsWith("T1=")) {  // Verz. 1 Glied
        String s = eingabe.substring(3);
        T1 = s.toFloat();
      }
      if (eingabe.startsWith("T2=")) {  // Verz. 2. Glied
        String s = eingabe.substring(3);
        T2 = s.toFloat();
      }

      if (eingabe.startsWith("KS=")) {  // Streckenverstärkung
        String s = eingabe.substring(3);
        KS = s.toFloat();
      }

      if (eingabe.startsWith("KP=")) {   // P Anteil Regler
        String s = eingabe.substring(3);
        KP = s.toFloat();
      }

      if (eingabe.startsWith("TN=")) {  //I Anteil Regler
        String s = eingabe.substring(3);
        TI = s.toFloat();
      }

      if (eingabe.startsWith("CL=")) {  // Status colose Loop
        String s = eingabe.substring(3);
        CL = s.toInt();
      }
      zeichen = "";
      eingabe = "";
    }
  }
}

8
Deutsch / Re: Zeigt her eure geilen Proj...
Last post by Rentner - Today at 09:56 pm
Hallo,
Ein Post vor einigen Tagen zum Thema Regelung hat mich dazu veranlasst mich selbst mal wieder mit dem Thema zu beschäftigen. Ich habe wärend meines Studiums vor 40 Jahren Regelungstechnik gemacht, allerdings damals mit Analogtechnik und meist dem LM741. Beruflich waren es dann GS-Antriebe später Servo, FU, Hydraulik, Heizung/Kühlung, Druck uund Mengenregelkreise im Maschinenbau.

Die Idee für diese Projekt war einen Simulator zu bauen mit dem an eine Regelstrecke mit einem PI Regler optimieren kann. Da viele einfache Regelstrecken eine Verzögerzng 2. Ordnung sehr ähnlich kommen habe ich also zwei PT1 Glieder hintereinander verwendet.

Der Sketch lässt sich über Befehle die man am Monitor eingibt steuern. Der Nennbereich für Eingaben ist für -100 bis 100 gedacht. Kann man also als Prozentwerte betrachten.

  soll=xx.x  Sollwert ändern (-100....+100)
  T1=xx.x    Verzögerung des ersten PT1 Glieds der Strecke
  T2=xx.x    Verzögerung des ersten PT2 Glieds der Strecke
  KS=xx.x    P-Verstärkung der Stecke
  KP=xx.x    P-Anteil des PI Reglers
  TN=xx.x    I-Anteil des PI Reglers Nachstellzeit  s
  CL=1 /CL=0 closed loop Regelkreis offen=0 geschlossen=1
  anz=xx     Anzeige Interval in ms
  start      startet den Lauf neu
  stop       stopt den Lauf

Der Sketch läuft auf einem UNO ohne zusätzliche Hardware in Verbindung mit dem Monitor oder einem anderen Terminal-Program. Wenn man ihn mit den Voreinstellungen startet wird nach dem Befehl start die Sprungantwort der Strecke numerisch ausgegeben. Mit den Parametern KS, T1,T2 kann man das Verhalten der Strecke ändern oder die Eingangsgrösse Ue1 mit dem Sollwert ändern. Parameter können jederzeit eingegeben werden und sind sofort wirksam. Änderungen werden in der Ausgabe mit angegeben, damit lässt sich u.A. ein neuer Abschnitt leichter finden. Bei T =0 verhält sich das PT1-Glied wie ein P-Glied. Durch die Eingabe des Befehls stop wird der Vorgang angehalten es erfolgt keinee Berechnung neuer Werte mehr. In der letzten Zeile werden die aktuelle Parameter angezeigt. Mit der erneuten Eingabe von Start beginnt der Vorgang neu mit t=0.  

Als nächstes kann man nun mittels dem Befehl CL=1 den offenen Regelkreis schliessen. Damit ist dann zunächst der P-Anteil des Regles wirksam, TN=0. durch ändern von KP kann der Regelkreis dann optimiert werden. Als letztes kann man dann mittes der Eingabe von TN>0 die Nachstellzeit und damit den I-Anteil eingeben. Durch mehrfaches änder des Sollwertes auf 0 und z.B 10 lässt sich das Regelverhalten numerisch aufzeichnen und durch stop und Erneutem start mit der Zeitachse beginnend mit Null ausgeben.

Die Anzeige auf dem Monitor kann man mit CTR C in die Zwischenablage kopieren und dann in eine Excel Tabelle einfügen. Damit man daraus ein XY Diagramm machen kann sollte man zunächst mittels Bearbeiten Suchen Ersetzen alle Decimalpunkte gegen ein Komma tauschen. Damit werden Inhalte der Zellen dann als Zahl erkannt. Als Beispiele im Anhang ein paar Grafiken dazu.

Viel Spass beim spielen  ;)

PS Sketch folgt
9
Motors, Mechanics, and Power / Re: Solenoid Control
Last post by silly_cone - Today at 09:55 pm
Thanks for correcting that, I was clearly mistaken.   :-[

Is there another name for the value at which the mosfet turns fully on, or is VGS under RDS(on) generally the best place to find it? 

And just to clarify, the relationship of voltage at the gate and current through drain is given in Figure 3 on the datasheet, correct?  If I'd have taken 3 seconds to look at that, I could've saved myself some embarrassment, and saved the OP bad advice.    :smiley-confuse: 
10
Assuming the .cpp and .ino are tabs in the same project (thus, they live in the same folder):

otherstuff.cpp:
Code: [Select]
int functionb();

void functiona()
{
   z= functionb();
}
Pages: [1] 2 3 ... 10