You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

144 lines
3.6 KiB

/*
Copyright (c) 2012 Arduino LLC. All right reserved.
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef ArduinoRobot_h
#define ArduinoRobot_h
#include "EasyTransfer2.h"
#include "Multiplexer.h"
#include "LineFollow.h"
#if ARDUINO >= 100
#include "Arduino.h"
#else
#include "WProgram.h"
#endif
//Command code
#define COMMAND_SWITCH_MODE 0
#define COMMAND_RUN 10
#define COMMAND_MOTORS_STOP 11
#define COMMAND_ANALOG_WRITE 20
#define COMMAND_DIGITAL_WRITE 30
#define COMMAND_ANALOG_READ 40
#define COMMAND_ANALOG_READ_RE 41
#define COMMAND_DIGITAL_READ 50
#define COMMAND_DIGITAL_READ_RE 51
#define COMMAND_READ_IR 60
#define COMMAND_READ_IR_RE 61
#define COMMAND_ACTION_DONE 70
#define COMMAND_READ_TRIM 80
#define COMMAND_READ_TRIM_RE 81
#define COMMAND_PAUSE_MODE 90
#define COMMAND_LINE_FOLLOW_CONFIG 100
//component codename
#define CN_LEFT_MOTOR 0
#define CN_RIGHT_MOTOR 1
#define CN_IR 2
//motor board modes
#define MODE_SIMPLE 0
#define MODE_LINE_FOLLOW 1
#define MODE_ADJUST_MOTOR 2
#define MODE_IR_CONTROL 3
//bottom TKs, just for communication purpose
#define B_TK1 201
#define B_TK2 202
#define B_TK3 203
#define B_TK4 204
/*
A message structure will be:
switch mode (2):
byte COMMAND_SWITCH_MODE, byte mode
run (5):
byte COMMAND_RUN, int speedL, int speedR
analogWrite (3):
byte COMMAND_ANALOG_WRITE, byte codename, byte value;
digitalWrite (3):
byte COMMAND_DIGITAL_WRITE, byte codename, byte value;
analogRead (2):
byte COMMAND_ANALOG_READ, byte codename;
analogRead _return_ (4):
byte COMMAND_ANALOG_READ_RE, byte codename, int value;
digitalRead (2):
byte COMMAND_DIGITAL_READ, byte codename;
digitalRead _return_ (4):
byte COMMAND_DIGITAL_READ_RE, byte codename, int value;
read IR (1):
byte COMMAND_READ_IR;
read IR _return_ (9):
byte COMMAND_READ_IR_RE, int valueA, int valueB, int valueC, int valueD;
*/
class RobotMotorBoard:public LineFollow{
public:
RobotMotorBoard();
void begin();
void process();
void parseCommand();
int IRread(uint8_t num);
void setMode(uint8_t mode);
void pauseMode(bool onOff);
void motorsWrite(int speedL, int speedR);
void motorsWritePct(int speedLpct, int speedRpct);//write motor values in percentage
void motorsStop();
private:
float motorAdjustment;//-1.0 ~ 1.0, whether left is lowered or right is lowered
//convert codename to actual pins
uint8_t parseCodename(uint8_t codename);
uint8_t codenameToAPin(uint8_t codename);
void stopCurrentActions();
//void sendCommand(byte command,byte codename,int value);
void _analogWrite(uint8_t codename, int value);
void _digitalWrite(uint8_t codename, bool value);
void _analogRead(uint8_t codename);
void _digitalRead(uint8_t codename);
int _IRread(uint8_t num);
void _readIR();
void _readTrim();
void _refreshMotorAdjustment();
Multiplexer IRs;
uint8_t mode;
uint8_t isPaused;
EasyTransfer2 messageIn;
EasyTransfer2 messageOut;
//Line Following
void reportActionDone();
};
extern RobotMotorBoard RobotMotor;
#endif