使用Wifiduino接受上位机数据,控制云台(内含测试用LCD1602)-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3351|回复: 0

使用Wifiduino接受上位机数据,控制云台(内含测试用LCD1602)

[复制链接]
发表于 2018-5-18 19:51 | 显示全部楼层 |阅读模式
感谢奈何送的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
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 16:51 , Processed in 0.098828 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表