Projekte
BirgerT
Follow Me + Maroon#1
main.cpp
Projekte
Forum
Doku
Öffentliche Projekte
Startseite
Beispielprogramme
Projekte von anderen
Welcome
Username
Passwort
Eingeloggt bleiben
Zugangsdaten vergessen?
Registrieren
Projektverwaltung
⇨ Please choose! ⇦
——————————————————
✎ Create new project...
★ Browse existing projects...
——————————————————
⚬ MotorTest#1
⚬ C Tutorial 8#1
⚬ NIBO2 C Project#1
⚙ C Tutorial 15#1
⚬ 2010_11_18_el_test001#1
Follow Me + Maroon#1
main.cpp
maroon.cpp
maroon.h
Project details
Compiler settings
Nachrichten
Sie sind nicht eingeloggt.
Neuigkeiten
★
NiboRoboLib 3.6
2017-01-17: Neue Version 3.6
★
NiboRoboLib 3.4.1
2016-04-16: Neue Version 3.4.1
★
Coding Tutorial
2015-11-22: Jetzt auch für den NIBO burger!
Site-Statistic
7433 private projects
378 public projects
16180353 lines compiled
58212 builds
NIBO
@
follow_me_maroon_1/main.cpp [read only]
/* Follow me - Objektverfolgung für den NIBO burger Die vier IR-Sensorbricks sollten in den vorderen Slots (FLL, FL, FR, FRR) stecken! */ //#include <niboburger/base.h> //#include <niboburger/iodefs.h> //#include <niboburger/usart.h> //#include <niboburger/motpwm.h> //#include <niboburger/analog.h> //#include <niboburger/led.h> //#include <niboburger/key.h> //#include <niboburger/delay.h> //#include <niboburger/utils.h> #include <niboburger/robomain.h> #include "maroon.h" uint8_t progmode = 0; enum { EVENT_NONE = 0, EVENT_KEY1 = 1, EVENT_KEY2 = 2, EVENT_KEY3 = 3, EVENT_TIMEOUT = 4, EVENT_NO_HAND = 20, EVENT_TO_CLOSE = 21, EVENT_HAND_C = 22, EVENT_HAND_L = 23, EVENT_HAND_R = 24, EVENT_HAND_LL = 25, EVENT_HAND_RR = 26 }; uint8_t cops1[8] = { 0x10, 0x20, 0x40, 0x80, 0x00, 0x00, 0x00, 0x00 }; uint8_t cops2[8] = { 0x30, 0x30, 0x30, 0xc0, 0xc0, 0xc0, 0x00, 0x00 }; uint8_t key_getEvent(); void blink_led(uint8_t led, uint8_t count) { while (count--) { led_set(led, 1); delay(80); led_set(led, 0); delay(120); } } /* OBSTACLE */ // User Georg hat wohl als erster festgestellt, dass die Empfindlichkeit der Abstandsensoren // unterschiedlich groß ist, und dass der Nullpunkt (keine Refelxion) bereits relativ hohe // Analogwerte liefert. Hierzu hat er eine Lösung vorgeschlagen, die ich in meinem Stil hier // eingefügt habe. // int8_t obstacle_pos; uint8_t obstacle_val; #if 0 // Original Code von "nibo burger" uint8_t getObstSensorValue(uint8_t sensor) { uint16_t val = analog_getValueExt(sensor, 2); if (val&0xff00) return 0xff; return val; } #else // angepasster Code von BirgerT // // Merker Array für die Offsets der Distanzbricks müssen // mit einem Wert vorbelegt sein, die kleinsten Messwerte // werden laufend übernommen uint16_t brick_offset[] = { // BL BC BR FL FR FLL FRR BCL BCR 255,255,255,255,255,255,255,255,255 }; uint8_t getObstSensorValue(uint8_t sensor) { uint16_t val = analog_getValueExt(sensor, 2); if (val < brick_offset[sensor]) { brick_offset[sensor] = val; return 0; } val -= brick_offset[sensor]; val >>= 1; if (val & 0xff00) return 0xff; return val; } #endif uint8_t follow_getEvent(uint8_t reset) { static uint8_t state = 0; uint8_t nstate = 0; #if 0 // Original Code uint8_t l = getObstSensorValue(ANALOG_FL)>>1; uint8_t r = getObstSensorValue(ANALOG_FR)>>1; uint8_t ll = getObstSensorValue(ANALOG_FLL)>>1; uint8_t rr = getObstSensorValue(ANALOG_FRR)>>1; #else // BirgerT: // Shift Operation bereits in getObstSensorValue() enthalten uint8_t l = getObstSensorValue(ANALOG_FL); uint8_t r = getObstSensorValue(ANALOG_FR); uint8_t ll = getObstSensorValue(ANALOG_FLL); uint8_t rr = getObstSensorValue(ANALOG_FRR); #endif uint8_t cc = l + r; ll += l; rr += r; obstacle_val = (ll>rr)?ll:rr; if (cc>obstacle_val) { obstacle_val = cc; } if ((obstacle_val==cc) || (ll==rr)) { if (ll>rr) { obstacle_pos = -1; nstate = EVENT_HAND_L; } else if (ll<rr) { obstacle_pos = +1; nstate = EVENT_HAND_R; } else { obstacle_pos = 0; nstate = EVENT_HAND_C; } } else if (ll>rr) { obstacle_pos = -2; nstate = EVENT_HAND_LL; } else { obstacle_pos = +2; nstate = EVENT_HAND_RR; } if (obstacle_val>50) { nstate = EVENT_TO_CLOSE; } else if (obstacle_val<8) { nstate = EVENT_NO_HAND; } if (state!=nstate) { state = nstate; return state; } return EVENT_NONE; } /* KEY */ uint8_t key_getEvent() { static uint8_t key = 0; uint8_t act = key_get_state(); if (act==0) { act = key; key = 0; if (act==0x01) return EVENT_KEY1; if (act==0x02) return EVENT_KEY2; if (act==0x04) return EVENT_KEY3; return EVENT_NONE; } if (act!=KEY_STATE_INVALID) { key |= act; } return EVENT_NONE; } uint8_t getEvent() { uint8_t event = EVENT_NONE; event = key_getEvent(); if (event) return event; event = follow_getEvent(0); return event; } uint8_t run = 0; uint16_t counter = 0; void handle_event(uint8_t event) { uint8_t has_maroon = maroon_connected(); if (run==0) { if ((event==EVENT_KEY1) || (event==EVENT_KEY2) || (event==EVENT_KEY3)) { run = 1; follow_getEvent(1); } return; } if ((event==EVENT_KEY1) || (event==EVENT_KEY2) || (event==EVENT_KEY3)) { run = 0; motpid_stop(1); led_setall(1, 0, 0, 1); return; } if (event==EVENT_TO_CLOSE) { #if 0 motpid_stop(1); #else // BirgerT: // Wenn sich die Hand noch weiter nähert, soll // der NIBOburger rückwärts ausweichen motpid_setSpeed(-30,-30); #endif if (has_maroon) led_setall(1, 0, 0, 1); if (!has_maroon) led_setall(1, 1, 1, 1); } else if (event==EVENT_NO_HAND) { motpid_stop(0); led_setall(0, 0, 0, 0); } else if (event==EVENT_HAND_L) { motpid_setSpeed(+20,+30); if (has_maroon) led_setall(0, 0, 0, 0); if (!has_maroon) led_setall(0, 1, 0, 0); } else if (event==EVENT_HAND_C) { motpid_setSpeed(+30,+30); if (has_maroon) led_setall(0, 0, 0, 0); if (!has_maroon) led_setall(0, 1, 1, 0); } else if (event==EVENT_HAND_R) { motpid_setSpeed(+30,+20); if (has_maroon) led_setall(0, 0, 0, 0); if (!has_maroon) led_setall(0, 0, 1, 0); } else if (event==EVENT_HAND_LL) { motpid_setSpeed(-10,+20); if (has_maroon) led_setall(0, 0, 0, 0); if (!has_maroon) led_setall(1, 1, 0, 0); } else if (event==EVENT_HAND_RR) { motpid_setSpeed(+20,-10); if (has_maroon) led_setall(0, 0, 0, 0); if (!has_maroon) led_setall(0, 0, 1, 1); } } void setup() { activate_output_group(IO_LEDS); // LED bits als Output maroon_setup(); motpwm_init(); motpid_init(); odometry_init(); analog_init(); while (key_getEvent()==EVENT_NONE) { // wait... } delay(100); delay(100); maroon_welcome(); motpid_stop(1); blink_led(1, 4); run = 1; } void loop() { nibo_checkMonitorVoltage(); analog_wait_update(); maroon_loop(); uint8_t event = getEvent(); handle_event(event); }
Compiler results:
Werbung
Online
adakinsey23451334
adelebeebe897815420
albaholroyd17255
alicevib4869957876
anne10s08691251131
arielkellum0637061
armanddelatorre8855
austineverard39
camillesmyth01589086
cliffwere078302938
connorkee794434
curtcoles893294048
dewayneo4846447140
drusillapayne578806
edisonlizotte4427
edithflemming421372
elisabroadus2257
elmatorrence2036594
franchescamaness
freddymunson4969971
gabrielabrownlow
gildatown8829186
hassanlaboureyas8
humbertoann148070
hunter94
jaclyntrevino203141
jamierapp475936
jamilamcgarry907281
janetitg188521920
jannroth934021821419
jeffryaiello27385282
jewelljeffers169
jimmieball8430658
keishahawley1640
kerstinmcginnis
kobymorrice978557
krystynazinke5462463
KylieSat
leliabaughan2211
leomabrandt3216100
margarita650153701567
melisacastiglia060
rachelcrossley52
rongair39316288
rosaline10w81270
roseannacockle5083
shanetill399164116566
shavonnetrower2
sheliacouncil260
simonw5533200075
thaliaburrow7849884
warrenhinder6456
zackirvin72719811111