【貂蝉がプログラミングを学ぶ】Arduinoマニュアルの数学演算map()

ここに画像の説明を挿入
ここに画像の説明を挿入
Arduinoとは何ですか?
Arduino は、シンプルなハードウェアとソフトウェアでさまざまな創造的なプロジェクトを作成できるオープンソースの電子プロトタイピング プラットフォームです。初心者でも専門家でも、Arduino は無限の可能性を提供します。Arduino を使用してセンサー、照明、モーター、ロボット、IoT デバイスなどを制御できます。思いつく限り、Arduino はそれを実現するのに役立ちます。

Arduino についてさらに詳しく知りたい場合は、Arduino の公式 Web サイトにアクセスしてください。そこには、参考となる豊富なリソースとチュートリアルがあります。また、Arduino コミュニティに参加して、世界中の愛好家、学生、デザイナー、エンジニアとアイデアや経験を交換することもできます。さらに、Arduino のオンライン プログラミング ツールを使用して、クラウドにコードを作成し、開発ボードにアップロードすることもできます。

Arduino は、幅広い用途と可能性を備え、常に進化する革新的なプラットフォームです。このマニュアルが皆様の Arduino への興味と熱意を刺激し、Arduino がもたらす創造性と楽しさを楽しんでいただければ幸いです。

ここに画像の説明を挿入

Wikipedia の定義
Arduino は、ユーザーがインタラクティブな組み込みプロジェクトを作成するためのオープンソースの組み込みハードウェア プラットフォームです。さらに、Arduino はオープンソース ハードウェアおよびオープンソース ソフトウェア企業として、プロジェクトとユーザー コミュニティの両方を持っています。同社は、Arduino ボードと関連アクセサリを設計および製造しています。これらの製品は、GNU Lesser General Public License (LGPL) または GNU General Public License (GPL) に基づいてライセンスされたオープン ソース ハードウェアおよびソフトウェアの下で配布されており、Arduino を使用すると、誰でも Arduino ボードを構築してソフトウェアを配布できます。Arduino ボードは、事前に組み立てられた状態で市販されているか、DIY キットとして購入されています。

2005 年に導入された Arduino は、イタリアのイヴレーア地方にあるイヴレーア インタラクティブ デザイン研究所の学生として設計されました。その目的は、センサーを使用して相互作用するインタラクティブ デバイスを低コストで簡単に構築できる方法を初心者や専門家に提供することです。環境や設置の仕方により異なります。初心者や愛好家は、Arduino を使用して、センサー、単純なロボット、サーモスタット、モーション検出器などのデバイスを作成できます。

Arduino という名前は、プロジェクトの創設者の何人かがよくたむろしていたイタリアのイヴレーアにあるバーに由来しています。このバーの名前は、イヴレーア辺境の伯爵であり、1002 年から 1014 年までイタリア王であったイヴレーアのアルドゥインにちなんで名付けられました。

ここに画像の説明を挿入

17、Arduino の数学演算 map()
map() は Arduino の数学演算関数で、ある値の範囲から別の値の範囲に値をマッピングするために使用されます。これは、マッピングされる値、元の範囲の下限、元の範囲の上限、ターゲット範囲の下限、およびターゲット範囲の上限の 5 つのパラメータを受け入れ、マップされた値を返します。適用範囲:
1) アナログ入力の範囲 (0 ~ 1023) をアナログ出力の範囲 (0 ~ 255) にマッピングして、PWM 信号の制御を実現します。
2) センサーの読み取り値を、温度、距離、角度などの実際の物理量にマッピングします。
3) 視覚効果または音響効果のために、値をさまざまな色またはトーンにマッピングします。

アプリケーション シナリオ:
1) センサー データ変換: map() 関数は、センサーの読み取り値を元の範囲からより意味のある範囲の値にマッピングするためによく使用されます。たとえば、0 ~ 1023 の範囲のフォトレジスタの読み取り値を 0 ~ 100 の範囲の輝度値にマッピングすると、光の強度をより直感的に表現できます。
2) 出力信号のマッピング: 制御システムでは、出力信号の範囲が入力信号の範囲と一致しない場合があります。特定の制御ニーズを満たすために、map() 関数を使用して入力信号を目的の出力信号範囲にマッピングします。
3) データの調整と正規化: データの処理と分析では、比較、統計、またはその他の操作のためにデータを調整または正規化する必要がある場合があります。map() 関数は、データを必要な範囲にマッピングして、分析や処理に適したものにすることができます。

map() 関数を使用する場合は、次の点に注意する必要があります。
1) map() 関数はパラメータとして整数または浮動小数点数を受け入れることができますが、返される結果の型はパラメータの型と同じです。結果を別の型の変数に代入する場合は、型変換が必要です。
2) map() 関数は、マッピングされる値、元の間隔の下限と上限、およびターゲット間隔の下限と上限の 5 つのパラメータのみを受け入れることができます。複数の値をマップする場合は、map() 関数を個別に呼び出す必要があります。
3)map()関数は整数演算を使用しているため、小数部の欠落や四捨五入誤差が発生する場合があります。より正確なマッピングが必要な場合は、浮動小数点演算またはカスタム式を使用できます。

以下は、Arduino 数学演算 Map() の 3 つの実際的なアプリケーション ケースです。
ケース 1: ポテンショメータと RGB LED ライトを使用して、色の変化効果を実現します。ポテンショメータを回転させると、それに応じて RGB LED ライトの色が変化します。map() 関数を使用して、ポテンショメータの読み取り値を RGB LED ライトの 3 つのチャネルにマッピングします。

// 定义电位器和RGB LED灯的引脚
#define POT_PIN A0
#define RED_PIN 9
#define GREEN_PIN 10
#define BLUE_PIN 11

void setup() {
    
    
  // 设置RGB LED灯为输出模式
  pinMode(RED_PIN, OUTPUT);
  pinMode(GREEN_PIN, OUTPUT);
  pinMode(BLUE_PIN, OUTPUT);
}

void loop() {
    
    
  // 读取电位器的模拟值,并使用map()函数将其映射到0-255范围内
  int pot_value = analogRead(POT_PIN);
  pot_value = map(pot_value, 0, 1023, 0, 255);
  // 使用map()函数将电位器的读数映射到RGB LED灯的三个通道上
  // 当电位器读数为0时,RGB LED灯显示红色
  // 当电位器读数为255时,RGB LED灯显示绿色
  // 当电位器读数为511时,RGB LED灯显示蓝色
  // 当电位器读数在其他值时,RGB LED灯显示混合色
  int red_value = map(pot_value, 0, 511, 255, 0);
  int green_value = map(abs(pot_value - 255), 0, 255, 0, 255);
  int blue_value = map(pot_value - 511, 0, 511, 0, 255);
  
   // 控制RGB LED灯的颜色
   analogWrite(RED_PIN, red_value);
   analogWrite(GREEN_PIN, green_value);
   analogWrite(BLUE_PIN, blue_value);
}

ケース 2: 温湿度センサーとブザーを使用して温度警報機能を実現します。温度が設定したしきい値より高い場合、ブザーが鳴ります。温度が上昇すると、ビープ音の周波数が増加します。map() 関数を使用して、温度をブザーの周波数にマッピングします。

// 引入DHT库
#include <DHT.h>
// 定义DHT传感器的类型和引脚
#define DHT_TYPE DHT11
#define DHT_PIN A0
// 创建DHT对象
DHT dht(DHT_PIN, DHT_TYPE);
// 定义蜂鸣器的引脚
#define BUZZ_PIN 2
// 定义温度的阈值和范围,单位为摄氏度
#define TEMP_THRESHOLD 30.0
#define TEMP_MIN 30.0
#define TEMP_MAX 50.0
// 定义蜂鸣器的频率范围,单位为赫兹
#define FREQ_MIN 1000
#define FREQ_MAX 2000

void setup() {
    
    
  // 初始化DHT传感器
  dht.begin();
  // 设置蜂鸣器为输出模式
  pinMode(BUZZ_PIN, OUTPUT);
}

void loop() {
    
    
  // 获取当前的温度,单位为摄氏度
  float temp = dht.readTemperature();
  // 如果温度高于阈值
  if (temp > TEMP_THRESHOLD) {
    
    
    // 使用map()函数将温度映射到蜂鸣器的频率范围内
    int freq = map(temp, TEMP_MIN, TEMP_MAX, FREQ_MIN, FREQ_MAX);
    // 让蜂鸣器发出提示音
    tone(BUZZ_PIN, freq);
    delay(100);
    noTone(BUZZ_PIN);
    delay(100);
  }
}

ケース 3: ジャイロスコープと LCD ディスプレイを使用して、現在の傾斜角度を表示します。ジャイロスコープは、X 軸および Y 軸方向の傾き角度を -90 度から 90 度の範囲で検出できます。map() 関数を使用して傾斜角度を LCD ディスプレイの文字位置にマッピングし、視覚化を実現します。

// 引入Wire库和LiquidCrystal库
#include <Wire.h>
#include <LiquidCrystal.h>
// 定义陀螺仪的地址
#define GYRO_ADDR 0x68
// 定义LCD显示屏的引脚
#define RS_PIN 7
#define EN_PIN 8
#define D4_PIN 9
#define D5_PIN 10
#define D6_PIN 11
#define D7_PIN 12
// 创建LiquidCrystal对象,指定引脚顺序
LiquidCrystal lcd(RS_PIN, EN_PIN, D4_PIN, D5_PIN, D6_PIN, D7_PIN);

void setup() {
    
    
  // 初始化串口通信,设置波特率为9600
  Serial.begin(9600);
  // 初始化I2C通信,加入I2C总线
  Wire.begin();
  // 向陀螺仪发送指令,激活陀螺仪
  Wire.beginTransmission(GYRO_ADDR);
  Wire.write(0x6B);
  Wire.write(0);
  Wire.endTransmission(true);
  // 初始化LCD显示屏,设置列数为16,行数为2,并清屏
  lcd.begin(16,2);
  lcd.clear();
}

void loop() {
    
    
   // 向陀螺仪发送指令,请求读取数据
   Wire.beginTransmission(GYRO_ADDR);
   Wire.write(0x3B);
   Wire.endTransmission(false);
   // 接收陀螺仪返回的数据,共14个字节
   Wire.requestFrom(GYRO_ADDR,14,true); 
   int acc_x = Wire.read()<<8|Wire.read(); 
   int acc_y = Wire.read()<<8|Wire.read(); 
   int acc_z = Wire.read()<<8|Wire.read(); 
   int temp = Wire.read()<<8|Wire.read(); 
   int gyro_x = Wire.read()<<8|Wire.read(); 
   int gyro_y = Wire.read()<<8|Wire.read(); 
   int gyro_z = Wire.read()<<8|Wire.read(); 
  
   // 计算X轴和Y轴方向上的倾斜角度,单位为度,范围为-90到90
   float angle_x = atan2(acc_x, sqrt(acc_y * acc_y + acc_z * acc_z)) * RAD_TO_DEG;
   float angle_y = atan2(acc_y, sqrt(acc_x * acc_x + acc_z * acc_z)) * RAD_TO_DEG;
   
   // 使用map()函数将倾斜角度映射到LCD显示屏的字符位置上,范围为0到15
   int x_pos = map(angle_x, -90, 90, 0, 15);
   int y_pos = map(angle_y, -90, 90, 0, 15);
   
   // 在LCD显示屏上显示当前的倾斜角度,保留一位小数,并在对应的位置上显示一个点表示倾斜方向
   lcd.clear();
   lcd.setCursor(0,0);
   lcd.print("Angle X: ");
   lcd.print(angle_x,1);
   
   lcd.setCursor(0,1);
   lcd.print("Angle Y: ");
   lcd.print(angle_y,1);
   
   lcd.setCursor(x_pos,y_pos);
   lcd.print(".");
}

ケース 4: センサー データの変換:

int rawValue = analogRead(A0); // 读取传感器原始值

int mappedValue = map(rawValue, 0, 1023, 0, 100); // 将原始值映射到0到100的范围内

Serial.print("Mapped value: ");
Serial.println(mappedValue);

この場合、map() 関数を使用して、センサーの生の値を 0 ~ 100 の範囲にマッピングします。次に、デバッグまたは表示の目的で、マッピングされた値をシリアル モニターに出力します。

ケース 5: 出力信号マッピング:

int inputSignal = 50; // 输入信号值

int mappedSignal = map(inputSignal, 0, 100, 0, 255); // 将输入信号映射到0到255的范围内

analogWrite(9, mappedSignal); // 输出映射后的信号到PWM引脚

この場合、入力信号は、map() 関数を使用して 0 ~ 255 の範囲にマッピングされます。そして、マッピングされた信号を PWM 信号として端子に出力することで、外部機器を制御したり、特定の動作を実行したりできます。

ケース 6: データの調整と正規化:

int sensorValue = analogRead(A0); // 读取传感器值

float adjustedValue = map(sensorValue, 0, 1023, 0.0, 1.0); // 将传感器值映射到0.0到1.0的范围内

この場合、map()関数を使用してセンサー値を 0.0 から 1.0 の範囲にマッピングします。マッピングされた値は、データ処理、正規化、またはその他の分析操作に使用できます。

例 7: ポテンショメータを介して LED を制御する

int potPin = A0; // 电位器引脚
int ledPin = 9; // LED引脚

void setup() {
    
    
  pinMode(ledPin, OUTPUT);
}

void loop() {
    
    
  int potValue = analogRead(potPin); // 读取电位器的值
  int brightness = map(potValue, 0, 1023, 0, 255); // 将电位器的值从0到1023映射到亮度值0到255
  analogWrite(ledPin, brightness); // 根据映射后的亮度值控制LED的亮度
}

この例では、map() 関数を使用して、ポテンショメータから読み取った値 (0 ~ 1023) を LED の輝度値 (0 ~ 255) にマッピングすることにより、LED の輝度を制御します。

例 8: 温度変換 (温度センサーを使用)

int tempPin = A1; // 温度传感器引脚
int minTemp = 0; // 最低温度
int maxTemp = 100; // 最高温度

void setup() {
    
    
  Serial.begin(9600);
}

void loop() {
    
    
  int rawValue = analogRead(tempPin); // 读取温度传感器的模拟值
  float temperature = map(rawValue, 0, 1023, minTemp, maxTemp); // 将读取的值映射到指定的温度范围
  Serial.print("温度:");
  Serial.print(temperature);
  Serial.println(" °C");
  delay(1000);
}

この例では、map() 関数を使用して、温度センサーから読み取ったアナログ値 (0 ~ 1023) を温度値 (0 ~ 100) にマッピングし、シリアル ポート経由で出力します。

例 9: 距離センサーを介してステアリング ギアを制御する

#include <Servo.h>

int distancePin = A2; // 距离传感器引脚
int servoPin = 9; // 舵机引脚

Servo myservo;

void setup() {
    
    
  myservo.attach(servoPin); // 将舵机连接到指定引脚
}

void loop() {
    
    
  int distance = analogRead(distancePin); // 读取距离传感器的值
  int servoPosition = map(distance, 0, 1023, 0, 180); // 将读取的距离值映射到舵机的角度范围
  myservo.write(servoPosition); // 根据映射后的角度控制舵机的位置
  delay(100);
}

この例では、map() 関数を使用して、距離センサーから読み取った値 (0 ~ 1023) をサーボの角度範囲 (0 ~ 180) にマッピングし、サーボの位置を制御します。

ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/weixin_41659040/article/details/132647877