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:
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.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
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:
Bei dem anderen Programm aus "Mehr Spaß mit Asuro II" bekomme ich beim compilieren folgende Fehlermeldung: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; }
"../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:
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.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; }
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







Zitieren

Lesezeichen