Hallo,
ich bin im moment an 2 Sachen dran, zum einen das geradeaus fahren und eine Fernsteuerung mittels einer Universalfernbedienung mit RC5-Codes.
Zuerst zum Odometrieprogramm, da habe ich das aus "Mehr Spaß mit dem Asuro II" ausprobiert und dafür auch die Odometriewerte in mehreren Testläufen gemessen:
Code:
246 657
297 674
307 687
339 696
366 699
402 704
444 702
487 705
532 701
575 701
627 689
658 676
696 660
719 636
746 617
760 583
773 559
776 527
776 503
772 478
763 458
761 451
740 427
727 426
704 399
681 384
660 362
637 349
618 336
586 321
562 347
517 279
732 585
756 621
777 638
787 664
802 683
800 693
803 704
794 704
785 714
769 711
751 714
735 706
706 699
681 688
649 676
625 668
594 645
559 627
523 598
475 574
438 549
383 529
341 510
302 486
270 479
249 448
216 428
207 392
182 352
185 312
168 266
176 247
183 200
194 201
204 188
215 198
248 206
262 214
297 235
310 256
342 300
371 325
404 371
446 402
488 441
540 450
579 459
624 473
653 489
688 522
710 550
737 590
751 611
767 643
774 664
779 692
780 704
772 717
771 725
760 730
755 733
739 723
724 719
704 704
679 697
662 678
633 657
614 630
584 602
555 588
516 569
478 564
446 540
393 517
360 488
304 446
274 405
241 348
211 313
192 275
168 263
171 246
144 242
153 244
137 246
146 280
151 296
156 335
173 347
183 370
208 389
226 418
271 444
284 460
314 479
338 496
374 525
415 534
452 559
502 577
544 604
592 622
628 644
671 661
695 671
725 684
739 683
753 691
761 688
768 693
774 688
773 685
779 678
771 666
782 653
760 624
752 601
739 565
722 534
704 499
673 458
651 425
619 368
595 339
564 284
529 256
495 221
448 192
414 174
360 148
321 155
283 156
252 205
232 227
202 283
195 309
171 341
173 378
158 408
164 447
167 475
171 511
177 539
184 583
217 606
218 636
258 660
269 681
300 694
326 700
359 710
403 711
450 721
507 715
557 468
524 424
499 391
455 367
420 343
373 313
338 313
310 286
269 280
253 275
217 275
207 285
185 289
186 304
180 302
186 327
209 315
214 318
249 313
257 314
288 326
297 340
325 373
352 392
389 424
424 451
470 499
527 538
569 577
620 605
655 628
694 650
721 667
750 686
768 693
787 707
793 705
799 709
803 704
796 699
791 690
773 682
760 676
736 660
565 503
525 490
478 463
432 451
397 426
222 234
241 251
270 246
285 260
313 276
330 301
371 335
396 365
447 411
482 435
529 479
572 502
609 536
644 560
675 588
706 610
725 629
748 650
758 655
776 675
779 687
773 684
769 687
764 683
753 681
747 676
152 310
182 342
180 371
209 398
220 427
247 468
272 500
298 544
332 572
361 605
398 629
433 654
491 668
530 679
583 686
622 690
662 697
692 695
721 703
741 695
757 691
769 678
770 665
773 648
763 623
757 603
741 565
727 534
708 496
684 466
665 435
637 402
619 385
586 352
555 342
518 307
474 286
434 255
384 233
355 226
306 210
277 217
248 199
224 209
218 194
199 193
194 196
186 244
207 234
208 264
236 319
258 353
282 395
310 418
328 460
363 491
383 530
431 562
459 592
509 622
547 646
590 672
629 685
667 701
701 704
730 713
751 715
758 719
765 715
760 708
760 701
750 681
745 662
736 628
724 598
713 567
690 536
675 506
639 462
612 434
580 384
552 350
526 311
489 278
464 262
419 241
382 235
341 220
310 237
287 225
256 234
240 241
209 254
205 276
187 292
188 325
188 348
200 399
223 412
233 437
265 450
275 469
303 491
315 515
347 545
376 567
418 598
458 621
508 655
564 669
606 683
653 686
686 692
721 695
742 693
767 687
780 671
795 667
796 642
799 618
795 585
783 549
774 517
753 480
737 457
711 416
686 383
660 347
637 325
621 307
588 277
561 262
522 236
483 236
441 224
394 236
358 243
313 257
297 281
254 295
235 329
214 352
200 392
198 419
187 465
199 496
186 528
199 557
194 581
216 606
231 626
250 652
274 668
290 687
316 695
335 708
381 708
405 710
454 704
497 695
546 688
589 674
629 666
664 645
691 626
719 595
735 568
756 546
764 519
775 505
774 475
775 455
768 428
763 403
758 382
744 357
736 347
712 316
695 316
671 290
650 281
630 268
605 258
584 252
547 242
511 249
466 248
425 278
375 287
324 316
290 343
244 375
227 408
188 440
176 482
162 512
152 555
153 581
140 617
156 637
Dadurch habe ich den Mittelwert 450 bekommen und diesen auch am Anfang des Programmes als Schwellwert deklariert, zudem habe ich schon die Odometriesensoren mit schwarzer Pappe abgedeckt und die Zahnräder mit etwas Pappe so fixiert, dass der Abstand zu den Sensoren konstant ist.
Dennoch fährt mein Asuro nicht geradeaus, ich weiß nicht woran es noch liegen könnte, er fährt zumeist einen Meter ziemlich genau geradeaus und dann driftet er nach rechts ab, manchmal fährt er aber auch von Beginn an kurvig.
Hier ist mein Programm, ich bin froh über jede Hilfe:
Code:
// *******************************************
// * Odometrie für ASURO *
// * Fährt exakt geradeaus *
// * *
// * *
// * (c) 2007 Robin Gruber *
// * Details zum Code in: *
// * "Mehr Spaß mit ASURO, Band II" *
// *******************************************
#include "asuro.h"
// Schwellwert fr die Hell/Dunkel-Unterscheidung
// Eventuell muss damit etwas variiert werden
#define TRIGGERLEVEL 600
#define HYSTERESIS 10
#define LOW 0
#define HIGH 1
int main(void)
{
unsigned int data[2];
signed int status[2]={0,0};
signed int difference=0;
Init();
MotorDir(FWD, FWD);
while(1) {
// Helligkeitswerte der Lichtschranken auslesen
OdometrieData(data);
// Wechsel linker Sensor von niedrig auf hoch?
if ((status[0]==LOW) && (data[0]>TRIGGERLEVEL+HYSTERESIS)) {
status[0]=HIGH;
difference++;
}
// Wechsel linker Sensor von hoch auf niedrig?
if ((status[0]==HIGH) && (data[0]<TRIGGERLEVEL-HYSTERESIS)) {
status[0]=LOW;
difference++;
}
// Wechsel rechter Sensor von niedrig auf hoch?
if ((status[1]==LOW) && (data[1]>TRIGGERLEVEL+HYSTERESIS)) {
status[1]=HIGH;
difference--;
}
// Wechsel rechter Sensor von hoch auf niedrig?
if ((status[1]==HIGH) && (data[1]<TRIGGERLEVEL-HYSTERESIS)) {
status[1]=LOW;
difference--;
}
// zur Sicherheit: verhindern, dass der Differenzz�ler
// den erlaubten Wertebereich verl�st
if (difference<-255) difference=-255;
if (difference>255) difference=255;
// Status-LED noch entsprechend der erkannten Segmente
// aufleuchten lassen, grn fr links, rot fr rechts
StatusLED(status[0]+status[1]*2);
// Z�ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(255-difference,255);
else MotorSpeed(255,255+difference);
}
return 0;
}
Bei dem anderen Programm aus "Mehr Spaß mit Asuro II" bekomme ich beim compilieren folgende Fehlermeldung:
"../geradeaus.c:13:20: error: eeprom.h: No such file or directory"
Wo/Wie muss ich <eeprom.h> einbinden?
--------------------------------------
Das andere Problem betrifft folgendes Programm:
Code:
/*******************************************************************************
*
* File Name: IRDemo.c
* Project : Demo
*
* Description: This file contains IRDemo features
*
* Ver. Date Author Comments
* ------- ---------- -------------- ------------------------------
* 1.00 14.08.2003 Jan Grewe build
* 2.00 22.10.2003 Jan Grewe angepasst auf asuro.c Ver.2.10
*
* Copyright (c) 2003 DLR Robotics & Mechatronics
*****************************************************************************/
/*!
/file IRDemo.c
/brief Routinen fuer die Dekodierung von RC5-Fernbedienungs-Codes
/author Benjamin Benz (bbe@heise.de), m.a.r.v.i.n
/version V001 - 14.08.2003 - Jan Grewe
initial build
V002 - 22.10.2003 - Jan Grewe
angepasst auf asuro.c Ver.2.10
V003 - 11.02.2007 - m.a.r.v.i.n
c't-Bot RC5 Code portiert fuer den ASURO
*/
/***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* any later version. *
***************************************************************************/
#include "asuro.h"
#include "rc5.h"
#include <stdlib.h>
#define DIARWD 0x1008
#define DIAFWD 0x1002
#define DIALEFT 0x1004
#define DIARIGHT 0x1006
#define DIASTOP 0x1029
#define TUNERRWD 0x1021
#define TUNERFWD 0x1020
#define TUNERLEFT 0x1011
#define TUNERRIGHT 0x1010
#define TUNERSTOP 0x1025
#define OFFSET 0x3F
#define STEP 5
int speedLeft,speedRight;
void IRFwd(void)
{
speedRight += STEP;
speedLeft += STEP;
if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
FrontLED(ON);
BackLED(OFF,OFF);
}
void IRRwd(void)
{
speedRight -= STEP;
speedLeft -= STEP;
if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
FrontLED(OFF);
BackLED(ON,ON);
}
void IRLeft (void)
{
speedLeft -= STEP;
if (speedLeft > 0 && speedLeft <= OFFSET) speedLeft = -1;
speedRight += STEP;
if (speedRight < 0 && speedRight >= -OFFSET) speedRight = 1;
FrontLED(OFF);
BackLED(ON,OFF);
}
void IRRight (void)
{
speedLeft += STEP;
if (speedLeft < 0 && speedLeft >= -OFFSET) speedLeft = 1;
speedRight -= STEP;
if (speedRight > 0 && speedRight <= OFFSET) speedRight = -1;
FrontLED(OFF);
BackLED(OFF,ON);
}
void IRStop(void)
{
speedRight = speedLeft = 0;
FrontLED(OFF);
BackLED(OFF,OFF);
}
int main(void)
{
static unsigned int cmd;
unsigned char leftDir = FWD, rightDir = FWD;
char text[7];
Init();
InitRC5();
SerPrint("RC5 Test\r\n");
while (1)
{
cmd = ReadRC5();
if (cmd)
{
cmd &= RC5_MASK;
itoa(cmd, text, 16);
SerPrint(text);
SerPrint("\r\n");
switch (cmd)
{
case TUNERRWD :
case DIARWD :
SerPrint("rwd\r\n");
IRRwd();
break;
case TUNERFWD :
case DIAFWD :
SerPrint("fwd\r\n");
IRFwd();
break;
case TUNERLEFT :
case DIALEFT:
SerPrint("lft\r\n");
IRLeft();
break;
case TUNERRIGHT :
case DIARIGHT:
SerPrint("rgt\r\n");
IRRight();
break;
case TUNERSTOP :
case DIASTOP :
SerPrint("stp\r\n");
IRStop();
break;
}
}
if (speedLeft > 0 && speedLeft < OFFSET) speedLeft += OFFSET;
if (speedLeft < 0 && speedLeft > -OFFSET) speedLeft -= OFFSET;
if (speedRight > 0 && speedRight < OFFSET) speedRight += OFFSET;
if (speedRight < 0 && speedRight > -OFFSET) speedRight -= OFFSET;
leftDir = rightDir = FWD;
if (speedLeft < 0) leftDir = RWD;
if (speedRight < 0) rightDir = RWD;
if (speedLeft > 255) speedLeft = 255;
if (speedLeft < -255) speedLeft = -255;
if (speedRight > 255) speedRight = 255;
if (speedRight < -255) speedRight = -255;
MotorDir(leftDir,rightDir);
MotorSpeed(abs(speedLeft),abs(speedRight));
Msleep(100);
}
return 0;
}
Dieses Programm "RC5-Test" habe ich im "Examples"-Ordner der "asuro_libv271" gefunden und es soll, soweit ich es verstanden habe, die Fernsteuerung des Asuros durch eine RC5-Codefähige Fernbedienung ermöglichen.
Ich habe eine gefunden, die das kann und das Programm funktioniert, es ist jedoch so, dass er sich durch einzelnes Tastendrücken nicht bewegt.
Er wird z.B. durch gedrückt halten der "Channel+" Taste auf der Fernbedienung immer schneller bis zum Erreichen des Maximums nach ~15-20sec ich möchte jedoch, dass er durch einzelnes Tastendrücken eine moderate Geschwindigkeit erreicht.
Weiß jemand hier, wie man das machen kann?
Ich selbst verstehe von dem Programm noch nicht besonders viel, allgemein habe ich nicht so viel Ahnung von C-Programmierung, deshalb frage ich hier!
Ich hoffe jemand kann mir helfen und ich bedanke mich im vorraus schon mal für jegliche Hilfe!
Gruß
Seuche
Lesezeichen