電子工作初心者のArduino

ずぶの素人が電子工作にチャレンジします。

Arduinoで傾きスイッチを使う

今回は初めてセンサの記事。

 

チルトスイッチ(tilt switch)という傾きを検知してON-OFFを切り替えるスイッチを使ってみた。

一定以上の傾きを与えるとスイッチ内の導通がOFFになる仕組み。

動作原理は大きく分けて水銀式と非水銀式があり、安全性の観点から現在は水銀式はあまり用いられない。

ja.wikipedia.org

 

非水銀式は内部に金属製のボールが仕込まれており、傾きに応じて内部でボールの位置が変わることをスイッチに利用している。

以下は秋月電子通商よりチルトスイッチAT407の動作原理の説明図を拝借。

https://akizukidenshi.com/download/ds/switronic/AT407_j.pdf

 

今回使ったのはAuduino MEGA2560スターターキット付属のチルトボールスイッチ。

ふむ、確かに傾けるとカチッと音が鳴る。

 

 

スケッチは超単純。

```

const int ledPin = 13;

void setup()
{
  pinMode(ledPin,OUTPUT);
  pinMode(2,INPUT);
  digitalWrite(2, HIGH);
}
 
void loop()
{  
  int digitalVal = digitalRead(2);
  if(HIGH == digitalVal)
  {
    digitalWrite(ledPin,LOW);
  }
  else
  {
    digitalWrite(ledPin,HIGH);
  }
}
/**********************************************/
```
チルトスイッチを2番ピンとGNDに接続し、2番ピンのINPUTがHIGHの場合に内蔵LEDを光らせる。
 

スイッチON

スイッチOFF

 

スイッチONのときだけ内蔵LEDが光っている。

Arduinoでアナログ出力

牛歩すぎてもう… ブログ初めて10日でまだLEDやってる。

さて今回は、LEDにアナログ信号を送り明るさを変化させてみる。

使用したのは ・RGB LED ・抵抗(330Ω) x3

RGB LEDhttps://akizukidenshi.com/catalog/g/gI-03037/

RGB LEDには4本のリード線があり、一番長いのがGND、それ以外がR(赤)、G(緑)、B(青)の内蔵されたLEDに対応している。 個々のLEDに対するアナログ信号を連続的に制御することで、綺麗なイルミネーションができるというわけだ。

無数にある光の色のうち、特に、赤(Red)緑(Green)青(Blue)の3色を、目に見える光の中での、最も基本の色として「光の三原色」と呼んでいます。 これは、このわずか3つの色の組み合わせで、この世に存在するほとんど全ての色を作り出すことができるためです。

RGBの3色ですべての色が作れるということは、実はたいへん重要な意味があります。 例えばパソコンやテレビや携帯(けいたい)電話のディスプレイにカラー写真を表示する時、この3つの色についてだけ、どれだけの明るさで表示すればよいかの計算をしておけばすむわけです。 ディスプレイの画面を拡大して観察するとこの3色で表示されていることが確認できます。

https://global.canon/ja/technology/kids/mystery/m_04_02.html

さて、アナログ出力と言ったが、実はArduinoで制御しているのはPWM(Pulse Width Modulation)信号という疑似アナログ信号である。

ローム社のHPから図と説明を引用すると、

PWM(Pulse Width Modulation)信号とは、パルス幅を変えることで、FETなどの素子に流れる電流の時間を変化させ、ヒーターやモーターを制御する信号

である。

電圧High(H)とLow(L)の状態を一定のパルス周期で繰り返し、実効的な印可電圧を制御している。

https://www.rohm.co.jp/electronics-basics/micon/mi_what11#:~:text=PWM%EF%BC%88Pulse%20Width%20Modulation%EF%BC%89%E4%BF%A1%E5%8F%B7,%E4%BF%A1%E5%8F%B7%E3%82%82%E5%90%AB%E3%81%BE%E3%82%8C%E3%81%BE%E3%81%99%E3%80%82

つまり、実際は電圧High状態の時間とLow状態の時間で高速でLEDが明滅しているのだが、人間の目にはそれを認識できないため、明るさが変化しているかのように見える。

今回の回路とスケッチはこんな感じ。

https://wokwi.com/

// ピンの定義
#define BLUE 3
#define GREEN 5
#define RED 6

void setup()
{
pinMode(RED, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BLUE, OUTPUT);
digitalWrite(RED, HIGH);
digitalWrite(GREEN, LOW);
digitalWrite(BLUE, LOW);
}

// define variables
int redValue;
int greenValue;
int blueValue;

// main loop
void loop()
{
#define delayTime 10 // 次の色に変化するまでの時間

redValue = 255;
greenValue = 0;
blueValue = 0;


for(int i = 0; i < 255; i += 1) // i=0-254で赤から緑に段階的に色が変化する
{
redValue -= 1;
greenValue += 1;

analogWrite(RED, redValue);
analogWrite(GREEN, greenValue);
delay(delayTime);
}

redValue = 0;
greenValue = 255;
blueValue = 0;

for(int i = 0; i < 255; i += 1) // i=0-254で緑から青に段階的に色が変化する
{
greenValue -= 1;
blueValue += 1;

analogWrite(GREEN, greenValue);
analogWrite(BLUE, blueValue);
delay(delayTime);
}

redValue = 0;
greenValue = 0;
blueValue = 255;

for(int i = 0; i < 255; i += 1) // i=0-254で青から赤に段階的に色が変化する
{
blueValue -= 1;
redValue += 1;

analogWrite(BLUE, blueValue);
analogWrite(RED, redValue);
delay(delayTime);
}
}

loop部は3つのセクションに分かれていて、すべて同様の動作をさせている。 初めは赤→緑に段階的に色を変化させる。 アナログ出力の制御にはanalogWrite()関数を使用する。

analogWrite(ピン番号, DUTY比);

とすることで、アナログ出力を決定する。DUTY比は0-254の整数値である。

初めのセクションでは、赤の出力値を255、緑、青を0として、 forループ内で赤を-1、緑を+1してアナログ出力したのち、 delayTimeだけ待機して次のステップに移る、ということをしている。 2つめ、3つめのセクションについても同様。

LEDの設計の仕方

LED回路の設計の仕方をちゃんと調べてみた。

下記サイトが参考になった。

www.marutsu.co.jp

 

 

LEDは2つの極性(アノード:A、カソード:K)があり、アノードに電源のプラス側を接続すれば電流が流れて点灯する。カソード側に電流が流れるような接続(直流電源のプラス側をカソード側につないだり、交流をそのまま流したりする)は素子破壊につながるのでNG。

また、LEDには最大定格電流、最大定格電圧があり、過大電流が流れないための保護抵抗が必要。

 

https://www.my-craft.jp/html/aboutled/led_kyokusei.html

 

 

 

上の回路のように電源に抵抗とLEDを直流につなぐ。

LEDに5mAを流したいとき、抵抗値Rはいくつを選べばよいか。

V=5V, データシートのVF値は規定の電流値20mAで1.8Vとする。

 

回路方程式より、

V=RIf + Vf

20mAのときのVf=1.8Vを仮のVfとして計算する。

R = (V-Vf)/If = (5 - 1.8)V/20mA = 240Ω...(答)

 

 

目標電流と、条件IFにおける仮のVf値で仮の抵抗値Rを選ぶという理解でいいかな。

上のHPにはもっと踏み込んだことが書いてあったけど、今回はここまで。 

ArduinoでLチカ

兎にも角にもLチカ。

電子工作分野の"Hello World"的なものらしい。

参考書に従って、330Ωの抵抗をかませてLEDを13番ピンに繋いで、それをGNDに落として… Arduino IDEのスケッチ例から01.Basics>Blinkを選択。 以下のコードをそのままArduinoに書き込む。

// the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
}

// the loop function runs over and over again forever
void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

おお…点いた…

ただ、上のコード実はよくわかってない。 LED_BUILTINってなんやねん。

ということで調べてみたらわかりやすい記事があった。 pinMode()関数は、Arduinoにピンの状態を指定する関数。 Arduinoボード上に標準搭載されているLED(上の画像でオレンジ色に光っている)の状態をOUTPUTにするのが、Arduino Mega 2560では13番ピンが対応している。 ボードによって割り付けられているピンが違うので、サンプルコードではこんな書き方をしている。

qiita.com

ふむふむ。

初心者がArduinoで電子工作を始めた

かねてから興味のあった電子工作を始めることにした。

大した動機もないんだが、いつか自分の子どもの喜ぶおもちゃなんか作れたらなーなんて軽い気持ちで。

そんなノリで秋葉原秋月電子通商に行って「おススメとかないすかー?」って聞いたら、「作りたいものとかないと何とも…」の一点張りでなんにも教えてもらえず、見事に出鼻をくじかれた。

それでもめげず、Amazonでスターターキットとマルチメーターをぽちった。

 

 

 

 

どうやら純正Aruduinoではなく互換品らしい。まあいいだろう。

マルチメータはめちゃ薄でコンパクトで超いい感じ。

コレだけそろってやく1万円。大人のおもちゃ(変な意味ではなく)としてはお手頃ね。

参考書は、工作例がいろいろ載っていて、初歩からいろいろ学べそうな『実践Arduino! 電子工作でアイデアを形にしよう』(平原 真  著)を選定した。

 

 

ぼちぼち触っていこう。