在网上找了很久,没有一个好的免费的关于弯曲传感器控制舵机的教程,为了解惑我自己写了一个弯曲传感器测试程序,如果有帮助就点个赞吧。
本程序测试了在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
如果我的分享有帮助到你的话,就帮忙点个赞吧,(*・ω< )