ActivityBot Mode Select with RST Button
Andy Lindsay (Parallax)
Posts: 1,919
This program makes it easy to select between more than one different ActivityBot behavior. To advance from one mode to the next, just press and release the RST button.
Mode 0 just blinks the Activity Board's P26 and P27 lights.
Mode 1 goes forward slowly
Mode 2 goes quickly
Mode 3 does a forward, right, left, backward maneuver.
The code below is just a simple example that shows how each mode can have a different behavior. Expand these as much as you like, you can even add all the functional code from a few different ActivityBot Tutorial example programs and have a cool little configurable demo bot.
ActivityBot Tutorials
http://learn.parallax.com/activitybot
How it Works
The program starts by reading a value from the 2nd to last byte in the ActivityBoard's EEPROM memory, adds 1 to it, and writes the new value back to the same address for the next time. Then, it uses byte %= 4 to divide 4 into the byte value and get the remainder. This value can be 0, 1, 2, or 3 for a total of four modes. You can set the number of modes by changing the byte %= 4 line. For example, if you change it to byte %= 3, you will have three modes instead (0, 1, 2). Just make sure that your code decides what to do with all the modes.
Mode 0 just blinks the Activity Board's P26 and P27 lights.
Mode 1 goes forward slowly
Mode 2 goes quickly
Mode 3 does a forward, right, left, backward maneuver.
The code below is just a simple example that shows how each mode can have a different behavior. Expand these as much as you like, you can even add all the functional code from a few different ActivityBot Tutorial example programs and have a cool little configurable demo bot.
ActivityBot Tutorials
http://learn.parallax.com/activitybot
How it Works
The program starts by reading a value from the 2nd to last byte in the ActivityBoard's EEPROM memory, adds 1 to it, and writes the new value back to the same address for the next time. Then, it uses byte %= 4 to divide 4 into the byte value and get the remainder. This value can be 0, 1, 2, or 3 for a total of four modes. You can set the number of modes by changing the byte %= 4 line. For example, if you change it to byte %= 3, you will have three modes instead (0, 1, 2). Just make sure that your code decides what to do with all the modes.
#include "simpletools.h" // Library includes #include "abdrive.h" int main() // Main function { int byte = ee_getByte(32768); // Get a byte from EEPROM ee_putByte(byte + 1, 32768); // Add 1, put back for next time byte %= 4; // Result in 0...3 range. set_outputs(27, 26, byte); set_directions(27, 26, 0b11); // Lights indicate mode if(byte == 0) // Mode 0? { while(1) // Lights display up-count { set_outputs(27, 26, byte++); pause(100); } } else if(byte == 1) // Mode 1? { drive_speed(32, 32); // Forward slowly } else if(byte == 2) // Mode 2? { drive_speed(128, 128); // Fast forward } else if(byte == 3) // Mode 3? { drive_goto(128, 128); // Forward 128 pause(200); // Pause 2/10 second drive_goto(64, -64); // Right 64 pause(200); drive_goto(-64, 64); // Left 64 pause(200); drive_goto(-128, -128); // Backward 128 pause(200); } }
Comments
Brings up a question, though...
With the ActivityBot calibration data being stored in eeprom and this 1 byte data being stored, is there an address that I should use for storing my Compass calibration data? I don't want my compass data to overwrite other learn.parallax.com tutorial stored bits. I'll probably want to store a few longs worth of latitude, longitude and Magnetic declination data.
Thanks,
dgately
The ActivityBot currently uses 63418....65460 for ActivityBot calibration settings. Shrinking that is near the top of my hit list for reducing memory consumption. We haven't released it yet, but compass calibration is slated for 65478...65504.
Our plan is to always prominently display EEPROM dependencies in library documentation. For example, check out the Macros section near the start of ...Documents/SimpleIDE/Learn/Simple Libraries/ActivityBot/Documentation abdrive Library.html.
jazzed recommended an index, kind of like a one stop shop where library factoids like this can be found. We wholeheartedly agree. By adding EEPROM usage as #defines and documenting them in the header comments (which are auto-generated into the html docs), it'll help ensure that there is something crawlable for an indexing feature.
Andy
Can the libraries provide a variable (user_EEPROM_Start) that marks the spot where it is safe for Users to start using it?
Or just have a "gentleman's agreement" that's documented someplace - 0x8000-0x8100 reserved for libraries
The plan was to use addresses closer to 65535 for library configuration data (when needed). So, it's best to build from 32768 upward for application configuration data.
I should really change the example to 32768, or at least something that's a lower address in that upper (32768...65535) half of the EEPROM.
...and for those of you following along, EEPROM addresses 0...32767 is where ActivityBot example programs are stored. So, EEPROM addresses from 32768 to 65535 can be used for storing values. The great thing about EEPROM is that unlike RAM, EEPROM data is non-volatile, meaning that it remembers the data even after power has been turned off and back on.
Ah, that's good! Not sure what format you are going to use for compass data (I've been looking at how it's stored/communicated/coded in other examples such as from GPS devices, in databases, within code, etc.), but I'll temporarily store my placeholder data there and update when learn.parallax.com tutorials for the compass come out.
Thanks again!
dgately