.. note:: こんにちは、SunFounderのRaspberry Pi & Arduino & ESP32愛好家コミュニティへようこそ!Facebook上でRaspberry Pi、Arduino、ESP32についてもっと深く掘り下げ、他の愛好家と交流しましょう。 **参加する理由は?** - **エキスパートサポート**:コミュニティやチームの助けを借りて、販売後の問題や技術的な課題を解決します。 - **学び&共有**:ヒントやチュートリアルを交換してスキルを向上させましょう。 - **独占的なプレビュー**:新製品の発表や先行プレビューに早期アクセスしましょう。 - **特別割引**:最新製品の独占割引をお楽しみください。 - **祭りのプロモーションとギフト**:ギフトや祝日のプロモーションに参加しましょう。 👉 私たちと一緒に探索し、創造する準備はできていますか?[|link_sf_facebook|]をクリックして今すぐ参加しましょう! .. _metronome: メトロノーム ==================== こちらではメトロノームを作成します。このメトロノームは5レベルに分けられており、レベルが高いほどブザーの呼び出しが緊急になります。 .. image:: img/metronome.png **必要な部品** このプロジェクトには、以下のコンポーネントが必要です。 全体のキットを購入することは非常に便利です。リンクはこちら: .. list-table:: :widths: 20 20 20 :header-rows: 1 * - 名前 - このキットのアイテム - リンク * - Raphael Kit - 337 - |link_Raphael_kit| 以下のリンクからも別々に購入することができます。 .. list-table:: :widths: 30 20 :header-rows: 1 * - コンポーネントの紹介 - 購入リンク * - :ref:`cpn_gpio_board` - |link_gpio_board_buy| * - :ref:`cpn_breadboard` - |link_breadboard_buy| * - :ref:`cpn_wires` - |link_wires_buy| * - :ref:`cpn_buzzer` - |link_passive_buzzer_buy| * - :ref:`cpn_transistor` - |link_transistor_buy| **配線図** .. image:: img/image106.png .. note:: ここではアクティブブザーが使用されており、白いステッカーが付いています。 **スケッチ** .. code-block:: Arduino import processing.io.*; int level = 0; int buzzerPin = 17; int levelRange=5; Slider mySlider; void setup() { size(400, 200); frameRate(50); mySlider = new Slider(width * 0.2,height * 0.4,width * 0.8,height * 0.6,0,levelRange,level); GPIO.pinMode(buzzerPin, GPIO.OUTPUT); } void draw() { background(255); mySlider.show(); if(level==0){ GPIO.digitalWrite(buzzerPin, GPIO.HIGH); }else if((frameCount/5) % (levelRange-level+1) ==0){ GPIO.digitalWrite(buzzerPin, GPIO.LOW); }else{ GPIO.digitalWrite(buzzerPin, GPIO.HIGH); } } void mouseDragged(){ level = mySlider.dragPoint(mouseX,mouseY); } class Slider{ float slotPointAX; float slotPointBX; float slotPointAY; float slotPointBY; float linePoint; float depth; int maxRange; int minRange; int value; Slider(float ax, float ay, float bx, float by, int min, int max, int v){ slotPointAX = ax; slotPointAY = ay; slotPointBX = bx; slotPointBY = by; maxRange = max; minRange = min; value = v; linePoint = slotPointAX;// + map(value, minRange, maxRange, slotPointAX, slotPointBX); depth = (slotPointBY - slotPointAY)*0.75; } void show(){ rectMode(CORNERS); fill(200); stroke(255,0,0); rect(slotPointAX, slotPointAY, slotPointBX, slotPointBY); fill(255,0,0); rect(slotPointAX, slotPointAY, linePoint, slotPointBY); fill(200); textSize(depth); text(minRange, slotPointAX, slotPointBY+depth); text(maxRange, slotPointBX, slotPointBY+depth); text(value, linePoint, slotPointAY); } int dragPoint(float mx, float my){ if(mx>=slotPointAX && mx<=slotPointBX && my>=slotPointAY && my<=slotPointBY){ value = int(map(mx,slotPointAX,slotPointBX,minRange,maxRange)); linePoint = map(value,minRange,maxRange,slotPointAX,slotPointBX); } return value; } } **どのように動作するのか?** .. 前のプロジェクトと同じように、 ``Slider`` クラスを作成し、それを**WIDGET**として機能させました。 .. しかし、 ``dragPoint()`` は少し修正されており、スライドする際に連続しない特徴を持ち、レベル調整により適しています。 .. .. code-block:: Arduino .. int dragPoint(float mx, float my){ .. if(mx>=slotPointAX && mx<=slotPointBX && my>=slotPointAY && my<=slotPointBY){ .. value = int(map(mx,slotPointAX,slotPointBX,minRange,maxRange)); .. linePoint = map(value,minRange,maxRange,slotPointAX,slotPointBX); .. } .. return value; .. } ここでは、 ``Slider`` クラスを作成し、それを **WIDGET** として機能させました。 .. code-block:: arduino Slider(ax, ay, bx, by, min, max, v) 宣言には、7つのパラメータを渡す必要があります。 最初の4つのパラメータは、ウィジェットのサイズを決定し、左上の開始点の座標(x1, y1)と右下の座標(x2, y2)に続きます。 最後の3つのパラメータは、その数値範囲(最小から最大)と初期値を決定します。 2つのメソッドがあります。 ``dragPoint()`` の効果は、スライダーをドラッグ可能にし、スライダーの現在の位置値を返すことです。 .. code-block:: arduino int dragPoint(float mx, float my){ if(mx>=slotPointAX && mx<=slotPointBX && my>=slotPointAY && my<=slotPointBY){ value = int(map(mx,slotPointAX,slotPointBX,minRange,maxRange)); linePoint = map(value,minRange,maxRange,slotPointAX,slotPointBX); } return value; } もう一つのメソッド ``show()`` は、スライダーを表示するためのものです。同時に、対応する位置に範囲値と現在値が表示されます。 .. code-block:: arduino void show(){ rectMode(CORNERS); fill(200); stroke(255,0,0); rect(slotPointAX, slotPointAY, slotPointBX, slotPointBY); fill(255,0,0); rect(slotPointAX, slotPointAY, linePoint, slotPointBY); fill(200); textSize(depth); text(minRange, slotPointAX, slotPointBY+depth); text(maxRange, slotPointBX, slotPointBY+depth); text(value, linePoint, slotPointAY); }