kramann.info
© Guido Kramann

Login: Passwort:










EmbSyst
1 day_by_day
2 Eingebettete_Systeme
..2.1 Softwareentwicklung
....2.1.1 AgileSoftwareentwicklung
....2.1.2 Verhalten
....2.1.3 Entwurfsmuster
....2.1.4 FuzzyRegler
....2.1.5 Uebung
..2.2 Arduino
....2.2.1 Uebung1
..2.3 Android
....2.3.1 UML
......2.3.1.1 Volumenberechnung
......2.3.1.2 UML_Klassendiagramm
......2.3.1.3 Konstruktor
......2.3.1.4 Statische_Variable
....2.3.2 bluej
....2.3.3 Threads
....2.3.4 Interfacedesign
....2.3.5 Android
......2.3.5.1 Getting_Started
......2.3.5.2 App
......2.3.5.3 Beispielprojekt
........2.3.5.3.1 Richtlinien
........2.3.5.3.2 Anforderungen
........2.3.5.3.3 Layout
........2.3.5.3.4 Projekt_einrichten
........2.3.5.3.5 Refactoring
........2.3.5.3.6 Icon
........2.3.5.3.7 Icon2
........2.3.5.3.8 Kurzanleitung
........2.3.5.3.9 Architektur
........2.3.5.3.10 Anwendungsklasse
......2.3.5.4 Threads
......2.3.5.5 Activities
......2.3.5.6 Was_ist_wo
......2.3.5.7 Regelungssysteme
........2.3.5.7.1 Servo
........2.3.5.7.2 Fahrzeug
......2.3.5.8 ADB_Apps
......2.3.5.9 Veroeffentlichen
......2.3.5.10 Einzelheiten
........2.3.5.10.1 Bildschirmaufloesung
........2.3.5.10.2 Parameter
........2.3.5.10.3 Permission
........2.3.5.10.4 Latenzzeit
......2.3.5.11 Tonerkennung
........2.3.5.11.1 Wahrscheinlichkeitsrechnung
........2.3.5.11.2 Kovarianz_Scilab
........2.3.5.11.3 Java_Threads
........2.3.5.11.4 Java_Reflection
....2.3.6 Processing
......2.3.6.1 Installation
......2.3.6.2 Erste_Schritte
......2.3.6.3 Mechatronik
......2.3.6.4 Bibliotheken
......2.3.6.5 Uebung
......2.3.6.6 Snippets
........2.3.6.6.1 Dateioperationen
........2.3.6.6.2 Bilder
........2.3.6.6.3 GUI
........2.3.6.6.4 Text
........2.3.6.6.5 PDF
........2.3.6.6.8 Maus
........2.3.6.6.10 Zeit
........2.3.6.6.13 Animation
........2.3.6.6.15 Simulation
......2.3.6.7 Referenzen
....2.3.7 Android_Processing
......2.3.7.1 Basics
......2.3.7.2 Einrichten
......2.3.7.3 Crossplattform
......2.3.7.4 sinus
......2.3.7.5 sample
......2.3.7.6 analyse
......2.3.7.7 synthese
......2.3.7.8 Hilfsapps
......2.3.7.9 Eigene_Library
....2.3.8 Processing_VR
....2.3.9 Shapes3D
....2.3.10 TextToSpeech
....2.3.11 Internetprogrammierung
......2.3.11.1 Codegenerierung
......2.3.11.2 PHP_Programmierung
......2.3.11.3 PHP_OOP
......2.3.11.4 Java
......2.3.11.5 UDP
......2.3.11.6 Internetkontrolle
........2.3.11.6.1 Kamerabild
....2.3.12 OSC
......2.3.12.1 Datenaustausch
......2.3.12.2 i2audiolab
......2.3.12.3 Ardour
....2.3.13 Netzwerkprogrammierung
....2.3.14 JNI
....2.3.15 Erweitern
......2.3.15.1 sprich
......2.3.15.2 spiel
....2.3.16 thbvr
....2.3.17 Reflection
....2.3.18 Script
....2.3.19 Java3D
3 Echtzeitprogrammierung
..3.1 Echtzeit
..3.2 Korrektheit
..3.2 Semaphoren
..3.3 Hardware
..3.5 Synchronprogramm
..3.6 Zustandsmaschine
..3.7 Arduino
....3.7.1 Uebung
....3.7.2 RTOS
....3.7.3 Scheduler
....3.7.4 Semaphor
......3.7.4.1 Laufkatze
......3.7.4.2 Java
......3.7.4.3 Semaphor
....3.7.5 Messages
..3.8 Android
....3.8.2 Threads
......3.8.2.1 Java
......3.8.2.2 Synchronisierung
..3.9 Petrinetze
....3.9.1 Installation
....3.9.2 Test
4 KI
..4.1 Unueberwachtes_Lernen
..4.2 Agentensysteme
....4.2.1 Architekturen
......4.2.1.1 Verhalten
......4.2.1.2 Entwurfsmuster
....4.2.2 SUMO
......4.2.2.1 GettingStarted
......4.2.2.2 Antrieb
......4.2.2.3 Sensoren
......4.2.2.4 Zeitbasis
......4.2.2.5 Fernsteuerung
......4.2.2.6 Umsetzung_Fernst
......4.2.2.7 Fernsteuerung3
......4.2.2.10 Umsetzung
......4.2.2.11 Sockelsoftware
......4.2.2.12 Plan
......4.2.2.13 Lernen
........4.2.2.13.1 Parameter
........4.2.2.13.2 Identifikation
........4.2.2.13.3 Java
..4.3 Genetische_Algorithmen
....4.3.1 Heuristiken
....4.3.2 Genalgorithmus
..4.4 Kalmanfilter
....4.4.1 Vorarbeit
....4.4.2 Minimalversion
....4.4.3 Beispiel
5 Bildverarbeitung
..5.1 Gestalttheorie
..5.2 Bildverarbeitung
6 Technische_Systeme
..6.1 Kulturgeschichte
..6.2 Technikphilosophie
..6.3 Anthropozaen
7 Literatur
kramann.info
© Guido Kramann

Login: Passwort:




Übung in Echtzeitsysteme: PWM für Servo erzeugen

(EN google-translate)

(PL google-translate)

Ausgehend von einem einfachen Programm und einer einfachen Verstärkerschaltung für den Audioausgang, soll ein Programm entwickelt werden, das es erlaubt direkt zwei Servos über den Auduiausgang angesteuert werden.

Teil 1 - Nachvollziehen eines einfachen Tests, um digitale Pulse an einen Mikrocontroller zu schicken

package processing.test.avrconnect1;

import processing.core.*; 

import android.media.AudioTrack;
import android.media.AudioFormat;
import android.media.AudioManager;

public class avrconnect1 extends PApplet {


boolean aktiv = false; 

int sr;
int buffsize;

//create an audiotrack object
AudioTrack audioTrack;

public int PULSE = 15;
public int pulse = 0;

short[] samples;
int amp = 10000;
float twopi = 2.0f*PI;
float fr = 440.0f;
float fr2 = 4.4f;
float fr4 = 1.1f;
float fr3 = 220.0f;
float ph = 0.0f;   
float ph2 = 0.0f;   
float ph3 = 0.0f;   
float ph4 = 0.0f;   
float change=0.0f;
float change2=0.0f;

Tonspieler tonspieler;


public void setup()
{
	sr = 44100;

	buffsize = AudioTrack.getMinBufferSize(sr, AudioFormat.CHANNEL_OUT_MONO, 
	        AudioFormat.ENCODING_PCM_16BIT);

	//create an audiotrack object
	audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sr, 
	                                    AudioFormat.CHANNEL_OUT_MONO, 
	                                    AudioFormat.ENCODING_PCM_16BIT, 
	                                    buffsize, 
	                                    AudioTrack.MODE_STREAM);


	samples= new short[buffsize];
   
	tonspieler = new Tonspieler();
	
	Thread t = new Thread(tonspieler);
	t.start();
	audioTrack.play();
}

public void draw()
{
    clear();
    background(0);
    if(aktiv)    
        fill(0,255,0);
    else
        fill(255,0,0);    
    ellipse(width/2,height/2,width/2,height/2);

}

public void mousePressed()
{
    aktiv = !aktiv;
    pulse=0;
}

private class Tonspieler implements Runnable
{
	public void run()
	{
		int zaehler = 0;
		while(true)
		{
			if(aktiv)
			{
				  for(int i=0;i<buffsize;i++)
				  {  
					 if(zaehler<2 && pulse<PULSE)
					 {	 
					     samples[i] = Short.MAX_VALUE;
					     
					 }    
					 else
						 samples[i] = Short.MIN_VALUE;
//    					 samples[i] = (short)0;
				     zaehler++;
				     if(zaehler>=4)
				     {
				         pulse++;
				         zaehler=0;
				     }
				     
				  } 
				  audioTrack.write(samples, 0, buffsize);
				
			}
		}
	}
}


}

Code 0-1: Quelltext - Android-seitig

  • Erläuterung

Das Programm verschickt bei jedem Einschalten ( mousePressed(), aktiv==true ) 15 Rechteckpulse an den verbundenen Mikrocontroller.

android_eclipse_projekt.zip - Android/ Eclipse-Projekt zu obigem Quelltext.
#include<avr/io.h>

int main()
{
    unsigned char akku;
    unsigned char x;
    unsigned char zahl;
    
    DDRB=0;
	DDRA=0;
//	PORTA=255;
	PORTA=0;
	DDRC=255;

        akku=0;
	zahl=0;
	x=0;
	PORTC=zahl;




        while(1)
	{
	        akku=PINB;
		x=PINA;
	        if((akku & 0b00000001)>0)
		    zahl=0;
                if( (x & 0b00000001)>0)
		{
		    zahl++;
			while( (x & 0b00000001)>0)
			{
			    x=PINA;
			    DDRD=0;
			}
		}
		PORTC=zahl;
	}

}

Code 0-2: Mikrocontroller-Quelltext zum Versuch digitale Pulse über den Audio-Ausgang zu übertragen.

mikrocontroller_projekt.zip - zugehöriges Mikrocontroller-Projekt
Versuchsaufbau - digitale Pulse an Mikrocontroller übertragen.

Bild 0-1: Versuchsaufbau - digitale Pulse an Mikrocontroller übertragen.

Verwendete Verstärkerschaltung.

Bild 0-2: Verwendete Verstärkerschaltung.

Musterlösung
Verwendete Verstärkerschaltung für Servo-PWM-Signale.

Bild 0-3: Verwendete Verstärkerschaltung für Servo-PWM-Signale.

musterloesung.zip - Musterlösung: Wechsel zwischen -45 Grad, 0 Grad, +45 Grad über Touchscreen
package processing.test.avrconnect1;

import processing.core.*; 

import android.media.AudioTrack;
import android.media.AudioFormat;
import android.media.AudioManager;

public class avrconnect1 extends PApplet {


boolean aktiv = false; 

int sr;
int buffsize;
long PUFFERZEIT=0;
//create an audiotrack object
AudioTrack audioTrack;

public int PULSE = 400;
public int pulse = 0;

short[] samples;
int amp = 10000;
float twopi = 2.0f*PI;
float fr = 440.0f;
float fr2 = 4.4f;
float fr4 = 1.1f;
float fr3 = 220.0f;
float ph = 0.0f;   
float ph2 = 0.0f;   
float ph3 = 0.0f;   
float ph4 = 0.0f;   
float change=0.0f;
float change2=0.0f;

Tonspieler tonspieler;

int WERT = 0;

public void setup()
{
	sr = 44100;

	
	
	buffsize = AudioTrack.getMinBufferSize(sr, AudioFormat.CHANNEL_OUT_MONO, 
	        AudioFormat.ENCODING_PCM_16BIT);

	PUFFERZEIT = (1000*(long)buffsize)/sr;
	
	//create an audiotrack object
	audioTrack = new AudioTrack(AudioManager.STREAM_MUSIC, sr, 
	                                    AudioFormat.CHANNEL_OUT_MONO, 
	                                    AudioFormat.ENCODING_PCM_16BIT, 
	                                    buffsize, 
	                                    AudioTrack.MODE_STREAM);


	samples= new short[buffsize];
   
	tonspieler = new Tonspieler();
	
	Thread t = new Thread(tonspieler);
	t.start();
	audioTrack.play();
}

public void draw()
{
    clear();
    background(0);
    if(WERT==0)    
        fill(255,0,0);
    else if(WERT==1)
        fill(0,255,0);
    else
        fill(0,0,255);
    	
    ellipse(width/2,height/2,width/2,height/2);

}

public void mousePressed()
{
	WERT++;
	WERT%=3;
}

private class Tonspieler implements Runnable
{
	public void run()
	{
		int zaehler = 0;
		long zeit = System.currentTimeMillis();
		while(true)
		{
				  for(int i=0;i<buffsize;i++)
				  {  
					 if(zaehler<44+WERT*22)
					     samples[i] = Short.MAX_VALUE;
					 else
						 samples[i] = Short.MIN_VALUE;
				     zaehler++;
				     if(zaehler>=500)
				         zaehler=0;
				     
				  } 
				  audioTrack.write(samples, 0, buffsize);
				  
				  long restzeit = PUFFERZEIT-(System.currentTimeMillis()-zeit);
				  zeit=System.currentTimeMillis();
				  if(restzeit>0)
				  {
					  try
					  {
						  Thread.sleep(restzeit);
					  }
					  catch(Exception e)
					  {
						  
					  }
				  }
		}
	}
}


}

Code 0-3: Quelltext Musterlösung