Steuerung der Motoraktivität vom PC aus
(EN google-translate)
(PL google-translate)
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:
  | 
  | 
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:
  | 
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 0-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 0-2: Processing-Programm: Über die horizontale Mausposition wird bestimmt, was gesendet wird.
material_motor_PWM2.zip - Arduino- und Processing-Projekt.
Aufgabe (mit Processing)
  |