はりうすブログ (のすけのメモ)

湘南にある小さな会社 代表 ”のすけ”のブログです

ポテンションメーターを使う | 中華で始める Arduino入門日記11

こんにちは、のすけです。

中華で始める Arduino入門日記の11回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

今回のお題

前回は傾きを検出しました。

hollywis.hatenablog.com

今回は、Potentiometerを利用して傾きを検出してみたいと思います。

チュートリアルのchapter9に対応しています。

早速始めましょう。

ポテンションメーターとは

調整つまみがついたデバイスで、回し具合に応じて様々な抵抗にすることができます。

可変抵抗器ですね。

f:id:hollywis:20151209162606j:plain

3つの端子がありますが、両端の2つに基準電圧を掛けて、真ん中の端子で変更された電圧を受けることができます。

回路を作る

両端の端子に5Vの基準電圧をかけます。

そして、真ん中の端子にはアナログのA0ピンを接続します。

f:id:hollywis:20151209163009j:plain

このつなぎ方でアナログ値を観測すれば5V(ボルト)で1023、0V(ボルト)で0を記録するはず。

実は付属のブレッドボードにはポテンションメーターの端子のサイズが微妙に合わなくて刺さりませんでした。

そこで、別途持っていたミニブレッドボード(中華キットには入ってません)を使うといい感じに刺さりました。

簡単なんで回路図は省略。

プログラム

ポテンションメータ(可変抵抗器)からアナログ値を取得し、シリアルモニタに出すだけです。

前回の傾きより、よほど楽ですね。

int potpin = 0 ; 
int val = 0 ; 

void setup()
{
    Serial.begin(9600);
}
void loop()
{
    delay(50);
    val =  analogRead(potpin);
    Serial.println(val) ;
}

つまみを動かすと、0~1023までの値がシリアルモニタに出ました。

応用してみる

前回のティルトスイッチのプログラムを応用して、512以上になったらLEDを光らせてみました。

int apin = 0; //アナログpin5を利用
int ledpin = 13; //LED pin
int threshold = 512; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT); //デジタル pin13を出力設定
    Serial.begin(9600);        // シリアル通信設定
}
void loop()
{
    int pot_read;  //変数pot_readを定義
    while(1)
    {
       pot_read = analogRead(apin); //アナログpin0から電圧を読み取って変数に格納
       Serial.println(pot_read);

       if(pot_read > threshold) 
       {
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
       delay(60);
    }
}

先ほどの回路にpin13と隣のGNDに跨ってLEDを刺しとけばOKです。

なお、ポテンションメーター用のGNDは別のところに移動させます。

f:id:hollywis:20151209170139j:plain

こっちの方が、楽しいですね。

LEDをデジタル出力ではなく、アナログ出力を使えばLEDの明るさを変えたりもできそうですね。

今回はこれでお終いです。

次回は、Photoresistor(明るさ)センサーを使います。

傾きを検出してみる | 中華で始める Arduino入門日記10

こんにちは、のすけです。

中華で始める Arduino入門日記の10回目になります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はブザーを鳴らしました。

hollywis.hatenablog.com

今回は、Tilt switchを利用して傾きを検出してみたいと思います。

早速始めましょう。

Tilt switch(ティルトスイッチ)を知る

Tilt switch(ティルトスイッチ)またはTilt Sencer(傾斜センサー)とも言い、文字通り傾きを検出するための 電子デバイスです。

身近なところでは、スマホで縦に持つのと、横持つのを検出するのにも利用されているのでは ないでしょうか。

こいつです。

f:id:hollywis:20151208124342j:plain

なんかコンデンサみたいな形ですね。

でも、見分けるのは簡単! 振るとカチカチいうのがティルトスイッチです。

どうやって傾きを検出してるの?

ググりました。

どうやら御察しの通り、中に入っている金属のボールが関係しているようです。

内部に接点を4つほど用意して、どの接点と金属のボールが接しているかで場合分けをしているようです。 縦に持つと4つ全てに接するけど、横にすると1つまたは2つしか接しない、などなど。

金属ボールの他に、液体を利用するものなど、様々なティルトスイッチの方式がある感じでした。

繋いでみる

このティルトスイッチには極性はなさそうです。

回路図はこんな感じです。Fritzingというソフトを使って自作してみました。

f:id:hollywis:20151208135130p:plain

使い方は後日別記事で紹介したいと思います。直感的でとても便利でした。

ソフトはこちらからダウンロードできます。 Fritzing Download

ブレッドボードの配線図はこちら。

f:id:hollywis:20151208134837j:plain

デジタルpin8にLEDと220Ωの抵抗をつけます。

アナログpin5にティルトスイッチをつけます。

実際に刺したのはこちら

f:id:hollywis:20151208154705j:plain

プログラム

実はサンプルからかなり修正しています。 分かりにくかったのでピンの指定を外だしにしたり、thresholdの設定が 説明と矛盾していたので修正したりしています。

int apin = 5; //アナログpin5を利用
int ledpin = 8; //LED pin
int threshold = 512; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT);//デジタル pin8を出力設定
}
void loop()
{
    int tilt_read;  //変数tilt_readを定義
    while(1)
    {
       tilt_read = analogRead(apin); //アナログpin5から電圧を読み取って変数に格納
       if(tilt_read > threshold) //512より上なら(2.5V)
       {
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
    }
}

analogReadでアナログpin5から値を受け取り、一定値以上だったら LEDが光ります。

analogReadで取得できる値は0~1023なので512はちょうど真ん中あたりです。 (5VのPOWERに接続しているので2.5V相当ですね)

やってみる

横にしてみたり

f:id:hollywis:20151208160447j:plain

戻してみたり

f:id:hollywis:20151208160451j:plain

また倒してみたり。。。

f:id:hollywis:20151208160456j:plain

LED変わらないんですけどーーーーーーー。

デバッグだっ!

これは、アナログの入力値をチェックしてみないことには何もわかりませんね。

前回やったシリアル出力でデバックしてみます。

int apin = 5; //アナログpin5を利用
int ledpin = 8; //LED pin
int threshold = 512; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT); //デジタル pin8を出力設定
    Serial.begin(9600);        // シリアル通信設定
}
void loop()
{
    int tilt_read;  //変数tilt_readを定義
    while(1)
    {
       tilt_read = analogRead(apin); //アナログpin5から電圧を読み取って変数に格納
       Serial.println(tilt_read);

       if(tilt_read > threshold) //512より上なら(2.5V)
       {
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
    }
}

そして、実行後にシリアルモニタを開いてみると、、

はやっ

ものすごいスピードで、電圧が変わっていることがわかります。 しかも値が512超え、512以下を繰り返していました。

つまり、超高速で点滅しているため結局LEDがついているようにしか見えない!

ということのようです。

果てしない検証の結果

アナログピンを色々変えてみたり、ティルトスイッチを抜いてみたり、閾値を変えてみたり、delayを入れてみたりとしながら シリアルモニタと睨めっこしてデバックを繰り返しました。

その結果、私の環境での設定値はこれじゃね? というのが出ました。

  • thresholdは900

  • 最後にdelayを60ms入れる

最終プログラムはこちら

int apin = 5; //アナログpin5を利用
int ledpin = 8; //LED pin
int threshold = 900; //閾値

void setup()
{
    pinMode(ledpin,OUTPUT); //デジタル pin8を出力設定
    Serial.begin(9600);        // シリアル通信設定
}
void loop()
{
    int tilt_read;  //変数tilt_readを定義
    while(1)
    {
       tilt_read = analogRead(apin); //アナログpin5から電圧を読み取って変数に格納
       Serial.println(tilt_read);

       if(tilt_read > threshold) 
       {
          digitalWrite(ledpin,HIGH);//led点灯
       }
       else //それ以外の場合
       {
          digitalWrite(ledpin,LOW);//led消灯
       }
       delay(60);
    }
}

どうがんばっても、傾けた状態でも1023の電圧を記録してしまうため傾けたら点滅 、普通の状態なら安定して点灯くらいまでしか出来ませんでした。

パーツが悪いのか、私の配線が悪いのか、プログラムが悪いのか。。

どうせLEDが点くか消えるかの2値なんだから、わざわざアナログ値を1024段階取得する意味はあまりない気がしますが。

ふぅ、お疲れ様でした。

次回はチャプター9のPotentiometer(回転角による可変抵抗器)を使ってみたいと思います。

1才児までなら泣かせられるLEDチカチカモンスターを作る | さいぞうのArduino初心者日記4

f:id:hollywis:20151208001943p:plain

こんばんは。

さいぞうです。

ちょっと間が空いてしまいましたが、Arduinoチュートリアルを一歩一歩やっていく連載記事の3つめです。

今回は、LEDをチカチカさせよう。

続きを読む

中華で始める Arduino入門日記9 ブザーを鳴らす

こんにちは、のすけです。

中華で始める Arduino入門日記の9回目です。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

中華で始める Arduino入門日記、前回は信号機を作りました。

hollywis.hatenablog.com

今回はついにLEDを卒業して、次なるデバイスである「ブザー」に挑戦です。

ブザーを確認する

こちらの丸っぽい黒いのがブザーです。

f:id:hollywis:20151204184505j:plain

中華キットにもちゃんと入っていました。 これまでの、Arduinoの動きにも特に問題ありませんし、中華キットいいですね!

利用しているキットに近いやつは⇩

ブザーの真ん中に小さな穴が開いています。おそらくここから音が出るのでしょう。

ちなみにブザーというは

The buzzer is one integrated electronic transducers, DC voltage supply, widely used in computers, printers, copiers, alarm, electronic toys, automotive electronic equipment, telephones, timers and other electronic products for sound devices.

DC(直流)電圧で動く、コンピュータ、プリンタ、複写機、アラーム、電子玩具などなど、様々な機器の音源装置としてつかわれているそうです。

なおブザーには2種類あって、裏が黒いのがアクティブブザー、基盤が出てるのがパッシブブザーらしい。高さも1mm違う。

f:id:hollywis:20151204191137j:plain

MULTIMETERで抵抗値を測ったらパッシブブザーが14.4Ω、アクティブブザーが23.3MΩでした。

ちなみに、表側に薄っすらと⊕ のマークがあり、極性があるようですので間違えないように通電したいですね。

接続してみる

Digitalピン13に直接つないでokとのことなので、ダイレクトに繋いでしまいます。 f:id:hollywis:20151204191232j:plain

繋ぎ方は

pin13 - ブザー - GND

プラス・マイナスを間違えないように気をつけましょう。

int buzzer=13;  //ブザーに使うピン
void setup()
{
  pinMode(buzzer,OUTPUT);  //デジタルピンを出力に設定
}
void loop()
{
  unsigned char i,j;
  while(1)
  {
    for(i=0;i<80;i++)
    {
      digitalWrite(buzzer,HIGH);  //鳴らす
      delay(1);
      digitalWrite(buzzer,LOW);
      delay(1);
    }
    for(i=0;i<100;i++)
    {
      digitalWrite(buzzer,HIGH);  //鳴らす
      delay(2);
      digitalWrite(buzzer,LOW);
      delay(2);
    }
  }
}

なぜかサンプルコードはpin7を使っていたので、プログラムの方をpin13を使うように 修正しました。

やってみる

すいません。うるさすぎて、録画できませんでした。

かなりうるさくて、驚きました。

ただ、

for(i=0;i<80;i++)
    {
      digitalWrite(buzzer,HIGH);  //鳴らす
      delay(1);
      digitalWrite(buzzer,LOW);
      delay(1);
    }

for(i=0;i<100;i++)
    {
      digitalWrite(buzzer,HIGH);  //鳴らす
      delay(2);
      digitalWrite(buzzer,LOW);
      delay(2);
    }

では音の高さが違う感じでした。間のdelayの違いだと思います。

また、アクティブブザーとパッシブブザーでも音が違いました。

音については是非、実際にやってみて確認してください。

ただし、かなり耳につく音ですので、周りに気をつけて鳴らしましょう!

次回は傾きセンサーを使います。チュートリアルの「Chapter8 Tilt switch」の部分です。

中華で始める Arduino入門日記8 LEDで信号機を作る

こんにちは、のすけです。 中華で始めるArduino入門 8回目の今回は、信号機を作ります。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はLEDをクリスマスツリーっぽく光らせました。

今回はArduino チュートリアルの「Chapter6 Traffic light」になります。

回路

前回のやつから、LEDを半分抜いて、順番を信号機のように赤・黄・緑にします。 そして、利用するピンは10,7,4にそれぞれ接続します。

簡単ですね。

f:id:hollywis:20151204183013j:plain

プログラム

int ledred=10;   
int ledyellow=7; 
int ledgreen=4; 
void setup()
{
   pinMode(ledred,OUTPUT);
   pinMode(ledyellow,OUTPUT);
   pinMode(ledgreen,OUTPUT);
}
void loop()
{
   digitalWrite(ledred,HIGH);
   delay(1000);
   digitalWrite(ledred,LOW);
   digitalWrite(ledyellow,HIGH);
   delay(200);
   digitalWrite(ledyellow,LOW);
   digitalWrite(ledgreen,HIGH);
   delay(1000);
   digitalWrite(ledgreen,LOW);
}

特に目新しいことはありませんね。 実際の信号機のように黄色が一瞬だけ光るようにdelay調整しているところにセンスを感じます。

結果

次回はブザーを鳴らします、「Chapter7 Buzzer」の内容に相当します。

中華で始める Arduino入門日記7 LEDをクリスマスツリーっぽく光らせる

のすけです。 中華で始めるシリーズも今回で7回目ですね。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はロウソクのようにLEDを付けました。

hollywis.hatenablog.com

今回は、たくさんの色々なLEDをくっ付けてプログラムで制御します。

チュートリアルのチャプター5 Advertising LEDになります。

回路図

f:id:hollywis:20151203174151p:plain *出展:SainSmartチュートリアル

よく見えませんが、ArduinoのDigitalピン0~5にそれぞれLEDを付けろという ものになります。

配線例がこちら f:id:hollywis:20151203174326p:plain *出展:SainSmartチュートリアル

なんか、複雑ですねぇ。。。

ブレッドボードで作ってみる

f:id:hollywis:20151203174559j:plain

配線例が無駄に複雑っぽかったので、簡略化しました。

材料はこちら

  • LED 6個(赤、黄、緑)

  • 抵抗220Ω 6個

  • ジャンパーコード 7本

配線は次のように繋げます。

  • ピン0 - 220Ω - LED(緑) - GND

  • ピン1 - 220Ω - LED(黄) - GND

  • ピン2 - 220Ω - LED(赤) - GND

  • ピン3- 220Ω - LED(赤) - GND

  • ピン4 - 220Ω - LED(黄) - GND

  • ピン5 - 220Ω - LED(緑) - GND

f:id:hollywis:20151203175139j:plain

つなげてみました。

お気づきかもしれませんが、なぜか右2つのピン0,ピン1に接続している LEDが付いてます。

特にHIGHに設定していないのですが。。。よく分かりません。

プログラム

int Led1 = 1;
int Led2 = 2;
int Led3 = 3;
int Led4 = 4;
int Led5 = 5;
int Led6 = 6;

// 光り方1
// LEDが順に光り(HIGH)に、順に消える(LOW)
void style_1(void)
{
  unsigned char j;
  for(j=1;j<=6;j++)
  {
    digitalWrite(j,HIGH);
    delay(200);
  }
  for(j=6;j>=1;j--)
  {
    digitalWrite(j,LOW);
    delay(200);
  } 
}

// フラッシュ
// LEDが全て光り(HIGH)、全て消える(LOW)
void flash(void)
{   
  unsigned char j,k;
  for(k=0;k<=1;k++)
  {
    for(j=1;j<=6;j++)
      digitalWrite(j,HIGH);
    delay(200);
    for(j=1;j<=6;j++)
      digitalWrite(j,LOW);
    delay(200);
  }
}

// 光り方2
void style_2(void)
{
  unsigned char j,k;
  k=1;
  for(j=3;j>=1;j--)
  {   
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    k +=2;
  }
  k=5;
  for(j=1;j<=3;j++)
  {
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    delay(400);
    k -=2;
  }
}

// 光り方3 
void style_3(void)
{
  unsigned char j,k;
  k=5;
  for(j=1;j<=3;j++)
  {
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    k -=2;
  }
  k=3;
  for(j=2;j>=1;j--)
  {   
    digitalWrite(j,HIGH);
    digitalWrite(j+k,HIGH);
    delay(400);
    digitalWrite(j,LOW);
    digitalWrite(j+k,LOW);
    k +=2;
  } 
}
void setup()
{ 
  unsigned char i;
  for(i=1;i<=6;i++)
    pinMode(i,OUTPUT);
}
void loop()
{   
  style_1();
  flash();
  style_2();
  flash();
  style_3();
  flash();
}

やってみた(でも何か変)

光りましたね。でも、一番右のLEDおかしくないですか?

ずっと光ってます。

よくよくコードを見ると

int Led1 = 1;
int Led2 = 2;
int Led3 = 3;
int Led4 = 4;
int Led5 = 5;
int Led6 = 6;

となっていますね。

ずれてるじゃん!!SainSmartのサンプルコードは図とずれているようですね。 修正しましょう。

0ピンはなぜかデフォルトでHIGHになっているっぽいので、使わないでサンプルコードの通り 1~6ピンを使うようにずらします。

f:id:hollywis:20151203182220j:plain

そして、実行すると。。

クリスマスツリーのLED照明とかに似ている感じだ。

1.右から順に光って戻る style_1

2.フラッシュ flush

3.黄赤緑の順に光る style_2

4.フラッシュ flush

5.緑赤黄の順に光る style_3

6.フラッシュ flush

このような順で実行されていました。上手く動いているようです。

  • ピン1,6が緑

  • ピン2,5が赤

  • ピン3,4が黄

これを意識しながらfor文で光り方を設定後delayを追加という流れで、それぞれの光り方を設定している訳ですね。

setup部の

for(i=1;i<=6;i++)
    pinMode(i,OUTPUT);

で一括でDigitalピンを出力設定しています。

次回は「Traffic light」信号機をやります。

中華で始める Arduino入門日記6 LEDをロウソクのように瞬かせる

こんにちは、のすけです。

中華で始める Arduino入門日記の6回目です。

この連載は、爆安の中華製のArduino互換機を入手し、色々と苦しみながらも安い互換機でArduinoを学習してしまおうというものです。 入手の話はこちらから。

hollywis.hatenablog.com

本題

前回はブレッドボードを利用して、LEDをチカチカさせました。

hollywis.hatenablog.com

今回はなんと!チカチカではなくほわほわとロウソクのように瞬かせてみたいと思います。

できるんですねぇ、そんなことが。チュートリアルの5章 PWMになります。

では早速やってみましょう。

利用しているキットに近い奴は⇩

アナログ値(PWM)を扱う

指定したピンからアナログ値(PWM波)を出力することができるようです。

何が嬉しいかと言うと、LEDの明るさや、モータの回転スピードなどを調整する時に利用できるとのこと

制御できる段階は256段階(0~255)で、かなり細かく制御できるようですね。

ただし、制御できるDigital I/Oピンは決まっているそうで、3,5,6,9,10,11ピンだけだそうです。

利用方法

analogWrite関数というものが用意されています

実行されるともう一度analogWriteをしたりするまで、安定した矩形波が出力される模様。 周波数はだいたい500Hzだそうです。

ちょっとよくわからないので、ググりました。

矩形波(くけいは、Square wave)とは非正弦波形の基本的な一種であり、電子工学や信号処理の分野で広く使われている。 理想的な矩形波は2レベルの間を規則的かつ瞬間的に変化するが、その2レベルにはゼロが含まれることも含まれないこともある。 方形波とも呼ばれる。

https://upload.wikimedia.org/wikipedia/commons/thumb/0/0a/Synthesis_square.gif/350px-Synthesis_square.gif

by Wikipedia

うん。まだよくわからないけど。

電気を瞬間的にオンにしたりオフにしたりを規則的にすると矩形波になって

オンの時間とオフの時間を調整することで、電圧を擬似的に出力の最大値から256段階に分割していると

だから、抵抗とかを調整しなくても、LEDを明るくしたり暗くしたりができると。

そんな理解でいいのかな?

なるほど便利そうだ。

回路

実は前回と一緒です。9ピンを使います。

緑のジャンパーコードを差した状態を利用します。

f:id:hollywis:20151201185021j:plain

サンプルプログラム

プログラムはこちら。

int led = 9;           // LEDピンを設定
int brightness = 0;    // LEDの明るさ
int fadeAmount = 5;    // LEDの調光段階値

void setup() {
  // 9ピンに設定
  pinMode(led, OUTPUT);
}

void loop() {
  // 9ピンの明るさを設定
  analogWrite(led, brightness);

  // 明るさを変更
  brightness = brightness + fadeAmount;

  // 調光の方向を逆にする
  if (brightness == 0 || brightness == 255) {
    fadeAmount = -fadeAmount ;
  }
  // 調光のために30ミリ秒のwaitを追加
  delay(30);
}

analogWrite()というのが望む電圧を作るやつですな。

loopの度に設定し直していると。

0~255まで設定できるんだけど、1づつ調整してたら面倒だからfadeAmountで5づつ調整する設定にしていると。

if (brightness == 0 || brightness == 255) { fadeAmount = -fadeAmount ; } 最初はどんどん増えていくんだけど、255まで来たらもう増やせないから、255の時は-5づつ調整するようにモードを変更していると。 逆に0になったらまた5づつ増えるようにもなっていますね。

最後に30ミリ秒の待ちを入れて、いい感じの調光速度にしていると。

やってみた

お分りいただけるだろうか。チカチカではなく、ほわほわ光っているのが。

ロウソクか?と言われると微妙ですが、もう少しチューニングすればイケそうなレベルですね。

delayとかを調整して遊んでみると良いかと思います。 お試しください。

hollywis.hatenablog.com