注釈
こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。
参加する理由は?
エキスパートサポート:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。
学び&共有:ヒントやチュートリアルを交換してスキルを向上させましょう。
独占的なプレビュー:新製品の発表や先行プレビューに早期アクセスしましょう。
特別割引:最新製品の独占割引をお楽しみください。
祭りのプロモーションとギフト:ギフトや祝日のプロモーションに参加しましょう。
👉 私たちと一緒に探索し、創造する準備はできていますか?[ここ]をクリックして今すぐ参加しましょう!
5.14 キャリブレーション¶
アナログ入力コンポーネント(例:フォトレジスタ、土壌湿度センサなど)を使用する際、読み取り範囲が0から1023でなく、0から800や600から1000のような範囲になることがあります。これは、通常の使用ではこれらのデバイスの限界に達することができないためです。
このような場合、センサ入力をキャリブレーションする技術が役立ちます。起動時に、制御ボードがセンサの読み取りを5秒間行い、最高値と最低値を記録します。この5秒間の読み取りが、サイクル中の読み取りの最小値と最大値を定義します。
このプロジェクトでは、上記のキャリブレーション技術を使用して、フォトレジスタとパッシブブザーを使用し、 テレミン のようなゲームを実装します。
注釈
テレミン は、物理的な接触を必要としない電子楽器です。プレイヤーの手の位置を感知して、異なる音を生成します。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
一式のキットを購入すると非常に便利です。リンクはこちら:
名前 |
このキットのアイテム |
リンク |
|---|---|---|
3 in 1 Starter Kit |
380+ |
以下のリンクから、個別に購入することも可能です。
コンポーネントの紹介 |
購入リンク |
|---|---|
- |
|
回路図
配線図
コード
注釈
3in1-kit\learning_project\5.14.calibrationのパスの下の5.14.calibration.inoファイルを開きます。または、このコードを Arduino IDE にコピーします。
コードが正常にアップロードされると、LEDが点灯し、フォトレジスタの検出範囲をキャリブレーションするための5秒間が与えられます。これは、毎回使用する際に異なる光環境になる可能性があるためです(例:正午と夕方では光の強度が異なる)。
このとき、フォトレジスタの上で手を上下に振る必要があります。手の動きの範囲がこの楽器の演奏範囲にキャリブレーションされます。
5秒後、LEDが消灯し、フォトレジスタの上で手を振ることで演奏することができます。
どのように動作するのか?
すべてのコンポーネントの初期値とピンを設定する。
const int buzzerPin = 9; const int ledPin = 8; const int photocellPin = A0; //フォトレジスタはA2に接続 int lightLow = 1023; int lightHigh = 0; int sensorValue = 0; // センサからの読み取り値 int pitch = 0; // センサ値をLED 'bars'に変換 unsigned long previousMillis = 0; const long interval = 5000;
setup()内でキャリブレーションプロセスを設定する。void setup() { pinMode(buzzerPin, OUTPUT); // ブザーを出力として設定 pinMode(ledPin, OUTPUT); // LEDピンを出力として設定 /* フォトレジスタの最大値 & 最小値をキャリブレートする */ previousMillis = millis(); digitalWrite(ledPin, HIGH); while (millis() - previousMillis <= interval) { sensorValue = analogRead(photocellPin); if (sensorValue > lightHigh) { lightHigh = sensorValue; } if (sensorValue < lightLow) { lightLow = sensorValue; } } digitalWrite(ledPin, LOW); }
ワークフローは以下の通りです。
5000msの間隔で
millis()を使ってタイミングを取る。
previousMillis = millis(); ... while (millis() - previousMillis <= interval) { ... }
この5秒間、フォトレジスタの周りで手を振ると、検出された光の最大値と最小値が記録され、それぞれ
lightHighとlightLowに割り当てられる。
sensorValue = analogRead(photocellPin); if (sensorValue > lightHigh) { lightHigh = sensorValue; } if (sensorValue < lightLow) { lightLow = sensorValue; }
これで、このテルミンを演奏することができます。フォトレジスタの値を
sensorValueに読み取り、それを小さい範囲から大きい範囲にマップして、ブザーの周波数として使用します。void loop() { /* 演奏 */ sensorValue = analogRead(photocellPin); //A0の値を読み取る pitch = map(sensorValue, lightLow, lightHigh, 50, 6000); // ブザーの周波数にマップする if (pitch > 50) { tone(buzzerPin, pitch, 20); } delay(10); }