Arduino使用超声波模块配合舵机绘制二维图像
创作时间:
作者:
@小白创作中心
Arduino使用超声波模块配合舵机绘制二维图像
引用
CSDN
1.
https://blog.csdn.net/opdog/article/details/139406865
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;
}
第三步:添加超声波模块的针脚设置
void setup() {
Serial.begin(9600);
pinMode(TrigPin, OUTPUT);
pinMode(EchoPin, INPUT);
myservo.attach(9); // 控制线连接数字9
}
第四步:在循环中读取距离并转换坐标
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是一个合适的缩放
y = (int)(distance * sin(rad) / 16.0);
// 确保x和y在数组的有效范围内
if (x >= 0 && x < 27 && y >= 0 && y < 27) {
m[y][x] = 1; // 更新数组
}
}
完整代码
#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的基本控制能力,还涉及到了传感器数据处理和坐标转换等技术,非常适合初学者学习和实践。
热门推荐
火车上卖东西的推销员是什么人?东西质量有保障吗?
浙大妇院:打造中国特色国际一流妇产医学中心
粥是“冬天第一补物”!5种粥给你,好吃好做营养高,舒适过一冬
面包霉菌超标引关注:如何预防舌尖上的隐形威胁?
葡萄酒与红酒的区别是什么?
中国各省份五行分布图
羽毛球拍及部件检测:保障运动器材质量和安全的关键环节
“我不想死,但我忍不住!”——自伤自残的每道伤痕都在求助
1960年智利大地震是有记录以来最强的地震
健康科普丨失眠不再!开启睡眠“重启”计划
《炉石传说》星际迷你包版本强力卡组整理
葡萄酒与食物搭配的艺术:探讨“红肉配红酒,白肉配白酒”的规则背后的学问
传统招聘模式已无法满足需求,企业应该如何应对?
S37赛季杨玉环重装流攻略:中辅全能、超强拉扯,三重减速流玩法详解
与黄金挂钩的津巴布韦货币半年贬值一半,原因何在?有何教训?
2024年,中美两国居民收入数据对比,分析:我国消费为何不足
请求权基础是什么?5分钟带你认识民法总则,掌握民法关键
杭州旅游线路规划选择:一次完美的江南水乡之旅
端午节的小知识:粽子又称角黍?为何要饮雄黄酒?
巨蟹座女生喜欢的聊天方式
手机摄像头的镜片清洁怎么用?专业指南与实用技巧全解析
越野车车顶安装射灯是否合法?
什么是电动仪表显示
锅烧焦了怎么办?教你一招,3分钟焕然一新
小火焰,大冒险:打火机运输的安全旅程
八字如何判断格局 八字格局判定方法
3DMax和Maya哪个更容易学一些?
今年清明哪天扫墓最好,为何有人说今年扫墓要推迟?2个方面原因
关于高龄分娩对母体和胎儿的风险和NIPT(新型产前诊断)【医生监修】
解码地球古老的大气层:生命在塑造我们世界中的作用