基于弯曲传感器的舵机控制,及LCD和串口监视器数据显示

在网上找了很久,没有一个好的免费的关于弯曲传感器控制舵机的教程,为了解惑我自己写了一个弯曲传感器测试程序,如果有帮助就点个赞吧。

本程序测试了在10kΩ下拉电阻的弯曲传感器读数,将数据结果显示在串口监视器和LCD16*2(I2C)屏幕上,并且将读数转化成舵机角度用来驱动舵机。(添加LCD屏幕的原因是在tinkercad上模拟运行时找不到串口监视器,就用屏幕替代。)

在这个项目中可以学习到弯曲传感器的使用、电阻操控微型伺服器(舵机)LCD16*2(I2C)和串口监视器的简单运用。

一、测试电路图和代码:

电路图:

我用不同的线进行标记。(黄色)信号线(红色)电源线(黑色)负极线、(绿色)时钟 。

1、弯曲传感器:一端连接5V,另一端加一个下拉电阻才能接入模拟信号口A0,不然读不出信号(我设的是10kΩ的电阻,传感器为0°时读数256,180°时则为55)。

2、舵机:有3个引脚分别是 VCC(正极)、GND(负极)、PWM(信号)。正极接5V、信号线接6号IO口,数字IO接口中,带~号的口才支持PWM驱动舵机。一般舵机角度为0~180°。

3、LCD16*2(I2C):是拥有16列字符、2行显示能力的液晶显示屏,有4个引脚,分别是VCC(正极)、GND(负极)、SDA(信号)、SCL(时钟),5V供电,本测试中SDA接入A4口可以驱动屏幕,SCL接入A5口。(I2C的芯片类型是 基于 PCF8574 ,地址是39(0x27)不同的地址可以用于控制多个屏幕)。

4、串口监视器:串口监视器可以把数据打印在Arduino IDE的屏幕上,内容比较简单,保留这部分代码也不会影响程序运行,这里就不特地说明了,但会在底部单独代码中附上使用模板和一些常用指令。

弯曲传感器控制舵机代码:

#include <Servo.h>
#include <LiquidCrystal_I2C.h>
//屏幕设置 定义I2C的lcd,这个lcd2*16的是基于PCF8574的,地址是39(0x27)
//每行最多显示20个字符,4行文本高度
LiquidCrystal_I2C lcd(0x27, 20, 4);

//舵机设置 创建一个舵机对象,要创建多个舵机可以在myservo后面加编号比如
//Servo myservo2;
Servo myservo;

const int flexPin = A0; // 替换为您的弯曲传感器连接的实际模拟输入引脚

void setup() {
  //定义串口
  Serial.begin(9600); // 初始化串口通信
  Serial.println("SensorValue to ServoValue");
  
  //定义屏幕
    lcd.init();//屏幕初始化
  lcd.backlight();//屏幕背光
  
  //屏幕使用
  lcd.setCursor(3, 0);//设置第一个字符在第1列,第0行
  lcd.print("sen to ser");//在屏幕输出字符串
  
  myservo.attach(6);//定义myservo舵机信号引脚为6号
}

void loop() {
 int sensorValue = analogRead(flexPin); // 读取弯曲传感器的模拟值
 Serial.print(sensorValue);//在串口监视器显示弯曲传感器的模拟值
  Serial.print("to");
  int servoValue;//定义个变量存储迁移后的值
 servoValue=map(sensorValue,59,256,0,180);//用map指令把读数从59~256迁移到0~180
   Serial.println(servoValue);
  
  lcd.setCursor(3, 1);
  lcd.print(sensorValue);//在屏幕上显示弯曲传感器读数
  lcd.print(" to ");
  
  lcd.print(servoValue);//在屏幕上显示舵机角度
  lcd.print("  ");
  myservo.write(servoValue);//写入数据驱动舵机
  delay(1);
  
  
}

  

二、附上每个模块单独使用的代码:

1、舵机使用:

定义舵机的头文件
#include <Servo.h>

//舵机设置 创建一个舵机对象,要创建多个舵机可以在myservo后面加编号比如
//Servo myservo2;
Servo myservo;
const int flexPin = A0; // 替换为您的弯曲传感器连接的实际模拟输入引脚
//舵机引脚

void setup() {

//定义myservo舵机信号引脚为6号
  myservo.attach(6);
}

void loop() {

// 读取弯曲传感器的模拟值,flexPin替换成自己定义的模拟口,这里定义为A0
 int sensorValue = analogRead(flexPin); 


//定义个变量存储迁移后的值
int servoValue;

//用map指令把读数从59~256迁移到0~180
 servoValue=map(sensorValue,59,256,0,180);

//写入数据驱动舵机
myservo.write(servoValue);//写入数据驱动舵机

delay(1);
   
}


//其他常用指令:
 
//int pos = myservo.read();读取伺服电机当前的设定角度(如果库支持)

// myservo.detach(); 断开伺服电机与控制引脚的连接,使伺服电机停止响应指令并保持当前位置。如果需要再次控制该伺服电机,需要重新调用 attach() 方法。

//




2、LCD16*2驱动代码:

//定义屏幕头文件,需要添加LiquidCrystal_I2C库
#include <LiquidCrystal_I2C.h>

//屏幕设置 定义I2C的lcd,这个lcd2*16的是基于PCF8574的,地址是39(0x27)
//每行最多显示20个字符,4行文本高度
LiquidCrystal_I2C lcd(0x27, 20, 4);


void setup() {

//定义屏幕
    lcd.init();//初始化 LCD 显示屏,设置其大小(列数和行数)并准备进行数据通信。
  lcd.backlight();//屏幕背光
  
  //屏幕使用
  lcd.setCursor(3, 0);//设置光标 第一个字符在第1列,第0行
  lcd.print("test");//在屏幕输出字符串
}
//这样就能输出数据到屏幕了。


还有一些其他常用指令:

 //lcd.clear();清屏

 //lcd.noDisplay();关屏幕
 //lcd.display();开屏幕

 //lcd.scrollDisplayLeft(); 屏幕内容向左滚动一格
 //lcd.scrollDisplayRight();屏幕内容向右滚动一格

 //lcd.setBacklight(BL_ON); 开背光
 //lcd.setBacklight(BL_OFF);关背光



3、串口监视器:

void setup() {

  //定义串口
  Serial.begin(9600); // 初始化串口通信

把字符串打印在串口监视器上
Serial.print("test");
}
loop{
int i=0;

//把i的值打印在屏幕上并换行
Serial.println(i);

i++;
}

//说明:print是打印在同一行,后面加上ln就是打印并换行

//"英文双引号间是以字符串的方式输出",没有双引号就是以数据的方式输出

//其他常用指令:

//int available = Serial.available(); 返回串口缓冲区中等待读取的字节数。
//char receivedChar = Serial.read(); 从串口接收一个字节,返回值为收到的字节。若无数据可读,将阻塞或返回特定值(如 -1)。



  各位小伙伴如果不会仿真,可以借助面包板来接线。(弯曲传感器一根1伯块哦,还是用仿真吧_(;3」∠)_  。)推荐使用www.tinkercad.com的模拟网页,它可以模拟弯曲传感器。

最后分享一个好用全面的Arduino仿真网页,比大部分仿真软件好用。

Welcome to Wokwi! | Wokwi Docs

如果我的分享有帮助到你的话,就帮忙点个赞吧,(*・ω< )

  • 12
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值