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.
393 lines
10 KiB
393 lines
10 KiB
5 years ago
|
/*
|
||
|
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 "Arduino_LCD.h" // Hardware-specific library
|
||
|
//#include "FormattedText.h"
|
||
|
#include "SquawkSD.h"
|
||
|
#include "Multiplexer.h"
|
||
|
#include "EasyTransfer2.h"
|
||
|
#include "EEPROM_I2C.h"
|
||
|
#include "Compass.h"
|
||
|
#include "Fat16.h"
|
||
|
|
||
|
#if ARDUINO >= 100
|
||
|
#include "Arduino.h"
|
||
|
#else
|
||
|
#include "WProgram.h"
|
||
|
#endif
|
||
|
|
||
|
|
||
|
#define BUTTON_NONE -1
|
||
|
#define BUTTON_LEFT 0
|
||
|
#define BUTTON_DOWN 1
|
||
|
#define BUTTON_UP 2
|
||
|
#define BUTTON_RIGHT 3
|
||
|
#define BUTTON_MIDDLE 4
|
||
|
#define NUMBER_BUTTONS 5
|
||
|
|
||
|
//beep length
|
||
|
#define BEEP_SIMPLE 0
|
||
|
#define BEEP_DOUBLE 1
|
||
|
#define BEEP_LONG 2
|
||
|
|
||
|
// image locations on the EEPROM
|
||
|
#define HOME_BMP 0
|
||
|
#define BATTERY_BMP 2048
|
||
|
#define COMPASS_BMP 4096
|
||
|
#define CONTROL_BMP 6144
|
||
|
#define GEARS_BMP 8192
|
||
|
#define LIGHT_BMP 10240
|
||
|
#define OSCILLO_BMP 12288
|
||
|
#define VOLT_BMP 14336
|
||
|
#define INICIO_BMP 16384 // this is a full screen splash
|
||
|
|
||
|
//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
|
||
|
|
||
|
//port types, for R/W
|
||
|
#define TYPE_TOP_TK 0
|
||
|
#define TYPE_TOP_TKD 1
|
||
|
#define TYPE_BOTTOM_TK 2
|
||
|
|
||
|
//top TKs
|
||
|
#define TK0 100
|
||
|
#define TK1 101
|
||
|
#define TK2 102
|
||
|
#define TK3 103
|
||
|
#define TK4 104
|
||
|
#define TK5 105
|
||
|
#define TK6 106
|
||
|
#define TK7 107
|
||
|
|
||
|
#define M0 TK0
|
||
|
#define M1 TK1
|
||
|
#define M2 TK2
|
||
|
#define M3 TK3
|
||
|
#define M4 TK4
|
||
|
#define M5 TK5
|
||
|
#define M6 TK6
|
||
|
#define M7 TK7
|
||
|
|
||
|
//bottom TKs, just for communication purpose
|
||
|
#define B_TK1 201
|
||
|
#define B_TK2 202
|
||
|
#define B_TK3 203
|
||
|
#define B_TK4 204
|
||
|
|
||
|
#define D10 B_TK1
|
||
|
#define D9 B_TK2
|
||
|
#define D8 B_TK4
|
||
|
#define D7 B_TK3
|
||
|
|
||
|
//bottom IRs, for communication purpose
|
||
|
#define B_IR0 210
|
||
|
#define B_IR1 211
|
||
|
#define B_IR2 212
|
||
|
#define B_IR3 213
|
||
|
#define B_IR4 214
|
||
|
|
||
|
#ifndef LED1
|
||
|
#define LED1 17
|
||
|
#endif
|
||
|
|
||
|
//320 - 337 username,
|
||
|
#define ADDRESS_USERNAME 320
|
||
|
//338 - 355 robotname,
|
||
|
#define ADDRESS_ROBOTNAME 338
|
||
|
//356 - 373 cityname,
|
||
|
#define ADDRESS_CITYNAME 356
|
||
|
//374- 391 countryname,
|
||
|
#define ADDRESS_COUNTRYNAME 374
|
||
|
//508-511 robot info
|
||
|
#define ADDRESS_ROBOTINFO 508
|
||
|
|
||
|
#define BLACK ILI9163C_BLACK
|
||
|
#define BLUE ILI9163C_BLUE
|
||
|
#define RED ILI9163C_RED
|
||
|
#define GREEN ILI9163C_GREEN
|
||
|
#define CYAN ILI9163C_CYAN
|
||
|
#define MAGENTA ILI9163C_MAGENTA
|
||
|
#define YELLOW ILI9163C_YELLOW
|
||
|
#define WHITE ILI9163C_WHITE
|
||
|
|
||
|
//A data structure for storing the current state of motor board
|
||
|
struct MOTOR_BOARD_DATA{
|
||
|
int _B_TK1;
|
||
|
int _B_TK2;
|
||
|
int _B_TK3;
|
||
|
int _B_TK4;
|
||
|
|
||
|
/*int _B_IR0;
|
||
|
int _B_IR1;
|
||
|
int _B_IR2;
|
||
|
int _B_IR3;
|
||
|
int _B_IR4;*/
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
A message structure will be:
|
||
|
switch mode:
|
||
|
byte COMMAND_SWITCH_MODE, byte mode
|
||
|
run:
|
||
|
byte COMMAND_RUN, int speedL, int speedR
|
||
|
analogWrite:
|
||
|
byte COMMAND_ANALOG_WRITE, byte codename, byte value;
|
||
|
digitalWrite:
|
||
|
byte COMMAND_DIGITAL_WRITE, byte codename, byte value;
|
||
|
analogRead:
|
||
|
byte COMMAND_ANALOG_READ, byte codename;
|
||
|
analogRead return:
|
||
|
byte COMMAND_ANALOG_READ_RE, byte codename, int value;
|
||
|
digitalRead return:
|
||
|
byte COMMAND_DIGITAL_READ_RE, byte codename, byte value;
|
||
|
read IR:
|
||
|
byte COMMAND_READ_IR, int valueA, int valueB, int valueC, int valueD;
|
||
|
|
||
|
|
||
|
*/
|
||
|
#define NUM_EEPROM_BMP 10
|
||
|
struct EEPROM_BMP{
|
||
|
char name[8];
|
||
|
uint8_t width;
|
||
|
uint8_t height;
|
||
|
uint16_t address;
|
||
|
};
|
||
|
|
||
|
//if you call #undef USE_SQUAWK_SYNTH_SD at the beginning of your sketch,
|
||
|
//it's going to remove anything regarding sound playing
|
||
|
|
||
|
class RobotControl:public Multiplexer,
|
||
|
public EEPROM_I2C,
|
||
|
public Compass,
|
||
|
public SquawkSynthSD,
|
||
|
//public FormattedText
|
||
|
public Arduino_LCD
|
||
|
{
|
||
|
public:
|
||
|
RobotControl();
|
||
|
void begin();
|
||
|
void setMode(uint8_t mode);
|
||
|
|
||
|
//Read & Write, TK0 - TK7, TKD0 - TKD1, bottom TK0 - TK4
|
||
|
bool digitalRead(uint8_t port);
|
||
|
int analogRead(uint8_t port);
|
||
|
void digitalWrite(uint8_t port, bool value);
|
||
|
void analogWrite(uint8_t port, uint8_t value);//It's not available, as there's no pin can be used for analog write
|
||
|
|
||
|
//IR sensors from the bottom board
|
||
|
//define an array as "int arr[4];", and supply the arry name here
|
||
|
uint16_t IRarray[5];
|
||
|
void updateIR();
|
||
|
|
||
|
//on board Potentiometor
|
||
|
int knobRead();
|
||
|
//Potentiometor of the motor board
|
||
|
int trimRead();
|
||
|
|
||
|
//on board piezo
|
||
|
void beginSpeaker(uint16_t frequency=44100);
|
||
|
void playMelody(char* script);
|
||
|
void playFile(char* filename);
|
||
|
void stopPlayFile();
|
||
|
void beep(int beep_length=BEEP_SIMPLE);
|
||
|
void tempoWrite(int tempo);
|
||
|
void tuneWrite(float tune);
|
||
|
|
||
|
//compass
|
||
|
uint16_t compassRead();
|
||
|
void drawCompass(uint16_t value);
|
||
|
void drawBase();
|
||
|
void drawDire(int16_t dire);
|
||
|
|
||
|
//keyboard
|
||
|
void keyboardCalibrate(int *vals);
|
||
|
int8_t keyboardRead();//return the key that is being pressed?Has been pressed(with _processKeyboard)?
|
||
|
|
||
|
//movement
|
||
|
void moveForward(int speed);
|
||
|
void moveBackward(int speed);
|
||
|
void turnLeft(int speed);
|
||
|
void turnRight(int speed);
|
||
|
void motorsStop();
|
||
|
void motorsWritePct(int speedLeftPct, int speedRightPct);
|
||
|
|
||
|
void motorsWrite(int speedLeft,int speedRight);
|
||
|
void pointTo(int degrees);//turn to an absolute angle from the compass
|
||
|
void turn(int degress);//turn certain degrees from the current heading
|
||
|
|
||
|
//Line Following
|
||
|
void lineFollowConfig(uint8_t KP, uint8_t KD, uint8_t robotSpeed, uint8_t intergrationTime);//default 11 5 50 10
|
||
|
|
||
|
//TFT LCD
|
||
|
//use the same commands as Arduino_LCD
|
||
|
void beginTFT(uint16_t foreGround=BLACK, uint16_t background=WHITE);
|
||
|
/*void text(int value, uint8_t posX, uint8_t posY, bool EW);
|
||
|
void text(long value, uint8_t posX, uint8_t posY, bool EW);
|
||
|
void text(char* value, uint8_t posX, uint8_t posY, bool EW);
|
||
|
void text(char value, uint8_t posX, uint8_t posY, bool EW);*/
|
||
|
void debugPrint(long value, uint8_t x=0, uint8_t y=0);
|
||
|
void clearScreen();
|
||
|
|
||
|
void drawBMP(char* filename, uint8_t x, uint8_t y);//detect if draw with EEPROM or SD, and draw it
|
||
|
void _drawBMP(uint32_t iconOffset, uint8_t x, uint8_t y, uint8_t width, uint8_t height);//draw from EEPROM
|
||
|
void _drawBMP(char* filename, uint8_t x, uint8_t y);//draw from SD
|
||
|
void beginBMPFromEEPROM();
|
||
|
void endBMPFromEEPROM();
|
||
|
|
||
|
uint16_t foreGround;//foreground color
|
||
|
uint16_t backGround;//background color
|
||
|
|
||
|
|
||
|
//SD card
|
||
|
void beginSD();
|
||
|
|
||
|
//Information
|
||
|
void userNameRead(char* container);
|
||
|
void robotNameRead(char* container);
|
||
|
void cityNameRead(char* container);
|
||
|
void countryNameRead(char* container);
|
||
|
|
||
|
void userNameWrite(char* text);
|
||
|
void robotNameWrite(char* text);
|
||
|
void cityNameWrite(char* text);
|
||
|
void countryNameWrite(char* text);
|
||
|
|
||
|
//Others
|
||
|
bool isActionDone();
|
||
|
void pauseMode(uint8_t onOff);
|
||
|
void displayLogos();
|
||
|
void waitContinue(uint8_t key=BUTTON_MIDDLE);
|
||
|
|
||
|
private:
|
||
|
//Read & Write
|
||
|
uint8_t _getTypeCode(uint8_t port);//different ports need different actions
|
||
|
uint8_t _portToTopMux(uint8_t port);//get the number for multiplexer within top TKs
|
||
|
uint8_t _topDPortToAPort(uint8_t port);//get the corrensponding analogIn pin for top TKDs
|
||
|
|
||
|
bool _digitalReadTopMux(uint8_t port);//TK0 - TK7
|
||
|
int _analogReadTopMux(uint8_t port);
|
||
|
|
||
|
bool _digitalReadTopPin(uint8_t port);
|
||
|
int _analogReadTopPin(uint8_t port);
|
||
|
void _digitalWriteTopPin(uint8_t port, bool value);
|
||
|
|
||
|
MOTOR_BOARD_DATA motorBoardData;
|
||
|
int* parseMBDPort(uint8_t port);
|
||
|
int get_motorBoardData(uint8_t port);
|
||
|
void set_motorBoardData(uint8_t port, int value);
|
||
|
|
||
|
bool _requestDigitalRead(uint8_t port);
|
||
|
int _requestAnalogRead(uint8_t port);
|
||
|
void _requestDigitalWrite(uint8_t port, uint8_t value);
|
||
|
|
||
|
//LCD
|
||
|
void _enableLCD();
|
||
|
void _setWrite(uint8_t posX, uint8_t posY);
|
||
|
void _setErase(uint8_t posX, uint8_t posY);
|
||
|
|
||
|
|
||
|
//SD
|
||
|
SdCard card;
|
||
|
Fat16 file;
|
||
|
Fat16 melody;
|
||
|
void _enableSD();
|
||
|
|
||
|
//keyboard
|
||
|
void _processKeyboard(); //need to run in loop, detect if the key is actually pressed
|
||
|
int averageAnalogInput(int pinNum);
|
||
|
|
||
|
//Ultrasonic ranger
|
||
|
//uint8_t pinTrigger_UR;
|
||
|
//uint8_t pinEcho_UR;
|
||
|
|
||
|
//Melody
|
||
|
void playNote(byte period, word length, char modifier);
|
||
|
|
||
|
//Communication
|
||
|
|
||
|
EasyTransfer2 messageOut;
|
||
|
EasyTransfer2 messageIn;
|
||
|
|
||
|
//TFT LCD
|
||
|
bool _isEEPROM_BMP_Allocated;
|
||
|
EEPROM_BMP * _eeprom_bmp;
|
||
|
void _drawBMP_EEPROM(uint16_t address, uint8_t width, uint8_t height);
|
||
|
void _drawBMP_SD(char* filename, uint8_t x, uint8_t y);
|
||
|
|
||
|
|
||
|
};
|
||
|
|
||
|
inline void RobotControl::userNameRead(char* container){
|
||
|
EEPROM_I2C::readBuffer(ADDRESS_USERNAME,(uint8_t*)container,18);
|
||
|
}
|
||
|
inline void RobotControl::robotNameRead(char* container){
|
||
|
EEPROM_I2C::readBuffer(ADDRESS_ROBOTNAME,(uint8_t*)container,18);
|
||
|
}
|
||
|
inline void RobotControl::cityNameRead(char* container){
|
||
|
EEPROM_I2C::readBuffer(ADDRESS_CITYNAME,(uint8_t*)container,18);
|
||
|
}
|
||
|
inline void RobotControl::countryNameRead(char* container){
|
||
|
EEPROM_I2C::readBuffer(ADDRESS_COUNTRYNAME,(uint8_t*)container,18);
|
||
|
}
|
||
|
|
||
|
inline void RobotControl::userNameWrite(char* text){
|
||
|
EEPROM_I2C::writePage(ADDRESS_USERNAME,(uint8_t*)text,18);
|
||
|
}
|
||
|
inline void RobotControl::robotNameWrite(char* text){
|
||
|
EEPROM_I2C::writePage(ADDRESS_ROBOTNAME,(uint8_t*)text,18);
|
||
|
}
|
||
|
inline void RobotControl::cityNameWrite(char* text){
|
||
|
EEPROM_I2C::writePage(ADDRESS_CITYNAME,(uint8_t*)text,18);
|
||
|
}
|
||
|
inline void RobotControl::countryNameWrite(char* text){
|
||
|
EEPROM_I2C::writePage(ADDRESS_COUNTRYNAME,(uint8_t*)text,18);
|
||
|
}
|
||
|
|
||
|
extern RobotControl Robot;
|
||
|
|
||
|
#endif
|