ARDUINO LEONARDO
1 协议
ST\n
START TO ENCODE POSITION
旋转编码器置0,并启动;
返回:OK\n
RD\n
READ ENCONDER, RETURN xx (x is char type)
读取当前旋转编码器值;
返回: xx\n
其中:x为阿拉伯数字的ASCII码
CL\n
CLEAR to ZERO
旋转编码器置零
返回:OK\n
SExx\n
SET xx(x is char type) AS MAXIMUM ENCONDER NUMBER
设置旋转编码器最大计数值xxx(数值范围为:0-65535)
其中:x为阿拉伯数字的ASCII码
返回:OK\n
II\n
Information for device parameters
获取设备名称
返回:ENCODER\n
待续……
返回指令
RE\n
REPEAT THE COMMAND AGAIN
2 程序
const int inputPinA = 2;
const int inputPinB = 5;
const int inputPinZ = 6;
volatile unsigned int encoderPosition = 0;
unsigned int MaxPosition = 65535;
String inputString = ""; // a string to hold incoming data
boolean stringComplete = false; // whether the string is complete
void doEncoderA()
{
if(digitalRead(inputPinA) == digitalRead(inputPinB))
{
encoderPosition--;
}
else
{
encoderPosition++;
}
if( encoderPosition >= MaxPosition )
{
encoderPosition = 0;
}
}
/*
void serialEvent()
{
while (Serial.available())
{
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n' )
{
if(inputString[0] == 'S' && inputString[1] == 'T')
{
encoderPosition = 0;
inputString = "";
}
else if(inputString[0] == 'R' && inputString[1] == 'D')
{
Serial.println(encoderPosition);
inputString = "";
}
else if(inputString[0] == 'C' && inputString[1] == 'L')
{
encoderPosition = 0;
inputString = "";
}
else if(inputString[0] == 'S' && inputString[1] == 'E')
{
MaxPosition = int(inputString[2])>>8+int(inputString[3]);
inputString = "";
}
else
{
Serial.println("RE");
inputString = "";
}
}
}
}
*/
void setup() {
// put your setup code here, to run once:
pinMode(inputPinA, INPUT);
pinMode(inputPinB, INPUT);
pinMode(inputPinZ, INPUT);
digitalWrite(inputPinA,HIGH);
digitalWrite(inputPinB,HIGH);
attachInterrupt(1, doEncoderA, FALLING);
Serial.begin(115200);
}
/
void loop() {
// put your main code here, to run repeatedly:
//Serial.println(encoderPosition);
//Serial.println(inputString);
//delay(100);
while (Serial.available())
{
// get the new byte:
char inChar = (char)Serial.read();
unsigned int aa,bb;
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n' )
{
if(inputString[0] == 'S' && inputString[1] == 'T')
{
encoderPosition = 0;
Serial.println(‘OK');
}
else if(inputString[0] == 'R' && inputString[1] == 'D')
{
Serial.println(encoderPosition);
//Serial.println(inputString);
}
else if(inputString[0] == 'C' && inputString[1] == 'L')
{
encoderPosition = 0;
Serial.println(‘OK');
}
else if(inputString[0] == 'S' && inputString[1] == 'E')
{
aa = int(inputString[2])<<8;
bb = int(inputString[3]);
MaxPosition = aa + bb;
}
else
{
Serial.println("RE");
//Serial.println(inputString);
}
inputString = "";
}
}
}
修改协议后的代码
const int inputPinA = 2;
const int inputPinB = 5;
const int inputPinZ = 6;
volatile unsigned int encoderPosition = 0;
unsigned int MaxPosition = 65535;
String inputString = ""; // a string to hold incoming data
String numString = ""; // a string to hold incoming number
boolean stringComplete = false; // whether the string is complete
void doEncoderA()
{
if(digitalRead(inputPinA) == digitalRead(inputPinB))
{
encoderPosition--;
}
else
{
encoderPosition++;
}
if( encoderPosition >= MaxPosition )
{
encoderPosition = 0;
}
}
void setup() {
// put your setup code here, to run once:
pinMode(inputPinA, INPUT);
pinMode(inputPinB, INPUT);
pinMode(inputPinZ, INPUT);
digitalWrite(inputPinA,HIGH);
digitalWrite(inputPinB,HIGH);
attachInterrupt(1, doEncoderA, FALLING);
Serial.begin(115200);
}
/
void loop() {
// put your main code here, to run repeatedly:
//Serial.println(encoderPosition);
//Serial.println(inputString);
//delay(100);
while (Serial.available())
{
// get the new byte:
char inChar = (char)Serial.read();
unsigned int aa,bb;
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n' )
{
if(inputString[0] == 'S' && inputString[1] == 'T')
{
encoderPosition = 0;
Serial.println("OK");
}
else if(inputString[0] == 'R' && inputString[1] == 'D')
{
Serial.println(encoderPosition);
//Serial.println(inputString);
}
else if(inputString[0] == 'C' && inputString[1] == 'L')
{
encoderPosition = 0;
Serial.println("OK");
}
else if(inputString[0] == 'S' && inputString[1] == 'E')
{
/*int i;
for(i=2;i<inputString.length();i++)
{
numString[i-2] = inputString[i];
Serial.println(i);
}
Serial.println(numString.length());
Serial.println(numString.toInt());
MaxPosition = numString.toInt();//string转为整数*/
int result = inputString.substring(2,inputString.length()).toInt();
/* 不需要判断,一旦溢出,系统自动对65536求余
if (result > 65535)
{
MaxPosition = 65535;
}
else
{
MaxPosition = result;
}
*/
Serial.println(MaxPosition);//456
}
else if(inputString[0] == 'I' && inputString[1] == 'I')
{
Serial.println("ENCODER");
}
else
{
Serial.println("RE");
//Serial.println(inputString);
}
inputString = "";
numString = " ";
}
}
}