使用Wifiduino接受上位机数据,控制云台(内含测试用LCD1602)
感谢奈何送的Wifiduino,因为一直比较忙,所以没有怎么用,直到昨日我可爱的Nano同学光荣牺牲,我又把魔爪伸向了可怜的Wifiduino,希望它能在暴力使用中撑得久一点吧。。。。程序主要用途是获取上位机按照XXX,XXX/n格式发送的坐标数据,控制二自由度云台运行,数据处理部分已在上位机完成,降低下位机压力,写的比较简单,用软件延时代替了delay,提高兼容性,还望各位大佬轻踩!(目前为有线连接测试阶段,下一步会改为无线传输,这个坑我保证尽快填)
#include <Servo.h>
#include <LiquidCrystal.h>
#define NOP do { __asm__ __volatile__ ("nop"); } while (0)
#define ulong unsigned long
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //构造一个LiquidCrystal的类成员。使用数字IO ,12,11,5,4,3,2
int Sign = 0;//标志位为0时写入X为1时写入Y
int Finish = 0;
Servo myservo1;
Servo myservo2;
int val1 = 90;
int val2 = 90;
String inputString = ""; // 缓存字符串
boolean stringComplete = false;// 是否string已经完成缓存
void Change() {
String MouseX = "";
String MouseY = "";
int ch; char temp;
ch = inputString.length();
for (int i = 0; i < ch; i++) {
temp = inputString.charAt(i);
if (temp != '\n') {
if (temp != ',') {
if (Sign == 0) {
MouseX += temp;
}
else {
MouseY += temp;
}
}
else {
Sign = 1;
}
}
else {
//转换坐标系
int x =MouseX.toInt();
int y =MouseY.toInt();
val1 = map(x, 0, 720, 0, 180) ;
val2 = map(y, 10, 570, 0, 180);
Sign = 0;//标志位归0
break;
}
}
myservo1.write(val1);
delay_(500);
myservo2.write(val2 );
delay_(500);
//lcd.setCursor(0, 0); //设置液晶开始显示的指针位置,0列0行,人类理解的第一行
//lcd.print(inputString);
/*Serial.print( MouseX.toInt());
delay(15);
Serial.print('x');
delay(15);
Serial.println( MouseY.toInt());
delay(15);*/
}
void setup() {
// 初始化串口
Serial.begin(9600);
// 将inputString反转200个字符:
inputString.reserve(200);
myservo1.attach(9);
myservo2.attach(6);
//等待串口准备好
while (!Serial);
lcd.begin(16, 2); //初始化LCD1602
lcd.print("Welcome to use!"); //液晶显示Welcome to use!
delay(1000); //延时1000ms
lcd.clear(); //液晶清屏
}
void loop() {
// 如果缓存string接收完成:
if (stringComplete) {
// 清空String:
inputString = "";
stringComplete = false;
}
lcd.setCursor(0, 1); //0列,1行,人类理解的第二行
lcd.print("for LingShun Lab");
delay_(1000); //延时1000ms
lcd.setCursor(0, 0);
lcd.print("Good Job! ");
delay_(1000); //延时1000ms
}
/*
SerialEvent在arduino板上的RX引脚收到数据时会被系统自动调用。在系统内部,它是在每次loop函数执行时连带执行的。因此如果再loop使用delay,serialEvent的调用也会被延迟,这样就有可能一次收到>=2个字符。
*/
void serialEvent() {
while (Serial.available()) {
// 获取新的字符:
char inChar = (char)Serial.read();
if ((inChar < 48 || inChar > 57) && inChar != 10 && inChar != 44) {
break;
}
// 将它加到inputString中:
inputString += inChar;
// 如果收到了换行符,就将变量设置为true
if (inChar == '\n') {
stringComplete = true;
Change();
inputString = "";
}
}
}
void delay_(int ms)//软件延时
{
for (int i = 0; i < ms; i++)
{
for (ulong j = 0; j < 1985; j++) NOP;
}
}
订单号: 144382428888177774
页:
[1]