差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

次のリビジョン
前のリビジョン
gimmickkouza:electronic_basic:5:3_analogread [2024/06/01 15:28] – 作成 lutamestagimmickkouza:electronic_basic:5:3_analogread [2024/06/16 19:50] (現在) – [配線図] :部品リスト追加 lutamesta
行 1: 行 1:
-====== 5-3 CdSセルで明るさ検知する(analogRead) ======+====== 5-3 CdSセルで明るさ検知(analogRead) ======
 デジタル入出力では、0(LOW)か1(HIGH)の2つの値を用い、0であれば0Vの入出力、1であれば5Vの入出力として操作しました。 デジタル入出力では、0(LOW)か1(HIGH)の2つの値を用い、0であれば0Vの入出力、1であれば5Vの入出力として操作しました。
 今回扱うアナログ入力では、0V~5Vまでの電圧変化を"段階的"に読み取ることができます。 今回扱うアナログ入力では、0V~5Vまでの電圧変化を"段階的"に読み取ることができます。
 +  
 ===== CdSセルについて ===== ===== CdSセルについて =====
 {{:gimmickkouza:electronic_basic:5:5-14.png?300|}} {{:gimmickkouza:electronic_basic:5:5-14.png?300|}}
行 11: 行 11:
 光の量が多い(周囲が明るい)場合、抵抗値は下がり電気が流れやすくなります。 光の量が多い(周囲が明るい)場合、抵抗値は下がり電気が流れやすくなります。
 逆に光の量が少なく(周囲が暗く)なると、抵抗値が上がり電気が流れにくくなります。 逆に光の量が少なく(周囲が暗く)なると、抵抗値が上がり電気が流れにくくなります。
 +**超ざっくり言うと光の明るさに反応するセンサです。**
      
 ちなみにカドミウムはEUの法規制であるRoHS指令の規制対象となっています。 ちなみにカドミウムはEUの法規制であるRoHS指令の規制対象となっています。
 (日本国内では2024年6月現在はまだ使用OKです) (日本国内では2024年6月現在はまだ使用OKです)
  
-CdSセルを使った制作物をEUの方が購入したり、購入者がEU外の方であったとしても転居や遠征でEUに持ち込まれるのはNGなので、**販売用の作品には絶対に使わないようにしましょう。**+CdSセルを使った制作物をEUの方が購入したり、購入者がEU外の方であったとしても転居や遠征でEUに持ち込まれるのはNGなので、<text background="danger">**販売用の作品には絶対に使わないようにしましょう。** </text>
 CdSセルの代わりに使える電子パーツには、フォトトランジスタやフォトダイオードなどがあります。 CdSセルの代わりに使える電子パーツには、フォトトランジスタやフォトダイオードなどがあります。
-  + 
 +/*<alert type="danger">光の明るさに反応するセンサですとか言ったほうがわかりやすいですかね</alert>*/ 
      
 ===== 5-3_analogRead ===== ===== 5-3_analogRead =====
行 46: 行 49:
    
         電圧の最大値(Arduinoなら「5」V         電圧の最大値(Arduinoなら「5」V
-  電圧 = ―――――――――――――――――― * 入力された数値+  電圧 = ―――――――――――――――――― × 入力された数値
         ADCの分割数(Arduinoなら「1023」         ADCの分割数(Arduinoなら「1023」
  
 例えばArduinoが「299」という数値を読み取ったとしましょう。 例えばArduinoが「299」という数値を読み取ったとしましょう。
 電圧の計算式は (5 / 1023) * 299 = 1.4613880742913 となり、大体1.46Vくらいの電圧が入力されたことがわかります。 電圧の計算式は (5 / 1023) * 299 = 1.4613880742913 となり、大体1.46Vくらいの電圧が入力されたことがわかります。
 +/* <alert type="danger">* 入力された数値 → × 入力された数値のほうがわかりやすいかも…</alert>*/
      
 ==== 配線図 ==== ==== 配線図 ====
行 59: 行 63:
 CdSセルに極性はありませんので、どちらの脚が5V/GNDに来てもOKです。 CdSセルに極性はありませんので、どちらの脚が5V/GNDに来てもOKです。
 抵抗は10kΩのものを挿してください。 抵抗は10kΩのものを挿してください。
 +
 +===使う部品リスト===
 +^ 部品                                                                  ^ 個数  ^
 +| CdSセル | 1個   |
 +| 抵抗器(10kΩ) | 1個   |
 +/* <alert type="danger">部品表欲しいです。見て何が何個必要かわからないので…</alert>*/
      
 ==== サンプルコード解説 ==== ==== サンプルコード解説 ====
 サンプルコード5-3_analogRead.inoを開いてください。 サンプルコード5-3_analogRead.inoを開いてください。
 +/*<alert type="danger">CDSはCDSpinかcdsPinとかにしたほうがなんのピンか分かりやすくていいと思います</alert>*/
  
 <code> <code>
-int CDS = A0; //変数CDSを作り"アナログ入力ソケット0番"を示す「A0」を代入+int CDSpin = A0; //変数CDSを作り"アナログ入力ソケット0番"を示す「A0」を代入
  
 void setup() { void setup() {
行 72: 行 83:
 void loop() { void loop() {
   int analog_val = 0; //CdSセルで読み取った値を入れる変数を宣言する   int analog_val = 0; //CdSセルで読み取った値を入れる変数を宣言する
-  analog_val = analogRead(CDS);+  analog_val = analogRead(CDSpin);
    //CdS(=A0)の値を読み取り変数analog_valに格納する    //CdS(=A0)の値を読み取り変数analog_valに格納する
    //値は入力電圧をADCで変換した後の0~1023の数値が格納される    //値は入力電圧をADCで変換した後の0~1023の数値が格納される
行 87: 行 98:
 == 1行目 == == 1行目 ==
 <code> <code>
-int CDS = A0; //変数CDSを作り"アナログ入力ソケット0番"を示す「A0」を代入+int CDSpin = A0; //変数CDSを作り"アナログ入力ソケット0番"を示す「A0」を代入
 </code> </code>
 電圧読み取り用のソケットを変数で指定します。アナログ0番なので「A0」です。 電圧読み取り用のソケットを変数で指定します。アナログ0番なので「A0」です。
行 93: 行 104:
 もちろん大丈夫な理由はちゃんとあります。が、本筋から脱線してしまうのでTipsで後述します。 もちろん大丈夫な理由はちゃんとあります。が、本筋から脱線してしまうのでTipsで後述します。
 とりあえず、アナログ入力の場合はint型でもA0~A5という指定が可能です。 とりあえず、アナログ入力の場合はint型でもA0~A5という指定が可能です。
-もちろんint CDS = 0; でも動作します。+もちろんint CDSpin = 0; でも動作します。
 (個人的にはアナログ入力にはA0~A5表記を使用する方が、後から読んだ時の分かりやすさと他のArduinoとの互換性の観点から便利かなと思います) (個人的にはアナログ入力にはA0~A5表記を使用する方が、後から読んだ時の分かりやすさと他のArduinoとの互換性の観点から便利かなと思います)
  
行 111: 行 122:
 == 9行目 == == 9行目 ==
 <code> <code>
-analog_val = analogRead(CDS);+analog_val = analogRead(CDSpin);
 </code> </code>
-本命のアナログ入力です。analogRead(CDS)でA0ソケット挿さったCdSの値を読み取り、これを先程用意した変数analog_valに入れます。+本命のアナログ入力です。analogRead(CDSpin)でA0ソケット挿さったCdSの値を読み取り、これを先程用意した変数analog_valに入れます。
 A0への入力電圧をADCで数値に変換する処理は自動で行われます。なので命令文は不要です。 A0への入力電圧をADCで数値に変換する処理は自動で行われます。なので命令文は不要です。
 analog_valには、変換後の0~1023の数値が格納されます。 analog_valには、変換後の0~1023の数値が格納されます。
行 144: 行 155:
      
 intに「A0」を入力できる種明かしです。 intに「A0」を入力できる種明かしです。
-int CDS = A0; は、変数「CDS」に定数「A0」(の中身の14を)代入するという形を取っています。+int CDSpin = A0; は、変数「CDSpin」に定数「A0」(の中身の14を)代入するという形を取っています。
 定数A0のデータ型はuint8_t型で、これは0~255の整数の値のみを扱える型です。 定数A0のデータ型はuint8_t型で、これは0~255の整数の値のみを扱える型です。
-変数CDSのint型とは異なる型ですが、int型の範囲(R3では-32,768~32,767)の方が広く、uint8_t型の定数A0 の中身「14」にも対応しているため、これを格納することができます。+変数CDSpinのint型とは異なる型ですが、int型の範囲(R3では-32,768~32,767)の方が広く、uint8_t型の定数A0 の中身「14」にも対応しているため、これを格納することができます。
 {{:gimmickkouza:electronic_basic:5:5-16.png?300|}} {{:gimmickkouza:electronic_basic:5:5-16.png?300|}}
      
 そしてanalogRead関数の設定ファイルでは「まず最初に、引数で指定されたソケットの数値が14以上であれば、その数値から14を引く」という処理をすることが定められています。 そしてanalogRead関数の設定ファイルでは「まず最初に、引数で指定されたソケットの数値が14以上であれば、その数値から14を引く」という処理をすることが定められています。
-それによりCDSの中身は「0」となり、無事アナログ0番ピンを指定する仕組みになっています。+それによりCDSpinの中身は「0」となり、無事アナログ0番ピンを指定する仕組みになっています。
      
 Arduinoの裏側には動作を規定する設定ファイルがあることを頭の隅に置いておくと、いつか役に立つ時が来る…かもしれません。 Arduinoの裏側には動作を規定する設定ファイルがあることを頭の隅に置いておくと、いつか役に立つ時が来る…かもしれません。