Liste der Anhänge anzeigen (Anzahl: 1)
Hallo!!
Ich arbeite grade an einer extra datei die das programmieren in c mit bisher 3 funktionen vereinfacht:
-MotorSpeed wird zu Speed und muss nun in prozent angegeben werden(individuell einstellbar auf eigenen roboter rechts-links-verhältnis....)
-Blinken aller LEDs mit angaben des zeitintervalls in 10tel sekunden
- unsd die dafür nötige funktion die sleep benutzt um einen timer in 10tel sekunden einzubauen.
Code:
/************************************************************
*
* Dateiname: eigen.h
* Projekt : ASURO
*
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* 1.00 27.01.2005 build
*
************************************************************/
/***********************************************************
*
* Dieses Program ist frei verwendbar für jegliche Zwecke. man darf es verändern und/oder * duplizieren. Ich übernehme keine Haftung für eventuelle Schäden durch diese Datei.
*
************************************************************/
//Sleep mit eingabe in 10tel sekunden!
//-----------------------------------------------------
void Wait(unsigned int sek);
void Wait(unsigned int sek){
unsigned int i;
unsigned int x;
for(i=0; i<sek;i++){
for(x=0;x<36;x++){
Sleep(200);
}
}
}
//-----------------------------------------------------
/*Blinken aller LEDs in rot */
//-------------------------------------------------
void Blinken(int i);
void Blinken(int i){
StatusLED(RED);
FrontLED(ON);
BackLED(ON,ON);
Wait(i);
StatusLED(OFF);
FrontLED(OFF);
BackLED(OFF,OFF);
Wait(i);
}
//---------------------------------------------------
/*MotorSpeed=Speed ( jetzt mit prozent angabe!)*/
//----------------------------------------------------
void Speed(int x, int y);
void Speed(int x, int y){
unsigned char left,right;
if (((x*255)/100)>255){Blinken(10);}
if (((x*251)/100)>251){Blinken(20);}
left=(x*255)/100;
right=(y*251)/100;
MotorSpeed (left,right);
}
//-----------------------------------------------------/
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Robotiker,
Ich hab mich ein bischen verliebt in die Asuro und seinem Atmega chip. Ich mochte mahl genau verstehen wass da alles in die Atmega chip hervor geht. Mann ist das ein menge Arbeit!
Ich hab mich jetzt mahl auf die InfraRot empfanger geworfen (mit hilfe von die Asuro.c Datei) und mahl ein einfaches Asuro steurung program geschrieben.
Vielleicht habt Ihr schon manchmal dasselbe gemacht. Ich mochte's nur zeigen.
Mit Hyperterminal kan mann Asuro mittels die pfeilen-tasten lenken.
(immer die '.txt' entfernen)
Gruss,
Henk
Liste der Anhänge anzeigen (Anzahl: 1)
Mein erstes Programm
Hi Leutz,
bin 1. neu hier, 2. eine elektronische NULL und 3. funzt mein ASURO nicht so ganz (dazu in einem anderen Thread mehr).
Habe zum Testen (nachdem mir das mitgelieferte Testprg. nicht gefallen hat) ein eigenes Prog. geschrieben.
Zuerst das Steuerprogramm für den PC (Console unter Windows):
Code:
//*****************************************************************************
//*
//*
//* ComDemo.cpp
//*
//*
//*****************************************************************************
//
// Mit deisem Programm kann man eine Konsolenverbindung über die serielle
// Schnittstelle mit einem Null-Modem-Kabel herstellen.
//
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include "ComTools.h"
#define COM1 0
#define COM2 1
#define COM3 2
#define COM4 3
#define ESC 27
//*****************************************************************************
//*
//* main
//*
//*****************************************************************************
int main(int argc, char* argv[])
{
int iLen,iKey,iWait;
char inBuffer[65];
char outBuffer[65];
ComInit();
if(!ComOpen(COM1,2400,P_NONE,S_1BIT,D_8BIT))
{
printf("\nKann die Schnittstelle nicht oeffnen !\n\n");
return -1;
}
while(1)
{
if(kbhit()) // Wurde eine Taste gedrückt
{
iKey = getch();
if(iKey == ESC)
break;
if(iKey != 'f' && iKey != 'r' && iKey != 'l' && iKey != 'x' && iKey != 'o'
&& iKey != 'k' && iKey != '+' && iKey != '-') // kein 1-Zeichen-Befehl
{
while(_kbhit());
outBuffer[0] = iKey;
outBuffer[1] = getch();
}
else
{
outBuffer[0] = iKey;
outBuffer[1] = ' ';
}
printf("%c%c\n",outBuffer[0],outBuffer[1]);
ComWrite(COM1,outBuffer,2);
}
memset(inBuffer,0,65);
iLen = ComRead(COM1,inBuffer,64); // Zeichen einlesen
if(iLen > 0)
{
inBuffer[iLen] = '\0';
if(inBuffer[2] == 'f') // vordere Fototransistoren
{
int val_Links = (inBuffer[3] << 8) | inBuffer[4];
int val_Rechts = (inBuffer[5] << 8) | inBuffer[6];
printf("\nFoto L: %d R: %d\n",val_Links, val_Rechts);
}
else if(inBuffer[2] == 'o') // Odometrie
{
int val_Links = (inBuffer[3] << 8) | inBuffer[4];
int val_Rechts = (inBuffer[5] << 8) | inBuffer[6];
printf("\nOdo L: %d R: %d\n",val_Links, val_Rechts);
}
else if(inBuffer[2] == 'p') // Schalter
{
int value = inBuffer[3];
char ausgabe[7] = { '-','-','-','-','-','-','\0' };
if(value & 1)
ausgabe[5] = 'X';
if(value & 2)
ausgabe[4] = 'X';
if(value & 4)
ausgabe[3] = 'X';
if(value & 8)
ausgabe[2] = 'X';
if(value & 16)
ausgabe[1] = 'X';
if(value & 32)
ausgabe[0] = 'X';
printf("Schalter: %s\n",ausgabe);
}
else
printf("%s\n",&inBuffer[2]);
}
else
{
Sleep(50); // Wenn keine Zeichen im Buffer sind dann warten
}
}
ComClose(COM1);
ComExit();
return 0;
}
..und das ASURO-Progrämmsche:
Code:
#include "asuro.h"
int main(void)
{
Init();
StatusLED(GREEN);
unsigned char data[65];
unsigned char frontLED = 0;
unsigned int lD[2];
unsigned char send[12];
unsigned char speed = 200;
unsigned char Motors[2];
while(1)
{
SerRead(data,2,0); // auf 2 Zeichen warten
switch(data[0])
{
case 's': // StatusLED
if(data[1] == 'g')
{
StatusLED(GREEN);
SerWrite("Set StatusLED to Green\0",23);
}
if(data[1] == 'r')
{
StatusLED(RED);
SerWrite("Set StatusLED to Red\0",21);
}
if(data[1] == 'y')
{
StatusLED(YELLOW);
SerWrite("Set StatusLED to Yellow\0",24);
}
if(data[1] == 'o')
{
StatusLED(OFF);
SerWrite("Set StatusLED Off\0",18);
}
break;
case 'l': // Front-LED
if(frontLED == 0)
{
SerWrite("Set FrontLED On\0",16);
FrontLED(ON);
}
else
{
SerWrite("Set FrontLED Off\0",17);
FrontLED(OFF);
}
frontLED = !frontLED;
break;
case 'f': // vorwärts
SerWrite("Set Motordirection FORWARD\0",27);
MotorDir(FWD, FWD);
break;
case 'r': // rückwärts
SerWrite("Set Motordirection REVERSE\0",27);
MotorDir(RWD, RWD);
break;
case 'g':
speed = data[1];
break;
case '+':
if(speed < 255)
speed += 10;
if(Motors[0])
MotorSpeed(speed,0);
if(Motors[1])
MotorSpeed(0,speed);
break;
case '-':
if(speed > 0)
speed -= 10;
if(Motors[0])
MotorSpeed(speed,0);
if(Motors[1])
MotorSpeed(0,speed);
break;
case 'm': // Motoren
if(data[1] == 'l')
{
SerWrite("Set left Motor\0",15);
MotorSpeed(speed,0);
Motors[0] = 1;
Motors[1] = 0;
}
if(data[1] == 'r')
{
SerWrite("Set right Motor\0",16);
MotorSpeed(0,speed);
Motors[0] = 0;
Motors[1] = 1;
}
if(data[1] == 'o')
{
SerWrite("Set Motors OFF\0",15);
MotorSpeed(0,0);
Motors[0] = 0;
Motors[1] = 0;
}
break;
case 'b': // Rück-LED's
if(data[1] == 'l')
{
SerWrite("Set left BackLED ON\0",20);
BackLED(ON,OFF);
}
if(data[1] == 'r')
{
SerWrite("Set right BackLED ON\0",21);
BackLED(OFF,ON);
}
if(data[1] == 'o')
{
SerWrite("Set BackLEDs OFF\0",17);
BackLED(OFF,OFF);
}
break;
case 'k':
send[0] = 'p';
send[1] = PollSwitch();
send[5] = '\0';
SerWrite(send,3);
break;
case 'x':
// Zustände senden
LineData(lD); // Zustände der vorderen Fototransistoren holen
send[0] = 'f';
send[1] = lD[0] >> 8; // HighByte
send[2] = lD[0] & 0xFF; // LowByte
send[3] = lD[1] >> 8; // HighByte
send[4] = lD[1] & 0xFF; // LowByte
send[5] = '\0';
SerWrite(send,5);
break;
case 'o': // Odometriedaten
// Zustände senden
OdometrieData(lD); // Zustände der vorderen Fototransistoren holen
send[0] = 'o';
send[1] = lD[0] >> 8; // HighByte
send[2] = lD[0] & 0xFF; // LowByte
send[3] = lD[1] >> 8; // HighByte
send[4] = lD[1] & 0xFF; // LowByte
send[5] = '\0';
SerWrite(send,5);
break;
}
}
StatusLED(RED);
while(1);
return 0;
}
Es werden auch noch die ComTools von http://members.inode.at/anton.zechner/az/Seriell.htm Anton Zechner benötigt (sind angehängt).
Die Console reagiert auf folgende Tasten(kombinationen):
f = MotorDir(FWD,FWD)
l = FrontLED(ON/OFF) 'als Switch
r = MotorDir(RWD,RWD)
+ = MotorSpeed(+10,+10)
- = MotorSpeed(-10,-10)
o = OdometrieData()
x = LineData()
k = PollSwitch()
mo = MotorSpeed(0,0)
ml = MotorSpeed(n,0)
mr = MotorSpeed(0,n)
bo = BackLED(OFF,OFF)
bl = BackLED(ON,OFF)
br = BackLED(OFF,ON)
so = StatusLED(OFF)
sr = StatusLED(RED)
sy = StatusLED(YELLOW)
sg = StatusLED(GREEN)
Daher auch eine Frage: Wie regelt ihr eine abgestimmte Kommunikation zwischen Robbie & PC???
Viel Spass damit (auch wenn's recht popelig ist)
Banzai
Liste der Anhänge anzeigen (Anzahl: 1)
"Discovery" Programm
Hi,
hab ein kleines Programm für asuro geschrieben. Asuro faährt erstmal grade aus, und wenn er anstösst fährt er erst rückwärts, dreht sich und fährt wieder geradeaus.
Diesen Vorgang wiederholt er unendlich.
Also ich weis das bis jetzt das Programm noch sehr simpel ist, habe aber vor es so weiterzuschreiben, dass wenn asuro wo steckenbleibt eine "Troubleshooting" Schleife einsetzt, die Asuro wieder befreit wenn er wo stecken bleibt.
P.S.: Die Geschwindigkeiten sind für meinen Bot eingestellt. Eventuell muss man diese verändern.