Inhaltsverzeichnis

Software

Da wir nun unser Accelerometer auslesen können und die Daten auch an den PC senden können, müssen wir jetzt unseren Mikrocontroller Programmieren und dann ein Computer Programm schreiben, das die Daten liest und auswertet.

Mikrocontroller

Meine Schaltung basiert auf einem Atmega 8, daher ist der Code auch für diesen Ausgelegt. Für andere Controller der Atmega/Attiny reihe müssen evt die Bezeichner angepasst werden:

// main.c
 
#define F_CPU 16000000
#define ADC0 0
#define ADC1 (1 << MUX0)
#define ADC2 (1 << MUX1)
 
#include <avr/io.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <stdlib.h>
 
char ADCConvert8Bit(char channel)
{
	ADMUX &= ~((1 << MUX0) | ( 1 << MUX1) | (1 << MUX2) | (1 << MUX2) | (1 << MUX3));
	ADMUX |= channel;
	ADCSRA |= (1 << ADSC);
	while(ADCSRA & (1 << ADSC)){}
	return ADCH;
}
 
void SendData(char data)
{
	while(!(UCSRA & (1 << UDRE)));
	UDR = data;
}
 
int main(void)
{
	DDRC = 0;
	DDRD = (1 << PD1);
	PORTC = 0;
	PORTD = 0;
	DDRB = 0xff;
	PORTB = 0;
	char X = 0, Y = 0, Z = 0;
	uint16_t result = 0;
 
	ADMUX = (1 << REFS0) | (1 << ADLAR);
	ADCSRA = (1 << ADEN) | (1 << ADPS1);
 
	ADCSRA |= (1<<ADSC);
	while (ADCSRA & (1<<ADSC) ) {}
	result = ADCW;
 
	UCSRB = (1 << TXEN);
	UBRRL = 51;
 
	while(1)
	{
		X = ADCConvert8Bit(ADC0);
		Y = ADCConvert8Bit(ADC1);
		Z = ADCConvert8Bit(ADC2);
		SendData('X');
		SendData('Y');
		SendData('Z');
		SendData(X);
		SendData(Y);
		SendData(Z);
	}
 
 
	return 0;
}

Software

Um unsere Sensordaten auswerten zu können, müssen wir die Serielle Schnittstelle auslesen und die Daten extrahieren.
Wer sich die AVR-Firmware angeschaut hat, sieht das die Daten in der Form: „XYZxyz“, wobei xyz jeweils 3 1-Byte Zahlen darstellt. Das bedeutet für unser Programm das wir die Daten einlesen, nach dem Z suchen und die nächsten 3 Byte einlesen und diese als die Sensordaten für die X-, Y- und Z-Achse speichern. Die Daten werden fortlaufend gesendet.
Da ich häufiger mit C# arbeite, habe ich das Grundprogramm auch in C# geschrieben, was das ganze leider bisher auf Windows begrenzt, aber relativ einfach in C++ und dann auch Plattform-unabhängig umgeschrieben werden.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.IO.Ports;
 
namespace ConsoleAccelerometerTestprogramm
{
    class Program
    {
        static bool readData = false;
        static int dataCount = 0;
        static void Main(string[] args)
        {
            SerialPort AvrConnector;
            AvrConnector = new SerialPort("COM3", 19200);
            AvrConnector.DataBits = 8;
            AvrConnector.StopBits = StopBits.One;
            AvrConnector.DataReceived += new SerialDataReceivedEventHandler(AvrConnector_DataReceived);
            AvrConnector.Open();
            while (true) ;
        }
 
        static void AvrConnector_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            if (!(sender is SerialPort))
            {
                return;
            }
            SerialPort sp = sender as SerialPort;
            string data = sp.ReadExisting();
            foreach (char c in data)
            {
                if (dataCount >= 3)
                {
                    Console.Write("\n");
                    dataCount = 0;
                    readData = false;
                }
                if (c == 'Z' && !readData)
                {
                    Console.Write(c);
                    readData = true;
                    continue;
                }
                if (readData)
                {
                    dataCount++;
                    Console.Write(" ");
                    Console.Write(Convert.ToString((int)c));
                    continue;
                }
                Console.Write(c);
            }
        }
    }
}



<<Zurück | Startseite