【貂蝉がプログラミングを学ぶ】Arduinoマニュアルの時間関数遅延マイクロ秒()

ここに画像の説明を挿入
ここに画像の説明を挿入
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 年までイタリア王であったイヴレーアのアルドゥインにちなんで名付けられました。

ここに画像の説明を挿入

16. Arduino の時間関数遅延マイクロ秒()

Arduino の時間関数 lateMicroseconds() は、Arduino プログラムを一定期間一時停止させるために使用される関数です。その構文は次のとおりです。

delayMicroseconds(us);

ここで、 us は一時停止するマイクロ秒数を表す整数です。たとえば、layMicroseconds(1000) は、1000 マイクロ秒 (1 ミリ秒) の間一時停止することを意味します。

layMicroseconds()関数の使用範囲は主にプログラムの実行精度の制御や高速通信を実現する必要がある場合です。たとえば、特定の周波数でブザーを鳴らしたい場合は、DelayMicroseconds() 関数を使用してブザーの切り替え時間を制御できます。別の例として、Arduino が SPI や I2C などのプロトコルを介して他のデバイスと通信するようにしたい場合、信号のタイミングを制御するために、layMicroseconds() 関数を使用できます。

アプリケーション シナリオ:
1) 正確なタイミング制御:layMicroseconds() 関数は、通信プロトコルのタイミングの制御や正確なパルス信号の生成など、正確なタイミング制御が必要なシナリオでよく使用されます。適切な場所で遅延マイクロ秒()関数を呼び出すことにより、プログラムがマイクロ秒の間隔内で特定の操作を実行することを保証できます。
2) センサー読み取り: 高速センサーでデータ収集を実行する場合、マイクロ秒以内にセンサー データを読み取る必要がある場合があります。lateMicroseconds() 関数を使用すると、適切な遅延を追加して、システムが正確なデータを取得するのに十分な時間を確保してから、次のセンサー読み取り操作に進むことができます。
3) きめ細かい制御: 一部のアプリケーションでは、オーディオ処理、PWM 信号生成など、きめ細かい時間制御が必要です。遅延マイクロ秒()関数と他の制御技術を組み合わせることで、時間間隔の正確な制御を実現できます。

lateMicroseconds()関数の注意事項は以下のとおりです。
1)layMicroseconds()関数はプログラムの実行をブロックします。つまり、layMicroseconds()関数の実行中、Arduinoは他の入出力信号に応答できなくなります。これにより、プログラムで重要なイベントやデータが失われる可能性があります。したがって、layMicroseconds() 関数を使用する場合は、過度に長い遅延時間の使用を避けるか、micros() 関数などの他の非ブロッキングメソッドを使用して遅延効果を実現してください。
2)遅延マイクロ秒()関数はArduino内部のタイマーに影響を与えます。Arduino には、PWM 信号、シリアルポート通信、タイマー割り込み、その他の機能を制御するためのタイマーがいくつかあります。遅延マイクロ秒()関数が使用される場合、これらのタイマーは一時停止または遅延され、関連する関数の通常の動作に影響を与えます。したがって、layMicroseconds()関数を使用する場合は、他の関数との干渉や衝突がないか注意してください。
3) lateMicroseconds() 関数はマルチタスク環境には適していません。Arduino が複数のセンサーやアクチュエーターを同時に制御するなど、複数のタスクを同時に実行する必要がある場合、layMicroseconds() 関数を使用するとタスク間の同期の問題が発生します。1 つのタスクで遅延マイクロ秒() 関数を使用すると、他のタスクが時間内に実行できなくなるためです。したがって、マルチタスク環境では、タスク間の調整と切り替えを実現するために、FreeRTOS ライブラリなどの他のマルチタスク スケジューリング方法を使用する必要があります。
4) 遅延マイクロ秒()関数には一定の誤差範囲があります。Arduino の公式ドキュメントによると、DelayMicroseconds() 関数には、Arduino ボードのモデルごとに異なる誤差範囲があります。たとえば、16MHz Arduino Uno では最小遅延時間は 3 マイクロ秒、最大遅延時間は 16383 マイクロ秒、8MHz Arduino Pro Mini では最小遅延時間は 4 マイクロ秒、最大遅延時間は 16383 マイクロ秒です。 84MHz Arduino Due、最小遅延時間は 3 マイクロ秒、最大遅延時間は 1000000 マイクロ秒です。したがって、layMicroseconds() 関数を使用する場合は、さまざまなハードウェア プラットフォームに応じて適切な遅延時間を選択することに注意し、プログラムのパフォーマンスに対するエラーの影響を考慮する必要があります。

以下は、Arduino 時間関数遅延マイクロ秒()のいくつかの実際的な応用例です。

ケース 1: 440Hz の周波数でブザー音を鳴らす

// 定义蜂鸣器连接的引脚
#define BUZZER_PIN 10

// 初始化函数
void setup() {
    
    
  // 设置蜂鸣器引脚为输出模式
  pinMode(BUZZER_PIN, OUTPUT);
}

// 循环函数
void loop() {
    
    
  // 设置蜂鸣器引脚为高电平
  digitalWrite(BUZZER_PIN, HIGH);
  // 延时1136微秒(440Hz对应周期为2272微秒)
  delayMicroseconds(1136);
  // 设置蜂鸣器引脚为低电平
  digitalWrite(BUZZER_PIN, LOW);
  // 延时1136微秒
  delayMicroseconds(1136);
}

ケース 2: Arduino を SPI デバイスと通信させる

// 引入SPI库
#include <SPI.h>

// 定义SPI设备的片选引脚
#define CS_PIN 10

// 初始化函数
void setup() {
    
    
  // 设置片选引脚为输出模式
  pinMode(CS_PIN, OUTPUT);
  // 设置片选引脚为高电平,关闭通信
  digitalWrite(CS_PIN, HIGH);
  // 初始化SPI通信,设置时钟频率为4MHz,模式为0,位序为MSB
  SPI.begin();
  SPI.setClockDivider(SPI_CLOCK_DIV4);
  SPI.setDataMode(SPI_MODE0);
  SPI.setBitOrder(MSBFIRST);
}

// 循环函数
void loop() {
    
    
  // 设置片选引脚为低电平,开始通信
  digitalWrite(CS_PIN, LOW);
  // 延时1微秒,等待设备准备好
  delayMicroseconds(1);
  // 向设备发送一个字节的数据,例如0x55
  SPI.transfer(0x55);
  // 延时1微秒,等待设备响应
  delayMicroseconds(1);
  // 接收设备返回的一个字节的数据,并打印到串口
  byte data = SPI.transfer(0x00);
  Serial.println(data, HEX);
  // 设置片选引脚为高电平,结束通信
  digitalWrite(CS_PIN, HIGH);
}

ケース 3: ステッピング モーターを一定の速度で回転させる

// 定义步进电机的步进引脚和方向引脚
#define STEP_PIN 9
#define DIR_PIN 8

// 初始化函数
void setup() {
    
    
  // 设置步进引脚和方向引脚为输出模式
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
}

// 循环函数
void loop() {
    
    
  // 设置方向引脚为高电平,表示顺时针旋转
  digitalWrite(DIR_PIN, HIGH);
  // 循环1000次,每次旋转一个步进角度(假设步进电机的步距角为1.8度)
  for (int i = 0; i < 1000; i++) {
    
    
    // 设置步进引脚为高电平,表示开始一个步进动作
    digitalWrite(STEP_PIN, HIGH);
    // 延时500微秒,表示步进速度为1000步/秒(假设步进电机的最小响应时间为500微秒)
    delayMicroseconds(500);
    // 设置步进引脚为低电平,表示结束一个步进动作
    digitalWrite(STEP_PIN, LOW);
    // 延时500微秒,表示保持当前位置不动
    delayMicroseconds(500);
  }
}

ケース 4: 正確なタイミング制御:

const int signalPin = 9;

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

void loop() {
    
    
  digitalWrite(signalPin, HIGH); // 设置信号引脚为高电平
  delayMicroseconds(10); // 延时10微秒,产生精确的时序
  digitalWrite(signalPin, LOW); // 设置信号引脚为低电平
  delayMicroseconds(10); // 延时10微秒,保持时序
}

この場合、正確なタイミング制御は、layMicroseconds() 関数を使用して実現されます。特定の信号を生成するときにマイクロ秒レベルの遅延を使用することで、信号のタイミングが要件を満たしていることを確認します。

ケース 5: センサーの読み取り値:

const int sensorPin = A0;

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

void loop() {
    
    
  int sensorValue = analogRead(sensorPin); // 读取传感器的模拟值
  delayMicroseconds(100); // 延时100微秒等待传感器稳定
  Serial.println(sensorValue); // 输出传感器值
}

この場合、センサー読み取り値の安定性制御は、layMicroseconds() 関数を使用して実装されます。センサー値を読み取る前に適切なマイクロ秒の遅延を追加することで、正確な読み取り値を取得するために読み取り操作の前にセンサーが安定するのに十分な時間が与えられます。

ケース6:ステアリングギアの回転角度を制御する

#include <Servo.h>

Servo myservo;
int pos = 0;

void setup() {
    
    
  myservo.attach(9);
}

void loop() {
    
    
  for(pos = 0; pos < 180; pos+= 1) {
    
     
    myservo.write(pos);
    delayMicroseconds(10000); 
  }
} 

ケース 7: LED を特定の頻度で点滅させる

int led = 13;
int delayTime = 500;

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

void loop(){
    
    
  digitalWrite(led, HIGH);
  delayMicroseconds(delayTime);
  digitalWrite(led, LOW);
  delayMicroseconds(delayTime);
}

ケース 8: 38kHz PWM 信号を生成する

int buzzer = 9;
int cycle = 26; 

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

void loop() {
    
    
  digitalWrite(buzzer, HIGH);
  delayMicroseconds(cycle); 
  digitalWrite(buzzer, LOW);
  delayMicroseconds(cycle);  
}

これらの事例は、サーボ、ブザー、センサーの制御で重要な役割を果たすなど、マイクロ秒レベルの高精度な遅延が必要な場合に、layMicroseconds() が実際に適用されることを示しています。

ここに画像の説明を挿入

Guess you like

Origin blog.csdn.net/weixin_41659040/article/details/132642118