Arduino结合超声波模块和舵机绘制二维图像
创作时间:
作者:
@小白创作中心
Arduino结合超声波模块和舵机绘制二维图像
引用
CSDN
1.
https://blog.csdn.net/opdog/article/details/139406865
Arduino结合超声波模块和舵机可以实现简单的二维图像绘制功能。本文将详细介绍如何通过Arduino控制舵机旋转并读取超声波模块的数据,最终在串口监视器中显示二维点阵图。
原理
舵机每次增加一度,读取当前的超声波模块值,得到一个携带障碍物坐标信息的极坐标系,并将极坐标系转为笛卡尔坐标系,打印在串口监视器或者可以发送给电脑使用MATLAB等软件处理。
模拟效果
设置距离为82厘米保持不动,舵机转一圈。得到的二维点阵图如下:
代码实现
第一步:控制舵机旋转
使用Arduino自带库控制舵机旋转180°。这里只是举例:
#include <Servo.h>
void setup()
{
myservo.attach(9); // 舵机控制 9针脚
}
void loop()
{
int pos; // 角度存储变量
for (pos = 0; pos <= 180; pos++)
{
myservo.write(pos); // 将舵机转动到指定角度 ()
delay(15); // 稍微等待以确保舵机有时间移动到新位置
}
}
第二步:读取超声波模块距离
定义一个读取超声波模块距离的函数:
int read_distance()
{
int distance;
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
distance = pulseIn(EchoPin, HIGH)/58.0;
return distance;
}
第三步:设置超声波模块针脚
在setup()函数中添加针脚设置:
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
myservo.attach(9); // 控制线连接数字9
}
第四步:读取距离并转换坐标
在loop()函数中添加读取距离的代码:
for (pos = 0; pos <= 180; pos++)
{
myservo.write(pos); // 将舵机转动到指定角度 ()
delay(15); // 稍微等待以确保舵机有时间移动到新位置
distance = read_distance(); // 读取距离
}
将极坐标系转换为笛卡尔坐标系:
// 将角度转换为弧度,并计算x和y坐标
rad = pos * (PI / 180.0);
x = 13 + (int)(distance * cos(rad) / 8.0); // 假设除以8是一个合适的缩放
//之所以x要+13,是因为我们的矩阵的宽度是27.这样可以x的起始坐标居中。
y = (int)(distance * sin(rad) / 16.0);
第五步:记录坐标数据
创建一个27*27的二维数组来记录坐标数据:
int m[y][x];
//y与x的乘积<=27^2
完整的loop()函数:
void loop() {
int distance;
int pos; // 角度存储变量
double rad;
for (pos = 0; pos <= 180; pos++) {
myservo.write(pos); // 将舵机转动到指定角度 ()
delay(15); // 稍微等待以确保舵机有时间移动到新位置
distance = read_distance(); // 读取距离
// 将角度转换为弧度,并计算x和y坐标
rad = pos * (PI / 180.0);
x = 13 + (int)(distance * cos(rad) / 8.0); // 假设除以4是一个合适的缩放
y = (int)(distance * sin(rad) / 16.0); // 向下为正,所以需要减去
// 确保x和y在数组的有效范围内
if (x >= 0 && x < 27 && y >= 0 && y < 27) {
m[y][x] = 1; // 更新数组
}
}
}
最终代码
完整的Arduino代码如下:
#include <Servo.h>
#include <math.h>
const int TrigPin = 3;
const int EchoPin = 2;
int read_distance()
{
int distance;
digitalWrite(TrigPin, LOW);
delayMicroseconds(2);
digitalWrite(TrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(TrigPin, LOW);
distance = pulseIn(EchoPin, HIGH)/58.0;
return distance;
}
const int ServoPin = 9; // 控制线连接的数字引脚
Servo myservo; // 定义Servo对象来控制
int m[27][27] = {0}; // 初始化二维数组
void setup()
{
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
myservo.attach(9); // 控制线连接数字9
}
void loop() {
int distance;
int pos; // 角度存储变量
double rad;
int x, y,i,j;
for (pos = 0; pos <= 180; pos++) {
myservo.write(pos); // 将舵机转动到指定角度 ()
delay(15); // 稍微等待以确保舵机有时间移动到新位置
distance = read_distance(); // 读取距离
// 将角度转换为弧度,并计算x和y坐标
rad = pos * (PI / 180.0);
x = 13 + (int)(distance * cos(rad) / 8.0); // 假设除以4是一个合适的缩放
y = (int)(distance * sin(rad) / 16.0); // 向下为正,所以需要减去
// 确保x和y在数组的有效范围内
if (x >= 0 && x < 27 && y >= 0 && y < 27) {
m[y][x] = 1; // 更新数组
}
// 打印当前角度和检测到的距离
Serial.print("Angle: ");
Serial.print(pos);
Serial.print(", Distance: ");
Serial.println(distance);
}
// 打印m数组。
for (i = 0; i < 26; i++) {
for (j = 0; j < 28; j++) {
Serial.print(".");
if(m[i][j]==0)
{
Serial.print(".");
}
else Serial.print(m[i][j]);
m[i][j]={0};
}
Serial.println(";");
delay(200);
// 在每行末尾打印换行符
}
myservo.write(0);//舵机归位
delay(5000);//5秒后再次扫描。
}
通过以上步骤,你可以使用Arduino、超声波模块和舵机实现简单的二维图像绘制功能。这个项目不仅可以作为学习Arduino控制硬件的实践案例,还可以应用于机器人避障、环境监测等领域。
热门推荐
湖南工商大学:科技创新赋能新发展,培育数智化新质人才
如何准备数据集?大模型训练数据怎么准备高质量的训练数据集
双摇跳绳的选材与训练方法
将数据从行转置到列,或将数据从列转置到行
李津大局观:统计学相关系数分析之黄金价格与实际利率定价逻辑
浅析钢琴演奏中音乐与情感表达的论文
国产皮卡一味模仿美式皮卡、尺寸持续加大并不对,皮卡应当小而精
婚宴预定陷阱,婚宴酒店的隐形消费有哪些
汽车雨刮器选购指南,这几方面一定要注意到……
Excel批量插入图片并自适应表格大小的VBA实现方法
阑尾炎腹腔镜手术全麻插管吗
普通KN95和医用KN95区别(医用95级口罩和KN95的区别)
毛坯房装修量房的三大技巧,助你轻松掌握装修第一步
玉灵膏的配方比例与功效:龙眼肉和西洋参的黄金配比
车管小课堂 | 怎样通过"交管12123"办理机动车转籍 申请业务指南
共和国勋章值多少钱,共和国勋章有收藏价值吗
穿越千年的韵律:宋词的魅力与智慧
新会陈皮是怎么制作而成的?
南京工业大学实现大肠杆菌利用纤维素水解液高产依克多因
来长春吃啥?当地人推荐这10种,价格不高,吃的过瘾,地道东北味
一般纳税人月销售额10万元以下免征增值税吗?
植发后还需要一直要用药物维持吗?这些注意事项要留意
深入理解变异系数:计算方法及应用场景详解
OA流程节点超时功能的技术实现与优化策略
肖特基二极管的结构、特点,封装类型以及应用范围
历史上的年妃,和《甄嬛传》完全不同,温良端肃,生三子一女
商业摄影如何将你的自然美转化为视觉盛宴
如何做一个优秀的项目管理汇报?
如何调整防火墙设置以解决网络连接超时问题?
最辣的辣椒排行榜:从常见辣椒到世界之最