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):
..und das ASURO-Progrämmsche: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; }
Es werden auch noch die ComTools von http://members.inode.at/anton.zechner/az/Seriell.htm Anton Zechner benötigt (sind angehängt).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; }
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







Zitieren

Lesezeichen