SunFounder ESP32 スターターキット¶
SunFounder ESP32 スターターキットをお選びいただき、ありがとうございます。
注釈
このドキュメントは以下の言語で利用可能です。
ご希望の言語でドキュメントにアクセスするために、それぞれのリンクをクリックしてください。

ESP32ラーニングキットへようこそ!この包括的なキットは、ESP32マイクロコントローラの多機能な世界を初心者から熟練開発者まで深く探ることを目的として設計されています。中心にはESP32 WROOM 32Eがあり、LED、センサー、モーターなどの付属部品が豊富に揃っているので、さまざまなプロジェクトを探索できます。
基本的な電子工作からIoTの統合まで、このキットには全てが備わっています。MicroPythonの愛好者のために、MicroPythonの構造化された導入から、IDEのセットアップや基本的な文法のレッスンまで提供しています。Arduinoユーザーも忘れられておらず、Arduinoを始めるための専用セクションや基本プロジェクトのスイートが含まれていて、学習プロセスをスタートできます。
クリエイティブな方には、Scratchとの統合に関する楽しいセクションがあり、プログラミングとストーリーテリングの融合を実現します。キット内の各プロジェクトは綿密に概説されており、目的、回路の組み立て、プログラミングの側面を理解することを確実にします。
多数のゲームプロジェクト、実用的なアプリケーション、トラブルシューティングのFAQを備えたこのキットは、全てのユーザーに豊かな学習経験を約束します。ESP32の冒険を始めてみましょう!
ご質問や他の興味深いアイディアがあれば、service@sunfounder.comまでメールをお送りください。
表示言語について
英語に加えて、このコースの他の言語に取り組んでいます。協力に興味がある方はservice@sunfounder.comまでご連絡ください。ご協力いただいた方には無料で製品を提供いたします。 それまでは、Google Translateを使用して英語をお求めの言語に変換することをおすすめします。
手順は以下の通りです。
このコースのページで、右クリックして Translate to xx を選択します。現在の言語が望むものでない場合は、後で変更できます。

右上隅に言語のポップアップが表示されます。メニューボタンをクリックして choose another language します。

反転した三角形のボックスから言語を選択し、 Done をクリックします。

コードをダウンロードする¶
こちらはESP32スターターキットの完全なコードパッケージです。以下のリンクからダウンロードできます:
ダウンロードが完了したら、ファイルを解凍し、対応するソフトウェアで関連する例示コードやプロジェクトファイルを開いてください。これにより、キットが提供するすべてのコードとリソースを閲覧し、利用することができます。
Arduinoユーザーの皆様へ¶
こちらはESP32スターターキットの完全なコードパッケージです。以下のリンクからダウンロードできます:
ダウンロードが完了したら、ファイルを解凍し、対応するソフトウェアで関連する例示コードやプロジェクトファイルを開いてください。これにより、キットが提供するすべてのコードとリソースを閲覧し、利用することができます。
1. はじめに
1.1 Arduino IDEのインストール(重要)¶
Arduino IDE(Arduino統合開発環境)は、Arduinoプロジェクトを完遂するために必要なすべてのソフトウェアサポートを提供します。これはArduinoチームによって提供されているArduino専用のプログラミングソフトウェアで、プログラムの記述とArduinoボードへのアップロードを可能にします。
Arduino IDE 2.0はオープンソースプロジェクトです。その頑丈な前身であるArduino IDE 1.xから大きく進化し、刷新されたUI、改善されたボード・ライブラリマネージャー、デバッガー、オートコンプリート機能などが追加されています。
このチュートリアルでは、Windows、Mac、またはLinuxコンピュータにArduino IDE 2.0をダウンロードしてインストールする方法をご紹介します。
必要条件¶
Windows - Win 10以降、64ビット
Linux - 64ビット
Mac OS X - バージョン10.14:「Mojave」以降、64ビット
Arduino IDE 2.0のダウンロード¶
Arduino IDE 2.0.0 Page にアクセスします。
ご使用のOSバージョンに合ったIDEをダウンロードします。
インストール¶
Windows¶
ダウンロードした
arduino-ide_xxxx.exe
ファイルをダブルクリックして実行します。ライセンス契約を読み、同意します。
インストールオプションを選択します。
インストール場所を選択します。システムドライブ以外のドライブにソフトウェアをインストールすることを推奨します。
そして完了します。
macOS¶
ダウンロードした arduino_ide_xxxx.dmg
ファイルをダブルクリックし、指示に従って Arduino IDE.app を Applications フォルダにコピーします。数秒後にArduino IDEが正常にインストールされたことが確認できます。

Linux¶
LinuxシステムへのArduino IDE 2.0のインストールチュートリアルは、以下を参照してください: https://docs.arduino.cc/software/ide-v2/tutorials/getting-started/ide-v2-downloading-and-installing#linux
IDEの起動¶
Arduino IDE 2.0を初めて開くと、自動的にArduino AVRボード、内蔵ライブラリ、その他必要なファイルがインストールされます。
また、ファイアウォールやセキュリティセンターがデバイスドライバのインストールを求めるポップアップを何回か表示する場合があります。すべてインストールしてください。
これでArduino IDEは使用準備が整いました!
注釈
ネットワークの問題やその他の理由で一部のインストールがうまくいかなかった場合、Arduino IDEを再度開くと残りのインストールが完了します。すべてのインストールが完了した後、出力ウィンドウは「Verify」または「Upload」をクリックしない限り自動的には開きません。
1.2 Arduino IDEの紹介¶

検証(Verify): コードをコンパイルします。構文の問題がある場合は、エラーとして提示されます。
アップロード(Upload): コードをボードにアップロードします。このボタンをクリックすると、ボード上のRXとTXのLEDが高速で点滅し、アップロードが完了するまで止まりません。
デバッグ(Debug): 一行ごとのエラーチェックのために。
ボードの選択(Select Board): ボードとポートのクイック設定。
シリアルプロッター(Serial Plotter): 読取値の変化をチェックします。
シリアルモニター(Serial Monitor): ボタンをクリックするとウィンドウが開きます。コントロールボードから送信されたデータを受信します。デバッグにとても便利です。
ファイル(File): メニューをクリックすると、ファイルの新規作成、開く、保存、閉じる、パラメータの設定などを含むドロップダウンリストが表示されます。
編集(Edit): メニューをクリックします。ドロップダウンリストには、 切り取り(Cut)、 コピー(Copy)、 貼り付け(Paste)、 検索(Find) などの編集操作とそれに対応するショートカットがあります。
スケッチ(Sketch): 検証(Verify)、 アップロード(Upload)、ファイルの 追加(Add) などの操作を含みます。より重要な機能は ライブラリをインクルード(Include Library) で、ここでライブラリを追加できます。
ツール(Tool): いくつかのツールを含み、最も頻繁に使用されるのはボード(使用するボード)とポート(ボードが接続されるポート)です。コードをアップロードするたびに、これらを選択または確認する必要があります。
ヘルプ(Help): 初心者の場合は、メニューの下にあるオプションを確認し、IDEの操作、紹介情報、トラブルシューティング、コード説明など、必要なヘルプを得ることができます。
出力バー(Output Bar): ここで出力タブを切り替えます。
出力ウィンドウ(Output Window): 情報を印刷します。
ボードとポート(Board and Port): ここでコードアップロードに選択されたボードとポートをプレビューできます。間違っている場合は、 ツール(Tools) -> ボード(Board) / ポート(Port) で再選択できます。
IDEの編集エリア。ここでコードを記述できます。
スケッチブック(Sketchbook): スケッチファイルを管理するために。
ボードマネージャ(Board Manager): ボードドライバーを管理するために。
ライブラリマネージャ(Library Manager): ライブラリファイルを管理するために。
デバッグ(Debug): コードのデバッグを助けます。
検索(Search): スケッチからコードを検索します。
1.3 ESP32ボードのインストール(重要)¶
ESP32マイクロコントローラをプログラムするためには、Arduino IDEにESP32ボードパッケージをインストールする必要があります。以下のステップバイステップガイドに従ってください:
ESP32ボードのインストール
Arduino IDEを開きます。 File を選択し、ドロップダウンメニューから Preferences を選びます。
環境設定ウィンドウで、 Additional Board Manager URLs フィールドを探します。クリックしてテキストボックスをアクティブにします。
次のURLを Additional Board Manager URLs フィールドに追加します: https://espressif.github.io/arduino-esp32/package_esp32_index.json。このURLはESP32ボードのパッケージインデックスファイルを指します。 OK ボタンをクリックして変更を保存します。
Boards Manager ウィンドウで、検索バーに ESP32 と入力します。 Install ボタンをクリックしてインストールプロセスを開始します。これにより、ESP32ボードパッケージがダウンロードおよびインストールされます。
おめでとうございます!Arduino IDEにESP32ボードパッケージを正常にインストールしました。
コードをアップロードする
まず、Micro USBケーブルを使用して、ESP32 WROOM 32Eをコンピューターに接続します。
次に、ツール -> ボード -> esp32 をクリックして、正しいボード、ESP32 Dev Moduleを選択します。
ESP32がコンピュータに接続されている場合は、 Tools -> Port に進んで正しいポートを選択できます。
さらに、Arduino 2.0では、ボードとポートを迅速に選択する新しい方法が導入されました。ESP32の場合、通常は自動的に認識されないため、 Select other board and port をクリックする必要があります。
検索ボックスに ESP32 Dev Module と入力し、表示されたら選択します。次に、正しいポートを選択し OK をクリックします。
その後、このクイックアクセスウィンドウを通じて選択できます。ただし、後続の使用時には、ESP32がクイックアクセスウィンドウで利用できない場合があり、上記の2ステップを繰り返す必要があることに注意してください。
これらの方法のどちらも、正しいボードとポートを選択するために利用できますので、最も適した方法を選んでください。これで、ESP32にコードをアップロードする準備が整いました。
1.4 ライブラリのインストール(重要)¶
ライブラリとは、Arduino IDEの機能を拡張するための事前に書かれたコードや関数の集まりです。ライブラリを利用することで、様々な機能の用意されたコードを使用でき、複雑な機能のコーディングにかかる時間や労力を節約できます。
ライブラリをインストールする主な方法は2つあります:
ライブラリマネージャーからのインストール¶
多くのライブラリはArduinoライブラリマネージャーを通じて直接利用可能です。ライブラリマネージャーにアクセスするには、次の手順に従ってください:
Library Manager で、希望のライブラリを名前で検索するか、異なるカテゴリーを閲覧します。
注釈
ライブラリのインストールが必要なプロジェクトでは、どのライブラリをインストールするかを示すプロンプトが表示されます。"ここではDHTセンサーライブラリが使用されていますので、ライブラリマネージャーからインストールしてください"といった指示に従ってください。プロンプトに従って推奨されるライブラリをインストールしてください。
インストールしたいライブラリを見つけたら、それをクリックし、次に Install ボタンをクリックします。
Arduino IDEは自動的にライブラリをダウンロードしてインストールします。
手動でのインストール¶
Library Manager を通じて利用できないライブラリもあり、それらは手動でインストールする必要があります。これらのライブラリをインストールするには、次の手順に従ってください:
Arduino IDEを開き、 Sketch -> Include Library -> Add .ZIP Library に進みます。
ライブラリファイルが置かれているディレクトリ(例えば
esp32-starter-kit\c\libraries
フォルダ)に移動し、希望のライブラリファイル(例えばESP32-A2DP.zip
)を選択してから、 Open をクリックします。しばらくすると、インストールが成功したことを示す通知が表示されます。
ESP8266Audio.zip
ライブラリを追加するには、同じプロセスを繰り返します。
注釈
上記のいずれかの方法でインストールしたライブラリは、Arduino IDEのデフォルトのライブラリディレクトリにあります。通常は C:\Users\xxx\Documents\Arduino\libraries
に位置しています。
ライブラリディレクトリが異なる場合は、 File -> Preferences に進むことで確認できます。
2. ディスプレイ
2.1 LEDを点灯させよう¶
プログラム学習の最初の一歩として"Hello, world!"を出力するように、LEDをプログラムで制御することは物理プログラミングを学ぶための伝統的な入門です。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入することは非常に便利です。以下のリンクから購入できます:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトで使用可能なESP32ボード上のピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

この回路は簡単な原理で動作し、図に示されているように電流の方向があります。ピン26が高レベルを出力すると220オームの電流制限抵抗を通過してLEDが点灯します。ピン26が低レベルを出力するとLEDが消えます。
配線図

コードをアップロードする
ファイル 2.1_hello_led.ino をパス esp32-starter-kit-mainccodes2.1_hello_led から開くか、このコードをArduino IDEに直接コピーします。
次に、Micro USBケーブルを使用して、ESP32 WROOM 32Eをコンピューターに接続します。
ボード(ESP32 Dev Module)と適切なポートを選択します。
今、アップロードボタンをクリックして、コードをESP32ボードにアップロードします。
コードが正常にアップロードされると、LEDが点滅するのが見えます。
どのように動作するのか?
ledPin
という名前の整数定数を宣言し、それに26という値を割り当てます。const int ledPin = 26; // The GPIO pin for the LED
次に、
setup()
関数でピンを初期化します。ここで、ピンをOUTPUT
モードに初期化する必要があります。void setup() { pinMode(ledPin, OUTPUT); }
void pinMode(uint8_t pin, uint8_t mode);
: この関数は、特定のピンのGPIO動作モードを定義するために使用されます。pin
はGPIOピン番号を定義します。mode
は動作モードを設定します。
基本入出力のために、以下のモードがサポートされています:
INPUT
はプルアップもプルダウンもない入力(高インピーダンス)としてGPIOを設定します。OUTPUT
は出力/読み取りモードとしてGPIOを設定します。INPUT_PULLDOWN
は内部プルダウン付きでGPIOを入力として設定します。INPUT_PULLUP
は内部プルアップ付きでGPIOを入力として設定します。
loop()
関数にはプログラムの主なロジックが含まれ、変更間の一秒の間隔を置いて、ピンを高低に交互に設定します。void loop() { digitalWrite(ledPin, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); // wait for a second digitalWrite(ledPin, LOW); // turn the LED off by making the voltage LOW delay(1000); // wait for a second }
void digitalWrite(uint8_t pin, uint8_t val);
: この関数は、選択したGPIOの状態をHIGH
またはLOW
に設定します。この関数は、pinMode
がOUTPUT
として設定されている場合のみ使用されます。pin
はGPIOピン番号を定義します。val
は出力デジタル状態をHIGH
またはLOW
に設定します。
2.2 フェーディング¶
前回のプロジェクトでは、デジタル出力を使用してLEDをオン/オフすることで制御しました。今回のプロジェクトでは、パルス幅変調(PWM)を活用してLEDに呼吸効果を作り出します。PWMは、正方形波信号のデューティ比を変えることで、LEDの明るさやモーターの速度を制御する技術です。
PWMでは、LEDを単純にオン/オフする代わりに、各サイクル内でLEDがオンになる時間とオフになる時間の割合を調整します。LEDを迅速にオン/オフする間隔を変えながら切り替えることで、LEDが徐々に明るくなったり暗くなったりする錯覚を生み出し、呼吸効果を模倣します。
ESP32 WROOM 32EのPWM機能を使用することで、LEDの明るさをスムーズかつ正確に制御できます。この呼吸効果は、プロジェクトにダイナミックで視覚的に魅力的な要素を加え、目を引くディスプレイや雰囲気を作り出します。
必要な部品
このプロジェクトには、以下の部品が必要です。
一式を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上で利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

このプロジェクトは最初のプロジェクト 2.1 LEDを点灯させよう と同じ回路ですが、シグナルタイプが異なります。最初のプロジェクトはピン26からデジタルの高/低レベル(0&1)を直接出力してLEDを点灯/消灯させるもので、このプロジェクトはピン26からPWM信号を出力してLEDの明るさを制御します。
配線図

コード
注釈
ファイル
2.2_fading_led.ino
をパスesp32-starter-kit-main\c\codes\2.2_fading_led
以下から開けます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 Upload ボタンをクリックします。
コードのアップロードに成功すると、LEDが呼吸するのを見ることができます。
どのように動作するのか?
定数と変数を定義します。
const int ledPin = 26; // The GPIO pin for the LED int brightness = 0; int fadeAmount = 5;
ledPin
: LEDが接続されているGPIOピン番号(ここではGPIO 26)。brightness
: LEDの現在の明るさレベル(初期設定は0)。fadeAmount
: 各ステップでLEDの明るさが変わる量(5に設定)。
PWMチャンネルを初期化し、LEDピンを設定します。
void setup() { ledcSetup(0, 5000, 8); // Configure the PWM channel (0) with 5000Hz frequency and 8-bit resolution ledcAttachPin(ledPin, 0); // Attach the LED pin to the PWM channel }
ここでは LEDC (LED制御)周辺機器を使用します。これは主にLEDの明るさを制御するために設計されていますが、他の目的でPWM信号を生成するためにも使用できます。
uint32_t ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);
: この関数はLEDCチャンネルの周波数と解像度を設定するために使用されます。LEDCチャンネルに対して設定された``frequency``を返します。0が返された場合はエラーが発生し、LEDCチャンネルが設定されませんでした。channel
設定するLEDCチャンネルを選択します。freq
PWMの周波数を選択します。resolution_bits
LEDCチャンネルの解像度を選択します。範囲は1-14ビットです(ESP32の場合は1-20ビット)。
void ledcAttachPin(uint8_t pin, uint8_t chan);
: この関数はピンをLEDCチャンネルにアタッチするために使用されます。pin
GPIOピンを選択します。chan
LEDCチャンネルを選択します。
loop()
関数にはプログラムの主要なロジックが含まれており、連続して実行されます。LEDの明るさを更新し、明るさが最小値または最大値に到達した際にfadeAmountを反転させ、遅延を導入します。void loop() { ledcWrite(0, brightness); // Write the new brightness value to the PWM channel brightness = brightness + fadeAmount; if (brightness <= 0 || brightness >= 255) { fadeAmount = -fadeAmount; } delay(50); // Wait for 20 milliseconds }
void ledcWrite(uint8_t chan, uint32_t duty);
: この関数はLEDCチャンネルのデューティを設定するために使用されます。chan
デューティを設定するLEDCチャンネルを選択します。duty
選択されたチャンネルに設定するデューティを選択します。
2.3 カラフルライト¶
このプロジェクトでは、RGB LEDを使用した加法色混合の魅力的な世界について探求します。
RGB LEDは、赤、緑、青の三原色を一つのパッケージに組み合わせています。これら三つのLEDは共通のカソードピンを共有し、各アノードピンが対応する色の強度を制御します。
各アノードに加える電気信号の強度を変えることで、幅広い色を作り出すことができます。たとえば、高強度の赤と緑の光を混ぜると黄色の光が、青と緑の光を混ぜるとシアンが生成されます。
このプロジェクトを通じて、加法色混合の原理を学び、RGB LEDを操作して魅力的で活発な色を表示させることで、私たちの創造力を解き放ちます。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネント紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらは、このプロジェクトのためにESP32ボード上で利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

PWMピンのpin27、pin26、pin25はそれぞれRGB LEDの赤、緑、青のピンを制御し、共通カソードピンをGNDに接続します。これにより、異なるPWM値をこれらのピンに重ねて特定の色をRGB LEDに表示させることができます。
配線図

RGB LEDには4つのピンがあります:長いピンが共通のカソードピンで、通常はGNDに接続されています。最も長いピンの隣の左側のピンが赤で、右側の二つのピンが緑と青です。

コード
ここでは、お好きな色を描画ソフト(たとえばペイント)で選び、RGB LEDで表示させます。
注釈
esp32-starter-kit-main\c\codes\2.3_rgb_led
のパスの下にあるファイル2.3_rgb_led.ino
を開けます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。

color_set()
にRGB値を書き込むと、ご希望の色をRGB LEDで点灯させることができます。
どのように動作するのか?
GPIOピン、PWMチャネル、周波数(Hz)、解像度(ビット)を定義します。
// Define RGB LED pins const int redPin = 27; const int greenPin = 26; const int bluePin = 25; // Define PWM channels const int redChannel = 0; const int greenChannel = 1; const int blueChannel = 2; // Define PWM frequency and resolution const int freq = 5000; const int resolution = 8;
setup()
関数では、指定された周波数と解像度でPWMチャネルを初期化し、その後、LEDピンを対応するPWMチャネルにアタッチします。void setup() { // Set up PWM channels ledcSetup(redChannel, freq, resolution); ledcSetup(greenChannel, freq, resolution); ledcSetup(blueChannel, freq, resolution); // Attach pins to corresponding PWM channels ledcAttachPin(redPin, redChannel); ledcAttachPin(greenPin, greenChannel); ledcAttachPin(bluePin, blueChannel); }
ここでは LEDC (LED制御)ペリフェラルを使用しており、主にLEDの輝度を制御するために設計されていますが、他の目的でPWM信号を生成するためにも使用できます。
uint32_t ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);
: この関数はLEDCチャネルの周波数と解像度を設定するために使用されます。LEDCチャネルに設定されたfrequency
を返します。0が返された場合はエラーが発生し、LEDCチャネルは設定されませんでした。channel
LEDCチャネルの選択。freq
PWMの周波数の選択。resolution_bits
LEDCチャネルの解像度の選択。範囲は1-14ビット(ESP32の場合は1-20ビット)です。
void ledcAttachPin(uint8_t pin, uint8_t chan);
: この関数はピンをLEDCチャネルにアタッチするために使用されます。pin
GPIOピンの選択。chan
LEDCチャネルの選択。
loop()
関数は、各色(赤、緑、青、黄色、紫、シアン)を順に切り替え、各色の変更間に1秒のインターバルを設けています。void loop() { setColor(255, 0, 0); // Red delay(1000); setColor(0, 255, 0); // Green delay(1000); setColor(0, 0, 255); // Blue delay(1000); setColor(255, 255, 0); // Yellow delay(1000); setColor(80, 0, 80); // Purple delay(1000); setColor(0, 255, 255); // Cyan delay(1000); }
setColor()
関数は、それぞれのPWMチャネルに適切なデューティサイクル値を書き込むことにより、希望の色を設定します。この関数は赤、緑、青の色の値を整数で3つ受け取ります。void setColor(int red, int green, int blue) { // For common-anode RGB LEDs, use 255 minus the color value ledcWrite(redChannel, red); ledcWrite(greenChannel, green); ledcWrite(blueChannel, blue); }
void ledcWrite(uint8_t chan, uint32_t duty);
: この関数はLEDCチャネルのデューティを設定するために使用されます。chan
デューティを書き込むLEDCチャネルの選択。duty
選択されたチャネルに設定するデューティ。
2.4 マイクロチップ - 74HC595¶
このエキサイティングなプロジェクトへようこそ!このプロジェクトでは、74HC595チップを使用して8つのLEDの流れるような表示を制御します。
このプロジェクトを起動すると、8つのLED間で飛び交うかのような魅惑的な光の流れが目の前に広がります。一つ一つのLEDが順に点灯し、すぐに消えていく間に、次のLEDが輝き続け、美しくダイナミックな効果を生み出します。
74HC595チップを巧みに利用することで、複数のLEDのオン/オフ状態を制御し、流れるような効果を実現できます。このチップには複数の出力ピンがあり、LEDの点灯順序を制御するために直列に接続できます。さらに、チップの拡張性により、流れる表示にさらに多くのLEDを簡単に追加し、より壮観な効果を作り出すことができます。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
一式を購入するのが便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
もちろん、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトでESP32ボードに利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

MR(ピン10)がハイレベルで、CE(ピン13)がローレベルのとき、SHcpの立ち上がりエッジでデータが入力され、SHcpの立ち上がりエッジを通してメモリレジスタに移動します。
2つのクロックを接続すると、シフトレジスタはメモリレジスタよりも常に1パルス早くなります。
メモリレジスタには、シリアルシフト入力ピン(DS)、シリアル出力ピン(Q7')、非同期リセットボタン(ローレベル)があります。
メモリレジスタは、3状態の並列8ビットバスを出力します。
OEが有効(ローレベル)のとき、メモリレジスタのデータがバス(Q0 ~ Q7)に出力されます。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\2.4_74hc595
のパスの下にある2.4_74hc595.ino
ファイルを開きます。ボード(ESP32 Dev Module)を選択し、適切なポートを選んだ後、 アップロード ボタンをクリックします。
コードをESP32ボードにアップロードすると、LEDが次々と点灯するのを見ることができます。
どのように動作するのか?
74HC595で制御される8つのLEDの作業状態を変更するために使用されるいくつかの8ビットバイナリ数値を格納するために配列を宣言します。
int datArray[] = {B00000000, B00000001, B00000011, B00000111, B00001111, B00011111, B00111111, B01111111, B11111111};
loop()
関数。void loop() { for(int num = 0; num <10; num++) { digitalWrite(STcp,LOW); //Set ST_CP and hold low for as long as you are transmitting shiftOut(DS,SHcp,MSBFIRST,datArray[num]); digitalWrite(STcp,HIGH); //pull the ST_CPST_CP to save the data delay(1000); } }
datArray[]
を反復し、バイナリ値をシフトレジスタに順次送信します。digitalWrite(STcp, LOW)
とdigitalWrite(STcp, HIGH)
の命令でデータがストレージレジスタにラッチされます。shiftOut()
関数は、データピン(DS)とシフトレジスタクロックピン(SHcp)を使用して、datArray[]
からバイナリ値をシフトレジスタに送信します。MSBFIRST
は高ビットから移動することを意味します。LEDパターンの更新間に1秒の一時停止を作ります。
2.5 7セグメントディスプレイ¶
この魅力的なプロジェクトへようこそ!このプロジェクトでは、7セグメントディスプレイに0から9までの数字を表示する方法を探求します。
このプロジェクトを始動させると、0から9までの各数字が小さくコンパクトなディスプレイに鮮やかに光る様子を目にすることでしょう。まるで魅力的な方法で数字を紹介するミニチュアスクリーンを持っているかのようです。信号ピンを制御することで、表示される数字を簡単に変更し、さまざまな引き込まれるような効果を作り出すことができます。
シンプルな回路接続とプログラミングを通じて、7セグメントディスプレイとのやり取りの方法を学び、希望する数字を実際に表示させる方法を習得します。カウンターであれ、時計であれ、または他の面白い応用であれ、7セグメントディスプレイはあなたのプロジェクトに輝きを添える信頼できる仲間となるでしょう。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
一式を購入するのが便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
もちろん、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトでESP32ボードに利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

ここでは、配線の原理は基本的に 2.4 マイクロチップ - 74HC595 と同じですが、唯一の違いは Q0-Q7 が7セグメントディスプレイの a 〜 g ピンに接続されている点です。
74HC595 |
LED Segment Display |
---|---|
Q0 |
a |
Q1 |
b |
Q2 |
c |
Q3 |
d |
Q4 |
e |
Q5 |
f |
Q6 |
g |
Q7 |
dp |
配線図

コード
注釈
esp32-starter-kit-main\c\codes\2.5_7segment
のパスの下にある2.5_7segment.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
コードが正常にアップロードされると、LEDセグメントディスプレイが0~9までの数字を順番に表示するのが見られるでしょう。
どのように機能するのか?
このプロジェクトでは、shiftOut()
関数を使用して、バイナリ数をシフトレジスタに書き込んでいます。
7セグメントディスプレイが "2" という数字を表示するとします。このビットパターンは、セグメント f、 c、 dp がオフ(低)で、セグメント a、 b、 d、 e、 g がオン(高)であることに対応しています。これはバイナリで "01011011"、16進数表記で "0x5b" です。
したがって、7セグメントディスプレイに "2" と表示するためには shiftOut(DS,SHcp,MSBFIRST,0x5b)
を呼び出す必要があります。

以下の表は、7セグメントディスプレイに0から9までの数字を表示するためにシフトレジスタに書き込む必要がある16進数のパターンを示しています。
Numbers |
Binary Code |
Hex Code |
---|---|---|
0 |
00111111 |
0x3f |
1 |
00000110 |
0x06 |
2 |
01011011 |
0x5b |
3 |
01001111 |
0x4f |
4 |
01100110 |
0x66 |
5 |
01101101 |
0x6d |
6 |
01111101 |
0x7d |
7 |
00000111 |
0x07 |
8 |
01111111 |
0x7f |
9 |
01101111 |
0x6f |
これらのコードを shiftOut()
に書き込むと、LED セグメント ディスプレイに対応する数字が表示されます。
2.6 文字の表示¶
ここでは、I2C LCD1602モジュールを使用した文字表示の魅力的な世界について探求します。
このプロジェクトを通じて、LCDモジュールの初期化、希望の表示パラメータの設定、画面に表示する文字データの送信方法を学びます。カスタムメッセージのショーケース、センサーの読み取りの表示、インタラクティブなメニューの作成などが可能です。可能性は無限大です!
I2C LCD1602で文字表示の技術を習得することにより、プロジェクトでの通信と情報表示の新たな道が開けます。このワクワクする旅に飛び込んで、LCDスクリーンにキャラクターを生き生きと表示しましょう。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
一式を購入するのが便利ですが、こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらは、このプロジェクトにおけるESP32ボードの利用可能なピンのリストです。
利用可能なピン |
使用説明 |
---|---|
IO21 |
SDA |
IO22 |
SCL |
回路図

配線図

コード
注釈
esp32-starter-kit-main\c\codes\2.6_lcd1602
のパスの下にある2.6_lcd1602.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
LiquidCrystal I2C
ライブラリを使用しています。 Library Manager からインストールできます。
このプログラムをアップロードすると、I2C LCD1602は「Hello, Sunfounder!」という歓迎メッセージを3秒間表示します。その後、画面には「COUNT:」というラベルと、1秒ごとにインクリメントされるカウント値が表示されます。
注釈
コードと配疚が正しくてもLCDに何も表示されない場合は、背面のポテンショメータを調整してコントラストを上げてください。
どのように動作するのか?
LiquidCrystal_I2C.h
ライブラリを呼び出すことで、LCDを簡単に操作できます。
#include <LiquidCrystal_I2C.h>
ライブラリ関数:
Arduinoボードに接続された特定のLCDを表す
LiquidCrystal_I2C
クラスの新しいインスタンスを作成します。LiquidCrystal_I2C(uint8_t lcd_Addr,uint8_t lcd_cols,uint8_t lcd_rows)
lcd_AddR
: The address of the LCD defaults to 0x27.lcd_cols
: The LCD1602 has 16 columns.lcd_rows
: The LCD1602 has 2 rows.
LCDを初期化します。
void init()
(オプションの)バックライトを点灯します。
void backlight()
(オプションの)バックライトを消灯します。
void nobacklight()
LCDディスプレイを点灯します。
void display()
LCDディスプレイをすばやく消灯します。
void nodisplay()
ディスプレイをクリアし、カーソル位置をゼロに設定します。
void clear()
カーソル位置をcol,rowに設定します。
void setCursor(uint8_t col,uint8_t row)
テキストをLCDに表示します。
void print(data,BASE)
data
: 表示するデータ(char, byte, int, long, string)。BASE (オプション)
: 数字を表示する基数。BIN
はバイナリ(基数2)DEC
は10進数(基数10)OCT
は8進数(基数8)HEX
は16進数(基数16)。
2.7 RGB LEDストリップ¶
このプロジェクトでは、WS2812 LEDストリップの駆動と、鮮やかな色彩の展示を目指します。ストリップ上の各LEDを個別に制御する能力により、視覚を魅了するライティングエフェクトを作り出すことができます。
さらに、このプロジェクトにはランダム性の世界を探求するというワクワクする拡張機能を含んでいます。ランダムな色を導入し、流れるような光のエフェクトを実装することで、見る者を魅了する幻想的なビジュアル体験を創出します。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
一式を購入するのが便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

利用可能なピン
こちらはこのプロジェクトのためのESP32ボード上で利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
注釈
IO33はこのプロジェクトでは使用できません。
WS2812 LEDストリップは、正確なパルス幅変調(PWM)信号を要求するタイプのLEDストリップです。PWM信号は時間と電圧の両方で厳密な要求があります。例えば、WS2812の「0」ビットは約0.4マイクロ秒のハイレベルパルスに対応し、「1」ビットは約0.8マイクロ秒のハイレベルパルスに対応します。これは、ストリップが高周波の電圧変化を受け取る必要があることを意味します。
しかし、IO33に4.7Kのプルアップ抵抗と100nfのプルダウンコンデンサーをつけると、簡単なローパスフィルターが作成されます。このタイプの回路は、コンデンサーが電圧変化を受けたときに充電と放電をする時間が必要なため、高周波信号を「平滑化」します。そのため、信号があまりにも速く変化する(つまり、高周波である)場合、コンデンサーは追い付けず、結果として出力信号がぼやけて、ストリップに認識不可能になります。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\2.7_rgb_strip
のパスの下にあるファイル2.7_rgb_strip.ino
を開くか、このコードを Arduino IDE にコピーしてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
Adafruit NeoPixel
ライブラリが使用されています。これは Library Manager からインストールできます。
コードが正常にアップロードされると、ストリップのLEDが順に黄色で点灯し、次に消灯し、単純なチェイス効果を作り出します。
どのように動作するのか?
Adafruit NeoPixelライブラリを含める:この行はAdafruit NeoPixelライブラリをインポートし、LEDストリップを制御するためにその関数やクラスをスケッチで使用できるようにします。
#include <Adafruit_NeoPixel.h> // Include the Adafruit NeoPixel library
LEDストリップのための定数を定義します。
#define LED_PIN 13 // NeoPixel LED strip #define NUM_LEDS 8 // Number of LEDs
Adafruit_NeoPixelクラスのインスタンスを作成します。
// Create an instance of the Adafruit_NeoPixel class Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
この行は
Adafruit_NeoPixel
クラスのstrip
というインスタンスを作成し、LEDの数、LEDストリップに接続されたピン、および信号パラメータ(GRBカラーオーダーと800 kHzのデータレート)で設定します。Adafruit_NeoPixel (uint16_t n, int16_t p = 6, neoPixelType t = NEO_GRB + NEO_KHZ800)
長さ、ピン、ピクセルタイプがコンパイル時に既知の場合のNeoPixelコンストラクタ。Adafruit_NeoPixelオブジェクトを返します。使用前に
begin()
関数を呼び出してください。n
: ストランド内のNeoPixelの数。p
: NeoPixelデータを駆動するArduinoピン番号。t
: ピクセルタイプ -Adafruit_NeoPixel.h
で定義されたNEO_*
定数を加算します。例えばNEO_GRB+NEO_KHZ800
は、800 KHz(対400 KHz)データストリームを期待するNeoPixelと、ピクセルごとに緑、赤、青の順番で表現されるカラーバイトのためです。
WS2812 RGBストリップを初期化し、ストリップの初期色を黒(オフ)に設定します。
void setup() { strip.begin(); // Initialize the NeoPixel strip strip.show(); // Set initial color to black }
void begin (void)
: NeoPixelピンを出力用に設定します。void show (void)
: RAM内のピクセルデータをNeoPixelsに送信します。
loop()
関数では、LEDストリップ上のLEDが順に黄色で点灯し、その後消灯します。これによりシンプルな追跡効果が作成されます。void loop() { // Turn on LEDs one by one for (int i = 0; i < NUM_LEDS; i++) { strip.setPixelColor(i, 100, 45, 0); // Set the color of the i-th LED to red strip.show(); // Update the LED strip with the new colors delay(100); // Wait for 100 milliseconds } // Turn off LEDs one by one for (int i = 0; i < NUM_LEDS; i++) { strip.setPixelColor(i, 0, 0, 0); // Set the color of the i-th LED to black (turn it off) strip.show(); // Update the LED strip with the new colors delay(100); // Wait for 100 milliseconds } }
void setPixelColor (uint16_t n, uint8_t r, uint8_t g, uint8_t b)
赤、緑、青のそれぞれの成分を使用してピクセルの色を設定します。RGBWピクセルを使用する場合、白は0に設定されます。
n
: ピクセルのインデックスで、0から始まります。r
: 赤の明るさで、0は最小(オフ)、255は最大です。g
: 緑の明るさで、0は最小(オフ)、255は最大です。b
: 青の明るさで、0は最小(オフ)、255は最大です。
3. サウンド
3.1 ビープ音¶
このシンプルなプロジェクトでは、アクティブブザーを使って毎秒4回速くビープ音を鳴らします。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
一式を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
利用可能なピン
ここでは、このプロジェクトでESP32ボードに利用可能なピンのリストを示します。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

IO14の出力がハイのとき、1Kの電流制限抵抗を通って、S8050(NPNトランジスタ)が導通し、ブザーが鳴ります。
S8050(NPNトランジスタ)の役割は電流を増幅して、ブザーの音を大きくすることです。実際には、ブザーを直接IO14に接続することもできますが、ブザーの音が小さいことに気づくでしょう。
配線図
キットには2種類のブザーが含まれています。 アクティブブザーを使用する必要があります。それらをひっくり返すと、密封された背面(露出したPCBではない)が私たちが必要とするものです。

ブザーの動作にはトランジスタが必要で、ここではS8050(NPNトランジスタ)を使用します。

コード
注釈
ファイル
3.1_beep.ino
をパスesp32-starter-kit-main\c\codes\3.1_beep
から開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
コードが正常にアップロードされた後、毎秒ビープ音が聞こえます。
3.2 カスタムトーン¶
前回のプロジェクトではアクティブブザーを使用しましたが、今回はパッシブブザーを使います。
アクティブブザーと同様に、パッシブブザーも電磁誘導の現象を利用して動作します。違いは、パッシブブザーには発振源がないため、直流信号を使ってもビープ音は鳴りません。 しかし、これによりパッシブブザーは自分の発振周波数を調整でき、「ド、レ、ミ、ファ、ソ、ラ、シ」といった異なる音符を出すことができます。
パッシブブザーにメロディを鳴らしてみましょう!
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
利用可能なピン
このプロジェクトのESP32ボードで利用可能なピンのリストはこちらです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

IO14の出力がハイの場合、1Kの電流制限抵抗を経てS8050(NPNトランジスタ)が導通し、ブザーが鳴ります。
S8050(NPNトランジスタ)の役割は電流を増幅し、ブザーの音を大きくすることです。実際には、ブザーを直接IO14に接続することもできますが、ブザーの音が小さいことがわかるでしょう。
配線図
キットには2種類のブザーが含まれています。私たちはパッシブブザーを使用する必要があります。それらを回して、露出したPCBが私たちが必要とするものです。

ブザーの動作にはトランジスタが必要で、ここではS8050(NPNトランジスタ)を使用します。

コード
注釈
esp32-starter-kit-main\c\codes\3.2_custom_tone
のパスの下にある3.2_custom_tone.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
コードが正常にアップロードされると、パッシブブザーが7つの音符のシーケンスを演奏するのが聞こえます。
どのように動作するのか?
ブザーピンとPWM解像度のための定数を定義します。
const int buzzerPin = 14; //buzzer pin const int resolution = 8;
7つの音階の周波数をHzで含む配列を定義します。
int frequencies[] = {262, 294, 330, 349, 392, 440, 494};
指定した周波数を指定した期間、ブザーで鳴らすための関数を作成します。
void playFrequency(int frequency, int duration) { ledcWriteTone(0, frequency); // Start the tone delay(duration); // Wait for the specified duration ledcWriteTone(0, 0); // Stop the buzzer }
uint32_t ledcWriteTone(uint8_t chan, uint32_t freq);
: この関数は、選択された周波数で50% PWM音をLEDCチャネルに設定するために使用されます。chan
LEDCチャネルの選択。freq
PWM信号の周波数の選択。
この関数はチャネルの設定
frequency
を返します。0
が返された場合、エラーが発生しLEDCチャネルが設定されませんでした。setup()
関数内でPWMチャネルを設定し、ブザーピンをアタッチします。void setup() { ledcSetup(0, 2000, resolution); // Set up the PWM channel ledcAttachPin(buzzerPin, 0); // Attach the buzzer pin to the PWM channel }
uint32_t ledcSetup(uint8_t channel, uint32_t freq, uint8_t resolution_bits);
: この関数はLEDCチャネルの周波数と解像度を設定するために使用されます。LEDCチャネルに設定された周波数を返します。0が返された場合、エラーが発生しLEDCチャネルが設定されませんでした。channel
設定するLEDCチャネルの選択。freq
PWMの周波数の選択。resolution_bits
LEDCチャネルの解像度を選択。範囲は1-14ビット(ESP32の場合は1-20ビット)。
void ledcAttachPin(uint8_t pin, uint8_t chan);
: この関数はピンをLEDCチャネルにアタッチするために使用されます。pin
GPIOピンの選択。chan
LEDCチャネルの選択。
loop()
関数内で、各音符の間に短い休止を置き、シーケンスを繰り返す前に1秒間の休止を置いて、7つの音階を順に鳴らします。void loop() { for (int i = 0; i < 7; i++) { playFrequency(frequencies[i], 300); // Play each note for 300ms delay(50); // Add a brief pause between the notes } delay(1000); // Wait for 1 second before replaying the sequence }
4. アクチュエーター
4.1 モーター¶
このプロジェクトでは、L293Dを使ってモーターを駆動する方法について探求します。
L293Dは、電子工作やロボットプロジェクトのモーター制御によく使用される汎用性の高い集積回路(IC)です。前進・後進の両方向に2つのモーターを駆動することができ、精密なモーター制御を要するアプリケーションで好まれて使用されます。
この魅力的なプロジェクトを終えるころには、デジタル信号とPWM信号を使ってモーターを効果的に制御する方法について、徹底的な理解を得ることができるでしょう。この貴重な知識は、ロボティクスやメカトロニクスの分野での将来の取り組みにおいて、確かな基盤となるはずです。準備を整えて、L293Dを使ったモーター制御のエキサイティングな世界に飛び込む準備をしましょう!
必要な部品
このプロジェクトには、以下の部品が必要です。
一式を購入するのが便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
利用可能なピン
このプロジェクトでESP32ボードで利用可能なピンのリストです。
利用可能なピン |
IO13, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

配線図
注釈
モーターは比較的高い電流が必要なので、最初にバッテリーを差し込み、拡張ボード上のスイッチをON位置にスライドしてバッテリー供給を有効にする必要があります。

コード
注釈
esp32-starter-kit-main\c\codes\4.1_motor
のパス下にある4.1_motor.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
コードが正常にアップロードされると、モーターが1秒間時計回りに回転し、次に1秒間反時計回りに回転し、その後2秒間停止するという動作を無限ループで続けることが観察できます。
さらに学ぶ
モーターを単に時計回りや反時計回りに回転させるだけでなく、以下に示すように、制御ピンにパルス幅変調(PWM)を使用してモーターの回転速度を制御することもできます。
注釈
esp32-starter-kit-main\c\codes\4.1_motor_pwm
のパス下にある4.1_motor_pwm.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
前述のコードでは、モーターの2つのピンを高電圧または低電圧に直接設定して、モーターの回転と停止を制御しています。
ここでは、 LEDC (LEDコントロール)周辺機器を使用してPWM信号を生成し、モーターの速度を制御します。2つの for
ループを通じて、チャンネルAのデューティサイクルを0から255まで増やしたり、チャンネルBを0に保ったまま減らしたりします。
この方法では、モーターの速度が徐々に255まで増加し、その後0まで減少し、このように無限ループするのが観察できます。
モーターを逆方向に回転させたい場合は、単純にチャンネルAとチャンネルBの値を交換してください。
4.2 水ポンプ制御¶
この興味深いプロジェクトでは、L293Dを用いて水ポンプを制御する方法について探ります。
水ポンプ制御の領域では、他のモーター制御に比べて少しシンプルです。このプロジェクトの美点はその単純さにあります - 回転方向について心配する必要がありません。私たちの主目的は水ポンプを成功裏に活動させ、稼働させ続けることです。
必要な部品
このプロジェクトには、以下の部品が必要です。
一式を購入することは確かに便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入も可能です。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
- |
利用可能なピン
このプロジェクトでESP32ボードで利用可能なピンのリストです。
利用可能なピン |
IO13, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

配線図
注釈
ここではバッテリーを差し込み、その後拡張ボード上のスイッチをON位置にスライドして、バッテリー供給を有効にすることを推奨します。

コード
注釈
esp32-starter-kit-main\c\codes\4.2_pump
のパス下にある4.2_pump.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
チュービングをポンプに接続し、水が満たされた容器内に置きます。コードが正常にアップロードされた後、容器内の水が徐々に排出される様子が観察できます。この実験中、電気回路が水に触れて短絡を引き起こさないように、水から離しておくことを確認してください!
4.3 サーボモータのスイング¶
サーボモータは特定の角度を維持し、正確な回転を実現する位置制御デバイスとして知られています。これは、一貫した角度調整を要求する制御システムにとって非常に望ましい特性です。そのため、サーボは高品質な遠隔操作玩具、飛行機モデルから潜水艦のレプリカ、高度な遠隔操作ロボットに至るまで、幅広く使用されています。
この魅力的なプロジェクトでは、サーボモータを独自の方法で操作する挑戦をします - スイングさせるのです!このプロジェクトはサーボモータの動きをより深く理解し、精密な制御システムのスキルを磨く絶好の機会を提供します。
サーボモータをあなたのリズムに合わせて踊らせる準備はできましたか?さあ、このエキサイティングな冒険に出発しましょう!
必要な部品
このプロジェクトには、以下の部品が必要です。
全てをセットで購入するのが便利ですが、こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトでESP32ボードで利用できるピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

配線図
オレンジ色のワイヤーはシグナルで、IO25に接続します。
赤いワイヤーはVCCで、5Vに接続します。
茶色のワイヤーはGNDで、GNDに接続します。

コード
注釈
esp32-starter-kit-main\c\codes\4.3_servo
のパスから4.3_servo.ino
ファイルを開くか、このコードを Arduino IDE にコピーしてください。ボード(ESP32 Dev Module)と適切なポートを選んだ後、 アップロード ボタンをクリックします。
ここでは
ESP32Servo
ライブラリを使用します。 Library Manager からインストールできます。
コードのアップロードが完了すると、サーボモータのアームが0°〜180°の範囲で回転するのが見られます。
どのように動作するのか?
ESP32Servo ライブラリを含める: ESP32Servoライブラリをインポートし、サーボモータの制御に必要な設定を行います。
#include <ESP32Servo.h>
サーボとそれが接続されているピンを定義する: このセクションでは、サーボオブジェクト(
myServo
)とサーボモータが接続されているピンを表す定数整数(servoPin
)を宣言します(ピン25に接続)。// Define the servo and the pin it is connected to Servo myServo; const int servoPin = 25;
サーボの最小および最大パルス幅を定義する: このセクションでは、サーボモータの最小および最大パルス幅(それぞれ0.5ミリ秒と2.5ミリ秒)を設定します。
// Define the minimum and maximum pulse widths for the servo const int minPulseWidth = 500; // 0.5 ms const int maxPulseWidth = 2500; // 2.5 ms
setup
関数は、指定されたピンにサーボモータを接続し、そのパルス幅範囲を設定することでサーボモータの初期化を行います。また、サーボのPWM周波数を標準の50Hzに設定します。void setup() { // Attach the servo to the specified pin and set its pulse width range myServo.attach(servoPin, minPulseWidth, maxPulseWidth); // Set the PWM frequency for the servo myServo.setPeriodHertz(50); // Standard 50Hz servo }
attach (int pin, int min, int max)
: この関数は、サーボモータを指定されたGPIOピンに接続し、サーボの最小および最大パルス幅を設定します。pin
: サーボが接続されているGPIOピン番号。min
とmax
: それぞれ最小および最大パルス幅(マイクロ秒単位)。これらの値はサーボモータの運動範囲を定義します。
setPeriodHertz(int hertz)
: この関数はサーボモータのPWM周波数をヘルツで設定します。hertz
: 希望のPWM周波数(ヘルツ)。サーボのデフォルトPWM周波数は50Hzであり、ほとんどのアプリケーションに適しています。
loop
関数はコードの主要部分で、継続的に実行されます。これにより、サーボモータは0度から180度、そして0度に戻るように回転します。これは、角度を対応するパルス幅にマッピングし、新しいパルス幅値でサーボモータを更新することで行われます。void loop() { // Rotate the servo from 0 to 180 degrees for (int angle = 0; angle <= 180; angle++) { int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth); myServo.writeMicroseconds(pulseWidth); delay(15); } // Rotate the servo from 180 to 0 degrees for (int angle = 180; angle >= 0; angle--) { int pulseWidth = map(angle, 0, 180, minPulseWidth, maxPulseWidth); myServo.writeMicroseconds(pulseWidth); delay(15); } }
writeMicroseconds(int value)
: この関数は、マイクロ秒単位でサーボモータのパルス幅を設定します。value
: 希望のパルス幅(マイクロ秒単位)。
writeMicroseconds(int value)
関数は、希望のパルス幅をマイクロ秒単位で表す整数値を引数として取ります。この値は通常、コードの初めに定義された最小および最大パルス幅(minPulseWidth
およびmaxPulseWidth
)で指定された範囲内にあるべきです。そして、関数はサーボモータのパルス幅を設定し、それに応じて位置を移動させます。
5. センサー
5.2 傾けて操作!¶
傾斜スイッチはシンプルで効果的な2ピンデバイスで、その中心に金属球が含まれています。スイッチが垂直の位置にあるときは、2本のピンが電気的に接続されており、電流が流れます。しかし、スイッチが傾いたり特定の角度で傾けられたりすると、金属球が移動しピン間の電気的接続を断ちます。
このプロジェクトでは、傾斜スイッチを使用してLEDの照明を制御します。スイッチを傾動動作を引き起こすように配置することで、スイッチの向きに基づいてLEDをオン/オフ切り替えることができます。
必要なコンポーネント
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると非常に便利です。こちらがリンクです:
名称 |
このキットに含まれるアイテム |
リンク |
---|---|---|
ESP32 スターターキット |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネント紹介 |
購入リンク |
---|---|
- |
|
- |
利用可能なピン
利用可能なピン
このプロジェクトのためにESP32ボードで利用可能なピンのリストです。
入力用
IO14, IO25, I35, I34, I39, I36, IO18, IO19, IO21, IO22, IO23
出力用
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
条件付き利用ピン(入力)
以下のピンには内蔵のプルアップまたはプルダウン抵抗があり、 入力ピンとして使用する場合 外部の抵抗は必要ありません。
条件付き利用ピン
説明
IO13, IO15, IO2, IO4
47Kの抵抗でプルアップして高い値がデフォルトになります。
IO27, IO26, IO33
4.7Kの抵抗でプルアップして高い値がデフォルトになります。
IO32
1Kの抵抗でプルダウンして低い値がデフォルトになります。
ストラッピングピン(入力)
ストラッピングピンは、デバイス起動時(電源オンリセット時)に特定のブートモードを決定するために使用される特別なセットのピンです。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
一般的に、 入力ピンとして使用することは推奨されません。これらのピンを使用する場合は、ブートプロセスへの影響を考慮してください。詳細は、ストラッピングピン セクションを参照してください。
回路図

傾斜スイッチが垂直な位置にある場合、IO14が高く設定され、その結果LEDが点灯します。反対に、傾斜スイッチが傾いている場合、IO14は低く設定され、LEDが消えます。
10K抵抗の目的は、傾斜スイッチが傾いている位置にあるときにIO14が安定した低状態を維持することです。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.2_tilt_switch
のパスの下にあるファイル5.2_tilt_switch.ino
を開くことができます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
コードのアップロードが成功した後、スイッチが垂直な位置にあるときにLEDが点灯し、傾いたときには消灯します。
5.3 障害物の検出¶
このモジュールは一般的に車やロボットに設置され、前方の障害物の有無を判定するために使用されます。また、携帯型デバイスや自動水栓などにも広く利用されています。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると大変便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトにおいてESP32ボードで利用可能なピンのリストです。
利用可能なピン
IO13, IO14, IO27, IO26, IO25, IO33, I35, I34, I39, I36, IO4, IO18, IO19, IO21, IO22, IO23
ストラッピングピン(入力用)
ストラッピングピンは、デバイス起動時(電源オン時のリセット)に特定のブートモードを決定するために使用される特別なピンのセットです。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
一般的に、これらのピンを入力用として使用することは お勧めできません。これらのピンを使用する場合は、ブートプロセスへの影響を考慮してください。詳細は ストラッピングピン セクションを参照してください。
回路図

障害物回避モジュールが障害物を検出しない場合、IO14はハイレベルを返します。しかし、障害物を検出するとローレベルを返します。このモジュールの検出距離は青色のポテンショメータを調整して変更することができます。
配線図

コード
注釈
ファイル
5.3.detect_the_obstacle.ino
をパスesp32-starter-kit-main\c\codes\5.3.detect_the_obstacle
から開くことができます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
コードが正常にアップロードされた後、IR障害物回避モジュールが何かを検出してブロックしている場合は、シリアルモニターに「0」が表示されます。それ以外の場合は「1」が表示されます。
5.4 ライン検出¶
ライン追跡モジュールは、電気テープで貼られた黒線のような地面の黒いエリアの存在を検出するために使用されます。
その発光体は地面に適切な赤外線を放射し、黒い面はそれを吸収し反射が弱まります。白い面の場合はその逆です。反射光が検出された場合、その部分は白とみなされます。検出されない場合は黒とみなされます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入するととても便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトでESP32ボードにて利用可能なピンのリストです。
利用可能なピン
IO13, IO14, IO27, IO26, IO25, IO33, I35, I34, I39, I36, IO4, IO18, IO19, IO21, IO22, IO23
ストラッピングピン(入力用)
ストラッピングピンは、デバイスの起動時(電源オンリセット時)に特定のブートモードを決定するための特別なピンセットです。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
通常、これらのピンを入力ピンとして使用することは お勧めできません。これらのピンを使用する場合は、ブートプロセスに与える影響を考慮してください。詳細は ストラッピングピン セクションを参照してください。
回路図

ライン追跡モジュールが黒い線を検出した場合、IO14はハイレベルを返します。白い線を検出した場合、IO14はローレベルを返します。このモジュールの感度を変更するには、青いポテンショメータを調整してください。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.4_detect_the_line
パスの下にあるファイル5.4_detect_the_line.ino
を開いてください。ボード(ESP32 Dev Module)を選択し、適切なポートを指定した後、 アップロード ボタンをクリックしてください。
コードが正常にアップロードされた後、ライン追跡モジュールが黒い線を検出すると、シリアルモニターに「Black」と表示されます。それ以外の場合は「White」と表示されます。
5.5 人間の動きを検出する¶
受動赤外線センサー(PIRセンサー)は、視野内の物体から放出される赤外線(IR)を測定する一般的なセンサーです。 簡単に言うと、人体から放出される赤外線を受け取り、人や他の動物の動きを検出します。 より具体的には、誰かがあなたの部屋に入ったことをメインコントロールボードに知らせます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトでESP32ボードにて利用可能なピンのリストです。
入力用
IO13, IO14, IO27, IO26, IO25, IO33, I35, I34, I39, I36, IO4, IO18, IO19, IO21, IO22, IO23
出力用
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
注釈
IO32は内部に1Kプルダウン抵抗が接続されているため、このプロジェクトでは 入力ピンとして使用できません。デフォルト値が0に設定されます。
ストラッピングピン(入力用)
ストラッピングピンは、デバイスの起動時(電源オンリセット時)に特定のブートモードを決定するための特別なピンセットです。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
通常、これらのピンを入力ピンとして使用することは お勧めできません。これらのピンを使用する場合は、ブートプロセスに与える影響を考慮してください。詳細は ストラッピングピン セクションを参照してください。
回路図

PIRモジュールが動きを検出すると、IO14が高くなり、LEDが点灯します。動きが検出されない場合、IO14は低くなり、LEDは消灯します。
配線図

コード
注釈
パス
esp32-starter-kit-main\c\codes\5.5_pir
の下にあるファイル5.5_pir.ino
を開いてください。ボード(ESP32 Dev Module)を選択し、適切なポートを指定した後、 アップロード ボタンをクリックしてください。
コードが正常にアップロードされた後、PIRモジュールが誰かの通過を検出すると、LEDが点灯し、その後消えます。
注釈
PIRモジュールには2つのポテンショメータがあります。一つは感度を、もう一つは検出距離を調整します。PIRモジュールをより良く機能させるために、両方を反時計回りに最後まで回してください。

5.6 トランジスタの二種類¶
本キットには、S8550(PNPタイプ)とS8050(NPNタイプ)の2種類のトランジスタが含まれています。見た目は非常に似ているため、ラベルを注意深く確認する必要があります。 NPNトランジスタはハイレベル信号を受け取ると動作しますが、PNPトランジスタはローレベル信号で制御する必要があります。これらのトランジスタは、この実験のように、非接触スイッチに頻繁に使用されます。
トランジスタの使用方法をLEDとボタンを使って理解しましょう!
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトでESP32ボードにて利用可能なピンのリストです。
入力用
IO14, IO25, I35, I34, I39, I36, IO18, IO19, IO21, IO22, IO23
出力用
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
条件付き使用ピン(入力用)
以下のピンには内蔵のプルアップ抵抗またはプルダウン抵抗があるため、 入力ピンとして使用する場合、外部抵抗は不要です:
Conditional Usage Pins
Description
IO13, IO15, IO2, IO4
Pulling up with a 47K resistor defaults the value to high.
IO27, IO26, IO33
Pulling up with a 4.7K resistor defaults the value to high.
IO32
Pulling down with a 1K resistor defaults the value to low.
ストラッピングピン(入力用)
ストラッピングピンは、デバイスの起動時(つまり、電源オンリセット時)に特定のブートモードを決定するために使用される特別なピンのセットです。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
通常、これらのピンを入力ピンとして使用することは 推奨されません。これらのピンを使用する場合は、ブートプロセスに与える可能性のある影響を考慮してください。詳細については、 ストラッピングピン セクションを参照してください。
NPN(S8050)トランジスタの接続方法

この回路では、ボタンが押されるとIO14がハイになります。
IO26を ハイ に設定してプログラムし、1kの電流制限抵抗器(トランジスタを保護するため)を介して、S8050(NPNトランジスタ)が導通することを許可することで、LEDが点灯します。

PNP(S8550)トランジスタの接続方法

この回路では、デフォルトではIO14はローであり、ボタンが押されるとハイに変わります。
IO26を ロー に設定してプログラムし、1kの電流制限抵抗器(トランジスタを保護するため)を介して、S8550(PNPトランジスタ)が導通することを許可することで、LEDが点灯します。
この回路と前の回路の唯一の違いは、前の回路ではLEDのカソードが S8050(NPNトランジスタ) の コレクター に接続されているのに対し、こちらの回路では S8550(PNPトランジスタ) の エミッター に接続されている点です。

コード
注釈
esp32-starter-kit-main\c\codes\5.6_transistor
のパスの下にあるファイル5.6_transistor.ino
を開くことができます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
同じコードを使用して2種類のトランジスタを制御することができます。 ボタンを押すと、ESP32はトランジスタにハイレベルの信号を送信し、 それを放すと、ローレベルの信号を送信します。
S8050(NPNトランジスタ)を使用した回路は、ボタンを押すと点灯し、ハイレベルの導通状態であることを示します。
S8550(PNPトランジスタ)を使用した回路は、ボタンを放すと点灯し、ローレベルの導通状態であることを示します。
5.7 光を感じる¶
フォトレジスタは、ポテンショメータに似た、アナログ入力用の一般的なデバイスです。受ける光の強度によって抵抗値が変わります。強い光を浴びるとフォトレジスタの抵抗は減少し、光の強度が弱まると抵抗は増加します。
フォトレジスタの値を読むことによって、周囲の光の条件に関する情報を得ることができます。この情報は、LEDの明るさを制御したり、センサーの感度を調節したり、プロジェクトで光に依存するアクションを実装するために使用できます。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
全てのキットを購入するのは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
利用可能なピン
IO14, IO25, I35, I34, I39, I36
ストラッピングピン
以下のピンはストラッピングピンであり、電源オンまたはリセット時のESP32の起動プロセスに影響を与えます。しかし、ESP32が正常に起動した後、通常のピンとして使用できます。
ストラッピングピン
IO0, IO12
回路図

光の強度が増すと、光依存抵抗(LDR)の抵抗が減少し、I35で読む値が下がります。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.7_feel_the_light
のパスにある5.7_feel_the_light.ino
ファイルを開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックしてください。
コードが正常にアップロードされると、シリアルモニターは0から4095までのフォトレジスタの値を出力します。 現在の周囲の明るさが強ければ強いほど、シリアルモニターに表示される値が大きくなります。
注釈
ESP32では、解像度は9ビットから12ビットの間で、ADCハードウェアの解像度を変更します。それ以外の場合は値がシフトされます。
デフォルトは12ビット(0から4096の範囲)で、ESP32S3以外の全てのチップに適用されます。ESP32S3ではデフォルトは13ビット(0から8192の範囲)です。
setup()
関数に analogReadResolution(10);
を追加することで、たとえば 20
のような異なる解像度を設定することができます。
5.8 ノブを回す¶
ポテンショメータは、回路の抵抗を調節するために一般的に使用される3端子デバイスです。これにはノブまたはスライディングレバーが備えられており、ポテンショメータの抵抗値を変化させることができます。このプロジェクトでは、日常生活のデスクランプのように、LEDの明るさを制御するためにそれを活用します。ポテンショメータの位置を調整することにより、回路の抵抗を変更し、それによってLEDを流れる電流を調節し、その明るさを適宜調整することができます。これにより、デスクランプのようなカスタマイズ可能で調節可能な照明体験を作り出すことができます。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
全てのキットを購入するのは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
利用可能なピン
IO14, IO25, I35, I34, I39, I36
ストラッピングピン
以下のピンはストラッピングピンであり、電源オンまたはリセット時のESP32の起動プロセスに影響を与えます。しかし、ESP32が正常に起動した後、通常のピンとして使用できます。
ストラッピングピン
IO0, IO12
回路図

ポテンショメータを回すと、I35の値が変わります。プログラミングにより、I35の値を使用してLEDの明るさを制御できます。そのため、ポテンショメータを回すと、LEDの明るさもそれに応じて変化します。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.8_pot
のパスの下にあるファイル5.8_pot.ino
を開くことができます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
コードが正常にアップロードされた後、ポテンショメータを回すと、LEDの明るさがそれに応じて変わるのが見えます。同時に、シリアルモニタでポテンショメータのアナログ値と電圧値を確認できます。
どのように動作するのか?
ピン接続とPWM設定のための定数を定義します。
const int potPin = 14; // Potentiometer connected to GPIO14 const int ledPin = 26; // LED connected to GPIO26 // PWM settings const int freq = 5000; // PWM frequency const int resolution = 12; // PWM resolution (bits) const int channel = 0; // PWM channel
ここではPWMの解像度を12ビットに設定し、範囲は0-4095になります。
setup()
関数でシステムを構成します。void setup() { Serial.begin(115200); // Configure PWM ledcSetup(channel, freq, resolution); ledcAttachPin(ledPin, channel); }
setup()
関数では、ボーレート115200でシリアル通信を開始します。指定された周波数と解像度でPWMチャンネルを設定するために
ledcSetup()
関数が呼び出され、指定されたLEDピンをPWMチャンネルに関連付けるためにledcAttachPin()
関数が呼び出されます。
loop()
関数のメインループ(繰り返し実行される)。void loop() { int potValue = analogRead(potPin); // read the value of the potentiometer uint32_t voltage_mV = analogReadMilliVolts(potPin); // Read the voltage in millivolts ledcWrite(channel, potValue); Serial.print("Potentiometer Value: "); Serial.print(potValue); Serial.print(", Voltage: "); Serial.print(voltage_mV / 1000.0); // Convert millivolts to volts Serial.println(" V"); delay(100); }
uint32_t analogReadMilliVolts(uint8_t pin);
: この関数は指定されたピン/ADCチャンネルのADC値をミリボルト単位で取得するために使用されます。pin
アナログ値を読むGPIOピン。
ポテンショメータの値は
ledcWrite()
関数を通じてLEDの明るさを制御するPWMデューティサイクルとして直接使用されます。値の範囲も0から4095です。
5.9 土壌湿度の測定¶
この静電容量型土壌湿度センサーは、市場に出ている抵抗型センサーとは異なり、静電容量誘導の原理を利用して土壌の湿度を検出します。
土壌湿度センサーからの値を視覚的に読み取ることで、土壌の湿度レベルに関する情報を収集できます。この情報は、自動灌漑システム、植物の健康監視、環境センシングプロジェクトなど、さまざまな用途に役立ちます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全てのキットを一括購入するのは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトでESP32ボード上で利用可能なピンの一覧です。
利用可能なピン
IO14, IO25, I35, I34, I39, I36
ストラッピングピン
以下のピンはストラッピングピンであり、ESP32の電源オンまたはリセット時の起動プロセスに影響します。しかし、ESP32が正常に起動した後は、通常のピンとして使用できます。
ストラッピングピン
IO0, IO12
回路図

モジュールを土に挿入し、水をやると、I35で読み取る値が下がります。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.9_moisture
のパス下にある5.9_moisture.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
コードが正常にアップロードされると、シリアルモニターが土壌の湿度値を出力します。
モジュールを土に挿入し、水をやることで、土壌湿度センサーの値は小さくなります。
5.10 サーミスター温度計¶
サーミスターは、温度によって抵抗値が大きく変わる温度センサーで、NTC(負温度係数)タイプとPTC(正温度係数)タイプの二種類に分けられます。NTCサーミスターの抵抗値は温度が上がるにつれて減少し、PTCサーミスターの抵抗値は温度が上がるにつれて増加します。
このプロジェクトではNTCサーミスターを使用します。NTCサーミスターをESP32マイクロコントローラのアナログ入力ピンに接続することで、抵抗値を測定し、これが直接温度に比例します。
NTCサーミスターを取り入れ、必要な計算を行うことで、温度を正確に測定し、I2C LCD1602モジュールに表示することができます。このプロジェクトはリアルタイムで温度監視を行い、温度表示のための視覚的インターフェースを提供します。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全てのキットを一括購入するのは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトでESP32ボード上で利用可能なピンの一覧です。
利用可能なピン
IO14, IO25, I35, I34, I39, I36
ストラッピングピン
以下のピンはストラッピングピンであり、ESP32の電源オンまたはリセット時の起動プロセスに影響します。しかし、ESP32が正常に起動した後は、通常のピンとして使用できます。
ストラッピングピン
IO0, IO12
回路図

温度が上がると、サーミスターの抵抗値が減少し、I35で読み取る値も下がります。さらに、式を使ってアナログ値を温度に変換し、それを表示します。
配線図

注釈
サーミスターは黒色で、103と記されています。
10Kオーム抵抗のカラーリングは赤、黒、黒、赤、茶です。
コード
注釈
esp32-starter-kit-main\c\codes\5.10_thermistor
のパスの下にある5.10_thermistor.ino
ファイルを開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックしてください。
コードが正常にアップロードされると、シリアルモニターに摂氏と華氏の温度が表示されます。
どのように動作するのか?
各サーミスターには通常の抵抗値があります。ここでは25度摂氏で測定される10kオームです。
温度が上がると、サーミスターの抵抗値が下がります。その後、A/Dアダプターによって電圧データがデジタル量に変換されます。
摂氏または華氏の温度は、プログラミングを介して出力されます。
ここに抵抗値と温度との関係があります:
RT = RN expB(1/TK - 1/TN)
RT は、温度が TK のときのNTCサーミスターの抵抗値です。
RN は、定格温度TN下のNTCサーミスターの抵抗値です。ここでは、RNの数値は10kです。
TK はケルビン温度で、単位はKです。ここでは、 TK の数値は
摂氏度+373.15
です。TN は定格ケルビン温度で、単位もKです。ここでは、TNの数値は
373.15+25
です。B(beta) はNTCサーミスターの材料定数で、熱感応指数とも呼ばれ、数値は
4950
です。exp は指数関数の略で、底数
e
は自然数で、約2.7に等しいです。この式
TK=1/(ln(RT/RN)/B+1/TN)
を変換すると、ケルビン温度から273.15を引いたものが摂氏度になります。この関係は経験式です。温度と抵抗が有効範囲内にあるときのみ正確です。
もっと学ぶ
計算された摂氏と華氏の温度をI2C LCD1602にも表示させることができます。
注釈
euler-kit/arduino/5.10_thermistor_lcd
のパスの下にある5.10_thermistor_lcd.ino
ファイルを開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックしてください。
ここでは
LiquidCrystal I2C
ライブラリを使用しています。 Library Manager からインストールできます。
5.11 ジョイスティックの切り替え¶
ビデオゲームをよくプレイするなら、ジョイスティックに非常に馴染みがあるでしょう。 キャラクターを動かしたり、画面を回転させたりするのに普通使用されます。
コンピュータが私たちの動作を読み取ることができるジョイスティックの原理は非常にシンプルです。 これは互いに直交する二つのポテンショメーターで構成されていると考えることができます。 これら二つのポテンショメーターは、ジョイスティックの縦と横のアナログ値を測定し、平面直角座標系の値(x,y)を結果として得ます。
このキットのジョイスティックには、押された時にアクティブになるデジタル入力もあります。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
全てのキットを購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
以下はこのプロジェクトでESP32ボードに利用可能なピンのリストです。
アナログ入力用
IO14, IO25, I35, I34, I39, I36
デジタル入力用
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
回路図

SW(Z軸)ピンはIO33に接続されており、内蔵4.7Kプルアップ抵抗器があります。そのため、SWボタンが押されていない場合は、高レベルを出力します。ボタンが押された場合は、低レベルを出力します。
ジョイスティックを操作すると、I34とI35の値が変わります。値の範囲は0から4095です。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.11_joystick
のパスの下にある5.11_joystick.ino
ファイルを開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 Upload ボタンをクリックします。
コードが正常にアップロードされた後、シリアルモニターを開いて、ジョイスティックのx,y,z値を確認してください。
x軸とy軸の値は0から4095までのアナログ値です。
Z軸は1または0のデジタル値です(押された時は0です)。
5.12 距離の測定¶
超音波モジュールは、距離測定や物体検出に使用されます。このプロジェクトでは、障害物までの距離を測定するためにモジュールをプログラムします。超音波パルスを送信し、それが反射して戻ってくるまでの時間を測定することで、距離を算出できます。これにより、距離に基づいた行動や障害物回避行動を実装することが可能になります。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
全キットを購入することは確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらは、このプロジェクトのためにESP32ボードで利用可能なピンのリストです。
入力用 |
IO13, IO14, IO27, IO26, IO25, IO33, IO32, I35, I34, I39, I36, IO4, IO18, IO19, IO21, IO22, IO23 |
出力用 |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

ESP32は10秒ごとに超音波センサーのTrigピンに一連の方形波信号を送信します。これにより、超音波センサーから40kHzの超音波信号が外向きに放出されます。前方に障害物がある場合、超音波波は反射して戻ります。
信号を送信してから受信するまでの時間を記録し、2で割って光速を掛けることにより、障害物までの距離を特定できます。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.12_ultrasonic
のパスの下にある5.12_ultrasonic.ino
ファイルを開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 Upload ボタンをクリックします。
コードが正常にアップロードされると、シリアルモニターは超音波センサーと前方の障害物との間の距離を出力します。
どのように動作するのか?
超音波センサーの応用については、サブファンクションを直接チェックしてください。
float readSensorData(){// ...}
超音波モジュールの
trigPin
は、2usごとに10usの方形波信号を発信します。// Trigger a low signal before sending a high signal digitalWrite(trigPin, LOW); delayMicroseconds(2); // Send a 10-microsecond high signal to the trigPin digitalWrite(trigPin, HIGH); delayMicroseconds(10); // Return to low signal digitalWrite(trigPin, LOW);
障害物が範囲内にある場合、
echoPin
は高レベルの信号を受信し、送信から受信までの時間をpulseIn()
関数で記録します。unsigned long microsecond = pulseIn(echoPin, HIGH);
音速は秒速340メートルで、これはセンチメートルあたり29マイクロ秒に相当します。障害物までの方形波の往復の時間を測定し、その合計時間を2で割ることで、音波源から障害物までの距離を計算できます。
float distance = microsecond / 29.00 / 2;
超音波センサーは動作している間プログラムを一時停止するため、複雑なプロジェクトを書いているときにいくらかの遅延を引き起こす可能性があります。
5.13 温度・湿度センサー¶
DHT11は、環境測定用によく使われる温度・湿度センサーです。このデジタルセンサーは、温度と湿度の値を提供するためにマイクロコントローラと通信します。
このプロジェクトでは、DHT11センサーからのデータを読み取り、検出された温度と湿度の値を表示します。
センサーから提供されたデータを読むことにより、現在の環境の温度と湿度の値を得ることができます。これらの値は、環境のリアルタイムモニタリング、天気観測、室内の気候制御、湿度レポートなどに使用できます。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
全キットを購入することは確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらは、このプロジェクトのためにESP32ボードで利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.13_dht11
のパスの下にある5.13_dht11.ino
ファイルを開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
DHT sensor library
ライブラリが使用されています。 Library Manager からインストールできます。
コードが正常にアップロードされた後、シリアルモニターには温度と湿度が連続して表示され、プログラムが安定して実行されるにつれて、これらの値はより正確になっていきます。
どのように動作するのか?
DHT.h
ライブラリをインクルードし、DHTセンサーとのインタラクションに必要な機能を提供します。次に、DHTセンサーのピンとタイプを設定します。#include "DHT.h" #define DHTPIN 14 // Set the pin connected to the DHT11 data pin #define DHTTYPE DHT11 // DHT 11 DHT dht(DHTPIN, DHTTYPE);
シリアル通信をボーレート115200で初期化し、DHTセンサーを初期化します。
void setup() { Serial.begin(115200); Serial.println("DHT11 test!"); dht.begin(); }
loop()
関数内で、DHT11センサーから温度と湿度の値を読み取り、それらをシリアルモニターに出力します。void loop() { // Wait a few seconds between measurements. delay(2000); // Reading temperature or humidity takes about 250 milliseconds! // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor) float humidity = dht.readHumidity(); // Read temperature as Celsius (the default) float temperture = dht.readTemperature(); // Check if any reads failed and exit early (to try again). if (isnan(humidity) || isnan(temperture)) { Serial.println("Failed to read from DHT sensor!"); return; } // Print the humidity and temperature Serial.print("Humidity: "); Serial.print(humidity); Serial.print(" %\t"); Serial.print("Temperature: "); Serial.print(temperture); Serial.println(" *C"); }
dht.readHumidity()
関数は、DHTセンサーから湿度値を読み取るために呼び出されます。dht.readTemperature()
関数は、温度値を読み取るために呼び出されます。isnan()
関数は、読み取り値が有効かどうかをチェックするために使用されます。湿度または温度の値がNaN(数値ではない)の場合、センサーからの読み取りが失敗したことを示し、エラーメッセージが出力されます。
さらに学ぶ
I2C LCD1602にも温度と湿度を表示できます。
注釈
euler-kit/arduino/5.10_thermistor_lcd
のパスの下にある5.10_thermistor_lcd.ino
ファイルを開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
LiquidCrystal_I2C
とDHT sensor library
ライブラリが使用されています。 Library Manager からインストールできます。
5.14 赤外線受信機¶
赤外線受信機は、赤外線信号を受信し、TTLレベルと互換性のある信号を独立して検出・出力することができる部品です。一般的なプラスチックパッケージのトランジスタと同じサイズで、赤外線リモコンや赤外線伝送など、様々な応用に利用されています。
このプロジェクトでは、リモコンからの信号を検出するために赤外線受信機を使用します。リモコンのボタンを押すと、赤外線受信機が対応する信号を受信し、どのボタンが押されたかを判断するために信号をデコードします。受信した信号をデコードすることで、それに関連する特定のキーまたはコマンドを識別することができます。
赤外線受信機を用いることで、プロジェクトにリモコン機能を組み込み、赤外線信号を使用してデバイスを操作したり、対話することが可能になります。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入するのが便利です。以下がリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
個別に以下のリンクから購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトにおいてESP32ボード上で利用可能なピンのリストです。
利用可能なピン
IO13, IO12, IO14, IO27, IO26, IO25, IO15, IO0, IO5, IO18, IO19, IO21, IO22, IO23
回路図

リモコンのボタンを押すと、赤外線受信機が信号を検出し、赤外線ライブラリを使用してデコードできます。このデコードプロセスにより、ボタンプレスに関連するキー値を取得できます。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\5.14_ir_receiver
のパスの下にある5.14_ir_receiver.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
IRremoteESP8266
ライブラリを使用しています。 Library Manager からインストールできます。
コードが正常にアップロードされた後、リモコンの異なるキーを押すと、そのキーの名前がシリアルモニターに表示されます。
注釈
IRremoteESP8266
ライブラリには多くの異なる赤外線プロトコルとデバイスの実装が含まれているため、ライブラリのサイズは比較的大きいです。コンパイラがより多くのコードを処理する必要があると、コンパイル時間もそれに応じて長くなります。コンパイルが終了するまで、辛抱強くお待ちください。新しいリモコンには、内蔵されている電池を絶縁するためのプラスチックタブが端にあります。リモコンを使用する際には、このプラスチック片を取り外すだけです。
どのように動作するのか?
このコードでは
IRremoteESP8266
ライブラリを使用して赤外線(IR)信号を赤外線受信モジュールを用いて受信します。#include <IRremoteESP8266.h> #include <IRrecv.h> // Define the IR receiver pin const uint16_t IR_RECEIVE_PIN = 14; // Create an IRrecv object IRrecv irrecv(IR_RECEIVE_PIN); // Create a decode_results object decode_results results;
setup()
関数では、シリアル通信を115200のボーレートで開始し、irrecv.enableIRIn()
を使用してIRレシーバを有効にします。void setup() { // Start serial communication Serial.begin(115200); // Start the IR receiver irrecv.enableIRIn(); }
リモコンのキーを押すと、IRレシーバが信号を受信した場合にシリアルモニタにキー名が表示されます。
void loop() { // If an IR signal is received if (irrecv.decode(&results)) { String key = decodeKeyValue(results.value); if (key != "ERROR") { // Print the value of the signal to the serial monitor Serial.println(key); } irrecv.resume(); // Continue to receive the next signal } }
最初に、
irrecv.decode()
関数を使ってIR信号が受信されたかどうかを確認します。信号が受信された場合は、
decodeKeyValue()
関数を呼び出して信号の値をデコードします。信号が正常にデコードされた場合は、
Serial.println()
を使用してシリアルモニタにデコードされた値が出力されます。最後に、
irrecv.resume()
を呼び出して次の信号の受信を続けます。
decodeKeyValue()
関数は、IR信号のデコードされた値を引数として取り、リモコンの押されたキーに対応する文字列を返します。String decodeKeyValue(long result) { switch(result){ case 0xFF6897: return "0"; case 0xFF30CF: return "1"; case 0xFF18E7: return "2"; case 0xFF7A85: ...
この関数はswitch文を使ってデコードされた値を対応するキーと照合し、そのキーの文字列表現を返します。
デコードされた値が既知のキーに一致しない場合、関数は文字列 "ERROR" を返します。
6. おもしろプロジェクト
6.1 フルーツピアノ¶
ピアノを弾いてみたいけど手が出ない、あるいはDIYでフルーツピアノを楽しみたいと思ったことはありませんか? そんなあなたにぴったりのプロジェクトです!
ESP32ボードにいくつかのタッチセンサーを取り付けるだけで、お気に入りの曲を演奏し、銀行を壊さずにピアノの演奏体験を楽しむことができます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全てのキットを一つに買うのは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
タッチピンについて
ESP32マイクロコントローラーには内蔵のタッチセンサー機能があり、ボード上の特定のピンをタッチ感度のある入力として使用できます。タッチセンサーは、人体の電気的特性によって引き起こされるタッチピン上の静電容量の変化を測定することで動作します。
ESP32のタッチセンサーの主な特徴は以下の通りです:
タッチピンの数
ESP32には、ボードによって最大10個のタッチピンがあります。タッチピンは通常、「T」に続く数字でラベル付けされます。
GPIO4: TOUCH0
GPIO0:TOUCH1
GPIO2: TOUCH2
GPIO15: TOUCH3
GPIO13: TOUCH4
GPIO12: TOUCH5
GPIO14: TOUCH6
GPIO27: TOUCH7
GPIO33: TOUCH8
GPIO32: TOUCH9
注釈
GPIO0ピンとGPIO2ピンは、それぞれESP32にブートストラッピングとファームウェアのフラッシングに使用されます。これらのピンはオンボードのLEDとボタンにも接続されています。そのため、これらのピンを他の目的で使用することは通常お勧めできません。なぜなら、ボードの通常の操作に干渉する可能性があるからです。
感度
ESP32のタッチセンサーは非常に敏感で、小さな静電容量の変化も検出できます。感度はソフトウェア設定で調整することができます。
ESD保護
ESP32のタッチピンには内蔵のESD(静電気放電)保護機能があり、静電気からボードを保護するのに役立ちます。
マルチタッチ
ESP32のタッチセンサーはマルチタッチをサポートしており、同時に複数のタッチイベントを検出できます。
回路図

このプロジェクトのアイデアは、タッチセンサーを使用してユーザーが特定のピンに触れたときを検出することです。 各タッチピンは特定の音符に関連付けられており、ユーザーがピンに触れると、 対応する音符がパッシブブザーで鳴ります。 これにより、ピアノ演奏の体験を手軽でお手頃な方法で楽しむことができます。
配線図

このプロジェクトでは、ESP32 WROOM 32Eを拡張ボードから取り外し、その後ブレッドボードに挿入する必要があります。これは、拡張ボード上の一部のピンが抵抗に接続されており、ピンの容量に影響を与えるためです。
コード
注釈
esp32-starter-kit-main\c\codes\6.1_fruit_piano
のパスの下にあるファイル6.1_fruit_piano.ino
を直接開くことができます。または、このコードをArduino IDEにコピーしてください。
これらのESP32のピンにフルーツを接続できます: 4, 15, 13, 12, 14, 27, 33, 32。
スクリプトが実行されると、これらのフルーツに触れると、ド、レ、ミ、ファ、ソ、ラ、シ、ド(C5)の音が鳴ります。
どのように動作するのか?
touchRead(uint8_t pin);
この関数はタッチセンサーのデータを取得します。各タッチセンサーには、充放電サイクルの数を数えるカウンターがあります。 パッドが 触れられた 場合、相当する静電容量が大きくなるため、カウンター内の値が変わります。 データの変化によって、パッドが触れられたかどうかが決まります。
pin
TOUCH値を読み取るGPIOピン
この関数は0から4095の値を返し、値が低いほど強いタッチ入力を示します。
注釈
threshold
は異なるフルーツの導電性に基づいて調整する必要があります。
最初にスクリプトを実行して、シェルによって印刷される値を確認できます。
0: 60
1: 62
2: 71
3: 74
4: 73
5: 78
6: 80
7: 82
12、14、27番のピンにあるフルーツに触れた後、印刷される値は以下の通りです。そのため、 threshold
を30に設定しました。これは、30未満の値が検出されたときに触れたと見なされ、ブザーが異なる音符を発することを意味します。
0: 60
1: 62
2: 71
3: 9
4: 12
5: 14
6: 75
7: 78
6.2 流れる光¶
あなたの居住空間に楽しさとインタラクティブな要素を加えたいと思ったことはありませんか? このプロジェクトでは、WS2812 LEDストリップと障害物回避モジュールを使用して走行光を作成します。 障害物が検出されると走行光の方向が変わり、家やオフィスの装飾にエキサイティングな追加をすることができます。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
全てのキットを購入することは非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

WS2812 LEDストリップは、異なる色やパターンを表示するようにプログラムできる一連の個別LEDで構成されています。 このプロジェクトでは、ストリップは特定の方向に動く走行光を表示するように設定され、 障害物回避モジュールによって障害物が検出されたときに方向が変わります。
配線図

コード
注釈
esp32-starter-kit-main\c\codes\6.2_flowing_led
のパスの下にあるファイル6.2_flowing_led.ino
を直接開くことができます。または、このコードをArduino IDEにコピーしてください。
このプロジェクトは、2.7 RGB LEDストリップ プロジェクトの機能を拡張し、LEDストリップにランダムな色を表示する機能を追加しています。 さらに、障害物回避モジュールが含まれており、走行光の方向を動的に変更できます。
6.3 バックアップ支援¶
想像してみてください:車に乗っていて、狭い駐車スペースにバックで入るところです。当プロジェクトを使えば、あなたの車の後部に取り付けられた超音波モジュールがデジタルアイとして機能します。リバースギアに入れると、このモジュールが活動を開始し、あなたの後ろの障害物から跳ね返る超音波パルスを発します。
魔法のようなことが起こります。これらのパルスがモジュールに戻ると、モジュールは迅速にあなたの車と物体との距離を計算し、このデータをリアルタイムの視覚フィードバックに変換し、鮮やかなLCD画面に表示します。動的なカラーコード付きインジケーターが障害物の近接を描き、周囲環境をクリスタルクリアに理解できるようになります。
しかし、私たちはそこで止まりませんでした。あなたをさらに運転体験に没入させるために、生き生きとしたブザーを組み込みました。車が障害物に近づくにつれて、ブザーのテンポは激しくなり、警告の交響曲を奏でます。それは、バック駐車の複雑さをナビゲートする個人オーケストラを持っているようなものです。
この革新的なプロジェクトは、最先端の技術とインタラクティブなユーザーインターフェイスを組み合わせており、あなたのバック駐車を安全でストレスフリーなものにします。超音波モジュール、LCDディスプレイ、活気のあるブザーが調和して動作し、狭いスペースでの操縦時にあなたを力強く自信を持たせ、運転の喜びに集中させます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入することは間違いなく便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
回路図

プロジェクトにおける超音波センサーは、高周波の音波を発し、物体にぶつかって跳ね返ってくるまでの時間を測定します。このデータを分析することで、センサーと物体との距離が計算できます。物体が近すぎる場合の警告として、聴覚信号を発するブザーが使用されます。さらに、測定された距離は簡単な可視化のためにLCD画面に表示されます。
配線図

コード
注釈
ファイル
6.3_reversing_aid.ino
をパスesp32-starter-kit-main\c\codes\6.3_reversing_aid
から直接開くことができます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
LiquidCrystal I2C
ライブラリが使用されています。 Library Manager からインストールできます。
コードが正常にアップロードされた後、LCDに現在検出されている距離が表示されます。そして、ブザーは距離に応じて音の周波数を変更します。
注釈
コードと配線が正しくてもLCDに何も表示されない場合は、背面のポテンショメータを調整してコントラストを上げてください。
どのように動作するのか?
このコードは、物体間の距離を測定し、LCDディスプレイとブザーを通じてフィードバックを提供する簡単な距離測定装置を作成するのに役立ちます。
loop()
関数にはプログラムの主なロジックが含まれており、連続して実行されます。 loop()
関数をもう少し詳しく見てみましょう。
距離を読み取り、パラメータを更新するループ
loop
内では、まず超音波モジュールによって測定された距離を読み取り、その距離に基づいて間隔パラメータを更新します。// Update the distance distance = readDistance(); // Update intervals based on distance if (distance <= 10) { intervals = 300; } else if (distance <= 20) { intervals = 500; } else if (distance <= 50) { intervals = 1000; } else { intervals = 2000; }
ビープ音を鳴らすタイミングをチェック
コードは、現在の時刻と前回のビープ音の時刻との差を計算し、その差が間隔時間以上であればブザーを鳴らし、前回のビープ音の時刻を更新します。
unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= intervals) { Serial.println("Beeping!"); beep(); previousMillis = currentMillis; }
LCDディスプレイを更新
コードはLCDディスプレイをクリアし、その後、1行目に「Dis:」と現在の距離(センチメートル)を表示します。
lcd.clear(); lcd.setCursor(0, 0); lcd.print("Dis: "); lcd.print(distance); lcd.print(" cm"); delay(100);
6.4 デジタルダイス¶
このプロジェクトは 2.5 数字表示 のプロジェクトをベースに、7セグメント表示器に表示される数字を制御するボタンを追加しています。
このプロジェクトでは、ランダムな数字を生成し、7セグメント表示器に表示して、サイコロを振る動作をシミュレートします。ボタンを押すと、1から6までの安定した数字(ランダムに選ばれた)が7セグメント表示器に表示されます。ボタンを再度押すと、以前と同様にランダムな数字を生成するサイコロの振るシミュレーションが始まります。このサイクルは、ボタンが押されるたびに続きます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入するのが確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することも可能です。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

このプロジェクトは 2.5 7セグメントディスプレイ をベースにしており、7セグメント表示器に表示される数字を制御するボタンが追加されています。
IO13には内部に47Kのプルアップ抵抗があるため、外部のプルアップ抵抗またはプルダウン抵抗を直接接続する必要はなく、追加の外部抵抗は不要です。
配線図

コード
注釈
ファイル
6.4_digital_dice.ino
をパスesp32-starter-kit-main\c\codes\6.4_digital_dice
から開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
このプロジェクトは 2.5 7セグメントディスプレイ をベースにしており、7セグメントディスプレイのスクロール表示を開始/一時停止するボタンが追加されています。
ボタンを押すと、7セグメントディスプレイは1から6までの数字をスクロールし、ボタンを放すと、ランダムな数字が表示されます。
6.5 カラーグラデーション¶
色彩の世界を体験する準備はできていますか?このプロジェクトでは、RGB LEDを制御し、滑らかな色の遷移を実現することができます。自宅の装飾に色を加えたい方や、楽しいプログラミングプロジェクトを探している方にもぴったりです。さあ、このカラフルな世界に一緒に飛び込みましょう!
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
キットを一式購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

配線図

RGB LEDには4本のピンがあります。一番長いピンが共通カソードピンで、通常はGNDに接続されます。最も長いピンの隣の左ピンが赤、右側の2ピンが緑と青です。

コード
注釈
ファイル
6.5_color_gradient.ino
をパスesp32-starter-kit-main\c\codes\6.5_color_gradient
から開いてください。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
このプロジェクトでは、RGB LEDとポテンショメータを使用して色混合効果を作り出します。ポテンショメータはLEDの色相値を調整するために使用され、その色相値は色変換関数を使用してRGB値に変換されます。そして、RGB値を使用してLEDの色を更新します。
どのように動作するのか?
このプロジェクトは、 2.3 カラフルライト プロジェクトに基づいており、LEDの色相値を調整するためのポテンショメータを追加しています。色相値は色変換関数を使用してRGB値に変換されます。
ループ関数内で、ポテンショメータの値を読み取り、色相値(0-360)に変換します。
int knobValue = analogRead(KNOB_PIN); float hueValue = (float) knobValue / 4095.0; int hue = (int) (hueValue * 360);
HUEtoRGB()
関数を使用して色相値をRGB値に変換し、新しい色値でLEDを更新します。int red, green, blue; HUEtoRGB(hue, &red, &green, &blue); setColor(red, green, blue);
setColor()
関数はLEDC
ライブラリを使用して赤、緑、青チャンネルの値を設定します。void setColor(int red, int green, int blue) { ledcWrite(redChannel, red); ledcWrite(greenChannel, green); ledcWrite(blueChannel, blue); }
HUEtoRGB
関数は、HSLカラーモデルを使用して色相値をRGB値に変換します。void HUEtoRGB(int hue, int* red, int* green, int* blue) { float h = (float) hue / 60.0; float c = 1.0; float x = c * (1.0 - fabs(fmod(h, 2.0) - 1.0)); float r, g, b; if (h < 1.0) { r = c; g = x; b = 0; ...
6.6 植物モニタリングシステム¶
植物モニタリングシステムプロジェクトへようこそ!
このプロジェクトでは、ESP32ボードを使用して植物のケアを支援するシステムを作成します。このシステムにより、植物の温度、湿度、土壌の水分、光のレベルを監視し、植物が健やかに育つために必要なケアと注意を確実に提供できます。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
キット一式を購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
- |
|
回路図

このシステムでは、DHT11センサーを使用して周囲環境の温度と湿度を測定します。また、土壌水分モジュールは土の水分レベルを、フォトレジスターは光のレベルを測定するために使用されます。これらのセンサーからの読み取り値はLCD画面に表示され、ボタンを使って必要に応じて水やりをするための水ポンプを制御できます。
IO32は内部に1Kのプルダウン抵抗を持ち、デフォルトでは低論理レベルです。ボタンが押されるとVCC(高電圧)への接続が確立し、IO32に高論理レベルが現れます。
配線図
注釈
ここでは、まずバッテリーを挿入し、その後拡張ボード上のスイッチをON位置にスライドしてバッテリー供給を活性化することをお勧めします。

コード
注釈
ファイル
6.6_plant_monitor.ino
をesp32-starter-kit-main\c\codes\6.6_plant_monitor
のパスの下で開けます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
LiquidCrystal_I2C
とDHT sensor library
ライブラリを使用します。これらは Library Manager からインストールできます。
コードをアップロードした後、I2C LCD1602は温度と湿度、土壌の水分および光強度のアナログ値を2秒間隔で交互に表示します。
水ポンプはボタンプレスを使用して制御されます。植物に水をやるためには、ボタンを押し続けて、止めるためには手を離します。
注釈
コードと配線が正しくてもLCDに何も表示されない場合は、背面のポテンショメータを調整してコントラストを高めることができます。
6.7 数当てゲーム¶
運試しをしたいですか?直感を試して、正しい番号を当てられるかどうか確かめたいですか?それなら、数当てゲームがぴったりです!
このプロジェクトでは、偶然性の高い楽しいゲームを楽しむことができます。
IRリモコンを使用して、プレイヤーは0から99の間の数字を入力し、ランダムに生成される幸運なポイントナンバーを当てます。 システムはLCDスクリーンにプレイヤーの入力した数字を表示し、上限と下限のヒントを提供して正解に導きます。 推測するたびに、プレイヤーは幸運なポイントナンバーに近づき、ついに誰かがジャックポットを当ててゲームに勝利します!
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キットを一式揃えると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

配線図

コード
注釈
6.7_guess_number.ino
ファイルをesp32-starter-kit-main\c\codes\6.7_guess_number
のパスで直接開けます。こちらでは
LiquidCrystal_I2C
とIRremoteESP8266
ライブラリーを使用しています。インストール方法は 手動でのインストール を参照してください。
コードが正常にアップロードされた後、リモコンの任意の数字ボタンを押してゲームを開始します。
リモコンの数字ボタンを使用して数字を入力します。1桁の数字を入力するには、 サイクル キーを押して確認する必要があります。
システムは、入力された数字と上下限のヒントをLCDスクリーンに表示します。
幸運なポイントナンバーを正確に当てるまで推測を続けます。
正しい数字を当てると、システムは成功メッセージを表示し、新しい幸運なポイントナンバーを生成します。
注釈
コードと配線が正しいにもかかわらず、LCDが何も表示されない場合は、背面のポテンショメーターを調整してコントラストを高めることができます。
どのように動作するのか?
setup()
関数では、I2C LCD画面とIR受信機が初期化されます。次にinitNewValue()
関数を呼び出して新しいランダムな幸運の番号を生成し、LCD画面に歓迎メッセージが表示されます。void setup() { // Initialize the LCD screen lcd.init(); lcd.backlight(); // Start the serial communication Serial.begin(9600); // Enable the IR receiver irrecv.enableIRIn(); // Initialize a new lucky point value initNewValue(); }
loop
関数では、IR受信機からの信号を待ちます。信号が受信された場合には、decodeKeyValue
関数が呼び出されて信号をデコードし、対応するボタンの値を取得します。void loop() { // If a signal is received from the IR receiver if (irrecv.decode(&results)) { bool result = 0; String num = decodeKeyValue(results.value); // If the POWER button is pressed if (num == "POWER") { initNewValue(); // Initialize a new lucky point value } // If the CYCLE button is pressed else if (num == "CYCLE") { result = detectPoint(); // Detect the input number lcdShowInput(result); // Show the result on the LCD screen } // If a number button (0-9) is pressed, //add the digit to the input number //and detect the number if it is greater than or equal to 10 else if (num >= "0" && num <= "9") { count = count * 10; count += num.toInt(); if (count >= 10) { result = detectPoint(); } lcdShowInput(result); } irrecv.resume(); } }
ボタンの値に応じて、適切な関数が呼び出されます。数字ボタンが押された場合は、
count
変数が更新され、detectPoint
関数が呼び出されて入力された番号が正しいかどうかを検出します。lcdShowInput
関数が呼び出され、LCD画面に入力された番号と上下限のヒントが表示されます。POWER
ボタンが押された場合は、initNewValue
関数が呼び出されて新しい幸運のポイント番号を生成し、LCD画面に歓迎メッセージを表示します。CYCLE
ボタンが押された場合は、detectPoint
関数が呼び出されて入力された番号が正しいかどうかを検出します。lcdShowInput
関数が呼び出され、LCD画面に入力された番号と上下限のヒントが表示されます。
7. Bluetooth & SDカード & カメラ & スピーカー
7.1 Bluetooth¶
このプロジェクトでは、ESP32マイクロコントローラーを使用して、シンプルなBluetooth Low Energy(BLE)シリアル通信アプリケーションを開発するためのガイドを提供します。ESP32はWi-FiとBluetoothの接続機能を統合した強力なマイクロコントローラーであり、無線アプリケーションの開発に最適です。BLEは短距離通信のために設計された低消費電力の無線通信プロトコルです。この文書では、ESP32をBLEサーバーとして設定し、シリアル接続を介してBLEクライアントと通信する手順を説明します。
Bluetooth機能について
ESP32 WROOM 32Eは、Wi-FiとBluetoothの接続機能を一つのチップに統合するモジュールです。これはBLEおよびクラシックBluetoothプロトコルをサポートしています。
このモジュールはBluetoothクライアントまたはサーバーとして使用することができます。Bluetoothクライアントとして、他のBluetoothデバイスに接続し、データの交換を行うことができます。Bluetoothサーバーとしては、他のBluetoothデバイスにサービスを提供します。
ESP32 WROOM 32Eは、Generic Access Profile(GAP)、Generic Attribute Profile(GATT)、Serial Port Profile(SPP)など、さまざまなBluetoothプロファイルをサポートしています。SPPプロファイルを使用すると、モジュールはBluetooth経由でシリアルポートをエミュレートし、他のBluetoothデバイスとのシリアル通信を可能にします。
ESP32 WROOM 32EのBluetooth機能を使用するには、適切なソフトウェア開発キット(SDK)を使うか、Arduino IDEとESP32 BLEライブラリを使ってプログラムする必要があります。ESP32 BLEライブラリはBLE作業を容易にするための高レベルインターフェースを提供し、モジュールをBLEクライアントおよびサーバーとして使用する方法を示す例を含んでいます。
全体として、ESP32 WROOM 32EのBluetooth機能は、プロジェクトで無線通信を容易かつ低電力で可能にする便利な方法を提供します。
操作手順
以下は、LightBlueアプリを使用してESP32とモバイルデバイス間のBluetooth通信を設定するための手順です:
App Store (iOS用)または Google Play (Android用)からLightBlueアプリをダウンロードします。
esp32-starter-kit-main\c\codes\7.1_bluetooth
ディレクトリにある7.1_bluetooth.ino
ファイルを開くか、コードをArduino IDEにコピーします。UUIDの競合を避けるため、 Online UUID Generator を使用して新しいUUIDをランダムに3つ生成し、以下のコード行にそれらを入力することを推奨します。
#define SERVICE_UUID "your_service_uuid_here" #define CHARACTERISTIC_UUID_RX "your_rx_characteristic_uuid_here" #define CHARACTERISTIC_UUID_TX "your_tx_characteristic_uuid_here"
正しいボードとポートを選択し、 Upload ボタンをクリックします。
コードが正常にアップロードされたら、モバイルデバイスの Bluetooth をオンにし、 LightBlue アプリを開きます。
Scan ページで ESP32-Bluetooth を見つけて CONNECT をクリックします。見つからない場合は、数回ページを更新してみてください。 「Connected to device!」 と表示されれば、Bluetooth接続が成功しています。コード内で設定した3つのUUIDを確認するには、下にスクロールします。
Receive UUIDをクリックします。右の Data Format ボックスで適切なデータフォーマットを選択します。例えば、「HEX」を16進数、「UTF-8 String」を文字、「Binary」を2進数などに設定します。その後、 SUBSCRIBE をクリックします。
Arduino IDEに戻り、シリアルモニターを開いて、ボーレートを115200に設定し、「welcome」と入力してEnterキーを押します。
これで、「welcome」というメッセージがLightBlueアプリに表示されるはずです。
モバイルデバイスからシリアルモニターへ情報を送信するには、Send UUIDをクリックし、データフォーマットを「UTF-8 String」に設定してメッセージを書き込みます。
すると、シリアルモニターでそのメッセージが表示されるはずです。
どのように動作するのか?
このArduinoコードはESP32マイクロコントローラー向けに書かれており、Bluetooth Low Energy(BLE)デバイスと通信するために設定されます。
コードの簡単な要約は以下の通りです:
必要なライブラリをインクルード:コードはESP32でBluetooth Low Energy(BLE)を操作するために必要なライブラリをインクルードすることから始まります。
#include "BLEDevice.h" #include "BLEServer.h" #include "BLEUtils.h" #include "BLE2902.h"
グローバル変数:Bluetoothデバイス名(
bleName
)、受信テキストと最後のメッセージの時間を追跡するための変数、サービスとキャラクタリスティックのUUID、BLECharacteristic
オブジェクト(pCharacteristic
)を含む一連のグローバル変数が定義されます。// Define the Bluetooth device name const char *bleName = "ESP32_Bluetooth"; // Define the received text and the time of the last message String receivedText = ""; unsigned long lastMessageTime = 0; // Define the UUIDs of the service and characteristics #define SERVICE_UUID "your_service_uuid_here" #define CHARACTERISTIC_UUID_RX "your_rx_characteristic_uuid_here" #define CHARACTERISTIC_UUID_TX "your_tx_characteristic_uuid_here" // Define the Bluetooth characteristic BLECharacteristic *pCharacteristic;
セットアップ:
setup()
関数では、シリアルポートが115200のボーレートで初期化され、Bluetooth BLEの設定を行うsetupBLE()
関数が呼び出されます。void setup() { Serial.begin(115200); // Initialize the serial port setupBLE(); // Initialize the Bluetooth BLE }
メインループ:
loop()
関数では、BLE経由で文字列が受信された(つまり、receivedText
が空でない)場合、最後のメッセージから少なくとも1秒が経過しているとき、コードは受信した文字列をシリアルモニターに表示し、キャラクタリスティックの値を受信文字列に設定し、通知を送信し、その後で受信文字列をクリアします。シリアルポートでデータが利用可能な場合、改行文字が現れるまで文字列を読み取り、キャラクタリスティックの値をこの文字列に設定し、通知を送信します。void loop() { // When the received text is not empty and the time since the last message is over 1 second // Send a notification and print the received text if (receivedText.length() > 0 && millis() - lastMessageTime > 1000) { Serial.print("Received message: "); Serial.println(receivedText); pCharacteristic->setValue(receivedText.c_str()); pCharacteristic->notify(); receivedText = ""; } // Read data from the serial port and send it to BLE characteristic if (Serial.available() > 0) { String str = Serial.readStringUntil('\n'); const char *newValue = str.c_str(); pCharacteristic->setValue(newValue); pCharacteristic->notify(); } }
コールバック: ブルートゥース通信に関連するイベントを処理するための2つのコールバッククラス(
MyServerCallbacks
とMyCharacteristicCallbacks
)が定義されています。MyServerCallbacks
はBLEサーバーの接続状態(接続されているか切断されているか)に関連するイベントを処理するために使用されます。MyCharacteristicCallbacks
はBLEキャラクタリスティック上での書き込みイベントを処理するために使用され、つまり、接続されたデバイスがBLE経由でESP32に文字列を送信すると、それがキャプチャされreceivedText
に格納され、現在の時刻がlastMessageTime
に記録されます。// Define the BLE server callbacks class MyServerCallbacks : public BLEServerCallbacks { // Print the connection message when a client is connected void onConnect(BLEServer *pServer) { Serial.println("Connected"); } // Print the disconnection message when a client is disconnected void onDisconnect(BLEServer *pServer) { Serial.println("Disconnected"); } }; // Define the BLE characteristic callbacks class MyCharacteristicCallbacks : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { // When data is received, get the data and save it to receivedText, and record the time std::string value = pCharacteristic->getValue(); receivedText = String(value.c_str()); lastMessageTime = millis(); Serial.print("Received: "); Serial.println(receivedText); } };
BLEのセットアップ:
setupBLE()
関数では、BLEデバイスとサーバーが初期化され、サーバーのコールバックが設定され、定義されたUUIDを使用してBLEサービスが作成され、通知送信とデータ受信用のキャラクタリスティックが作成されサービスに追加され、キャラクタリスティックのコールバックが設定されます。最後に、サービスが開始され、サーバーがアドバタイジングを開始します。// Initialize the Bluetooth BLE void setupBLE() { BLEDevice::init(bleName); // Initialize the BLE device BLEServer *pServer = BLEDevice::createServer(); // Create the BLE server // Print the error message if the BLE server creation fails if (pServer == nullptr) { Serial.println("Error creating BLE server"); return; } pServer->setCallbacks(new MyServerCallbacks()); // Set the BLE server callbacks // Create the BLE service BLEService *pService = pServer->createService(SERVICE_UUID); // Print the error message if the BLE service creation fails if (pService == nullptr) { Serial.println("Error creating BLE service"); return; } // Create the BLE characteristic for sending notifications pCharacteristic = pService->createCharacteristic(CHARACTERISTIC_UUID_TX, BLECharacteristic::PROPERTY_NOTIFY); pCharacteristic->addDecodeor(new BLE2902()); // Add the decodeor // Create the BLE characteristic for receiving data BLECharacteristic *pCharacteristicRX = pService->createCharacteristic(CHARACTERISTIC_UUID_RX, BLECharacteristic::PROPERTY_WRITE); pCharacteristicRX->setCallbacks(new MyCharacteristicCallbacks()); // Set the BLE characteristic callbacks pService->start(); // Start the BLE service pServer->getAdvertising()->start(); // Start advertising Serial.println("Waiting for a client connection..."); // Wait for a client connection }
このコードにより、BLEを介してデータの双方向通信が可能です。しかし、LEDのオン/オフのような特定のハードウェアとのインタラクションには、受信した文字列を処理し、それに応じて動作する追加のコードが必要です。
7.2 Bluetoothを用いたRGB LEDの制御¶
このプロジェクトは以前のプロジェクト(7.1 Bluetooth)を拡張したもので、RGB LEDの設定と「led_off」、「red」、「green」などのカスタムコマンドを追加しています。これらのコマンドにより、LightBlueを使用してモバイルデバイスからのコマンドを送信することでRGB LEDを制御できます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは間違いなく便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
または、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
操作手順
回路を組み立てます。
esp32-starter-kit-main\c\codes\7.2_bluetooth_rgb_led
ディレクトリにある7.2_bluetooth_rgb_led.ino
ファイルを開くか、コードをArduino IDEにコピーします。UUIDの衝突を避けるため、Bluetooth SIGが提供する Online UUID Generator を使ってランダムに3つの新しいUUIDを生成し、コードの以下の行に記入することをお勧めします。
注釈
もし 7.1 Bluetooth プロジェクトで既に3つの新しいUUIDを生成している場合は、それらを引き続き使用できます。
#define SERVICE_UUID "your_service_uuid_here" #define CHARACTERISTIC_UUID_RX "your_rx_characteristic_uuid_here" #define CHARACTERISTIC_UUID_TX "your_tx_characteristic_uuid_here"
正しいボードとポートを選択し、 アップロード ボタンをクリックします。
コードが正常にアップロードされた後、モバイルデバイスの Bluetooth をオンにし、 LightBlue アプリを開きます。
Scan ページで ESP32-Bluetooth を見つけ、 CONNECT をクリックします。見つからない場合は、数回ページを更新してみてください。 「Connected to device!」 と表示されると、Bluetooth接続が成功しています。コードで設定された3つのUUIDを見るために下にスクロールします。
送信用UUIDをタップし、データ形式を"UTF-8 String"に設定します。これで、「led_off」、「red」、「green」、「blue」、「yellow」、「purple」というコマンドを書き込んで、RGB LEDがこれらの指示に反応するかどうかを確認できます。
どのように動作するのか?
このコードは、以前のプロジェクト(7.1 Bluetooth)の拡張版であり、RGB LED設定と「led_off」、「red」、「green」などのカスタムコマンドを追加しています。これらのコマンドにより、LightBlueを使用してモバイルデバイスからのコマンドを送信することでRGB LEDを制御できます。
コードをステップバイステップで分解してみましょう:
RGB LEDピン、PWMチャンネル、周波数、解像度に関する新しいグローバル変数を追加します。
... // Define RGB LED pins const int redPin = 27; const int greenPin = 26; const int bluePin = 25; // Define PWM channels const int redChannel = 0; const int greenChannel = 1; const int blueChannel = 2; ...
setup()
関数内では、PWMチャンネルが定義済みの周波数と解像度で初期化されます。次に、RGB LEDのピンをそれぞれのPWMチャンネルに割り当てます。void setup() { ... // Set up PWM channels ledcSetup(redChannel, freq, resolution); ledcSetup(greenChannel, freq, resolution); ledcSetup(blueChannel, freq, resolution); // Attach pins to corresponding PWM channels ledcAttachPin(redPin, redChannel); ledcAttachPin(greenPin, greenChannel); ledcAttachPin(bluePin, blueChannel); }
MyCharacteristicCallbacks
クラスのonWrite
メソッドを変更します。この関数は、Bluetooth接続から来るデータを監視します。受信した文字列(「led_off」
,「red」
,「green」
など)に基づいて、RGB LEDを制御します。// Define the BLE characteristic callbacks class MyCharacteristicCallbacks : public BLECharacteristicCallbacks { void onWrite(BLECharacteristic *pCharacteristic) { std::string value = pCharacteristic->getValue(); if (value == "led_off") { setColor(0, 0, 0); // turn the RGB LED off Serial.println("RGB LED turned off"); } else if (value == "red") { setColor(255, 0, 0); // Red Serial.println("red"); } else if (value == "green") { setColor(0, 255, 0); // green Serial.println("green"); } else if (value == "blue") { setColor(0, 0, 255); // blue Serial.println("blue"); } else if (value == "yellow") { setColor(255, 150, 0); // yellow Serial.println("yellow"); } else if (value == "purple") { setColor(80, 0, 80); // purple Serial.println("purple"); } } };
最後に、RGB LEDの色を設定する関数を追加します。
void setColor(int red, int green, int blue) { // For common-anode RGB LEDs, use 255 minus the color value ledcWrite(redChannel, red); ledcWrite(greenChannel, green); ledcWrite(blueChannel, blue); }
要約すると、このスクリプトはリモートコントロールの対話モデルを実現します。ここではESP32がBluetooth Low Energy (BLE) サーバーとして動作します。
接続されたBLEクライアント(スマートフォンなど)は文字列のコマンドを送信してRGB LEDの色を変更することができます。ESP32は実行された操作をクライアントに知らせるために受信した文字列をクライアントに返信し、フィードバックを与えます。
7.3 Bluetooth Audio Player¶
このプロジェクトの目的は、ESP32の内蔵DACを使ってBluetooth対応デバイスから音声を再生するシンプルな解決策を提供することです。
このプロジェクトでは、 ESP32-A2DP
ライブラリを使用してBluetooth対応デバイスから音声データを受信します。受信した音声データは、I2Sインターフェイスを使用してESP32の内部DACに送信されます。I2Sインターフェイスは、マスターモード、トランスミットモード、DAC内蔵モードで動作するように設定されます。その後、DACに接続されたスピーカーから音声データが再生されます。
ESP32の内部DACを使用する場合、出力電圧レベルは1.1Vに限定されていることに注意が必要です。そのため、出力電圧レベルを望ましいレベルまで増幅するために外部アンプを使用することを推奨します。また、再生時に歪みやノイズが発生しないように、音声データが正しい形式とサンプルレートであることを確認することも重要です。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
全てのキットを買うのが便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
または、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
操作手順
回路を組み立てます。
これはモノラルアンプなので、オーディオアンプモジュールのLまたはRピンにIO25を接続できます。
10K抵抗は、高周波ノイズを低減し、オーディオのボリュームを下げるために使用されます。これはDACとオーディオアンプの寄生容量とRCローパスフィルタを形成し、高周波信号の振幅を減少させ、高周波ノイズを効果的に減少させます。そのため、10K抵抗を追加すると音楽がより柔らかく聞こえ、望ましくない高周波ノイズを排除します。
SDカードの音楽が既に十分に柔らかい場合は、抵抗を取り外すか、小さい値の抵抗に置き換えることができます。
コードを開きます。
esp32-starter-kit-main\c\codes\7.3_bluetooth_audio_player
のパスの下にある7.3_bluetooth_audio_player.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
ESP32-A2DP
ライブラリを使用しています。インストールのチュートリアルについては 手動でのインストール を参照してください。
正しいボードとポートを選択した後、アップロードボタンをクリックします。
コードのアップロードが成功したら、Bluetooth対応デバイスをオンにして利用可能なデバイスを検索し、
ESP32_Bluetooth
に接続します。デバイスで音声を再生すると、ESP32に接続されたスピーカーから音声が出力されるはずです。
コードの説明
このコードは、Bluetooth対応デバイスからのオーディオデータを受信するために使用される
BluetoothA2DPSink.h
ライブラリを含めることから始まります。そして、I2Sインターフェースの設定でBluetoothA2DPSink
オブジェクトが作成され、構成されます。#include "BluetoothA2DPSink.h" BluetoothA2DPSink a2dp_sink;
setup関数内では、I2S(Inter-IC Sound)インターフェース用の望ましい構成で
i2s_config_t struct
が初期化されます。void setup() { const i2s_config_t i2s_config = { .mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_DAC_BUILT_IN), .sample_rate = 44100, // corrected by info from bluetooth .bits_per_sample = (i2s_bits_per_sample_t) 16, // the DAC module will only take the 8bits from MSB .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT, .communication_format = (i2s_comm_format_t)I2S_COMM_FORMAT_STAND_MSB, .intr_alloc_flags = 0, // default interrupt priority .dma_buf_count = 8, .dma_buf_len = 64, .use_apll = false }; a2dp_sink.set_i2s_config(i2s_config); a2dp_sink.start("ESP32_Bluetooth"); }
I2Sインターフェースは、デバイス間でデジタルオーディオデータを転送するために使用されます。
構成には
I2S mode
、sample rate
、bits per sample
、channel format
、communication format
、interrupt allocation flags
、DMA buffer count
、DMA buffer length
、およびAPLL(オーディオPLL)を使用するかどうかが含まれます。この
i2s_config_t struct
は、オーディオ再生用のI2Sインターフェースを設定するためにBluetoothA2DPSink
オブジェクトのset_i2s_config
関数に引数として渡されます。BluetoothA2DPSink
オブジェクトのstart
関数が呼び出され、Bluetoothオーディオシンクが開始され、内蔵DACを通じてオーディオの再生が始まります。
7.4 SDカードの書き込みと読み込み¶
このプロジェクトは、ESP32マイクロコントローラを使用してSDカードを操作する基本機能を実演しています。 SDカードのマウント、ファイルの作成、データのファイルへの書き込み、 ルートディレクトリ内の全ファイルのリストアップなどの基本操作を紹介します。これらの操作は多くのデータロギングやストレージ アプリケーションの基盤となるため、ESP32の内蔵SDMMCホスト周辺機器の理解と活用において、このプロジェクトは重要なステップです。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが間違いなく便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
操作手順
USBケーブルを接続する前に、SDカードを拡張ボードのSDカードスロットに挿入します。
USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
Arduino IDEで適切なポートとボードを選択し、コードをESP32にアップロードします。
注釈
esp32-starter-kit-main\c\codes\7.4_sd_read_write
のパスの下にある7.4_sd_read_write.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択したら、 アップロード ボタンをクリックします。
コードが正常にアップロードされると、成功したファイルの書き込みを示すプロンプトが表示され、SDカードにあるすべてのファイル名とサイズのリストが表示されます。シリアルモニタを開いても何も表示されない場合は、EN(RST)ボタンを押してコードを再実行する必要があります。
注釈
以下の情報が表示された場合。
E (528) vfs_fat_sdmmc: mount_to_vfs failed (0xffffffff). SDカードのマウントに失敗しました
まず、SDカードが拡張ボードに適切に挿入されているか確認してください。
正しく挿入されている場合、SDカードに問題がある可能性があります。金属接点を消しゴムできれいにするとよいでしょう。
問題が解決しない場合は、SDカードをフォーマットすることをお勧めします。詳細は SDカードをフォーマットする方法は? を参照してください。
どのように動作するのか?
このプロジェクトの目的は、ESP32ボードとSDカードを使用する方法を実演することです。ESP32の内蔵SDMMCホスト周辺機器を使用してSDカードに接続します。
プロジェクトはシリアル通信の初期化から始まり、次にSDカードのマウントを試みます。SDカードが正常にマウントされない場合、プログラムはエラーメッセージを出力し、セットアップ機能を終了します。
SDカードが正常にマウントされると、プログラムはSDカードのルートディレクトリに"test.txt"という名前のファイルを作成します。ファイルが書き込みモードで正常に開かれた場合、プログラムはファイルに「Hello, world!」というテキスト行を書き込みます。書き込み操作が成功すると、プログラムは成功メッセージを出力します。そうでない場合は、エラーメッセージが出力されます。
書き込み操作が完了すると、プログラムはファイルを閉じ、次にSDカードのルートディレクトリを開きます。そして、ルートディレクトリのすべてのファイルをループし、見つかった各ファイルのファイル名とファイルサイズを出力します。
メインループ機能には操作はありません。このプロジェクトは、カードのマウント、ファイルの作成、ファイルへの書き込み、ファイルディレクトリの読み取りなど、セットアップ機能で実行されるSDカード操作に焦点を当てています。
このプロジェクトは、データログやストレージが必要なアプリケーションでのESP32を使用したSDカードの取り扱いについての有用な導入となります。
以下はコードの分析です:
SD_MMC
ライブラリを含めます。これはESP32の内蔵SDMMCホスト周辺機器を使用してSDカードを操作するために必要です。#include "SD_MMC.h"
setup()
関数内では、以下のタスクが実行されます。SDカードの初期化
SDカードを初期化し、マウントします。SDカードがマウントに失敗した場合、シリアルモニターに「SDカードのマウントに失敗しました」と表示し、実行を停止します。
if(!SD_MMC.begin()) { // Attempt to mount the SD card Serial.println("Failed to mount card"); // If mount fails, print to serial and exit setup return; }
ファイルを開く
SDカードのルートディレクトリにある
「test.txt」
という名前のファイルを書き込みモードで開きます。ファイルが開けなかった場合、「書き込み用ファイルを開けませんでした」と表示し、処理を戻します。File file = SD_MMC.open("/test.txt", FILE_WRITE); if (!file) { Serial.println("Failed to open file for writing"); // Print error message if file failed to open return; }
ファイルにデータを書き込む
「Test file write」というテキストをファイルに書き込みます。 書き込み操作が成功した場合は、「ファイルの書き込みに成功しました」と表示されます。そうでない場合は、「ファイルの書き込みに失敗しました」と表示されます。
if(file.print("Test file write")) { // Write the message to the file Serial.println("File write success"); // If write succeeds, print to serial } else { Serial.println("File write failed"); // If write fails, print to serial }
ファイルを閉じる
開いたファイルを閉じます。これにより、バッファリングされたデータがファイルに書き込まれ、ファイルが適切に閉じられます。
file.close(); // Close the file
ルートディレクトリを開く
SDカードのルートディレクトリを開きます。ディレクトリが開けなかった場合、「ディレクトリを開けませんでした」と表示し、処理を戻します。
File root = SD_MMC.open("/"); // Open the root directory of SD card if (!root) { Serial.println("Failed to open directory"); // Print error message if directory failed to open return; }
各ファイルの名前とサイズを出力する
while (
File file = root.openNextFile()
) で始まるループは、ルートディレクトリ内の全ファイルを繰り返し処理し、 各ファイルの名前とサイズをシリアルモニターに出力します。Serial.println("Files found in root directory:"); // Print the list of files found in the root directory while (File file = root.openNextFile()) { // Loop through all the files in the root directory Serial.print(" "); Serial.print(file.name()); // Print the filename Serial.print("\t"); Serial.println(file.size()); // Print the filesize file.close(); // Close the file }
この
loop()
関数は空のループであり、現在のプログラムでは何も行いません。通常のArduinoプログラムでは、この関数は繰り返しコードを実行します。しかし、必要なタスクはすべてsetup関数で実行されているため、loop関数は不要です。void loop() {} // Empty loop function, does nothing
7.5 SDカード対応MP3プレーヤー¶
ESP32で音楽の世界へようこそ!このプロジェクトでは、あなたの指先でオーディオ処理のパワーを体験できます。ESP32は計算用の素晴らしいマイクロコントローラーだけでなく、あなた専用の音楽プレーヤーにもなります。自分の部屋に入ると、この小さなデバイスからお気に入りのトラックが流れてくるのを想像してみてください。それが、今日、私たちがあなたに提供するパワーです。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが確かに便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
操作手順
カードリーダーを使ってSDカードをコンピュータに挿入し、フォーマットしてください。 SDカードをフォーマットする方法は? のチュートリアルを参照してください。
お気に入りのMP3ファイルをSDカードにコピーします。
SDカードを拡張ボードのSDカードスロットに挿入します。
回路を組み立てます。
これはモノラルアンプなので、IO25をオーディオアンプモジュールのLまたはRピンに接続できます。
10K抵抗は、高周波ノイズを減らし、オーディオボリュームを下げるために使用されます。これは、DACとオーディオアンプの寄生容量とのRCローパスフィルターを形成します。このフィルターは、高周波信号の振幅を減少させ、効果的に高周波ノイズを低減します。そのため、10K抵抗を加えることで、音楽を柔らかく聞こえさせ、望ましくない高周波ノイズを排除します。
SDカードの音楽がすでに柔らかい場合、抵抗を取り外したり、より小さい値のものに交換できます。
USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
コードを変更します。
file = new AudioFileSourceSD_MMC("/To Alice.mp3")
の行を、あなたのファイル名とパスに合わせて変更してください。注釈
esp32-starter-kit-main\c\codes\7.5_mp3_player_sd
のパスの下にある7.5_mp3_player_sd.ino
ファイルを開くか、このコードを Arduino IDE にコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
ESP8266Audio
ライブラリが使用されています。インストールのチュートリアルについては、 手動でのインストール を参照してください。
Arduino IDEで適切なポートとボードを選択し、ESP32にコードをアップロードします。
コードのアップロードに成功すると、お気に入りの音楽が再生されます。
どのように動作するのか?
コードは
ESP8266Audio
ライブラリの複数のクラスを使用して、SDカードからMP3ファイルをI2Sを通じて再生します。#include "AudioFileSourceSD_MMC.h" #include "AudioOutputI2S.h" #include "AudioGeneratorMP3.h" #include "SD_MMC.h" #include "FS.h"
AudioGeneratorMP3
はMP3オーディオをデコードするクラスです。AudioFileSourceSD_MMC
はSDカードからオーディオデータを読み取るクラスです。AudioOutputI2S
はオーディオデータをI2Sインターフェースに送信するクラスです。
setup()
関数では、SDカードを初期化し、SDカードからMP3ファイルを開き、ESP32の内蔵DACでI2S出力を設定し、出力をモノラルに設定し、MP3ジェネレータを開始します。void setup() { // Start the serial communication. Serial.begin(115200); delay(1000); // Initialize the SD card. If it fails, print an error message. if (!SD_MMC.begin()) { Serial.println("SD card mount failed!"); } // Open the MP3 file from the SD card. Replace "/To Alice.mp3" with your own MP3 file name. file = new AudioFileSourceSD_MMC("/To Alice.mp3"); // Set up the I2S output on ESP32's internal DAC. out = new AudioOutputI2S(0, 1); // Set the output to mono. out->SetOutputModeMono(true); // Initialize the MP3 generator with the file and output. mp3 = new AudioGeneratorMP3(); mp3->begin(file, out); }
loop()
関数では、MP3ジェネレータが実行中であるかを確認します。実行中であれば、それを継続してループさせます。そうでない場合は、それを停止し、シリアルモニターに「MP3終了」と表示します。void loop() { // If the MP3 is running, loop it. Otherwise, stop it. if (mp3->isRunning()) { if (!mp3->loop()) mp3->stop(); } // If the MP3 is not running, print a message and wait for 1 second. else { Serial.println("MP3 done"); delay(1000); } }
7.6 SDカードで写真を撮る¶
この文書は、ESP32-CAMを使用して写真を撮り、SDカードに保存するプロジェクトについて説明しています。 このプロジェクトの目的は、ESP32-CAMを使用して画像をキャプチャし、SDカードに保存する簡単なソリューションを提供することです。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが確かに便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
関連する注意事項
ESP32-CAMを使用する際には、スケッチをアップロードするためにGPIO 0ピンをGNDに接続する必要があることに注意してください。 また、GPIO 0をGNDに接続した後、ESP32-CAMのオンボードRESETボタンを押して、ボードをフラッシュモードにする必要があります。 画像をSDカードに保存する前に、SDカードが適切にマウントされていることも重要です。
操作手順
カードリーダーを使ってSDカードをコンピュータに挿入し、その後フォーマットします。 SDカードをフォーマットする方法は? のチュートリアルを参照してください。
カードリーダーを取り外し、SDカードを拡張ボードに挿入します。
今度は、カメラを接続します。
USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
コードを開きます。
注釈
esp32-starter-kit-main\c\codes\7.6_take_photo_sd
のパスの下にある7.6_take_photo_sd.ino
ファイルを開きます。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
今度は、 PSRAM を有効にします。
パーティションスキームを Huge APP (3MB No OTA/1MB SPIFFS) に設定します。
Arduino IDEで適切なポートとボードを選択し、ESP32にコードをアップロードします。
コードのアップロードに成功したら、 Reset ボタンを押して写真を撮ります。また、シリアルモニターで以下の情報が表示されていることを確認して、成功したキャプチャを見ることができます。
Picture file name: /picture9.jpg Saved file to path: /picture9.jpg Going to sleep now
今度は、拡張ボードからSDカードを取り外し、コンピュータに挿入します。撮ったばかりの写真を見ることができます。
どのように動作するのか?
このコードは、AI Thinker ESP32-CAMを操作して写真を撮り、SDカードに保存し、その後ESP32-CAMをディープスリープ状態にします。主な部分の概要は以下の通りです:
Libraries:コードは、ESP32-CAM、ファイルシステム(FS)、SDカード、EEPROM(電源サイクルをまたいでデータを保存するために使用)に必要なライブラリを含めて開始します。
#include "esp_camera.h" #include "Arduino.h" #include "FS.h" // SD Card ESP32 #include "SD_MMC.h" // SD Card ESP32 #include "soc/soc.h" // Disable brownour problems #include "soc/rtc_cntl_reg.h" // Disable brownour problems #include "driver/rtc_io.h" #include <EEPROM.h> // read and write from flash memory
Pin Definitions:このセクションでは、ESP32-CAMのカメラモジュールへのピン接続を表す定数を設定します。
#define PWDN_GPIO_NUM 32 #define RESET_GPIO_NUM -1 #define XCLK_GPIO_NUM 0 #define SIOD_GPIO_NUM 26 #define SIOC_GPIO_NUM 27 #define Y9_GPIO_NUM 35 #define Y8_GPIO_NUM 34 #define Y7_GPIO_NUM 39 #define Y6_GPIO_NUM 36 #define Y5_GPIO_NUM 21 #define Y4_GPIO_NUM 19 #define Y3_GPIO_NUM 18 #define Y2_GPIO_NUM 5 #define VSYNC_GPIO_NUM 25 #define HREF_GPIO_NUM 23 #define PCLK_GPIO_NUM 22
Global Variables: グローバル変数
pictureNumber
は、撮影してSDカードに保存した写真の枚数を追跡するために宣言されています。int pictureNumber = 0;
Setup Function:
setup()
関数では、いくつかのタスクが達成されます:まず、カメラが操作中にESP32-CAMがリセットされるのを防ぐために、ブラウンアウト検出器を無効にします。
WRITE_PERI_REG(RTC_CNTL_BROWN_OUT_REG, 0); //disable brownout detector
デバッグ用にシリアル通信を初期化します。
Serial.begin(115200);
GPIOピン、XCLK周波数、ピクセルフォーマット、フレームサイズ、JPEG品質、フレームバッファカウントなどを含むカメラ設定が
camera_config_t
で設定されます。camera_config_t config; config.ledc_channel = LEDC_CHANNEL_0; config.ledc_timer = LEDC_TIMER_0; config.pin_d0 = Y2_GPIO_NUM; config.pin_d1 = Y3_GPIO_NUM; config.pin_d2 = Y4_GPIO_NUM; config.pin_d3 = Y5_GPIO_NUM; config.pin_d4 = Y6_GPIO_NUM; config.pin_d5 = Y7_GPIO_NUM; config.pin_d6 = Y8_GPIO_NUM; config.pin_d7 = Y9_GPIO_NUM; config.pin_xclk = XCLK_GPIO_NUM; config.pin_pclk = PCLK_GPIO_NUM; config.pin_vsync = VSYNC_GPIO_NUM; config.pin_href = HREF_GPIO_NUM; config.pin_sscb_sda = SIOD_GPIO_NUM; config.pin_sscb_scl = SIOC_GPIO_NUM; config.pin_pwdn = PWDN_GPIO_NUM; config.pin_reset = RESET_GPIO_NUM; config.xclk_freq_hz = 20000000; config.pixel_format = PIXFORMAT_JPEG;
次に、設定でカメラを初期化し、失敗した場合はエラーメッセージを出力します。
esp_err_t err = esp_camera_init(&config); if (err != ESP_OK) { Serial.printf("Camera init failed with error 0x%x", err); return; }
SDカードを初期化し、失敗した場合はエラーメッセージを出力します。
if (!SD_MMC.begin()) { Serial.println("SD Card Mount Failed"); return; } uint8_t cardType = SD_MMC.cardType(); if (cardType == CARD_NONE) { Serial.println("No SD Card attached"); return; }
カメラで写真を撮り、フレームバッファに保存します。
fb = esp_camera_fb_get(); if (!fb) { Serial.println("Camera capture failed"); return; }
EEPROMを読み出して最後の写真の番号を取得し、新しい写真の番号を増やします。
EEPROM.begin(EEPROM_SIZE); pictureNumber = EEPROM.read(0) + 1;
新しい写真のためにSDカード上にパスを作成し、写真番号に対応するファイル名で保存します。
String path = "/picture" + String(pictureNumber) + ".jpg"; fs::FS &fs = SD_MMC; Serial.printf("Picture file name: %s\n", path.c_str());
写真を保存した後、次の電源サイクルで取得するために写真番号をEEPROMに戻して保存します。
File file = fs.open(path.c_str(), FILE_WRITE); if (!file) { Serial.println("Failed to open file in writing mode"); } else { file.write(fb->buf, fb->len); // payload (image), payload length Serial.printf("Saved file to path: %s\n", path.c_str()); EEPROM.write(0, pictureNumber); EEPROM.commit(); } file.close(); esp_camera_fb_return(fb);
最後に、オンボードLED(フラッシュ)を消して、ESP32-CAMをディープスリープ状態にします。
pinMode(4, OUTPUT); digitalWrite(4, LOW); rtc_gpio_hold_en(GPIO_NUM_4);
スリープモード: ESP32-CAMは、各写真を撮った後に電力を節約するためにディープスリープに入ります。リセットボタンを押すか、特定のピンにシグナルを送ることで起動できます。
delay(2000); Serial.println("Going to sleep now"); delay(2000); esp_deep_sleep_start(); Serial.println("This will never be printed");
ループ関数:
loop()
関数は空です。セットアッププロセスの後で、ESP32-CAMはすぐにディープスリープに入ります。
このコードが機能するためには、スケッチをアップロードする時にGPIO 0がGNDに接続されていることを確認し、ボードをフラッシュモードにするためにオンボードRESETボタンを押す必要があるかもしれません。また、"/picture"をあなたのファイル名に置き換えてください。EEPROMのサイズは1に設定されており、0から255までの値を保存できます。255枚以上の写真を撮る予定がある場合は、EEPROMのサイズを増やし、写真番号をどのように保存し、読み出すかを調整する必要があります。
8. Bluetooth & SDカード & カメラ & スピーカー
8.1 @OpenWeatherMapからのリアルタイム天気情報¶
IoTオープンウェザーディスプレイプロジェクトは、ESP32ボードとI2C LCD1602モジュールを使用して、OpenWeatherMap APIからデータを取得する天気情報ディスプレイを作成します。
このプロジェクトは、APIの使用、Wi-Fi接続、ESP32ボードを使用したLCDモジュール上でのデータ表示に関する素晴らしい入門となります。IoTオープンウェザーディスプレイを使用すれば、一目でリアルタイムの天気更新情報にアクセスできるため、家庭やオフィス環境に理想的なソリューションです。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが間違いなく便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
OpenWeather APIキーを取得
OpenWeather は、OpenWeather Ltdが所有するオンラインサービスで、APIを介して現在の天気データ、予報、今予報、任意の地理的位置の過去の天気データなど、グローバルな天気データを提供しています。
OpenWeather にアクセスして、ログイン/アカウントを作成します。
ナビゲーションバーからAPIページに移動します。
Current Weather Data を見つけてサブスクライブをクリックします。
Current weather and forecasts collection の下で、適切なサービスにサブスクライブします。このプロジェクトでは無料プランで十分です。
API keys ページからキーをコピーします。
デバイスを完成させる
回路を組み立てます。
コードを開きます。
esp32-starter-kit-main\c\codes\iot_1_open_weather
ディレクトリ内にあるiot_1_open_weather.ino
ファイルを開くか、Arduino IDEにコードをコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
LiquidCrystal I2C
とArduino_JSON
ライブラリが使用されており、 Library Manager からインストールできます。
次の行を見つけて、あなたの
<SSID>
と<PASSWORD>
で修正してください。// Replace the next variables with your SSID/Password combination const char* ssid = "<SSID>"; const char* password = "<PASSWORD>";
以前にコピーしたAPIキーを
openWeatherMapApiKey
に入力してください。// Your Domain name with URL path or IP address with path String openWeatherMapApiKey = "<openWeatherMapApiKey>";
あなたの国コードと市を置き換えてください。
// Replace with your country code and city // Fine the country code by https://openweathermap.org/find String city = "<CITY>"; String countryCode = "<COUNTRY CODE>";
コードが実行された後、I2C LCD1602にあなたの位置の時間と天気情報が表示されます。
注釈
コードが実行されているとき、画面が空白の場合は、モジュールの背面にあるポテンショメーターを回してコントラストを上げることができます。
8.2 カメラウェブサーバー¶
このプロジェクトは、ESP32ボードとカメラモジュールを組み合わせて、ローカルネットワーク上で高品質のビデオをストリーム配信します。 自分だけのカメラシステムを簡単に設定し、リアルタイムで任意の場所を監視できます。
プロジェクトのウェブインターフェイスを使用すると、ネットワークに接続された任意のデバイスからカメラのフィードにアクセスして制御できます。 カメラ設定をカスタマイズしてストリーミング体験を最適化し、ユーザーフレンドリーなインターフェイスで設定を簡単に調整できます。
多用途に対応したESP32カメラストリーミングプロジェクトで、監視またはライブストリーミングの機能を向上させましょう。自宅、オフィス、または任意の場所を容易にかつ確実に監視できます。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
どうやって行うのか?
まず、カメラを接続します。
次に、USBケーブルを使ってESP32-WROOM-32Eをコンピューターに接続します。
コードを開きます。
esp32-starter-kit-main\c\codes\iot_2_camera_server
ディレクトリ内にあるiot_2_camera_server.ino
ファイルを開くか、Arduino IDEにコードをコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
次の行を見つけて、あなたの
<SSID>
と<PASSWORD>
で修正してください。// Replace the next variables with your SSID/Password combination const char* ssid = "<SSID>"; const char* password = "<PASSWORD>";
今度は、 PSRAM を有効にします。
パーティションスキームを Huge APP (3MB No OTA/1MB SPIFFS) に設定します。
正しいボード(ESP32 Dev Module)とポートを選択した後、"アップロード"ボタンをクリックします。
シリアルモニターで成功したWiFi接続のメッセージと割り当てられたIPアドレスが表示されます。
..... WiFi connected Starting web server on port: '80' Starting stream server on port: '81' Camera Ready! Use 'http://192.168.18.77' to connect
WebブラウザでIPアドレスを入力します。 Start Stream をクリックしてカメラのフィードを表示できるウェブインターフェイスが表示されます。
ページの一番上までスクロールバックします。そこでは、ライブカメラフィードが見られます。インターフェイスの左側で設定を調整できます。
注釈
このESP32モジュールは顔検出をサポートしています。有効にするには、解像度を240x240に設定し、インターフェイスの下部にある顔検出オプションを切り替えます。
このESP32モジュールは顔認識をサポートしていません。
8.3 カスタムビデオストリーミングウェブサーバー¶
カスタムビデオストリーミングウェブサーバープロジェクトは、ウェブページをゼロから作成し、ビデオストリームを再生するためのカスタマイズ方法を学ぶ機会を提供します。さらに、LEDの明るさを制御するためのONとOFFのようなインタラクティブなボタンを取り入れることができます。
このプロジェクトを構築することで、ウェブ開発、HTML、CSS、JavaScriptの実践経験を得ることができます。リアルタイムでビデオストリームを表示できるレスポンシブなウェブページを作成する方法を学びます。さらに、インタラクティブなボタンを統合してLEDの状態を制御し、ダイナミックなユーザーエクスペリエンスを提供する方法を発見します。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが確かに便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
どのように実行しますか?
まずカメラを接続します。
回路を組み立てます。
次に、USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
コードを開きます。
esp32-starter-kit-main\c\codes\iot_3_html_cam_led
ディレクトリにあるiot_3_html_cam_led.ino
ファイルを開くか、Arduino IDEにコードをコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
次の行を見つけて、あなたの
<SSID>
と<PASSWORD>
で修正してください。// Replace the next variables with your SSID/Password combination const char* ssid = "<SSID>"; const char* password = "<PASSWORD>";
正しいボード(ESP32 Dev Module)とポートを選択した後、 アップロード ボタンをクリックします。
シリアルモニタで成功したWiFi接続のメッセージと割り当てられたIPアドレスが表示されます。
WiFi connected Camera Stream Ready! Go to: http://192.168.18.77
WebブラウザでIPアドレスを入力します。下記のウェブページが表示され、カスタマイズされたONとOFFボタンを使用してLEDを制御できます。
バッテリーを拡張ボードに挿入し、USBケーブルを取り外します。これで、Wi-Fi範囲内であればどこにでもデバイスを設置できます。
8.4 IoT通信とMQTT¶
このプロジェクトは、IoT(モノのインターネット)分野で人気のある通信プロトコルであるMQTTを活用することに焦点を当てています。MQTTは、IoTデバイスがトピックを通じてデータを交換するパブリッシュ/サブスクライブモデルを可能にします。
このプロジェクトでは、LED、ボタン、サーミスタを含む回路を構築することでMQTTの実装を探求します。ESP32-WROOM-32Eマイクロコントローラーは、Wi-Fiへの接続を確立し、MQTTブローカーと通信するために使用されます。コードにより、マイクロコントローラーは特定のトピックをサブスクライブし、メッセージを受信し、受信した情報に基づいてLEDを制御することができます。さらに、このプロジェクトは、ボタンが押されたときにサーミスタからの温度データを指定されたトピックに公開することを示しています。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
コードアップロード
回路を組み立てます。
注釈
Wi-Fiへの接続を確立する際には、36, 39, 34, 35, 32, 33ピンのみがアナログ読取りに使用できます。サーミスタがこれら指定されたピンに接続されていることを確認してください。
次に、USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
コードを開きます。
esp32-starter-kit-main\c\codes\iot_4_mqtt
ディレクトリにあるiot_4_mqtt.ino
ファイルを開くか、Arduino IDEにコードをコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
PubSubClient
ライブラリが使用されており、 Library Manager からインストールできます。
次の行を見つけて、あなたの
<SSID>
と<PASSWORD>
で修正してください。// Replace the next variables with your SSID/Password combination const char* ssid = "<SSID>"; const char* password = "<PASSWORD>";
次の行を見つけて、あなたの
unique_identifier
で修正してください。あなたのunique_identifier
が本当にユニークであることを保証してください。同一のIDを持つデバイスが同じMQTTブローカーにログインしようとすると、ログインに失敗する可能性があります。// Add your MQTT Broker address, example: const char* mqtt_server = "broker.hivemq.com"; const char* unique_identifier = "sunfounder-client-sdgvsda";
トピックのサブスクリプション
他の参加者からのメッセージの干渉を避けるために、目立たない、または一般的でない文字列として設定できます。現在のトピック
SF/LED
を、あなたの望むトピック名に単純に置き換えてください。注釈
トピックは、あなたが望むどんな文字にも設定できます。同じトピックにサブスクライブしたMQTTデバイスは、同じメッセージを受け取ることができます。また、複数のトピックに同時にサブスクライブすることもできます。
void reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(unique_identifier)) { Serial.println("connected"); // Subscribe client.subscribe("SF/LED"); } else { Serial.print("failed, rc="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } } }
サブスクライブしているトピックに応答する機能を変更します。提供されたコードでは、トピック
SF/LED
でメッセージを受信すると、on
またはoff
かどうかを確認します。受信したメッセージに応じて、LEDのオン/オフ状態を制御する出力状態を変更します。注釈
サブスクライブしている任意のトピックに対して変更できますし、複数のトピックに対応するために複数のif文を書くこともできます。
void callback(char* topic, byte* message, unsigned int length) { Serial.print("Message arrived on topic: "); Serial.print(topic); Serial.print(". Message: "); String messageTemp; for (int i = 0; i < length; i++) { Serial.print((char)message[i]); messageTemp += (char)message[i]; } Serial.println(); // If a message is received on the topic "SF/LED", you check if the message is either "on" or "off". // Changes the output state according to the message if (String(topic) == "SF/LED") { Serial.print("Changing state to "); if (messageTemp == "on") { Serial.println("on"); digitalWrite(ledPin, HIGH); } else if (messageTemp == "off") { Serial.println("off"); digitalWrite(ledPin, LOW); } } }
正しいボード(ESP32 Dev Module)とポートを選択した後、 アップロード ボタンをクリックします。
シリアルモニターを開いて、以下の情報が表示されれば、MQTTサーバーへの接続が成功したことを意味します。
WiFi connected IP address: 192.168.18.77 Attempting MQTT connection...connected
HiveMQを通じたメッセージ公開
HiveMQは、MQTTブローカーとして機能するメッセージングプラットフォームで、IoTデバイスへの迅速で効率的かつ信頼性の高いデータ転送を促進します。
私たちのコードは、HiveMQが提供するMQTTブローカーを具体的に利用しています。コード内には、HiveMQのMQTTブローカーのアドレスが次のように含まれています:
// Add your MQTT Broker address, example: const char* mqtt_server = "broker.hivemq.com";
現在、Webブラウザで HiveMQ Web Client を開きます。
クライアントをデフォルトの公開プロキシに接続します。
サブスクライブしたトピックでメッセージを公開します。このプロジェクトでは、
on
またはoff
を公開してLEDを制御できます。
MQTTへのメッセージ公開
コードを使用してトピックに情報を公開することもできます。このデモでは、ボタンを押したときにサーミスタで測定した温度をトピックに送信する機能をコーディングしました。
Add New Topic Subscription をクリックします。
フォローしたいトピックを入力して、 サブスクライブ をクリックします。コードでは、温度情報をトピック
SF/TEMP
に送信しています。void loop() { if (!client.connected()) { reconnect(); } client.loop(); // if the button pressed, publish the temperature to topic "SF/TEMP" if (digitalRead(buttonPin)) { long now = millis(); if (now - lastMsg > 5000) { lastMsg = now; char tempString[8]; dtostrf(thermistor(), 1, 2, tempString); client.publish("SF/TEMP", tempString); } } }
これで、HiveMQでこのトピックを監視することができ、公開した情報を見ることができます。
8.5 CheerLights¶
CheerLightsは、誰でも制御できる同期したライトのグローバルネットワークです。
@CheerLights のLEDカラーチェンジコミュニティに参加し、世界中のLEDが同時に色を変えることができます。
オフィスの一角にLEDを置いて、自分が一人ではないことを思い出せます。
このケースでは、MQTTを利用しますが、自分自身のメッセージを公開する代わりに、「cheerlights」トピックをサブスクライブします。これにより、「cheerlights」トピックに他の人が送信したメッセージを受信し、その情報に基づいて自分のLEDストリップの色を変更することができます。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが間違いなく便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
どのように実行しますか?
回路を組み立てます。
次に、USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
コードを開きます。
esp32-starter-kit-main\c\codes\iot_5_cheerlights
ディレクトリにあるiot_5_cheerlights.ino
ファイルを開くか、Arduino IDEにコードをコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
PubSubClient
とAdafruit_NeoPixel
ライブラリが使用されており、 Library Manager からインストールできます。
次の行を見つけて、あなたの
<SSID>
と<PASSWORD>
で修正してください。// Replace the next variables with your SSID/Password combination const char* ssid = "<SSID>"; const char* password = "<PASSWORD>";
次の行を見つけて、あなたの
unique_identifier
で修正してください。unique_identifier
が本当にユニークであることを保証してください。同一のIDを持つデバイスが同じ MQTT Broker にログインしようとすると、ログインに失敗する可能性があります。// Add your MQTT Broker address: const char* mqtt_server = "mqtt.cheerlights.com"; const char* unique_identifier = "sunfounder-client-sdgvsasdda";
正しいボード(ESP32 Dev Module)とポートを選択した後、 アップロード ボタンをクリックします。
この時点で、RGBストリップが特定の色を表示していることがわかります。デスクに置いてみると、定期的に色が変わるのが分かります。これは他の@CheerLightsフォロワーがあなたのライトの色を変えているからです!
シリアルモニターを開きます。次のようなメッセージが表示されます:
WiFi connected
IP address:
192.168.18.77
Attempting MQTT connection...connected
Message arrived on topic: cheerlights.
Message: oldlace
Changing color to oldlace
グローバルな@CheerLightsデバイスを制御する
Discord Server に参加して、CheerLightsボットを使用して色を設定してください。 CheerLights Discordサーバー のチャンネルで
/cheerlights
と入力するだけでボットが起動します。ボットが提供する指示に従って色を設定してください。これにより、グローバルにCheerLightsデバイスを制御できます。
8.6 Adafruit IOを使った温度と湿度のモニタリング¶
このプロジェクトでは、人気のあるIoTプラットフォームの使用方法を案内します。プログラミング愛好家向けに、オンラインで多くの無料(または低コスト)プラットフォームが利用可能です。例としてはAdafruit IO、Blynk、Arduino Cloud、ThingSpeakなどがあります。これらのプラットフォームの使用方法は非常に似ています。ここでは、Adafruit IOに焦点を当てます。
DHT11センサーを使用して温度と湿度の読み取りをAdafruit IOのダッシュボードに送信するArduinoプログラムを書きます。また、ダッシュボードのスイッチを通じて回路上のLEDを制御することもできます。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
一式を購入するのが間違いなく便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
ダッシュボードの設定
Adafruit IO にアクセスし、 Start for free をクリックして無料アカウントを作成します。
フォームに記入してアカウントを作成します。
Adafruitアカウントを作成した後、Adafruit ioを再度開いてください。 Dashboards をクリックし、次に New Dashboard をクリックします。
New Dashboard を作成します。
新しく作成された Dashboard に入り、新しいブロックを作成します。
1つの Toggle ブロックを作成します。
ここで新しいフィードを作成する必要があります。このトグルはLEDの制御に使用されるので、このフィードには「LED」という名前を付けます。
LED フィードを確認し、次のステップに進みます。
ブロック設定(主にブロックタイトル、オンテキスト、オフテキスト)を完了し、右下の Create block ボタンをクリックして終了します。
次に、温度と湿度を表示するために使用される Text Blocks を2つ作成する必要があります。したがって、 temperature と humidity という名前の2つのフィードを作成します。
作成後、ダッシュボードは以下のようになります。
ダッシュボードの Edit Layout オプションを使用してレイアウトを調整できます。
API KEY をクリックすると、ユーザー名と API KEY が表示されます。これらはコードで必要になるのでメモしておきます。
コードの実行
回路を組み立てます。
次に、USBケーブルを使ってESP32-WROOM-32Eをコンピュータに接続します。
コードを開きます。
esp32-starter-kit-main\c\codes\iot_6_adafruit_io
ディレクトリにあるiot_6_adafruit_io.ino
ファイルを開くか、Arduino IDEにコードをコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
Adafruit_MQTT Library
とDHT sensor library
が使用されており、 Library Manager からインストールできます。
次の行を見つけて、
<SSID>
と<PASSWORD>
をあなたのWiFiネットワークの詳細に置き換えます。/************************* WiFi Access Point *********************************/ #define WLAN_SSID "<SSID>" #define WLAN_PASS "<PASSWORD>"
そして、
<YOUR_ADAFRUIT_IO_USERNAME>
をあなたのAdafruit IOのユーザー名に、<YOUR_ADAFRUIT_IO_KEY>
を先ほどコピーした API KEY に置き換えます。// Adafruit IO Account Configuration // (to obtain these values, visit https://io.adafruit.com and click on Active Key) #define AIO_USERNAME "<YOUR_ADAFRUIT_IO_USERNAME>" #define AIO_KEY "<YOUR_ADAFRUIT_IO_KEY>"
正しいボード(ESP32 Dev Module)とポートを選択した後、 アップロード ボタンをクリックします。
コードが正常にアップロードされると、シリアルモニターに次のメッセージが表示され、Adafruit IOとの通信が成功したことがわかります。
Adafruit IO MQTTS (SSL/TLS) Example Connecting to xxxxx WiFi connected IP address: 192.168.18.76 Connecting to MQTT... MQTT Connected! Temperature: 27.10 Humidity: 61.00
Adafruit IOに戻ります。これで、ダッシュボード上で温度と湿度の読み取りを観察することができますし、LEDトグルスイッチを利用して回路に接続された外部LEDのオン/オフ状態を制御することもできます。
8.7 ESPカメラとTelegramボット¶
このプロジェクトでは、お気に入りのメッセージングアプリケーションとESP32を統合する方法をデモンストレーションします。今回はTelegramを使用します。
Telegramボットを作成し、どこからでも回路を制御したり、写真を撮影したり、フラッシュを管理することができます。さらに、誰かがデバイスのそばを通るたびに、新しい写真を撮影してTelegramアカウントに通知を送信します。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
全てのキットを購入することは非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
Telegramボットの作成
Google Play または App Store にアクセスして Telegram をダウンロードしてインストールします。
Telegram アプリで
botfather
を検索し、表示されたらクリックして開きます。または、このリンクに直接アクセスします:t.me/botfather。開くと、チャットウィンドウが表示されます。コマンド
/start
を送信します。/newbot
と入力し、指示に従ってボットを作成します。成功すると、BotFatherは新しいボットのアクセスリンクとAPIを提供します。
Telegramユーザーの承認
誰でも作成したボットとやりとりできるため、情報が漏洩するリスクがあります。これに対処するため、承認されたユーザーにのみボットが応答するようにしたいと考えています。
Telegram アカウントで
IDBot
を検索するか、リンクを開きます:t.me/myidbot。コマンド
/getid
を送信します。後でプログラムで使用するために、提供されたIDを保存します。
コードのアップロード
まずカメラを接続します。
回路を組み立てます。
コードを開きます。
esp32-starter-kit-main\c\codes\iot_7_cam_telegram
ディレクトリにあるiot_7_cam_telegram.ino
ファイルを開くか、Arduino IDEにコードをコピーします。ボード(ESP32 Dev Module)と適切なポートを選択した後、 アップロード ボタンをクリックします。
ここでは
UniversalTelegramBot
とArduinoJson
ライブラリを使用しており、 Library Manager からインストールできます。
次の行を見つけて、あなたのWiFiの詳細に
<SSID>
と<PASSWORD>
を置き換えます。// Replace the next variables with your SSID/Password combination const char* ssid = "<SSID>"; const char* password = "<PASSWORD>";
次の行を更新し、@IDBotから取得したTelegram IDで
<CHATID>
を置き換えます。// Use @myidbot to find out the chat ID of an individual or a group // Also note that you need to click "start" on a bot before it can // message you String chatId = "<CHATID>";
次の行を更新し、@BotFatherから提供されたTelegram BOTのトークンで
<BOTTOKEN>
を置き換えます。// Initialize Telegram BOT String BOTtoken = "<BOTTOKEN>";
正しいボード(ESP32 Dev Module)とポートを選択した後、 アップロード ボタンをクリックします。
シリアルモニターを開きます。IPアドレスが表示されれば、正常に実行されたことを意味します。
Connecting to xxxx ESP32-CAM IP Address: 192.168.18.76 Init Done!
これで、Telegramを通じてESP32とやり取りすることができます。
8.8 Home Assistantを使ったカメラ¶
このプロジェクトでは、ESP32カメラのビデオストリームウェブサーバーを設定し、人気のあるホームオートメーションプラットフォームであるHome Assistantと統合する方法を案内します。この統合により、ネットワーク上の任意のデバイスからサーバーにアクセスできます。
注釈
このプロジェクトに取り組む前に、Home Assistantがインストールされたオペレーティングシステムを用意する必要があります。
Raspberry PiにHome Assistant OSをインストールすることをおすすめします。
Raspberry Piを持っていない場合は、Windows、macOS、Linuxで動作する仮想マシンにインストールすることもできます。
インストール手順については、公式ウェブサイトのリンクを参照してください: https://www.home-assistant.io/installation/
インストールが成功した後にこのプロジェクトを進めてください。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
全てのキットを購入することは非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
1. ESPHomeでの設定
まずカメラを接続します。
Home AssistantシステムをインストールしたホストにESP32を接続します(例えば、Raspberry Piにインストールした場合は、Piに接続します)。
ESPHomeアドオンをインストールします。
START をクリックし、次に OPEN WEB UI をクリックします。
新しいデバイスを追加します。
プロンプトが表示される場合があります。 CONTINUE をクリックします。
設定を作成します。ここでは、 Name に任意の名前を入力できます。WiFiについては、Home Assistantシステムが存在するネットワークの詳細を入力します。
デバイスタイプとして ESP32 を選択します。
花火のアイコンが表示されたら、デバイスの作成に成功したことを意味します。スキップをクリックします(INSTALL をクリックしないでください)。
この時点で、デバイスをESPHomeに追加しただけです。ESP32モジュールをHome Assistantに統合するには、追加の設定が必要です:
EDIT をクリックします。
.yaml
インターフェースに入ったら、あなたのWiFiの詳細でssid
とpassword
を変更します。captive_portal
セクションの下に、次のコードを貼り付けます:# Example configuration entry esp32_camera: external_clock: pin: GPIO0 frequency: 20MHz i2c_pins: sda: GPIO26 scl: GPIO27 data_pins: [GPIO5, GPIO18, GPIO19, GPIO21, GPIO36, GPIO39, GPIO34, GPIO35] vsync_pin: GPIO25 href_pin: GPIO23 pixel_clock_pin: GPIO22 power_down_pin: GPIO32 # Image settings name: My Camera # ...
注釈
ESP32の
.yaml
設定の詳細については、 ESP32 Camera - ESPHome を参照してください。Save してから、 INSTALL をクリックします。
インストール方法としてUSBポートを選択します。
注釈
初回のコンパイルでは依存パッケージをダウンロードするため、約10分かかる場合があります。ご忍耐ください。プロセスが長時間停止する場合は、システムに十分なディスクスペースがあるか確認してください。
INFO Successfully compiled program.
のメッセージが表示されるまで待ちます。これはファームウェアのコンパイルが完了したことを示しています。注釈
この時点で、ノードが ONLINE として表示されるはずです。そうでない場合は、ESP32が同じネットワークセグメントにあることを確認するか、デバイスの再起動を試してください。
2. Home Assistantでの設定
Esphomeと統合した後、Home Assistantでカメラを設定する必要があります。
Settings > Devices & Services に移動します。
ここでesphomeタブが表示されるはずです。 CONFIGURE をクリックします。
SUBMIT をクリックします。
Success メッセージが表示されるまで待ちます。
Overview で、右上のメニューをクリックし、 Edit Dashboard を選択します。
ADD CARD をクリックします。
Picture entity を選択します。
エンティティフィールドで、ただ今追加したESP32を選択します。そして save。
最後に、 EDIT インターフェースを終了するために DONE をクリックします。
これで、Home Assistantでカメラフィードを視聴できます。
8.9 Blynkを利用した侵入通知システム¶
このプロジェクトでは、PIRモーションセンサー(HC-SR501)を使用したシンプルな自宅侵入検出システムを紹介します。 Blynkアプリを通じてシステムを「外出」モードに設定すると、PIRセンサーが動きを監視します。 検出された動きはBlynkアプリに通知を送り、ユーザーに潜在的な侵入を警告します。
必要な部品
このプロジェクトでは、以下のコンポーネントが必要です。
全てのキットを購入することは非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
1. 回路組立¶

2. Blynk設定¶
2.1 Blynkの初期化
BLYNK にアクセスし、 START FREE を選択します。
メールアドレスを入力して登録プロセスを開始します。
メールで登録を確認します。
確認後、 Blynk Tour が表示されます。「スキップ」を選択することをおすすめします。 Quick Start も表示された場合は、これもスキップすることを検討してください。
2.2 テンプレートの作成
Blynkでテンプレートを作成します。次の指示に従って Intrusion Alert System テンプレートを作成します。
テンプレートに名前を割り当て、ハードウェアを ESP32 として選択し、 Connection Type を WiFi として選択し、 Done を選択します。
2.3 データストリームの生成
設定したテンプレートを開き、2つのデータストリームを作成しましょう。
New Datastream をクリックします。
ポップアップで Virtual Pin を選択します。
Virtual Pin V0 に AwayMode と名付けます。 DATA TYPE を Integer とし、 MIN と MAX の値を 0 と 1 に設定します。
同様に、別の Virtual Pin データストリームを作成します。 Current Status と名付け、 DATA TYPE を String に設定します。
2.4 イベントの設定
次に、侵入が検出された場合にメール通知を送信するイベントを設定します。
Add New Event をクリックします。
イベントの名前と特定のコードを定義します。 TYPE には Warning を選択し、イベント発生時に送信されるメールの短い説明を書きます。通知の頻度も調整できます。
Notifications セクションに移動して通知をオンにし、メールの詳細を設定します。
2.5 Webダッシュボードの微調整
侵入アラートシステムと Web Dashboard が完璧に連動するようにすることが重要です。
Switch widget と Label widget を Web Dashboard にドラッグ&ドロップします。
ウィジェット上にカーソルを合わせると、3つのアイコンが表示されます。設定アイコンを使用してウィジェットのプロパティを調整します。
Switch widget の設定で、 Datastream を AwayMode(V0) に設定します。 ONLABEL と OFFLABEL にそれぞれ 「away」 と 「home」 を表示するように設定します。
Label widget の設定で、 Datastream を Current Status(V1) に設定します。
2.6 テンプレートの保存
最後に、テンプレートを保存するのを忘れないでください。
2.7 デバイスの作成
新しいデバイスを作成する時が来ました。
From template をクリックして新しいセットアップを開始します。
次に、 Intrusion Alert System テンプレートを選択し、 Create をクリックします。
ここでは、
Template ID
、Device Name
、AuthToken
が表示されます。これらをコードにコピーして、ESP32がBlynkと連携できるようにします。
3. コードの実行¶
コードを実行する前に、Arduino IDEの Library Manager から
Blynk
ライブラリをインストールしてください。iot_9_intrusion_alert_system.ino
ファイルを開きます。このファイルは、esp32-starter-kit-main\c\codes\iot_9_intrusion_alert_system
ディレクトリ内にあります。内容をArduino IDEにコピーすることもできます。BLYNK_TEMPLATE_ID
、BLYNK_TEMPLATE_NAME
、BLYNK_AUTH_TOKEN
のプレースホルダーを独自のIDに置き換えてください。#define BLYNK_TEMPLATE_ID "TMPxxxxxxx" #define BLYNK_TEMPLATE_NAME "Intrusion Alert System" #define BLYNK_AUTH_TOKEN "xxxxxxxxxxxxx"
また、WiFiネットワークの
ssid
とpassword
を入力する必要があります。char ssid[] = "your_ssid"; char pass[] = "your_password";
正しいボード(ESP32 Dev Module)とポートを選択し、 Upload ボタンをクリックしてください。
シリアルモニターを開き(ボーレートを115200に設定)、成功した接続メッセージが表示されるのを待ちます。
接続に成功したら、Blynkでスイッチをアクティブにすると、PIRモジュールの監視が開始されます。動きが検出されると(状態が1になる)、"誰かがここにいる!"と表示され、あなたのメールにアラートが送信されます。
4. コードの説明¶
設定とライブラリ
ここでは、Blynkの定数と資格情報を設定します。また、ESP32とBlynkに必要なライブラリを含めます。
/* Comment this out to disable prints and save space */ #define BLYNK_PRINT Serial #define BLYNK_TEMPLATE_ID "xxxxxxxxxxx" #define BLYNK_TEMPLATE_NAME "Intrusion Alert System" #define BLYNK_AUTH_TOKEN "xxxxxxxxxxxxxxxxxxxxxxxxxxx" #include <WiFi.h> #include <WiFiClient.h> #include <BlynkSimpleEsp32.h>
WiFi設定
あなたのWiFiの資格情報を入力してください。
char ssid[] = "your_ssid"; char pass[] = "your_password";
PIRセンサー設定
PIRセンサーが接続されているピンを設定し、状態変数を初期化します。
const int sensorPin = 14; int state = 0; int awayHomeMode = 0; BlynkTimer timer;
setup()関数
この関数はPIRセンサーを入力として初期化し、シリアル通信を設定し、WiFiに接続し、Blynkを設定します。
setup()
でtimer.setInterval(1000L, myTimerEvent)
を使用してタイマーの間隔を設定します。ここではmyTimerEvent()
関数を毎 1000ms 実行するように設定しています。timer.setInterval(1000L, myTimerEvent)
の最初のパラメータを変更することでmyTimerEvent
実行の間隔を変更できます。
void setup() { pinMode(sensorPin, INPUT); // Set PIR sensor pin as input Serial.begin(115200); // Start serial communication at 115200 baud rate for debugging // Configure Blynk and connect to WiFi Blynk.begin(BLYNK_AUTH_TOKEN, ssid, pass); timer.setInterval(1000L, myTimerEvent); // Setup a function to be called every second }
loop()関数
loop関数はBlynkとBlynkタイマー関数を継続的に実行します。
void loop() { Blynk.run(); timer.run(); }
Blynkアプリとのやり取り
これらの関数は、デバイスがBlynkに接続したとき、またはBlynkアプリの仮想ピンV0の状態に変更があったときに呼び出されます。
デバイスがBlynkサーバーに接続するたび、またはネットワーク状況が悪いために再接続するたびに、
BLYNK_CONNECTED()
関数が呼び出されます。Blynk.syncVirtual()
コマンドは単一の仮想ピン値のリクエストを行います。指定された仮想ピンはBLYNK_WRITE()
コールを実行します。BLYNKサーバー上の仮想ピンの値が変更されると、
BLYNK_WRITE()
がトリガされます。
// This function is called every time the device is connected to the Blynk.Cloud BLYNK_CONNECTED() { Blynk.syncVirtual(V0); } // This function is called every time the Virtual Pin 0 state changes BLYNK_WRITE(V0) { awayHomeMode = param.asInt(); // additional logic }
データ処理
myTimerEvent()
関数は毎秒sendData()
を呼び出します。Blynkで外出モードが有効になっている場合、PIRセンサーをチェックし、動きが検出された場合にBlynkに通知を送ります。ラベルのテキストを変更するには、
Blynk.virtualWrite(V1, "Somebody in your house! Please check!");
を使用します。イベントをBlynkに記録するには、
Blynk.logEvent("intrusion_detected");
を使用します。
void myTimerEvent() { sendData(); } void sendData() { if (awayHomeMode == 1) { state = digitalRead(sensorPin); // Read the state of the PIR sensor Serial.print("state:"); Serial.println(state); // If the sensor detects movement, send an alert to the Blynk app if (state == HIGH) { Serial.println("Somebody here!"); Blynk.virtualWrite(V1, "Somebody in your house! Please check!"); Blynk.logEvent("intrusion_detected"); } } }
参考文献
8.10 アンドロイドアプリケーション - ArduinoとBluetoothを介したRGB LED操作¶
このプロジェクトの目的は、Bluetooth技術を使ってスマートフォンでRGB LEDの色調を操作できるアンドロイドアプリケーションを開発することです。
このアンドロイドアプリケーションは、MIT App Inventor 2と呼ばれる無料のウェブベースプラットフォームを使用して構築されます。このプロジェクトは、Arduinoとスマートフォンのインターフェースに慣れる絶好の機会を提供します。
必要な部品
このプロジェクトには以下のコンポーネントが必要です。
キット全体を購入するのが便利です。以下がリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
1. アンドロイドアプリケーションの作成
アンドロイドアプリケーションは MIT App Inventor という無料のウェブアプリケーションを使用して作成されます。 MIT App Inventorは、直感的なドラッグ&ドロップ機能を使用して簡単なアプリケーションを作成することができるため、アンドロイド開発において優れた出発点です。
さあ、始めましょう。
こちらがログインページです: http://ai2.appinventor.mit.edu。 MIT App Inventorに登録するにはGoogleアカウントが必要です。
ログインした後、 Projects -> Import project (.aia) from my computer に進み、
esp32-starter-kit-main\c\codes\iot_10_bluetooth_app_inventor
パスにあるcontrol_rgb_led.aia
ファイルをアップロードしてください。.aia
ファイルをアップロードすると、 MIT App Inventor ソフトウェア上でアプリケーションが表示されます。これは事前に設定されたテンプレートです。 MIT App Inventor に慣れた後、このテンプレートを変更することができます。MIT App Inventor では、主に Designer と Blocks の2つのセクションがあります。
Designer を使用すると、ボタン、テキスト、画面を追加し、アプリケーションの全体的な美観を変更することができます。
次に、 Blocks セクションがあります。 Blocks セクションは、アプリケーションのための特別な機能を作成するのに役立ちます。
スマートフォンにアプリケーションをインストールするには、 Build タブに移動します。
.apk
ファイルを生成することができます。このオプションを選択すると、.apk
ファイルをダウンロードするか、QRコードをスキャンしてインストールするかを選択できるページが表示されます。インストールガイドに従ってアプリケーションのインストールを完了してください。このアプリを Google Play や他のアプリマーケットにアップロードしたい場合は、
.aab
ファイルを生成することができます。
2. コードのアップロード
回路を組み立てます。
RGB LEDには4つのピンがあります:長いピンは共通カソードピンで、通常はGNDに接続されています。最長のピンの左にあるピンは赤を表し、右側の2つのピンは緑と青を象徴しています。
次に、USBケーブルを使用してESP32-WROOM-32Eをコンピュータに接続します。
esp32-starter-kit-main\c\codes\iot_10_bluetooth_app_inventor
ディレクトリ内にあるiot_10_bluetooth_app_inventor.ino
ファイルを開くか、コードをArduino IDEにコピーします。適切なボード( ESP32 Dev Module )とポートを選択した後、 Upload ボタンをクリックします。
3. アプリとESP32の接続
以前に作成したアプリケーションがスマートフォンにインストールされていることを確認します。
最初に、スマートフォンで Bluetooth を有効にします。
スマートフォンの Bluetooth settings に移動し、 ESP32RGB を探します。
クリックした後、ポップアップウィンドウで Pair 要求に同意します。
今、最近インストールした Control_RGB_LED APPを開きます。
APP内で Connect Bluetooth をクリックし、APPとESP32の間の接続を確立します。
表示される
xx.xx.xx.xx.xx.xx ESP32RGB
を選択します。もしコード内でSerialBT.begin("ESP32RGB");
を変更した場合は、設定した名前を選択します。しばらく待ってもデバイス名が表示されない場合は、このAPPが周囲のデバイスをスキャンすることを許可されていない可能性があります。その場合は、手動で設定を調整する必要があります。
APPアイコンを長押しして、表示された APP Info をクリックします。他の方法でこのページにアクセスできる場合は、その方法に従ってください。
Permissions ページに移動します。
Nearby devices を探し、 Always を選択して、このAPPが近くのデバイスをスキャンできるようにします。
今、APPを再起動し、手順5と6を繰り返してBluetoothに成功裏に接続します。
接続に成功すると、自動的にメインページに戻り、接続されたと表示されます。これで、 Change Color ボタンを押してRGB値を調整し、RGBディスプレイの色を変更することができます。
MicroPythonユーザーのために¶
この章は、MicroPythonを好んで使用するユーザーに特化して作られた包括的なガイドです。 MicroPythonの入門から、ディスプレイの操作、音の生成、アクチュエータの制御、センサーの利用、楽しいプロジェクトの探求に至るまで、様々なトピックを網羅しています。 この章は、MicroPythonユーザーに必要な知識とリソースを提供し、キットを効果的に使いこなし、エキサイティングなプロジェクトを創造するための創造力を解き放つ手助けとなります。
こちらはESP32スターターキットの完全なコードパッケージです。以下のリンクをクリックしてダウンロードしてください:
ダウンロードが完了したら、ファイルを解凍し、該当するソフトウェアで関連するサンプルコードやプロジェクトファイルを開きます。これにより、キットが提供するすべてのコードとリソースを閲覧し、利用することができます。
1. はじめに
1.1 MicroPythonの紹介¶
MicroPythonは、C言語で書かれたPython 3と広く互換性のあるプログラミング言語のソフトウェア実装であり、マイクロコントローラ上で動作するように最適化されています。[3][4]
MicroPythonはバイトコードへのPythonコンパイラと、そのバイトコードのランタイムインタプリターから構成されています。ユーザーには、対応するコマンドを即座に実行できるインタラクティブプロンプト(REPL)が提供されます。Pythonのコアライブラリの選択が含まれており、MicroPythonにはプログラマーが低レベルハードウェアにアクセスできるモジュールが含まれています。
物語はここから始まります¶
2013年、Damien Georgeがクラウドファンディングキャンペーン(Kickstarter)を開始した時に、事態は変わりました。
Damienはケンブリッジ大学の学部生であり、熱心なロボティクスプログラマーでした。彼はPythonの世界をギガバイト級のマシンからキロバイト級に縮小したいと考えていました。彼のKickstarterキャンペーンは、彼のコンセプトの証明を完成した実装に変えるための開発をサポートするものでした。
MicroPythonは、プロジェクトの成功に熱心な多様なPythonistaコミュニティによって支えられています。
コードベースのテストとサポートのみならず、開発者たちはチュートリアル、コードライブラリ、ハードウェアのポーティングを提供し、Damienはプロジェクトの他の側面に集中することができました。
参照: realpython
なぜMicroPythonなのか?¶
元のKickstarterキャンペーンではSTM32F4を搭載した開発ボード「pyboard」としてMicroPythonがリリースされましたが、MicroPythonは多くのARMベースの製品アーキテクチャをサポートしています。メインラインでサポートされているポートには、ARM Cortex-M(多くのSTM32ボード、TI CC3200/WiPy、Teensyボード、Nordic nRFシリーズ、SAMD21およびSAMD51)、ESP8266、ESP32、16ビットPIC、Unix、Windows、Zephyr、JavaScriptがあります。 また、MicroPythonは迅速なフィードバックを可能にします。これは、REPLを使用してコマンドを対話的に入力し、応答を得ることができるためです。コードを微調整して即座に実行することもできるため、コード-コンパイル-アップロード-実行のサイクルを経る必要がありません。
Pythonも同様の利点がありますが、ESP32のようないくつかのマイクロコントローラボードにとって、それらは小さくシンプルで、Python言語を全て実行するにはメモリが少なすぎます。そのため、MicroPythonは主要なPythonの特徴を保ちつつ、これらのマイクロコントローラボードで動作するための新しい機能を追加して進化しています。
次に、ESP32にMicroPythonをインストールする方法を学びます。
参照: realpython
1.2 Thonny IDEのインストール¶
MicroPythonを使ってESP32をプログラミングする前に、統合開発環境(IDE)が必要です。ここではThonnyをお勧めします。ThonnyはPython 3.7が組み込まれており、シンプルなインストーラーで準備完了です。これでプログラミング学習ができます。
Thonny のウェブサイトを訪れてダウンロードできます。ページを開くと右上に薄灰色のボックスが表示されるので、お使いのオペレーティングシステムに適用されるリンクをクリックしてください。
インストーラーはまだ評判を築いていない新しい証明書で署名されています。ブラウザの警告をクリックスルーする必要があるかもしれません(例えばChromeでは「破棄」の代わりに「保持」を選択)や、Windows Defenderの警告(More info ⇒ Run anyway)。
次に、 Next と Install をクリックしてThonnyのインストールを完了させます。
1.3 ESP32にMicroPythonをインストールする(重要)¶
MicroPythonの公式ウェブサイトから MicroPython firmware for the ESP32 をダウンロードし、その後で最新バージョンのファームウェアをダウンロードします。
Micro USBケーブルを使用して、ESP32 WROOM 32Eをコンピューターに接続します。
Thonny IDEの右下隅をクリックし、ポップアップメニューから 「MicroPython(ESP32).COMXX」 を選択し、 「Configure interpreter」 を選択します。
新しいポップアップウィンドウで 「Install or Update MicroPython」 をクリックします。
正しいポートと先ほどダウンロードしたファームウェアを選択し、 「Install」 をクリックします。
インストールが成功した後、このページを閉じることができます。
Thonnyのホームページに戻ると、赤いエラープロンプトの代わりにMicroPythonのバージョンとESP32関連のプロンプトが表示されます。
1.4 ライブラリのアップロード(重要)¶
一部のプロジェクトでは、追加のライブラリが必要になることがあります。ここでは、これらのライブラリを先にESP32にアップロードしておき、後でコードを直接実行できるようにします。
下記のリンクから関連するコードをダウンロードします。
Micro USBケーブルを使用して、ESP32 WROOM 32Eをコンピューターに接続します。
- Thonny IDEを開き、右下隅にある「MicroPython (ESP32).COMXX」インタープリタをクリックします。
上部のナビゲーションバーで、 View -> Files をクリックします。
コードパッケージ をダウンロードしたフォルダへのパスを切り替え、その後で
esp32-starter-kit-main\micropython\libs
フォルダに進みます。libs/
フォルダ内の全てのファイルやフォルダを選択し、右クリックして Upload to をクリックします。アップロードには少し時間がかかります。これで、アップロードしたばかりのファイルが
MicroPython device
内に表示されます。
1.5 Thonnyのクイックガイド¶
直接コードを開いて実行する¶
プロジェクトのコードセクションでは、使用する正確なコードが示されているので、 esp32-starter-kit-main\micropython\codes\
パスのシリアル番号が付いた .py
ファイルをダブルクリックして開きます。
ただし、 1.4 ライブラリのアップロード(重要) で説明されているように、まずパッケージをダウンロードしてライブラリをアップロードする必要があります。
コードを開く。
例えば、
1.1_hello_led.py
です。ダブルクリックすると、右側に新しいウィンドウが開きます。複数のコードを同時に開くことができます。
マイクロUSBケーブルでESP32をコンピュータに接続します。
正しいインタプリタを選択
「MicroPython (ESP32).COMxx」インタプリタを選択します。
コードを実行
スクリプトを実行するには、 Run current script ボタンをクリックするかF5キーを押します。
コードに印刷が必要な情報が含まれている場合は、シェルに表示されます。それ以外の場合は、以下の情報のみが表示されます。
シェルウィンドウがThonnyに表示されない場合は、 View -> Edit をクリックして開きます。
MicroPython v1.19.1 on 2022-06-18; ESP32 module with ESP32 詳しい情報は「help()」と入力してください。 >>> %Run -c $EDITOR_CONTENT
最初の行には、MicroPythonのバージョン、日付、およびデバイス情報が表示されます。
2行目には、「help()」を入力してヘルプを取得するように促されます。
3行目は、スクリプトエリアの「EDITOR_CONTENT」の内容をPico WのMicroPythonインタプリタに実行させるThonnyからのコマンドです。
3行目の後にメッセージがある場合、通常はMicroPythonに印刷するように指示したメッセージ、またはコードのエラーメッセージです。
実行を停止
実行中のコードを停止するには、 Stop/Restart backend ボタンをクリックします。 %RUN -c $EDITOR_CONTENT コマンドは停止後に消えます。
保存または名前を付けて保存
Thonnyで開いた例の変更を保存するには、 Ctrl+S を押すか、Thonnyの Save ボタンをクリックします。
File -> Save As をクリックして、 MicroPython drive(ESP32) 内の別のファイルとしてコードを保存することができます。
MicroPython drive を選択します。
ファイル名と拡張子 .py を入力した後、 OK をクリックします。MicroPythonドライブに保存されたファイルが表示されます。
注釈
コードにどんな名前を付けても、コードの種類を記述することが最善です。意味のない名前(例:
abc.py
)は避けましょう。 コードをmain.py
として保存すると、電源を入れたときに自動的に実行されます。
ファイルを作成して実行する¶
コードはコードセクションで直接示されています。Thonnyにコピーして以下のように実行できます。
新しいファイルを作成する
Thonny IDEを開き、 New ボタンをクリックして新しい空のファイルを作成します。
コードをコピー
プロジェクトからのコードをThonny IDEにコピーします。
マイクロUSBケーブルでESP32をコンピュータに接続します。
正しいインタプリタを選択
右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択します。
コードを実行
Run Current Script をクリックするか、単に
F5
キーを押して実行します。コードに印刷が必要な情報が含まれている場合は、シェルに表示されます。それ以外の場合は、以下の情報のみが表示されます。
シェルウィンドウがThonnyに表示されない場合は、 View -> Edit をクリックして開きます。
MicroPython v1.19.1 on 2022-06-18; ESP32 module with ESP32 詳しい情報は「help()」と入力してください。 >>> %Run -c $EDITOR_CONTENT
最初の行には、MicroPythonのバージョン、日付、およびデバイス情報が表示されます。
2行目には、「help()」を入力してヘルプを取得するように促されます。
3行目は、スクリプトエリアの「EDITOR_CONTENT」の内容をPico WのMicroPythonインタプリタに実行させるThonnyからのコマンドです。
3行目の後にメッセージがある場合、通常はMicroPythonに印刷するように指示したメッセージ、またはコードのエラーメッセージです。
実行を停止する
実行中のコードを停止するには、 Stop/Restart backend ボタンをクリックします。 %RUN -c $EDITOR_CONTENT コマンドは停止後に消えます。
保存または名前を付けて保存
Ctrl+S を押すか、Thonnyの Save ボタンをクリックしてコードを保存できます。ポップアップウィンドウで、ファイルを保存する場所を選択します。
ファイル名と拡張子 .py を入力した後、 OK または Save をクリックします。
注釈
コードにどんな名前を付けても、コードの種類を記述することが最善です。意味のない名前(例:
abc.py
)は避けましょう。 コードをmain.py
として保存すると、電源を入れたときに自動的に実行されます。ファイルを開く
保存されたコードファイルを開く方法は2つあります。
一つ目の方法は、Thonnyのツールバーにある開くアイコンをクリックすることです。プログラムを保存する時と同じように、 this computer から開くか、 MicroPython device から開くかを尋ねられます。例えば、 MicroPython device をクリックすると、ESP32に保存されている全てのプログラムのリストが表示されます。
二つ目の方法は、 View -> Files をクリックし、対応する
.py
ファイルをダブルクリックして直接ファイルプレビューを開くことです。
1.6 (オプション) MicroPythonの基本文法¶
インデント¶
インデントはコード行の先頭の空白を指します。 標準のPythonプログラムと同じように、MicroPythonプログラムも通常は上から下へと実行されます: それぞれの行を順に走査し、インタプリタで実行してから次の行へと進みます、 まるでShellで一行ずつタイプするかのように。 ただし、命令リストを行ごとにただ閲覧するだけのプログラムはあまり賢くありません - そこでMicroPythonは、Pythonと同じように、プログラム実行の順序を制御する独自の方法を持っています:インデント。
print()の前には少なくとも1つのスペースを入れる必要があります。さもないと"Invalid syntax"(無効な構文)というエラーメッセージが表示されます。スペースはTabキーを均一に押すことで標準化することが一般的に推奨されます。
if 8 > 5:
print("Eight is greater than Five!")
>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):
File "<stdin>", line 2
SyntaxError: invalid syntax
同じブロックのコード内で同じ数のスペースを使用しなければ、Pythonはエラーを出します。
if 8 > 5:
print("Eight is greater than Five!")
print("Eight is greater than Five")
>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):
File "<stdin>", line 2
SyntaxError: invalid syntax
コメント¶
コード内のコメントは、コードを理解するのに役立ち、全体のコードの可読性を高め、テスト中にコードの一部をコメントアウトして、その部分のコードが実行されないようにします。
単一行コメント¶
MicroPythonにおける単一行コメントは # で始まり、その後のテキストは行の終わりまでコメントと見なされます。コメントはコードの前後に配置することができます。
print("hello world") #This is a annotationhello world
>>> %Run -c $EDITOR_CONTENT
hello world
コメントはコードを説明するためのテキストに限られません。コードの一部をコメントアウトして、micropythonがコードを実行しないようにすることもできます。
#print("Can't run it!")
print("hello world") #This is a annotationhello world
>>> %Run -c $EDITOR_CONTENT
hello world
複数行コメント¶
複数行にわたってコメントする場合は、複数の # を使用できます。
#This is a comment
#written in
#more than just one line
print("Hello, World!")
>>> %Run -c $EDITOR_CONTENT
Hello, World!
または、予想される代わりに複数行の文字列を使用することができます。
MicroPythonは変数に割り当てられていない文字列リテラルを無視するので、複数行の文字列(トリプルクオート)をコードに追加し、その中にコメントを入れることができます:
"""
This is a comment
written in
more than just one line
"""
print("Hello, World!")
>>> %Run -c $EDITOR_CONTENT
Hello, World!
文字列が変数に割り当てられていない限り、MicroPythonはコードを読んだ後でそれを無視し、あたかも複数行のコメントを作成したかのように扱います。
Print()¶
print()
関数は、指定されたメッセージを画面や他の標準出力デバイスに印刷します。
メッセージは文字列でも、他のオブジェクトでも構いません。オブジェクトは画面に表示する前に文字列に変換されます。
複数のオブジェクトを印刷する:
print("Welcome!", "Enjoy yourself!")
>>> %Run -c $EDITOR_CONTENT
Welcome! Enjoy yourself!
タプルを印刷する:
x = ("pear", "apple", "grape")
print(x)
>>> %Run -c $EDITOR_CONTENT
('pear', 'apple', 'grape')
2つのメッセージを印刷して、セパレータを指定する:
print("Hello", "how are you?", sep="---")
>>> %Run -c $EDITOR_CONTENT
Hello---how are you?
変数¶
変数はデータ値を格納するために使われるコンテナです。
変数を作成するのは非常に簡単です。名前を付けて値を割り当てるだけです。割り当てる際に変数のデータタイプを指定する必要はありません。なぜなら変数は参照であり、割り当てを通じて異なるデータタイプのオブジェクトにアクセスするからです。
変数名を命名する際は、以下のルールに従う必要があります:
変数名には数字、文字、アンダースコアのみを含めることができます
変数名の最初の文字は文字またはアンダースコアでなければなりません
変数名は大文字と小文字を区別します
変数を作成する¶
MicroPythonには変数を宣言するコマンドはありません。変数は初めて値を割り当てたときに作成されます。特定の型宣言を使用する必要はなく、変数を設定した後で型を変更することもできます。
x = 8 # x is of type int
x = "lily" # x is now of type str
print(x)
>>> %Run -c $EDITOR_CONTENT
lily
キャスト¶
変数にデータタイプを指定したい場合は、キャストによって行うことができます。
x = int(5) # y will be 5
y = str(5) # x will be '5'
z = float(5) # z will be 5.0
print(x,y,z)
>>> %Run -c $EDITOR_CONTENT
5 5 5.0
タイプを取得する¶
type() 関数を使用して変数のデータタイプを取得することができます。
x = 5
y = "hello"
z = 5.0
print(type(x),type(y),type(z))
>>> %Run -c $EDITOR_CONTENT
<class 'int'> <class 'str'> <class 'float'>
シングルクォートまたはダブルクォート?¶
MicroPythonでは、シングルクォートまたはダブルクォートを使用して文字列変数を定義できます。
x = "hello"
# is the same as
x = 'hello'
大文字・小文字の区別¶
変数名は大文字と小文字を区別します。
a = 5
A = "lily"
#A will not overwrite a
print(a, A)
>>> %Run -c $EDITOR_CONTENT
5 lily
If Else¶
条件によってコードを実行したい場合には、条件分岐が必要になります。
if¶
if test expression:
statement(s)
ここでは、プログラムが`テスト表現`を評価し、 test expression がTrueの場合のみ test expression を実行します。
test expression がFalseであれば、 statement(s) は実行されません。
MicroPythonでは、インデントは if ステートメントの本体を意味します。本体はインデントで始まり、最初の非インデント行で終わります。
Pythonはゼロでない値を「True」と解釈します。Noneと0は「False」と解釈されます。
ifステートメントのフローチャート

例
num = 8
if num > 0:
print(num, "is a positive number.")
print("End with this line")
>>> %Run -c $EDITOR_CONTENT
8 is a positive number.
End with this line
if...else¶
if test expression:
Body of if
else:
Body of else
if..else ステートメントは`テスト表現`を評価し、テスト条件が True の場合にのみ if の本体を実行します。
条件が False の場合、 else の本体が実行されます。インデントはブロックを分けるために使用されます。
if...elseステートメントのフローチャート

例
num = -8
if num > 0:
print(num, "is a positive number.")
else:
print(num, "is a negative number.")
>>> %Run -c $EDITOR_CONTENT
-8 is a negative number.
if...elif...else¶
if test expression:
Body of if
elif test expression:
Body of elif
else:
Body of else
Elif は else if の略です。複数の表現をチェックすることができます。
if の条件がFalseの場合、次のelifブロックの条件がチェックされ、以下同様に続きます。
すべての条件が False であれば、 else の本体が実行されます。
複数ある if...elif...else ブロックのうち、条件に応じて実行されるのは1つだけです。
if ブロックは1つの else ブロックを持つことができますが、複数の elif ブロックを持つことができます。
if...elif...elseステートメントのフローチャート

例
x = 10
y = 9
if x > y:
print("x is greater than y")
elif x == y:
print("x and y are equal")
else:
print("x is greater than y")
>>> %Run -c $EDITOR_CONTENT
x is greater than y
Nested if¶
ifステートメントを別のifステートメントに埋め込むことができ、これをネストされたifステートメントと呼びます。
例
x = 67
if x > 10:
print("Above ten,")
if x > 20:
print("and also above 20!")
else:
print("but not above 20.")
>>> %Run -c $EDITOR_CONTENT
Above ten,
and also above 20!
Whileループ¶
while
文はループ内でプログラムを実行するために使われます。つまり、特定の条件下で繰り返し処理する必要がある同じタスクを処理するために、ループ内でプログラムを実行します。
基本的な形式は以下の通りです:
while test expression:
Body of while
while
ループでは、まず test expression
をチェックします。 test expression
が True
と評価された場合のみ、whileの本体に入ります。一回のイテレーションの後、再び test expression
をチェックします。このプロセスは test expression
が False
と評価されるまで続きます。
MicroPythonでは、 while
ループの本体はインデントによって決定されます。
本体はインデントで始まり、最初の非インデント行で終わります。
Pythonはゼロでない任意の値を True
と解釈します。Noneと0は False
と解釈されます。
whileループのフローチャート

x = 10
while x > 0:
print(x)
x -= 1
>>> %Run -c $EDITOR_CONTENT
10
9
8
7
6
5
4
3
2
1
Break文¶
break文を使えば、while条件が真であってもループを停止させることができます:
x = 10
while x > 0:
print(x)
if x == 6:
break
x -= 1
>>> %Run -c $EDITOR_CONTENT
10
9
8
7
6
Elseを持つWhileループ¶
if ループのように、 while ループにもオプショナルの else ブロックを持たせることができます。
while ループの条件が False と評価された場合、 else 部分が実行されます。
x = 10
while x > 0:
print(x)
x -= 1
else:
print("Game Over")
>>> %Run -c $EDITOR_CONTENT
10
9
8
7
6
5
4
3
2
1
ゲームオーバー
Forループ¶
for ループは、リストや文字列など、任意の項目のシーケンスをトラバースすることができます。
forループの構文フォーマットは以下の通りです:
for val in sequence:
Body of for
ここで、 val は各イテレーションでシーケンス内の項目の値を取得する変数です。
ループはシーケンスの最後の項目に到達するまで続きます。本体をコードの残りの部分から分離するためにインデントを使用します。
forループのフローチャート

numbers = [1, 2, 3, 4]
sum = 0
for val in numbers:
sum = sum+val
print("The sum is", sum)
>>> %Run -c $EDITOR_CONTENT
The sum is 10
Break文¶
break文を使えば、全ての項目をループする前にループを停止させることができます:
numbers = [1, 2, 3, 4]
sum = 0
for val in numbers:
sum = sum+val
if sum == 6:
break
print("The sum is", sum)
>>> %Run -c $EDITOR_CONTENT
The sum is 6
Continue文¶
continue 文を使えば、ループの現在のイテレーションを停止し、次のイテレーションで続行することができます:
numbers = [1, 2, 3, 4]
for val in numbers:
if val == 3:
continue
print(val)
>>> %Run -c $EDITOR_CONTENT
1
2
4
range()関数¶
range()関数を使って一連の数値を生成することができます。range(6)は0から5の間の数値を生成します(6つの数値)。
また、range(start, stop, step_size)として開始、停止、ステップサイズを定義することもできます。指定されていない場合、step_sizeはデフォルトで1になります。
rangeの意味では、オブジェクトは「怠惰」です。なぜなら、オブジェクトを作成しても、それが「含む」すべての数値を生成しないからです。しかし、これはin、len、__getitem__操作をサポートしているため、イテレータではありません。
この関数はすべての値をメモリに格納しません。それは非効率的です。したがって、開始、停止、ステップサイズを覚えておいて、進行中に次の数値を生成します。
この関数にすべての項目を出力させるには、list()関数を使用することができます。
print(range(6))
print(list(range(6)))
print(list(range(2, 6)))
print(list(range(2, 10, 2)))
>>> %Run -c $EDITOR_CONTENT
range(0, 6)
[0, 1, 2, 3, 4, 5]
[2, 3, 4, 5]
[2, 4, 6, 8]
range() を for ループ内で使用して数値のシーケンスを繰り返すことができます。len()関数と組み合わせてインデックスを使用してシーケンスをトラバースすることもできます。
fruits = ['pear', 'apple', 'grape']
for i in range(len(fruits)):
print("I like", fruits[i])
>>> %Run -c $EDITOR_CONTENT
I like pear
I like apple
I like grape
ForループでのElse¶
for ループにはオプショナルな else ブロックも持たせることができます。ループに使用されるシーケンスの項目が使い果たされた場合、 else 部分が実行されます。
break キーワードを使用して for ループを停止させることができます。この場合、 else 部分は無視されます。
したがって、中断が発生しなければ、 for ループの else 部分が実行されます。
for val in range(5):
print(val)
else:
print("Finished")
>>> %Run -c $EDITOR_CONTENT
0
1
2
3
4
Finished
ループがbreak文で停止された場合、elseブロックは実行されません。
for val in range(5):
if val == 2: break
print(val)
else:
print("Finished")
>>> %Run -c $EDITOR_CONTENT
0
1
関数¶
MicroPythonにおいて、関数は特定のタスクを実行する関連するステートメントのグループです。
関数はプログラムをより小さなモジュールブロックに分割するのに役立ちます。プランが大きくなるにつれて、関数はそれをより整理され、管理しやすくします。
また、重複を避け、コードを再利用可能にします。
関数の作成¶
def function_name(parameters):
"""docstring"""
statement(s)
関数は
def
キーワードを使用して定義されます。関数を一意に識別する関数名。関数の命名は変数の命名と同じで、以下のルールに従います。
数字、文字、アンダースコアのみを含むことができます。
最初の文字は文字またはアンダースコアでなければなりません。
大文字と小文字を区別します。
パラメータ(引数)は、値を関数に渡すために使用します。これはオプショナルです。
コロン(:)は関数ヘッダの終わりを示します。
オプショナルなドキュメント文字列は、関数の機能を記述するために使用されます。通常、ドキュメント文字列を複数行に拡張できるようにトリプルクオートを使用します。
関数の本体を構成する1つ以上の有効なMicropythonステートメント。ステートメントは同じインデントレベル(通常は4スペース)でなければなりません。
どんな理由があっても、ステートメントを含まない関数がある場合、エラーを避けるためにpassステートメントを入れてください。
関数から値を返すオプショナルな
return
ステートメント。
関数の呼び出し¶
関数を呼び出すには、関数名の後に括弧を追加します。
def my_function():
print("Your first function")
my_function()
>>> %Run -c $EDITOR_CONTENT
Your first function
returnステートメント¶
returnステートメントは関数から出て、それが呼び出された場所に戻るために使用されます。
returnの構文
return [expression_list]
このステートメントには、評価されて値を返す式を含むことができます。ステートメントに式がない場合、または return
ステートメント自体が関数内に存在しない場合、関数は None
オブジェクトを返します。
def my_function():
print("Your first function")
print(my_function())
>>> %Run -c $EDITOR_CONTENT
Your first function
None
ここで、 None
は戻り値です。なぜなら return
ステートメントが使用されていないからです。
引数¶
情報を引数として関数に渡すことができます。
関数名の後の括弧内に引数を指定します。必要なだけ多くの引数を追加でき、コンマで区切ります。
def welcome(name, msg):
"""This is a welcome function for
the person with the provided message"""
print("Hello", name + ', ' + msg)
welcome("Lily", "Welcome to China!")
>>> %Run -c $EDITOR_CONTENT
Hello Lily, Welcome to China!
引数の数¶
デフォルトでは、関数は正しい数の引数で呼び出されなければなりません。つまり、関数が2つのパラメータを期待している場合、関数を2つの引数で呼び出す必要があります。多くても少なくてもいけません。
def welcome(name, msg):
"""This is a welcome function for
the person with the provided message"""
print("Hello", name + ', ' + msg)
welcome("Lily", "Welcome to China!")
ここでは、関数welcome()は2つのパラメータを持っています。
この関数を二つの引数で呼び出すと、エラーなくスムーズに機能します。
引数の数が異なる場合、インタープリタはエラーメッセージを表示します。
以下は、この関数を一つの引数と引数なしで呼び出した例と、それぞれのエラーメッセージです。
welcome("Lily")#Only one argument
>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):
File "<stdin>", line 6, in <module>
TypeError: function takes 2 positional arguments but 1 were given
welcome()#No arguments
>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):
File "<stdin>", line 6, in <module>
TypeError: function takes 2 positional arguments but 0 were given
デフォルト引数¶
MicroPythonでは、代入演算子(=)を使用してパラメータにデフォルト値を提供することができます。
引数なしで関数を呼び出すと、デフォルト値が使用されます。
def welcome(name, msg = "Welcome to China!"):
"""This is a welcome function for
the person with the provided message"""
print("Hello", name + ', ' + msg)
welcome("Lily")
>>> %Run -c $EDITOR_CONTENT
Hello Lily, Welcome to China!
この関数では、パラメータ name
にはデフォルト値がなく、呼び出し時に必須です。
一方で、パラメータ msg
のデフォルト値は「中国へようこそ!」です。したがって、呼び出し時にはオプショナルです。値が提供された場合、デフォルト値は上書きされます。
関数の任意の数の引数にデフォルト値を持たせることができます。しかし、デフォルト引数がある場合、右側のすべての引数にもデフォルト値が必要です。
これは、デフォルト引数の後に非デフォルト引数を続けることはできないことを意味します。
例えば、上記の関数ヘッダーを以下のように定義した場合:
def welcome(name = "Lily", msg):
以下のエラーメッセージを受け取ります:
>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
SyntaxError: non-default argument follows default argument
キーワード引数¶
特定の値で関数を呼び出すと、これらの値は位置に基づいて引数に割り当てられます。
例えば、上記の関数welcome()で、welcome("Lily", "中国へようこそ")と呼び出したとき、"Lily"の値が name
に、同様に"中国へようこそ"がパラメータ msg
に割り当てられます。
MicroPythonではキーワード引数を使って関数を呼び出すことができます。この方法で関数を呼び出すと、引数の順序(位置)を変更することができます。
# keyword arguments
welcome(name = "Lily",msg = "Welcome to China!")
# keyword arguments (out of order)
welcome(msg = "Welcome to China!",name = "Lily")
#1 positional, 1 keyword argument
welcome("Lily", msg = "Welcome to China!")
関数呼び出し時に位置引数とキーワード引数を混在させることができることがわかります。しかし、キーワード引数は位置引数の後に来なければならないことを覚えておく必要があります。
キーワード引数の後に位置引数があるとエラーになります。
例えば、関数の呼び出しが以下のようであれば:
welcome(name="Lily","Welcome to China!")
以下のエラーが発生します:
>>> %Run -c $EDITOR_CONTENT
Traceback (most recent call last):
File "<stdin>", line 5, in <module>
SyntaxError: non-keyword arg after keyword arg
任意の引数¶
関数に渡される引数の数が事前にわからない場合があります。
関数定義で、パラメータ名の前にアスタリスク(*)を追加することができます。
def welcome(*names):
"""This function welcomes all the person
in the name tuple"""
#names is a tuple with arguments
for name in names:
print("Welcome to China!", name)
welcome("Lily","John","Wendy")
>>> %Run -c $EDITOR_CONTENT
Welcome to China! Lily
Welcome to China! John
Welcome to China! Wendy
ここで、複数の引数で関数を呼び出しました。これらの引数は関数に渡される前にタプルにパックされます。
関数の中では、forループを使用してすべての引数を取り出します。
再帰¶
Pythonでは、関数が他の関数を呼び出すことができます。関数が自分自身を呼び出すことも可能です。このタイプの構造は再帰関数と呼ばれます。
これはデータをループして結果に到達するという意味で有利です。
開発者は再帰に非常に注意する必要があります。非常に簡単に終了しない関数を書いたり、過剰なメモリやプロセッサパワーを使用したりすることがあります。しかし、正しく書かれた再帰は、非常に効率的で数学的にエレガントなプログラミングのアプローチになることがあります。
def rec_func(i):
if(i > 0):
result = i + rec_func(i - 1)
print(result)
else:
result = 0
return result
rec_func(6)
>>> %Run -c $EDITOR_CONTENT
1
3
6
10
15
21
この例では、rec_func()は自分自身を呼び出すように定義された関数です(「再帰」)。 i
変数をデータとして使用し、再帰するたびに(-1)減少します。条件が0より大きくない場合(つまり0の場合)、再帰は終了します。
新しい開発者にとっては、どのように動作するかを把握するまでに時間がかかるかもしれませんが、テストして修正することが最善の方法です。
再帰の利点
再帰関数はコードをクリーンでエレガントにします。
複雑なタスクを再帰を使ってよりシンプルなサブ問題に分割することができます。
いくつかのネストされたイテレーションを使用するよりも、再帰を使ったシーケンス生成が容易です。
再帰の欠点
再帰の背後にある論理を追うのが時々難しいです。
再帰呼び出しは高コスト(非効率的)で、多くのメモリと時間を取ります。
再帰関数はデバッグが難しいです。
データ型¶
組み込みデータ型¶
MicroPythonには以下のデータ型があります:
テキスト型: str
数値型: int, float, complex
シーケンス型: list, tuple, range
マッピング型: dict
セット型: set, frozenset
ブール型: bool
バイナリ型: bytes, bytearray, memoryview
データ型の取得¶
type() 関数を使用することで、任意のオブジェクトのデータ型を取得できます:
a = 6.8
print(type(a))
>>> %Run -c $EDITOR_CONTENT
<class 'float'>
データ型の設定¶
MicroPythonでは、データ型を特に設定する必要はありません。変数に値を割り当てたときに決定されています。
x = "welcome"
y = 45
z = ["apple", "banana", "cherry"]
print(type(x))
print(type(y))
print(type(z))
>>> %Run -c $EDITOR_CONTENT
<class 'str'>
<class 'int'>
<class 'list'>
>>>
特定のデータ型の設定¶
データ型を指定したい場合は、以下のコンストラクタ関数を使用できます:
例 |
データ型 |
---|---|
x = int(20) |
int |
x = float(20.5) |
float |
x = complex(1j) |
complex |
x = str("Hello World") |
str |
x = list(("apple", "banana", "cherry")) |
list |
x = tuple(("apple", "banana", "cherry")) |
tuple |
x = range(6) |
range |
x = dict(name="John", age=36) |
dict |
x = set(("apple", "banana", "cherry")) |
set |
x = frozenset(("apple", "banana", "cherry")) |
frozenset |
x = bool(5) |
bool |
x = bytes(5) |
bytes |
x = bytearray(5) |
bytearray |
x = memoryview(bytes(5)) |
memoryview |
いくつかを出力して結果を見ることができます。
a = float(20.5)
b = list(("apple", "banana", "cherry"))
c = bool(5)
print(a)
print(b)
print(c)
>>> %Run -c $EDITOR_CONTENT
20.5
['apple', 'banana', 'cherry']
True
>>>
型変換¶
int(), float(), complex()メソッドを使用して、一つの型から別の型に変換できます: Pythonでは、コンストラクタ関数を使用してキャスティングを行います:
int() - 整数リテラル、フロートリテラル(すべての小数を除去する)、または文字列リテラル(文字列が整数を表す場合)から整数を構築します
float() - 整数リテラル、フロートリテラル、または文字列リテラル(文字列がフロートまたは整数を表す場合)からフロート数を構築します
str() - 文字列、整数リテラル、フロートリテラルを含む幅広いデータ型から文字列を構築します
a = float("5")
b = int(3.7)
c = str(6.0)
print(a)
print(b)
print(c)
注意: 複素数は他の数値型に変換することはできません。
演算子¶
演算子は、変数と値に対して操作を行うために使用されます。
算術演算子¶
算術演算子を使用して、一般的な数学的操作を行うことができます。
演算子 |
名前 |
---|---|
+ |
足し算 |
- |
引き算 |
* |
掛け算 |
/ |
割り算 |
% |
剰余 |
** |
累乗 |
// |
切り捨て除算 |
x = 5
y = 3
a = x + y
b = x - y
c = x * y
d = x / y
e = x % y
f = x ** y
g = x // y
print(a)
print(b)
print(c)
print(d)
print(e)
print(f)
print(g)
>>> %Run -c $EDITOR_CONTENT
8
2
15
1.66667
2
125
1
8
2
15
>>>
代入演算子¶
代入演算子は、変数に値を代入するために使用できます。
オペレーター |
例 |
と同じ |
---|---|---|
= |
a = 6 |
a =6 |
+= |
a += 6 |
a = a + 6 |
-= |
a -= 6 |
a = a - 6 |
*= |
a *= 6 |
a = a * 6 |
/= |
a /= 6 |
a = a / 6 |
%= |
a %= 6 |
a = a % 6 |
**= |
a **= 6 |
a = a ** 6 |
//= |
a //= 6 |
a = a // 6 |
&= |
a &= 6 |
a = a & 6 |
|= |
a |= 6 |
a = a | 6 |
^= |
a ^= 6 |
a = a ^ 6 |
>>= |
a >>= 6 |
a = a >> 6 |
<<= |
a <<= 6 |
a = a << 6 |
a = 6
a *= 6
print(a)
>>> %Run test.py
36
>>>
比較演算子¶
比較演算子は 2 つの値を比較するために使用されます。
オペレーター |
名前 |
---|---|
== |
等しい |
!= |
等しくない |
< |
より小さい |
> |
より大きい |
>= |
以上 |
<= |
以下 |
a = 6
b = 8
print(a>b)
>>> %Run test.py
False
>>>
False を返します。なぜなら、 a は b より小さいからです。
論理演算子¶
論理演算子は条件文を組み合わせるために使用されます。
演算子 |
説明 |
---|---|
and |
両方の文が真であればTrueを返す |
or |
一方の文が真であればTrueを返す |
not |
結果を反転させ、結果が真であればFalseを返す |
a = 6
print(a > 2 and a < 8)
>>> %Run -c $EDITOR_CONTENT
True
>>>
同一性演算子¶
同一性演算子は、オブジェクトが等しいかではなく、実際に同じオブジェクトで、同じメモリ位置にあるかどうかを比較するために使用されます。
演算子 |
説明 |
---|---|
is |
両方の変数が同じオブジェクトであればTrueを返す |
is not |
両方の変数が同じオブジェクトでなければTrueを返す |
a = ["hello", "welcome"]
b = ["hello", "welcome"]
c = a
print(a is c)
# returns True because z is the same object as x
print(a is b)
# returns False because x is not the same object as y, even if they have the same content
print(a == b)
# returns True because x is equal to y
>>> %Run -c $EDITOR_CONTENT
True
False
True
>>>
メンバーシップ演算子¶
メンバーシップ演算子は、シーケンスがオブジェクト内に存在するかどうかをテストするために使用されます。
演算子 |
説明 |
---|---|
in |
指定された値のシーケンスがオブジェクトに存在する場合はTrueを返す |
not in |
指定された値のシーケンスがオブジェクトに存在しない場合はTrueを返す |
a = ["hello", "welcome", "Goodmorning"]
print("welcome" in a)
>>> %Run -c $EDITOR_CONTENT
True
>>>
ビット演算子¶
ビット演算子は、(バイナリ)数値を比較するために使用されます。
演算子 |
名前 |
説明 |
---|---|---|
& |
AND |
両方のビットが1の場合、各ビットを1に設定 |
OR |
二つのビットのうち一方が1の場合、各ビットを1に設定 |
|
^ |
XOR |
二つのビットのうち一方だけが1の場合、各ビットを1に設定 |
~ |
NOT |
すべてのビットを反転 |
<< |
ゼロ埋め左シフト |
右からゼロを押し込んで左シフトし、最左ビットを落とす |
>> |
符号付き右シフト |
最左ビットのコピーを左から押し込んで右シフトし、最右ビットを落とす |
num = 2
print(num & 1)
print(num | 1)
print(num << 1)
>>> %Run -c $EDITOR_CONTENT
0
3
4
>>>
リスト¶
リストは、複数のアイテムを単一の変数で格納するために使用され、角括弧を使って作成されます:
B_list = ["Blossom", "Bubbles","Buttercup"]
print(B_list)
リストのアイテムは変更可能で、順序があり、重複した値を許可します。 リストアイテムはインデックス付けされ、最初のアイテムがインデックス[0]、2番目のアイテムがインデックス[1]などです。
C_list = ["Red", "Blue", "Green", "Blue"]
print(C_list) # duplicate
print(C_list[0])
print(C_list[1]) # ordered
C_list[2] = "Purple" # changeable
print(C_list)
>>> %Run -c $EDITOR_CONTENT
['Red', 'Blue', 'Green', 'Blue']
Red
Blue
['Red', 'Blue', 'Purple', 'Blue']
リストは異なるデータ型を含むことができます:
A_list = ["Banana", 255, False, 3.14]
print(A_list)
>>> %Run -c $EDITOR_CONTENT
['Banana', 255, False, 3.14]
リストの長さ¶
リスト内のアイテム数を確認するには、len()関数を使用します。
A_list = ["Banana", 255, False, 3.14]
print(len(A_list))
>>> %Run -c $EDITOR_CONTENT
4
リストアイテムの確認¶
リストの2番目のアイテムを出力します:
A_list = ["Banana", 255, False, 3.14]
print(A_list[1])
>>> %Run -c $EDITOR_CONTENT
[255]
リストの最後のアイテムを出力します:
A_list = ["Banana", 255, False, 3.14]
print(A_list[-1])
>>> %Run -c $EDITOR_CONTENT
[3.14]
2番目と3番目のアイテムを出力します:
A_list = ["Banana", 255, False, 3.14]
print(A_list[1:3])
>>> %Run -c $EDITOR_CONTENT
[255, False]
リストアイテムの変更¶
2番目と3番目のアイテムを変更します:
A_list = ["Banana", 255, False, 3.14]
A_list[1:3] = [True,"Orange"]
print(A_list)
>>> %Run -c $EDITOR_CONTENT
['Banana', True, 'Orange', 3.14]
2番目の値を2つの値で置き換えて変更します:
A_list = ["Banana", 255, False, 3.14]
A_list[1:2] = [True,"Orange"]
print(A_list)
>>> %Run -c $EDITOR_CONTENT
['Banana', True, 'Orange', False, 3.14]
リストアイテムの追加¶
append()メソッドを使用してアイテムを追加します:
C_list = ["Red", "Blue", "Green"]
C_list.append("Orange")
print(C_list)
>>> %Run -c $EDITOR_CONTENT
['Red', 'Blue', 'Green', 'Orange']
2番目の位置にアイテムを挿入します:
C_list = ["Red", "Blue", "Green"]
C_list.insert(1, "Orange")
print(C_list)
>>> %Run -c $EDITOR_CONTENT
['Red', 'Orange', 'Blue', 'Green']
リストアイテムの削除¶
remove()メソッドは指定されたアイテムを削除します。
C_list = ["Red", "Blue", "Green"]
C_list.remove("Blue")
print(C_list)
>>> %Run -c $EDITOR_CONTENT
['Red', 'Green']
pop()メソッドは指定されたインデックスを削除します。インデックスを指定しない場合、pop()メソッドは最後のアイテムを削除します。
A_list = ["Banana", 255, False, 3.14, True,"Orange"]
A_list.pop(1)
print(A_list)
A_list.pop()
print(A_list)
>>> %Run -c $EDITOR_CONTENT
255
['Banana', False, 3.14, True, 'Orange']
'Orange'
['Banana', False, 3.14, True]
del
キーワードも指定されたインデックスを削除します:
C_list = ["Red", "Blue", "Green"]
del C_list[1]
print(C_list)
>>> %Run -c $EDITOR_CONTENT
['Red', 'Green']
clear()メソッドはリストを空にします。リストは残りますが、内容はありません。
C_list = ["Red", "Blue", "Green"]
C_list.clear()
print(C_list)
>>> %Run -c $EDITOR_CONTENT
[]
2. ディスプレイ
2.1 こんにちは、LED!¶
プログラム学習の最初の一歩として「Hello, world!」を出力するように、プログラムを使ってLEDを操作することは物理的プログラミング学習の伝統的な導入です。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全てのキットを購入すると便利ですが、こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから別々に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトのESP32ボードにある利用可能なピンのリストはこちらです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

この回路はシンプルな原理で動作し、電流の方向は図に示されています。pin26がハイレベルを出力した後に220オームの電流制限抵抗を通過するとLEDが点灯します。pin26がローレベルを出力するとLEDが消えます。
配線図

コードを実行する
esp32-starter-kit-main\micropython\codes
パスにある2.1_hello_led.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。# Import the necessary libraries import machine import time # Set up the LED on pin 26 as an output pin led = machine.Pin(26, machine.Pin.OUT) # Start an infinite loop while True: # Turn on the LED by setting its value to 1 (HIGH) led.value(1) # Wait for 1 second (1000 milliseconds) while the LED is on time.sleep(1) # Turn off the LED by setting its value to 0 (LOW) led.value(0) # Wait for 0.5 seconds (500 milliseconds) while the LED is off time.sleep(0.5)
Micro USBケーブルを使用してESP32 WROOM 32Eをコンピューターに接続します。
その後、右下隅にある「MicroPython (ESP32).COMXX」インタープリタをクリックします。
最後に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。
コードを実行した後、LEDが点滅するのが見えます。
どのように動作するのか?
machine
とtime
の2つのモジュールをインポートします。machine
モジュールはマイクロコントローラのハードウェアに低レベルでアクセスするためのものであり、time
モジュールは時間に関連する操作のための関数を提供します。import machine import time
次に、
machine.Pin()
関数をmachine.Pin.OUT
引数とともに使用してpin26を出力ピンとして設定します。led = machine.Pin(26, machine.Pin.OUT)
While True
ループでは、led.value(1)
を使用してpin26の値を1に設定し、1秒間LEDを点灯させ、その後0に設定して(led.value(0)
)1秒間消灯し、無限ループでこれを繰り返します。while True: # Turn on the LED by setting its value to 1 (HIGH) led.value(1) # Wait for 1 second (1000 milliseconds) while the LED is on time.sleep(1) # Turn off the LED by setting its value to 0 (LOW) led.value(0) # Wait for 0.5 seconds (500 milliseconds) while the LED is off time.sleep(0.5)
もっと学ぶ
このプロジェクトでは、MicroPythonの「machine」と「time」モジュールを使用しました。これらのモジュールをさらに使いこなす方法はこちらで見つけることができます。
2.2 LEDのフェード効果¶
前回のプロジェクトでは、デジタル出力を使ってLEDの点灯と消灯を制御しました。今回のプロジェクトでは、パルス幅変調(PWM)を利用してLEDに呼吸効果を作り出します。PWMは、正方形波信号のデューティサイクルを変化させることで、LEDの明るさやモーターの速度を制御する技術です。
PWMを使うことで、単にLEDをオンまたはオフにするのではなく、各サイクル内でLEDがオンになる時間とオフになる時間の割合を調整します。LEDを高速にオンとオフを繰り返すことで、LEDが徐々に明るくなったり暗くなったりする錯覚を作り出し、呼吸のような効果をシミュレートします。
ESP32 WROOM 32EのPWM機能を使用することで、LEDの明るさを滑らかで正確に制御することができます。この呼吸効果はプロジェクトにダイナミックで視覚的に魅力的な要素を加え、目を引くディスプレイや雰囲気を作り出します。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全てのキットを購入すると便利ですが、こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから別々に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトのESP32ボードにある利用可能なピンのリストはこちらです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

このプロジェクトは最初のプロジェクト 2.1 こんにちは、LED! と同じ回路ですが、信号の種類が異なります。最初のプロジェクトではpin26から直接デジタルの高低レベル(0&1)を出力してLEDを点灯または消灯させますが、このプロジェクトではpin26からPWM信号を出力してLEDの明るさを制御します。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある2.2_fading_led.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。その後、「現在のスクリプトを実行」をクリックするかF5キーを押して実行します。右下の角にある「MicroPython (ESP32).COMxx」インタープリターを選択してください。
# Import the necessary libraries
from machine import Pin, PWM
import time
# Create a PWM object
led = PWM(Pin(26), freq=1000)
while True:
# Gradually increase brightness
for duty_cycle in range(0, 1024, 1):
led.duty(duty_cycle)
time.sleep(0.01)
# Gradually decrease brightness
for duty_cycle in range(1023, -1, -1):
led.duty(duty_cycle)
time.sleep(0.01)
コードが実行されると、LEDは徐々に明るくなります。
どのように動作するのか?
このコードは、PWM信号を使用してLEDの明るさを制御する方法を示しています。
machine
とtime
の2つのモジュールをインポートします。machine
モジュールはマイクロコントローラのハードウェアに低レベルでアクセスするためのものであり、time
モジュールは時間に関連する操作のための関数を提供します。import machine import time
次に、ピン26に接続されたLEDを制御するための
PWM
オブジェクトを初期化し、PWM信号の周波数を1000 Hzに設定します。led = PWM(Pin(26), freq=1000)
ループを使用してLEDを徐々に明るくしたり暗くしたりします:外側の
while True
ループは無限に実行されます。2つのネストされたfor
ループを使用して、LEDの明るさを徐々に増減します。デューティサイクルは0から1023の範囲で、0%から100%のデューティサイクルを表します。# Import the necessary libraries from machine import Pin, PWM import time # Create a PWM object led = PWM(Pin(26), freq=1000) while True: # Gradually increase brightness for duty_cycle in range(0, 1024, 2): led.duty(duty_cycle) time.sleep(0.01) # Gradually decrease brightness for duty_cycle in range(1023, -1, -2): led.duty(duty_cycle) time.sleep(0.01)
range()
: 0から1023までの整数のシーケンスを作成します。PWM
オブジェクトのduty()
メソッドを使用して、シーケンスの各値にPWM信号のデューティサイクルを設定します。time.sleep()
: ループの各反復の間にプログラムの実行を10ミリ秒間一時停止し、時間の経過とともに徐々に明るさを増加させます。
2.3 カラフルライト¶
このプロジェクトでは、RGB LEDを使用して加法色混合の魅力的な世界について探ります。
RGB LEDは、赤、緑、青の3つの基本色を一つのパッケージに組み合わせています。これら3つのLEDは共通のカソードピンを共有しており、各アノードピンが対応する色の強度を制御します。
各アノードに適用される電気信号の強度を変えることで、幅広い色を作り出すことができます。例えば、高強度の赤色光と緑色光を混ぜると黄色光になり、青色と緑色の光を組み合わせるとシアンが生まれます。
このプロジェクトを通じて、加法色混合の原理を探求し、RGB LEDを操作して魅力的で生き生きとした色を表示することで、私たちの創造性を解き放ちます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全てのキットを購入すると便利ですが、こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから別々に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトのESP32ボードにある利用可能なピンのリストはこちらです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

PWMピンのpin27、pin26、pin25は、それぞれRGB LEDの赤、緑、青のピンを制御し、共通カソードピンをGNDに接続します。これにより、異なるPWM値をこれらのピンに重ねて特定の色をRGB LEDに表示させることができます。
配線図

RGB LEDには4本のピンがあります。長いピンは共通のカソードピンで、通常GNDに接続されます。最長のピンの隣の左ピンは赤、右側の2本のピンは緑と青です。

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある2.3_colorful_light.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。その後、「現在のスクリプトを実行」をクリックするかF5キーを押して実行します。右下の角にある「MicroPython (ESP32).COMxx」インタープリターを選択してください。
from machine import Pin, PWM
import time
# Define the GPIO pins for the RGB LED
RED_PIN = 27
GREEN_PIN = 26
BLUE_PIN = 25
# Set up the PWM channels
red = PWM(Pin(RED_PIN))
green = PWM(Pin(GREEN_PIN))
blue = PWM(Pin(BLUE_PIN))
# Set the PWM frequency
red.freq(1000)
green.freq(1000)
blue.freq(1000)
def set_color(r, g, b):
red.duty(r)
green.duty(g)
blue.duty(b)
while True:
# Set different colors and wait for a while
set_color(1023, 0, 0) # Red
time.sleep(1)
set_color(0, 1023, 0) # Green
time.sleep(1)
set_color(0, 0, 1023) # Blue
time.sleep(1)
set_color(1023, 0, 1023) # purple
time.sleep(1)
スクリプトを実行すると、RGB LEDが赤、緑、青、紫などの色を表示します。
詳細を知る
以下のコードで、0~255の馴染みのある色値を使って、任意の色を設定することもできます。
注釈
esp32-starter-kit-main\micropython\codes
パスにある2.3_colorful_light_rgb.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。その後、「現在のスクリプトを実行」をクリックするかF5キーを押して実行します。右下の角にある「MicroPython (ESP32).COMxx」インタープリターを選択してください。
from machine import Pin, PWM
import time
# Define the GPIO pins for the RGB LED
RED_PIN = 27
GREEN_PIN = 26
BLUE_PIN = 25
# Set up the PWM channels
red = PWM(Pin(RED_PIN))
green = PWM(Pin(GREEN_PIN))
blue = PWM(Pin(BLUE_PIN))
# Set the PWM frequency
red.freq(1000)
green.freq(1000)
blue.freq(1000)
# Map input values from one range to another
def interval_mapping(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
# Convert color values (0-255) to duty cycle values (0-1023)
def color_to_duty(rgb_value):
rgb_value = int(interval_mapping(rgb_value,0,255,0,1023))
return rgb_value
def set_color(red_value,green_value,blue_value):
red.duty(color_to_duty(red_value))
green.duty(color_to_duty(green_value))
blue.duty(color_to_duty(blue_value))
while True:
# Set different colors and wait for a while
set_color(255, 0, 0) # Red
time.sleep(1)
set_color(0, 255, 0) # Green
time.sleep(1)
set_color(0, 0, 255) # Blue
time.sleep(1)
set_color(255, 0, 255) # purple
time.sleep(1)
このコードは前の例に基づいていますが、0から255の色値を0から1023のデューティサイクル範囲にマッピングします。
interval_mapping
関数は、ある範囲から別の範囲への値をマッピングするユーティリティ関数です。入力値、入力範囲の最小値と最大値、出力範囲の最小値と最大値の5つの引数を取ります。入力値を出力範囲にマッピングした値を返します。def color_to_duty(rgb_value): rgb_value = int(interval_mapping(rgb_value,0,255,0,1023)) return rgb_value
color_to_duty
関数は、整数RGB値(例:255,0,255)を取り、PWMピンに適したデューティサイクル値にマッピングします。入力RGB値は最初にinterval_mapping
関数を使用して0-255の範囲から0-1023の範囲にマッピングされます。その後、interval_mapping
の出力がデューティサイクル値として返されます。def color_to_duty(rgb_value): rgb_value = int(interval_mapping(rgb_value,0,255,0,1023)) return rgb_value
color_set
関数は、LEDの赤、緑、青の値を表す3つの整数引数を取ります。これらの値はcolor_to_duty
に渡されて、PWMピンのデューティサイクル値を取得します。デューティサイクル値は、duty
メソッドを使用して対応するピンに設定されます。def set_color(red_value,green_value,blue_value): red.duty(color_to_duty(red_value)) green.duty(color_to_duty(green_value)) blue.duty(color_to_duty(blue_value))
2.4 マイクロチップ - 74HC595¶
このプロジェクトへようこそ!このプロジェクトでは、74HC595チップを使用して、8つのLEDの流れるような表示を制御します。
このプロジェクトを実行して、8つのLEDの間で跳ねるようなキラキラとした虹のような流れる光を目の当たりにすることを想像してください。一つ一つのLEDが次々に点灯し、すぐに消えていき、次のLEDが輝き続けることで、美しくダイナミックな効果を生み出します。
74HC595チップを巧みに利用することで、複数のLEDのオン・オフ状態を制御し、流れる効果を実現できます。このチップには複数の出力ピンがあり、LEDの照明順序を制御するために直列に接続することができます。また、チップの拡張性のおかげで、より多くのLEDを流れる表示に簡単に追加することができ、さらに壮観な効果を作り出すことができます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると便利ですが、以下のリンクからも別々に購入できます。
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトに利用可能なESP32ボードのピンのリストは以下の通りです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

MR(ピン10)がハイレベルでCE(ピン13)がローレベルの場合、SHcpの立ち上がりエッジでデータが入力され、SHcpの立ち上がりエッジでメモリレジスタへ移行します。
二つのクロックが一緒に接続されている場合、シフトレジスタはメモリレジスタよりも常に一つのパルス分先行します。
メモリレジスタには、シリアルシフト入力ピン(DS)、シリアル出力ピン(Q7')および非同期リセットボタン(ローレベル)があります。
メモリレジスタは、パラレル8ビットで三状態のバスを出力します。
OEが有効(ローレベル)の場合、メモリレジスタ内のデータがバス(Q0 ~ Q7)に出力されます。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある2.4_microchip_74hc595.py
ファイルを開くか、Thonnyにコードをコピー&ペーストしてください。その後、「現在のスクリプトを実行」をクリックするかF5キーを押して実行します。右下の角にある「MicroPython (ESP32).COMxx」インタープリターを選択してください。
import machine
import time
# Initialize the pins for the 74HC595 shift register
sdi = machine.Pin(25, machine.Pin.OUT) # DS
rclk = machine.Pin(27, machine.Pin.OUT) # STcp
srclk = machine.Pin(26, machine.Pin.OUT) # SHcp
# Define the hc595_shift function to shift data into the 74HC595 shift register
def hc595_shift(dat):
# Set the RCLK pin to low
rclk.off()
# Iterate through each bit (from 7 to 0)
for bit in range(7, -1, -1):
# Extract the current bit from the input data
value = 1 & (dat >> bit)
# Set the SRCLK pin to low
srclk.off()
# Set the value of the SDI pin
sdi.value(value)
# Clock the current bit into the shift register by setting the SRCLK pin to high
srclk.on()
# Latch the data into the storage register by setting the RCLK pin to high
rclk.on()
num = 0
# Shift data into the 74HC595 to create a moving LED pattern
for i in range(16):
if i < 8:
num = (num << 1) + 1 # Shift left and set the least significant bit to 1
elif i >= 8:
num = (num & 0b01111111) << 1 # Mask the most significant bit and shift left
hc595_shift(num) # Shift the current value into the 74HC595
print("{:0>8b}".format(num)) # Print the current value in binary format
time.sleep_ms(200) # Wait 200 milliseconds before shifting the next value
このスクリプトを実行すると、LEDが順番に点灯し、元の順序で消灯します。
どのように動作するのか?
このコードは8ビットのシフトレジスタ(74595)を制御し、シフトレジスタに異なるバイナリ値を出力し、各値を一定時間LEDに表示します。
machine
とtime
モジュールをインポートしています。machine
モジュールはハードウェアI/Oを制御するために、time
モジュールはタイムディレイやその他の機能を実装するために使用されます。import machine import time
machine.Pin()
関数を使用して、データポート(SDI)、ストレージクロックポート(RCLK)、シフトレジスタクロックポート(SRCLK)に対応する三つの出力ポートを初期化します。# Initialize the pins for the 74HC595 shift register sdi = machine.Pin(25, machine.Pin.OUT) # DS rclk = machine.Pin(27, machine.Pin.OUT) # STcp srclk = machine.Pin(26, machine.Pin.OUT) # SHcp
シフトレジスタに8ビットデータを書き込むための関数
hc595_shift()
を定義します。def hc595_shift(dat): # Set the RCLK pin to low rclk.off() # Iterate through each bit (from 7 to 0) for bit in range(7, -1, -1): # Extract the current bit from the input data value = 1 & (dat >> bit) # Set the SRCLK pin to low srclk.off() # Set the value of the SDI pin sdi.value(value) # Clock the current bit into the shift register by setting the SRCLK pin to high srclk.on() # Latch the data into the storage register by setting the RCLK pin to high rclk.on()
for
ループについて。for i in range(16): if i < 8: num = (num << 1) + 1 # Shift left and set the least significant bit to 1 elif i >= 8: num = (num & 0b01111111) << 1 # Mask the most significant bit and shift left hc595_shift(num) # Shift the current value into the 74HC595 print("{:0>8b}".format(num)) # Print the current value in binary format time.sleep_ms(200) # Wait 200 milliseconds before shifting the next value
変数
i
は出力バイナリ値を制御するために使用されます。最初の8回の反復では、numの値は次々に00000001, 00000011, 00000111, ..., 11111111になり、1ビット左にシフトされてから1を加算します。9回目から16回目の反復では、最高位の1を最初に0に変更し、それから1ビット左にシフトします。これにより、00000010, 00000100, 00001000, ..., 10000000の出力値が生成されます。
各反復で、
num
の値はhc595_shift()
関数に渡され、シフトレジスタが対応するバイナリ値を出力するように制御されます。バイナリ値を出力すると同時に、
print()
関数はバイナリ値を文字列としてターミナルに出力します。バイナリ値を出力した後、
time.sleep_ms()
関数を使用してプログラムを200ミリ秒一時停止し、LED上の値が一定期間表示されるようにします。
2.5 数字表示¶
皆さん、この魅力的なプロジェクトへようこそ!このプロジェクトでは、0から9までの数字を7セグメントディスプレイに表示する世界を探求します。
このプロジェクトを起動し、0から9までの各数字が鮮やかに光る小型のコンパクトなディスプレイを目の当たりにすることを想像してみてください。それは、魅力的な方法で数字をショーケースするミニチュアスクリーンを持っているようなものです。信号ピンを制御することで、表示される数字を簡単に変更し、さまざまな魅力的なエフェクトを作成することができます。
シンプルな回路接続とプログラミングを通じて、7セグメントディスプレイと対話し、望む数字を実現する方法を学びます。カウンターであろうと、時計であろうと、または他の魅力的なアプリケーションであろうと、7セグメントディスプレイはあなたのプロジェクトに輝きを加える信頼できるコンパニオンになります。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入するのが間違いなく便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらはこのプロジェクトのESP32ボードで利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

こちらの配線原理は基本的に 2.4 マイクロチップ - 74HC595 と同じですが、唯一の違いはQ0-Q7が7セグメントディスプレイのa〜gピンに接続されていることです。
74HC595 |
LEDセグメント表示 |
---|---|
Q0 |
a |
Q1 |
b |
Q2 |
c |
Q3 |
d |
Q4 |
e |
Q5 |
f |
Q6 |
g |
Q7 |
dp |
配線図

コード
注釈
2.5_number_display.py
ファイルをesp32-starter-kit-main\micropython\codes
パスから開くか、またはコードをThonnyにコピーして貼り付けます。その後、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタープリターを選択してください。
import machine
import time
# Define the segment code for a common anode 7-segment display
SEGCODE = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f]
# Initialize the pins for the 74HC595 shift register
sdi = machine.Pin(25, machine.Pin.OUT) # DS
rclk = machine.Pin(27, machine.Pin.OUT) # STcp
srclk = machine.Pin(26, machine.Pin.OUT) # SHcp
# Define the hc595_shift function to shift data into the 74HC595 shift register
def hc595_shift(dat):
# Set the RCLK pin to low
rclk.off()
# Iterate through each bit (from 7 to 0)
for bit in range(7, -1, -1):
# Extract the current bit from the input data
value = 1 & (dat >> bit)
# Set the SRCLK pin to low
srclk.off()
# Set the value of the SDI pin
sdi.value(value)
# Clock the current bit into the shift register by setting the SRCLK pin to high
srclk.on()
# Latch the data into the storage register by setting the RCLK pin to high
rclk.on()
# Continuously loop through the numbers 0 to 9 and display them on the 7-segment display
while True:
for num in range(10):
hc595_shift(SEGCODE[num]) # Shift the segment code for the current number into the 74HC595
time.sleep_ms(500) # Wait 500 milliseconds before displaying the next number
スクリプトが実行されると、LEDセグメントディスプレイが0から9までの数字を順に表示します。
どのように動作するのか?
このプロジェクトでは、 hc595_shift()
関数を用いてバイナリ数値をシフトレジスタに書き込んでいます。
7セグメントディスプレイが数字の「2」を表示する場合を想定します。このビットパターンでは、セグメント f、 c、 dp がオフ(ロー)で、 a、 b、 d、 e、 g がオン(ハイ)です。これはバイナリでは「01011011」、16進数では「0x5b」となります。
従って、7セグメントディスプレイに「2」を表示するには、 hc595_shift(0x5b) を呼び出す必要があります。

以下の表には、7セグメントディスプレイに0から9までの数字を表示するためにシフトレジスタに書き込む必要がある16進数のパターンが示されています。
数字 |
バイナリーコード |
ヘックスコード |
---|---|---|
0 |
00111111 |
0x3f |
1 |
00000110 |
0x06 |
2 |
01011011 |
0x5b |
3 |
01001111 |
0x4f |
4 |
01100110 |
0x66 |
5 |
01101101 |
0x6d |
6 |
01111101 |
0x7d |
7 |
00000111 |
0x07 |
8 |
01111111 |
0x7f |
9 |
01101111 |
0x6f |
これらのコードを hc595_shift()
に書き込むことで、LEDセグメントディスプレイに対応する数字を表示させます。
2.6 文字の表示¶
ここでは、I2C LCD1602モジュールを使用した文字表示の魅力的な世界を探究します。
このプロジェクトを通じて、LCDモジュールの初期化、表示パラメータの設定、そして画面に表示する文字データの送信方法を学びます。カスタムメッセージのショーケース、センサー読み取りの表示、インタラクティブなメニューの作成など、可能性は無限大です!
I2C LCD1602で文字表示の技術をマスターすることで、プロジェクトでのコミュニケーションと情報表示の新たな道を開くことになります。このワクワクする旅に飛び込んで、LCDスクリーンにキャラクターを生き生きとさせましょう。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン |
使用説明 |
---|---|
IO21 |
SDA |
IO22 |
SCL |
回路図

配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある2.6_liquid_crystal_display.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
ここでは
lcd1602.py
ライブラリを使用しています。ESP32にアップロードされているか確認してください。チュートリアルについては 1.4 ライブラリのアップロード(重要) を参照してください。
# Import the LCD class from the lcd1602 module
from lcd1602 import LCD
import time
# Create an instance of the LCD class and assign it to the lcd variable
lcd = LCD()
# Set the string " Hello!\n"
string = " Hello!\n"
# Display the string on the LCD screen
lcd.message(string)
time.sleep(2)
# Set the string " Sunfounder!"
string = " Sunfounder!"
# Display the string on the LCD screen
lcd.message(string)
time.sleep(2)
# Clear the LCD screen
lcd.clear()
スクリプトを実行した後、LCDスクリーンには2行のテキストが順番に表示され、その後消えます。
注釈
コードと配線が正しいにもかかわらず、LCDが内容を表示しない場合は、背面のポテンショメータを調整してコントラストを上げてください。
どのように動作するのか?
lcd1602
ライブラリでは、lcd1602の関連機能をLCDクラスに統合しています。
lcd1602
モジュールをインポートします。from lcd1602 import LCD
LCD
クラスのオブジェクトを宣言し、lcd
と名付けます。lcd = LCD()
この文は、テキストをLCDに表示します。引数は文字列型である必要があります。整数や浮動小数点数を渡したい場合は、強制変換文
str()
を使用する必要があります。lcd.message(string)
この文を複数回呼び出すと、lcdはテキストを重ね合わせます。これには、表示をクリアするための以下の文を使用する必要があります。
lcd.clear()
2.7 RGB LEDストリップ¶
このプロジェクトでは、WS2812 LEDストリップを駆動する魅力的な世界に潜り込み、生き生きとした色彩のディスプレイを実現します。ストリップ上の各LEDを個別に制御する能力により、感覚を魅了する魅力的な照明効果を創り出すことができます。
さらに、ランダムな色を導入し、流れる光の効果を実装することで、魅力的で魅惑的な視覚体験を創出するという、このプロジェクトのエキサイティングな拡張についても探求します。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
注釈
IO33は、このプロジェクトでは使用できません。
WS2812 LEDストリップは、正確なパルス幅変調(PWM)信号を必要とするタイプのLEDストリップです。PWM信号は時間と電圧の両方において厳密な要件を持っています。例えば、WS2812の「0」ビットは約0.4マイクロ秒のハイレベルパルスに相当し、「1」ビットは約0.8マイクロ秒のハイレベルパルスに相当します。これは、ストリップが高周波の電圧変化を受け取る必要があることを意味します。
しかし、IO33に4.7Kのプルアップ抵抗と100nfのプルダウンコンデンサを使用すると、単純なローパスフィルタが作成されます。このタイプの回路は、コンデンサが電圧変化を受けたときに充電と放電に時間がかかるため、高周波信号を「滑らかに」します。したがって、信号があまりにも迅速に変化する(つまり、高周波である)場合、コンデンサは追いつくことができません。これにより、出力信号がぼやけてストリップに認識できなくなります。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある2.7_rgb_strip.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
from machine import Pin
from neopixel import NeoPixel
pin = Pin(14, Pin.OUT) # set a pin to output to drive NeoPixels
pixels = NeoPixel(pin, 8) # create NeoPixel driver on pin for 8 pixels
pixels[0] = [64,154,227] # set the pixel
pixels[1] = [128,0,128]
pixels[2] = [50,150,50]
pixels[3] = [255,30,30]
pixels[4] = [0,128,255]
pixels[5] = [99,199,0]
pixels[6] = [128,128,128]
pixels[7] = [255,100,0]
pixels.write() # write data to all pixels
RGB LEDストリップに好きな色を選んで表示しましょう!
どのように動作するのか?
neopixel
モジュール内で、関連する関数をNeoPixel
クラスに統合しました。from neopixel import NeoPixel
neopixel
モジュールのNeoPixel
クラスを使用して、データピンとLEDの数を指定してpixels
オブジェクトを初期化します。pixels = NeoPixel(pin, 8) # create NeoPixel driver on pin for 8 pixels
各LEDの色を設定し、
write()
メソッドを使用してデータをWS2812 LEDに送信し、表示を更新します。pixels[0] = [64,154,227] # set the pixel pixels[1] = [128,0,128] pixels[2] = [50,150,50] pixels[3] = [255,30,30] pixels[4] = [0,128,255] pixels[5] = [99,199,0] pixels[6] = [128,128,128] pixels[7] = [255,100,0] pixels.write() # write data to all pixels
もっと学ぶ
色をランダムに生成して、カラフルな流れる光を作ることができます。
注釈
esp32-starter-kit-main\micropython\codes
パスにある2.7_rgb_strip_random.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
from machine import Pin
import neopixel
import time
import random
# Set the number of pixels for the running light
num_pixels = 8
# Set the data pin for the RGB LED strip
data_pin = Pin(14, Pin.OUT)
# Initialize the RGB LED strip object
pixels = neopixel.NeoPixel(data_pin, num_pixels)
# Continuously loop the running light
while True:
for i in range(num_pixels):
# Generate a random color for the current pixel
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
# Turn on the current pixel with the random color
pixels[i] = color
# Update the RGB LED strip display
pixels.write()
# Turn off the current pixel
pixels[i] = (0, 0, 0)
# Wait for a period of time to control the speed of the running light
time.sleep_ms(100)
while
ループの中で、for
ループを使用してRGB LEDストリップの各ピクセルを順番に点灯させます。最初に
random.randint()
関数を使用して現在のピクセルのためのランダムな色を生成します。次に、ランダムな色で現在のピクセルを点灯させ、
NeoPixel
オブジェクトのwrite()
メソッドを使用して色データをRGB LEDストリップに送信し、表示を更新します。最後に、色を (0, 0, 0) に設定して現在のピクセルを消し、走る光の速度を制御するために一定時間待機します。
3. サウンド
3.1 ビープ音¶
これは、アクティブブザーを毎秒4回速くビープ音を鳴らすシンプルなプロジェクトです。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

IO14の出力が高いと、1Kの電流制限抵抗(トランジスタを保護するため)を経由して、S8050(NPNトランジスタ)が導通し、ブザーが鳴ります。
S8050(NPNトランジスタ)の役割は、電流を増幅してブザーの音を大きくすることです。実際には、ブザーを直接IO14に接続しても問題ありませんが、ブザーの音が小さくなることがわかります。
配線図
キットには2種類のブザーが含まれています。 アクティブブザーを使用する必要があります。それらを裏返すと、シールドされた背面(露出したPCBではない方)が必要なものです。

ブザーは動作時にトランジスタを使用する必要がありますが、ここではS8050(NPNトランジスタ)を使用します。

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある3.1_beep.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
# Create a Pin object representing pin 14 and set it to output mode
buzzer = machine.Pin(14, machine.Pin.OUT)
# Enter an infinite loop
while True:
# Iterate over the values 0 to 3 using a for loop
for i in range(4):
# Turn on the buzzer by setting its value to 1
buzzer.value(1)
# Pause for 0.2 seconds
time.sleep(0.2)
# Turn off the buzzer
buzzer.value(0)
# Pause for 0.2 seconds
time.sleep(0.2)
# Pause for 1 second before restarting the for loop
time.sleep(1)
スクリプトが実行されると、ブザーは毎秒4回速くビープ音を鳴らします。
3.2 カスタムトーン¶
前回のプロジェクトではアクティブブザーを使用しましたが、今回はパッシブブザーを使用します。
アクティブブザーと同様に、パッシブブザーも電磁誘導の現象を利用して動作します。違いは、パッシブブザーには発振源がないため、直流信号を使用してもビープ音を鳴らすことはありません。 しかし、これによりパッシブブザーは自身の発振周波数を調整でき、「ド、レ、ミ、ファ、ソ、ラ、シ」といった異なる音符を出すことができます。
パッシブブザーでメロディーを鳴らしましょう!
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

IO14の出力が高いと、1Kの電流制限抵抗(トランジスタを保護するため)を経由して、S8050(NPNトランジスタ)が導通し、ブザーが鳴ります。
S8050(NPNトランジスタ)の役割は、電流を増幅してブザーの音を大きくすることです。実際には、ブザーを直接IO14に接続しても問題ありませんが、ブザーの音が小さくなることがわかります。
配線図
キットには2種類のブザーが含まれています。 アクティブブザーを使用する必要があります。それらを裏返すと、シールドされた背面(露出したPCBではない方)が必要なものです。

ブザーは動作時にトランジスタを使用する必要がありますが、ここではS8050(NPNトランジスタ)を使用します。

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある3.2_custom_tone.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
# Define the frequencies of several musical notes in Hz
C4 = 262
D4 = 294
E4 = 330
F4 = 349
G4 = 392
A4 = 440
B4 = 494
# Create a PWM object representing pin 14 and assign it to the buzzer variable
buzzer = machine.PWM(machine.Pin(14))
# Define a tone function that takes as input a Pin object representing the buzzer, a frequency in Hz, and a duration in milliseconds
def tone(pin, frequency, duration):
pin.freq(frequency) # Set the frequency
pin.duty(512) # Set the duty cycle
time.sleep_ms(duration) # Pause for the duration in milliseconds
pin.duty(0) # Set the duty cycle to 0 to stop the tone
# Play a sequence of notes with different frequency inputs and durations
tone(buzzer, C4, 250)
time.sleep_ms(500)
tone(buzzer, D4, 250)
time.sleep_ms(500)
tone(buzzer, E4, 250)
time.sleep_ms(500)
tone(buzzer, F4, 250)
time.sleep_ms(500)
tone(buzzer, G4, 250)
time.sleep_ms(500)
tone(buzzer, A4, 250)
time.sleep_ms(500)
tone(buzzer, B4, 250)
どのように動作するのか?
パッシブブザーにデジタル信号を与えると、音を発生させることなくダイヤフラムを押し続けるだけです。
そのため、 tone()
関数を使用してPWM信号を生成し、パッシブブザーに音を出させます。
この関数には3つのパラメーターがあります:
pin
: ブザーを制御するピン。frequency
: ブザーの音程は周波数によって決まり、周波数が高いほど音程も高くなります。Duration
: 音の持続時間。
duty()
関数を使用してデューティサイクルを512(約50%)に設定します。他の数値でも構いませんが、不連続な電気信号を生成して振動させる必要があります。
もっと学ぶ
特定のピッチをシミュレートし、完全な音楽曲を演奏することができます。
注釈
esp32-starter-kit-main\micropython\codes
パスにある3.2_custom_tone_music.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
# Define the GPIO pin that is connected to the buzzer
buzzer = machine.PWM(machine.Pin(14))
# Define the frequencies of the notes in Hz
C5 = 523
D5 = 587
E5 = 659
F5 = 698
G5 = 784
A5 = 880
B5 = 988
# Define the durations of the notes in milliseconds
quarter_note = 250
half_note = 300
whole_note = 1000
# Define the melody as a list of tuples (note, duration)
melody = [
(E5, quarter_note),
(E5, quarter_note),
(F5, quarter_note),
(G5, half_note),
(G5, quarter_note),
(F5, quarter_note),
(E5, quarter_note),
(D5, half_note),
(C5, quarter_note),
(C5, quarter_note),
(D5, quarter_note),
(E5, half_note),
(E5, quarter_note),
(D5, quarter_note),
(D5, half_note),
(E5, quarter_note),
(E5, quarter_note),
(F5, quarter_note),
(G5, half_note),
(G5, quarter_note),
(F5, quarter_note),
(E5, quarter_note),
(D5, half_note),
(C5, quarter_note),
(C5, quarter_note),
(D5, quarter_note),
(E5, half_note),
(D5, quarter_note),
(C5, quarter_note),
(C5, half_note),
]
# Define a function to play a note with the given frequency and duration
def tone(pin,frequency,duration):
pin.freq(frequency)
pin.duty(512)
time.sleep_ms(duration)
pin.duty(0)
# Play the melody
for note in melody:
tone(buzzer, note[0], note[1])
time.sleep_ms(50)
tone
関数は、pin
オブジェクトのfreq
メソッドを使用して、ピンの周波数をfrequency
の値に設定します。次に、
pin
オブジェクトのduty
メソッドを使用して、ピンのデューティサイクルを512に設定します。これにより、ピンは指定された周波数と音量で
duration
ミリ秒の間音を出すことになります。これは、timeモジュールのsleep_ms
メソッドを使用します。コードは、
melody
と呼ばれるシーケンスを通じて反復し、メロディの各ノートに対してそのノートの周波数と持続時間でtone
関数を呼び出すことにより、メロディを演奏します。また、timeモジュールの
sleep_ms
メソッドを使用して、各ノートの間に50ミリ秒の短い休止を挿入します。
4. アクチュエーター
4.1 小型扇風機¶
この魅力的なプロジェクトでは、L293Dを使用してモーターを駆動する方法を探求します。
L293Dは、電子工学やロボティクスのプロジェクトでモーター制御によく使用される多目的な集積回路(IC)です。前進および後退の両方向で2つのモーターを駆動できるため、正確なモーター制御を必要とするアプリケーションに人気があります。
この魅力的なプロジェクトを終える頃には、デジタル信号とPWM信号を効果的に使用してモーターを制御する方法について十分な理解を得ることができます。この貴重な知識は、ロボティクスやメカトロニクスへの将来的な取り組みにおいて、しっかりとした基盤となるでしょう。L293Dを使ったモーター制御のエキサイティングな世界に飛び込む準備をしてください!
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

配線図
注釈
モーターは比較的高い電流を必要とするため、まずバッテリーを挿入し、その後拡張ボードのスイッチをON位置にスライドしてバッテリー供給をアクティブにする必要があります。

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある4.1_motor_turn.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
# Create Pin objects representing the motor control pins and set them to output mode
motor1A = machine.Pin(13, machine.Pin.OUT)
motor2A = machine.Pin(14, machine.Pin.OUT)
# Define a function to rotate the motor clockwise
def clockwise():
motor1A.value(1)
motor2A.value(0)
# Define a function to rotate the motor anticlockwise
def anticlockwise():
motor1A.value(0)
motor2A.value(1)
# Define a function to stop the motor
def stop():
motor1A.value(0)
motor2A.value(0)
# Enter an infinite loop
try:
while True:
clockwise() # Rotate the motor clockwise
time.sleep(1) # Pause for 1 second
anticlockwise() # Rotate the motor anticlockwise
time.sleep(1)
stop() # Stop the motor
time.sleep(2)
except KeyboardInterrupt:
stop() # Stop the motor when KeyboardInterrupt is caught
スクリプト実行中は、モーターが毎秒時計回りと反時計回りに交互に回転するのを見ることができます。
もっと学ぶ
モーターを単純に時計回りと反時計回りに回転させるだけでなく、以下に示すように制御ピンにパルス幅変調(PWM)を使用してモーターの回転速度を制御することもできます。
注釈
esp32-starter-kit-main\micropython\codes
パスにある4.1_motor_turn_pwm.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
from machine import Pin, PWM
import time
# Create PWM objects representing the motor control pins and set their frequency to 1000 Hz
motor1A = PWM(Pin(13, Pin.OUT))
motor2A = PWM(Pin(14, Pin.OUT))
motor1A.freq(500)
motor2A.freq(500)
# Enter an infinite loop
while True:
# Rotate the motor forward by gradually increasing the power on the motor1A pin
for power in range(0, 1023, 20):
motor1A.duty(power)
motor2A.duty(0)
time.sleep(0.1)
# Decreasing the power on the motor1A pin
for power in range(1023, 0, -20):
motor1A.duty(power)
motor2A.duty(0)
time.sleep(0.1)
# Rotate the motor in the opposite direction by gradually increasing the power on the motor2A pin
for power in range(0, 1023, 20):
motor1A.duty(0)
motor2A.duty(power)
time.sleep(0.1)
# Decreasing the power on the motor2A pin
for power in range(1023, 0, -20):
motor1A.duty(0)
motor2A.duty(power)
time.sleep(0.1)
以前のスクリプトとは異なり、ここでは1000Hzの周波数を持つPWM信号でモーターを制御しており、これがモーターの速度を決定します。
コードでは
while True
ループを使用して連続して実行します。ループ内には、モーターを制御する4つのfor
ループがあります。最初の2つの
for
ループは、IN2を0の速度で維持しながらIN1の速度を上げ下げします。次の2つの
for
ループは、IN1を0の速度で維持しながらIN2の速度を上げ下げします。各
for
ループのrange
関数は、PWM信号のデューティサイクルとして機能する一連の数字を生成します。これは、duty
メソッドを介してIN1またはIN2に出力されます。デューティサイクルは、PWM信号が高い状態である時間の割合を決定し、これによりモーターに適用される平均電圧、そしてモーターの速度を決定します。time.sleep
関数は、シーケンスの各ステップの間に0.1秒の遅延を導入するために使用され、モーターが瞬間的に一つの速度から別の速度にジャンプするのではなく、徐々に速度を変更することができます。
4.2 ポンピング¶
この興味深いプロジェクトでは、L293Dを使用して水ポンプを制御する方法について掘り下げていきます。
水ポンプ制御の領域では、他のモーターを制御するよりも少し単純です。このプロジェクトの美しさはそのシンプルさにあります - 回転の方向について心配する必要はありません。私たちの主な目標は、水ポンプを成功させて稼働させ続けることです。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
- |
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

配線図
注釈
バッテリーを挿入し、拡張ボード上のスイッチをON位置にスライドしてバッテリー供給をアクティブにすることを推奨します。

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある4.2_pumping.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
# Create Pin objects representing the motor control pins and set them to output mode
motor1A = machine.Pin(13, machine.Pin.OUT)
motor2A = machine.Pin(14, machine.Pin.OUT)
# Define a function to rotate the pump
def rotate():
motor1A.value(1)
motor2A.value(0)
# Define a function to stop the pump
def stop():
motor1A.value(0)
motor2A.value(0)
try:
while True:
rotate() # Rotate the motor clockwise
time.sleep(5) # Pause for 5 seconds
stop() # Stop the motor
time.sleep(2)
except KeyboardInterrupt:
stop() # Stop the motor when KeyboardInterrupt is caught
スクリプト実行中は、ポンプが稼働し、チューブから水が出てきて、2秒間停止した後、再び稼働を開始するのを見ることができます。
4.3 スイングサーボ¶
サーボは位置ベースのデバイスの一種で、特定の角度を維持し、正確な回転を行う能力で知られています。これにより、一貫した角度調整を必要とする制御システムに非常に望ましいものとなっています。サーボが、飛行機モデルから潜水艦のレプリカ、洗練されたリモートコントロールロボットに至るまで、高級遠隔制御玩具に広く使用されているのは驚くことではありません。
この魅力的な冒険では、サーボを独自の方法で操作することに挑戦します - スイングさせることによってです!このプロジェクトは、サーボのダイナミクスをより深く掘り下げ、正確な制御システムのスキルを磨き、その操作に関するより深い理解を得る絶好の機会を提供します。
サーボを自分の曲に合わせて踊らせる準備はできましたか?このエキサイティングな旅に出発しましょう!
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン |
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23 |
回路図

配線図
オレンジ色の線はシグナルで、IO25に接続されています。
赤色の線はVCCで、5Vに接続されています。
茶色の線はGNDで、GNDに接続されています。

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある4.3_swinging_servo.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
# Create a PWM (Pulse Width Modulation) object on Pin 25
servo = machine.PWM(machine.Pin(25))
# Set the frequency of the PWM signal to 50 Hz, common for servos
servo.freq(50)
# Define a function for interval mapping
def interval_mapping(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
# Define a function to write an angle to the servo
def servo_write(pin, angle):
pulse_width = interval_mapping(angle, 0, 180, 0.5, 2.5) # Calculate the pulse width
duty = int(interval_mapping(pulse_width, 0, 20, 0, 1023)) # Calculate the duty cycle
pin.duty(duty) # Set the duty cycle of the PWM signal
# Create an infinite loop
while True:
# Loop through angles from 0 to 180 degrees
for angle in range(180):
servo_write(servo, angle)
time.sleep_ms(20)
# Loop through angles from 180 to 0 degrees in reverse
for angle in range(180, -1, -1):
servo_write(servo, angle)
time.sleep_ms(20)
このコードを実行すると、サーボは0度から180度までの間を絶えず往復するようにスウィープします。
どのように動作するのか?
マイクロコントローラーのハードウェアを制御するための
machine
ライブラリと、遅延を追加するためのtime
ライブラリをインポートします。import machine import time
ピン25にPWM(パルス幅変調)オブジェクトを作成し、サーボに一般的な50 Hzにその周波数を設定します。
# Create a PWM (Pulse Width Modulation) object on Pin 25 servo = machine.PWM(machine.Pin(25)) # Set the frequency of the PWM signal to 50 Hz, common for servos servo.freq(50)
ある範囲から別の範囲に値をマッピングする
interval_mapping
関数を定義します。これは、角度を適切なパルス幅とデューティサイクルに変換するために使用されます。def interval_mapping(x, in_min, in_max, out_min, out_max): return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
PWMオブジェクトと角度を入力として受け取る
servo_write
関数を定義します。与えられた角度に基づいてパルス幅とデューティサイクルを計算し、それに応じてPWM出力を設定します。def servo_write(pin, angle): pulse_width = interval_mapping(angle, 0, 180, 0.5, 2.5) # Calculate the pulse width duty = int(interval_mapping(pulse_width, 0, 20, 0, 1023)) # Calculate the duty cycle pin.duty(duty) # Set the duty cycle of the PWM signal
この関数では、
interval_mapping()
を呼び出して、角度の範囲0〜180をパルス幅の範囲0.5〜2.5msにマッピングします。なぜ0.5~2.5msなのか?これは サーボ の動作モードによって決まります。
次に、パルス幅を周期からデューティに変換します。
duty()
は使用時に小数を持つことができない(値がfloat型であってはならない)ため、int()
を使用してデューティをint型に変換しました。
二つのネストしたループを持つ無限ループを作成します。
while True: # Loop through angles from 0 to 180 degrees for angle in range(180): servo_write(servo, angle) time.sleep_ms(20) # Loop through angles from 180 to 0 degrees in reverse for angle in range(180, -1, -1): servo_write(servo, angle) time.sleep_ms(20)
最初のネストしたループは0度から180度までの角度を反復し、二番目のネストしたループは180度から0度までの角度を逆順で反復します。
各反復で、
servo_write
関数が現在の角度で呼び出され、20ミリ秒の遅延が追加されます。
5. センサー
5.2 傾けて操作!¶
傾斜スイッチは、その中心に金属球を含むシンプルで効果的な2ピンデバイスです。スイッチが垂直な位置にあるとき、2つのピンは電気的に接続されており、電流が流れます。しかし、スイッチが傾いたり一定の角度で傾いたりすると、金属球が動いてピン間の電気的接続を遮断します。
このプロジェクトでは、傾斜スイッチを使用してLEDの照明を制御します。傾斜動作を引き起こすようにスイッチを配置することで、スイッチの向きに基づいてLEDをオン/オフに切り替えることができます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
利用可能なピン
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
入力用
IO14, IO25, I35, I34, I39, I36, IO18, IO19, IO21, IO22, IO23
出力用
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
条件付き使用ピン(入力)
以下のピンには内蔵のプルアップまたはプルダウン抵抗があり、 入力ピンとして使用する場合 に外部抵抗器は必要ありません:
条件付き使用ピン
説明
IO13, IO15, IO2, IO4
47Kの抵抗器でプルアップし、デフォルトで値をハイにします。
IO27, IO26, IO33
4.7Kの抵抗器でプルアップし、デフォルトで値をハイにします。
IO32
1Kの抵抗器でプルダウンし、デフォルトで値をローにします。
ストラッピングピン(入力)
ストラッピングピンは、デバイスの起動時に特定のブートモードを決定するために使用される特別なセットのピンです (つまり、電源オンリセット)。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
一般的に、 入力ピンとして使用することは推奨されません。これらのピンを使用したい場合は、ブートプロセスへの潜在的な影響を考慮してください。詳細については、 ストラッピングピン セクションを参照してください。
回路図

傾斜スイッチが垂直な位置にあるとき、IO14はハイに設定され、その結果LEDが点灯します。逆に、傾斜スイッチが傾いたとき、IO14はローに設定され、LEDが消灯します。
10Kの抵抗器の目的は、傾斜スイッチが傾いた位置にあるときにIO14の安定したローステートを維持することです。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.2_tilt_switch.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
switch = machine.Pin(14, machine.Pin.IN) # Tilt switch pin
led = machine.Pin(26, machine.Pin.OUT) # LED pin
while True:
# Check if the switch is tilted by reading its value
if switch.value() == 1:
# Turn on the LED by setting its value to 1
led.value(1)
else:
# Turn off the LED
led.value(0)
スクリプトが実行中のとき、スイッチが垂直になっているとLEDが点灯し、傾いているとLEDが消えます。
5.3 障害物の検出¶
このモジュールは一般に、前方に障害物があるかどうかを判断するために車やロボットに取り付けられています。また、ハンドヘルドデバイス、水道の蛇口などにも広く使用されています。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン
IO13, IO14, IO27, IO26, IO25, IO33, I35, I34, I39, I36, IO4, IO18, IO19, IO21, IO22, IO23
ストラッピングピン(入力)
ストラッピングピンは、デバイスの起動時に特定のブートモードを決定するために使用される特別なセットのピンです (つまり、電源オンリセット)。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
一般的に、 入力ピンとして使用することは推奨されません。これらのピンを使用したい場合は、ブートプロセスへの潜在的な影響を考慮してください。詳細については、 ストラッピングピン セクションを参照してください。
回路図

障害物回避モジュールが障害物を検出しない場合、IO14はハイレベルを返します。しかし、障害物を検出した場合は、ローレベルを返します。青色のポテンショメータを調整して、このモジュールの検出距離を変更できます。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.3_avoid.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
ir_avoid = machine.Pin(14, machine.Pin.IN, machine.Pin.PULL_UP) # avoid module pin
while True:
# Print values of the obstacle avoidance module
print(ir_avoid.value())
time.sleep(0.1)
プログラムが実行中の場合、IR障害物回避モジュールが前方に障害物を検出すると、シリアルモニターに「0」が表示されます。それ以外の場合は「1」が表示されます。
5.4 ラインの検出¶
ライントラッキングモジュールは、地面にある黒いエリア、例えば電気テープで貼られた黒い線を検出するために使用されます。
その発光部は適切な赤外線を地面に放射し、それは黒い表面によって相対的に吸収され弱く反射されます。白い表面では反対のことが真です。反射光が検出された場合、現在の地面は白として示されます。検出されなかった場合は、黒として示されます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
利用可能なピン
IO13, IO14, IO27, IO26, IO25, IO33, I35, I34, I39, I36, IO4, IO18, IO19, IO21, IO22, IO23
ストラッピングピン(入力)
ストラッピングピンは、デバイスの起動時に特定のブートモードを決定するために使用される特別なセットのピンです (つまり、電源オンリセット)。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
一般的に、 入力ピンとして使用することは推奨されません。これらのピンを使用したい場合は、ブートプロセスへの潜在的な影響を考慮してください。詳細については、 ストラッピングピン セクションを参照してください。
回路図

ライントラッキングモジュールが黒い線を検出すると、IO14はハイレベルを返します。一方、白い線を検出すると、IO14はローレベルを返します。青いポテンショメータを調整して、このモジュールの感度を変更できます。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.4_detect_the_line.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
# Create a pin object named greyscale, set pin number 14 as input
line = machine.Pin(14, machine.Pin.IN)
while True:
# Check if the value is 1 (black)
if line.value() == 1:
# Print "black"
print("black")
time.sleep(0.5)
# If the value is not 1 (it's 0, which means white)
else :
# Print "white"
print("white")
time.sleep(0.5)
プログラムが実行中の場合、ライントラッキングモジュールが黒い線を検出すると、シェルに「black」と表示されます。それ以外の場合は、「white」と表示されます。
5.5 人の動きを検出する¶
受動赤外線センサー(PIRセンサー)は、視野内の物体から放出される赤外線(IR)光を測定する一般的なセンサーです。 簡単に言えば、体から放出される赤外線を受け取り、人やその他の動物の動きを検出します。 より具体的には、誰かがあなたの部屋に入ったことをメインコントロールボードに伝えます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入することは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
このプロジェクトのESP32ボードに利用可能なピンのリストです。
入力用
IO13, IO14, IO27, IO26, IO25, IO33, I35, I34, I39, I36, IO4, IO18, IO19, IO21, IO22, IO23
出力用
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
注釈
このプロジェクトでは、内部で1Kのプルダウン抵抗器に接続されているため、IO32は 入力ピンとして使用できません。デフォルトの値は0に設定されています。
ストラッピングピン(入力)
ストラッピングピンは、デバイスの起動時に特定のブートモードを決定するために使用される特別なセットのピンです (つまり、電源オンリセット)。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
一般的に、 入力ピンとして使用することは推奨されません。これらのピンを使用したい場合は、ブートプロセスへの潜在的な影響を考慮してください。詳細については、 ストラッピングピン セクションを参照してください。
回路図

PIRモジュールが動きを検出すると、IO14がハイになり、LEDが点灯します。動きが検出されない場合、IO14はローになり、LEDは消灯します。
注釈
PIRモジュールには感度を調整するポテンショメーターと検出距離を調整するポテンショメーターが2つあります。PIRモジュールをより良く動作させるためには、両方を反時計回りに最後まで回す必要があります。

配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.5_detect_human_movement.py
ファイルを開くか、コードをThonnyにコピー&ペーストしてください。次に、「現在のスクリプトを実行」をクリックするか、F5キーを押して実行します。右下のコーナーで「MicroPython (ESP32).COMxx」インタープリタを選択してください。
import machine
import time
# Define pins
PIR_PIN = 14 # PIR sensor
LED_PIN = 26 # LED
# Initialize the PIR sensor pin as an input pin
pir_sensor = machine.Pin(PIR_PIN, machine.Pin.IN, machine.Pin.PULL_DOWN)
# Initialize the LED pin as an output pin
led = machine.Pin(LED_PIN, machine.Pin.OUT)
# Global flag to indicate motion detected
motion_detected_flag = False
# Function to handle the interrupt
def motion_detected(pin):
global motion_detected_flag
print("Motion detected!")
motion_detected_flag = True
# Attach the interrupt to the PIR sensor pin
pir_sensor.irq(trigger=machine.Pin.IRQ_RISING, handler=motion_detected)
# Main loop
while True:
if motion_detected_flag:
led.value(1) # Turn on the LED
time.sleep(5) # Keep the LED on for 5 seconds
led.value(0) # Turn off the LED
motion_detected_flag = False
スクリプトが実行されると、PIRモジュールが誰かを検出するとLEDが5秒間点灯し、その後消灯します。
どのように動作するのか?
このコードはPIRセンサーとLEDを使用したシンプルな動作検出システムを設定します。動作が検出されると、LEDが5秒間点灯します。
コードの詳細は以下の通りです:
動きが検出されたときに実行される割り込みハンドラ関数を定義します:
def motion_detected(pin): global motion_detected_flag print("Motion detected!") motion_detected_flag = True
PIRセンサーピンに割り込みをアタッチし、トリガーを"rising"(つまり、ピンが低電圧から高電圧に変わるとき)に設定します:
pir_sensor.irq(trigger=machine.Pin.IRQ_RISING, handler=motion_detected)
これにより、PIRモーションセンサーに接続された
pir_sensor
ピンに割り込みが設定されます。パラメータの詳細な説明は以下の通りです:
trigger=machine.Pin.IRQ_RISING
: このパラメータは割り込みのトリガー条件を設定します。この場合、割り込みは立ち上がりエッジでトリガーされます。立ち上がりエッジとは、ピンの電圧が低状態(0V)から高状態(ハードウェアによって異なりますが、通常は3.3Vまたは5V)に変わるときです。PIRモーションセンサーの場合、動作が検出されると、出力ピンは通常低から高になるため、立ち上がりエッジは適切なトリガー条件です。handler=motion_detected
: このパラメータは割り込みがトリガーされたときに実行される関数を指定します。この場合は、motion_detected
関数が割り込みハンドラとして提供されています。この関数はpir_sensor
ピンで割り込み条件(立ち上がりエッジ)が検出されたときに自動的に呼び出されます。
したがって、このコード行は、センサーによって動作が検出されるたびに、出力ピンが低状態から高状態に変わるため、
motion_detected
関数を呼び出すようPIRセンサーを設定します。メインループでは、
motion_detected_flag
がTrue
に設定されている場合、LEDが5秒間点灯してから消灯します。次の動作イベントを待つためにフラグは再びFalse
にリセットされます。while True: if motion_detected_flag: led.value(1) # Turn on the LED time.sleep(5) # Keep the LED on for 5 seconds led.value(0) # Turn off the LED motion_detected_flag = False
5.6 トランジスタの二種類¶
このキットには、二種類のトランジスタ、S8550とS8050が装備されており、前者がPNP型で、後者がNPN型です。外見はとても似ているため、ラベルを注意深く確認する必要があります。 Highレベルの信号がNPNトランジスタを通ると、エネルギーが供給されます。しかし、PNP型はLowレベルの信号で制御が必要です。これらのトランジスタは、この実験のように、非接触型スイッチで頻繁に使用されます。
トランジスタの使用方法を理解するために、LEDとボタンを使いましょう!
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
入力用
IO14, IO25, I35, I34, I39, I36, IO18, IO19, IO21, IO22, IO23
出力用
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
条件付き使用ピン(入力)
以下のピンは内蔵のプルアップまたはプルダウン抵抗があるため、 入力ピンとして使用する場合
条件付き使用ピン
説明
IO13, IO15, IO2, IO4
47Kの抵抗でプルアップし、デフォルト値を高にします。
IO27, IO26, IO33
4.7Kの抵抗でプルアップし、デフォルト値を高にします。
IO32
1Kの抵抗でプルダウンし、デフォルト値を低にします。
ストラッピングピン(入力用)
ストラッピングピンは、デバイスの起動時(つまり、電源オンリセット時)に特定のブートモードを決定するために使用される特別なピンのセットです。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
一般に、これらを入力ピンとして使用することは 推奨されません。これらのピンを使用したい場合は、ブートプロセスへの影響を考慮してください。詳細は ストラッピングピン セクションを参照してください。
NPN(S8050)トランジスタの接続方法

この回路では、ボタンを押すとIO14が高くなります。
IO26をプログラムして high を出力することで、1kの電流制限抵抗(トランジスタを保護するため)を経て、S8050(NPNトランジスタ)が導通し、LEDが点灯します。

PNP(S8550)トランジスタの接続方法

この回路では、IO14はデフォルトで低く、ボタンを押すと高くなります。
IO26をプログラムして low を出力することで、1kの電流制限抵抗(トランジスタを保護するため)を経て、S8550(PNPトランジスタ)が導通し、LEDが点灯します。
この回路と前の回路の唯一の違いは、前の回路ではLEDのカソードが S8050(NPNトランジスタ) の コレクタ に接続されているのに対し、この回路では エミッタ に接続されていることです。

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.6_transistor.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
import machine
button = machine.Pin(14, machine.Pin.IN) # Button
led = machine.Pin(26, machine.Pin.OUT) # LED
# Start an infinite loop
while True:
# Read the current value of the 'button' object (0 or 1) and store it in the 'button_status' variable
button_status = button.value()
# If the button is pressed (value is 1)
if button_status == 1:
led.value(1) # Turn the LED on
# If the button is not pressed (value is 0)
else:
led.value(0) # turn the LED off
二種類のトランジスタは同じコードを使用して制御できます。 ボタンを押すと、ESP32はトランジスタに高レベルの信号を送ります。 それを放すと、低レベルの信号を送ります。
S8050(NPNトランジスタ)を使用した回路は、ボタンを押すと点灯し、高レベル導通状態であることを示します。
S8550(PNPトランジスタ)を使用した回路は、ボタンを放すと点灯し、低レベル導通状態であることを示します。
5.7 光を感じる¶
フォトレジスタは、ポテンショメータと同様に、アナログ入力によく使用されるデバイスです。受ける光の強度に基づいて抵抗値が変化します。強い光にさらされると、フォトレジスタの抵抗は減少し、光の強度が低下すると抵抗は増加します。
フォトレジスタの値を読むことで、周囲の光の条件に関する情報を収集できます。この情報は、LEDの明るさを制御したり、センサーの感度を調整したり、プロジェクトで光依存のアクションを実装したりするなどのタスクに使用できます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
利用可能なピン
IO14, IO25, I35, I34, I39, I36
ストラッピングピン
以下のピンはストラッピングピンで、電源オンまたはリセット時のESP32の起動プロセスに影響します。しかし、ESP32が正常に起動した後は、通常のピンとして使用できます。
ストラッピングピン
IO0, IO12
回路図

光の強度が増すにつれて、光依存抵抗器(LDR)の抵抗値が減少し、その結果I35で読み取られる値が減少します。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.7_feel_the_light.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import ADC,Pin
import time
# create an ADC object acting on a pin
photoresistor = ADC(Pin(35, Pin.IN))
# Configure the ADC attenuation to 11dB for full range
photoresistor.atten(photoresistor.ATTN_11DB)
while True:
# read a raw analog value in the range 0-4095
value = photoresistor.read()
print(value)
time.sleep(0.05)
プログラムが実行された後、シェルはフォトレジスタの値を出力します。懐中電灯で照らしたり手で覆ったりして、値がどのように変化するかを確認できます。
atten(photoresistor.ATTN_11DB)
: ADCの減衰を11dBに設定して全範囲をカバーします。参照電圧以上の電圧を読み取るためには、attenキーワード引数で入力減衰を適用してください。
有効な値(およびおおよその線形測定範囲)は以下の通りです:
ADC.ATTN_0DB: 減衰なし(100mV - 950mV)
ADC.ATTN_2_5DB: 2.5dBの減衰(100mV - 1250mV)
ADC.ATTN_6DB: 6dBの減衰(150mV - 1750mV)
ADC.ATTN_11DB: 11dBの減衰(150mV - 2450mV)
5.8 ノブを回す¶
ポテンショメータは、回路内の抵抗を調整するために一般的に使用される3端子デバイスです。ノブやスライドレバーが特徴で、これを動かすことでポテンショメータの抵抗値を変化させることができます。このプロジェクトでは、日常生活で使われるデスクランプのように、LEDの明るさを制御するために使用します。ポテンショメータの位置を調整することで、回路内の抵抗を変え、それによりLEDを流れる電流を調節し、その明るさを変更します。これにより、デスクランプのようなカスタマイズ可能で調整可能な照明体験を作り出すことができます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
利用可能なピン
IO14, IO25, I35, I34, I39, I36
ストラッピングピン
以下のピンはストラッピングピンで、電源オンまたはリセット時のESP32の起動プロセスに影響します。しかし、ESP32が正常に起動した後は、通常のピンとして使用できます。
ストラッピングピン
IO0, IO12
回路図

ポテンショメータを回すと、I35の値が変わります。プログラミングにより、I35の値を使用してLEDの明るさを制御できます。そのため、ポテンショメータを回すと、LEDの明るさもそれに応じて変わります。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.8_turn_the_knob.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import ADC, Pin, PWM
import time
pot = ADC(Pin(35, Pin.IN)) # create an ADC object acting on a pin
# Configure the ADC attenuation to 11dB for full range
pot.atten(pot.ATTN_11DB)
# Create a PWM object
led = PWM(Pin(26), freq=1000)
while True:
# Read a raw analog value in the range of 0-4095
value = pot.read()
# Scale the value to the range of 0-1023 for ESP32 PWM duty cycle
pwm_value = int(value * 1023 / 4095)
# Update the LED brightness based on the potentiometer value
led.duty(pwm_value)
# Read the voltage in microvolts and convert it to volts
voltage = pot.read_uv() / 1000000
# Print the raw value and the voltage
print(f"value: {value}, Voltage: {voltage}V")
# Wait for 0.5 seconds before taking the next reading
time.sleep(0.5)
このスクリプトを実行すると、ポテンショメータを回すとLEDの明るさが変わり、その時点でのアナログ値と電圧がシェルに表示されます。
5.9 土壌水分を測定する¶
この容量性土壌水分センサーは市場に出回っているほとんどの抵抗型センサーとは異なり、容量性誘導の原理を用いて土壌の水分を検出します。
土壌水分センサーからの値を視覚的に読み取ることで、土壌の水分レベルに関する情報を収集できます。この情報は、自動灌漑システム、植物の健康監視、環境センシングプロジェクトなど、様々なアプリケーションに有用です。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
利用可能なピン
IO14, IO25, I35, I34, I39, I36
ストラッピングピン
以下のピンはストラッピングピンで、電源オンまたはリセット時のESP32の起動プロセスに影響します。しかし、ESP32が正常に起動した後は、通常のピンとして使用できます。
ストラッピングピン
IO0, IO12
回路図

モジュールを土壌に挿入し、水やりをすると、I35で読み取られる値が減少します。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.9_moisture.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import ADC,Pin
import time
# create an ADC object acting on a pin
moisture = ADC(Pin(35, Pin.IN))
# Configure the ADC attenuation to 11dB for full range
moisture.atten(moisture.ATTN_11DB)
while True:
# read a raw analog value in the range 0-4095
value = moisture.read()
print(value)
time.sleep(0.05)
スクリプトを実行すると、土壌の水分値がシェルに表示されます。
モジュールを土壌に挿入し、水やりをすると、土壌水分センサーの値は小さくなります。
5.10 温度センシング¶
サーミスタは温度に強く依存する温度センサーで、負の温度係数(NTC)と正の温度係数(PTC)の2種類に分類されます。NTCサーミスタの抵抗は温度が上昇すると減少し、PTCサーミスタの抵抗は温度が上昇すると増加します。
このプロジェクトでは、NTCサーミスタを使用します。NTCサーミスタをESP32マイクロコントローラのアナログ入力ピンに接続することで、抵抗を測定し、それが直接温度に比例することができます。
NTCサーミスタを組み込み、必要な計算を行うことで、正確に温度を測定し、I2C LCD1602モジュールに表示することができます。このプロジェクトにより、リアルタイムで温度監視を行い、温度表示のための視覚的インターフェースを提供します。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
利用可能なピン
IO14, IO25, I35, I34, I39, I36
ストラッピングピン
以下のピンはストラッピングピンで、電源オンまたはリセット時のESP32の起動プロセスに影響します。しかし、ESP32が正常に起動した後は、通常のピンとして使用できます。
ストラッピングピン
IO0, IO12
回路図

温度が上昇すると、サーミスタの抵抗が減少し、I35で読み取られる値が減少します。さらに、式を使用してアナログ値を温度に変換し、出力することができます。
配線図

注釈
サーミスタは黒色で、103とマークされています。
10Kオーム抵抗のカラーリングは赤、黒、黒、赤、茶色です。
コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.10_thermistor.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
# Import the necessary libraries
from machine import ADC, Pin
import time
import math
# Define the beta value of the thermistor, typically provided in the datasheet
beta = 3950
# Create an ADC object (thermistor)
thermistor = ADC(Pin(35, Pin.IN))
# Set the attenuation
thermistor.atten(thermistor.ATTN_11DB)
# Start an infinite loop to continuously monitor the temperature
while True:
# Read the voltage in microvolts and convert it to volts
Vr = thermistor.read_uv() / 1000000
# Calculate the resistance of the thermistor based on the measured voltage
Rt = 10000 * Vr / (3.3 - Vr)
# Use the beta parameter and resistance value to calculate the temperature in Kelvin
temp = 1 / (((math.log(Rt / 10000)) / beta) + (1 / (273.15 + 25)))
# Convert to Celsius
Cel = temp - 273.15
# Convert to Fahrenheit
Fah = Cel * 1.8 + 32
# Print the temperature values in both Celsius and Fahrenheit
print('Celsius: %.2f C Fahrenheit: %.2f F' % (Cel, Fah))
time.sleep(0.5)
コードを実行すると、シェルは摂氏と華氏の温度を出力します。
どのように動作するのか?
各サーミスタには、通常の抵抗値があります。ここでは25度摂氏で測定された10kオームです。
温度が高くなると、サーミスタの抵抗値が減少します。次に、A/D変換器により電圧データがデジタル量に変換されます。
摂氏または華氏の温度は、プログラミングを通じて出力されます。
ここに抵抗と温度の関係があります:
RT =RN expB(1/TK - 1/TN)
RT は温度 TK のときのNTCサーミスタの抵抗値です。
RN は定格温度 TN 下のNTCサーミスタの抵抗値です。ここでは、RNの数値は10kです。
TK はケルビン温度で、単位はKです。ここでは、TK の数値は
373.15 + 摂氏度数
です。TN は定格ケルビン温度で、単位もKです。ここでは、TNの数値は
373.15+25
です。そして B(ベータ)、NTCサーミスタの材料定数であり、熱感受性指数とも呼ばれ、数値は
4950
です。exp は指数の略で、基数
e
は自然数で、約2.7に等しいです。この式
TK=1/(ln(RT/RN)/B+1/TN)
を変換してケルビン温度を求め、273.15を引くと摂氏度が求まります。この関係は経験式です。温度と抵抗値が有効範囲内にあるときのみ正確です。
もっと学ぶ
計算された摂氏および華氏の温度をI2C LCD1602に表示することもできます。

注釈
esp32-starter-kit-main\micropython\codes
パスにある5.10_thermistor_lcd.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
ここでは
lcd1602.py
というライブラリを使用する必要があります。ESP32にアップロードされていることを確認してください。詳しいチュートリアルは 1.4 ライブラリのアップロード(重要) を参照してください。
# Import the necessary libraries
from machine import ADC, Pin
from lcd1602 import LCD
import time
import math
# Define the beta value of the thermistor, typically provided in the datasheet
beta = 3950
# Create an ADC object (thermistor)
thermistor = ADC(Pin(35, Pin.IN))
# Set the attenuation
thermistor.atten(thermistor.ATTN_11DB)
lcd = LCD()
# Start an infinite loop to continuously monitor the temperature
while True:
# Read the voltage in microvolts and convert it to volts
Vr = thermistor.read_uv() / 1000000
# Calculate the resistance of the thermistor based on the measured voltage
Rt = 10000 * Vr / (3.3 - Vr)
# Use the beta parameter and resistance value to calculate the temperature in Kelvin
temp = 1 / (((math.log(Rt / 10000)) / beta) + (1 / (273.15 + 25)))
# Convert to Celsius
Cel = temp - 273.15
# Convert to Fahrenheit
Fah = Cel * 1.8 + 32
# Print the temperature values in both Celsius and Fahrenheit
print('Celsius: %.2f C Fahrenheit: %.2f F' % (Cel, Fah))
# Clear the LCD screen
lcd.clear()
# Display the temperature values in both Celsius and Fahrenheit
lcd.message('Cel: %.2f \xDFC \n' % Cel)
lcd.message('Fah: %.2f \xDFF' % Fah)
time.sleep(1)
5.11 ジョイスティックの切り替え¶
ビデオゲームをよくプレイする人なら、ジョイスティックに非常に慣れているはずです。 キャラクターを動かしたり、画面を回転させたりするのに通常使用されます。
コンピュータが私たちのアクションを読み取ることを可能にするジョイスティックの原理は非常にシンプルです。 それは互いに垂直な二つのポテンショメータから成り立っていると考えることができます。 これら二つのポテンショメータは、ジョイスティックの垂直方向と水平方向のアナログ値を測定し、平面直角座標系での値(x, y)を結果として出力します。
このキットのジョイスティックには、ジョイスティックが押されたときにアクティブになるデジタル入力もあります。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
アナログ入力用
IO14, IO25, I35, I34, I39, I36
デジタル入力用
IO13, IO14, IO27, IO26, IO25, IO33, IO4, IO18, IO19, IO21, IO22, IO23
ストラッピングピン(入力)
ストラッピングピンは、デバイスの起動時に特定のブートモードを決定するために使用される特別なピンのセットです (つまり、電源オンリセット)。
ストラッピングピン
IO5, IO0, IO2, IO12, IO15
一般に、これらを入力ピンとして使用することは 推奨されません。これらのピンを使用したい場合は、ブートプロセスへの影響を考慮してください。詳細は ストラッピングピン セクションを参照してください。
回路図

SW(Z軸)ピンはIO33に接続されており、内蔵の4.7Kプルアップ抵抗があります。そのため、SWボタンが押されていない時は、高レベルを出力します。ボタンが押されると、低レベルを出力します。
I34とI35は、ジョイスティックを操作するとその値が変わります。値の範囲は0から4095です。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.11_joystick.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import ADC,Pin
import time
xAxis = ADC(Pin(34, Pin.IN)) # create an ADC object acting on a pin
xAxis.atten(xAxis.ATTN_11DB)
yAxis = ADC(Pin(35, Pin.IN)) # create an ADC object acting on a pin
yAxis.atten(yAxis.ATTN_11DB)
button = Pin(33, Pin.IN, Pin.PULL_UP)
while True:
xValue = xAxis.read() # read a raw analog value in the range 0-4095
yValue = yAxis.read() # read a raw analog value in the range 0-4095
btnValue = button.value()
print(f"X:{xValue}, Y:{yValue}, Button:{btnValue}")
time.sleep(0.1)
プログラムを実行すると、シェルはジョイスティックのx、y、ボタンの値を出力します。
X:1921, Y:1775, Button:0
X:1921, Y:1775, Button:0
X:1923, Y:1775, Button:0
X:1924, Y:1776, Button:0
X:1926, Y:1777, Button:0
X:1925, Y:1776, Button:0
X:1924, Y:1776, Button:0
x軸とy軸の値は、0から4095まで変化するアナログ値です。
ボタンはデジタル値で、1(リリース)または0(プレス)の状態を持ちます。
5.12 距離測定¶
超音波モジュールは、距離測定や物体検出に使用されます。このプロジェクトでは、モジュールをプログラムして障害物の距離を取得します。超音波パルスを送信し、それが跳ね返ってくるまでの時間を測定することで、距離を計算できます。これにより、距離に基づくアクションや障害物回避行動を実装することができます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
入力用
IO13, IO14, IO27, IO26, IO25, IO33, IO32, I35, I34, I39, I36, IO4, IO18, IO19, IO21, IO22, IO23
出力用
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO32, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
回路図

ESP32は10秒ごとに超音波センサーのTrigピンに一連の方形波信号を送信します。これにより、超音波センサーは40kHzの超音波信号を外側に放出するよう促されます。前方に障害物がある場合、超音波波は反射して戻ってきます。
信号を送信してから受信するまでの時間を記録し、2で割って光速を掛けることで、障害物までの距離を求めることができます。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.12_ultrasonic.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
import machine
import time
# Define the trigger and echo pins for the distance sensor
TRIG = machine.Pin(26, machine.Pin.OUT)
ECHO = machine.Pin(25, machine.Pin.IN)
# Calculate the distance using the ultrasonic sensor
def distance():
# Ensure trigger is off initially
TRIG.off()
time.sleep_us(2) # Wait for 2 microseconds
# Send a 10-microsecond pulse to the trigger pin
TRIG.on()
time.sleep_us(10)
TRIG.off()
# Wait for the echo pin to go high
while not ECHO.value():
pass
# Record the time when the echo pin goes high
time1 = time.ticks_us()
# Wait for the echo pin to go low
while ECHO.value():
pass
# Record the time when the echo pin goes low
time2 = time.ticks_us()
# Calculate the time difference between the two recorded times
during = time.ticks_diff(time2, time1)
# Calculate and return the distance (in cm) using the speed of sound (340 m/s)
return during * 340 / 2 / 10000
# Continuously measure and print the distance
while True:
dis = distance()
print('Distance: %.2f' % dis)
time.sleep_ms(300) # Wait for 300 milliseconds before repeating
プログラムが実行されると、シェルは前方の障害物から超音波センサーまでの距離を出力します。
5.13 温湿度計測¶
DHT11は、環境測定に一般的に使用される温湿度センサーです。これはデジタルセンサーであり、マイクロコントローラーと通信して温度と湿度の読み取りを提供します。
このプロジェクトでは、DHT11センサーを読み取り、検出した温度と湿度の値を出力します。
センサーから提供されるデータを読み取ることで、環境の現在の温度と湿度の値を取得できます。これらの値は、環境条件のリアルタイムモニタリング、天気観測、室内の気候制御、湿度レポートなどに使用できます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
利用可能なピン
IO13, IO12, IO14, IO27, IO26, IO25, IO33, IO15, IO2, IO0, IO4, IO5, IO18, IO19, IO21, IO22, IO23
回路図

配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.13_dht11.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
import dht
import machine
import time
# Initialize the DHT11 sensor and connect it to pin 14
sensor = dht.DHT11(machine.Pin(14))
# Loop indefinitely to continuously measure temperature and humidity
while True:
try:
# Measure temperature and humidity
sensor.measure()
# Get temperature and humidity values
temp = sensor.temperature()
humi = sensor.humidity()
# Print temperature and humidity
print("Temperature: {}, Humidity: {}".format(temp, humi))
# Wait for 1 second between measurements
time.sleep(1)
except Exception as e:
print("Error: ", e)
time.sleep(1)
コードが実行されているとき、シェルが連続して温度と湿度を出力するのを見ることができます。プログラムが安定して実行されると、これら二つの値はより正確になっていきます。
もっと学ぶ
I2C LCD1602に温度と湿度を表示することもできます。

注釈
esp32-starter-kit-main\micropython\codes
パスにある5.13_dht11_lcd.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
ここでは
lcd1602.py
というライブラリを使用する必要があります。ESP32にアップロードされているかどうかを確認してください。詳しいチュートリアルは 1.4 ライブラリのアップロード(重要) を参照してください。
import dht
import machine
import time
from lcd1602 import LCD
# Initialize the DHT11 sensor and connect it to pin 14
sensor = dht.DHT11(machine.Pin(14))
# Initialize the LCD1602 display
lcd = LCD()
# Loop to measure temperature and humidity
while True:
try:
# Measure temperature and humidity
sensor.measure()
# Get temperature and humidity values
temp = sensor.temperature()
humi = sensor.humidity()
# Print temperature and humidity
print("Temperature: {}, Humidity: {}".format(temp, humi))
# Clear the LCD display
lcd.clear()
# Display temperature and humidity on the LCD1602 screen
lcd.write(0, 0, "Temp: {}\xDFC".format(temp))
lcd.write(0, 1, "Humi: {}%".format(humi))
# Wait for 2 seconds before measuring again
time.sleep(2)
except Exception as e:
print("Error: ", e)
time.sleep(2)
5.14 赤外線リモコン¶
赤外線受信機は、赤外線信号を受信し、TTLレベルに対応した信号を独立して検出・出力するコンポーネントです。サイズは通常のプラスチック製トランジスタと似ており、赤外線リモコンや赤外線伝送など様々なアプリケーションに使用されています。
このプロジェクトでは、赤外線受信機を使用してリモコンからの信号を検出します。リモコンのボタンを押すと、赤外線受信機が対応する信号を受信し、どのボタンが押されたかを判断するための信号をデコードできます。受信した信号をデコードすることで、それに関連する特定のキーやコマンドを識別できます。
赤外線受信機を使用することで、私たちのプロジェクトにリモコン機能を組み込むことができ、赤外線信号を使用してデバイスと対話し、制御することが可能になります。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
利用可能なピン
こちらは、このプロジェクトのためのESP32ボード上の利用可能なピンのリストです。
利用可能なピン
IO13, IO12, IO14, IO27, IO26, IO25, IO15, IO0, IO5, IO18, IO19, IO21, IO22, IO23
回路図

リモコンのボタンを押すと、赤外線受信機が信号を検出し、赤外線ライブラリを使用してデコードすることができます。このデコードプロセスにより、ボタン押下に関連するキー値を取得できます。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある5.14_ir_receiver.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
ここでは、
ir_rx
フォルダにあるライブラリを使用する必要があります。ESP32にアップロードされていることを確認してください。包括的なチュートリアルについては 1.4 ライブラリのアップロード(重要) を参照してください。
import time
from machine import Pin, freq
from ir_rx.print_error import print_error
from ir_rx.nec import NEC_8
pin_ir = Pin(14, Pin.IN) # IR receiver
# Decode the received data and return the corresponding key name
def decodeKeyValue(data):
if data == 0x16:
return "0"
if data == 0x0C:
return "1"
if data == 0x18:
return "2"
if data == 0x5E:
return "3"
if data == 0x08:
return "4"
if data == 0x1C:
return "5"
if data == 0x5A:
return "6"
if data == 0x42:
return "7"
if data == 0x52:
return "8"
if data == 0x4A:
return "9"
if data == 0x09:
return "+"
if data == 0x15:
return "-"
if data == 0x7:
return "EQ"
if data == 0x0D:
return "U/SD"
if data == 0x19:
return "CYCLE"
if data == 0x44:
return "PLAY/PAUSE"
if data == 0x43:
return "FORWARD"
if data == 0x40:
return "BACKWARD"
if data == 0x45:
return "POWER"
if data == 0x47:
return "MUTE"
if data == 0x46:
return "MODE"
return "ERROR"
# User callback
def callback(data, addr, ctrl):
if data < 0: # NEC protocol sends repeat codes.
pass
else:
print(decodeKeyValue(data))
ir = NEC_8(pin_ir, callback) # Instantiate the NEC_8 receiver
# Show debug information
ir.error_function(print_error)
# keep the script running until interrupted by a keyboard interrupt (Ctrl+C)
try:
while True:
pass
except KeyboardInterrupt:
ir.close() # Close the receiver
プログラムが実行されている間、リモコンのキーを押すと、キーの値と名前がシェルに表示されます。
注釈
新しいリモコンには、内部の電池を絶縁するためのプラスチックタブが端に付いています。リモコンを使用する際には、このプラスチック片を取り除くだけでリモコンの電源が入ります。
どのように動作するのか?
このプログラムは一見複雑に見えるかもしれませんが、実際には赤外線受信機の基本的な機能をいくつかのコード行で実現しています。
import time from machine import Pin, freq from ir_rx.nec import NEC_8 pin_ir = Pin(14, Pin.IN) # IR receiver # User callback def callback(data, addr, ctrl): if data < 0: # NEC protocol sends repeat codes. pass else: print(decodeKeyValue(data)) ir = NEC_8(pin_ir, callback) # Instantiate receiver
このコードでは、
ir
オブジェクトがインスタンス化され、任意の時点で赤外線受信機によってキャプチャされた信号を読み取ることができます。結果として得られる情報はコールバック関数内の
data
変数に格納されます。赤外線受信機が重複した値を受信した場合(例えば、ボタンを押したままの場合)、
data
は0未満になります。このdata
はフィルタリングする必要があります。それ以外の場合は、
data
は使用可能な値ですが、読み取り不可能なコードであるため、decodeKeyValue(data)
関数を使用してより理解しやすい形式にデコードします。def decodeKeyValue(data): if data == 0x16: return "0" if data == 0x0C: return "1" if data == 0x18: return "2" if data == 0x5E: ...
次に、いくつかのデバッグ機能をプログラムに組み込みます。これらの機能は不可欠ですが、目指す結果とは直接関連していません。
from ir_rx.print_error import print_error ir.error_function(print_error) # Show debug information
最後に、メインプログラムに空のループを使用し、try-except構造を実装して、プログラムが
ir
オブジェクトを適切に終了して終了することを保証します。try: while True: pass except KeyboardInterrupt: ir.close()
6. おもしろプロジェクト
6.1 フルーツピアノ¶
ピアノを弾いてみたいけれど、お金が足りない? それとも自作のフルーツピアノで楽しみたいだけ? このプロジェクトはあなたのためです!
ESP32ボードの数個のタッチセンサーを使えば、お気に入りの曲を弾いて、高価なピアノを購入することなくピアノ演奏の体験を楽しむことができます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
タッチピンについて
ESP32マイクロコントローラは内蔵のタッチセンサ機能を持っており、ボード上の特定のピンをタッチ感知入力として使用することができます。タッチセンサは、人体の電気的特性によって引き起こされるタッチピン上の静電容量の変化を測定することによって動作します。
ESP32のタッチセンサの主な特徴は以下の通りです:
タッチピンの数
ESP32には、ボードによって最大10個のタッチピンがあります。タッチピンは通常、数字に続いて「T」とラベル付けされています。
GPIO4: TOUCH0
GPIO0:TOUCH1
GPIO2: TOUCH2
GPIO15: TOUCH3
GPIO13: TOUCH4
GPIO12: TOUCH5
GPIO14: TOUCH6
GPIO27: TOUCH7
GPIO33: TOUCH8
GPIO32: TOUCH9
注釈
GPIO0およびGPIO2ピンは、それぞれESP32へのブートストラッピングとファームウェアのフラッシングに使用されます。これらのピンはオンボードのLEDとボタンにも接続されています。そのため、通常これらのピンを他の目的で使用することは推奨されず、ボードの通常の動作に干渉する可能性があります。
感度
ESP32のタッチセンサは非常に敏感で、わずかな静電容量の変化でも検出できます。感度はソフトウェア設定で調整できます。
ESD保護
ESP32のタッチピンには内蔵のESD(静電気放電)保護があり、静電気によるボードの損傷を防ぐのに役立ちます。
マルチタッチ
ESP32のタッチセンサはマルチタッチをサポートしており、複数のタッチイベントを同時に検出できます。
回路図

このプロジェクトのアイデアは、ユーザーが特定のピンに触れたときに検出するためにタッチセンサーを使用することです。 各タッチピンは特定の音符と関連付けられており、ユーザーがピンに触れると、 対応する音符がパッシブブザーで演奏されます。 結果は、ピアノ演奏の体験をシンプルかつ手頃な価格で楽しむ方法です。
配線図

このプロジェクトでは、ESP32 WROOM 32Eを拡張ボードから取り外し、その後ブレッドボードに挿入する必要があります。これは、拡張ボード上の一部のピンが抵抗に接続されており、ピンの容量に影響を与えるためです。
コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある6.1_fruit_piano.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import Pin, PWM, TouchPad
import time
# Define the touch pins and their corresponding notes
touch_pins = [4, 15, 13, 12, 14, 27, 33, 32] # Use valid touch-capable pins
notes = [262, 294, 330, 349, 392, 440, 494, 523]
# Initialize the touch sensors
touch_sensors = [TouchPad(Pin(pin)) for pin in touch_pins]
# Initialize the buzzer
buzzer = PWM(Pin(25), duty=0)
# Function to play a tone
def play_tone(frequency, duration):
buzzer.freq(frequency)
buzzer.duty(512)
time.sleep_ms(duration)
buzzer.duty(0)
touch_threshold = 200
# Main loop to check for touch inputs and play the corresponding note
while True:
for i, touch_sensor in enumerate(touch_sensors):
value = touch_sensor.read()
print(i,value)
if value < touch_threshold:
play_tone(notes[i], 100)
time.sleep_ms(50)
time.sleep(0.01)
これらのESP32のピンに果物を接続できます:4, 15, 13, 12, 14, 27, 33, 32。
スクリプトを実行すると、これらの果物に触れるとC, D, E, F, G, A, B, C5の音符が演奏されます。
注釈
Touch_threshold
は、異なる果物の導電性に基づいて調整する必要があります。
最初にスクリプトを実行して、シェルによって出力される値を確認できます。
0 884
1 801
2 856
3 964
4 991
5 989
6 1072
7 1058
12, 14, 27番のピンにある果物に触れた後、出力される値は以下の通りです。したがって、200未満の値が検出されたときに触れたと見なされ、ブザーが異なる音符を発するように、 touch_threshold
を200に設定しました。
0 882
1 810
2 799
3 109
4 122
5 156
6 1068
7 1055
6.2 流れる光¶
あなたの居間に楽しさとインタラクティブな要素を加えたいと思ったことはありませんか? このプロジェクトでは、WS2812 LEDストリップと障害物回避モジュールを使用して走行する光を作ります。 障害物が検出されると光の方向が変わり、家やオフィスの装飾にエキサイティングな追加をすることができます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

WS2812 LEDストリップは、異なる色やパターンを表示できる一連の個別LEDで構成されています。 このプロジェクトでは、ストリップは特定の方向に動く走行光を表示するように設定されており、 障害物回避モジュールによって障害物が検出されると方向が変わります。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある6.2_flowing_led.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import Pin
import neopixel
import time
import random
# Set the number of pixels for the running light
num_pixels = 8
# Set the data pin for the RGB LED strip
data_pin = Pin(14, Pin.OUT)
# Initialize the RGB LED strip object
pixels = neopixel.NeoPixel(data_pin, num_pixels)
# Initialize the avoid sensor
avoid = Pin(25, Pin.IN)
# Initialize the direction variable
direction_forward = True
# Initialize the reverse direction flag
reverse_direction = False
# Continuously loop the running light
while True:
# Read the input from the infrared sensor
avoid_value = avoid.value()
# Generate a random color for the current pixel
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
# If no obstacle is detected
if avoid_value:
for i in range(num_pixels):
# Turn on the current pixel with the random color
pixels[i] = color
# Update the RGB LED strip display
pixels.write()
# Turn off the current pixel
pixels[i] = (0, 0, 0)
time.sleep_ms(100)
# If detects an obstacle, change the direction of the LED strip
else:
for i in range(num_pixels-1, -1, -1):
pixels[i] = color
pixels.write()
pixels[i] = (0, 0, 0)
time.sleep_ms(100)
スクリプトが実行されると、RGB ストリップの LED が 1 つずつ点灯します。 障害物回避モジュールの前に物体が置かれるとすぐに、RGB ストリップ上の LED が反対方向に 1 つずつ点灯します。
6.3 光セラミン¶
セラミンは物理的な接触を必要としない電子楽器です。プレイヤーの手の位置に基づいて、異なるトーンを生み出します。
通常、セラミン奏者の手の位置を感知してオシレータを制御する2つの金属アンテナで構成されており、一方の手で音程を、もう一方の手で音量をコントロールします。セラミンからの電気信号は増幅され、スピーカーに送られます。
ESP32を通じて同じ楽器を再現することはできませんが、フォトレジスタとパッシブブザーを使用して似たようなゲームプレイを実現することができます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

プロジェクトを始める前に、フォトレジスタの上で手を振って光の強度の範囲を調整します。IO26に接続されたLEDは、調整プロセス中のインジケータとして使用されます。LEDが点灯すると調整の開始を、消灯すると調整の終了を示します。
フォトレジスタの上で手を振ると、フォトレジスタの値がそれに応じて変化します。 この変化を利用してブザーを制御し、異なる音楽ノートを演奏します。 フォトレジスタの値の各変化を特定の音楽ノートにマッピングし、 フォトレジスタの上で手を振るとブザーがメロディを生み出します。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある6.3_light_theremin.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import Pin, PWM, ADC
import time
# Initialize LED pin
led = Pin(26, Pin.OUT)
# Initialize light sensor
sensor = ADC(Pin(35))
sensor.atten(ADC.ATTN_11DB)
# Initialize buzzer
buzzer = PWM(Pin(13), freq=440, duty=0)
light_low=4095
light_high=0
# Map the interval of input values to output values
def interval_mapping(x, in_min, in_max, out_min, out_max):
return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min
# Create a tone using the specified pin, frequency, and duration
def tone(pin,frequency,duration):
pin.freq(frequency)
pin.duty(512)
time.sleep_ms(duration)
pin.duty(0)
# Calibrate the photoresistor's maximum and minimum values in 5 seconds.
timer_init_start = time.ticks_ms()
led.value(1) # turn on the LED
while time.ticks_diff(time.ticks_ms(), timer_init_start)<5000:
light_value = sensor.read()
if light_value > light_high:
light_high = light_value
if light_value < light_low:
light_low = light_value
led.value(0) # turn off the LED
# Play the tones based on the light values
while True:
light_value = sensor.read()
pitch = int(interval_mapping(light_value,light_low,light_high,50,6000))
if pitch > 50 :
tone(buzzer,pitch,20)
time.sleep_ms(10)
プログラムを開始すると、LEDが点灯し、フォトレジスタの検出範囲を調整するための5秒間のウィンドウが提供されます。
調整は、デバイスを使用する際に遭遇する可能性のある様々な照明条件(例えば、一日の異なる時間帯における光の強度の変化など)を考慮するため、非常に重要なステップです。 さらに、調整プロセスでは、私たちの手とフォトレジスタの間の距離を考慮に入れます。これにより楽器の演奏可能範囲が決まります。
調整期間が終了すると、LEDが消え、フォトレジスタの上で手を振ることで楽器を演奏できるようになります。 この設定により、手の高さを調整して音楽を作ることができ、インタラクティブで楽しい体験を提供します。
6.4 リバースエイド¶
想像してみてください:狭い駐車スペースに車をバックで入れようとしています。このプロジェクトでは、あなたの車の後部に取り付けられた超音波モジュールがデジタルアイとして機能します。リバースギアに入れると、モジュールが活動を開始し、後ろの障害物に跳ね返る超音波パルスを放出します。
これらのパルスがモジュールに戻ってくるときに魔法が起きます。それは迅速にあなたの車と物体の間の距離を計算し、このデータを鮮やかなLCDスクリーンに表示されるリアルタイムの視覚フィードバックに変換します。障害物の接近を色分けして示す動的なインジケータを目の当たりにし、周囲の環境をクリスタルクリアに理解できます。
しかし、私たちはそこで止まりませんでした。さらに没入するドライビング体験を提供するために、活発なブザーを取り入れました。あなたの車が障害物に近づくにつれて、ブザーのテンポが強まり、警告のオーケストラを作り出します。それはまるで個人的なオーケストラが逆駐車の複雑さをナビゲートしてくれるようなものです。
この革新的なプロジェクトは、最先端の技術とインタラクティブなユーザーインターフェースを組み合わせており、リバース時の経験を安全でストレスフリーにします。超音波モジュール、LCDディスプレイ、活発なブザーが調和して動作し、狭いスペースでの操作時に自信と力を感じさせ、運転の喜びに集中させてくれます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
回路図

プロジェクトで使用される超音波センサーは、高周波の音波を発し、物体に当たって跳ね返ってくるまでの時間を測定します。このデータを分析することで、センサーと物体の間の距離を計算できます。物体があまりにも近い場合に警告を提供するために、聴覚信号を生成するためにブザーが使用されます。さらに、測定された距離は簡単な視覚化のためにLCD画面に表示されます。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある6.4_reversing_aid.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。次に、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
# Import required libraries
from machine import Pin
import time
from lcd1602 import LCD
import _thread
# Initialize the buzzer
buzzer = Pin(14, Pin.OUT)
# Initialize the ultrasonic module
TRIG = Pin(26, Pin.OUT)
ECHO = Pin(25, Pin.IN)
# Initialize the LCD1602 display
lcd = LCD()
dis = 100
# Calculate the distance
def distance():
# Ensure trigger is off initially
TRIG.off()
time.sleep_us(2) # Wait for 2 microseconds
# Send a 10-microsecond pulse to the trigger pin
TRIG.on()
time.sleep_us(10)
TRIG.off()
# Wait for the echo pin to go high
while not ECHO.value():
pass
# Record the time when the echo pin goes high
time1 = time.ticks_us()
# Wait for the echo pin to go low
while ECHO.value():
pass
# Record the time when the echo pin goes low
time2 = time.ticks_us()
# Calculate the time difference between the two recorded times
during = time.ticks_diff(time2, time1)
# Calculate and return the distance (in cm) using the speed of sound (340 m/s)
return during * 340 / 2 / 10000
# Thread to continuously update the ultrasonic sensor reading
def ultrasonic_thread():
global dis
while True:
dis = distance()
# Clear the LCD screen
lcd.clear()
# Display the distance
lcd.write(0, 0, 'Dis: %.2f cm' % dis)
time.sleep(0.5)
# Start the ultrasonic sensor reading thread
_thread.start_new_thread(ultrasonic_thread, ())
# Beep function for the buzzer
def beep():
buzzer.value(1)
time.sleep(0.1)
buzzer.value(0)
time.sleep(0.1)
# Initialize the intervals variable
intervals = 10000000
previousMills = time.ticks_ms()
time.sleep(1)
# Main loop
while True:
# Update intervals based on distance
if dis < 0 and dis > 500:
pass
elif dis <= 10:
intervals = 300
elif dis <= 20:
intervals = 500
elif dis <= 50:
intervals = 1000
else:
intervals = 2000
# Print the distance if it's not -1
if dis != -1:
print('Distance: %.2f' % dis)
time.sleep_ms(100)
# Check if it's time to beep
currentMills = time.ticks_ms()
if time.ticks_diff(currentMills, previousMills) >= intervals:
beep()
previousMills = currentMills
スクリプトが実行されている間、超音波モジュールは前方の障害物の距離を連続的に検出し、その距離をシェルとI2C LCD1602に表示します。
障害物が近づくにつれて、ブザーのビープ音の頻度が速くなります。
ultrasonic_thread()
関数は別のスレッドで実行されるため、メインループをブロックすることなく、距離測定を連続的に更新することができます。
注釈
コードと配線が正しくてもLCDに内容が表示されない場合は、背面のポテンショメータを調整してコントラストを上げることができます。
6.5 カラーグラデーション¶
色彩の世界を体験する準備はできましたか?このプロジェクトでは、LEDストリップをコントロールして滑らかな色の変化を実現する魔法のような旅に出かけます。家の装飾に色を加えたい場合でも、楽しいプログラミングプロジェクトを探している場合でも、このプロジェクトはあなたをサポートします。さあ、このカラフルな世界に一緒に飛び込みましょう!
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

このプロジェクトでは、LEDストリップとポテンショメータを使用して色の混合効果を作り出します。ポテンショメータはLEDの色相値を調整するために使用され、その後、色変換関数を使用してRGB値に変換されます。そして、そのRGB値を使ってLEDの色を更新します。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある6.5_color_gradient.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。それから、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import Pin, ADC, PWM
import neopixel
import time
NUM_LEDS = 8 # Number of LEDs in the strip
PIN_NUM = 26 # LED strip
POT_PIN = 14 # Potentiometer
# Initialize the potentiometer
potentiometer = ADC(Pin(POT_PIN))
potentiometer.atten(ADC.ATTN_11DB)
# Initialize the NeoPixel LED strip
np = neopixel.NeoPixel(Pin(PIN_NUM), NUM_LEDS)
# Function to convert HSL color space to RGB color space
def hsl_to_rgb(h, s, l):
# Helper function to convert hue to RGB
def hue_to_rgb(p, q, t):
if t < 0:
t += 1
if t > 1:
t -= 1
if t < 1/6:
return p + (q - p) * 6 * t
if t < 1/2:
return q
if t < 2/3:
return p + (q - p) * (2/3 - t) * 6
return p
if s == 0:
r = g = b = l
else:
q = l * (1 + s) if l < 0.5 else l + s - l * s
p = 2 * l - q
r = hue_to_rgb(p, q, h + 1/3)
g = hue_to_rgb(p, q, h)
b = hue_to_rgb(p, q, h - 1/3)
return (int(r * 255), int(g * 255), int(b * 255))
# Function to set the color of all LEDs in the strip
def set_color(np, color):
for i in range(NUM_LEDS):
np[i] = color
np.write()
# Main loop
while True:
# Read the potentiometer value and normalize it to the range [0, 1]
pot_value = potentiometer.read() / 4095.0
hue = pot_value # Set hue value based on the potentiometer's position
saturation = 1 # Set saturation to 1 (fully saturated)
lightness = 0.5 # Set lightness to 0.5 (halfway between black and white)
# Convert the HSL color to RGB
current_color = hsl_to_rgb(hue, saturation, lightness)
# Set the LED strip color based on the converted RGB value
set_color(np, current_color)
# Sleep for a short period to allow for smooth transitions
time.sleep(0.1)
コードの実行中にポテンショメータをゆっくりと回転させると、RGB ストリップの色が赤から紫にフェードしていくのがわかります。
6.6 デジタルダイス¶
このプロジェクトは、 2.5 数字表示 プロジェクトを基にして、セブンセグメントディスプレイに表示される数字を制御するボタンを追加します。
ボタンを押すと、7セグメントディスプレイは1から6までの数字をスクロールし、ボタンを離すとランダムな数字が表示されます。
このサイクルはボタンを押すたびに続きます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

このプロジェクトは、 2.5 数字表示 プロジェクトを基にして、セブンセグメントディスプレイに表示される数字を制御するボタンを追加するものです。
ボタンは外部のプルアップまたはプルダウン抵抗なしでIO13に直接接続されています。IO13には47Kの内部プルアップ抵抗があり、追加の外部抵抗が不要です。
配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある6.6_digital_dice.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。それから、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
import machine
import time
import random
# Define the segment code for a common anode 7-segment display
SEGCODE = [0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f]
# Initialize the pins for the 74HC595 shift register
sdi = machine.Pin(25, machine.Pin.OUT) # DS
rclk = machine.Pin(27, machine.Pin.OUT) # STcp
srclk = machine.Pin(26, machine.Pin.OUT) # SHcp
button = machine.Pin(13, machine.Pin.IN) # Button pin
# Define the hc595_shift function to shift data into the 74HC595 shift register
def hc595_shift(dat):
# Set the RCLK pin to low
rclk.off()
# Iterate through each bit (from 7 to 0)
for bit in range(7, -1, -1):
# Extract the current bit from the input data
value = 1 & (dat >> bit)
# Set the SRCLK pin to low
srclk.off()
# Set the value of the SDI pin
sdi.value(value)
# Clock the current bit into the shift register by setting the SRCLK pin to high
srclk.on()
# Latch the data into the storage register by setting the RCLK pin to high
rclk.on()
# Initialize the random seed
random.seed(time.ticks_us())
num = 1
button_state = False
# Define the button callback function to toggle the button state
def button_callback(pin):
global button_state
button_state = not button_state
# Attach the button callback function to the falling edge of the button pin
button.irq(trigger=machine.Pin.IRQ_FALLING, handler=button_callback)
# Continuously display the current digit on the 7-segment display, scrolling if button is not pressed
while True:
# Display the current digit on the 7-segment display
hc595_shift(SEGCODE[num])
# If the button is pressed and button state is True
if button_state:
pass
# If the button is pressed again and button state is False, generate a new random digit
if not button_state:
num = random.randint(1, 6)
time.sleep_ms(10) # Adjust this value to control the display refresh rate
プログラムが実行中の間、ボタンを押すと7セグメントディスプレイがスクロールして1から6の間のランダムな数字を表示します。
ボタンを再度押すと、7セグメントディスプレイは停止し、特定の数字を表示します。もう一度ボタンを押すと、7セグメントディスプレイは数字をスクロールし続けます。
6.7 数当てゲーム¶
運試しに挑戦してみませんか?自分の直感を試して、正しい番号を当てられるか見てみたいですか?それなら、この数当てゲームがぴったりです!
このプロジェクトでは、運と勘を試す楽しくワクワクするゲームを楽しむことができます。
IRリモコンを使用して、プレイヤーは0から99までの数字を入力し、ランダムに生成されたラッキーポイントの数字を当てます。 システムはプレイヤーが入力した数字をLCDスクリーンに表示し、上限と下限のヒントを提供して正しい答えに導きます。 推測するごとに、プレイヤーはラッキーポイントの数字に近づき、最終的に誰かがジャックポットを当ててゲームに勝利します!
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路図

配線図

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある6.7_game_guess_number.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。それから、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
ここでは
lcd1602.py
とir_rx
ライブラリを使用します。ESP32にアップロードされているか確認してください。チュートリアルについては 1.4 ライブラリのアップロード(重要) を参照してください。
from lcd1602 import LCD
import machine
import time
import urandom
from machine import Pin
from ir_rx.print_error import print_error
from ir_rx.nec import NEC_8
# IR receiver configuration
pin_ir = Pin(14, Pin.IN)
# Initialize the guessing game variables
lower = 0
upper = 99
pointValue = int(urandom.uniform(lower, upper))
count = 0
# Initialize the LCD1602 display
lcd = LCD()
# Initialize a new random value for the game
def init_new_value():
global pointValue, upper, lower, count
pointValue = int(urandom.uniform(lower, upper))
print(pointValue)
upper = 99
lower = 0
count = 0
return False
# Display messages on the LCD based on the game state
def lcd_show(result):
global count
lcd.clear()
if result == True:
string = "GAME OVER!\n"
string += "Point is " + str(pointValue)
else:
string = "Enter number: " + str(count) + "\n"
string += str(lower) + " < Point < " + str(upper)
lcd.message(string)
return
# Process the entered number and update the game state
def number_processing():
global upper, count, lower
if count > pointValue:
if count < upper:
upper = count
elif count < pointValue:
if count > lower:
lower = count
elif count == pointValue:
return True
count = 0
return False
# Process the key inputs from the IR remote control
def process_key(key):
global count, lower, upper, pointValue, result
if key == "Power":
init_new_value()
lcd_show(False)
elif key == "+":
result = number_processing()
lcd_show(result)
if result:
time.sleep(5)
init_new_value()
lcd_show(False)
else:
lcd_show(False)
elif key.isdigit():
count = count * 10 + int(key) if count * 10 + int(key) <= 99 else count
lcd_show(False)
# Decode the received data and return the corresponding key name
def decodeKeyValue(data):
if data == 0x16:
return "0"
if data == 0x0C:
return "1"
if data == 0x18:
return "2"
if data == 0x5E:
return "3"
if data == 0x08:
return "4"
if data == 0x1C:
return "5"
if data == 0x5A:
return "6"
if data == 0x42:
return "7"
if data == 0x52:
return "8"
if data == 0x4A:
return "9"
if data == 0x09:
return "+"
if data == 0x15:
return "-"
if data == 0x7:
return "EQ"
if data == 0x0D:
return "U/SD"
if data == 0x19:
return "CYCLE"
if data == 0x44:
return "PLAY/PAUSE"
if data == 0x43:
return "FORWARD"
if data == 0x40:
return "BACKWARD"
if data == 0x45:
return "POWER"
if data == 0x47:
return "MUTE"
if data == 0x46:
return "MODE"
return "ERROR"
def callback(data, addr, ctrl):
if data < 0:
pass
else:
key = decodeKeyValue(data)
if key != "ERROR":
process_key(key)
# Initialize the IR receiver object with the callback function
ir = NEC_8(pin_ir, callback)
# ir.error_function(print_error)
# Initialize the game with a new random value
init_new_value()
# Show the initial game state on the LCD
lcd_show(False)
try:
while True:
pass
except KeyboardInterrupt:
ir.close()
コードが実行されると、秘密の数字が生成されますが、LCDには表示されません。あなたが行うべきことは、それを推測することです。
リモコンで推測した数字を押し、
+
キーを押して確認します。同時に、I2C LCD1602に表示される範囲が狭まり、この新しい範囲に基づいて適切な数字を押す必要があります。
幸運にも不運にも正解の数字を押すと、
GAME OVER!
と表示されます。
注釈
コードと配線が正しくてもLCDに内容が表示されない場合は、背面のポテンショメータを調整してコントラストを上げることができます。
どのように機能するのか?
以下は、コードの一部の詳細な分析です。
数当てゲームの変数を初期化します。
lower = 0 upper = 99 pointValue = int(urandom.uniform(lower, upper)) count = 0
秘密の数字のための
lower
とupper
の境界値。lower
とupper
の境界値の間でランダムに生成される秘密の数字(pointValue
)。ユーザーの現在の推測(
count
)。
この関数は数当てゲームの値をリセットし、新しい秘密の数字を生成します。
def init_new_value(): global pointValue, upper, lower, count pointValue = int(urandom.uniform(lower, upper)) print(pointValue) upper = 99 lower = 0 count = 0 return False
この関数は現在のゲームの状態をLCD画面に表示します。
def lcd_show(result): global count lcd.clear() if result == True: string = "GAME OVER!\n" string += "Point is " + str(pointValue) else: string = "Enter number: " + str(count) + "\n" string += str(lower) + " < Point < " + str(upper) lcd.message(string) return
ゲームが終了した場合(
result=True
)、GAME OVER!
と秘密の数字を表示します。それ以外の場合、現在の推測(
count
)と現在の推測範囲(lower
からupper
)を表示します。
この関数はユーザーの現在の推測(
count
)を処理し、推測範囲を更新します。def number_processing(): global upper, count, lower if count > pointValue: if count < upper: upper = count elif count < pointValue: if count > lower: lower = count elif count == pointValue: return True count = 0 return False
現在の推測(
count
)が秘密の数字より高い場合、上限が更新されます。現在の推測(
count
)が秘密の数字より低い場合、下限が更新されます。現在の推測(
count
)が秘密の数字と等しい場合、関数はTrue
(ゲーム終了)を返します。
IRリモコンから受け取ったキー押下イベントを処理する関数です。
def process_key(key): global count, lower, upper, pointValue, result if key == "Power": init_new_value() lcd_show(False) elif key == "+": result = number_processing() lcd_show(result) if result: time.sleep(5) init_new_value() lcd_show(False) else: lcd_show(False) elif key.isdigit(): count = count * 10 + int(key) if count * 10 + int(key) <= 99 else count lcd_show(False)
Power
キーが押されると、ゲームがリセットされます。+
キーが押されると、現在の推測(count
)が処理され、ゲームの状態が更新されます。数字キーが押されると、現在の推測(
count
)が新しい数字で更新されます。
IRレシーバーが信号を受信するとトリガーされるコールバック関数です。
def callback(data, addr, ctrl): if data < 0: pass else: key = decodeKeyValue(data) if key != "ERROR": process_key(key)
6.8 植物モニター¶
植物モニタープロジェクトへようこそ!
このプロジェクトでは、ESP32ボードを使って、私たちの植物の世話を助けるシステムを作ります。このシステムを使えば、植物の温度、湿度、土壌の水分、そして光のレベルを監視し、植物が栄えるために必要なケアと注意を確実に提供できます。
必要な部品
このプロジェクトには、以下のコンポーネントが必要です。
キット全体を購入すると確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
|
- |
|
回路図

このシステムは、DHT11センサーを使用して周囲環境の温度と湿度レベルを測定します。 一方、土壌水分モジュールは土壌の水分レベルを、フォトレジスターは光のレベルを測定するために使用されます。 これらのセンサーからの読み取り値はLCDスクリーンに表示され、必要に応じて植物に水をやるための水ポンプはボタンを使って制御することができます。
IO32には1Kの内部プルダウン抵抗があり、デフォルトではロジックレベルが低いです。ボタンを押すと、VCC(高電圧)への接続が確立され、IO32上でロジックレベルが高くなります。
配線図
注釈
ここでは、バッテリーを挿入してから、拡張ボード上のスイッチをON位置にスライドさせてバッテリー供給を有効にすることをお勧めします。

コード
注釈
esp32-starter-kit-main\micropython\codes
パスにある6.8_plant_monitor.py
ファイルを開くか、コードをThonnyにコピー&ペーストします。それから、「Run Current Script」をクリックするかF5キーを押して実行します。右下隅にある「MicroPython (ESP32).COMxx」インタプリタを選択してください。
from machine import ADC, Pin
import time
import dht
from lcd1602 import LCD
# DHT11
dht11 = dht.DHT11(Pin(13))
# Soil moisture
moisture_pin = ADC(Pin(14))
moisture_pin.atten(ADC.ATTN_11DB)
# Photoresistor
photoresistor = ADC(Pin(35))
photoresistor.atten(ADC.ATTN_11DB)
# Button and pump
button = Pin(32, Pin.IN)
motor1A = Pin(27, Pin.OUT)
motor2A = Pin(26, Pin.OUT)
# I2C LCD1602 setup
lcd = LCD()
# Rotate the pump
def rotate():
motor1A.value(1)
motor2A.value(0)
# Stop the pump
def stop():
motor1A.value(0)
motor2A.value(0)
button_state = False
# Define the button callback function to toggle the button state
def button_callback(pin):
global button_state
button_state = not button_state
# Attach the button callback function to the rising edge of the button pin
button.irq(trigger=Pin.IRQ_RISING, handler=button_callback)
page = 0
temp = 0
humi = 0
try:
while True:
# If the button is pressed and button state is True
if button_state:
print("rotate")
rotate()
# If the button is pressed again and button state is False
if not button_state:
print("stop")
stop()
time.sleep(2)
# Clear the LCD display
lcd.clear()
# Toggle the value of the page variable between 0 and 1
page=(page+1)%2
# When page is 1, display temperature and humidity on the LCD1602
if page is 1:
try:
# Measure temperature and humidity
dht11.measure()
# Get temperature and humidity values
temp = dht11.temperature()
humi = dht11.humidity()
except Exception as e:
print("Error: ", e)
# Display temperature and humidity
lcd.write(0, 0, "Temp: {}\xDFC".format(temp))
lcd.write(0, 1, "Humi: {}%".format(humi))
# If page is 0, display the soil moisture and light
else:
light = photoresistor.read()
moisture = moisture_pin.read()
# Clear the LCD display
lcd.clear()
# Display the value of soil moisture and light
lcd.write(0, 0, f"Moisture: {moisture}")
lcd.write(0, 1, f"Light: {light}")
except KeyboardInterrupt:
# Stop the motor when KeyboardInterrupt is caught
stop()
コードが実行中の場合、I2C LCD1602は温度と湿度を交互に表示し、土壌の水分と光の強度のアナログ値を2秒間隔で表示します。
ボタンを押して水ポンプを起動し、もう一度押して水ポンプを停止します。
注釈
コードと配線が正しいにも関わらず、LCDに何も表示されない場合は、背面のポテンショメータを調整してコントラストを上げることができます。
Scratchで遊ぼう¶
Arduino IDEやThonny IDEでのプログラミングのほかに、グラフィカルプログラミングを使用することもできます。
ここではScratchでのプログラミングを推奨しますが、公式のScratchは現在Raspberry Piとのみ互換性があります。そのため、STEMPediaという会社がパートナーシップを組み、Arduino Uno、Mega、Nano、ESP32、Microbit、そしてSTEMPedia自家製のメインボードなど、多くのボード用のScratch 3ベースのグラフィカルプログラミングソフトウェア PictoBlox を開発しました。

これはScratch 3の基本機能を保持しつつ、外部センサーやロボットを使ってステージ上のスプライトを制御することができ、ハードウェアとの強い相互作用機能を追加しています。
さらに、AIや機械学習も搭載しており、プログラミングの基礎があまりなくても、これらの人気がありハイテクな技術を学び使うことができます。
Scratchのコーディングブロックをドラッグ&ドロップして、クールなゲーム、アニメーション、インタラクティブなプロジェクトを作ったり、ロボットを自由に制御したりしましょう!
さあ、発見の旅を始めましょう!
1. はじめに
1.1 PictoBloxのインストール¶
このリンクをクリックしてください: https://thestempedia.com/product/pictoblox/download-pictoblox/。適切なオペレーティングシステム(Windows、macOS、Linux)を選択し、指示に従ってインストールしてください。

1.2 インターフェース紹介¶

スプライト(Sprites)
スプライトは、プロジェクトでさまざまなアクションを実行するオブジェクトまたはキャラクターです。与えられた命令を理解し、従います。各スプライトには、カスタマイズも可能な特定のコスチュームとサウンドがあります。
ステージ(Stage)
ステージは、スプライトがあなたのプログラムに従ってバックドロップでアクションを実行するエリアです。
バックドロップ(Backdrops)
バックドロップは、ステージを装飾するために使用されます。PictoBloxから選ぶことも、自分で描くことも、コンピューターから画像をアップロードすることもできます。
スクリプトエリア(Script Area)
スクリプトは、PictoBlox/Scratch用語でのプログラムまたはコードです。タスクまたは一連のタスクを実行するために特定の順序で配置された「ブロック」のセットです。複数のスクリプトを書くことができ、すべて同時に実行することができます。スクリプトは画面中央のスクリプトエリアでのみ書くことができます。
ブロック(Blocks)
ブロックは、スクリプトエリアに積み重ねるだけでプログラムを書くために使用されるパズルのピースのようなものです。ブロックを使用してコードを書くことで、プログラミングを簡単にし、エラーの可能性を減らすことができます。
ブロックパレット(Block Palette)
ブロックパレットは左側のエリアにあり、その機能によって名付けられています。例えば、運動、音、制御などです。各パレットには異なるブロックがあり、例えば運動パレットのブロックはスプライトの動きを制御し、制御パレットのブロックは特定の条件に基づいてスクリプトの作業を制御します。
他にも、左下にある 拡張機能を追加(Add Extension) ボタンからロードできるブロックパレットがあります。
モード(Modes)
Scratchとは異なり、PictoBloxには2つのモードがあります:
ステージモード:このモードでは、スプライトとボード用のスクリプトを書き、リアルタイムでスプライトと対話することができます。Pictobloxからボードを切断すると、もう対話することはできません。
アップロードモード:このモードでは、スクリプトを書いてボードにアップロードし、コンピュータに接続されていないときでも使用できます。例えば、動くロボットを作るためのスクリプトをアップロードする必要があります。
詳細については、以下を参照してください: https://thestempedia.com/tutorials/getting-started-pictoblox
1.3 PictoBloxのクイックガイド¶
必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入するのが確実に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
さて、PictoBloxの2つのモードの使用方法を学びましょう。
また、このLEDを2つの異なるモードで点滅させるための簡単な回路も組み立てます。

ステージモード¶
1. ESP32ボードに接続する
ESP32ボードをUSBケーブルでコンピュータに接続します。通常、コンピュータは自動的にボードを認識し、最終的にCOMポートを割り当てます。
PictoBloxを開くと、デフォルトでPythonプログラミングインターフェイスが開きます。そして、私たちはブロックインターフェイスに切り替える必要があります。

すると、モード切替のための右上の角にあるオプションが見えます。デフォルトはステージモードで、Tobiがステージの上に立っています。

右上のナビゲーションバーの Board をクリックしてボードを選択します。

例えば、 ESP32 を選択します。

接続ウィンドウがポップアップして、接続するポートを選択します。接続が完了するとホームページに戻ります。使用中に接続が切れた場合は、 Connect をクリックして再接続することもできます。

同時に、 Block Palette にESP32関連のパレット、例えばESP32、アクチュエーターなどが表示されます。

2. ファームウェアのアップロード
ステージモードで作業を行うため、ボードにファームウェアをアップロードする必要があります。これにより、ボードとコンピュータ間のリアルタイム通信が保証されます。ファームウェアのアップロードは一度きりのプロセスです。アップロードするには、アップロードファームウェアボタンをクリックします。
しばらく待つと、アップロード成功のメッセージが表示されます。
注釈
このボードをPictoBloxで初めて使用する場合、または以前にArduino IDEでアップロードしたことがある場合は、使用する前に Upload Firmware する必要があります。

3. プログラミング
スクリプトを直接開いて実行する
もちろん、スクリプトを直接開いて実行することもできますが、まず github からダウンロードしてください。
右上の File をクリックしてから、 Open を選択します。

Open from Computer を選択します。

esp32-starter-kit-main\scratch
のパスに移動し、 1. Stage Mode.sb3 を開きます。 github から必要なコードをダウンロードしたことを確認してください。

スクリプトを直接クリックして実行します。一部のプロジェクトでは、緑の旗をクリックするか、スプライトをクリックします。

ステップバイステップでプログラムする
これらのステップに従ってスクリプトをステップバイステップで書くこともできます。
ESP32 パレットをクリックします。

LEDはデジタルピン26(HIGHまたはLOWの2つの状態のみ)によって制御されるため、[set digital pin out as] ブロックをスクリプトエリアにドラッグします。
LEDのデフォルト状態は点灯しているので、今はピン23をLOWに設定し、このブロックをクリックするとLEDが消えるのを見ることができます。
[set digital pin out as]: デジタルピンを(HIGH/LOW)レベルに設定します。

連続して点滅するLEDの効果を見るためには、 Control パレットの [Wait 1 seconds] と [forever] ブロックを使用する必要があります。これらのブロックを書いた後でクリックすると、黄色いハローが表示され、実行中であることを意味します。
[Wait 1 seconds]: Control パレットから、2つのブロック間の時間間隔を設定するために使用されます。
[forever]: Control パレットから、手動で一時停止しない限りスクリプトが実行し続けることを可能にします。

アップロードモード¶
1. ESP32ボードの接続
USBケーブルでESP32ボードをコンピュータに接続します。通常、コンピュータは自動的にボードを認識し、最終的にCOMポートを割り当てます。
PictoBloxを開き、右上のナビゲーションバーの Board をクリックしてボードを選択します。

例えば、 ESP32 を選択します。

接続ウィンドウがポップアップし、接続するポートを選択します。接続が完了するとホームページに戻ります。使用中に接続が切れた場合は、 Connect をクリックして再接続できます。

同時に、 Block Palette にESP32関連のパレットが表示されます。

アップロードモードを選択すると、ステージが元のコードエリアに切り替わります。

2. プログラミング
スクリプトを直接開いて実行する
右上の File をクリックします。

Open from Computer を選択します。

esp32-starter-kit-main\scratch
のパスに移動し、 1. Upload Mode.sb3 を開きます。 github から必要なコードをダウンロードしたことを確認してください。

最後に、 Upload Code ボタンをクリックします。

ステップバイステップでプログラムする
これらのステップに従ってスクリプトをステップバイステップで書くこともできます。
ESP32 パレットをクリックします。

スクリプトエリアに[when ESP32 starts up]をドラッグします。これはすべてのスクリプトに必要です。

LEDはデジタルピン26(HIGHまたはLOWの2つの状態のみ)によって制御されるため、[set digital pin out as] ブロックをスクリプトエリアにドラッグします。
LEDのデフォルト状態が点灯しているので、今はピン26をLOWに設定し、このブロックをクリックするとLEDが消えるのが見えます。
[set digital pin out as]: デジタルピンを(HIGH/LOW)レベルに設定します。

ここで右側にコードが表示されます。このコードを編集したい場合は、編集モードをオンにします。

連続して点滅するLEDの効果を見るためには、 Control パレットの [Wait 1 seconds] と [forever] ブロックを使用する必要があります。これらのブロックを書いた後でクリックすると、黄色いハローが表示され、実行中であることを意味します。
[Wait 1 seconds]: Control パレットから、2つのブロック間の時間間隔を設定するために使用されます。
[forever]: Control パレットから、電源がオフにならない限りスクリプトが実行し続けることを可能にします。

最後に、 Upload Code ボタンをクリックします。

2. プロジェクト
以下のプロジェクトは、プログラミングの難易度順に記載されており、順番に読むことをお勧めします。
各プロジェクトには、回路の組み立て方やプログラミングのステップバイステップの方法が非常に詳しく記載されています。
もちろん、スクリプトを直接開いて実行することもできますが、 github から関連資料をダウンロードしていることを確認する必要があります。
ダウンロードが完了したら、ファイルを解凍してください。個々のスクリプトを直接実行するには ステージモード を参照してください。
しかし、2.8 温度と湿度の読み取り は アップロードモード を使用しています。
2.1 テーブルランプ¶
ここでは、ブレッドボード上のLEDを接続し、スプライトがこのLEDの点滅を制御するようにします。
ステージ上のButtonスプライトをクリックすると、LEDが5回点滅した後、停止します。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
ブレッドボード、LED、抵抗器
ブレッドボード上での回路構築
スプライトの削除と選択
コスチュームの切り替え
繰り返し回数を限定する
回路の構築¶
下の図を参考にして、ブレッドボード上に回路を構築してください。
LEDのアノード(長いピン)は220Ωの抵抗を介してピン26に接続され、LEDのカソードはGNDに接続されているため、ピン9に高レベルを与えるとLEDを点灯させることができます。

プログラミング¶
プログラミングは3部分に分かれており、最初の部分では希望するスプライトを選択し、2つ目の部分ではスプライトのコスチュームを切り替えてクリック可能に見えるようにし、3つ目の部分ではLEDを点滅させます。
1. Button3スプライトの選択
右上のDeleteボタンを使って既存のTobiスプライトを削除し、もう一度スプライトを選択してください。

ここでは、 Button3 スプライトを選択します。

右上のCostumesをクリックすると、Button3スプライトに2つのコスチュームがあるのがわかります。 button3-a をリリース状態に、 button3-b を押された状態に設定します。

2. コスチュームの切り替え。
スプライトがクリックされたとき( イベント パレット)、 button3-b のコスチュームに切り替えます( ルックス パレット)。

3. LEDを5回点滅させる
[Repeat]ブロックを使用してLEDを5回点滅させ(High-> LOWサイクル)、最後にコスチュームを button3-a に戻します。
[Repeat 10]: 繰り返し回数を限定する、回数は自分で設定できます( コントロール パレットから)。

2.2 ブレシングLED¶
今回は別の方法でLEDの明るさを制御します。前のプロジェクトとは異なり、ここではLEDの明るさが徐々に減少し、最終的には消えるようにしています。
ステージ上のスプライトをクリックすると、LEDの明るさが徐々に増加し、その後すぐに消灯します。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
PWMピンの出力値を設定する
変数を作成する
スプライトの明るさを変える
回路の構築¶
このプロジェクトは前のプロジェクト 2.1 テーブルランプ と同じ回路を使用しますが、LEDを点灯させたり消したりするためにHIGH/LOWを使用する代わりに、 PWM - Wikipedia シグナルを使用してLEDをゆっくりと点灯させたり暗くしたりします。
PWM信号の範囲は0-255で、ESP32ボードでは、2, 5, 12~15, 18, 19, 21, 22, 25, 26, 27がPWM信号を出力することができます。

プログラミング¶
1. スプライトの選択
デフォルトのスプライトを削除し、スプライトエリアの右下隅にある Choose a Sprite ボタンをクリックし、検索ボックスに button3 を入力してからクリックして追加します。

2. 変数の作成。
pwm という名前の変数を作成して、pwmの変化の値を格納します。
Variables パレットで Make a Variable を選択します。

変数の名前を入力します。任意の名前でかまいませんが、その機能を説明することをお勧めします。データタイプは数値で、すべてのスプライト用です。

作成すると、 Variables パレット内に pwm が表示され、チェック状態になります。これは、この変数がステージ上に表示されることを意味します。チェックを外すと、ステージ上にpwmがまだ存在するかどうかを確認できます。

3. 初期状態の設定
button3 スプライトがクリックされたとき、コスチュームを button-b (クリック状態)に切り替え、変数 pwm の初期値を0に設定します。
[set pwm to 0]: Variables パレットから、変数の値を設定するために使用します。

4. LEDを徐々に明るくする
pwmの範囲が255であるため、[repeat]ブロックにより、変数 pwm を5ずつ255まで蓄積し、[set PWM pin]ブロックに入れると、LEDがゆっくりと点灯するのが見えます。
[change pwm by 5]: Variables パレットから、毎回特定の数だけ変数を変更するために使用します。プラスまたはマイナスの数値が可能で、プラスは毎回増加、マイナスは毎回減少を意味します。例えば、ここでは変数pwmが毎回5ずつ増加します。
[set PWM pin]: ESP32 パレットから、pwmピンの出力値を設定するために使用します。

最後に、button3のコスチュームを button-a に戻し、PWMピンの値を0にすることで、LEDがゆっくりと点灯してから再び消灯します。

2.3 カラフルボール¶
このプロジェクトでは、RGB LEDを使用して異なる色を表示します。
ステージエリアの異なる色のボールをクリックすると、RGB LEDが異なる色で点灯します。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
RGB LEDの原理
スプライトのコピーと異なるコスチュームの選択
三原色の重ね合わせ
回路の構築¶
RGB LEDは、赤、緑、青の3つのLEDを透明または半透明のプラスチックシェルに封入したものです。3つのピンに入力される電圧を変えて重ね合わせることで、様々な色を表示できます。統計によると、16,777,216色の異なる色を作り出すことができます。


プログラミング¶
1. スプライトの選択
デフォルトのスプライトを削除し、その後 Ball スプライトを選びます。

そして、それを5回複製します。

これら5つの Ball スプライトに異なるコスチュームを選び、それぞれの位置に移動させます。
注釈
Ball3 スプライトのコスチュームの色は、手動で赤に変更する必要があります。

2. 適切な色でRGB LEDを点灯させる
コードを理解する前に、 RGBカラーモデル を理解する必要があります。
RGBカラーモデルは、赤、緑、青の光をさまざまな方法で組み合わせて広い範囲の色を再現する加法色モデルです。
加法色混合:赤に緑を加えると黄色になり、緑に青を加えるとシアンになり、青に赤を加えるとマゼンタになり、3つの原色をすべて加えると白になります。

したがって、RGB LEDが黄色に点灯するコードは以下の通りです。

ステージのボールスプライト(黄色いボール)をクリックすると、ピン27をハイ(赤色LED点灯)、ピン26をハイ(緑色LED点灯)そしてピン25をロー(青色LED消灯)に設定することで、RGB LEDは黄色に点灯します。
他のスプライトに対しても同様の方法でコードを書くことで、RGB LEDを対応する色で点灯させることができます。
3. ボール2スプライト(水色)

4. ボール3スプライト(赤)

5. ボール4スプライト(緑)

6. ボール5スプライト(紫)

2.4 動くマウス¶
今日はポテンショメータで制御するマウスのおもちゃを作ります。
緑の旗がクリックされると、ステージ上のマウスが前進し、ポテンショメータを回転させると、マウスが移動方向を変えます。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
ポテンショメータの原理
アナログピンの読み取りと範囲
一つの範囲から別の範囲へのマッピング
スプライトの動きと方向の変更
回路の構築¶
ポテンショメータは3つの端子を持つ抵抗素子で、側面の2つのピンは5VとGNDに、中央のピンはピン35に接続されます。ESP32のADCコンバータによる変換後、値の範囲は0-4095になります。

プログラミング¶
1. スプライトの選択
デフォルトのスプライトを削除し、スプライトエリアの右下にある Choose a Sprite ボタンをクリックし、検索ボックスに mouse と入力してからクリックして追加します。

2. 変数の作成。
ポテンショメータの読み取り値を保存するために、 value という変数を作成します。
作成すると、 Variables パレット内に value が表示され、チェック状態になります。これはこの変数がステージ上に表示されることを意味します。

3. ピン35の値を読む
ピン35の読み取り値を変数 value に格納します。
[set my variable to 0]: 変数の値を設定します。
[read analog pin ()]: 0-4095の範囲のピンの値を読み取ります。

常に読み取りを行うためには、[forever]ブロックを使用する必要があります。このスクリプトを実行してポテンショメータを両方向に回転させると、値の範囲が0-1023であることがわかります。

4. スプライトを動かす
[move steps]ブロックを使ってスプライトを動かし、スクリプトを実行すると、スプライトが中央から右に移動するのが見られます。

5. スプライトの方向を変える
今度はピン35の値によってスプライトの移動方向を変えます。ピン35の値は0-4095の範囲ですが、スプライトの回転方向は-180~180なので、[map]ブロックを使用する必要があります。
また、最初に[緑の旗がクリックされたとき]を追加してスクリプトを開始します。
[point in direction]: スプライトの操縦角度を設定します。 Motion パレットから。
[map from to]: 一つの範囲を別の範囲にマッピングします。

2.5 ドアベル¶
ここでは、ステージ上のボタンとベルを使用してドアベルを作ります。
緑の旗がクリックされた後、ボタンを押すとステージ上のベルが音を出します。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
ボタンの仕組み
デジタルピンの読み取りと範囲
条件付きループの作成
背景の追加
音の再生
回路の構築¶
ボタンは4ピンのデバイスで、ピン1とピン2、ピン3とピン4が接続されており、ボタンを押すと4ピンが接続され、回路が閉じます。

以下の図に従って回路を組み立ててください。
ボタンの左側のピンの一つをピン14に接続し、プルダウン抵抗と0.1uF(104)キャパシタ(ジッターを除去し、ボタン作動時に安定したレベルを出力するため)に接続します。
抵抗とキャパシタの他端をGNDに、ボタンの右側のピンの一つを5Vに接続します。

プログラミング¶
1. 背景を追加
スプライトエリアの右下にある Choose a Backdrop ボタンをクリックします。

Bedroom 1 を選択します。

2. スプライトを選択
デフォルトのスプライトを削除し、スプライトエリアの右下にある Choose a Sprite ボタンをクリックし、検索ボックスに bell と入力してからクリックして追加します。

次に、ステージ上の bell スプライトを選択し、適切な位置に移動します。

3. ボタンを押してベルを鳴らす
[if then]を使用して条件文を作成し、ピン14の読み取り値が1(キーが押された)に等しい場合、 xylo1 の音を再生します。
[read status of digital pin]: このブロックは ESP32 パレットからで、デジタルピンの値を読み取るために使用されます。結果は0または1です。
[if then]: このブロックは制御ブロックで、 Control パレットから来ています。そのブール条件が真の場合、内部のブロックが実行され、関連するスクリプトが続行されます。条件が偽の場合、ブロック内のスクリプトは無視されます。条件は一度だけチェックされます。ブロック内のスクリプトが実行中に条件が偽に変わった場合でも、完了するまで実行され続けます。
[play sound until done]: このブロックはSoundパレットからで、特定の音を再生するために使用されます。

2.6 低温アラーム¶
このプロジェクトでは、温度が閾値以下になると、ステージ上に Snowflake スプライトが現れる低温アラームシステムを作ります。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
サーミスターの原理
複数変数と減算操作
回路の構築¶
サーミスターは、標準の抵抗器よりも温度に強く依存する抵抗器であり、PTC(温度が上がると抵抗が上がる)とPTC(温度が上がると抵抗が下がる)の2種類があります。
以下の図に従って回路を組み立ててください。
サーミスターの一端をGNDに、もう一端をピン35に接続し、10K抵抗を5Vに直列に接続します。
ここで使用されるNTCサーミスターは、温度が上昇するとサーミスターの抵抗が下がり、ピン35の電圧分割が下がり、ピン35から得られる値が下がり、逆に上がります。

プログラミング¶
1. スプライトを選択
デフォルトのスプライトを削除し、スプライトエリアの右下にある Choose a Sprite ボタンをクリックし、検索ボックスに Snowflake と入力してからクリックして追加します。

2. 2つの変数を作成
before と current の2つの変数を作成し、異なるケースのピン35の値を保存します。

3. ピン35の値を読む
緑の旗がクリックされたら、ピン35の値を読み取って変数 before に保存します。

4. ピン35の値を再度読む
[forever]でピン35の値を再度読み取り、変数 current に保存します。

5. 温度変化を判断する
[if else] ブロックを使用して、ピン35の現在の値がbeforeより200以上かどうかを判断し、温度が下がったことを表します。この場合は Snowflake スプライトを表示し、そうでない場合は隠します。
[-] & [>]: Operators パレットからの減算および比較演算子。

2.7 光で制御する目覚まし時計¶
日常生活には様々な種類のアラーム時計がありますが、今回は光を感知して作動するアラーム時計を作ってみましょう。朝になり光の明るさが増すと、この光で制御するアラーム時計が時間になったことを知らせてくれます。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
フォトレジスタの原理
音声再生の停止とスクリプトの実行停止
回路の構築¶
フォトレジスタまたはフォトセルは、光によって変化する可変抵抗器です。光の強さが増すとフォトレジスタの抵抗値は減少します。
以下の図に従って回路を組み立ててください。
フォトレジスタの一端を5Vに、もう一端をピン35に接続し、この端に10Kの抵抗をGNDと直列に接続します。
したがって、光の強度が増すとフォトレジスタの抵抗値は減少し、10K抵抗の分圧は増加し、ピン35から得られる値は大きくなります。

プログラミング¶
1. スプライトを選択
デフォルトのスプライトを削除し、スプライトエリアの右下にある Choose a Sprite ボタンをクリックし、検索ボックスに bell を入力してからクリックして追加します。

2. ピン35の値を読む
before と current の2つの変数を作成します。緑の旗がクリックされたとき、ピン35の値を読み取り、基準値として変数 before に保存します。[forever]では、ピン35の値を再度読み取り、変数 current に保存します。

3. 音を鳴らす
現在のピン35の値が前回の50よりも大きい場合、つまり現在の光の強度が閾値よりも大きいことを表すため、スプライトに音を出させます。

4. スプライトを回転させる
[turn block]を使用して、 bell スプライトが左右に回転し、アラーム効果を実現します。

5. すべてを止める
アラームがしばらく鳴り続けた後に停止します。

2.8 温度と湿度の読み取り¶
これまでのプロジェクトではステージモードを使用してきましたが、シリアル通信機能など、アップロードモードでのみ利用可能な機能があります。 このプロジェクトでは、 アップロードモード のシリアルモニターを使用して、DHT11の温度と湿度を印刷します。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
DHT11モジュールから温度と湿度を取得する
アップロードモード のシリアルモニター
拡張機能の追加
回路の構築¶
デジタル温度と湿度センサーDHT11は、校正されたデジタル信号出力を持つ温度と湿度の複合センサーです。
以下の図に従って回路を組み立てます。

プログラミング¶
1. 拡張機能の追加
Upload モードに切り替え、左下隅の Add Extension ボタンをクリックしてから、 Communication を選択して追加します。すると、パレットエリアの最後に表示されます。

2. ESP32とシリアルモニターの初期化
Upload モードでESP32を起動し、その後シリアルポートのボーレートを設定します。
[when ESP32 Starts up]: Upload モードでESP32を起動します。
[set serial baud rate to]: Communications パレットから、シリアルポート0のボーレートを設定するために使用します。デフォルトは115200です。Mega2560を使用している場合は、シリアルポート0〜2のボーレートを設定することができます。

3. 温度と湿度を読み取る
tem と humi という2つの変数を作成し、それぞれ温度と湿度を格納します。ブロックをドラッグアンドドロップすると、コードが右側に表示されます。

4. シリアルモニターに表示する
読み取った温度と湿度をシリアルモニターに書き込みます。PictoBloxがジャムを起こす原因となる過度な速度での転送を避けるために、[wait seconds]ブロックを使用し、次の印刷のための時間間隔を設けます。

5. コードをアップロードする
Stage モードとは異なり、 Upload モードのコードは、効果を確認するために Upload Code ボタンを使用してESP32ボードにアップロードする必要があります。これにより、USBケーブルを抜いてもプログラムが実行され続けます。

6. シリアルモニターを開く
今、 Serial Monitor を開いて温度と湿度を確認しましょう。

2.9 回転するファン¶
このプロジェクトでは、回転する星のスプライトとファンを作ります。
ステージ上の左右の矢印スプライトをクリックすると、モーターと星スプライトの時計回りと反時計回りの回転が制御されます。星スプライトをクリックすると回転が停止します。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
- |
学べること¶
モーターの動作原理
ブロードキャスト機能
スプライト内の他のスクリプトを停止するブロック
回路の構築¶

プログラミング¶
私たちが達成したい効果は、ステージ上の2つの矢印スプライトを使って、それぞれモーターと星スプライトの時計回りと反時計回りの回転を制御することです。星スプライトをクリックするとモーターの回転が停止します。
1. スプライトの追加
デフォルトのスプライトを削除し、 Star スプライトと Arrow1 スプライトを選択し、 Arrow1 を一度コピーします。

Costumes オプションで、 Arrow1 スプライトを異なる方向のコスチュームに変更します。

スプライトのサイズと位置を適切に調整します。

2. 左矢印スプライト
このスプライトがクリックされたとき、メッセージ - 回転をブロードキャストし、デジタルピン12を低く、ピン14を高く設定し、変数 flag を1に設定します。左矢印スプライトをクリックすると、モーターが反時計回りに回転しますが、もしそれが時計回りに回転する場合は、ピン12とピン14の位置を交換します。
ここで注意すべき2点があります。
[broadcast]: Events パレットから、他のスプライトにメッセージをブロードキャストするために使用されます。他のスプライトがこのメッセージを受信すると、特定のイベントが実行されます。 たとえば、 turn では、 star スプライトがこのメッセージを受信すると、回転スクリプトを実行します。
変数flag: 星スプライトの回転方向はflagの値によって決まります。ですので、 flag 変数を作成するときは、すべてのスプライトに適用するようにしてください。

3. 右矢印スプライト
このスプライトがクリックされたとき、メッセージturnをブロードキャストし、デジタルピン12を高く、ピン14を低く設定してモーターを時計回りに回転させ、変数 flag を0に設定します。

4. 星スプライト
ここには2つのイベントが含まれています。
star スプライトがブロードキャストされたメッセージ ターンを受信すると、フラグの値が決定されます。 flag が 1 の場合は左に 10 度回転し、それ以外の場合は反転します。[FOREVER]になっているので回り続けます。
このスプライトがクリックされたとき、モーターの両方のピンを高く設定して回転を停止させ、このスプライト内の他のスクリプトを停止します。

2.10 光感知ボール¶
このプロジェクトでは、フォトレジスターを使用してステージ上のボールを上方向に飛ばします。フォトレジスターの上に手を置いて、受ける光の強さをコントロールします。手がフォトレジスターに近づくほど、その値は小さくなり、ステージ上でボールはより高く飛びます。そうでなければボールは落ちます。ボールが線に触れると、美しい音がして星の光がきらめきます。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全キットを購入すると便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
下記のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
スプライトに色を塗る
スプライト間のタッチ
回路の構築¶
フォトレジスターまたはフォトセルは、光によって可変する抵抗器です。フォトレジスターの抵抗は、入射光の強度が増すと減少します。
以下の図に従って回路を構築します。
フォトレジスターの一方の端を5Vに、もう一方の端をピン35に接続し、この端に10Kの抵抗をGNDと直列に接続します。
したがって、光の強度が増すと、フォトレジスターの抵抗が減少し、10Kの抵抗の電圧分割が増加し、ピン35によって得られる値が大きくなります。

プログラミング¶
私たちが得たい効果は、あなたの手がフォトレジスターに近づくほど、ステージ上のボールスプライトが上に上がり続け、そうでなければボウルスプライトに落ちるということです。上がったり落ちたりする途中でラインスプライトに触れると、音楽の音がして、あらゆる方向に星スプライトを放出します。
1. スプライトと背景の選択
デフォルトのスプライトを削除し、 Ball、 Bowl、 Star スプライトを選択します。

Bowl スプライトをステージの底の中央に移動し、サイズを大きくします。

Ball スプライトを上方向に動かす必要があるため、向きを0に設定します。

Star スプライトのサイズと向きを180に設定します。下方向に落ちる必要があるためですが、他の角度に変更することもできます。

次に、 Stars 背景を追加します。

2. Line スプライトの描画
Line スプライトを追加します。

Line スプライトの Costumes ページに移動し、キャンバス上の赤い線の幅を少し狭くして、それを5回コピーして線を揃えます。

次に、線を好きな色で塗ります。好きな色を選んで、 Fill ツールをクリックし、マウスを線の上に移動して色を塗ります。

同じ方法で他の線の色を変更します。

3. Ball スプライトのスクリプト
Ball スプライトの初期位置を設定し、光の値が1500未満の場合(環境に応じて他の値にすることもできます。)、Ballを上に移動させます。
light_value 変数をステージ上に表示させ、いつでも光の強度の変化を観察できるようにします。

そうでない場合、 Ball スプライトは落下し、Y座標の最小値を-100に制限します。これは、 Bowl スプライトの上に落ちているように見えるように変更できます。

Line スプライトに触れたとき、現在のY座標を変数 ball_coor に保存し、 Bling メッセージをブロードキャストします。

4. Star スプライトのスクリプト
スクリプトが開始されたとき、まず Star スプライトを隠します。 Bling メッセージを受け取ったとき、 Star スプライトをクローンします。

Star スプライトがクローンとして現れたとき、効果音を鳴らし、その座標を Ball スプライトと同期させます。

Star スプライトの登場効果を作り、必要に応じて調整します。

2.11 ゲーム - 射撃¶
テレビで見る射撃ゲームはご存知ですか?競技者がターゲットの真ん中に近いところに弾丸を撃つほど、高得点を得られます。
今日はScratchで射撃ゲームを行います。ゲームでは、十字線をできるだけ中心に近づけて、より高い得点を獲得しましょう。
緑の旗をクリックしてスタートします。障害物回避モジュールを使って弾丸を撃ちます。

必要な部品¶
このプロジェクトには以下の部品が必要です。
全てのキットを購入するのが便利ですが、以下のリンクからも個別に購入できます。
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
障害物回避モジュールの仕組みと角度範囲
異なるスプライトのペイント
色のタッチ
回路の構築¶
障害物回避モジュールは距離調整可能な赤外線近接センサーで、通常は高出力で障害物を検知すると低出力になります。
以下の図に従って回路を組み立ててください。

プログラミング¶
1. 照準のスプライトを描く
デフォルトのスプライトを削除し、 Sprite ボタンを選択して Paint をクリックすると、空白のスプライト Sprite1 が現れるので、 Crosshair と名付けます。

Crosshair スプライトの Costumes ページに移動します。 Circle ツールをクリックし、塗りつぶし色をなくして、アウトラインの色と幅を設定します。

Circle ツールで円を描きます。描いた後、 Select ツールをクリックして円を移動し、原点がキャンバスの中心に合うようにします。

Line ツールを使って、円の内側に十字を描きます。

ターゲットのスプライトを描く
Target という新しいスプライトを作成します。

Target スプライトのコスチュームページに移動し、 Circle ツールをクリックして、塗りつぶし色を選んでアウトラインをなくし、大きな円を描きます。

同じ方法でさらに円を描き、それぞれに異なる色を使用します。 Forward や Backbard ツールを使って、重なっている円の位置を変更することができます。また、ツールを選択して円を移動し、すべての円の原点がキャンバスの中心に合うようにする必要があります。

3. 背景を追加
できれば色が多すぎず、 Target スプライトの色と一致しない、適切な背景を追加します。 ここでは Wall1 背景を選択しました。

4. 照準スプライトのスクリプト
Crosshair スプライトのランダムな位置とサイズを設定し、ランダムに動かします。

障害物回避モジュールの前に手を置くと、送信信号としてローレベルを出力します。

shooting メッセージを受け取ると、スプライトは動きを止めてゆっくり縮小し、弾丸が撃たれた効果をシミュレートします。

[Touch color ()]ブロックを使って、ショットの位置を判断します。

ショットが黄色の円の内側にある場合、10ポイントを報告します。

同じ方法で弾丸の撃たれた位置を判断しますが、 Target スプライトに設定されていない場合は円の外ということになります。

2.12 ゲーム - 風船を膨らます¶
ここでは、風船を膨らませるゲームを行います。
緑の旗をクリックした後、風船がどんどん大きくなります。風船が大きすぎると爆発してしまい、小さすぎると落下してしまうので、いつボタンを押して上昇させるかを判断する必要があります。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全てのキットを購入することは非常に便利です。リンクはこちらです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
スプライトのコスチュームを描く
回路の構築¶
ボタンは4ピンのデバイスで、ピン1がピン2に、ピン3がピン4に接続されており、ボタンが押されると4つのピンが接続されて回路が閉じます。

以下の図に従って回路を組み立てます。
ボタンの左側のピンの1つをピン14に接続します。ピン14はプルダウン抵抗と0.1uF(104)のコンデンサー(ボタンが動作しているときにジッターを排除し、安定したレベルを出力するため)に接続されています。
抵抗とコンデンサーの他端をGNDに、ボタンの右側のピンの1つを5Vに接続します。

プログラミング¶
1. スプライトと背景を追加する
デフォルトのスプライトを削除し、スプライトエリアの右下にある Choose a Sprite ボタンをクリックして、 Balloon1 スプライトを選択します。

Choose a backdrop ボタンを使って Boardwalk 背景を追加するか、他のお好みの背景を追加します。

2. Balloon1スプライトの衣装を描く
次に、風船スプライトの爆発エフェクト衣装を描きましょう。
Balloon1 スプライトの Costumes ページに移動し、左下の Choose a Costume ボタンをクリックして、 Paint を選び、白紙の Costumes を表示させます。

色を選んで、 Brush ツールを使って模様を描きます。

再度色を選び、塗りつぶしツールをクリックし、模様の内側にマウスを移動させて色を塗ります。

最後に、BOOMというテキストを書いて、爆発エフェクト衣装が完成です。

3. Balloonスプライトのスクリプトを組む
Balloon1 スプライトの初期位置とサイズを設定します。

そして、 Balloon スプライトがゆっくりと大きくなるようにします。

ボタンが押されたとき(値が1のとき)、 Balloon1 スプライトのサイズの拡大が停止します。
サイズが90未満の場合は落下します(y座標が減少)。
サイズが90以上で120未満の場合は、空へ飛び立ちます(y座標が増加)。

ボタンが押されていない場合、風船はゆっくりと大きくなり、サイズが120を超えると爆発します(爆発エフェクトの衣装に切り替え)。

2.13 GAME - Star-Crossed¶
PictoBloxで、いくつかの楽しいミニゲームをプレイします。
ここでは、ジョイスティックモジュールを使用して、スタークロストゲームをプレイします。
スクリプトが実行されると、星がステージ上にランダムに出現します。ジョイスティックを使ってロケットシップを制御し、星を避けなければなりません。もし星に触れたら、ゲームオーバーになります。

必要な部品¶
このプロジェクトでは、以下のコンポーネントが必要です。
全キットを購入するのが便利ですが、以下のリンクからも個別に購入できます。
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
学べること¶
ジョイスティックモジュールの仕組み
スプライトのxとy座標の設定方法
回路の構築¶
ジョイスティックは、基部でピボットするスティックからなる入力デバイスで、その角度や方向を制御しているデバイスに報告します。ジョイスティックは、ビデオゲームやロボットを制御するためによく使用されます。
コンピュータに完全な動きの範囲を伝えるために、ジョイスティックは2軸 - X軸(左右)とY軸(上下)でスティックの位置を測定する必要があります。
ジョイスティックの動作座標は以下の図に示されています。
注釈
x座標は左から右へ、範囲は0-4095です。
y座標は上から下へ、範囲は0-4095です。

以下の図に従って回路を構築してください。

プログラミング¶
このスクリプトは、緑の旗がクリックされた時に、 Stars スプライトがステージ上をカーブを描いて動き、ジョイスティックを使って Rocketship を動かし、 Stars スプライトに触れないようにする効果を実現することです。
1. スプライトとバックドロップの追加
デフォルトのスプライトを削除し、 Choose a Sprite ボタンを使用して Rocketship スプライトと Star スプライトを追加します。 Rocket スプライトのサイズは50%に設定されていることに注意してください。

今度は Stars のバックドロップを Choose a Backdrop で追加します。

2. ロケットシップのためのスクリプティング
Rocketship スプライトは、ランダムな位置に現れてからジョイスティックによって上下左右に動かされる効果を実現することです。
ワークフローは以下の通りです。
緑の旗がクリックされたとき、スプライトをランダムな位置に移動させ、2つの変数 x と y を作成します。これらはそれぞれピン33(ジョイスティックのVRX)とピン35(ジョイスティックのVRY)から読み取った値を格納します。スクリプトを実行させ、ジョイスティックを上下左右に動かして、xとyの値の範囲を確認できます。

ピン33の値は0-4095の範囲で(中間は約1800です)。
x-1800>200
を使用して、ジョイスティックが右にトグルされているかを判断し、そうであれば、スプライトのx座標を+30にします(スプライトを右に動かすため)。

ジョイスティックが左にトグルされた場合は、スプライトのx座標を-30にします(スプライトを左に動かします)。

ジョイスティックのy座標は上(0)から下(4095)であり、スプライトのy座標は下から上になります。そのため、ジョイスティックを上に動かし、スプライトも上に動かすためには、スクリプト内でy座標を-30にする必要があります。

ジョイスティックを下にフリックした場合、スプライトのy座標は+30です。

3. 星のためのスクリプティング
Star スプライトが達成する効果は、ランダムな位置に現れ、 Rocketship にぶつかった場合はスクリプトの実行を停止し、ゲームが終了することです。
緑の旗がクリックされてスプライトがランダムな位置に移動したとき、[turn degrees]ブロックは Star スプライトが少し角度を変えて前に進むようにするので、カーブを描いて動いているように見えますし、端に当たったら跳ね返ります。

動いている間にスプライトが Rocketship スプライトに触れた場合、スクリプトの実行を停止します。

2.14 GAME - リンゴを食べる¶
このプロジェクトでは、ボタンを使ってビートルがリンゴを食べるゲームをします。
緑の旗をクリックしたら、ボタンを押してビートルが回転し、再びボタンを押すとビートルがその角度で前進を停止します。ビートルの角度を制御して、地図上の黒線に触れずにリンゴを食べるまで前進させる必要があります。黒線に触れたらゲームオーバーです。

必要な部品¶
このプロジェクトには、以下のコンポーネントが必要です。
全セットを購入するのは非常に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
以下のリンクから別々に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路の構築¶
ボタンは4ピンデバイスで、ボタンが押されると、ピン1がピン2に、ピン3がピン4に接続され、4ピンが接続されて回路が閉じます。

次の図に従って回路を組み立てます。
ボタン左側のピンの一つをピン14に接続し、ピン14はプルダウン抵抗と0.1uF (104) のコンデンサ(ジッタを消去し、ボタンが動作時に安定したレベルを出力するため)に接続されます。
抵抗とコンデンサの他端をGNDに接続し、ボタン右側のピンを5Vに接続します。

プログラミング¶
達成したい効果は、ボタンを使って Beetle スプライトの方向を制御し、 Maze の背景の黒線に触れることなく前進してリンゴを食べ、食べると背景が切り替わることです。
今、関連する背景とスプライトを追加しましょう。
1. 背景とスプライトの追加
Choose a backdrop ボタンから Maze の背景を追加します。

デフォルトのスプライトを削除し、 Beetle スプライトを選択します。

Beetle スプライトを Maze の背景の入口に置き、この時点でのx,y座標値を覚えておき、スプライトのサイズを40%に調整します。

2. 背景の描画
次に、WIN!と表示される背景を描くだけの簡単な作業です。
まず背景サムネイルをクリックして Backdrops ページに移動し、空白のbackdrop1をクリックします。

今から描き始めますが、以下の写真を参考に描くことも、勝利を表現していれば自分で背景を描いても構いません。
Circle ツールを使用して、赤色でアウトラインのない楕円を描きます。
その後、 Text ツールを使って「WIN!」という文字を書き、文字色を黒に設定し、文字のサイズと位置を調整します。
この背景の名前を Win にします。

3. 背景のスクリプト化
ゲームがスタートするたびに、背景を Maze に切り替える必要があります。

4. スプライトビートルのスクリプト作成
次に、ボタンの制御下で Beetle スプライトが前に進み、方向を変えることができるスクリプトを書きます。ワークフローは以下の通りです。
緑の旗がクリックされたら、 Beetle の角度を90に設定し、位置を(-134, -134)に設定します。または、自分で置いた位置の座標値に置き換えてください。変数 flag を作成し、初期値を-1に設定します。

次に、[forever]ブロック内で、さまざまな可能性のあるシナリオを判断するために4つの[if]ブロックを使用します。
ボタンが1(押された)の場合、[mod]ブロックを使用して変数 flag の値を0と1(この押しで0、次の押しで1)との間で切り替えます。

flag=0(このボタン押し)の場合、 Beetle スプライトが時計回りに回転させます。その後、flagが1に等しいか(再びボタンが押されたか)を判断し、等しい場合は Beetle スプライトが前に進みます。それ以外の場合は、引き続き時計回りに回転します。

ビートルスプライトが黒( Maze の背景にある黒い線)に触れた場合、ゲームは終了し、スクリプトの実行が停止します。
注釈
[Touch color]ブロックの色エリアをクリックし、その後スポイトツールを選択してステージ上の黒い線の色を取ります。任意の黒を選んだ場合、この[Touch color]ブロックは機能しません。

ビートルが赤に触れる場合(リンゴの赤色もストローツールで取ります)、背景を Win に切り替え、ゲームが成功し、スクリプトの実行が停止します。

2.15 GAME - フラッピーパロット¶
ここでは超音波モジュールを使ってフラッピーパロットゲームを楽しんでいます。
スクリプト実行後、緑の竹がゆっくりとランダムな高さで右から左へ移動します。超音波モジュールの上に手を置き、手と超音波モジュールとの距離が10未満の場合、パロットは上昇し、それ以外の場合は下降します。 手と超音波モジュールとの距離をコントロールして、パロットが緑の竹(パドル)を避けられるようにしてください。もし触れたら、ゲームオーバーです。

必要な部品¶
このプロジェクトには以下のコンポーネントが必要です。
全キットを購入するのが確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路の構築¶
超音波センサーモジュールは、超音波を使って対象物までの距離を測定する機器です。 2つのプローブがあります。一つは超音波を送信し、もう一つは受信して送受信時間を距離に変換し、装置と障害物との距離を検出します。
以下の図に従って回路を構築してください。

プログラミング¶
目指す効果は、超音波モジュールを使ってスプライト Parrot の飛行高度を制御し、 Paddle スプライトを避けることです。
1. スプライトの追加
デフォルトのスプライトを削除し、 Choose a Sprite ボタンを使用して Parrot スプライトを追加します。そのサイズを50%に設定し、位置を左の中央に移動します。

次に Paddle スプライトを追加し、サイズを150%に設定、角度を180に設定し、初期位置を右上の隅に移動します。

Paddle スプライトの Costumes ページに移動し、アウトラインを削除します。

2. パロットスプライトのスクリプティング
超音波モジュールの検出距離によって飛行高度が決定される飛行中の Parrot スプライトのスクリプトを作成します。
緑の旗がクリックされたら、常に飛行中であるようにコスチュームを0.2秒ごとに切り替えます。

超音波モジュールの値を読み取り、[round]ブロックで四捨五入してから変数 distance に格納します。

超音波検出距離が10cm未満の場合は、y座標を50増やし、 Parrot スプライトが上昇します。それ以外の場合は、y座標の値を40減らし、 Parrot は落下します。

Parrot スプライトが Paddle スプライトに触れると、ゲームが終了し、スクリプトの実行が停止します。

3. パドルスプライトのスクリプティング
ステージ上でランダムに出現する必要がある Paddle スプライトのスクリプトを書きます。
緑の旗がクリックされたら Paddle スプライトを隠し、同時に自分自身のクローンを作成します。[create clone of] ブロックは、コントロールブロックでありスタックブロックです。引数のスプライトのクローンを作成します。実行中のスプライトもクローンすることができ、クローンのクローンを再帰的に作成します。

Paddle がクローンとして提示されると、x座標は220(最も右)であり、y座標はランダム(高さランダム)で-125から125になります。

[repeat]ブロックを使用して、x座標の値をゆっくりと減少させ、 Paddle スプライトのクローンが右から左へゆっくりと移動し、消えるまで見えるようにします。

新しい Paddle スプライトを再クローンし、前のクローンを削除します。

2.16 GAME - ブレイクアウトクローン¶
ここではポテンショメータを使用してブレイクアウトクローンゲームをプレイします。
緑の旗をクリックした後、ポテンショメータを使用してステージ上のパドルを制御し、ボールをキャッチして上に行き、レンガを打つようにします。全てのレンガが消えればゲームに勝利し、ボールをキャッチしなければゲームは失敗します。

必要な部品¶
このプロジェクトには以下のコンポーネントが必要です。
全キットを購入するのが間違いなく便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路の構築¶
ポテンショメータは3端子の抵抗要素で、両側の端子は5VとGNDに接続され、中央の端子はpin35に接続されます。esp32ボードのADCコンバータによる変換後、値の範囲は0-4095です。

プログラミング¶
ステージには3つのスプライトがあります。
1. パドルスプライト
Paddle によって達成されるべき効果は、初期位置がステージの底の中央にあり、ポテンショメータによって左または右に動かすことができます。
デフォルトのスプライトを削除し、 Choose a Sprite ボタンを使用して Paddle スプライトを追加し、そのxとyを(0, -140)に設定します。
Costumes ページに移動し、アウトラインを削除し、色をダークグレーに変更します。
緑の旗がクリックされたときに初期位置を(0, -140)に設定し、pin35(ポテンショメータ)の値を変数 a0 に読み込むように Paddle スプライトをスクリプト化します。 Paddle スプライトはステージ上でx座標-195〜195の間で左右に動きますので、変数 a0 の範囲0〜4095を-195〜195にマップする[map]ブロックを使用する必要があります。
これで、ポテンショメータを回して Paddle がステージ上で左右に動くかどうかを確認できます。
2. ボールスプライト
ボールスプライトの効果は、ステージ上を動き回り、端に触れたら跳ね返り、ステージ上のブロックに触れたら下に跳ね返り、落ちる途中でパドルスプライトに触れたら上に跳ね返ることです。触れなかった場合、スクリプトの実行が停止し、ゲームが終了します。
Ball スプライトを追加します。
緑の旗がクリックされたら、 Ball スプライトの角度を45度に設定し、初期位置を(0, -120)に設定します。
今、 Ball スプライトがステージ上を動き回り、端に触れると跳ね返るようにし、緑の旗をクリックして効果を確認します。
Ball スプライトが Paddle スプライトに触れたときは反射させます。簡単な方法は角度を直接反転させることですが、そうするとボールの軌道が完全に固定されてしまい、つまらなくなってしまいます。そのため、2つのスプライトの中心を計算して、バッフルの中心の反対方向にボールを跳ね返すようにします。
Ball スプライトがステージの端に落ちたら、スクリプトの実行が停止し、ゲームが終了します。
3. ブロック1スプライト
Block1 スプライトは、ステージ上に自身のクローンをランダムな色で4x8生成し、 Ball スプライトに触れたらクローンを削除する効果を持っています。
Block1 スプライトは PictoBlox ライブラリにはないため、自分で描くか既存のスプライトを変更する必要があります。ここでは Button3 スプライトを変更して使用します。
Button3 スプライトを追加した後、 Costumes ページに移動します。まず button-a を削除し、次に button-b の幅と高さを縮小し、スプライト名を Block1 に変更します。以下の画像のように。
注釈
Block1 の幅については、スクリーン上でシミュレートして8つ並べることができるかどうかを確認できます。できなければ適宜幅を縮小してください。
Block1 スプライトを縮小する過程で、スプライトの中心点が中央にあることを保つ必要があります。
まず2つの変数を作成します。 block はブロックの数を、 roll は列の数を格納するためです。
Block1 スプライトのクローンを作成する必要があります。これにより、左から右、上から下にかけて、ランダムな色で合計4x8の一つ一つが表示されます。
スクリプトを書いた後、緑の旗をクリックしてステージ上の表示を見ます。もし密集しすぎていたり小さすぎたりしたら、サイズを変更できます。
トリガーイベントを書きます。クローンされた Block1 スプライトが Ball スプライトに触れたら、クローンを削除し、メッセージ crush を送信します。
Ball スプライトに戻り、放送された crush を受け取ったとき( Ball スプライトが Block1 スプライトのクローンに触れる)、 Ball は反対方向に飛び出します。
2.17 GAME - 釣りゲーム¶
ここではボタンを使った釣りゲームを行います。
スクリプトが実行されると、魚がステージ上を左右に泳ぎます。魚がフックに近づいたとき(長押しを推奨)ボタンを押して魚を捕まえ、捕まえた魚の数は自動的に記録されます。

必要な部品¶
このプロジェクトには以下のコンポーネントが必要です。
全キットを購入するのが確実に便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路の構築¶
ボタンは4ピンデバイスで、ピン1がピン2に、ピン3がピン4に接続されており、ボタンを押すと4つのピンが接続され、回路が閉じます。

以下の図に従って回路を構築してください。
ボタンの左側のピンの一つをピン14に接続し、プルダウン抵抗と0.1uF(104)キャパシタ(ボタン作動時にジッタを消去し、安定したレベルを出力するため)に接続します。
抵抗とキャパシタのもう一方の端をGNDに、ボタンの右側のピンの一つを5Vに接続します。

プログラミング¶
まず Underwater の背景を選択し、 Fish スプライトを追加してステージ上で行き来させます。次に Fishhook スプライトを描き、ボタンで制御して釣りを始めます。 Fish スプライトがフック状態(赤色に変わる)で Fishhook スプライトに触れると、フックされます。
1. 背景の追加
Choose a Backdrop ボタンを使って Underwater の背景を追加します。

2. フィッシュフックスプライト
Fishhook スプライトは通常、黄色い状態で水中に留まります。ボタンが押されると、釣り状態(赤)になり、ステージ上に移動します。
Pictobloxには Fishhook スプライトがないため、 Glow-J スプライトを修正してフィッシュフックのように見せることができます。
Choose a Sprite から Glow-J スプライトを追加します。

今、 Glow-J スプライトの Costumes ページに移動し、画面のシアンの塗りを選択して削除します。次に、Jの色を赤に変更し、幅を縮小します。最も重要な点は、その上部がちょうど中心点にあるようにする必要があります。

Line tool を使用して、中心点から上にできるだけ長い線を引きます(ステージ外の線)。スプライトを描いたら、スプライト名を Fishhook に設定し、適切な位置に移動します。

緑の旗がクリックされたら、スプライトの色効果を30(黄色)に設定し、初期位置を設定します。

ボタンが押されたら、色効果を0(赤、釣り状態を開始)に設定し、0.1秒待ってから Fishhook スプライトをステージの上部に移動します。ボタンを離して Fishhook を初期位置に戻します。

3. 魚スプライト
Fish スプライトが達成する効果は、ステージ上を左右に移動し、釣り状態の Fishhook スプライトに遭遇すると、縮小して特定の位置に移動してから消え、その後新しい fish スプライトをクローンします。
今、 fish スプライトを追加し、そのサイズと位置を調整します。

score 変数を作成して捕まえた魚の数を格納し、このスプライトを隠してクローンします。

fish スプライトのクローンを表示し、コスチュームを切り替えて最終的に初期位置を設定します。

fish スプライトのクローンが左右に動き、端に触れると跳ね返ります。

fish スプライトのクローンは、 Fishhook スプライトを通過する際に反応しません。釣り状態(赤に変わる)の Fishhook スプライトに触れると、捕まえられ、その時点でスコア(変数score)+1となり、スコアアニメーションも表示されます(40%縮小し、速やかにスコアボードの位置に移動して消えます)。同時に新しい魚が作成され(新しい魚スプライトのクローン)、ゲームは続きます。
注釈
[Touch color]ブロック内の色領域をクリックし、ステージ上の Fishhook スプライトの赤色をピペットツールで選択する必要があります。任意の色を選んだ場合、この[Touch color]ブロックは機能しません。

2.18 GAME - 白いタイルを踏まないで¶
多くの人が携帯電話でこのゲームをプレイしたことがあるでしょう。このゲームは、ランダムに現れる黒をタップしてポイントを追加し、スピードがどんどん速くなります。白いブロックをタップしたり、黒いブロックを逃したりするとゲームオーバーです。
今、PictoBloxを使ってこれを再現しましょう。
ブレッドボードに2つのIR障害物回避モジュールを縦に挿入します。手をIRモジュールの上に置くと、ステージ上に点滅する点が現れ、タップが行われたことを表します。
黒いブロックにタップするとスコアが1増え、白いブロックに触れるとスコアが1減ります。
ステージ上の黒いブロックの位置に応じて、左のIRモジュールの上に手を置くか、右のIRモジュールの上に手を置くかを決める必要があります。

必要な部品¶
このプロジェクトには以下のコンポーネントが必要です。
全キットを購入することは確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路の構築¶
障害物回避モジュールは距離調整可能な赤外線近接センサーで、通常は出力が高く、障害物が検出されると低くなります。
以下の図に従って回路を構築してください。

プログラミング¶
ここでは、 Tile、 Left IR、 Right IR の3つのスプライトが必要です。
Tile スプライト:黒と白のタイルが交互に下に移動する効果を実現するために使用され、携帯電話のこのゲームは一般的に4列ですが、ここでは2列だけを行います。
Left IR スプライト:クリック効果を実現するために使用され、左IRモジュールが手を感知すると、 left のメッセージを Left IR スプライトに送信し、動作を開始させます。ステージ上の黒いタイルに触れるとスコアが1増え、そうでない場合は1減ります。
Right IR スプライト:基本的な機能は Left IR と同じですが、 Right の情報を受け取ります。
1. タイルスプライトを描く。
デフォルトのスプライトを削除し、 Add Sprite アイコンにマウスを移動し、 Paint を選択すると、空のスプライトが表示されますので、それを Tile と名付けます。

Costumes ページに移動し、 Rectangle ツールを使用して長方形を描きます。

長方形を選択し、 Copy -> Paste をクリックして同じ長方形を作り、2つの長方形をフラッシュ位置に移動します。

長方形の一つを選択し、塗りつぶしの色を黒に設定します。

次に、両方の長方形を選択し、キャンバスの中心に中心点が合うように移動します。

costume1を複製し、2つの長方形の塗りつぶしの色を交互にします。たとえば、costume1は左が白で右が黒、costume2は左が黒で右が白です。

2. タイルスプライトのスクリプト
Blocks ページに戻り、 Tile スプライトの初期位置を設定し、ステージの上部にありますようにします。

変数 - blocks を作成し、初期値を与えて Tile スプライトが現れる回数を決定します。[repeat until] ブロックを使用し、変数 blocks が0になるまで徐々に減少させます。この間、スプライト Tile にランダムにコスチュームを切り替えさせます。
緑の旗をクリックすると、ステージ上の Tile スプライトが素早くコスチュームを切り替えるのが見られます。

変数 blocks が減少している間、 Tile スプライトのクローンを作成し、blocksが0になったらスクリプトの実行を停止します。ここでは二つの [wait () seconds] ブロックを使用しています。一つ目は Tile のクローン間の間隔を制限し、二つ目はプログラムをすぐに停止せずに変数 blocksを0に減少させるためです。これにより、最後のタイルスプライトが動くのに十分な時間が与えられます。

今度は Tile スプライトのクローンがゆっくり下に移動し、ステージの底に到達したら削除するスクリプトを作ります。y座標の変化が落下速度に影響します。値が大きいほど落下速度が速くなります。

本体を隠し、クローンを表示します。

3. 2つのIRモジュールの値を読む
背景で2つのIRモジュールの値を読み、対応するアクションを行います。
左のIR障害物回避モジュールが手を感知したら、メッセージ - left を送信します。
左のIR回避モジュールが手を感知したら、メッセージ - right を送信します。

4. 左IRスプライト
再び、 Add sprite アイコンにマウスを移動し、 Paint を選択して Left IR という新しいスプライトを作成します。

Left IR スプライトの Costumes ページに移動し、塗りつぶしの色(黒と白以外の任意の色)を選択し、円を描きます。

今、 Left IR スプライトのスクリプトを開始します。メッセージ - left が受け取られたとき(左のIR受信モジュールが障害物を検出)、 Tile スプライトの黒いブロックに触れているかを判断し、もし触れていたら変数 count に1を加え、そうでなければ1を減らします。

注釈
Tile スプライトがステージ上に現れるようにし、その後で Tile スプライトの黒いブロックの色を吸収する必要があります。

今度は Left IR に感知効果(ズームインとアウト)を行いましょう。

緑の旗がクリックされたら Left IR スプライトを隠し、メッセージ - left が受け取られたら表示し、最後に再び隠します。

5. 右IRスプライト
Left IR スプライトをコピーし、 Right IR に名前を変更します。

そして、受信するメッセージを - right に変更します。

これで全てのスクリプトが終わり、緑の旗をクリックしてスクリプトを実行できます。
2.19 GAME - 心臓を守れ¶
このプロジェクトでは、反応速度をテストするゲームを作りましょう。
ステージには、矩形のボックスで守られた心臓があり、ステージの任意の位置からこの心臓に向かって矢が飛んできます。矢の色はランダムに黒と白が交互に変わり、矢はどんどん速くなります。
矩形ボックスの色と矢の色が同じ場合は、矢は外側でブロックされ、レベルが1加算されます。色が同じでない場合は、矢が心臓を射抜き、ゲームオーバーになります。
ここで矩形ボックスの色は、ライン追跡モジュールによって制御されます。モジュールが黒い面(反射する面)に置かれている場合、矩形ボックスの色は黒になり、それ以外の場合は白になります。
ですので、矢の色に応じてライン追跡モジュールを白い面に置くか黒い面に置くかを決める必要があります。

必要な部品¶
このプロジェクトには以下のコンポーネントが必要です。
全キットを購入するのが間違いなく便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路の構築¶
これはデジタルライン追跡モジュールで、黒い線を検出すると1を出力し、白い線を検出すると0の値を出力します。さらに、モジュール上のポテンショメータを調整して、その感知距離を調整できます。
以下の図に従って回路を構築してください。

注釈
プロジェクトを始める前に、モジュールの感度を調整する必要があります。
上記の図に従って配線をし、R3ボードに電源を入れます(USBケーブルを直接差し込むか、9Vバッテリーボタンケーブルを使用)。コードをアップロードすることなく。
今、デスクトップに黒い電気テープを貼り、ライントラックモジュールをデスクトップから2cmの高さに置きます。
センサーを下向きにして、モジュールの信号LEDが白いテーブル上で点灯し、黒いテープ上で消灯することを確認します。
もしそうでない場合は、モジュール上のポテンショメータを調整して、上記の効果が得られるようにする必要があります。
プログラミング¶
ここでは3つのスプライト、 Heart、 Square Box、 Arrow1 を作成する必要があります。
Heart:ステージの中央に停止しており、 Arrow1 スプライトに触れられたらゲームオーバーです。
Square Box:黒と白の2種類のコスチュームがあり、ライントラッキングモジュールの値に応じてコスチュームを切り替えます。
Arrow:黒/白の任意の位置からステージの中央に向かって飛行します。 その色が Square Box スプライトの色と一致する場合、ブロックされ、ランダムな位置からステージの中央に向かって再飛行します。 その色が Square Box スプライトの色と一致しない場合、 Heart スプライトを通過し、ゲームが終了します。
1. スクエアボックススプライトを追加
アロー1とスクエアボックススプライトはどちらも白いコスチュームを持っているため、ステージ上に表示されるようにするには、黒、白、赤以外の任意の色で背景を塗ります。
Backdrop1 をクリックして Backdrops ページに移動します。
塗りつぶしたい色を選択します。
Rectangle を使って描画ボードと同じサイズの長方形を描きます。

デフォルトのスプライトを削除し、 Choose a Sprite ボタンを使用して Square Box スプライトを追加し、そのxとyを(0, 0)に設定します。

Square Box スプライトの Costumes ページに移動し、黒と白のコスチュームを設定します。
選択ツールをクリックします
キャンバス上の長方形を選択します
塗りつぶしの色を黒に設定します
そしてコスチュームの名前を Black にします

2番目のコスチュームを選択し、塗りつぶしの色を白に設定し、名前をホワイトにして、残りのコスチュームを削除します。

2. ハートスプライトを追加
Heart スプライトも追加し、その位置を(0, 0)に設定し、サイズを縮小してスクエアボックスの中に位置するように見えるようにします。

Costumes ページで、ハートの紫色のコスチュームを調整して、壊れたように見えるようにします。

3. アロー1スプライトを追加
Arrow1 スプライトを追加します。

Costumes ページで、右向きのコスチュームを保持してコピーし、その色を黒と白に設定します。

4. スクエアボックススプライトのスクリプト
Blocks ページに戻り、 Square Box スプライトのスクリプトを作成します。
デジタルピン2(ラインフォローイングモジュール)の値が1(黒い線が検出された)の場合、コスチュームを Black に切り替えます。
そうでなければ、コスチュームを White に切り替えます。

5. ハートスプライトのスクリプト
Heart スプライトは Square Box の内側に保護されており、デフォルトは赤いコスチュームです。アロー1スプライトに触れると、ゲームが終了します。

6. アロー1スプライトのスクリプト
緑の旗がクリックされたときに Arrow1 スプライトを隠し、クローンを作成します。

[init] ブロックを作成して、 Arrow1 スプライトの位置、方向、色を初期化します。
ランダムな位置に現れ、それと Heart スプライトとの距離が200未満の場合は外側に移動し、距離が200以上になるまで続けます。

その方向を Heart スプライトに向けます。

その色を黒/白の間でランダムに交互に変えます。
変数colorが0の場合、コスチュームを White に切り替えます。
変数colorが1の場合、コスチュームを Black に切り替えます。

今、動き始めさせます。変数 level の値が増えるにつれて、速く移動します。

今、 Square Box スプライトとの衝突効果を設定します。
Arrow1 スプライトと Square Box スプライトの色が同じ場合(ライントラックモジュールの値によって変更されます)、黒または白であれば、新しいクローンが作成され、ゲームが続きます。
色が一致しない場合、 Arrow1 スプライトは移動を続け、 Heart スプライトに当たるとゲームが終了します。

注釈
二つの[touch color()]ブロックは、それぞれスクエアボックスの黒/白のコスチュームを選択する必要があります。

2.20 GAME - ドラゴン討伐¶
ここではジョイスティックを使用してドラゴン討伐ゲームを楽しみます。
緑のフラグをクリックすると、ドラゴンは右側で上下に浮かび、断続的に火を吹きます。ジョイスティックを使って魔法の杖の動きを制御し、ドラゴンに星の攻撃を発射しながら、それが放つ炎を避けて、最終的に倒す必要があります。

必要な部品¶
このプロジェクトには以下のコンポーネントが必要です。
全キットを購入することは確かに便利です。こちらがリンクです:
名前 |
このキットのアイテム |
リンク |
---|---|---|
ESP32 Starter Kit |
320+ |
また、以下のリンクから個別に購入することもできます。
コンポーネントの紹介 |
購入リンク |
---|---|
- |
|
回路の構築¶
ジョイスティックは、基部でピボットするスティックからなる入力装置であり、その角度や方向を制御しているデバイスに報告します。ジョイスティックはしばしばビデオゲームやロボットの制御に使われます。
コンピュータに完全な動きを伝えるために、ジョイスティックは2つの軸 - X軸(左右)とY軸(上下)のスティックの位置を測定する必要があります。
ジョイスティックの動きの座標は、以下の図に示されています。
注釈
x座標は左から右へ、範囲は0-1023です。
y座標は上から下へ、範囲は0-1023です。

以下の図に従って回路を構築してください。

プログラミング¶
1. ドラゴン
Choose a Backdrop ボタンを使用して Woods 背景を追加しました。

デフォルトのスプライトを削除し、 Dragon スプライトを追加します。

Costumes ページに移動し、dragon-bとdragon-cを水平に反転させます。

サイズを50%に設定します。

次に変数 - dragon を作成してドラゴンのライフポイントを記録し、初期値を50に設定します。

次に、スプライトのコスチュームを dragon-b に切り替えて、 Dragon スプライトが範囲内で上下に動くようにします。

Lightning スプライトを Dragon スプライトが吹き出す火として追加します。コスチュームページで90°時計回りに回転させる必要があります。これは Lightning スプライトが正しい方向に移動するためです。
注釈
Lightning スプライトのコスチュームを調整する際、中心から外れることがありますが、これは避けるべきです!中心点はスプライトの真ん中になければなりません!

次に、 Dragon スプライトの dragon-c コスチュームを調整して、その中心点が火の尾部になるようにします。これにより、 Dragon スプライトと Lightning スプライトの位置が正しくなり、 Lightning がドラゴンの足元から発射されるのを防ぎます。

対応する dragon-b では、ドラゴンの頭が中心点と一致するようにする必要があります。

Lightning スプライトのサイズと方向を調整して、画像がより調和するようにします。

今度は Lightning スプライトをスクリプトします。これは簡単で、常に Dragon スプライトに追従させるだけです。この時点で緑の旗をクリックすると、口に雷を咥えた Dragon が動き回るのを見ることができます。

Dragon スプライトに戻り、今度は火を吹き出させます。口の中の火が発射されないように注意し、 Lightning スプライトのクローンを作成します。

Lightning スプライトをクリックし、 Lightning のクローンがランダムな角度で発射されるようにします。壁から跳ね返って一定時間後に消えます。

Lightning スプライトでは、本体を隠し、クローンを表示します。

これでドラゴンは上下に動き、火を吹き出すことができます。
2.魔法の杖
Wand スプライトを作り、向きを180度に設定して右を指すようにします。

次に、その生命値を記録する変数 hp を作成し、初期値を3に設定します。そして、ジョイスティックの値を読み取り、杖の動きを制御するのに使用します。

ドラゴンには雷があり、それを打ち砕く杖には「魔法の弾丸」があります! Star スプライトを作成し、サイズを変更し、常に Wand スプライトに追従するようにスクリプトを書き、星の数を三つに制限します。

Wand スプライトが自動的に星を撃つようにします。 Wand スプライトは、クローンを作成することで、ドラゴンが火を吹くのと同じ方法で星を撃ちます。

Star スプライトに戻り、そのクローンが回転して右に向かって撃ち、ステージを越えたら消え、星の数を復元するようにスクリプトします。 Lightning スプライトと同じように、本体を隠してクローンを表示します。

これで、星弾を撃つ杖ができました。
3. 戦い!
現在、杖とドラゴンはまだ互いに対立していますが、彼らを戦わせることにします。ドラゴンは強く、杖はドラゴンに対抗する勇敢な男です。彼らの間の相互作用は以下の部分から成り立っています。
杖がドラゴンに触れると、弾き飛ばされて生命点を失います。
雷が杖に当たると、杖は生命点を失います。
星の弾丸がドラゴンに当たると、ドラゴンは生命点を失います。
これが整理されたら、各スプライトのスクリプトを変更しましょう。
Wand が Dragon に当たると、弾き飛ばされて生命点を失います。

Lightning ( Lightning スプライトのクローン)が Wand スプライトに当たると、ポップ音を出して消え、 Wand は生命点を失います。

Star ( Star スプライトのクローン)が Dragon に当たると、集音音を出して消え、 Star の数を復元し、 Dragon は生命点を失います。

4. ステージ
Wand と Dragon の戦いは最終的に勝者と敗者に分かれますが、それをステージで表現します。
Blue Sky の背景を追加し、「WIN!」という文字を書いて、ドラゴンが倒され、夜明けが来たことを表します。

そして、以下のように空白の背景を変更して、ゲームに失敗し、すべてが暗闇に包まれることを表します。

これらの背景を切り替えるスクリプトを書きます。緑の旗がクリックされたときに Woods の背景に切り替えます。ドラゴンの生命点が1未満の場合、ゲームに成功し、背景を Blue Sky に切り替えます。 Wand の生命値が1未満の場合は、背景を Night に切り替えてゲームに失敗します。

キットのコンポーネントについて学ぶ¶
パッケージを開封した後、部品の数量が製品の説明と一致しているか、そしてすべての部品が良好な状態であるか確認してください。

以下は各部品の紹介です。これには、部品の動作原理と対応するプロジェクトが含まれています。
制御ボード
ESP32 WROOM 32E¶
ESP32 WROOM-32Eは、EspressifのESP32チップセットを中心に構築された多機能で高性能なモジュールです。デュアルコア処理、統合されたWi-FiとBluetooth接続を提供し、多くの周辺インターフェイスを誇ります。低電力消費で知られるこのモジュールは、IoTアプリケーションに理想的で、コンパクトな形状でのスマートな接続と堅牢な性能を実現します。

主な特徴は以下の通りです:
処理能力:デュアルコアのXtensa® 32-bit LX6マイクロプロセッサを搭載し、スケーラビリティと柔軟性を提供します。
ワイヤレス機能:統合された2.4 GHz Wi-FiとデュアルモードBluetoothにより、安定した無線通信を要求するアプリケーションに最適です。
メモリ&ストレージ:十分なSRAMと高性能のフラッシュストレージを備えており、ユーザープログラムとデータの保存ニーズに対応します。
GPIO:最大34のGPIOピンを提供し、さまざまな外部デバイスやセンサーをサポートします。
低電力消費:複数の省電力モードが利用可能で、バッテリー駆動またはエネルギー効率の良いシナリオに最適です。
セキュリティ:統合された暗号化およびセキュリティ機能により、ユーザーデータとプライバシーがしっかりと保護されます。
多機能性:シンプルな家電から複雑な産業機械まで、WROOM-32Eは一貫した効率的な性能を提供します。
要するに、ESP32 WROOM-32Eは、堅牢な処理能力と多様な接続オプションを提供するだけでなく、IoTやスマートデバイス分野での選択肢としての特長を誇っています。
ピンアウト図¶
ESP32には、いくつかの機能が特定のピンを共有するためのピン使用制限があります。プロジェクトを設計する際、正しく機能するように、また問題を避けるためにピン使用を慎重に計画し、潜在的な競合を確認することが良い方法です。

主な制限と考慮事項は以下のとおりです:
ADC1およびADC2:WiFiまたはBluetoothがアクティブの場合、ADC2は使用できません。ただし、ADC1は制限なしに使用できます。
ブートストラッピングピン:GPIO0、GPIO2、GPIO5、GPIO12、およびGPIO15は、ブートプロセス中のブートストラッピングに使用されます。これらのピンにブートプロセスに干渉する可能性のある外部コンポーネントを接続しないよう注意する必要があります。
JTAGピン:GPIO12、GPIO13、GPIO14、およびGPIO15は、デバッグのためのJTAGピンとして使用できます。JTAGデバッグが不要な場合、これらのピンは通常のGPIOとして使用できます。
タッチピン:一部のピンはタッチ機能をサポートします。タッチセンシングのためにこれらのピンを使用する予定の場合、慎重に使用する必要があります。
電源ピン:一部のピンは電源関連の機能のために予約されており、それに応じて使用する必要があります。例えば、3V3やGNDのような電源供給ピンから過度な電流を引き出さないよう注意する必要があります。
入力専用ピン:一部のピンは入力専用であり、出力として使用するべきではありません。
ストラッピングピン¶
ESP32には5つのストラッピングピンがあります:
ストラッピングピン |
説明 |
---|---|
IO5 |
デフォルトでプルアップされ、IO5とIO15の電圧レベルがSDIOスレーブのタイミングに影響します。 |
IO0 |
デフォルトでプルアップされ、ローに引っ張られるとダウンロードモードに入ります。 |
IO2 |
デフォルトでプルダウンされ、IO0とIO2はESP32をダウンロードモードにします。 |
IO12(MTDI) |
デフォルトでプルダウンされ、ハイに引っ張られると、ESP32は正常に起動しなくなります。 |
IO15(MTDO) |
デフォルトでプルアップされ、ローに引っ張られると、デバッグログが表示されなくなります。さらに、IO5とIO15の電圧レベルがSDIOスレーブのタイミングに影響します。 |
ソフトウェアは、レジスタ"GPIO_STRAPPING"からこれら5つのビットの値を読み取ることができます。 チップのシステムリセットが解放される際(電源オンリセット、RTCウォッチドッグリセット、ブラウンアウトリセット)、 ストラッピングピンのラッチは電圧レベルを"0"または"1"のストラッピングビットとしてサンプルし、チップが 電源オフまたはシャットダウンされるまでこれらのビットを保持します。ストラッピングビットはデバイスのブートモード、 VDD_SDIOの動作電圧、およびその他の初期システム設定を設定します。
各ストラッピングピンは、チップリセット中にその内部のプルアップ/プルダウンに接続されています。その結果、 ストラッピングピンが未接続であるか、接続された外部回路が高インピーダンスの場合、内部の弱いプルアップ/プルダウンが ストラッピングピンのデフォルトの入力レベルを決定します。
ストラッピングビットの値を変更するには、外部のプルダウン/プルアップ抵抗を適用するか、ESP32の電源を入れるときにホストMCUのGPIOを使用してこれらのピンの電圧レベルを制御することができます。
リセット解放後、ストラッピングピンは通常の機能ピンとして動作します。 ストラッピングピンによる詳細なブートモードの設定については、以下の表を参照してください。

FE:フォーリングエッジ、RE:ライジングエッジ
ブート後、ファームウェアはレジスタビットを設定して、「内部LDOの電圧(VDD_SDIO)」および「SDIOスレーブのタイミング」の設定を変更することができます。
このモジュールは3.3VのSPIフラッシュを統合しているため、モジュールの電源が入っているときに、MTDIピンを1に設定することはできません。
ESP32カメラ拡張ボード¶
ESP32 WROOM 32EのカメラとSDカード機能を最大限に活用できる拡張ボードを設計しました。OV2640カメラ、Micro SD、およびESP32 WROOM 32Eを組み合わせることで、オールインワンの拡張ボードが得られます。
このボードは、2種類のGPIOヘッダーを提供しています。一つは、素早いプロトタイピングプロジェクトに最適なメスヘッダー付き。もう一つはネジ端子を備えており、安定したワイヤ接続が可能で、IoTプロジェクトに適しています。
さらに、プロジェクトは単一の3.7V 18650バッテリーで電源を供給することができます。バッテリーの残量が少なくなった場合は、5VのMicro USBケーブルを接続するだけで充電することができます。これにより、屋外プロジェクトやリモートアプリケーションに最適なツールとなります。

インターフェースの紹介¶

- 電源スイッチ
バッテリーの電源供給を制御し、オン/オフを切り替えます。
- 充電ポート
5VのMicro USBケーブルを接続すると、バッテリーを充電できます。
- バッテリーポート
PH2.0-2Pインターフェースを採用し、3.7V 18650リチウムバッテリーと互換性があります。
ESP32 WROOM 32EとESP32カメラ拡張の両方に電源を供給します。
- ESP32ピンヘッダー
ESP32 WROOM 32Eモジュール専用。向きに注意し、Micro USBポートが同じ側を向いていることを確認して、誤った配置を避けてください。
- GPIOヘッダー
メスヘッダー: ESP32にさまざまなコンポーネントを接続するためのもので、迅速なプロトタイピングプロジェクトに適しています。
ネジ端子: 3.5mmピッチ14pinネジ端子を採用しており、安定したワイヤ接続が可能で、IoTプロジェクトに適しています。
- インジケーターライト
PWR: バッテリーが電源供給されているか、Micro USBがESP32に直接接続されているときに点灯します。
CHG: Micro USBをボードの充電ポートに接続すると点灯し、充電が開始されたことを示します。バッテリーが完全に充電されると、消灯します。
- Micro SDコネクタ
Micro SDカードの簡単な挿入と取り出しのためのバネ式スロット。
- 24ピン 0.5mm FFC/FPCコネクタ
OV2640カメラ専用で、さまざまなビジョン関連のプロジェクトに適しています。
ESP32カメラ拡張ボードのピン配置¶
ESP32 WROOM 32Eのピン配置図は、 ピンアウト図 にあります。
しかし、ESP32 WROOM 32Eを拡張ボードに挿入すると、そのピンの一部はMicro SDカードやカメラを駆動するためにも使用されることがあります。
その結果、これらのピンにはプルアップまたはプルダウン抵抗が追加されています。これらのピンを入力として使用する場合、入力レベルに影響を与える可能性があるため、これらの抵抗を考慮することが重要です。
右側のピンのピン配置表は次のとおりです:
左側のピンのピン配置表は次のとおりです:
インターフェース挿入ガイド¶
コードのアップロード
Micro SDカードの挿入
カメラの接続
カメラを接続するとき、FPCケーブルの黒いストライプが上向きで、コネクタに完全に挿入されていることを確認してください。
バッテリーの電源と充電
基本
ブレッドボード¶
「はんだ不要」ブレッドボードとは?

ブレッドボードは、多くの小さな穴がある長方形のプラスチック板です。これらの小さな穴により、電子部品を簡単に挿入して回路を組むことができます。技術的には、これらのブレッドボードは接続を作るのにはんだ付けが不要なため、「はんだ不要」ブレッドボードとして知られています。
特徴
サイズ: 163 x 54 x 8 mm
830接点のブレッドボード: 630接点のIC回路エリアと、4つの電源レールを提供する2x100接点の分配ストリップ。
ワイヤーサイズ: 20-29 AWGのワイヤーに適しています。
材料: ABSプラスチックパネル、錫メッキリン青銅コンタクトシート。
電圧/電流: 300V/3-5A。
裏面に自己粘着テープ付き
ブレッドボードの中には何がありますか?

ブレッドボードの内部は小さな金属クリップの列で構成されています。ブレッドボードの穴に部品のリードを挿入すると、そのクリップの1つがそれをキャッチします。透明なプラスチックで作られているブレッドボードもあり、内部のクリップを見ることができます。
ブレッドボード上の文字や数字は何を意味しますか?

ほとんどのブレッドボードには、数字、文字、プラス記号、マイナス記号があります。ラベルはブレッドボードによって異なりますが、機能は基本的に同じです。これらのラベルにより、回路を組み立てる際に、対応する穴をより迅速に見つけることができます。
行番号と列の文字は、ブレッドボード上の穴の正確な位置を特定するのに役立ちます。例えば、穴「C12」は、列Cと行12が交差する位置にあります。
色付きの線やプラス記号、マイナス記号は何を意味しますか?

ブレッドボードの両側は、通常、赤と青(またはその他の色)で区別され、プラス記号とマイナス記号があり、電源供給に接続するために使用されることが多く、これは電源バスとして知られています。
回路を組む際、マイナス端子を青色の(-)列に、プラス端子を赤色の(+)列に接続することが一般的です。
穴はどのように接続されていますか?

図に示されているように、中央部の各5つの穴のセット、列A-EまたはF-Jは電気的に接続されています。これは、例えば、穴A1が穴B1、C1、D1、E1に電気的に接続されていることを意味します。
それは穴A2には接続されていません。なぜなら、その穴は異なる行にあり、別の金属クリップのセットがあるからです。また、F1、G1、H1、I1、J1の穴にも接続されていません。なぜなら、それらはブレッドボードの「もう一方の半分」に位置しており、中央の隙間を挟んでクリップは接続されていないからです。
中央部は5つの穴でグループ化されているのに対し、側面のバスはそれぞれ別々に電気的に接続されています。例えば、青(-)でマークされた列は全体として電気的に接続されており、赤(+)でマークされた列も同様に電気的に接続されています。
どの電子部品がブレッドボードと互換性がありますか?

多くの電子部品は、リードと呼ばれる長い金属の脚を持っています。リードを持つほぼすべての部品はブレッドボードで使用することができます。抵抗器、コンデンサ、スイッチ、ダイオードなどの部品は、任意の行に挿入できますが、ICは中央の隙間を跨いで配置する必要があります。
抵抗器¶

抵抗器は、分岐電流を制限することができる電子要素です。 固定抵抗器は、抵抗値を変更できないタイプの抵抗器ですが、ポテンショメーターや可変抵抗器は調整が可能です。
抵抗器の一般的な回路記号は2つあります。通常、抵抗の値はそれに記されています。ですので、これらの記号が回路内にあれば、それは抵抗器を意味します。

Ω は抵抗の単位で、大きな単位として KΩ、MΩ などがあります。 これらの関係は次のように示されます:1 MΩ = 1000 KΩ、1 KΩ = 1000 Ω。通常、抵抗の値はそれに記されています。
抵抗器を使用する際、まずその抵抗値を知る必要があります。2つの方法があります:抵抗器のバンドを観察するか、マルチメーターを使用して抵抗を測定します。第一の方法の方が便利で速いので、推奨されます。

カードに示されているように、各色は特定の数値を示します。
黒 |
茶 |
赤 |
オレンジ |
黄 |
緑 |
青 |
紫 |
灰 |
白 |
金 |
銀 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
0.1 |
0.01 |
4バンドおよび5バンドの抵抗器がよく使用され、それぞれ4つまたは5つの色バンドがあります。
通常、抵抗器を手に取ったとき、色を読むための開始端を決定するのは難しいことがあります。 ポイントは、第4バンドと第5バンドの間の間隔が比較的大きいことです。
したがって、抵抗器の片端にある2つの色バンドの間のギャップを観察することができます。 他の任意のバンドのギャップよりも大きい場合、反対側から読むことができます。
以下に示されている5バンドの抵抗器の抵抗値の読み取り方を見てみましょう。

この抵抗器の場合、抵抗は左から右に読む必要があります。 値は次のフォーマットであるべきです:1st Band 2nd Band 3rd Band x 10^Multiplier (Ω) そして許容誤差は ±Tolerance%です。 したがって、この抵抗器の抵抗値は 2(赤) 2(赤) 0(黒) x 10^0(黒) Ω = 220 Ωであり、許容誤差は± 1% (茶) です。
詳しくはWikipediaで抵抗器について学べます:抵抗器 - Wikipedia。
コンデンサー¶


コンデンサーは、特定の電位差下での電荷の蓄積量を指し、Cとして示され、国際単位はファラッド(F)です。 一般的に、電荷は電場内で力のもとに移動します。導体の間に媒体が存在すると、電荷の移動が妨げられ、電荷が導体に蓄積します、これが電荷の蓄積をもたらします。
蓄積される電荷の量を容量と言います。コンデンサーは、電子機器で最も広く使用される電子部品の一つであり、直流隔離、結合、バイパス、フィルタリング、チューニングループ、エネルギー変換、および制御回路に広く使用されています。コンデンサーは、電解コンデンサー、固体コンデンサーなどに分けられます。
材料の特性に基づいて、コンデンサーは以下のように分けられます:アルミ電解コンデンサー、フィルムコンデンサー、タンタルコンデンサー、セラミックコンデンサー、スーパーコンデンサーなど。
このキットには、セラミックコンデンサーと電解コンデンサーが使用されています。
セラミックコンデンサーには103または104のラベルがあり、これらは容量値を示しており、103=10x10^3pF、104=10x10^4pFです。
単位の変換
1F=10^3mF=10^6μF=10^9nF=10^12pF
ジャンパーワイヤ¶
二つの端子を接続するワイヤーはジャンパーワイヤと呼ばれます。さまざまな種類のジャンパーワイヤがありますが、ここではブレッドボードで使用されるものに焦点を当てます。ブレッドボードの任意の場所からマイクロコントローラーの入出力ピンに電気信号を伝送するために使用されます。
ジャンプワイヤは、その"エンドコネクタ"をブレッドボードに提供されるスロットに挿入することで取り付けられます。ブレッドボードの表面の下には、行または列のグループでスロットを接続するいくつかの並行するプレートのセットがあります。この"エンドコネクタ"は、特定のプロトタイプで接続する必要がある特定のスロットに、はんだ付けせずにブレッドボードに挿入されます。
ジャンパーワイヤには3つのタイプがあります:メス-メス、オス-オス、およびオス-メス。オス-メスと呼ぶのは、一方の端に突出した先端と沈んだメスの端があるからです。オス-オスは両方の側面がオスで、メス-メスは両端がメスであることを意味します。

プロジェクトには、複数のタイプのものが使用される場合があります。ジャンプワイヤの色は異なりますが、その機能がそれに応じて異なることを意味するわけではありません。それは各回路間の接続をより良く識別するために設計されています。
トランジスタ¶

トランジスタは、電流によって電流を制御する半導体デバイスです。微弱な信号を大きな振幅の信号に増幅する機能を持ち、非接触スイッチとしても使用されます。
トランジスタは、P型およびN型の半導体から成る3層の構造です。これらは内部で三つの領域を形成しています。中央の薄い部分がベース領域、残りの2つ(どちらもN型またはP型)のうち、多数キャリアが集中している小さい方がエミッタ領域、もう一方がコレクタ領域です。この構成により、トランジスタは増幅器として動作します。 これら3つの領域からは、それぞれベース(b)、エミッタ(e)、コレクタ(c)の三つの極が生成されます。これらは2つのP-N接合、すなわち、エミッタ接合およびコレクタ接合を形成します。トランジスタの回路記号の矢印の方向は、エミッタ接合の方向を示しています。
半導体の種類に基づいて、トランジスタはNPN型とPNP型の2つのグループに分けられます。略語から、前者は2つのN型半導体と1つのP型でできており、後者はその逆であることがわかります。以下の図を参照してください。
注釈
s8550はPNP型のトランジスタで、s8050はNPN型です。外見は非常に似ているため、ラベルをよく確認する必要があります。

高レベルの信号がNPNトランジスタを通過すると、それは励起されます。しかし、PNP型は低レベルの信号が必要です。両方のタイプのトランジスタは、この実験のように非接触スイッチとして頻繁に使用されます。
ラベル面を自分に向けて、ピンを下にして置きます。左から右に、エミッタ(e)、ベース(b)、コレクタ(c)の順になります。

注釈
ベースは、より大きな電気供給のためのゲートコントローラデバイスです。
NPNトランジスタでは、コレクタが大きな電気供給で、エミッタがその供給の出口です。PNPトランジスタはその逆です。
例
5.6 トランジスタの二種類 (Arduinoプロジェクト)
3.1 ビープ音 (Arduinoプロジェクト)
6.1 フルーツピアノ (Arduinoプロジェクト)
5.6 トランジスタの二種類 (MicroPythonプロジェクト)
3.2 カスタムトーン (MicroPythonプロジェクト)
6.3 光セラミン (MicroPythonプロジェクト)
チップ
74HC595¶

ArduinoのピンやLEDをたくさんコントロールしたい時、またはボタン、センサー、サーボを同時にコントロールするためのI/Oピンが足りない時、どうしますか?Arduinoにはセンサーを数つ接続できますが、すぐにピンが不足することがあります。
その解決策は「シフトレジスタ」を使用することです。シフトレジスタを使用すると、Arduino(または任意のマイクロコントローラ)から使用できるI/Oピンの数を増やすことができます。74HC595シフトレジスタは、その中でも特に有名です。
74HC595は基本的に独立した8つの出力ピンをコントロールし、入力ピンは3つしか使用しません。8つ以上のI/Oラインが必要な場合、任意の数のシフトレジスタを簡単にカスケード接続して、多くのI/Oラインを作成できます。これは所謂のシフト動作によって行われます。
特徴
8ビット シリアルイン、パラレルアウト シフト
動作電圧範囲:2 V から 6 V
高電流3状態出力は、最大15LSTTL負荷まで駆動可能
低消費電力、最大ICC = 80-µA
典型的なtPD = 14 ns
5 Vでの出力駆動±6-mA
最大入力電流1 µA
シフトレジスタは直接クリアが可能
74HC595のピンとその機能:

Q0-Q7: 8ビットの並列データ出力ピン。8つのLEDや7セグメントディスプレイの8ピンを直接制御可能。
Q7': シリーズ出力ピン。複数の74HC595をシリーズ接続する際に、別の74HC595のDSに接続。
MR: リセットピン。低レベルでアクティブ。
SHcp: シフトレジスタの時系列入力。上昇エッジで、シフトレジスタ内のデータが1ビットずつ移動。例:Q1のデータがQ2に移動。下降エッジでは、シフトレジスタのデータは変更されません。
STcp: ストレージレジスタの時系列入力。上昇エッジで、シフトレジスタのデータがメモリレジスタに移動。
CE: 出力有効ピン。低レベルでアクティブ。
DS: シリアルデータ入力ピン
VCC: 正の供給電圧。
GND: グラウンド。
機能図

動作原理
MR(ピン10)が高レベルで、OE(ピン13)が低レベルのとき、 データはSHcpの上昇エッジで入力され、STcpの上昇エッジを通ってメモリレジスタに移動します。
シフトレジスタ
例として、74hc595のシフトレジスタにバイナリデータ1110 1110を入力する場合。
データはシフトレジスタのビット0から入力されます。
シフトレジスタクロックが上昇エッジの場合、シフトレジスタ内のビットが1ステップシフトされます。例:ビット7はビット6の前の値を受け入れ、ビット6はビット5の値を取得します。

ストレージレジスタ
ストレージレジスタが上昇エッジ状態にあるとき、シフトレジスタのデータがストレージレジスタに転送されます。
ストレージレジスタは8つの出力ピンに直接接続されているため、Q0〜Q7は1バイトのデータを受け取ることができます。
いわゆるストレージレジスタとは、このレジスタにデータが存在して、1回の出力で消失しないことを意味します。
74HC595が連続して電源が入っている限り、データは有効で変更されずに残ります。
新しいデータが入ると、ストレージレジスタ内のデータが上書きされて更新されます。

例
2.4 マイクロチップ - 74HC595 (Arduinoプロジェクト)
2.5 7セグメントディスプレイ (Arduinoプロジェクト)
6.4 デジタルダイス (Arduinoプロジェクト)
2.4 マイクロチップ - 74HC595 (MicroPythonプロジェクト)
2.5 数字表示 (MicroPythonプロジェクト)
6.6 デジタルダイス (MicroPythonプロジェクト)
L293D¶
L293Dは、高電圧および高電流で統合された4チャンネルのモータードライバです。 標準のDTL、TTL論理レベルに接続し、インダクティブロード(リレーコイル、DC、ステッピングモーターなど)や電力スイッチングトランジスタを駆動するために設計されています。 DCモーターは、DC電力を機械的エネルギーに変えるデバイスです。優れた速度調整性能のため、電気駆動に広く使用されています。
以下はピンの図です。L293Dには電源供給のための2つのピン(Vcc1とVcc2)があります。 Vcc2はモーターの電源供給に、Vcc1はチップの電源供給に使用されます。ここで小型のDCモーターが使用されているので、両方のピンを+5Vに接続します。

次に、L293Dの内部構造です。 ピンENは有効ピンで、高レベルでのみ動作します。Aは入力、Yは出力を示します。 右下にそれらの関係を確認できます。 ピンENがHighレベルの場合、AがHighの場合、Yは高レベルを出力します。AがLowの場合、YはLowレベルを出力します。ピンENがLowレベルの場合、L293Dは動作しません。

例
4.1 モーター (Arduinoプロジェクト)
4.2 水ポンプ制御 (Arduinoプロジェクト)
4.1 小型扇風機 (MicroPythonプロジェクト)
4.2 ポンピング (MicroPythonプロジェクト)
2.9 回転するファン (Scratchプロジェクト)
ディスプレイ
LED¶
LEDとは?


LEDは非常に一般的な電子部品で、祭りの時に部屋を飾るためや、家電の電源がオンかオフかのようなさまざまなことを示すインジケータとしても使用できます。LEDには数十の異なる形やサイズがあり、最も一般的なのはスルーホールLEDを持つLEDです。これらは通常長いリードを持っており、ブレッドボードに挿入できます。
LEDの正式名称は発光ダイオードで、ダイオードの特性を持っているため、電流は一方向、アノード(正)からカソード(負)へ流れます。
以下はLEDの電気記号です。

さまざまなサイズと色

赤、黄、青、緑、白が最も一般的なLEDの色であり、放射される光は通常外観と同じ色です。
透明またはマットな外観のLEDを使用することはまれですが、放射される光は白以外の色である場合があります。
LEDは4つのサイズ、3mm、5mm、8mm、10mmで提供されており、5mmが最も一般的なサイズです。

以下は5mmのLEDサイズの詳細です。

順方向電圧
LEDを使用する際に知っておくべき非常に重要なパラメータが順方向電圧です。これは、どれだけの電力を使用するか、また、電流制限抵抗のサイズがどれほど大きくなるべきかを決定します。
順方向電圧は、LEDが点灯する際に必要とする電圧です。ほとんどの赤、黄、橙、淡緑色のLEDは、通常1.9Vから2.1Vの電圧を使用します。

オームの法則によれば、この回路を通る電流は抵抗が増加すると減少し、LEDの光が暗くなります。
I = (Vp-Vl)/R
LEDを安全に、適切な明るさで点灯させるためには、回路にどれだけの抵抗を使用すべきか?
5mmのLEDの99%について、推奨される電流は20mAであり、そのデータシートのConditions列から確認できます。

上の式を以下のように変換します。
R = (Vp-Vl)/I
もし Vp
が5Vで、 Vl
(順方向電圧)が2V、そして I
が20mAの場合、 R
は150Ωです。
抵抗の抵抗を減少させることでLEDを明るくすることができますが、150Ω以下にすることは推奨されません(この抵抗は非常に正確ではないかもしれません、異なる供給元が提供するLEDには違いがあるため)。
以下は、参考として使用できるさまざまな色のLEDの順方向電圧と波長です。
LEDの色 |
順方向電圧 |
波長 |
---|---|---|
赤 |
1.8V ~ 2.1V |
620 ~ 625 |
黄 |
1.9V ~ 2.2V |
580 ~ 590 |
緑 |
1.9V ~ 2.2V |
520 ~ 530 |
青 |
3.0V ~ 3.2V |
460 ~ 465 |
白 |
3.0V ~ 3.2V |
8000 ~ 9000 |
例
2.1 LEDを点灯させよう (Arduinoプロジェクト)
2.2 フェーディング (Arduinoプロジェクト)
2.1 こんにちは、LED! (MicroPythonプロジェクト)
2.2 LEDのフェード効果 (MicroPythonプロジェクト)
2.2 ブレシングLED (Scratchプロジェクト)
2.1 テーブルランプ (Scratchプロジェクト)
RGB LED¶

RGB LEDは様々な色の光を放射します。RGB LEDは赤、緑、青の3つのLEDを透明または半透明のプラスチックシェルにパッケージングします。3つのピンの入力電圧を変更してそれらを重ね合わせることで、さまざまな色を表示することができ、統計によれば16,777,216の異なる色を作成することができます。
特徴
色: トリカラー (赤/緑/青)
共通カソード
5mm クリアラウンドレンズ
順方向電圧: 赤: DC 2.0 - 2.2V; 青&緑: DC 3.0 - 3.2V (IF=20mA)
0.06 ワット DIP RGB LED
輝度は最大+20%増
視野角: 30°
共通アノードと共通カソード
RGB LEDは、共通アノードと共通カソードの2種類に分類されます。
共通カソードのRGB LEDでは、3つのLEDがすべて負の接続(カソード)を共有しています。
共通アノードのRGB LEDでは、3つのLEDが共通の正の接続(アノード)を共有しています。

注釈
我々は共通カソードを使用します。
RGB LEDのピン
RGB LEDには4つのピンがあり、最も長いものはGND、残りのピンは赤、緑、青です。最も長いリードが左から2番目になるようにRGB LEDを配置します。次に、RGB LEDのピン番号は赤、GND、緑、青となります。

また、マルチメーターを使用してダイオードテストモードを選択し、下の図のように接続して各ピンの色を測定することもできます。

色の混合
追加の色を生成するには、3つの色を異なる強度で組み合わせることができます。各LEDの強度を調整するには、PWM信号を使用できます。
LEDが互いに非常に近接しているため、私たちの目は3つの色を個別にではなく、色の組み合わせの結果として認識します。
以下の表を参照して、色がどのように組み合わせられるかを確認してください。これにより、色の混合チャートの動作や、さまざまな色がどのように生成されるかについての考え方が得られます。

例
2.3 カラフルライト (Arduinoプロジェクト)
6.5 カラーグラデーション (Arduinoプロジェクト)
2.3 カラフルライト (MicroPythonプロジェクト)
2.3 カラフルボール (Scratchプロジェクト)
7セグメントディスプレイ¶

7セグメントディスプレイは、7つのLEDをパッケージングした8の形をした部品です。各LEDはセグメントと呼ばれ、エネルギーを供給すると表示する数字の一部となります。
ディスプレイ内の各LEDには位置セグメントが割り当てられ、その接続ピンの一つが長方形のプラスチックパッケージから引き出されています。
これらのLEDピンは"a"から"g"までラベルが付けられ、各LEDを表しています。
他のLEDピンは共通ピンを形成するために接続されています。
したがって、特定の順序でLEDセグメントの適切なピンに順方向のバイアスをかけると、一部のセグメントが明るくなり、他のセグメントは暗くなり、ディスプレイに対応する文字が表示されます。
特徴
サイズ: 19 x 12.7 x 13.8mm(LxWxH、ピンを含む)
スクリーン: 0.56''
色: 赤
共通カソード
順方向電圧: 1.8V
10ピン
ピッチ: 標準0.1" (2.54mm)
共通カソード(CC)または共通アノード(CA)
ピンの接続には2つのタイプがあります:共通カソード(CC)と共通アノード(CA)。 名前が示すように、CCディスプレイは7つのLEDのカソードが接続されているのに対し、CAディスプレイは7セグメントのアノードがすべて接続されています。
共通カソード7セグメントディスプレイ

共通アノード7セグメントディスプレイ

CCかCAかを知る方法は?
通常、7セグメントディスプレイの側面には、xxxAxまたはxxxBxというラベルがあります。一般的に、xxxAxは共通カソードを示し、xxxBxは共通アノードを示しています。


ラベルがない場合、マルチメータを使用して7セグメントディスプレイをチェックすることもできます。マルチメータをダイオードテストモードに設定し、ブラックリードを7セグメントディスプレイの中央ピンに接続し、赤いリードを中央以外の任意のピンに接続します。セグメントが点灯すると、7セグメントディスプレイは共通カソードです。
セグメントが点灯していない場合は、赤と黒のメーターヘッドを交換します。セグメントが点灯すると、共通アノードを示しています。
表示コード
7セグメントディスプレイ(共通カソード)が数字をどのように表示するかを知るために、次の表を描きました。 数字は7セグメントディスプレイ上に表示される数字0-Fです。 (DP) GFEDCBAは、対応するLEDを0または1に設定します。

例えば、01011011は、DP、F、Cが0に設定され、他は1に設定されていることを意味します。したがって、数字2が7セグメントディスプレイに表示されます。

例
2.5 7セグメントディスプレイ (Arduinoプロジェクト)
6.4 デジタルダイス (Arduinoプロジェクト)
2.5 数字表示 (MicroPythonプロジェクト)
6.6 デジタルダイス (MicroPythonプロジェクト)
I2C LCD1602¶

GND: 接地
VCC: 電源供給、5V。
SDA: シリアルデータライン。プルアップ抵抗を介してVCCに接続。
SCL: シリアルクロックライン。プルアップ抵抗を介してVCCに接続。
皆さんがご存知のように、LCDや他のディスプレイは人間とのインタラクションを豊かにしていますが、共通の弱点があります。コントローラに接続されると、多数のIOが占有され、外部ポートの少ないコントローラではその他の機能が制限されます。
そこで、この問題を解決するためにI2Cモジュールを搭載したLCD1602が開発されました。I2Cモジュールには、I2CシリアルデータをLCDディスプレイの並列データに変換するPCF8574 I2Cチップが内蔵されています。
I2Cアドレス
デフォルトのアドレスは基本的に0x27で、場合によっては0x3Fになることがあります。
デフォルトアドレス0x27を例に、デバイスアドレスはA0/A1/A2パッドをショートすることで変更可能です;デフォルト状態ではA0/A1/A2は1、パッドがショートしているとA0/A1/A2は0になります。

バックライト/コントラスト
バックライトはジャンパーキャップで有効化でき、ジャンパーキャップを外すとバックライトを無効にできます。裏側の青いポテンショメーターは、コントラスト(最も明るい白と最も暗い黒との間の明るさの比率)を調整するためのものです。

ショートキャップ: このキャップでバックライトを有効にでき、キャップを外すとバックライトを無効にできます。
ポテンショメータ: 表示テキストの明瞭度を調整するためのもので、時計回りに回すと増加し、反時計回りに回すと減少します。
例
2.6 文字の表示 (Arduinoプロジェクト)
6.7 数当てゲーム (Arduinoプロジェクト)
2.6 文字の表示 (MicroPythonプロジェクト)
6.7 数当てゲーム (MicroPythonプロジェクト)
WS2812 RGB 8 LED ストリップ¶

WS2812 RGB 8 LEDストリップは、8つのRGB LEDで構成されています。 LED全体を制御するのに必要なピンは1つだけです。各RGB LEDには、独立して制御できるWS2812チップがあります。 256段階の輝度表示と16,777,216色の完全な真のカラー表示を実現することができます。 同時に、ピクセルにはインテリジェントなデジタルインターフェースのデータラッチシグナル整形増幅ドライブ回路が含まれており、 効果的にピクセルポイントの色の高さを一貫して保つための信号整形回路が内蔵されています。
柔軟であり、ドッキング、曲げ、自由に切断することができ、裏面には接着テープが装備されているため、凹凸のある表面に自由に固定することができ、狭いスペースに取り付けることができます。
特徴
動作電圧: DC5V
IC: 1つのICは1つのRGB LEDを駆動します
消費電力: 0.3w毎のLED
動作温度: -15-50
色: フルカラーRGB
RGBタイプ:5050RGB(内蔵IC WS2812B)
ライトストリップの厚さ: 2mm
各LEDは個別に制御できます
WS2812Bの紹介
WS2812Bは、制御回路とRGBチップが5050のコンポーネントのパッケージ内に統合されているインテリジェントなLED光源です。内部には、インテリジェントなデジタルポートデータラッチおよび信号再整形増幅 ドライブ回路が組み込まれています。また、高精度の内部オシレーターと12V電圧プログラマブル定電流制御部を内蔵しており、効果的にピクセルポイントの光色の高さを一貫して保つことができます。
データ転送プロトコルは、単一のNZR通信モードを使用します。ピクセルが電源投入リセットされた後、DIN ポートはコントローラからデータを受信し、最初のピクセルは初期の24ビットデータを収集して内部データラッチに送信します。 内部信号再整形増幅回路によって再整形された他のデータは、DOポートを通じて次のカスケード ピクセルに送信されます。各ピクセルの転送後、信号は24ビット減少します。ピクセルは自動再整 形送信技術を採用し、ピクセルのカスケード数は信号伝送の速度にのみ依存しています。
低駆動電圧のLEDは、環境にやさしくエネルギー節約型で、明るさ、散乱 角度が大きく、一貫性が良好で、消費電力が低く、寿命が長いなどの特長があります。LED内に統合された制御チップ を使用することで、回路がさらにシンプルになり、ボリュームが小さくなり、取り付けが便利になります。
例
2.7 RGB LEDストリップ (Arduinoプロジェクト)
6.2 流れる光 (Arduinoプロジェクト)
2.7 RGB LEDストリップ (MicroPythonプロジェクト)
6.2 流れる光 (MicroPythonプロジェクト)
6.5 カラーグラデーション (MicroPythonプロジェクト)
音
ブザー¶

一体型の電子ブザーとして、DC電源で動作するブザーは、コンピュータ、プリンタ、コピー機、アラーム、電子玩具、自動車電子機器、電話、タイマーなどの電子製品や音声機器に広く利用されています。
ブザーは、アクティブなものとパッシブなものに分類されます(以下の画像を参照)。ブザーをピンが上を向くように回転させると、緑の基板が付いているブザーはパッシブブザー、黒テープで囲まれているものはアクティブブザーです。
アクティブブザーとパッシブブザーの違い:
アクティブブザーには内蔵の振動源があるため、電化すると音がします。しかし、パッシブブザーにはそのような源がないため、DC信号を使用してもビープ音がしない。代わりに、2Kから5Kの周波数の正方形の波を使って駆動させる必要がある。アクティブブザーは、多数の内蔵振動回路があるため、パッシブブザーよりも高価であることがよくあります。
以下はブザーの電気記号です。プラスとマイナスの極を持つ2本のピンがあります。表面に+のマークがある方がアノードで、もう一方がカソードです。

ブザーのピンを確認すると、長い方がアノードで、短い方がカソードです。接続するときに間違えないよう注意してください。そうでないと、ブザーは音を出しません。
例
3.1 ビープ音 (Arduinoプロジェクト)
3.2 カスタムトーン (Arduinoプロジェクト)
6.3 バックアップ支援 (Arduinoプロジェクト)
3.2 カスタムトーン (MicroPythonプロジェクト)
3.1 ビープ音 (MicroPythonプロジェクト)
6.4 リバースエイド (MicroPythonプロジェクト)
オーディオモジュールとスピーカー¶
オーディオアンプモジュール

オーディオアンプモジュールには、HXJ8002オーディオパワーアンプチップが含まれています。このチップは低電源のパワーアンプで、5V DC電源から3Ω BTL負荷に対して平均3Wのオーディオパワーを低調波歪(1KHzでの歪みのしきい値が10%未満)で提供することができます。このチップは、結合キャパシタやブートストラップキャパシタを使用せずにオーディオ信号を増幅することができます。
このモジュールは、2.0Vから5.5V DCの電源で供給され、10mAの動作電流(典型的なスタンバイ電流は0.6uA)を使用して、3Ω、4Ω、8Ωのインピーダンスを持つスピーカーにパワフルな増幅音を生成することができます。このモジュールには、電源のオン/オフ時の遷移ノイズを大幅に減少させるための改良されたポップとクリック回路があります。その小さなサイズと高効率、低電源供給は、広範なポータブルおよび電池駆動プロジェクトやマイクロコントローラでの利用を可能にします。
IC: HXJ8002
入力電圧: 2V ~ 5.5V
スタンバイモード電流: 0.6uA(典型値)
出力電力: 3W (3Ω 負荷), 2.5W (4Ω 負荷), 1.5W (8Ω 負荷)
出力スピーカーインピーダンス: 3Ω, 4Ω, 8Ω
サイズ: 19.8mm x 14.2mm
スピーカー

サイズ: 20x30x7mm
インピーダンス:8ohm
定格入力電力: 1.5W
最大入力電力: 2.0W
ワイヤ長: 10cm

以下はサイズチャートです:
例
7.5 SDカード対応MP3プレーヤー (Arduinoプロジェクト)
7.3 Bluetooth Audio Player (Arduinoプロジェクト)
ドライバ
DCモータ¶

これは3VのDCモータです。2つの端子のそれぞれに高レベルと低レベルを供給すると、回転します。
長さ: 25mm
直径: 21mm
軸径: 2mm
軸の長さ: 8mm
電圧: 3-6V
電流: 0.35-0.4A
3V時の速度: 19000 RPM(回転/分)
重量: 約14g(一つの単位で)
直流(DC)モータは、電気エネルギーを機械エネルギーに変換する連続アクチュエータです。DCモータは、連続的な角回転を生成することにより、ロータリーポンプ、ファン、圧縮機、インペラーなどの装置を動作させます。
DCモータは、 stator と呼ばれるモータの固定部分と、モーションを生み出すために回転するモータの内部部分、すなわち rotor (またはDCモータの アーマチュア )の2つの部分で構成されています。 モーションを生成する鍵は、永久磁石の磁場内(その場が北極から南極まで広がる)にアーマチュアを配置することです。この磁場と動く荷電粒子の相互作用(電流を流すワイヤが磁場を生成する)によってアーマチュアを回転させるトルクが生じます。

電流はバッテリーの正の端子から回路を通って、銅のブラシを通り、コミュテータを経てアーマチュアに流れます。 しかし、コミュテータには2つの隙間があるため、この流れは完全な回転の途中で逆転します。
この連続的な逆転は、バッテリーからのDC電源をACに変換することで、アーマチュアが回転を維持するための正しい方向と正しいタイミングでトルクを受け取ることができるようにします。

例
4.1 モーター (Arduinoプロジェクト)
4.1 小型扇風機 (MicroPythonプロジェクト)
2.9 回転するファン (Scratchプロジェクト)
サーボ¶

サーボは一般的に次の部品で構成されています:ケース、シャフト、ギアシステム、ポテンショメータ、DCモータ、および埋め込みボード。
動作原理は次のとおりです。マイクロコントローラはPWM信号をサーボに送信し、サーボ内の埋め込みボードが信号ピンを通じて信号を受信し、内部のモータを制御して回転させます。その結果、モータはギアシステムを駆動し、減速後にシャフトを動かします。サーボのシャフトとポテンショメータは接続されています。シャフトが回転すると、ポテンショメータも駆動し、ポテンショメータから電圧信号が埋め込みボードに出力されます。その後、ボードは現在の位置に基づいて回転の方向と速度を決定し、定義された正確な位置で正確に停止し続けることができます。

角度は、制御ワイヤに適用されるパルスの持続時間によって決定されます。これはパルス幅変調と呼ばれます。サーボは20msごとにパルスを検出することを期待しています。パルスの長さは、モータがどれだけ回転するかを決定します。たとえば、1.5msのパルスは、モータを90度の位置(中立位置)に回転させます。 1.5ms未満のパルスがサーボに送信されると、サーボはある位置に回転し、中立点から反時計回りに何度かの出力シャフトを保持します。パルスが1.5msよりも広い場合、その逆が発生します。サーボが有効な位置に回転するように命令するパルスの最小幅と最大幅は、各サーボの関数です。一般的に最小パルスは約0.5ms、最大パルスは2.5msとなります。

例
4.3 サーボモータのスイング (Arduinoプロジェクト)
4.3 スイングサーボ (MicroPythonプロジェクト)
遠心ポンプ¶

遠心ポンプは、回転運動エネルギーを水力エネルギーに変換して流体を輸送します。回転エネルギーは電動モーターから供給されます。流体はポンプのインペラーに、またはその近くの回転軸に沿って入り、インペラーによって加速され、放射状に外向きにディフューザーまたはボルート室に流れ、そこから流れ出します。
遠心ポンプの一般的な用途には、水、下水、農業、石油、石油化学のポンプが含まれます。
- 特徴
電圧範囲: DC 3 ~ 4.5V
動作電流: 120 ~ 180mA
電力: 0.36 ~ 0.91W
最大揚水高: 0.35 ~ 0.55M
最大流量: 80 ~ 100 L/H
連続作動寿命: 100時間
防水等級: IP68
駆動方式: DC、磁気駆動
材質: エンジニアリングプラスチック
出口外径: 7.8 mm
出口内径: 6.5 mm
これは水中ポンプであり、そのように使用する必要があります。水中でない状態で運転すると、過度に加熱し、過熱のリスクがあります。
例
4.2 水ポンプ制御 (Arduinoプロジェクト)
6.6 植物モニタリングシステム (Arduinoプロジェクト)
4.2 ポンピング (MicroPythonプロジェクト)
6.8 植物モニター (MicroPythonプロジェクト)
コントローラ
傾斜スイッチ¶

こちらで使用される傾斜スイッチは、内部に金属の球を持つタイプです。これは、小さな角度の傾斜を検出するために使用されます。
その原理は非常に単純です。スイッチが特定の角度で傾けられると、内部の球が転がり落ち、外部のピンに接続された2つのコンタクトに触れ、回路が作動します。それ以外の場合、球はコンタクトから離れており、回路が切断されます。

例
5.2 傾けて操作! (Arduinoプロジェクト)
5.2 傾けて操作! (MicroPythonプロジェクト)
ポテンショメータ¶

ポテンショメータは、3つの端子を持つ抵抗成分であり、一定の変化に従って抵抗値を調整することができます。
ポテンショメータにはさまざまな形状、サイズ、値がありますが、以下の共通点があります:
3つの端子(または接続点)がある。
中央の端子と外側の端子のいずれかとの間の抵抗を変化させるために移動できるノブ、ネジ、またはスライダーがある。
ノブ、ネジ、またはスライダーが移動すると、中央の端子と外側の端子のいずれかとの間の抵抗が0 Ωからポテンショメータの最大抵抗まで変化する。
以下は、ポテンショメータの回路記号です。

回路内のポテンショメータの機能は次のとおりです:
電圧分配器としての役割
ポテンショメータは、連続して調整可能な抵抗器です。ポテンショメータの軸またはスライドハンドルを調整すると、可動接点が抵抗体上を滑るようになります。この時点で、ポテンショメータに印加された電圧と、可動アームが回転した角度または移動した距離に応じて、電圧が出力されます。
レオスタットとしての役割
ポテンショメータをレオスタットとして使用する場合、回路内で中央のピンと他の2つのピンのいずれかを接続します。そうすることで、移動接点の移動範囲内で、スムーズかつ連続して変化する抵抗値を取得することができます。
電流コントローラーとしての役割
ポテンショメータが電流コントローラとして機能する場合、スライド接触端子は出力端子の一方として接続する必要があります。
ポテンショメータについての詳細は、次のリンクを参照してください: Potentiometer - Wikipedia
例
5.8 ノブを回す (Arduinoプロジェクト)
5.8 ノブを回す (MicroPythonプロジェクト)
2.4 動くマウス (Scratchプロジェクト)
2.16 GAME - ブレイクアウトクローン (Scratchプロジェクト)
ジョイスティックモジュール¶

GND: 接地。
+5V: 電源供給、3.3Vから5Vを受け入れます。
VRX: ジョイスティックの水平方向(X軸)の位置に対応するアナログ出力。
VRY: ジョイスティックの垂直方向(Y軸)の位置に対応するアナログ出力。
SW: ジョイスティックが押されたときに活性化されるボタンスイッチ出力。正しい動作のために、外部プルアップ抵抗が必要です。抵抗がある場合、SWピンはアイドル時に高レベルを出力し、ジョイスティックが押されると低くなります。
ジョイスティックの基本的なアイディアは、スティックの動きをコンピュータが処理できる電子情報に変換することです。
コンピュータに完全な動きの範囲を伝えるために、ジョイスティックはX軸(左から右)とY軸(上から下)の2つの軸でスティックの位置を測定する必要があります。基本的な幾何学のように、X-Y座標はスティックの位置を正確に特定します。
スティックの位置を決定するために、ジョイスティック制御システムは各軸の位置を単に監視します。従来のアナログジョイスティックデザインは、これを2つのポテンショメータ、または可変抵抗器で行います。
ジョイスティックには、ジョイスティックが押されると動作するデジタル入力もあります。

例
5.11 ジョイスティックの切り替え (Arduinoプロジェクト)
5.11 ジョイスティックの切り替え (MicroPythonプロジェクト)
2.13 GAME - Star-Crossed (Scratchプロジェクト)
2.20 GAME - ドラゴン討伐 (Scratchプロジェクト)
IR レシーバー¶
IR レシーバー

OUT: 信号出力
GND: GND
VCC: 電源供給, 3.3v~5V
SL838 赤外線レシーバーは、赤外線信号を受信する部品で、独立して赤外線を受信し、TTLレベルと互換性のある信号を出力することができます。サイズは通常のプラスチックパッケージのトランジスタと似ており、あらゆる種類の赤外線リモートコントロールや赤外線伝送に適しています。
赤外線、またはIR、通信は、低コストで使いやすい無線通信技術として人気があります。赤外線は可視光よりもやや波長が長いため、人の目には見えない - 無線通信には理想的です。赤外線通信の一般的な変調方式は、38KHzの変調です。
HS0038B IR レシーバーセンサーを採用、高感度
リモートコントロールに使用可能
電源供給: 5V
インターフェース: デジタル
変調周波数: 38Khz
ピン定義: (1) 出力 (2) Vcc (3) GND
サイズ: 23.5mm x 21.5mm
リモートコントロール

これは、21の機能ボタンと最大8メートルの送信距離を持つミニ薄型赤外線ワイヤレスリモートコントロールで、子供の部屋のさまざまなデバイスを操作するのに適しています。
サイズ: 85x39x6mm
リモートコントロール範囲: 8-10m
バッテリー: 3V ボタン型リチウムマンガン電池
赤外線キャリア周波数: 38KHz
表面貼り材料: 0.125mm PET
有効寿命: 20,000回以上
例
5.14 赤外線受信機 (Arduinoプロジェクト)
6.7 数当てゲーム (Arduinoプロジェクト)
5.14 赤外線リモコン (MicroPythonプロジェクト)
6.7 数当てゲーム (MicroPythonプロジェクト)
コントローラ
光電抵抗器¶

光電抵抗器またはフォトセルは、光によって制御される可変抵抗器です。光電抵抗器の抵抗は、入射光の強度が増加すると減少します。言い換えると、光伝導性を示します。
光電抵抗器は、光感応の検出回路や光起動、暗起動のスイッチ回路で抵抗の半導体として応用することができます。暗闇では、光電抵抗器の抵抗は数メガオーム(MΩ)に達することがありますが、光の中では、光電抵抗器の抵抗は数百オームまで低下することがあります。
以下は光電抵抗器の電子記号です。

例
5.7 光を感じる (Arduinoプロジェクト)
6.6 植物モニタリングシステム (Arduinoプロジェクト)
5.7 光を感じる (MicroPythonプロジェクト)
6.8 植物モニター (MicroPythonプロジェクト)
サーミスタ¶

サーミスタは、標準の抵抗器よりも温度に強く依存する抵抗を持つタイプの抵抗器です。「サーミスタ」という言葉はthermalとresistorの組み合わせです。サーミスタは、突入電流制限器、温度センサ(通常はNTCタイプ)、自己リセット式の過電流保護器、および自己調整式の加熱要素(通常はPTCタイプ)として広く使用されています。
以下はサーミスタの電子記号です。

サーミスタには2つの基本的なタイプがあります:
NTCサーミスタでは、温度が上昇すると抵抗が減少します。これは通常、価数帯からの熱的な攪拌により上昇した伝導電子の増加のためです。NTCは、温度センサとして、または回路との直列として突入電流制限器として一般的に使用されます。
PTCサーミスタでは、温度が上昇すると抵抗が増加します。これは通常、特に不純物や不完全さの熱的格子の攪拌が増加するためです。PTCサーミスタは一般的に回路と直列に取り付けられ、リセット可能なヒューズとして、過電流の状態から保護するために使用されます。
このキットでは、NTCタイプを使用しています。各サーミスタには通常の抵抗があります。ここでは10kオームで、25度セルシウスで測定されています。
抵抗と温度の関係は以下の通りです:
RT = RN * expB(1/TK - 1/TN)
RT は温度がTKの時のNTCサーミスタの抵抗です。
RN は評価温度TN下のNTCサーミスタの抵抗です。ここで、RNの数値は10kです。
TK はケルビン温度で、単位はKです。ここで、TKの数値は273.15 + セルシウス度です。
TN は評価ケルビン温度で、単位もKです。ここで、TNの数値は273.15+25です。
そして、B(β)、NTCサーミスタの材料定数は、数値3950の熱感受性指数としても呼ばれます。
exp は指数の略で、基数eは自然数で、おおよそ2.7と等しいです。
この式TK=1/(ln(RT/RN)/B+1/TN)を変換して、273.15を引いたケルビン温度がセルシウス度に等しくなります。
この関係は経験的な式です。温度と抵抗が有効範囲内の場合にのみ正確です。
例
5.10 サーミスター温度計 (Arduinoプロジェクト)
8.4 IoT通信とMQTT (Arduinoプロジェクト)
5.10 温度センシング (MicroPythonプロジェクト)
2.6 低温アラーム (Scratchプロジェクト)
DHT11 湿温度センサー¶
デジタル温湿度センサDHT11は、温度と湿度の較正済みデジタル信号出力を持つ複合センサーです。 この製品は、専用のデジタルモジュール収集技術と温湿度検知技術を採用しており、高い信頼性と優れた長期安定性を確保しています。
このセンサーには、抵抗湿度検知部品とNTC温度測定デバイスが含まれており、高性能の8ビットマイクロコントローラーと接続されています。
使用できるピンは3つだけです:VCC、GND、およびDATA。 通信プロセスは、DATAラインがDHT11に開始信号を送信することから始まり、DHT11はその信号を受信し、応答信号を返します。 その後、ホストは応答信号を受信し、40ビットの湿温度データを受信し始めます(8ビットの湿度整数 + 8ビットの湿度小数 + 8ビットの温度整数 + 8ビットの温度小数 + 8ビットのチェックサム)。

特徴
湿度測定範囲: 20 - 90%RH
温度測定範囲: 0 - 60℃
温度と湿度を示すデジタル信号の出力
動作電圧:DC 5V; PCBサイズ: 2.0 x 2.0 cm
湿度測定精度: ±5%RH
温度測定精度: ±2℃
例
5.13 温度・湿度センサー (Arduinoプロジェクト)
6.6 植物モニタリングシステム (Arduinoプロジェクト)
8.6 Adafruit IOを使った温度と湿度のモニタリング (Arduinoプロジェクト)
5.13 温湿度計測 (MicroPythonプロジェクト)
6.8 植物モニター (MicroPythonプロジェクト)
PIR動きセンサーモジュール¶

PIRセンサーは、赤外線放射熱を検出し、これにより赤外線放射熱を放射する生体の存在を検出することができます。
PIRセンサーは、二つのスロットに分けられており、これらは差動増幅器に接続されています。静止物体がセンサーの前にある場合、2つのスロットは同じ量の放射を受け取り、出力はゼロです。動いている物体がセンサーの前にあると、一方のスロットが他方よりも多くの放射を受け取り、出力が高くなったり低くなったりします。この出力電圧の変化は、動きの検出の結果です。

センシングモジュールが配線された後、1分間の初期化があります。初期化中、モジュールは間隔をあけて0〜3回出力します。その後、モジュールはスタンバイモードになります。モジュールの表面から光源や他の源の干渉を遠ざけて、干渉信号による誤動作を避けてください。風の影響も受けやすいので、あまり風の多い場所では使用しない方が良いです。

距離の調整
距離調整のポテンショメータのノブを時計回りに回すと、検知距離の範囲が増え、最大検知距離の範囲は約0-7メートルです。反時計回りに回すと、検知距離の範囲が狭まり、最小検知距離の範囲は約0-3メートルです。
遅延調整
遅延調整のポテンショメータのノブを時計回りに回すと、センシング遅延が増加します。センシング遅延の最大は300秒に達することができます。逆に、反時計回りに回すと、遅延を最小5秒に短縮することができます。
2つのトリガーモード
ジャンパーキャップを使用して、異なるモードを選択できます。
H: 反復可能なトリガーモード。人体を感知した後、モジュールは高レベルを出力します。その後の遅延期間中に誰かが検知範囲に入ると、出力は高レベルのままになります。
L: 反復不可能なトリガーモード。人体を感知すると高レベルを出力します。遅延後、出力は自動的に高レベルから低レベルに変わります。
例
5.5 人間の動きを検出する (Arduinoプロジェクト)
8.7 ESPカメラとTelegramボット (Arduinoプロジェクト)
5.5 人の動きを検出する (MicroPythonプロジェクト)
ライントラッキングモジュール¶

S: 通常は低レベルですが、黒い線が検出されると高レベルになります。
V+:電源供給、3.3v〜5V
G: グラウンド
このモジュールは1チャンネルのライントラッキングモジュールで、名前が示す通り、白い背景上の黒い線、または黒い背景に対する白い線を追跡します。

このモジュールは、TCRT5000赤外線センサーを使用しており、赤外線LED(青)と感光性トリプレット(黒)で構成されています。
青い赤外線LEDは、電源がオンのとき、人の目には見えない赤外線を放射します。
黒いフォトトランジスタは、赤外線を受信するために使用され、受信した赤外線の量に応じて内部抵抗が変動します。赤外線を多く受信すると、その抵抗は減少し、逆もまた然りです。
モジュールにはLM393コンパレータがあり、これはフォトトランジスタの電圧と設定電圧(ポテンショメータで調整)を比較するために使用されます。設定電圧よりも大きい場合、出力は1となり、そうでない場合は0となります。
したがって、赤外線発光管が黒い表面に照らされると、黒は光を吸収するため、感光性トランジスタは赤外線を少なく受け取り、その抵抗は増加します(電圧増加)。LM393コンパレータを通過すると、出力は高レベルとなります。
同様に、白い表面に照らされると、反射光が増え、感光性トランジスタの抵抗が減少します(電圧減少)。したがって、コンパレータは低レベルを出力し、インジケータLEDが点灯します。
特長
赤外線放射センサーTCRT5000を使用
検出距離: 1-8mm、焦点距離2.5mm
コンパレータ出力信号はクリアで、波形が良好で、駆動容量は15mA以上
感度調整のためのポテンショメータを使用
動作電圧: 3.3V-5V
デジタル出力: 0(白)および1(黒)
広い電圧のLM393コンパレータを使用。
サイズ: 42mmx10mm
例
5.4 ライン検出 (Arduinoプロジェクト)
5.4 ラインの検出 (MicroPythonプロジェクト)
2.19 GAME - 心臓を守れ (Scratchプロジェクト)
土壌湿度モジュール¶

GND: グラウンド
VCC: 電源供給、3.3v〜5V
AOUT: 土壌の湿度値を出力します。土壌が湿っているほど、その値は小さくなります。
この容量性土壌湿度センサーは、市場のほとんどの抵抗型センサーとは異なり、容量性感応の原理を使用して土壌の湿度を検出します。抵抗型センサーが腐食に非常に敏感である問題を回避し、作業寿命を大幅に延長します。
腐食に耐性のある材料で作られており、優れた耐久性があります。植物の周りの土に挿入して、リアルタイムで土壌の湿度データを監視します。モジュールには、3.3〜5.5 Vの電圧範囲で動作するためのオンボード電圧レギュレータが含まれています。3.3 Vと5 Vの供給を持つ低電圧のマイクロコントローラに適しています。
容量性土壌湿度センサーのハードウェア回路図は以下の通りです。

固定周波数の発振器があり、これは555タイマーICで構築されています。生成された方形波は、コンデンサのようなセンサに供給されます。ただし、方形波信号に対して、コンデンサは一定のリアクタンスを持っています。または、議論のために、純粋なオーム抵抗(ピン3の10k抵抗)を持つ抵抗器で電圧分割を形成します。
土壌の湿度が高いほど、センサの容量が高くなります。その結果、方形波のリアクタンスが減少し、信号線上の電圧が減少し、マイクロコントローラを通したアナログ入力の値が小さくなります。
仕様
動作電圧: 3.3〜5.5 VDC
出力電圧: 0〜3.0VDC
動作電流: 5mA
インターフェース: PH2.0-3P
寸法: 3.86 x 0.905 インチ (L x W)
重量: 15g
例
5.9 土壌湿度の測定 (Arduinoプロジェクト)
6.6 植物モニタリングシステム (Arduinoプロジェクト)
5.9 土壌水分を測定する (MicroPythonプロジェクト)
6.8 植物モニター (MicroPythonプロジェクト)
障害物回避モジュール¶

VCC: 電源供給, 3.3 ~ 5V DC.
GND: グラウンド
OUT: シグナルピン。通常は高レベルで、障害物が検出されると低レベルとなります。
IR障害物回避モジュールは環境光への適応性が高く、赤外線送信管と受信管のペアを持っています。
送信管は赤外線の周波数を放射し、検出方向に障害物がある場合、赤外線の放射が受信管によって受け取られ、 コンパレータ回路の処理後、インジケータが点灯し、低レベルの信号を出力します。
検出距離はポテンショメータで調整可能で、効果的な距離範囲は2-30cmです。

例
5.3 障害物の検出 (Arduinoプロジェクト)
5.3 障害物の検出 (MicroPythonプロジェクト)
2.11 ゲーム - 射撃 (Scratchプロジェクト)
2.18 GAME - 白いタイルを踏まないで (Scratchプロジェクト)
超音波モジュール¶

TRIG: トリガーパルス入力
ECHO: エコーパルス出力
GND: グラウンド
VCC: 5V供給
これはHC-SR04超音波距離センサーで、2cmから400cmの非接触測定を提供し、範囲の精度は最大3mmまでです。このモジュールには超音波送信機、受信機、および制御回路が含まれています。
使用するために接続する必要があるのは4つのピンだけです:VCC(電源)、Trig(トリガー)、Echo(受信)、GND(グラウンド)。
特徴
動作電圧: DC5V
動作電流: 16mA
動作周波数: 40Hz
最大範囲: 500cm
最小範囲: 2cm
トリガー入力信号: 10uS TTLパルス
エコー出力信号: 入力TTLレベル信号および範囲の比率
コネクタ: XH2.54-4P
寸法: 46x20.5x15 mm
原理
基本的な原理は以下の通りです:
IOトリガーを少なくとも10usの高レベル信号で使用します。
モジュールは40kHzで超音波の8サイクルのバーストを送信し、パルス信号が受信されたかどうかを検出します。
信号が返されると、Echoは高レベルを出力します。この高レベルの持続時間は、放射から返還までの時間です。
距離 = (高レベルの時間 x 音速(340M/S)) / 2

式:
us / 58 = センチメートルでの距離
us / 148 = インチでの距離
距離 = 高レベルの時間 x 速度(340M/S) / 2
注釈
このモジュールは電源投入時に接続してはいけません。必要な場合、モジュールのGNDを最初に接続してください。そうしないと、モジュールの動作に影響が出る可能性があります。
測定対象の物体の面積は少なくとも0.5平方メートルであり、できるだけ平らでなければなりません。そうでないと、結果に影響が出る可能性があります。
例
5.12 距離の測定 (Arduinoプロジェクト)
6.3 バックアップ支援 (Arduinoプロジェクト)
5.12 距離測定 (MicroPythonプロジェクト)
6.4 リバースエイド (MicroPythonプロジェクト)
2.15 GAME - フラッピーパロット (Scratchプロジェクト)
よくある質問¶
モバイルデバイスでBlynkを使う方法は?¶
注釈
データストリームはBlynkのWeb上でのみ作成できるため、Web上でデータストリームを作成するための異なるプロジェクトを参照し、以下のチュートリアルに従ってモバイルデバイス上のBlynkでウィジェットを作成する必要があります。
モバイルデバイスでGoogle PlayまたはAPP Storeを開き、「Blynk IoT」(Blynk(legacy)ではない)を検索してダウンロードします。
APPを開いてログインします。このアカウントは、Webクライアントで使用したアカウントと同じである必要があります。
次に、 Dashboard に移動します(持っていない場合は作成)。モバイルとWebの Dashboard は互いに独立していることがわかります。
Edit アイコンをクリックします。
空白のエリアをクリックします。
Webページと同じウィジェットを選択します。例えば、 Joystick ウィジェットを選択します。
空白のエリアに Joystick ウィジェットが表示されるので、それをクリックします。
Joystick の設定が表示されます。Webページで先ほど設定した Xvalue と Yvalue のデータストリームを選択します。各ウィジェットは、各プロジェクトの異なるデータストリームに対応していることに注意してください。
Dashboard ページに戻り、必要に応じて Joystick を操作できます。
SDカードをフォーマットする方法は?¶
使用しているオペレーティングシステムによって、SDカードを正しくフォーマットする手順が異なる場合があります。以下は、Windows、MacOS、LinuxでSDカードをフォーマットするための簡単な手順です。
Windows
コンピュータにSDカードを挿入し、「マイコンピュータ」または「このPC」を開きます。SDカード上で右クリックし、「フォーマット」を選択します。
![]()
ファイルシステムのドロップダウンメニューから、希望するファイルシステムを選択します(通常はFAT32を選択し、32GB以上のSDカードの場合はexFATを選択する必要があります)。"クイックフォーマット"をチェックし、"開始"をクリックします。
![]()
MacOS
コンピュータにSDカードを挿入します。"ディスクユーティリティ"アプリケーションを開きます("ユーティリティ"フォルダ内にあります)。
![]()
左側のリストからSDカードを選択し、"消去"をクリックします。
![]()
フォーマットのドロップダウンメニューから、希望するファイルシステムを選択します(通常はMS-DOS (FAT)をFAT32用に、32GB以上のSDカードの場合はExFATを選択します)。次に"消去"をクリックします。
![]()
最後に、フォーマットが完了するのを待ちます。
![]()
Linux
SDカードを挿入した後、ターミナルを開きます。
lsblk
と入力し、デバイスリストでSDカードの名前を探します(例:sdb
)。
umount
コマンドを使用してSDカードをアンマウントします。例:sudo umount /dev/sdb*
。
mkfs
コマンドを使用してSDカードをフォーマットします。例えば、sudo mkfs.vfat /dev/sdb1
でSDカードをFAT32ファイルシステムにフォーマットします(32GB以上のSDカードの場合は、mkfs.exfat
を使用する必要があります)。
SDカードをフォーマットする前に、SDカード上の重要なデータをバックアップしてください。フォーマット操作はSDカード上のすべてのファイルを消去します。
"Unknown COMxx"が常に表示されますか?¶
ESP32をコンピュータに接続すると、Arduino IDEはよく Unknown COMxx
と表示します。これはなぜでしょうか?

これは、ESP32のUSBドライバが通常のArduinoボードとは異なるためです。Arduino IDEはこのボードを自動的に認識することができません。
このような状況では、以下の手順に従って正しいボードを手動で選択する必要があります:
Select the other board and port をクリックします。
検索窓に esp32 dev module と入力し、表示されるボードを選択します。その後、正しいポートを選択し、 OK をクリックします。
これで、クイックビューウィンドウでボードとポートを確認することができるはずです。
ありがとうございます¶
製品の評価をしてくださった審査員の皆さま、チュートリアルの提案をしてくださった専門家の皆さま、そして私たちを絶えず追いかけ、支えてくださったユーザーの皆さまへ、心からの感謝を申し上げます。 皆さまからの貴重な提案は、私たちにより良い製品を提供するための動機となっています!
特別な感謝を込めて
Len Davisson
Kalen Daniel
Juan Delacosta
少しのお時間を割いて、このアンケートにご記入いただけますか?
注釈
アンケートを提出した後、結果を見るためにページの先頭に戻ってください。
著作権に関する通知¶
このマニュアルに含まれるテキスト、画像、コードなど全ての内容はSunFounder社が所有しています。関連する規定や著作権法のもとで、著者や関連する権利保持者の合法的権利を侵害することなく、個人的な学習、調査、楽しみ、またはその他の非営利目的のためにのみ使用する必要があります。許可なく商業的利益のためにこれらを使用する個人や組織に対して、会社は法的措置を取る権利を留保します。