首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >机器人控制器编程实践指导书旧版-实践二 传感器(模拟量)

机器人控制器编程实践指导书旧版-实践二 传感器(模拟量)

作者头像
zhangrelay
发布于 2022-08-10 07:55:30
发布于 2022-08-10 07:55:30
6800
举报

适用于UNO/2560/DUE/ESP8266/ESP32,2021年之前使用版本。


实践二 传感器(模拟量)

2.1 实践目的

  • 掌握Arduino[ESP32]与红外避障传感器、温湿度传感器、烟雾传感器、火焰传感器、人体红外感应传感器、超声波传感器模块的测试。

2.2 实践设备

  • PC机一台
  • Arduino[ESP32]开发板及配件等
  • 万用表和示波器等

2.3 实践原理

由于模拟传感器种类繁多,但是代码和原理基本相似,只给出一些典型案例介绍。

  • 初级:

压力传感器:

示意图

参考代码:

int sensorPin = 2; // select the input pin for the potentiometer

int ledPin = 13; // select the pin for the LED

int sensorValue = 0; // variable to store the value coming from the sensor

void setup() {

// declare the ledPin as an OUTPUT:

pinMode(ledPin, OUTPUT);

}

void loop() {

// read the value from the sensor:

sensorValue = analogRead(sensorPin);

// turn the ledPin on

digitalWrite(ledPin, HIGH);

// stop the program for <sensorValue> milliseconds:

delay(sensorValue);

// turn the ledPin off:

digitalWrite(ledPin, LOW);

// stop the program for for <sensorValue> milliseconds:

delay(sensorValue);

}

  • 中级:

温度传感器LM35:

示意图

参考代码:

float temperature; // stores the temperature

int sensorPin = 0; // pin where the sensor is connected to

int startTemp=20;

// the start temperature > at this temperature, no LED will light up

void setup(){

Serial.begin(9600); // initialisation of the serial connection

for (int i=2;i<8; i++){ // output channels from 2 to 7

pinMode(i,OUTPUT); // pin is a output

}

}

void loop()

{

temperature = analogRead(sensorPin); // reading analog sensor value

temperature = temperature*0.488; // correcting to °C

for (int i=0;i<8; i++){

if (temperature>((i*2)+startTemp)){ // switch LED on, if temperature is higher than starttemp + (LED number*2)

digitalWrite(i,HIGH);

}

else {

digitalWrite(i,LOW); // else, switch it off

}

}

Serial.print(temperature);Serial.println(" °C"); // send the temperarue to the serial monitor

delay(500); // just wait a little

}

  • 高级(ROS选修):

模拟量端口数据采集

#if (Arduino[ESP32] >= 100)

 #include <Arduino[ESP32].h>

#else

 #include <WProgram.h>

#endif

#include <ros.h>

#include <rosserial_Arduino[ESP32]/Adc.h>

ros::NodeHandle nh;

rosserial_Arduino[ESP32]::Adc adc_msg;

ros::Publisher p("adc", &adc_msg);

void setup()

{

  pinMode(13, OUTPUT);

  nh.initNode();

  nh.advertise(p);

}

//We average the analog reading to elminate some of the noise

int averageAnalog(int pin){

  int v=0;

  for(int i=0; i<4; i++) v+= analogRead(pin);

  return v/4;

}

long adc_timer;

void loop()

{

  adc_msg.adc0 = averageAnalog(0);

  adc_msg.adc1 = averageAnalog(1);

  adc_msg.adc2 = averageAnalog(2);

  adc_msg.adc3 = averageAnalog(3);

  adc_msg.adc4 = averageAnalog(4);

  adc_msg.adc5 = averageAnalog(5);

  p.publish(&adc_msg);

  nh.spinOnce();

}

2.4 实践内容

阅读2.3中示意图、原理图和代码,在Arduino[ESP32]平台上完成实践。

2.5 实践问题

2.5.1 依据环境光亮度(光敏电阻)控制LED灯闪烁频率或亮度

在此示例中,光电管值通过“模拟输入”引脚读取。 然后使用这些值来控制 LED 的闪烁速率。 使用万用表,检查不同光照条件下光电管的最小和最大电阻。然后用Axel-Benz公式计算电阻值:Rref = sqrt(Rmin*Rmax)

示意图

写出实现上述功能核心代码,并下载到Arduino[ESP32]验证(此题类似手机屏幕亮度自动调节)。

// These constants won't change. They're used to give names to the pins used:

const int analogInPin = A0;  // Analog input pin that the potentiometer is attached to

const int analogOutPin = 9; // Analog output pin that the LED is attached to

int sensorValue = 0;        // value read from the pot

int outputValue = 0;        // value output to the PWM (analog out)

void setup() {

  // initialize serial communications at 9600 bps:

  Serial.begin(9600);

}

void loop() {

  // read the analog in value:

  sensorValue = analogRead(analogInPin);

  // map it to the range of the analog out:

  outputValue = map(sensorValue, 0, 1023, 0, 255);

  // change the analog out value:

  analogWrite(analogOutPin, outputValue);

  // print the results to the Serial Monitor:

  Serial.print("sensor = ");

  Serial.print(sensorValue);

  Serial.print("\t output = ");

  Serial.println(outputValue);

  // wait 2 milliseconds before the next loop for the analog-to-digital

  // converter to settle after the last reading:

  delay(2);

}

2.5.2 依据距离远近依次点亮LED

简单的停车助手 测量到附近物体的距离并显示为 LED 图表。

写出实现上述功能核心代码,并下载到Arduino[ESP32]验证。

#include <ros.h>

#include <std_msgs/Empty.h>

ros::NodeHandle nh;

void messageCb( const std_msgs::Empty& toggle_msg){

  digitalWrite(13, HIGH-digitalRead(13));   // blink the led

}

ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );

void setup()

{

  pinMode(13, OUTPUT);

  nh.initNode();

  nh.subscribe(sub);

}

void loop()

{

  nh.spinOnce();

  delay(1);

}

2.6 实践总结

回顾本次实践,遇到哪些问题,如何解决,经验和启发有哪些?

DHT11是温湿度传感器,ESP32可以通过单总线读取DHT11,使用ESP32开发板,连接四路DHT11,发现,读值是正常的。

评分:


本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
机器人控制器编程实践指导书旧版-实践一 LED灯(数字量)
适用于UNO/2560/DUE/ESP8266/ESP32,2021年之前使用版本。
zhangrelay
2022/08/10
1.2K0
机器人控制器编程实践指导书旧版-实践一 LED灯(数字量)
机器人控制器编程课程-教案02-基础
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
zhangrelay
2019/09/19
1.1K0
机器人控制器编程课程-教案02-基础
机器人实践课程镜像分享及使用说明(Arduino+ROS1+ROS2+Gazebo+SLAM+...)
经过5年尝试和努力,在吸取indigo、kinetic版本经验后,融合Arduino、ROS1、ROS2、Gazebo和SLAM的适用机器人爱好者的实践课程镜像尝鲜版(bug是免不了的!_!)终于完成了。
zhangrelay
2020/01/14
1.3K0
机器人实践课程镜像分享及使用说明(Arduino+ROS1+ROS2+Gazebo+SLAM+...)
机器人控制器编程实践指导书旧版-实践五 数字舵机(执行器)
适用于UNO/2560/DUE/ESP8266/ESP32,2021年之前使用版本。
zhangrelay
2022/09/21
6140
机器人控制器编程实践指导书旧版-实践五 数字舵机(执行器)
机器人微控制器编程(CoCube)-突破边界
突破windows或linux的限制,突破电脑或手机的限制,突破单片机原有的理论实践体系,全面提升到CoCube机器人平台。
zhangrelay
2022/09/21
4700
机器人微控制器编程(CoCube)-突破边界
用安信可WiFi蓝牙模组做一个水位监测器
水位检测在水资源管理、城市防洪、农业灌溉、家用电器和工业生产等多领域发挥积极建设作用。利用水位传感器,可以实现水资源的智能管理,提高生产效率。
安信可科技
2025/05/16
1860
esp32发布机器人电池电压到ros2(micro-ros+CoCube)
示例程序测试端口ad数值: #include "Arduino.h" #include <ESP32AnalogRead.h> ESP32AnalogRead adc; void setup() { adc.attach(34); Serial.begin(115200); } void loop() { delay(50); Serial.println("Voltage = "+String(adc.readVoltage())); } 这只是一个简单测试ad口电压的程序,没有滤波,没有
zhangrelay
2022/08/10
8580
esp32发布机器人电池电压到ros2(micro-ros+CoCube)
基于MQTT协议的物联网小基站
注意,本示例中,因没有添加土壤传感器,在代码中进行了注释。需要开启,去掉注释就行了。
逍遥子大表哥
2025/07/28
1360
基于MQTT协议的物联网小基站
简单的实现土味实时声音可视化
声音可视化顾名思义,就是把听到声音,通过视觉的方法呈现出来,人不仅可以听见声音,同时也可以看见。声音可视化最早是人们用来分析和了解声音的一种研究方式,不过近几年开始,在很多新媒体舞台上,开始兴起了一股音画联动的热潮,通过将声音和图画连接起来,给观赏者更高级的体验,然后音画联动中,最为高级的就非实时音画联动莫属了,也就是说听见什么声音,立刻的就更加声音的频谱发生视觉上的变化。
UDM Lab
2020/04/20
9050
ESP8266和ROS收发消息读取模拟量控制LED亮度
rosrun rosserial_python serial_node.py tcp
zhangrelay
2020/09/29
9200
ESP8266和ROS收发消息读取模拟量控制LED亮度
机器人控制器编程课程-教案03-进阶
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
zhangrelay
2019/09/23
3.3K0
机器人控制器编程课程-教案03-进阶
如何快速学会单片机编程并应用?
C51--(Arduino、MSP430)--(2812、28335)--(STM32、ARM9)--(TK1、BeagleBone、Raspberry Pi)
zhangrelay
2019/01/23
1.8K0
机器人控制器编程实践指导书旧版-实践七 无线通信(网络)
适用于UNO/2560/DUE/ESP8266/ESP32,2021年之前使用版本。
zhangrelay
2022/09/21
1.4K0
机器人控制器编程实践指导书旧版-实践七 无线通信(网络)
Arduino使用ESP8266连接机智云物联网平台
本文实现Arduino UNO R3通过ESP8266-01模块连接机智云平台,从而实现用手机APP远程点亮LED灯。
小雨coding
2020/06/09
4.7K0
Arduino使用ESP8266连接机智云物联网平台
Arduino 语言常用函数说明
Arduino 是由 C/C++ 混合编写而成。Arduino 语言也继承了 C/C++ 语言的语法。通常所说的 Arduino 语言,是指 Arduino 核心库文件提供的各种应用程序编程接口(Application Programming Interface,简称API)的集合。
caoqi95
2019/03/28
3.3K0
和12岁小同志搞创客开发:手撕代码,做一款声控灯
项目专栏:https://blog.csdn.net/m0_38106923/category_11097422.html
不脱发的程序猿
2021/11/17
4200
ESP32与ROS调试笔记(Linux和Windows)
其实很简单,和esp8266类似,只用arduino自带的ros包即可,注意版本号0.7.8。
zhangrelay
2021/03/03
1K0
ESP8266和ROS调试一些问题汇总
rosrun rosserial_arduino serial_node.py _port:=/dev/ttyUSB0
zhangrelay
2020/09/25
6670
ESP8266和ROS调试一些问题汇总
Arduino R4 WIFI板子测评及实列使用(风速测量)
Arduino R4 WiFi和Arduino uno有何不同呢?通过对比,我做了一个表格。
逍遥子大表哥
2025/07/28
1530
Arduino R4 WIFI板子测评及实列使用(风速测量)
使用Docker,MQTT,Grafana,InfluxDB,Python和Arduino
我必须承认,这篇文章只是与Grafana和InfluxDB一起玩的借口。InfluxDB是一个很酷的数据库,专门用于处理时间序列数据。Grafana是一个用于时间序列分析的开源工具。我想构建一个简单的原型。这个想法是:
February
2018/11/29
4K0
推荐阅读
相关推荐
机器人控制器编程实践指导书旧版-实践一 LED灯(数字量)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档