1000 kişiden bir kişi için ! devam.... 320volt blog

Elektronik Devreler Projeler » Atmel devreleri bilgiler »

Sineklik temizleme robotu atmel at90ls8535 böcek robot

Sineklik-temizleyici-robot-atmel-at90ls8535

Çok ilginç bir robot projesi pencelerelerdeki sineklikleri temizleme içintasarlanmış temizlikci robot sistemin beyni atmel at90ls8535 mikro denetleyicisi kaynak c yazılımı verilmiş.

Robot projesinin uygulayamasanızda devre bölümleri kaynak yazılım işinize yarayabilir özellikle motor sürücü bölümü h-bridge köprü bağlantılı mosfetli sürücü katı bulunuyor

Kaynak: Micro-Robotic-Fly-screen-cleaner alternatif link: temizleme-robotu-atmel-at90ls8535-bocek-robot.rar

Sineklik-temizleme-robotu-atmel-at90ls8535-bocek-robot

mrfisc.c yazılımı

/*********************************************
Project : MrFisc
Version : 1.0
Date    : 9/12/2003
Author  : Andrew Oudyn
Comments:
Firmware for the Mr Fisc
Micro Robotic Fly & Insect Screen Cleaner

Chip type           : AT90LS8535
Clock frequency     : 4.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 128
*********************************************/

// include files for this project
#include <90S8535.h>	//contains register information for the processor
#include <stdio.h>	// Standard Input/Output functions
#include <delay.h>	//Delay functions
#include <math.h>	//Maths library
#include <stdlib.h>	//for ftoa
#include "mrfisc.h"

//Set and read individual bits Macro
#define setBit(port, bitP, value) if (value == 1) { port = port | (1<<(bitP)); } else { port = port & ~(1<<(bitP)); }
#define getBit(port,bitP) ((port & (1<<(bitP)))>>(bitP))

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input;
// Start the AD conversion
ADCSR|=0x40;
// Wait for the AD conversion to complete
while ((ADCSR & 0x10) == 0);
ADCSR|=0x10;
return ADCW;
}

void check_status(void);
void motor(unsigned char action);
void wait(void);
void initialise(void);
void correct(void);
// Global Variables
float angle = 0;  	//the angle of Mr. FISC
float vBat = 0;   // Battery Status in Volts
signed int heading = 0; //the nearest integer value for the heading in degrees
unsigned char direction = HEAD_RIGHT; //always start at the top left so always go right
unsigned char whichway;

void main(void)
{
        unsigned char start = 1; //To signify program initialisation
        initialise();
        DDRC = SetPortC;	//0011 0000 set the port C to external input.
        whichway = STOPPED;
        wait();
        while (1)
        {
                if(PINC.RIGHT_SENSOR == 1)
                {
                	heading = 0;
                	start = 0;
                }
                else if(PINC.LEFT_SENSOR == 1)
                {
                	heading = 0;
                }
                else if(PINC.FRONT_SENSOR == 1)
                {
                	motor(STOP);
                	direction = HEAD_LEFT;
                	if(start == 0)
                	{
                		motor(STOP);
                		wait();
                		start = 1;
                	}
                	heading = TRAJECTORY; // heading in degrees
                }
                else if(PINC.BACK_SENSOR == 1)
                {
                	motor(STOP);
                	direction = HEAD_RIGHT;
                	if(start == 0)
                	{
                		motor(STOP);
                		wait();
                		start = 1;
                	}
                	heading = -TRAJECTORY; // heading in degrees
                }

              	correct();
        }
}
/* check_status() is used to read all of the ADC values going into the micro.
   These include the battery voltage, the X and Y tilt values from the
   accelerometer.  Port A is also used as a digital IO port and aswell
   as taking the anologue tilt readings, a digital version can also be
   obtained by pooling the two digital input pins, 4 and 5 and using a
   timer counter. Port A also control the Serial IC and the Charge pump.
   */
void check_status()
{
   	float xTilt = 0;	// Value of tilt in X direction
	float yTilt = 0;	// Value of tilt in Y direction
	float xTiltDigi = 0;
   	int countT1 = 0;        // time in counts for high pulse
   	int countT2 = 0;        // time in counts for low pulse
   	char buffer[] = {0,0,0,0,0,0,0,0,0,0};     // buffer to hold number sent to computer

   	//accelerometer sensativity (60mV x Vcc)/g = (198mV / g)
   	// "zero g" will be at Vcc/2 = 1.65
   	// use full 10 bit ADC total range of 3.3V / 2^10 = 1024
   	// Voltage step = 3.22mV / bit
   	// Battery Status
   	//tiltValue = (float)(read_adc(V_BAT));
   	vBat = (float)(read_adc(V_BAT)*VOLTS_PER_BIT);

        /* ******* ANALOGUE TILT READINGS ******* */
        //tiltValue = read_adc(X_TILT);  	//read the X tilt value
	xTilt = (float)read_adc(X_TILT)*VOLTS_PER_BIT;
	//tiltValue = read_adc(Y_TILT);	//read the Y tilt value
	yTilt = (float)read_adc(Y_TILT)*VOLTS_PER_BIT;  

	/* ******* DIGITAL TILT READINGS ******* */
	DDRA = SetPortA;   // 1100 0000
	// Y tilt readings
	// The actual time taken is irrelevent, it's the duty cycle that is important
	// so the delay to keep track of actual time is not required, so long as the
	// loops are the same.
	while(PINA.X_TILT_DIGI == 1){}
	while(PINA.X_TILT_DIGI == 0){}  //wait for clock to pulse
	while(PINA.X_TILT_DIGI == 1){ countT1++; }
	while(PINA.X_TILT_DIGI == 0){ countT2++; }
	xTiltDigi = ((float)countT1/(countT2 + countT1) - ZERO_G_CYCLE)/CYCLE_2_G;  

	/* ******* CALCULATING AND SENDING ANGLE ******* */
	setBit(PORTA, RS232_ON, 1); //turns on the serial IC
	delay_ms(1);
	angle = asin(xTiltDigi)*RADS_2_DEGS; //convert to degrees
	ftoa(angle, 4, buffer);
	printf("Mr. FISC's DIGITAL Y tilt readings show: %s r n", buffer);
	printf("Heading: %d r n", heading);
	if(whichway == FORWARD)
		printf("Mr. FISC is going FORWARD r n");
	else if(whichway == FORWARDLEFT)
		printf("Mr. FISC is going FORWARD and LEFT r n");
	else if(whichway == FORWARDRIGHT)
		printf("Mr. FISC is going FORWARD and RIGHT r n");
	else if(whichway == BACKWARDS)
		printf("Mr. FISC is going BACKWARDS r n");
	else if(whichway == BACKLEFT)
		printf("Mr. FISC is going BACK and LEFT r n");
	else if(whichway == BACKRIGHT)
		printf("Mr. FISC is going BACK and RIGHT r n");
	else if(whichway == STOPPED)
		printf("Mr. FISC ain't goin' NOWHERE r n");
	//ftoa(vBat, 3, buffer);
	//printf("The battery Voltage is: %s r n", buffer);
	delay_ms(10);
	setBit(PORTA, RS232_ON, 0); //turns off the serial IC 

}
void correct(void)
{
	check_status();
	if(direction == HEAD_RIGHT)
	{
		if(heading == 0)
		{
			if(angle >= STRAIGHTLINE)
			{ motor(RIGHT_FWD); whichway = FORWARDRIGHT; }
			else if(angle <= (0 - STRAIGHTLINE))
			{ motor(LEFT_FWD); whichway = FORWARDLEFT;}
			else
			{ motor(FWD); whichway = FORWARD; }
		}
		else
		{
			if(angle >= (heading + STRAIGHTLINE))
			{ motor(RIGHT_FWD); whichway = FORWARDRIGHT; }
			else if(angle <= (heading - STRAIGHTLINE))
			{ motor(LEFT_FWD); whichway = FORWARDLEFT; }
			else
			{ motor(FWD); whichway = FORWARD; }
		}
	}
	else if(direction == HEAD_LEFT)
	{
		if(heading == 0)
		{
			if(angle <= (0 - STRAIGHTLINE))
			{ motor(LEFT_REV); whichway = BACKLEFT; }
			else if(angle >= (STRAIGHTLINE))
			{ motor(RIGHT_REV); whichway = BACKRIGHT; }
			else
			{motor(REV); whichway = BACKWARDS;}
		}
		else
		{
			if(angle >= (heading + STRAIGHTLINE))
			{ motor(RIGHT_REV); whichway = BACKRIGHT; }
			else if(angle <= (heading - STRAIGHTLINE))
			{ motor(LEFT_REV); whichway = BACKLEFT; }
			else
			{ motor(REV); whichway = BACKWARDS; }
		}
	}
}
void motor(unsigned char action)
{
        //flag to determine if Mr FISC is already moving to prevent lots of stop starts
	if(action == FWD){ PORTB = MOTOR_FWD; }
	else if(action == REV){ PORTB = MOTOR_REV; }
	else if(action == LEFT_FWD){ PORTB = MOTOR_LEFT_FWD; }
	else if(action == RIGHT_FWD){ PORTB = MOTOR_RIGHT_FWD; }
	else if(action == LEFT_REV){ PORTB = MOTOR_LEFT_REV; }
	else if(action == RIGHT_REV){ PORTB = MOTOR_RIGHT_REV; }
	else if(action == STOP){ PORTB = MOTOR_STOP; }
} 

void wait(void)
{
	while(!((PINC.RIGHT_SENSOR == 1)&&(PINC.LEFT_SENSOR == 1)))
	{
                PORTD = ALL_RED; //1010 1000
                delay_ms(175);
                PORTD = ALL_GREEN; //0101 0100
                delay_ms(175);
	}
	PORTD = ALL_OFF;
	delay_ms(500);
        PORTD = POWERON;	//1100 1100 lights on...
}
void initialise(void)
{
        // UART initialization Communication Parameters: 8 Data, 1 Stop, No Parity
        UCR=0x18; // UART Receiver: On UART Transmitter: On UART Baud rate: 9600
        UBRR=0x19;
        ACSR=0x80;    // Analog Comparator initialization
        ADCSR=0x85;   // ADC Clock frequency: 125.000 kHz
        // Port A initialization
        PORTA = StartPortA;     //1000 0000
        DDRA = SetPortA;  	//O,O,I,I, I,I,I,I
        // Port B initialization
        PORTB = StartPortB;     //0000 0000
        DDRB = SetPortB;    	//I,I,I,I, O,O,O,O
        // Port C initialization
        PORTC = StartPortC;     //0000 0000
        DDRC = SetPortC;   	//I,I,O,O, I,I,I,I
        // Port D initialization
        PORTD = StartPortD;     //1111 1100
        DDRD = SetPortD;  	//O,O,O,O, O,O,X,X
}	

Yazar: gevv

Yazarımızın 320volt.com Blog üzerinde şu an okuduğunuz yazı dahil 1959 yazısı bulunmaktadır. Yazarımız hakkında bilgileri ve diğer yazılarını görmek için bakınız;

Elektronik

Yorum yapın

Doğrulama: (kutuyu işaretleyiniz)

  • Lütfen Türkçe imla kurallarına dikkat etmeye özen gösteriniz.
  • Yorumunuz yönetici tarafından kontrol edilmeden yayımlanmaz.
  • Paylaşılan devrelerin malzeme listesini istemeyiniz. Olsa zaten paylaşılırdı şema üzerinden listeyi çıkartabilirsiniz
  • Gavatar sitesine avatarınızı yükleyebilirsiniz.