mirror of
https://github.com/arduino/Arduino.git
synced 2025-01-30 19:52:13 +01:00
Merge branch 'master' into ide-1.5.x
This commit is contained in:
commit
a96c8cab12
@ -518,6 +518,18 @@ public class Compiler implements MessageConsumer {
|
||||
}
|
||||
}
|
||||
|
||||
if (s.contains("undefined reference to `SPIClass::begin()'") &&
|
||||
s.contains("libraries/Robot_Control")) {
|
||||
String error = _("Please import the SPI library from the Sketch > Import Library menu.");
|
||||
exception = new RunnerException(error);
|
||||
}
|
||||
|
||||
if (s.contains("undefined reference to `Wire'") &&
|
||||
s.contains("libraries/Robot_Control")) {
|
||||
String error = _("Please import the Wire library from the Sketch > Import Library menu.");
|
||||
exception = new RunnerException(error);
|
||||
}
|
||||
|
||||
System.err.print(s);
|
||||
}
|
||||
|
||||
|
@ -37,23 +37,23 @@
|
||||
#define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)
|
||||
#endif
|
||||
|
||||
#define SS 10
|
||||
#define MOSI 11
|
||||
#define MISO 12
|
||||
#define SCK 13
|
||||
static const uint8_t SS = 10;
|
||||
static const uint8_t MOSI = 11;
|
||||
static const uint8_t MISO = 12;
|
||||
static const uint8_t SCK = 13;
|
||||
|
||||
#define SDA 18
|
||||
#define SCL 19
|
||||
static const uint8_t SDA = 18;
|
||||
static const uint8_t SCL = 19;
|
||||
#define LED_BUILTIN 9
|
||||
|
||||
#define A0 14
|
||||
#define A1 15
|
||||
#define A2 16
|
||||
#define A3 17
|
||||
#define A4 18
|
||||
#define A5 19
|
||||
#define A6 20
|
||||
#define A7 21
|
||||
static const uint8_t A0 = 14;
|
||||
static const uint8_t A1 = 15;
|
||||
static const uint8_t A2 = 16;
|
||||
static const uint8_t A3 = 17;
|
||||
static const uint8_t A4 = 18;
|
||||
static const uint8_t A5 = 19;
|
||||
static const uint8_t A6 = 20;
|
||||
static const uint8_t A7 = 21;
|
||||
|
||||
#define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
|
||||
#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))
|
||||
|
@ -99,30 +99,30 @@
|
||||
#define RXLED0 PORTB |= (1<<0)
|
||||
#define RXLED1 PORTB &= ~(1<<0)
|
||||
|
||||
#define SDA 2
|
||||
#define SCL 3
|
||||
static const uint8_t SDA = 2;
|
||||
static const uint8_t SCL = 3;
|
||||
#define LED_BUILTIN 13
|
||||
|
||||
// Map SPI port to 'new' pins D14..D17
|
||||
#define SS 17
|
||||
#define MOSI 16
|
||||
#define MISO 14
|
||||
#define SCK 15
|
||||
static const uint8_t SS = 17;
|
||||
static const uint8_t MOSI = 16;
|
||||
static const uint8_t MISO = 14;
|
||||
static const uint8_t SCK = 15;
|
||||
|
||||
// Mapping of analog pins as digital I/O
|
||||
// A6-A11 share with digital pins
|
||||
#define A0 18
|
||||
#define A1 19
|
||||
#define A2 20
|
||||
#define A3 21
|
||||
#define A4 22
|
||||
#define A5 23
|
||||
#define A6 24 // D4
|
||||
#define A7 25 // D6
|
||||
#define A8 26 // D8
|
||||
#define A9 27 // D9
|
||||
#define A10 28 // D10
|
||||
#define A11 29 // D12
|
||||
static const uint8_t A0 = 18;
|
||||
static const uint8_t A1 = 19;
|
||||
static const uint8_t A2 = 20;
|
||||
static const uint8_t A3 = 21;
|
||||
static const uint8_t A4 = 22;
|
||||
static const uint8_t A5 = 23;
|
||||
static const uint8_t A6 = 24; // D4
|
||||
static const uint8_t A7 = 25; // D6
|
||||
static const uint8_t A8 = 26; // D8
|
||||
static const uint8_t A9 = 27; // D9
|
||||
static const uint8_t A10 = 28; // D10
|
||||
static const uint8_t A11 = 29; // D12
|
||||
|
||||
#define digitalPinToPCICR(p) ((((p) >= 8 && (p) <= 11) || ((p) >= 14 && (p) <= 17) || ((p) >= A8 && (p) <= A10)) ? (&PCICR) : ((uint8_t *)0))
|
||||
#define digitalPinToPCICRbit(p) 0
|
||||
|
@ -32,31 +32,31 @@
|
||||
#define analogInputToDigitalPin(p) ((p < 16) ? (p) + 54 : -1)
|
||||
#define digitalPinHasPWM(p) (((p) >= 2 && (p) <= 13) || ((p) >= 44 && (p)<= 46))
|
||||
|
||||
#define SS 53
|
||||
#define MOSI 51
|
||||
#define MISO 50
|
||||
#define SCK 52
|
||||
static const uint8_t SS = 53;
|
||||
static const uint8_t MOSI = 51;
|
||||
static const uint8_t MISO = 50;
|
||||
static const uint8_t SCK = 52;
|
||||
|
||||
#define SDA 20
|
||||
#define SCL 21
|
||||
static const uint8_t SDA = 20;
|
||||
static const uint8_t SCL = 21;
|
||||
#define LED_BUILTIN 13
|
||||
|
||||
#define A0 54
|
||||
#define A1 55
|
||||
#define A2 56
|
||||
#define A3 57
|
||||
#define A4 58
|
||||
#define A5 59
|
||||
#define A6 60
|
||||
#define A7 61
|
||||
#define A8 62
|
||||
#define A9 63
|
||||
#define A10 64
|
||||
#define A11 65
|
||||
#define A12 66
|
||||
#define A13 67
|
||||
#define A14 68
|
||||
#define A15 69
|
||||
static const uint8_t A0 = 54;
|
||||
static const uint8_t A1 = 55;
|
||||
static const uint8_t A2 = 56;
|
||||
static const uint8_t A3 = 57;
|
||||
static const uint8_t A4 = 58;
|
||||
static const uint8_t A5 = 59;
|
||||
static const uint8_t A6 = 60;
|
||||
static const uint8_t A7 = 61;
|
||||
static const uint8_t A8 = 62;
|
||||
static const uint8_t A9 = 63;
|
||||
static const uint8_t A10 = 64;
|
||||
static const uint8_t A11 = 65;
|
||||
static const uint8_t A12 = 66;
|
||||
static const uint8_t A13 = 67;
|
||||
static const uint8_t A14 = 68;
|
||||
static const uint8_t A15 = 69;
|
||||
|
||||
// A majority of the pins are NOT PCINTs, SO BE WARNED (i.e. you cannot use them as receive pins)
|
||||
// Only pins available for RECEIVE (TRANSMIT can be on any pin):
|
||||
|
@ -43,52 +43,52 @@
|
||||
#define D4 TKD4
|
||||
#define D5 TKD5
|
||||
|
||||
#define RX 0
|
||||
#define TX 1
|
||||
#define SDA 2
|
||||
#define SCL 3
|
||||
static const uint8_t RX = 0;
|
||||
static const uint8_t TX = 1;
|
||||
static const uint8_t SDA = 2;
|
||||
static const uint8_t SCL = 3;
|
||||
|
||||
// Map SPI port to 'new' pins D14..D17
|
||||
#define SS 17
|
||||
#define MOSI 16
|
||||
#define MISO 14
|
||||
#define SCK 15
|
||||
static const uint8_t SS = 17;
|
||||
static const uint8_t MOSI = 16;
|
||||
static const uint8_t MISO = 14;
|
||||
static const uint8_t SCK = 15;
|
||||
|
||||
// Mapping of analog pins as digital I/O
|
||||
// A6-A11 share with digital pins
|
||||
#define A0 18
|
||||
#define A1 19
|
||||
#define A2 20
|
||||
#define A3 21
|
||||
#define A4 22
|
||||
#define A5 23
|
||||
#define A6 24 // D4
|
||||
#define A7 25 // D6
|
||||
#define A8 26 // D8
|
||||
#define A9 27 // D9
|
||||
#define A10 28 // D10
|
||||
#define A11 29 // D12
|
||||
static const uint8_t A0 = 18;
|
||||
static const uint8_t A1 = 19;
|
||||
static const uint8_t A2 = 20;
|
||||
static const uint8_t A3 = 21;
|
||||
static const uint8_t A4 = 22;
|
||||
static const uint8_t A5 = 23;
|
||||
static const uint8_t A6 = 24; // D4
|
||||
static const uint8_t A7 = 25; // D6
|
||||
static const uint8_t A8 = 26; // D8
|
||||
static const uint8_t A9 = 27; // D9
|
||||
static const uint8_t A10 = 28; // D10
|
||||
static const uint8_t A11 = 29; // D12
|
||||
|
||||
// Specific Mapping for the Control Board
|
||||
#define KEY 18 // AD0
|
||||
#define MUX_IN 24 // ADC8 - A6
|
||||
#define MUXA 6 // D5 - TKD4
|
||||
#define MUXB 11 // D11
|
||||
#define MUXC 12 // D12 - TKD5
|
||||
#define MUXD 13 // D13
|
||||
#define BUZZ 5 // D5
|
||||
#define POT 23 // AD5
|
||||
#define DC_LCD 10 // D10
|
||||
#define LCD_CS 9 // D9
|
||||
#define RST_LCD 7 // D6
|
||||
#define CARD_CS 8 // D8
|
||||
#define TKD0 19 // ADC6 - A1
|
||||
#define TKD1 20 // ADC5 - A2
|
||||
#define TKD2 21 // ADC4 - A3
|
||||
#define TKD3 22 // ADC1 - A4
|
||||
#define TKD4 6 // D5 - MUXA
|
||||
#define TKD5 12 // D12 - MUXC
|
||||
#define LED1 17 // D17 - RX_Led
|
||||
static const uint8_t KEY = 18; // AD0
|
||||
static const uint8_t MUX_IN = 24; // ADC8 - A6
|
||||
static const uint8_t MUXA = 6; // D5 - TKD4
|
||||
static const uint8_t MUXB = 11; // D11
|
||||
static const uint8_t MUXC = 12; // D12 - TKD5
|
||||
static const uint8_t MUXD = 13; // D13
|
||||
static const uint8_t BUZZ = 5; // D5
|
||||
static const uint8_t POT = 23; // AD5
|
||||
static const uint8_t DC_LCD = 10; // D10
|
||||
static const uint8_t LCD_CS = 9; // D9
|
||||
static const uint8_t RST_LCD = 7; // D6
|
||||
static const uint8_t CARD_CS = 8; // D8
|
||||
static const uint8_t TKD0 = 19; // ADC6 - A1
|
||||
static const uint8_t TKD1 = 20; // ADC5 - A2
|
||||
static const uint8_t TKD2 = 21; // ADC4 - A3
|
||||
static const uint8_t TKD3 = 22; // ADC1 - A4
|
||||
static const uint8_t TKD4 = 6; // D5 - MUXA
|
||||
static const uint8_t TKD5 = 12; // D12 - MUXC
|
||||
static const uint8_t LED1 = 17; // D17 - RX_Led
|
||||
|
||||
// __AVR_ATmega32U4__ has an unusual mapping of pins to channels
|
||||
extern const uint8_t PROGMEM analog_pin_to_channel_PGM[];
|
||||
|
@ -41,49 +41,49 @@
|
||||
#define D8 TK4
|
||||
#define D7 TK3
|
||||
|
||||
#define RX 0
|
||||
#define TX 1
|
||||
#define SDA 2
|
||||
#define SCL 3
|
||||
static const uint8_t RX = 0;
|
||||
static const uint8_t TX = 1;
|
||||
static const uint8_t SDA = 2;
|
||||
static const uint8_t SCL = 3;
|
||||
|
||||
// Map SPI port to 'new' pins D14..D17
|
||||
#define SS 17
|
||||
#define MOSI 16
|
||||
#define MISO 14
|
||||
#define SCK 15
|
||||
static const uint8_t SS = 17;
|
||||
static const uint8_t MOSI = 16;
|
||||
static const uint8_t MISO = 14;
|
||||
static const uint8_t SCK = 15;
|
||||
|
||||
// Mapping of analog pins as digital I/O
|
||||
// A6-A11 share with digital pins
|
||||
#define A0 18
|
||||
#define A1 19
|
||||
#define A2 20
|
||||
#define A3 21
|
||||
#define A4 22
|
||||
#define A5 23
|
||||
#define A6 24 // D4
|
||||
#define A7 25 // D6
|
||||
#define A8 26 // D8
|
||||
#define A9 27 // D9
|
||||
#define A10 28 // D10
|
||||
#define A11 29 // D12
|
||||
static const uint8_t A0 = 18;
|
||||
static const uint8_t A1 = 19;
|
||||
static const uint8_t A2 = 20;
|
||||
static const uint8_t A3 = 21;
|
||||
static const uint8_t A4 = 22;
|
||||
static const uint8_t A5 = 23;
|
||||
static const uint8_t A6 = 24; // D4
|
||||
static const uint8_t A7 = 25; // D6
|
||||
static const uint8_t A8 = 26; // D8
|
||||
static const uint8_t A9 = 27; // D9
|
||||
static const uint8_t A10 = 28; // D10
|
||||
static const uint8_t A11 = 29; // D12
|
||||
|
||||
// Specific Mapping for the Motor Board
|
||||
#define MUX_IN 20 // A2
|
||||
#define MUXA 7 // D7
|
||||
#define MUXB 8 // D8
|
||||
#define MUXC 11 // D11
|
||||
#define MUXI 13 // D13
|
||||
#define TRIM 21 // A3
|
||||
#define SENSE_A 22 // A4
|
||||
#define SENSE_B 23 // A5
|
||||
#define IN_A1 6 // D6 - A7
|
||||
#define IN_A2 5 // D5
|
||||
#define IN_B1 10 // D10
|
||||
#define IN_B2 9 // D9
|
||||
#define TK1 18 // A0
|
||||
#define TK2 19 // A1
|
||||
#define TK3 4 // A6
|
||||
#define TK4 12 // A11
|
||||
static const uint8_t MUX_IN = 20; // A2
|
||||
static const uint8_t MUXA = 7; // D7
|
||||
static const uint8_t MUXB = 8; // D8
|
||||
static const uint8_t MUXC = 11; // D11
|
||||
static const uint8_t MUXI = 13; // D13
|
||||
static const uint8_t TRIM = 21; // A3
|
||||
static const uint8_t SENSE_A = 22; // A4
|
||||
static const uint8_t SENSE_B = 23; // A5
|
||||
static const uint8_t IN_A1 = 6; // D6 - A7
|
||||
static const uint8_t IN_A2 = 5; // D5
|
||||
static const uint8_t IN_B1 = 10; // D10
|
||||
static const uint8_t IN_B2 = 9; // D9
|
||||
static const uint8_t TK1 = 18; // A0
|
||||
static const uint8_t TK2 = 19; // A1
|
||||
static const uint8_t TK3 = 4; // A6
|
||||
static const uint8_t TK4 = 12; // A11
|
||||
|
||||
// __AVR_ATmega32U4__ has an unusual mapping of pins to channels
|
||||
extern const uint8_t PROGMEM analog_pin_to_channel_PGM[];
|
||||
|
@ -37,23 +37,23 @@
|
||||
#define digitalPinHasPWM(p) ((p) == 3 || (p) == 5 || (p) == 6 || (p) == 9 || (p) == 10 || (p) == 11)
|
||||
#endif
|
||||
|
||||
#define SS 10
|
||||
#define MOSI 11
|
||||
#define MISO 12
|
||||
#define SCK 13
|
||||
static const uint8_t SS = 10;
|
||||
static const uint8_t MOSI = 11;
|
||||
static const uint8_t MISO = 12;
|
||||
static const uint8_t SCK = 13;
|
||||
|
||||
#define SDA 18
|
||||
#define SCL 19
|
||||
static const uint8_t SDA = 18;
|
||||
static const uint8_t SCL = 19;
|
||||
#define LED_BUILTIN 13
|
||||
|
||||
#define A0 14
|
||||
#define A1 15
|
||||
#define A2 16
|
||||
#define A3 17
|
||||
#define A4 18
|
||||
#define A5 19
|
||||
#define A6 20
|
||||
#define A7 21
|
||||
static const uint8_t A0 = 14;
|
||||
static const uint8_t A1 = 15;
|
||||
static const uint8_t A2 = 16;
|
||||
static const uint8_t A3 = 17;
|
||||
static const uint8_t A4 = 18;
|
||||
static const uint8_t A5 = 19;
|
||||
static const uint8_t A6 = 20;
|
||||
static const uint8_t A7 = 21;
|
||||
|
||||
#define digitalPinToPCICR(p) (((p) >= 0 && (p) <= 21) ? (&PCICR) : ((uint8_t *)0))
|
||||
#define digitalPinToPCICRbit(p) (((p) <= 7) ? 2 : (((p) <= 13) ? 0 : 1))
|
||||
|
@ -23,6 +23,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h> // include the robot library
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
int commands[20]; // array for storing commands
|
||||
|
||||
|
@ -18,6 +18,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h> // include the robot library
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
long timerOrigin; // used for counting elapsed time
|
||||
|
||||
|
@ -17,6 +17,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h> // include the robot library
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
/* Dancing steps:
|
||||
S: stop
|
||||
|
@ -21,6 +21,8 @@
|
||||
|
||||
// include the robot library
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
int speedLeft;
|
||||
int speedRight;
|
||||
|
@ -20,6 +20,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
// default tempo and pitch of the music
|
||||
int tempo = 60;
|
||||
|
@ -13,6 +13,8 @@
|
||||
#include "scripts_library.h"
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
Serial.begin(9600);
|
||||
|
@ -20,6 +20,8 @@
|
||||
|
||||
// include the robot library
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
int sensorPin = M1; // pin is used by the sensor
|
||||
|
||||
|
@ -27,6 +27,8 @@
|
||||
#include <IRremote.h>
|
||||
#include <IRremoteTools.h>
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
// Define a few commands from your remote control
|
||||
#define IR_CODE_FORWARD 284154405
|
||||
|
@ -34,6 +34,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h> // include the robot library
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
const int NUM_PICS = 4; //Total number of pictures in Gallery
|
||||
|
||||
|
@ -23,6 +23,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h> // include the robot library
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the Robot, SD card, display, and speaker
|
||||
|
@ -17,6 +17,9 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h> // include the robot library
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
// include the utility function for ths sketch
|
||||
// see the details below
|
||||
#include <utility/RobotTextManager.h>
|
||||
|
@ -23,6 +23,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
// use arrays to store the names of the pins to be read
|
||||
uint8_t arr[] = { M0, M1, M2, M3, M4, M5, M6, M7 };
|
||||
|
@ -21,6 +21,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -24,6 +24,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -16,6 +16,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -22,6 +22,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -16,6 +16,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
int value;
|
||||
|
||||
|
@ -15,6 +15,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
int value;
|
||||
|
||||
|
@ -18,6 +18,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -21,6 +21,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -44,6 +44,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -15,6 +15,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -17,6 +17,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -15,6 +15,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the robot
|
||||
|
@ -25,6 +25,8 @@
|
||||
*/
|
||||
|
||||
#include <ArduinoRobot.h>
|
||||
#include <Wire.h>
|
||||
#include <SPI.h>
|
||||
|
||||
void setup() {
|
||||
// initialize the serial port
|
||||
|
@ -1 +1 @@
|
||||
#include "ArduinoRobot.h"
#include "EasyTransfer2.h"
void RobotControl::motorsStop(){
messageOut.writeByte(COMMAND_MOTORS_STOP);
messageOut.sendData();
}
void RobotControl::motorsWrite(int speedLeft,int speedRight){
messageOut.writeByte(COMMAND_RUN);
messageOut.writeInt(speedLeft);
messageOut.writeInt(speedRight);
messageOut.sendData();
}
void RobotControl::motorsWritePct(int speedLeftPct, int speedRightPct){
int16_t speedLeft=255*speedLeftPct;
int16_t speedRight=255*speedRightPct;
motorsWrite(speedLeft,speedRight);
}
void RobotControl::pointTo(int angle){
int target=angle;
uint8_t speed=80;
target=target%360;
if(target<0){
target+=360;
}
int direction=angle;
while(1){
if(direction>0){
motorsWrite(speed,-speed);//right
delay(10);
}else{
motorsWrite(-speed,speed);//left
delay(10);
}
int currentAngle=compassRead();
int diff=target-currentAngle;
if(diff<-180)
diff += 360;
else if(diff> 180)
diff -= 360;
direction=-diff;
if(abs(diff)<5){
motorsWrite(0,0);
return;
}
}
}
void RobotControl::turn(int angle){
int originalAngle=compassRead();
int target=originalAngle+angle;
pointTo(target);
/*uint8_t speed=80;
target=target%360;
if(target<0){
target+=360;
}
int direction=angle;
while(1){
if(direction>0){
motorsWrite(speed,speed);//right
delay(10);
}else{
motorsWrite(-speed,-speed);//left
delay(10);
}
int currentAngle=compassRead();
int diff=target-currentAngle;
if(diff<-180)
diff += 360;
else if(diff> 180)
diff -= 360;
direction=-diff;
if(abs(diff)<5){
motorsWrite(0,0);
return;
}
}*/
}
void RobotControl::moveForward(int speed){
motorsWrite(speed,speed);
}
void RobotControl::moveBackward(int speed){
motorsWrite(speed,speed);
}
void RobotControl::turnLeft(int speed){
motorsWrite(speed,255);
}
void RobotControl::turnRight(int speed){
motorsWrite(255,speed);
}
/*
int RobotControl::getIRrecvResult(){
messageOut.writeByte(COMMAND_GET_IRRECV);
messageOut.sendData();
//delay(10);
while(!messageIn.receiveData());
if(messageIn.readByte()==COMMAND_GET_IRRECV_RE){
return messageIn.readInt();
}
return -1;
}
*/
|
||||
#include "ArduinoRobot.h"
#include "EasyTransfer2.h"
void RobotControl::motorsStop(){
messageOut.writeByte(COMMAND_MOTORS_STOP);
messageOut.sendData();
}
void RobotControl::motorsWrite(int speedLeft,int speedRight){
messageOut.writeByte(COMMAND_RUN);
messageOut.writeInt(speedLeft);
messageOut.writeInt(speedRight);
messageOut.sendData();
}
void RobotControl::motorsWritePct(int speedLeftPct, int speedRightPct){
int16_t speedLeft=255*speedLeftPct/100.0;
int16_t speedRight=255*speedRightPct/100.0;
motorsWrite(speedLeft,speedRight);
}
void RobotControl::pointTo(int angle){
int target=angle;
uint8_t speed=80;
target=target%360;
if(target<0){
target+=360;
}
int direction=angle;
while(1){
int currentAngle=compassRead();
int diff=target-currentAngle;
direction=180-(diff+360)%360;
if(direction>0){
motorsWrite(speed,-speed);//right
delay(10);
}else{
motorsWrite(-speed,speed);//left
delay(10);
}
//if(diff<-180)
// diff += 360;
//else if(diff> 180)
// diff -= 360;
//direction=-diff;
if(abs(diff)<5){
motorsStop();
return;
}
}
}
void RobotControl::turn(int angle){
int originalAngle=compassRead();
int target=originalAngle+angle;
pointTo(target);
/*uint8_t speed=80;
target=target%360;
if(target<0){
target+=360;
}
int direction=angle;
while(1){
if(direction>0){
motorsWrite(speed,speed);//right
delay(10);
}else{
motorsWrite(-speed,-speed);//left
delay(10);
}
int currentAngle=compassRead();
int diff=target-currentAngle;
if(diff<-180)
diff += 360;
else if(diff> 180)
diff -= 360;
direction=-diff;
if(abs(diff)<5){
motorsWrite(0,0);
return;
}
}*/
}
void RobotControl::moveForward(int speed){
motorsWrite(speed,speed);
}
void RobotControl::moveBackward(int speed){
motorsWrite(speed,speed);
}
void RobotControl::turnLeft(int speed){
motorsWrite(speed,255);
}
void RobotControl::turnRight(int speed){
motorsWrite(255,speed);
}
/*
int RobotControl::getIRrecvResult(){
messageOut.writeByte(COMMAND_GET_IRRECV);
messageOut.sendData();
//delay(10);
while(!messageIn.receiveData());
if(messageIn.readByte()==COMMAND_GET_IRRECV_RE){
return messageIn.readInt();
}
return -1;
}
*/
|
@ -1,527 +0,0 @@
|
||||
/*
|
||||
twi.c - TWI/I2C library for Wiring & Arduino
|
||||
Copyright (c) 2006 Nicholas Zambetti. 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
|
||||
|
||||
Modified 2012 by Todd Krein (todd@krein.org) to implement repeated starts
|
||||
*/
|
||||
|
||||
#include <math.h>
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
#include <avr/io.h>
|
||||
#include <avr/interrupt.h>
|
||||
#include <compat/twi.h>
|
||||
#include "Arduino.h" // for digitalWrite
|
||||
|
||||
#ifndef cbi
|
||||
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
|
||||
#endif
|
||||
|
||||
#ifndef sbi
|
||||
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
|
||||
#endif
|
||||
|
||||
#include "pins_arduino.h"
|
||||
#include "twi.h"
|
||||
|
||||
static volatile uint8_t twi_state;
|
||||
static volatile uint8_t twi_slarw;
|
||||
static volatile uint8_t twi_sendStop; // should the transaction end with a stop
|
||||
static volatile uint8_t twi_inRepStart; // in the middle of a repeated start
|
||||
|
||||
static void (*twi_onSlaveTransmit)(void);
|
||||
static void (*twi_onSlaveReceive)(uint8_t*, int);
|
||||
|
||||
static uint8_t twi_masterBuffer[TWI_BUFFER_LENGTH];
|
||||
static volatile uint8_t twi_masterBufferIndex;
|
||||
static volatile uint8_t twi_masterBufferLength;
|
||||
|
||||
static uint8_t twi_txBuffer[TWI_BUFFER_LENGTH];
|
||||
static volatile uint8_t twi_txBufferIndex;
|
||||
static volatile uint8_t twi_txBufferLength;
|
||||
|
||||
static uint8_t twi_rxBuffer[TWI_BUFFER_LENGTH];
|
||||
static volatile uint8_t twi_rxBufferIndex;
|
||||
|
||||
static volatile uint8_t twi_error;
|
||||
|
||||
/*
|
||||
* Function twi_init
|
||||
* Desc readys twi pins and sets twi bitrate
|
||||
* Input none
|
||||
* Output none
|
||||
*/
|
||||
void twi_init(void)
|
||||
{
|
||||
// initialize state
|
||||
twi_state = TWI_READY;
|
||||
twi_sendStop = true; // default value
|
||||
twi_inRepStart = false;
|
||||
|
||||
// activate internal pullups for twi.
|
||||
digitalWrite(SDA, 1);
|
||||
digitalWrite(SCL, 1);
|
||||
|
||||
// initialize twi prescaler and bit rate
|
||||
cbi(TWSR, TWPS0);
|
||||
cbi(TWSR, TWPS1);
|
||||
TWBR = ((F_CPU / TWI_FREQ) - 16) / 2;
|
||||
|
||||
/* twi bit rate formula from atmega128 manual pg 204
|
||||
SCL Frequency = CPU Clock Frequency / (16 + (2 * TWBR))
|
||||
note: TWBR should be 10 or higher for master mode
|
||||
It is 72 for a 16mhz Wiring board with 100kHz TWI */
|
||||
|
||||
// enable twi module, acks, and twi interrupt
|
||||
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA);
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_slaveInit
|
||||
* Desc sets slave address and enables interrupt
|
||||
* Input none
|
||||
* Output none
|
||||
*/
|
||||
void twi_setAddress(uint8_t address)
|
||||
{
|
||||
// set twi slave address (skip over TWGCE bit)
|
||||
TWAR = address << 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_readFrom
|
||||
* Desc attempts to become twi bus master and read a
|
||||
* series of bytes from a device on the bus
|
||||
* Input address: 7bit i2c device address
|
||||
* data: pointer to byte array
|
||||
* length: number of bytes to read into array
|
||||
* sendStop: Boolean indicating whether to send a stop at the end
|
||||
* Output number of bytes read
|
||||
*/
|
||||
uint8_t twi_readFrom(uint8_t address, uint8_t* data, uint8_t length, uint8_t sendStop)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
// ensure data will fit into buffer
|
||||
if(TWI_BUFFER_LENGTH < length){
|
||||
return 0;
|
||||
}
|
||||
|
||||
// wait until twi is ready, become master receiver
|
||||
while(TWI_READY != twi_state){
|
||||
continue;
|
||||
}
|
||||
twi_state = TWI_MRX;
|
||||
twi_sendStop = sendStop;
|
||||
// reset error state (0xFF.. no error occured)
|
||||
twi_error = 0xFF;
|
||||
|
||||
// initialize buffer iteration vars
|
||||
twi_masterBufferIndex = 0;
|
||||
twi_masterBufferLength = length-1; // This is not intuitive, read on...
|
||||
// On receive, the previously configured ACK/NACK setting is transmitted in
|
||||
// response to the received byte before the interrupt is signalled.
|
||||
// Therefor we must actually set NACK when the _next_ to last byte is
|
||||
// received, causing that NACK to be sent in response to receiving the last
|
||||
// expected byte of data.
|
||||
|
||||
// build sla+w, slave device address + w bit
|
||||
twi_slarw = TW_READ;
|
||||
twi_slarw |= address << 1;
|
||||
|
||||
if (true == twi_inRepStart) {
|
||||
// if we're in the repeated start state, then we've already sent the start,
|
||||
// (@@@ we hope), and the TWI statemachine is just waiting for the address byte.
|
||||
// We need to remove ourselves from the repeated start state before we enable interrupts,
|
||||
// since the ISR is ASYNC, and we could get confused if we hit the ISR before cleaning
|
||||
// up. Also, don't enable the START interrupt. There may be one pending from the
|
||||
// repeated start that we sent outselves, and that would really confuse things.
|
||||
twi_inRepStart = false; // remember, we're dealing with an ASYNC ISR
|
||||
TWDR = twi_slarw;
|
||||
TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START
|
||||
}
|
||||
else
|
||||
// send start condition
|
||||
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTA);
|
||||
|
||||
// wait for read operation to complete
|
||||
while(TWI_MRX == twi_state){
|
||||
continue;
|
||||
}
|
||||
|
||||
if (twi_masterBufferIndex < length)
|
||||
length = twi_masterBufferIndex;
|
||||
|
||||
// copy twi buffer to data
|
||||
for(i = 0; i < length; ++i){
|
||||
data[i] = twi_masterBuffer[i];
|
||||
}
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_writeTo
|
||||
* Desc attempts to become twi bus master and write a
|
||||
* series of bytes to a device on the bus
|
||||
* Input address: 7bit i2c device address
|
||||
* data: pointer to byte array
|
||||
* length: number of bytes in array
|
||||
* wait: boolean indicating to wait for write or not
|
||||
* sendStop: boolean indicating whether or not to send a stop at the end
|
||||
* Output 0 .. success
|
||||
* 1 .. length to long for buffer
|
||||
* 2 .. address send, NACK received
|
||||
* 3 .. data send, NACK received
|
||||
* 4 .. other twi error (lost bus arbitration, bus error, ..)
|
||||
*/
|
||||
uint8_t twi_writeTo(uint8_t address, uint8_t* data, uint8_t length, uint8_t wait, uint8_t sendStop)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
// ensure data will fit into buffer
|
||||
if(TWI_BUFFER_LENGTH < length){
|
||||
return 1;
|
||||
}
|
||||
|
||||
// wait until twi is ready, become master transmitter
|
||||
while(TWI_READY != twi_state){
|
||||
continue;
|
||||
}
|
||||
twi_state = TWI_MTX;
|
||||
twi_sendStop = sendStop;
|
||||
// reset error state (0xFF.. no error occured)
|
||||
twi_error = 0xFF;
|
||||
|
||||
// initialize buffer iteration vars
|
||||
twi_masterBufferIndex = 0;
|
||||
twi_masterBufferLength = length;
|
||||
|
||||
// copy data to twi buffer
|
||||
for(i = 0; i < length; ++i){
|
||||
twi_masterBuffer[i] = data[i];
|
||||
}
|
||||
|
||||
// build sla+w, slave device address + w bit
|
||||
twi_slarw = TW_WRITE;
|
||||
twi_slarw |= address << 1;
|
||||
|
||||
// if we're in a repeated start, then we've already sent the START
|
||||
// in the ISR. Don't do it again.
|
||||
//
|
||||
if (true == twi_inRepStart) {
|
||||
// if we're in the repeated start state, then we've already sent the start,
|
||||
// (@@@ we hope), and the TWI statemachine is just waiting for the address byte.
|
||||
// We need to remove ourselves from the repeated start state before we enable interrupts,
|
||||
// since the ISR is ASYNC, and we could get confused if we hit the ISR before cleaning
|
||||
// up. Also, don't enable the START interrupt. There may be one pending from the
|
||||
// repeated start that we sent outselves, and that would really confuse things.
|
||||
twi_inRepStart = false; // remember, we're dealing with an ASYNC ISR
|
||||
TWDR = twi_slarw;
|
||||
TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE); // enable INTs, but not START
|
||||
}
|
||||
else
|
||||
// send start condition
|
||||
TWCR = _BV(TWINT) | _BV(TWEA) | _BV(TWEN) | _BV(TWIE) | _BV(TWSTA); // enable INTs
|
||||
|
||||
// wait for write operation to complete
|
||||
while(wait && (TWI_MTX == twi_state)){
|
||||
continue;
|
||||
}
|
||||
|
||||
if (twi_error == 0xFF)
|
||||
return 0; // success
|
||||
else if (twi_error == TW_MT_SLA_NACK)
|
||||
return 2; // error: address send, nack received
|
||||
else if (twi_error == TW_MT_DATA_NACK)
|
||||
return 3; // error: data send, nack received
|
||||
else
|
||||
return 4; // other twi error
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_transmit
|
||||
* Desc fills slave tx buffer with data
|
||||
* must be called in slave tx event callback
|
||||
* Input data: pointer to byte array
|
||||
* length: number of bytes in array
|
||||
* Output 1 length too long for buffer
|
||||
* 2 not slave transmitter
|
||||
* 0 ok
|
||||
*/
|
||||
uint8_t twi_transmit(const uint8_t* data, uint8_t length)
|
||||
{
|
||||
uint8_t i;
|
||||
|
||||
// ensure data will fit into buffer
|
||||
if(TWI_BUFFER_LENGTH < length){
|
||||
return 1;
|
||||
}
|
||||
|
||||
// ensure we are currently a slave transmitter
|
||||
if(TWI_STX != twi_state){
|
||||
return 2;
|
||||
}
|
||||
|
||||
// set length and copy data into tx buffer
|
||||
twi_txBufferLength = length;
|
||||
for(i = 0; i < length; ++i){
|
||||
twi_txBuffer[i] = data[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_attachSlaveRxEvent
|
||||
* Desc sets function called before a slave read operation
|
||||
* Input function: callback function to use
|
||||
* Output none
|
||||
*/
|
||||
void twi_attachSlaveRxEvent( void (*function)(uint8_t*, int) )
|
||||
{
|
||||
twi_onSlaveReceive = function;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_attachSlaveTxEvent
|
||||
* Desc sets function called before a slave write operation
|
||||
* Input function: callback function to use
|
||||
* Output none
|
||||
*/
|
||||
void twi_attachSlaveTxEvent( void (*function)(void) )
|
||||
{
|
||||
twi_onSlaveTransmit = function;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_reply
|
||||
* Desc sends byte or readys receive line
|
||||
* Input ack: byte indicating to ack or to nack
|
||||
* Output none
|
||||
*/
|
||||
void twi_reply(uint8_t ack)
|
||||
{
|
||||
// transmit master read ready signal, with or without ack
|
||||
if(ack){
|
||||
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT) | _BV(TWEA);
|
||||
}else{
|
||||
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWINT);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_stop
|
||||
* Desc relinquishes bus master status
|
||||
* Input none
|
||||
* Output none
|
||||
*/
|
||||
void twi_stop(void)
|
||||
{
|
||||
// send stop condition
|
||||
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT) | _BV(TWSTO);
|
||||
|
||||
// wait for stop condition to be exectued on bus
|
||||
// TWINT is not set after a stop condition!
|
||||
while(TWCR & _BV(TWSTO)){
|
||||
continue;
|
||||
}
|
||||
|
||||
// update twi state
|
||||
twi_state = TWI_READY;
|
||||
}
|
||||
|
||||
/*
|
||||
* Function twi_releaseBus
|
||||
* Desc releases bus control
|
||||
* Input none
|
||||
* Output none
|
||||
*/
|
||||
void twi_releaseBus(void)
|
||||
{
|
||||
// release bus
|
||||
TWCR = _BV(TWEN) | _BV(TWIE) | _BV(TWEA) | _BV(TWINT);
|
||||
|
||||
// update twi state
|
||||
twi_state = TWI_READY;
|
||||
}
|
||||
|
||||
SIGNAL(TWI_vect)
|
||||
{
|
||||
switch(TW_STATUS){
|
||||
// All Master
|
||||
case TW_START: // sent start condition
|
||||
case TW_REP_START: // sent repeated start condition
|
||||
// copy device address and r/w bit to output register and ack
|
||||
TWDR = twi_slarw;
|
||||
twi_reply(1);
|
||||
break;
|
||||
|
||||
// Master Transmitter
|
||||
case TW_MT_SLA_ACK: // slave receiver acked address
|
||||
case TW_MT_DATA_ACK: // slave receiver acked data
|
||||
// if there is data to send, send it, otherwise stop
|
||||
if(twi_masterBufferIndex < twi_masterBufferLength){
|
||||
// copy data to output register and ack
|
||||
TWDR = twi_masterBuffer[twi_masterBufferIndex++];
|
||||
twi_reply(1);
|
||||
}else{
|
||||
if (twi_sendStop)
|
||||
twi_stop();
|
||||
else {
|
||||
twi_inRepStart = true; // we're gonna send the START
|
||||
// don't enable the interrupt. We'll generate the start, but we
|
||||
// avoid handling the interrupt until we're in the next transaction,
|
||||
// at the point where we would normally issue the start.
|
||||
TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ;
|
||||
twi_state = TWI_READY;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case TW_MT_SLA_NACK: // address sent, nack received
|
||||
twi_error = TW_MT_SLA_NACK;
|
||||
twi_stop();
|
||||
break;
|
||||
case TW_MT_DATA_NACK: // data sent, nack received
|
||||
twi_error = TW_MT_DATA_NACK;
|
||||
twi_stop();
|
||||
break;
|
||||
case TW_MT_ARB_LOST: // lost bus arbitration
|
||||
twi_error = TW_MT_ARB_LOST;
|
||||
twi_releaseBus();
|
||||
break;
|
||||
|
||||
// Master Receiver
|
||||
case TW_MR_DATA_ACK: // data received, ack sent
|
||||
// put byte into buffer
|
||||
twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
|
||||
case TW_MR_SLA_ACK: // address sent, ack received
|
||||
// ack if more bytes are expected, otherwise nack
|
||||
if(twi_masterBufferIndex < twi_masterBufferLength){
|
||||
twi_reply(1);
|
||||
}else{
|
||||
twi_reply(0);
|
||||
}
|
||||
break;
|
||||
case TW_MR_DATA_NACK: // data received, nack sent
|
||||
// put final byte into buffer
|
||||
twi_masterBuffer[twi_masterBufferIndex++] = TWDR;
|
||||
if (twi_sendStop)
|
||||
twi_stop();
|
||||
else {
|
||||
twi_inRepStart = true; // we're gonna send the START
|
||||
// don't enable the interrupt. We'll generate the start, but we
|
||||
// avoid handling the interrupt until we're in the next transaction,
|
||||
// at the point where we would normally issue the start.
|
||||
TWCR = _BV(TWINT) | _BV(TWSTA)| _BV(TWEN) ;
|
||||
twi_state = TWI_READY;
|
||||
}
|
||||
break;
|
||||
case TW_MR_SLA_NACK: // address sent, nack received
|
||||
twi_stop();
|
||||
break;
|
||||
// TW_MR_ARB_LOST handled by TW_MT_ARB_LOST case
|
||||
|
||||
// Slave Receiver
|
||||
case TW_SR_SLA_ACK: // addressed, returned ack
|
||||
case TW_SR_GCALL_ACK: // addressed generally, returned ack
|
||||
case TW_SR_ARB_LOST_SLA_ACK: // lost arbitration, returned ack
|
||||
case TW_SR_ARB_LOST_GCALL_ACK: // lost arbitration, returned ack
|
||||
// enter slave receiver mode
|
||||
twi_state = TWI_SRX;
|
||||
// indicate that rx buffer can be overwritten and ack
|
||||
twi_rxBufferIndex = 0;
|
||||
twi_reply(1);
|
||||
break;
|
||||
case TW_SR_DATA_ACK: // data received, returned ack
|
||||
case TW_SR_GCALL_DATA_ACK: // data received generally, returned ack
|
||||
// if there is still room in the rx buffer
|
||||
if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){
|
||||
// put byte in buffer and ack
|
||||
twi_rxBuffer[twi_rxBufferIndex++] = TWDR;
|
||||
twi_reply(1);
|
||||
}else{
|
||||
// otherwise nack
|
||||
twi_reply(0);
|
||||
}
|
||||
break;
|
||||
case TW_SR_STOP: // stop or repeated start condition received
|
||||
// put a null char after data if there's room
|
||||
if(twi_rxBufferIndex < TWI_BUFFER_LENGTH){
|
||||
twi_rxBuffer[twi_rxBufferIndex] = '\0';
|
||||
}
|
||||
// sends ack and stops interface for clock stretching
|
||||
twi_stop();
|
||||
// callback to user defined callback
|
||||
twi_onSlaveReceive(twi_rxBuffer, twi_rxBufferIndex);
|
||||
// since we submit rx buffer to "wire" library, we can reset it
|
||||
twi_rxBufferIndex = 0;
|
||||
// ack future responses and leave slave receiver state
|
||||
twi_releaseBus();
|
||||
break;
|
||||
case TW_SR_DATA_NACK: // data received, returned nack
|
||||
case TW_SR_GCALL_DATA_NACK: // data received generally, returned nack
|
||||
// nack back at master
|
||||
twi_reply(0);
|
||||
break;
|
||||
|
||||
// Slave Transmitter
|
||||
case TW_ST_SLA_ACK: // addressed, returned ack
|
||||
case TW_ST_ARB_LOST_SLA_ACK: // arbitration lost, returned ack
|
||||
// enter slave transmitter mode
|
||||
twi_state = TWI_STX;
|
||||
// ready the tx buffer index for iteration
|
||||
twi_txBufferIndex = 0;
|
||||
// set tx buffer length to be zero, to verify if user changes it
|
||||
twi_txBufferLength = 0;
|
||||
// request for txBuffer to be filled and length to be set
|
||||
// note: user must call twi_transmit(bytes, length) to do this
|
||||
twi_onSlaveTransmit();
|
||||
// if they didn't change buffer & length, initialize it
|
||||
if(0 == twi_txBufferLength){
|
||||
twi_txBufferLength = 1;
|
||||
twi_txBuffer[0] = 0x00;
|
||||
}
|
||||
// transmit first byte from buffer, fall
|
||||
case TW_ST_DATA_ACK: // byte sent, ack returned
|
||||
// copy data to output register
|
||||
TWDR = twi_txBuffer[twi_txBufferIndex++];
|
||||
// if there is more to send, ack, otherwise nack
|
||||
if(twi_txBufferIndex < twi_txBufferLength){
|
||||
twi_reply(1);
|
||||
}else{
|
||||
twi_reply(0);
|
||||
}
|
||||
break;
|
||||
case TW_ST_DATA_NACK: // received nack, we are done
|
||||
case TW_ST_LAST_DATA: // received ack, but we are done already!
|
||||
// ack future responses
|
||||
twi_reply(1);
|
||||
// leave slave receiver state
|
||||
twi_state = TWI_READY;
|
||||
break;
|
||||
|
||||
// All
|
||||
case TW_NO_INFO: // no state information
|
||||
break;
|
||||
case TW_BUS_ERROR: // bus error, illegal stop/start
|
||||
twi_error = TW_BUS_ERROR;
|
||||
twi_stop();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
twi.h - TWI/I2C library for Wiring & Arduino
|
||||
Copyright (c) 2006 Nicholas Zambetti. 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 twi_h
|
||||
#define twi_h
|
||||
|
||||
#include <inttypes.h>
|
||||
|
||||
//#define ATMEGA8
|
||||
|
||||
#ifndef TWI_FREQ
|
||||
#define TWI_FREQ 100000L
|
||||
#endif
|
||||
|
||||
#ifndef TWI_BUFFER_LENGTH
|
||||
#define TWI_BUFFER_LENGTH 32
|
||||
#endif
|
||||
|
||||
#define TWI_READY 0
|
||||
#define TWI_MRX 1
|
||||
#define TWI_MTX 2
|
||||
#define TWI_SRX 3
|
||||
#define TWI_STX 4
|
||||
|
||||
void twi_init(void);
|
||||
void twi_setAddress(uint8_t);
|
||||
uint8_t twi_readFrom(uint8_t, uint8_t*, uint8_t, uint8_t);
|
||||
uint8_t twi_writeTo(uint8_t, uint8_t*, uint8_t, uint8_t, uint8_t);
|
||||
uint8_t twi_transmit(const uint8_t*, uint8_t);
|
||||
void twi_attachSlaveRxEvent( void (*)(uint8_t*, int) );
|
||||
void twi_attachSlaveTxEvent( void (*)(void) );
|
||||
void twi_reply(uint8_t);
|
||||
void twi_stop(void);
|
||||
void twi_releaseBus(void);
|
||||
|
||||
#endif
|
||||
|
@ -170,20 +170,20 @@ void RobotMotorBoard::motorsWrite(int speedL, int speedR){
|
||||
speedL*=(1-motorAdjustment);
|
||||
}
|
||||
|
||||
if(speedL>0){
|
||||
analogWrite(IN_A1,speedL);
|
||||
if(speedR>0){
|
||||
analogWrite(IN_A1,speedR);
|
||||
analogWrite(IN_A2,0);
|
||||
}else{
|
||||
analogWrite(IN_A1,0);
|
||||
analogWrite(IN_A2,-speedL);
|
||||
analogWrite(IN_A2,-speedR);
|
||||
}
|
||||
|
||||
if(speedR>0){
|
||||
analogWrite(IN_B1,speedR);
|
||||
if(speedL>0){
|
||||
analogWrite(IN_B1,speedL);
|
||||
analogWrite(IN_B2,0);
|
||||
}else{
|
||||
analogWrite(IN_B1,0);
|
||||
analogWrite(IN_B2,-speedR);
|
||||
analogWrite(IN_B2,-speedL);
|
||||
}
|
||||
}
|
||||
void RobotMotorBoard::motorsWritePct(int speedLpct, int speedRpct){
|
||||
|
Loading…
x
Reference in New Issue
Block a user