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.13 Steuerung der Motoraktivität vom PC aus

Das Programm aus dem vorangehenden Kapitel wird so ergänzt, dass serielle Daten vom PC zur Steuerung des Motors dienen.

Mittels gtkterm (in Konsole eingeben) kann das Arduino-Programm getestet werden:

  • Es müßten lauter 'A' empfangen werden.
  • Bei Betätigen der Leertaste (ASCII-Code 32) läuft der Motor los.
  • Gesendet wird ein Byte im Wertebereich 0 bis 40.
  • Davon wird im Arduino-Programm 20 abgezogen, um den gewünschten PWM-Wert und die Richtungsinformation (Vorzeichen) zu erhalten.

Um den Motor besser vom PC aus steuern zu können, wird ausserdem ein Programm mit Processing realisiert. Damit dieses funktioniert, muss der bei Anschluß des Boards entstehende Fileeintrag in /dev, nämlich /dev/ttyACM0 auf einen als serielles Device erkennbaren gelegt werden. Dies kann mit einem symbolischen Link erfolgen:

  • ln -s /dev/ttyACM0 /dev/ttyS80

Nach Ausführen dieses Konsolenbefehls, kann das Arduinoboard sowohl über /dev/ttyACM0 als auch über /dev/ttyS80 angesprochen werden.

Arduino-Quelltext

int zaehler = 0;

int xPWM = 20; //0..40
int yPWM = 20; //0..20

void setup() 
{
  // put your setup code here, to run once:
  pinMode(9,OUTPUT);   //Ard. oben4=OutPin D9 ---- L293 Pin 15 Input4
  pinMode(4, OUTPUT);  //Ard. oben9=OutPin D4 ---- L293 Pin 10 Input3
  pinMode(3, OUTPUT);  //Ard. oben10=OutPin D3 ---- L293 Pin 10 Enable2, PWM
  
  pinMode(13, OUTPUT); //Board LED 
  
  //Eine Richtung festlegen und PWM aus:
  digitalWrite(4,HIGH);
  digitalWrite(9,LOW);
  digitalWrite(3,LOW);

  //LED aus  
  digitalWrite(13,LOW);
  
  Serial.begin(9600);  
}

void loop() 
{
    yPWM = xPWM-20;
    if(yPWM<0)        
        yPWM=-yPWM;
  
    digitalWrite(3,HIGH); //20 Ticks == 0,02 Sekunden entspricht 50Hz
    delay(yPWM);
    digitalWrite(3,LOW);
    delay(20-yPWM);
    
    if(zaehler==0)
        digitalWrite(13,HIGH);
    else if(zaehler==25)
        digitalWrite(13,LOW);
        
    while(Serial.available())     //..damit immer der aktuellste==letzte Wert genommen wird.   
        xPWM = (int)Serial.read(); //0..40  PWM-=20 => -20..20
        
    Serial.write('A');    
    if(xPWM>20)   
    {
       digitalWrite(4,HIGH);
       digitalWrite(9,LOW);
    }
    else
    {
       digitalWrite(4,LOW);
       digitalWrite(9,HIGH);
    }
    zaehler++;
    zaehler%=50;  //eine Sekunde == 50 PWM-Perioden
}

Code 9.13-1: Arduino-Programm: Steuerung des Motors über seriell empfangene Daten.

Processing-Quelltext

import processing.serial.*;
import processing.core.*; 
import fullscreen.*;  //um im Vollbildmodus starten zu können.
import codeanticode.gsvideo.*;

Serial myPort;  // Create object from Serial class
GSCapture webcam;


void setup() 
{
  size(displayWidth, displayHeight);
  
  //Vorher symbolischen Link erzeugen:
  //ln -s  /dev/ttyACM0 /dev/ttyS80
  //ev. ändert sich der Port:  
  //ln -s  /dev/ttyACM1 /dev/ttyS81  
  //Lockdatei ev. von hand löschen:
  //sudo rm -f /var/lock/LCK..ttyS81    

  //delay(2000);
  myPort = new Serial(this,"/dev/ttyS81", 9600);    

  webcam = new GSCapture(this,640,480,"/dev/video0");
  //delay(2000);
  if(webcam!=null)  
      webcam.start();
  
  //delay(2000);
  frameRate(10);
  (new FullScreen(this)).enter();
}


void draw()
{
  clear();
  //background(0);
  fill(0);
  rect(0, 0, displayWidth, displayHeight);

  if ( myPort.available() >= 1) 
  {
      int PWM = (mouseX*40)/displayWidth;
      myPort.write(PWM);
      stroke(0,255,0);
      fill(0,255,0);
      text("PWM="+(PWM-20),20,displayHeight/2);

  }
  else
  {
      fill(0,0,255);
      stroke(0,0,255);
  }
  
  if(webcam!=null && webcam.available())
  {
     webcam.read();
     set(displayWidth-640,displayHeight-480,webcam);
  }
  
  line(mouseX,displayHeight/2,mouseX,displayHeight);      

    
}

Code 9.13-2: Processing-Programm: Über die horizontale Mausposition wird bestimmt, was gesendet wird.

material_motor_PWM2.zip - Arduino- und Processing-Projekt.
Aufgabe (mit Processing)
  • Zeichnen Sie in einem Processing-Programm drei verschieden farbige Quadrate nebeneinander.
  • Ein Klick auf das linke - der Motor dreht sich links herum,
  • ein Klick auf das rechte - der Motor dreht sich rechts herum,
  • ein Klick auf das mittlere - der Motor steht.