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

2022-08-10 15:55:30 浏览数 (1)

适用于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,发现,读值是正常的。

评分:


0 人点赞