The preloaded firmware shipped on the mBot.
Dependencies: mbed
Fork of Official_mBot by
Diff: main.cpp
- Revision:
- 0:865d42c46692
- Child:
- 1:ffd9a51e7d35
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Tue Nov 25 14:34:47 2014 +0000 @@ -0,0 +1,214 @@ +/* +** This software can be freely used, even comercially, as highlighted in the license. +** +** Copyright 2014 GHI Electronics, LLC +** +** Licensed under the Apache License, Version 2.0 (the "License"); +** you may not use this file except in compliance with the License. +** You may obtain a copy of the License at +** +** http://www.apache.org/licenses/LICENSE-2.0 +** +** Unless required by applicable law or agreed to in writing, software +** distributed under the License is distributed on an "AS IS" BASIS, +** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +** See the License for the specific language governing permissions and +** limitations under the License. +** +**/ + +#include "mbed.h" +#include "mBot.h" + +#define MOTOR_SPEED 50 +// 0.5 was too sensitive, just spun on light table +// 0.9 was too sensitive for dark tables, with 10 bit precision +#define REFLECTIVITY_READING 0.950 + +bool OverEdge(bool * leftOverEdge, bool * rightOverEdge, int threshold_l, int threshold_r); + + +int base_reflective_l; +int base_reflective_r; + +DigitalOut LED[] = {(P1_19), (P0_19), (P0_20), (P0_2)}; +static const int LED_L1 = 0; +static const int LED_L2 = 1; +static const int LED_R1 = 2; +static const int LED_R2 = 3; +static const int LED_COUNT = 4; + +static int next_LED = 0; +void LEDfrontOn(){ + LED[LED_L1] = 1; + LED[LED_R1] = 1; +}; +void LEDfrontOff(){ + LED[LED_L1] = 0; + LED[LED_R1] = 0; +}; +void LEDbackOn(){ + LED[LED_L2] = 1; + LED[LED_R2] = 1; +}; +void LEDbackOff(){ + LED[LED_L2] = 0; + LED[LED_R2] = 0; +}; +void LEDsOff(){ + for (int ix = 0; ix < LED_COUNT; ix++) LED[ix] = 0; +} + + +DigitalOut Buzzer(P0_18); // 18 mbot, 14 lovemeter +void soundBuzzer(int Hz) +{ + int ticks = Hz/64; + int tickCount = 0; + float frequency = 1/(float)Hz; + + while(tickCount < ticks) { + wait(frequency); + Buzzer = true; + wait(frequency); + Buzzer = false; + tickCount++; + } +} +void soundBreaks() { + for (int ix = 1; ix <= 10; ix++) { + soundBuzzer((ix * 100) + 1500); + } +} +void soundMotorStart() { + for (int ix = 1; ix <= 35; ix++) { + soundBuzzer(ix * 100 + 800); + } +} +void soundForward() { + soundBuzzer(1000); +} + +typedef DigitalIn Button_t; +Button_t btn1(P0_1, PullUp); +//Button_t btn2(P0_16, PullUp); + + +bool buttonIsUp(Button_t * button){ + return *button == 1; +}; + +mBot mybot; +void stopIfButtonPress(){ + if (!buttonIsUp(&btn1)){ + LEDsOff(); + mybot.SetReflectiveSensorState(0); + mybot.SetMotorSpeed(0,0); + deepsleep(); + } +} +void startTone() { + for (int ix = 1; ix <= 5; ix++) { + soundBuzzer(500); + } +} +void startUp(){ + LEDsOff(); + + next_LED = 0; LED[next_LED++] = 1; + startTone(); wait_ms(10); + if (next_LED >= LED_COUNT) next_LED = 0; LED[next_LED++] = 1; + startTone(); wait_ms(10); + if (next_LED >= LED_COUNT) next_LED = 0; LED[next_LED++] = 1; + startTone(); wait_ms(10); + if (next_LED >= LED_COUNT) next_LED = 0; LED[next_LED++] = 1; + startTone(); wait_ms(20); + if (next_LED >= LED_COUNT) next_LED = 0; LED[next_LED++] = 1; + startTone(); wait_ms(20); + if (next_LED >= LED_COUNT) next_LED = 0; LED[next_LED++] = 1; + startTone(); wait_ms(20); + if (next_LED >= LED_COUNT) next_LED = 0; LED[next_LED++] = 1; + startTone(); wait_ms(40); + if (next_LED >= LED_COUNT) next_LED = 0; LED[next_LED++] = 1; + startTone(); wait_ms(40); + if (next_LED < LED_COUNT && next_LED >= 0) LED[next_LED-1] = 0; + startTone(); + LEDfrontOn(); + LEDbackOff(); +} +int main() +{ + int overleft; + int overright; + int left_temp; + int right_temp; + int LEDblinkCounter = 0; + startUp(); + // add time slicing for waits + mybot.SetMotorSpeed(MOTOR_SPEED, MOTOR_SPEED); + wait_ms(10); + while(1) + { + //wait_ms(5); + overleft = mybot.GetReflectiveReading(mybot.Left) > REFLECTIVITY_READING; + overright = mybot.GetReflectiveReading(mybot.Right)> REFLECTIVITY_READING; + stopIfButtonPress(); + if (LEDblinkCounter++ < 8000) { + if (LEDblinkCounter == 4000) { + LEDfrontOff(); + soundForward(); // slight wait here + } + } else { + LEDfrontOn(); + LEDblinkCounter = 0; + soundForward(); // slight wait here + } + + if( overleft || overright ) + { + + mybot.SetMotorSpeed(0,0); + LEDfrontOff(); + LEDbackOn(); + //wait_us(100); + if (overleft && overright) + { + left_temp = -30; + right_temp = 30; + } + else if (overleft) + { + left_temp = 60; + right_temp = -50; + } + else + { + left_temp = -50; + right_temp = 60; + } + + // back straight for a safety margin and comeabout + mybot.SetMotorSpeed(-80, -80); + wait_ms(325); + mybot.SetMotorSpeed(0,0); + wait_ms(5); + mybot.SetMotorSpeed(left_temp, right_temp); + wait_ms(300); + LEDbackOff(); + mybot.SetMotorSpeed(0,0); + LEDfrontOn(); + LEDblinkCounter = 0; + soundBreaks(); + mybot.SetMotorSpeed(MOTOR_SPEED,MOTOR_SPEED); + /* + for (left_temp = 10; left_temp <= MOTOR_SPEED; left_temp += 10) + { + mybot.SetMotorSpeed(left_temp,left_temp); + wait_ms(75); + } + */ + + } + } +} +