kramann.info
© Guido Kramann

Login: Passwort:










Robuste Systemintegration
1 Grundlagen
..1.1 Newton
....1.1.1 LinearSchwinger
....1.1.2 Daempfung
....1.1.4 ODE
....1.1.5 Saaluebung
..1.2 NewtonEuler
....1.2.1 Traegheitsmomente
....1.2.2 Modellgleichungen
....1.2.3 Einfachpendel
..1.3 Scilab
....1.3.1 Erste_Schritte
....1.3.2 Skripte
....1.3.3 Funktionen
..1.4 Laplace
....1.4.1 Eigenwerte
....1.4.2 PT1
..1.5 Regleroptimierung
....1.5.1 Guetefunktion
....1.5.2 Heuristiken
....1.5.3 Scilab
..1.6 Einstellregeln
....1.6.1 Totzeit
....1.6.2 Methode1
....1.6.3 Methode2
....1.6.4 Scilab
..1.7 Zustandsregler
..1.8 Polvorgabe
..1.8 Polvorgabe_alt
..1.9 Beobachter
....1.9.1 Haengependel
..1.10 Daempfungsgrad
..1.11 Processing
....1.11.1 Installation
....1.11.2 Erste_Schritte
....1.11.3 Mechatronik
....1.11.4 Bibliotheken
....1.11.5 Uebung
....1.11.6 Snippets
......1.11.6.1 Dateioperationen
......1.11.6.2 Bilder
......1.11.6.3 GUI
......1.11.6.4 Text
......1.11.6.5 PDF
......1.11.6.8 Maus
......1.11.6.10 Zeit
......1.11.6.13 Animation
......1.11.6.15 Simulation
....1.11.7 Referenzen
..1.12 Breakout
2 Beispiel
3 Beispielloesung
4 Praxis
5 javasci
6 Fehlertoleranz1
7 Reglerentwurf
..7.1 Sprungantwort
..7.2 Messdaten
..7.3 Systemidentifikation
..7.4 Polvorgabe
..7.5 Beobachter
..7.6 Robuster_Entwurf
..7.7 SIL
8 Systementwicklung
9 Arduino
..9.1 Lauflicht
..9.2 Taster
..9.3 Sensor
..9.12 Motor_PWM1
..9.13 Motor_PWM2_seriell
..9.14 Motor_PWM3_analogWrite
..9.15 Scheduler
..9.20 AV
..9.21 Mikrofon
..9.22 Universal
....9.22.1 Laborplatine
....9.22.2 LED_Leiste
....9.22.3 Motortreiber
....9.22.4 Sensoreingaenge
....9.22.5 Taster
....9.22.6 Tests
....9.22.7 Mikrofon
....9.22.8 Lautsprecher
....9.22.9 Fahrgestell
..9.23 Zauberkiste
..9.24 OOP
....9.24.1 Uebungen
..9.25 AVneu
....9.25.1 Tests
..9.26 DA_Wandler
..9.27 CompBoard
....9.27.1 Tastenmatrix
....9.27.2 ASCIIDisplay
..9.28 CTC
..9.29 Tonerzeugung
10 EvoFuzzy
..10.1 Fuzzy
....10.1.1 Fuzzylogik
....10.1.2 FuzzyRegler
....10.1.3 Uebung9
....10.1.5 Softwareentwicklung
......10.1.5.1 AgileSoftwareentwicklung
......10.1.5.2 FuzzyRegler
......10.1.5.3 Uebung
....10.1.6 Umsetzung
......10.1.6.1 FuzzyRegler
......10.1.6.2 Simulation
......10.1.6.3 Optimierung
......10.1.6.4 Uebung
....10.1.7 Haengependel
......10.1.7.1 Haengependel
......10.1.7.2 Simulation
......10.1.7.3 FuzzyRegler
......10.1.7.4 Optimierer
......10.1.7.5 Genetisch
....10.1.8 Information
....10.1.9 Energie
..10.2 Optimierung
....10.2.1 Gradientenverfahren
....10.2.2 Heuristiken
....10.2.3 ModifizierteG
....10.2.4 optim
..10.3 Genalgorithmus
..10.4 NeuronaleNetze
....10.4.1 Neuron
....10.4.2 Backpropagation
....10.4.3 Umsetzung
....10.4.4 Winkelerkennung
..10.5 RiccatiRegler
11 Agentensysteme
12 Simulation
20 Massnahmen
21 Kalmanfilter
..21.1 Vorarbeit
..21.2 Minimalversion
..21.3 Beispiel
30 Dreirad
31 Gleiter
..31.1 Fehlertoleranz

9.24 Objektorientierte Programmierung mit Arduino

Die Objektorientierte Programmierung ermöglicht

  • eine bessere Modularisierung einzelner Programmkomponenten,
  • was wiederum weniger fehlerhaften Code zur Folge hat
  • und eine leichtere Wartbarkeit und Wiederverwendbarkeit gewährleistet.
  • Außerdem wird die Komplexität reduziert, was komplexere Projekte er

Über "Neuer Tab" können Zusatzfenster in der Arduino-IDE geöffnet werden. Hierin lassen sich in C++ Klassen formulieren, die dann über include-Befehle in das Hauptprogramm integriert werden können.

Verwenden Sie für die Tab-Namen die Endung .h

Erzeugen eines neuen Tabs

Bild 9.24-1: Erzeugen eines neuen Tabs

universalboard_regler.zip - Ausgangsprojekt

Beispielprojekt universalboard_regler2: OOP-Konzept für die Antriebseinheit

universalboard_regler2.zip - Antrieb über Klasse realisiert.
#include "Antrieb.h"

//Über die Taster wird die Richtung gewechselt.
//Zuordnung Analog zu Digital
//A0 = D18
//A1 = D19
//A2 = D20
//A3 = D21
//A4 = D22
//A5 = D23
//A6 = D24
//A7 = D25
//A8 = D26
//A9 = D27
//A10 = D28
//A11 = D29
int sensorwert = 0;
int stellgroesse=0;
int senden=0;

Antrieb antrieb;

void setup() 
{
    DDRB=255;      
    pinMode(2,INPUT);  
    digitalWrite(2,1); //Pullup-Widerstand
    pinMode(4, INPUT); 
    digitalWrite(4,1); //Pullup-Widerstand

    Serial.begin(9600); 
    
}

void loop() 
{
    sensorwert = analogRead(2);
    PORTB=(1<<(sensorwert>>6));     
    
    stellgroesse = (sensorwert-100);
    //linker Motor
    antrieb.links(127-stellgroesse);

    //rechter Motor
    antrieb.rechts(127+stellgroesse);
    
        //seriell senden:
        if(stellgroesse<0)
        {
             senden = -stellgroesse;
             Serial.write('-');
        }
        else
        {
             senden = stellgroesse;
             Serial.write('+');
        }
        Serial.write(48+(senden/1000)%10);
        Serial.write(48+(senden/100)%10);
        Serial.write(48+(senden/10)%10);
        Serial.write(48+(senden/1)%10);        
        Serial.write('\r');        
        Serial.write('\n');        
    
}

Code 9.24-1: Hauptprogramm von universalboard_regler2

#include "Arduino.h"

class Antrieb
{
    public:
        Antrieb()
        {
            //LINKER MOTOR
            //A5 als digitaler Ausgang, INPUT 3
            pinMode(23,OUTPUT);  
            //A0 als digitaler Ausgang, INPUT 4
            pinMode(18,OUTPUT);  
            digitalWrite(23,0); //1 eine Richtung
            digitalWrite(18,1); //0
            analogWrite(6,0);

            //RECHTER MOTOR
            //A4 als digitaler Ausgang, INPUT 2
            pinMode(22,OUTPUT);  
            //A1 als digitaler Ausgang, INPUT 1
            pinMode(19,OUTPUT);  
            digitalWrite(22,1); //1 eine Richtung
            digitalWrite(19,0); //0
            analogWrite(5,0);          
        }
    
        void links(int wert)
        {
            if(wert>0)
            {
                digitalWrite(23,0); //1 eine Richtung
                digitalWrite(18,1); //0              
                analogWrite(6,wert);
            }
            else
            {
                digitalWrite(23,1); //0 andere Richtung
                digitalWrite(18,0); //1              
                analogWrite(6,-wert);
            }
        }
        void rechts(int wert)
        {
            if(wert>0)
            {
                digitalWrite(22,1); //1 eine Richtung
                digitalWrite(19,0); //0
                analogWrite(5,wert);
            }
            else
            {
                digitalWrite(22,0); //0 andere Richtung
                digitalWrite(19,1); //1
                analogWrite(5,-wert);
            }
        }
};

Code 9.24-2: Antrieb.h - Klasse mit Antrieb (zweiter Tab im Projekt)