Archiv verlassen und diese Seite im Standarddesign anzeigen : Odometrie / Fernsteuerung - Fragen+Probleme
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:
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:
// *******************************************
// * 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:
/************************************************** *****************************
*
* 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
Hat niemand ne Idee? Vorallem im Bezug auf das Fernsteuerungsprogramm brauch ich wirklich Hilfe, das versteh ich nämlich überhaupt nicht!
Dass mein Asuro nicht genau gerade fährt sondern eine leichte Rechtskurve macht liegt wohl an schiefen Achsen o.Ä. :-(
Habe heute mal Zettelchen an die Räder geklebt und ihn mehrere Minuten fahren lassen und sie waren immer noch gleichauf!
hallo seuche
zu deiner frage bezügliche ir-fernsteuerung:
wenn man es mal druchschaut hat sind die grundlagen nicht mal so schwer:
hier wird einfach ein wert in cmd abgespeichert, der einer bestimmten taste entspricht:
cmd = ReadRC5();
if (cmd)
{
cmd &= RC5_MASK;
hier erfolgt dann die auswertung, was gemacht werden soll:
switch (cmd)
{
case TUNERRWD : //taste rückwärts fahren gedrückt
case DIARWD :
SerPrint("rwd\r\n");
IRRwd(); //funktion für rückwärts fahren aufrufen
break;
case TUNERFWD : //taste vorwärts fahren gedrückt
case DIAFWD :
SerPrint("fwd\r\n");
IRFwd(); //funktion für vorwärts fahren aufrufen
break;
case TUNERLEFT : //taste links fahren gedrückt
case DIALEFT:
SerPrint("lft\r\n");
IRLeft(); //funktion für links fahren aufrufen
break;
case TUNERRIGHT : //taste rechts fahren gedrückt
case DIARIGHT:
SerPrint("rgt\r\n");
IRRight(); //funktion für rechts fahren aufrufen
break;
case TUNERSTOP : //taste stehen bleiben
case DIASTOP :
SerPrint("stp\r\n");
IRStop(); //funktion für stehen bleiben
break;
}
hinter TUNERSTOP, DIASTOP, TUNERRIGHT,... verbergen sich nur zahlen, die oben definiert sind
#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
dadurch ist leichter ersichtlich, was man damit erreichen will. die entsprechende zahl für eine taste kann man in tabellen heraus suchen
im nächsten abschnitt werd kontrolliet, ob die geschwindigkeiten im erlaubten bereich sind (>=OFFSET und <=255) und die motorfunktionen werden mit den ermittelten werten aufgerufen
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));
wenn du nun möchtest, dass beim drücken von "vorwärts" nicht langsam beschleunigt wird, sondern eine bestimmte geschwindigkeit vorgegeben werden soll brauchst du nur die funktion IRFwd() entsprechend abändern
z.B:
void IRFwd(void)
{
speedRight =200; //mit 200/200 vorwärts
speedLeft =200;
FrontLED(ON);
BackLED(OFF,OFF);
}
die anderen funktionen kannst du ebenfalls anpassen. dann sollte es wie gewünscht funktioneren
ich hoffe, das hilft dir bei diesem problem weiter
Danke für deine Antwort, ich habe aber momentan das Problem, dass er auf die Fernbedienung nicht mehr reagiert ??
Ich versteh nicht warum, habe zwischendurch nur andere Programme auf dem Asuro gehabt und danach wieder "RC-5 Test" draufgeflasht und er reagiert auf die selbe Fernbedienung, die ich vorher benutzt habe, nicht mehr.
Habe alle Codes noch mal durchprobiert und mit einer anderen "Phillips
SRU3040 II"-Universal geht es auch nicht!
Flashen kann ich aber noch, hat jemand eine Idee woran es liegen könnte?
Gruß
Seuche
radbruch
14.05.2009, 17:34
Hallo
Vielleicht sind die Batterien/Akkus leer. Der IR-Empfänger (IC2) auf dem asuro hat einen ungünstig dimensionierten Vorwiderstand (R17, 470Ohm) und reagiert deshalb empfindlich auf eine zu niedrige Bordspannung. Im Datenblatt des SFH5110 werden <= 100Ohm vorgeschlagen (Seite 4, Bild 2). Zum schnellen Test könnte man den Widerstand überbrücken. Oder das Programm ohne drehende Motoren testen.
Gruß
mic
Hallo
Vielleicht sind die Batterien/Akkus leer. Der IR-Empfänger (IC2) auf dem asuro hat einen ungünstig dimensionierten Vorwiderstand (R17, 470Ohm) und reagiert deshalb empfindlich auf eine zu niedrige Bordspannung. Im Datenblatt des SFH5110 werden <= 100Ohm vorgeschlagen (Seite 4, Bild 2). Zum schnellen Test könnte man den Widerstand überbrücken. Oder das Programm ohne drehende Motoren testen.
Gruß
mic
Werd ich direkt mal probieren, bzw. die Batterien tauschen!
Könnte es auch sein, dass der IC2 nicht mehr richtig funktioniert oder kaputt ist, obwohl ich noch einwandfrei flashen kann?
Batterienwechsel hat leider nichts gebracht, ich habe keinen Schimmer, warum das nicht mehr geht ](*,)
radbruch
14.05.2009, 19:03
Schade. Wenn das Flashen funktioniert ist der IR-Empfänger sicher nicht defekt. Ist es auch das richtige Programm bzw. das richtige Hexfile? Aktuelle Version? Kann das Terminal mit dem IR-Transceiver etwas von der Fernbedienung empfangen? Tut sich hier was:
// Test des IR-Empfängers 14.5.09 mic
// Port D0 ist der RXD-Pin des Mega8 an dem das Signal des SFH5110 ankommt
#include "asuro.h"
int main(void)
{
Init();
while(1) if(PIND & (1 << PD0)) StatusLED(YELLOW); else StatusLED(RED);
}(nicht getestet)
Das Programm ist das von oben:
/************************************************** *****************************
*
* 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;
}
Das Hyperterminal hab ich parallel am laufen gehabt, da ist immer was gekommen.
Ich probier mal das Programm von dir, danke. Ich geb dann wieder bescheid.
Das Ding ist jetzt auch, ich hab die Fernbedienung mit der es funktioniert hat, umgetauscht gegen eine andere, da es mit der alten nicht mehr funktionierte.
Gerade versuche ich es mit 2 neuen und unserer Universal-Fernbedienung für unseren Fernseher. (2x Tevion, 1x Philips - alles Universal)
Daran kann es ja nicht wirklich liegen, da auch die alte nicht ging und von den neuen müsste er ja auch auf irgendeine eine Reaktion zeigen!
Gruß
Seuche
Die Tasten, die ich auch für das Programm brauche lassen die StatusLED flackern, das müsste also empfangen worden sein, oder?
Der Fehler liegt dann wohl doch an der Fernbedienung oder im Programm?
Gruß
Seuche
PS: Vielen Dank für deine Hilfe!
radbruch
14.05.2009, 19:59
Hallo
Leider kenne ich diese RC5-Erweiterung nicht, aber das hier ist mir aufgefallen:
cmd = ReadRC5();
if (cmd)
{
cmd &= RC5_MASK;
itoa(cmd, text, 16);
SerPrint(text);
SerPrint("\r\n");
Der asuro müßte also nach erfolgreichem Empfang eines RC5-Signals den Wert in cmd zum Terminal senden (hexadezimal). Kommt da was an? Wenn nicht könnte es an der Maske liegen, diese Zeile könnte man testweise auskommentieren: "cmd &= RC5_MASK;"
Außer dem Kommando wird bei RC5 auch ein Gerätecode übertragen (damit man die Geräte auch einzeln bedienen kann ;). Keine Ahnung ob ReadRC5() dies irgendwie beachtet. Möglicherweise muss man das gewünschte Gerät irgendwie definieren (Doko zu rc5.h?)
Gruß
mic
Das übersteigt leider auch meine Kenntnisse ;(
Ich bin erst seit ~2 Monaten aktiv am Asuro
Der asuro müßte also nach erfolgreichem Empfang eines RC5-Signals den Wert in cmd zum Terminal senden (hexadezimal). Kommt da was an?
Wie kann ich das Prüfen?
Ich habe mich noch nicht so sehr mit dem Programm selbst beschäftigt, weil ich erst sichergehen wollte, dass es funktioniert, da ich eine schriftliche Arbeit zu dem Thema verfassen muss.
#include "asuro.h"
#define pow1 150 // Langsame Geschwindigkeit
#define pow2 200 // Schnelle Geschwindigkeit
#define taste (!(PINC & (1<<PC4))) // Tastenabfrage
#define keine_taste (PINC & (1<<PC4))
unsigned int count, temp; // Zaehler, IR-Kommando
unsigned char daten[14], ir_status; // IR-Datenspeicher, IR-Eingangspegel
int main(void) {
Init();
do{
temp=0;
while (PIND & (1 << PD0)) //warten auf die Flanke des Startbits
{if keine_taste StatusLED(GREEN); else StatusLED(RED); // Tastenspielerei
if taste BackLED(ON,ON); else BackLED(OFF,OFF);}
StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug
for (count=0; count<14; count++) { // im Gesammten warten wir auf 14 bits
/*
lt. Spettel-Diagramm betraegt die Bitlaenge 1,778 ms. Bei 36 Takten pro Millisekunde ergibt das 36*1,778 = 64
*/
Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
ir_status=(PIND & (1 << PD0)); // Pegel Speichern
if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
}
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
StatusLED(YELLOW); // Daten gelesen
//Msleep(2000); // Zeit um den IR-Transceifer ueber den asuro zu bringen
SerWrite("\n\r",2);
SerWrite(daten,14); // Bitmuster zum PC senden
SerWrite("-",1);
PrintInt(temp); // erkannte Daten zum PC senden
/* asuro steuern.
Mit dem 10er-Block der Fernbedienung kann der asuro nun gesteuert werden:
Alle anderen Tasten stoppen den asuro
*/
switch (temp) {
case 1: MotorDir(FWD,FWD); MotorSpeed(pow1,pow2); break;
case 2: MotorDir(FWD,FWD); MotorSpeed(pow2,pow2); break;
case 3: MotorDir(FWD,FWD); MotorSpeed(pow2,pow1); break;
case 4: MotorDir(BREAK,FWD); MotorSpeed(0,pow1); break;
case 5: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
case 6: MotorDir(FWD,BREAK); MotorSpeed(pow1,0); break;
case 7: MotorDir(RWD,BREAK); MotorSpeed(pow1,0); break;
case 8: MotorDir(RWD,RWD); MotorSpeed(pow1,pow1); break;
case 9: MotorDir(BREAK,RWD); MotorSpeed(0,pow1); break;
default: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
}
StatusLED(GREEN); //endlos
//Msleep(1000);
}while (1);
return 0;
}
Das ist ja das Programm aus deinem Beitrag in einem anderen Thread, stimmt es, dass es bei nahezu jeder Philips-Fernbedienung funktioniert?
Dann könnte ich ja auch das verwenden, meine Universal ist von Philps
und kann auf mehrere Philips Fernseher eingestellt werden.
Vielleicht meldet sich ja noch ein Experte, der sich schon mit der RC5-Erweiterung beschäftigt hat.
*Edit*
Das mit der Odometrie hat sich erledigt, habs noch halbwegs hinbekommen, für den 2. Platz bei dem Wettbewerb in der Schule hat es gereicht :)
Gruß
Seuche
radbruch
14.05.2009, 21:58
Wie kann ich das Prüfen?
Der Ablauf sollte so sein: Die Fernbedienung sendet, asuro empfängt, asuro sendet cmd an Terminal (dein PC mit Terminalprogramm), du schaust auf Terminal....
Ob mein Programm wirklich alle Philips-Fernbedienungen versteht kann nicht natürlich nicht sagen. Aber es funktioniert zufriedenstellend, ist selbstgebastelt und knackig kurz. Es wäre wohl besser wenn du mich bei deiner schriftlichen Prüfung nicht erwähnst ;)
Das Programm funktioniert nur mit einer 36kHz-Library! Für die orginale CD-Lib muss man hier eine 96 eintragen:
Sleep(96); // Information einlesen nach 3/4 der Bitlaenge
...für den 2. Platz bei dem Wettbewerb in der Schule hat es gereichtGlückwunsch. Dann kannst du uns ja mal dein Progamm zeigen.
Gruß
mic
Ich werd das Programm von dir einfach mal ausprobieren!
Mein Programm war eine von mir modifizierte Version des Geradeaus-Programms aus "Mehr Spaß mit Asuro II":
// *******************************************
// * 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
// Für meinen Asuro angepasster Wert
#define TRIGGERLEVEL 525
#define HYSTERESIS 50
#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--;
}
// Z?ldifferenz passend auf die Motoren verteilen
if (difference>0) MotorSpeed(150-difference,150);
else MotorSpeed(150,150+difference);
}
return 0;
}
Natürlich wirst du erwähnt in der Danksagung ;)
Wir müssen nicht alles selbst machen, das wäre auch zu viel verlangt, da wir nur sehr kurz und oberflächlich C-Programmierung in der Schule (12. Klasse, allgemeinbildendes Gymnasium) hatten und auch, bis auf im Physikunterricht, keine Elektronik bzw. Mechanikkenntnisse haben.
Es reicht, wenn wir schon ausprobierte Themen von anderen, nachbauen und gegebenfalls anpassen oder erweitern.
Der Inhalt der schriftlichen Arbeit ist auch eher theoretischer Natur, ich werde hauptsächlich über Dioden, Infrarotlicht, und Datenübertragung schreiben, die Fernbedienung ist dann aber die direkte Verknüpfung zum Asuro.
Der Ablauf sollte so sein: Die Fernbedienung sendet, asuro empfängt, asuro sendet cmd an Terminal (dein PC mit Terminalprogramm), du schaust auf Terminal....
Ich versteh, wie du das meinst, aber ich hab keine Ahnung, wie ich das programmieren soll :(
Danke für deine Bemühungen mir zu helfen!
Gruß
Seuche
Hey spitze, dein Programm funktioniert und sogar mit allen Fernbedienungen die ich zur Hand hatte! :D
Die Reichweite ist phänomenal, bis zu 3m und trotzdem noch perfekte Übertragung, sehr gut durch das Leuchten der StatusLED zu erkennen.
Mein einziges Problem ist noch, dass er bisher nur eine Rechtskurve fährt, d.h. jede Taste auf der Fernbedienung (auch andere als 1-9) stoppt (fast immer) durch einmaliges Drücken und durch Draufbleiben fährt er rechtsrum im Kreis (rechter Motor steht, linker fährt - manchmal ein bisschen langsamer als sonst).
Das heißt doch, dass er die verschiedenen Tasten noch nicht richtig unterscheiden kann, oder?
Hab ich was übersehen? Ist das normal so?
Oder soll ich mal die möglichen Philips-Codes durchprobieren, die es im "Code-Heft" meiner Universalfernbedienung gibt?
Dein Programm ist wirklich klasse =D> um längen besser als das in der AsuroWiki, wenn das mit den verschiedenen Befehlen noch klappt, wäre es perfekt!
*Edit*
Mein rechter Motor war nur verklemmt, jetzt fährt er fast immer geradeaus und dann manchmal Vorwärtskurven, manchmal Rückwärtskurven, wirklich steuern kann ich es noch nicht, stoppen kann ich ihn immer noch über kurzes Drücken irgendeiner Taste.
Wenn er an die Wand fährt, leuchten die BackLEDs nur das Rückwärtsfahren hab ich noch garnicht gefunden.
Klar erkennen tut er die einzelnen Tasten, bzw. Befehle also trotzdem nicht, aber ist trotzdem schonmal echt super!
Gruß
Seuche
So, ich hab jetzt mal alle Philips-Codes meiner Fernbedienung durchprobiert.
Der Asuro reagiert auf fast alle, aber auf keinen so, wie er es sollte sondern willkührlich auf die selbe Taste im einen Moment anders als im anderen!
Hat jemand eine Idee, woran das liegt?
Ich benutze eine Universal-Fernbedienung von Tevion (MD 81035).
War das bei dir auch so, radbruch, oder konntest du ihn, wie gewollt, mit Ziffer 1-9 steuern?
Hoffe ihr könnt mir helfen.
Gruß
Seuche
radbruch
16.05.2009, 08:33
Hallo
Bei mir funktionierte das richtig mit den Ziffern.
Ich versteh, wie du das meinst, aber ich hab keine Ahnung, wie ich das programmieren sollIch denke, du verstehst es nicht. Die Funktionen sind schon eingebaut, du must nur das Terminal starten und, wie beim Selbsttest, zuschauen was der asuro meldet. Hier sendet der asuro was er empfangen hat:
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
StatusLED(YELLOW); // Daten gelesen
//Msleep(2000); // Zeit um den IR-Transceiver ueber den asuro zu bringen
SerWrite("\n\r",2);
SerWrite(daten,14); // Bitmuster zum PC senden
SerWrite("-",1);
PrintInt(temp); // erkannte Daten zum PC senden
Die StatusLED leuchtet kurz gelb wenn der asuro senden will. Zuerst kommt das Bitmuster und dann das Kommando.
auf die selbe Taste im einen Moment anders als im anderen!Die Tasten senden beim Drücken, Draufbleiben oder Loslassen jeweils einen anderen Code. Hast du die verschiedenen Versionen der asuro-Libraries beachtet (wie oben beschrieben)?
Noch eine Anmerkung zu deinem Geradeausfahrprogramm: Ich weiß ja nicht wie groß dein Anteil daran ist, aber es ist ein gutes Beispiel für die Anwendung der Odometrie beim asuro.
Interesanterweise enthält dein Quellcode denselben Umlautebug den ich vor Urzeiten auch schon mal entdeckte. Ich hatte deshalb eine zeitlang Umlaute in den Kommentaren vermieden. Irgendwie hat sich das aber von selbst geheilt, heute verwende ich auch wieder Umlaute ohne Probleme. Vielleicht ist das ein Problem des Editors der Umlaute nicht im richtigen Code speichert? Ich verwende nicht das Notepad sondern KamAVR. [https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=29123]
Gruß
mic
Ich denke, du verstehst es nicht. Die Funktionen sind schon eingebaut, du must nur das Terminal starten und, wie beim Selbsttest, zuschauen was der asuro meldet. Hier sendet der asuro was er empfangen hat:
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
StatusLED(YELLOW); // Daten gelesen
//Msleep(2000); // Zeit um den IR-Transceiver ueber den asuro zu bringen
SerWrite("\n\r",2);
SerWrite(daten,14); // Bitmuster zum PC senden
SerWrite("-",1);
PrintInt(temp); // erkannte Daten zum PC senden
Die StatusLED leuchtet kurz gelb wenn der asuro senden will. Zuerst kommt das Bitmuster und dann das Kommando.
Das hab ich gemacht, hier ist das was im Hyperterminal ankommt:
Taste 1 (einzelnes Drücken 20x):
1‚Š‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þŸL˜˜00010000001-01j‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þϘ000001000000-01 ‚Š‚‚‚‚
ŠŠ‚‚‚‚‚‚j‚þŸ˜000001000000-0ƘÄb1 j‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þþL˜˜00010000001-0ÆŸ
Á‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þŸLœ˜00010000001-01> 1‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚ŸL˜˜00010100001-015‚‚‚‚
‚‚ŠŠ‚‚‚‚‚‚j‚þŸ˜°010-1˜Æb1 j‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þž1j‚‚‚‚‚Š‚‚‚‚Š‚‚j’þÄž
00010011010000-815‚‚‚‚‚‚ŠŠ‚‚‚‚‚‚j‚þ00000001000000-01
Taste 1 (gedrückt für 10sec):
00000001000000-0Ï5Á‚‚Š‚‚ŠŠ‚‚‚‚‚‚j‚þŸ5‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þj‚‚‚‚‚‚‚Š ‚‚‚‚‚‚j‚þ‚‚‚‚Š
‚Š‚Š‚‚‚j¢þÏR`‚‚‚‚‚Š‚‚‚‚‚‚‚j‚þj‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ%‚ ‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þÏ%‚‚‚‚‚‚‚Š‚‚‚
‚‚‚j‚þž ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þÏ ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þÁ€‚‚‚‚‚Š‚‚‚‚‚‚j‚þÏ ‚‚‚‚‚‚‚
Š‚‚‚‚‚‚j‚þ h‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ…00000010000000-0j‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þž `
‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þžž0010000001-0Á‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ $
‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ =‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ j‚‚‚‚‚‚‚Š‚‚‚‚‚‚j
‚þž5Á‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ >‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þj‚‚‚‚‚
‚‚Š‚‚‚‚‚‚j‚þ4‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ 0‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ ‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þj‚
‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þŸ (‚‚‚‚‚‚‚Š‚‚‚‚‚‚j‚þ
Die Tasten senden beim Drücken, Draufbleiben oder Loslassen jeweils einen anderen Code.
Meistens fährt er nur durch kurzes Draufbleiben, einzelnes Drücken zeigt zwar ein leuchten der LED aber es tut sich nichts, nur wenn er fährt, wird er dann zumeist gestoppt.
Hast du die verschiedenen Versionen der asuro-Libraries beachtet (wie oben beschrieben)?
Das Programm funktioniert nur mit einer 36kHz-Library! Für die orginale CD-Lib muss man hier eine 96 eintragen:
Sleep(96); // Information einlesen nach 3/4 der Bitlaenge
Wenn du das meinst, die Änderung habe ich vorgenommen, ich benutze die Asuro libv271, stimmt der Wert (Sleep(96);) dann so?
Soll ich es mal mit der 36kHz-Library versuchen?
Noch eine Anmerkung zu deinem Geradeausfahrprogramm: Ich weiß ja nicht wie groß dein Anteil daran ist, aber es ist ein gutes Beispiel für die Anwendung der Odometrie beim asuro.
Mein Anteil ist nicht so groß, ich habe nur den TRIGGERLEVEL auf meinen Asuro angepasst und die Geschwindigkeit auf einen für mich passenden Wert geändert.
Interesanterweise enthält dein Quellcode denselben Umlautebug den ich vor Urzeiten auch schon mal entdeckte. Ich hatte deshalb eine zeitlang Umlaute in den Kommentaren vermieden. Irgendwie hat sich das aber von selbst geheilt, heute verwende ich auch wieder Umlaute ohne Probleme. Vielleicht ist das ein Problem des Editors der Umlaute nicht im richtigen Code speichert? Ich verwende nicht das Notepad sondern KamAVR. [https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=29123]
Meinst du im Geradeaus-Programm?
radbruch
16.05.2009, 13:48
Hallo
Bitte entschuldige wenn ich mich ungenau ausgedrückt habe. Schau mal hier: "þŸL˜˜00010000001-01j‚‚‚‚‚‚" Links sind die Bits, rechts ddas erkannte Kommando. Es sind 11-14 Bits, es sollten aber immer 14 sein, das Kommando würde dann in Bit 1-4 stehen. Offensichtlich stimmt dein Timeing nicht, die Lib 2.71 ist eine 36kHz-Lib also ist 96 falsch!
Gruß
mic
Bitte entschuldige wenn ich mich ungenau ausgedrückt habe. Schau mal hier: "þŸL˜˜00010000001-01j‚‚‚‚‚‚" Links sind die Bits, rechts ddas erkannte Kommando. Es sind 11-14 Bits, es sollten aber immer 14 sein, das Kommando würde dann in Bit 1-4 stehen. Offensichtlich stimmt dein Timeing nicht, die Lib 2.71 ist eine 36kHz-Lib also ist 96 falsch!
Super, ich habe es jetzt wieder auf Sleep48 geändert und jetzt funktioniert es perfekt. Ein großes Lob für dein Programm, es ist einfach spitzenmäßig! :D
Damit wäre mein Problem eigentlich geklärt.
Ich melde mich die Tage nochmal, falls ich Probleme beim Verständnis rund um das Programm habe, ich hoffe das ist okay.
Ein großes Danke, radbruch, das hätte ich ohne dich bestimmt nicht hinbekommen.
Gruß
Seuche O:)
Hallo,
im Rahmen meines Projekts sind ein paar Fragen aufgekommen.
Mein Thema ist ja die Fernsteuerung mit einer Fernbedienung, das klappt auch hervorragend
Ich möchte jedoch um die Reichweite zu erhöhen und um zu verhindern, dass der Empfänger (IC2) von den Motoren o.Ä. verdeckt werden kann, eine Art Antenne bauen.
Hab mir dazu heute einen runden Holzstab (Durchmesser ca. 1cm, länge auf 8cm zugeschnitten) gekauft und ihn mit einem Bohrer durchlöchert.
Soweit dazu, jetzt frag ich mich, ob ich den IC2 nach oben setzen kann (die 8cm) ohne das die Kabellänge die Funktion verschlechtert und ob das Flashen noch funktioniert, da die Infrarotdiode (D10) unten bleibt und diese meines Wissens nach auch zum Flashen gebraucht wird.
Falls das geht, muss ich auf eine bestimmte Dicke der Kabel achten?
Hab mir welche von einem alten Elektronikbaukasten rausgesucht, davon würden 3 Stück (IC2 hat 3 Anschlüsse) durch das Röhrchen passen.
Die sind aber n bisschen dünner als die vom Motor oder dem Batteriefach.
Geht das mit denen, oder soll ich mich an die Dicke von den Motorkabeln halten, oder noch dicker? (dann wird mit dem Röhrchen problematisch)
Ich habe gedacht, dass Röhrchen mit einer Heißklebepistole auf die Platine zu kleben, genau an den Punkt wo der IC2 normal ist, muss ich aufpassen, dass kein Kleber auf die Lötstellen kommt oder ist das unwichtig(er)?
Hoffe ihr könnt mir schnell helfen, mir läuft die Zeit davon.
Gruß
Seuche
radbruch
20.05.2009, 20:53
Hoffe ihr könnt mir schnell helfen, mir läuft die Zeit davon
Die Querschnitte der Kabel ist unkritisch, nimm was du hast. Wenn der IR-Empfänger (IC2) und die IR-LED zu weit auseinander sind muss der Transceiver extrem "schielen" um beide zu erfassen. 8 cm Abstand würde mein (USB-)Transceiver vermutlich nicht tolerieren.
Hoffe ihr könnt mir schnell helfen, mir läuft die Zeit davon
Die Querschnitte der Kabel ist unkritisch, nimm was du hast. Wenn der IR-Empfänger (IC2) und die IR-LED zu weit auseinander sind muss der Transceiver extrem "schielen" um beide zu erfassen. 8 cm Abstand würde mein (USB-)Transceiver vermutlich nicht tolerieren.
Vielen dank, dann probier ich das morgen einfach mal, wenns mit dem Flashen nicht geht, muss ich die Diode eben auch noch hochlöten, kann man nix machen.
Gruß
Seuche
Meine Antenne funktioniert soweit, die Diode hat nur nen leichten Wackelkontakt, muss ich nochmal nachlöten.
Andere Frage, ich untersuche gerade die Schaltung der Infrarotschnittstelle (IC2 & D10).
In der AsuroWiki steht dabei folgendes:
"Die IR-LED hängt zwischen Pin PD1 und PB3. PD1 ist als UART TxD konfiguriert, während über PB3 ein 36kHz Signal als IR-Trägersignal dem gesendeten Signal zugemischt wird. "
Heißt das, dass von PD1 das zu sendende Signal kommt (heißt ja UART TxD = Transmit = senden) und von PB3 die Trägerfrequenz? Das wäre doch ein Widerspruch, da die Diode nur ich Richtung PB3 -> PD1 durchlässt und andersrum sperrt!
Kann mir jemand auf die Sprünge helfen, bin nicht so erfahren mit Elektronik ;(
Gruß
Seuche
radbruch
22.05.2009, 18:46
Heißt das, dass von PD1 das zu sendende Signal kommt (heißt ja UART TxD = Transmit = senden) und von PB3 die Trägerfrequenz?Ja, genau das heißt das. Welche Kombinationen der Pins können denn auftreten? Wie häufig wechselt PB3 bis BD1 wechselt? PB3 sind die 36kHz mit der die IR-LED getaktet wird.
Heißt das, dass von PD1 das zu sendende Signal kommt (heißt ja UART TxD = Transmit = senden) und von PB3 die Trägerfrequenz?Ja, genau das heißt das. Welche Kombinationen der Pins können denn auftreten? Wie häufig wechselt PB3 bis BD1 wechselt? PB3 sind die 36kHz mit der die IR-LED getaktet wird.
Ich weiß aufgrund meines sehr begrenzten Elektronikwissens nicht was du meinst, ich verweise einfach mal auf den entsprechenden Artikel, in dem ich diese Informationen gefunden habe: http://asuro.pytalhost.de/pmwiki/pmwiki.php/Main/Infrarotschnittstelle
Gruß
Seuche
Ich bin gerade beim verstehen des Programms:
/************************************************** **********/
/* */
/* Fernsteuern mittels IR-Fernbedienung (RC-5) */
/* */
/* 14.05.2009 */
/* */
/************************************************** **********/
#include "asuro.h"
#define pow1 150 // Langsame Geschwindigkeit
#define pow2 200 // Schnelle Geschwindigkeit
#define taste (!(PINC & (1<<PC4))) // Tastenabfrage
#define keine_taste (PINC & (1<<PC4))
unsigned int count, temp; // Zaehler, IR-Kommando
unsigned char daten[14], ir_status; // IR-Datenspeicher, IR-Eingangspegel
int main(void)
{
Init();
do
{
temp=0;
while (PIND & (1 << PD0)) // warten auf die Flanke des Startbits
{
if keine_taste StatusLED(GREEN); else StatusLED(RED); // Tastenspielerei
if taste BackLED(ON,ON); else BackLED(OFF,OFF);
}
StatusLED(RED); // Alarmstufe ROT: ein Zeichen ist im Anflug
for (count=0; count<14; count++) // im Gesamten warten wir auf 14 Bits
{
/************************************************** *****************/
/* laut Spettel-Diagramm betraegt die Bitlaenge 1,778 ms. */
/* Bei 36 Takten pro Millisekunde ergibt das 36*1,778 = 64 */
/************************************************** *****************/
Sleep(48); // Information einlesen nach 3/4 der Bitlaenge
ir_status=(PIND & (1 << PD0)); // Pegel Speichern
if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
}
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
StatusLED(YELLOW); // Daten gelesen
//Msleep(2000); // Zeit um den IR-Transceifer ueber den asuro zu bringen
SerWrite("\n\r",2);
SerWrite(daten,14); // Bitmuster zum PC senden
SerWrite("-",1);
PrintInt(temp); // erkannte Daten zum PC senden
/************************************************** *****************************/
/* Asuro steuern: */
/* Mit dem 10er-Block der Fernbedienung kann der Asuro nun gesteuert werden; */
/* Alle anderen Tasten stoppen den Asuro */
/************************************************** *****************************/
switch (temp)
{
case 1: MotorDir(FWD,FWD); MotorSpeed(pow1,pow2); break;
case 2: MotorDir(FWD,FWD); MotorSpeed(pow2,pow2); break;
case 3: MotorDir(FWD,FWD); MotorSpeed(pow2,pow1); break;
case 4: MotorDir(BREAK,FWD); MotorSpeed(0,pow1); break;
case 5: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
case 6: MotorDir(FWD,BREAK); MotorSpeed(pow1,0); break;
case 7: MotorDir(RWD,BREAK); MotorSpeed(pow1,0); break;
case 8: MotorDir(RWD,RWD); MotorSpeed(pow1,pow1); break;
case 9: MotorDir(BREAK,RWD); MotorSpeed(0,pow1); break;
default: MotorDir(BREAK,BREAK); MotorSpeed(0,0); break;
}
StatusLED(GREEN); //endlos
//Msleep(1000);
}
while (1);
return 0;
}
Ich möchte es möglichst genau verstehen, deshalb sind dabei viele Fragen enstanden, da mir ein Großteil der Befehle vollkommen unbekannt sind:
"while (PIND & (1 << PD0))"
soll das heißen, solange noch nichts empfangen wird und deshalb die Spannung an den PINs noch 0 ist?
"Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge"
Warum wartet das Programm bis 3/4 der Bitlänge angekommen ist? Welcher Grund steckt dahinter?
Allgemein verstehe ich diesen Kernabschnitt trotz der Kommentare nicht:
Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge
ir_status=(PIND & (1 << PD0)); // Pegel Speichern
if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
}
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
Ich hoffe die kann mir jemand in einer für mich verständlichen Sprache erklären.
Ansonsten bin ich schon öfters auf "SerWrite("\n\r",2);" gestoßen, was bedeutet der Klammerinhalt?
Wenn mir jemand diese Fragen beantworten könnte, wäre ich sehr sehr dankbar und könnte endlich das, was hinter dem Programm steckt, verstehen. :)
Gruß
Seuche
radbruch
24.05.2009, 16:51
Hallo
Na dann wollen wir das mal aufbröseln:
"while (PIND & (1 << PD0))"
soll das heißen, solange noch nichts empfangen wird und deshalb die Spannung an den PINs noch 0 ist? Da der IR-Empfänger das Signal invertiert(!) wird hier solange gewartet bis der Eingang nicht mehr high ist.
"Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge"
Warum wartet das Programm bis 3/4 der Bitlänge angekommen ist? Welcher Grund steckt dahinter?Dahinter steckt die ungefähre Bitlänge von 64 Sleep()s und die Manchestercodierung des RC5-Signals. Nach dem Pegelwechsel nach halber Bitlänge sitzt der Eingang auf dem Pegel des Datenbits und kann zwischen Sleep(32) und Sleep(63) eingelesen werden. Um das ungenaue Timeing durch Sleep() auszugleichen wird quasi in der Mitte dieses Bereichs bei Sleep(48) eingelesen.
Allgemein verstehe ich diesen Kernabschnitt trotz der Kommentare nicht:
for (count=0; count<14; count++) // im Gesamten warten wir auf 14 Bits
{
Sleep( 48 ); // Information einlesen nach 3/4 der Bitlaenge
ir_status=(PIND & (1 << PD0)); // Pegel Speichern
if (ir_status) daten[count]='1'; else daten[count]='0'; // und merken
if (ir_status) temp |= (1 << (13-count)); // das MSB(=mostsuefikantbit) zuerst
while (ir_status == (PIND & (1 << PD0))); // Bit gelesen, warten auf naechste Flanke
}
temp=temp/2 & 0xf; // Die Info steht in den Bits 1-4
Ich hoffe die kann mir jemand in einer für mich verständlichen Sprache erklären. Oje. Es werden 14 RC5-Bits in die Zeichenkette daten[] und die 16 bit-Variable temp eingelesen. Ablauf beim ersten Bit: Warten bis Übertragung startet, dann nach sleep(48) den Pegel nach ir_status einlesen. Abhängig von ir_status werden dann in daten[] eine '0' oder '1' eingetragen und das entsprechende Bit in temp gesetzt (MSB beachten!). Nun wird noch gewartet bis sich der Eingangspegel wieder ändert (!=ir_status), damit ist das erste Bit fertig.
Nun wird count erhöht und die Schleife steigt bei sleep(48) wieder ein um die restlichen Bits einzulesen.
Ansonsten bin ich schon öfters auf "SerWrite("\n\r",2);" gestoßen, was bedeutet der Klammerinhalt?Die Steuerzeichen in der Zeichenkette bedeuten '\n'=newline (neue Zeile) und '\r'=carrige return (Wagenrücklauf) Das zwinkt das Treminalprogramm eine neue Zeile darzustellen und alles anzuzeigen was in der letzten Zeile gesendet wurde.
"PrintInt(temp); // erkannte Daten zum PC senden"
Was sind das für Daten? Das erkannte Bitmuster mit der dazugehörigen Befehlskennung wurden ja bereits an den Computer gesendet! In temp stehen die 14 RC5-Bits rechtsbündig, das der Fernbedienungstaste zugeordnete Kommando in den Bis 1-4: "temp=temp/2 & 0xf;" bedeutet Bits eine Stelle nach rechts schieben und Bits 4-15 ausblenden. Dann enthält temp das Kommando.
Gruß
mic
Vielen vielen Dank für deine Hilfe!
Das wars erstmal von meiner Seite, meine Arbeit ist fertig! Ich mach erstmal Urlaub ;)
Gruß
Seuche
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.