基于arduino读取旋转编码器数据

本篇介绍了如何使用Arduino,连接欧姆龙旋转编码器,获取编码器信号,并通过java读取数据。

1. 接线

编码器的A、B、Z相分别连接Arduino的2、4、3号引脚。
在这里插入图片描述

2. 烧录程序

安装Arduino软件,编写如下程序,并烧录到Arduino中

	#define ENCODER_A_PIN 2 // BLack 黑线 A相位
	#define ENCODER_Z_PIN 3 // Orange 橙线 Z相
	#define ENCODER_B_PIN 4 // White 白线 B相
	
	volatile long counter = 0; // 定义 counter 计数器,用于计数
	void setup() {
	  // put your setup code here, to run once:
	  Serial.begin(115200); 
	  pinMode(ENCODER_A_PIN, INPUT_PULLUP);// 将中断的引脚设置为输入PULLUP模式
	  pinMode(ENCODER_B_PIN, INPUT_PULLUP);// 将引脚设置为输入PULLUP模式
	  pinMode(ENCODER_Z_PIN, INPUT_PULLUP);// 将中断的引脚设置为输入PULLUP模式
	
	  // 使用attachInterrupt设定绑定中断功能的引脚、触发时要执行的函式、以及执行方式
	  attachInterrupt(digitalPinToInterrupt(ENCODER_A_PIN), interrupt_a_change, CHANGE);
	  attachInterrupt(digitalPinToInterrupt(ENCODER_Z_PIN), interrupt_z_change, CHANGE);
	}
	
	void loop() {
	    // Serial.println("串口数据12345678ABCD"); // 串口显示 计数器数值
	    Serial.println(counter); // 串口显示 计数器数值
	}
	
	// 引脚A中断时,调用的函数
	void interrupt_a_change() {
	
	  int temp_a = digitalRead(ENCODER_A_PIN);
	  int temp_b = digitalRead(ENCODER_B_PIN);
	
	  // 判断编码器的选择方向
	  if (temp_a == temp_b)
	  {
	    counter--; // 向后转 计数器-1
	  } else {
	    counter++; // 向前转 计数器+1
	  }
	}
	
	// 引脚Z中断时,调用的函数
	void interrupt_z_change() {
	  counter = 0; // 归零
	}

3. 读取数据(java)

    SerialPort serialPort = SerialPort.getCommPort("COM5"); // 替换为您的串口名称
      serialPort.setBaudRate(115200); // 设置波特率
      if (serialPort.openPort()) {
          System.out.println("arduino 串口已打开。");
          try {
              Thread.sleep(1000);
          } catch (InterruptedException e) {
              e.printStackTrace();
          }
          try {
              String  s = reader.readLine();
              
              while(s!=null){
                  System.out.println("编码器数据:"+s);
                  try {
                      Thread.sleep(1000);
                  } catch (InterruptedException e) {
                      e.printStackTrace();
                  }
              }
              
              reader.close();
              inputStream.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      } else {
          System.out.println("无法打开串口。");
      }
      serialPort.closePort();
      System.out.println("串口已关闭。");
  • 7
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值