わかめの開発日記

ArduinoやRaspberry Pi で作ったものを紹介します

LCDモジュールに文字を表示させる

f:id:wakamelab:20201004132233j:plain

Arduinoを使って、液晶ディスプレイに文字を表示させる方法

こんにちは、wakamelabです。
Arduinoと1602AのキャラクLCDモジュールを使って文字を表示させる方法を紹介します。

使用するもの

Arduino UNO 本体:1個
・USBケーブル:1本
・液晶ディスプレイモジュール 1602A:1個
・ブレッドボード:1個
・ジャンパーワイヤ(オス-オス):16本
・20kΩ可変抵抗:1個

使用する液晶ディスプレイモジュールの紹介

液晶ディスプレイ(Liquid Crystal Display)、通称LCDについて説明します。
1602Aはキャラクタディスプレイという、英数字や記号を表示できるタイプのLCDです。
1602Aからは16個の端子が出ており、この端子に信号を送ることでLCDに文字を表示させることが出来ます。
それぞれの端子の意味は以下の表のとおりです。

f:id:wakamelab:20201004154343p:plain

PIN No.1 VSS : グランドです。ArduinoのGND端子と接続します。
PIN No.2 VDD : 電源端子です。Arduinoの5V端子と接続します。
PIN No.3 VO : コントラスト調整用の端子です。抵抗を介してグランドと接続しその抵抗値によって、コントラストを調整します。
PIN No.4 RS : レジスタ選択用の端子です。Highを与えることでデータレジスタLowを与えることで制御レジスタを選択します。LCDに表示させる文字を送信するときはデータレジスタを使いLCDを制御するコマンドを送信するときは制御レジスタを使います。
PIN No.5 R/W : 読み込み(Read)、書き込み(Write)の切り替え端子です。ArduinoからLCDに表示させる文字を制御するので、書き込みを使用します。
PIN No.6 E : コマンドやデータの読み書きのタイミングを計るための端子です。ここが、Low → Highとなることで、制御が実行されます。
PIN No.7 ~ 14 DB0 ~ DB7 : データを送受信するための端子です。8bitモードで制御する場合は全ての端子を使用しますが、今回は4bitモードで制御するため、上位4bit(DB4~7)を使用します。
PIN No.15 A : LCDのバックライトの電源です。5Vに接続して使用します。
PIN No.16 K : LCDのバックライトのグランドです。GNDに接続して使用します。

LCD制御のためのライブラリ

LCDに文字を表示させるためには、上で紹介した端子に対して、キッチリとタイミングを計って適切な信号を送る必要があり、制御はやや複雑です。
しかし、Arduinoではこの細かな制御を気にせずにLCDを制御することができるイブラリが用意されています。
ライブラリの豊富さがArduinoの良い所ですね。
ライブラリを使うことで、開発のスピードを飛躍的に上げることが出来ます。
ではライブラリの紹介していきます。
使用するライブラリは"LiquidCrystal.h"というライブラリです。

LiquidCrystal lcd (rs, enable, d4, d5, d6, d7)

LiquidCrystal型の変数を宣言するために使用します。
引数にはそれぞれ、rs : RSに接続したピン、enable : E に接続したピン
d4 ~ d7 : D4 ~ D7に接続したピン番号を指定します。

lcd.begin(cols, rows)

ディスプレイの桁数と行数を指定するために使用します。
引数にはそれぞれ、cols : 桁数、rows : 行数を指定します。
1602A は、横16文字の縦2行であるため、cols : 16、rows : 2 として使用します。

lcd.clear()

LCDの画面をクリアし、カーソルを左上の角に移動させるために使用します。

lcd.print(data)

LCDに文字を表示させるために使用します。
引数:data に指定した文字を表示させることが出来ます。

LCDに文字を表示させるプログラム

ライブラリの使い方も分かった所で、文字を表示させるプログラムを書いていきましょう。
紹介するプログラムは、シリアル通信を使いArduinoに送信した文字をLCDに表示させるプログラムです。

#include <LiquidCrystal.h>

#define RS 4
#define E  6
#define DB4 10
#define DB5 11
#define DB6 12
#define DB7 13
#define MAX_LEN 17

char char_buf[MAX_LEN];
byte cursol = 0;

LiquidCrystal lcd(RS, E, DB4, DB5, DB6, DB7);

void setup() {

  lcd.begin( 16, 2 );
  lcd.clear();
  lcd.setCursor(0, cursol);
  lcd.print("Wait for input");
  Serial.begin(9600);
}

void change_cursol(void) {
  cursol = 1 - cursol;
}

void clr_display(byte t_cursol) {
  lcd.setCursor(0, t_cursol);
  lcd.print("                ");  //16文字の空白を表示させることで1行消去
}

void get_char(void) {
  int data_size;
  int i;

  delay(100); // データ受信待ち
  clr_display(cursol);  // 書き込み前に前の文字を消去
  data_size = Serial.available();  // 文字数を取得

  if (data_size <= MAX_LEN) {
    for (i = 0; i < data_size; i++) {
      char_buf[i] = Serial.read();
      if (i != (data_size - 1)) {
        lcd.setCursor(i, cursol);
        lcd.print(char_buf[i]);
      }
    }
    change_cursol();
  } else {
    lcd.setCursor(0, cursol);
    lcd.print("too long");
    for (i = 0; i < data_size; i++) {
      Serial.read(); // 受信データを削除
    }
  }
}

void loop() {
  if (Serial.available() != 0) {
    get_char();
  }
  delay(500);
}

ではここからはプログラムの内容を説明します。

  #include <LiquidCrystal.h>

LiquidCrystal.h ライブラリのインクルードを宣言しています。
インクルードすることで、指定したライブラリを使用することができます。

  #define RS 4
  #define E  6
  #define DB4 10
  #define DB5 11
  #define DB6 12
  #define DB7 13

LCDの制御に使用するピンを定義しています。
上で紹介したLCDの端子と対応しており、それぞれ
Arduinoの4番ピン:LCDのRS端子と接続
Arduinoの6番ピン:LCDのE端子と接続
Arduinoの10~13番ピン:LCDのDB4~DB7端子と接続しています。

  #define MAX_LEN 17

受信可能な最大文字数を定義しています。
1602Aは16行表示できるため、16文字+改行コード1つで17文字を最大文字数としています。

LiquidCrystal lcd(RS, E, DB4, DB5, DB6, DB7);

ライブラリの紹介で説明した通り、LiquidCrystal型の変数 lcd を宣言しています。

void setup() {

  lcd.begin( 16, 2 );
  lcd.clear();
  lcd.setCursor(0, cursol);
  lcd.print("Wait for input");
  Serial.begin(9600);
}

ここではArduinoの初期設定を行っています。
lcd.begin( 16, 2 )で16×2のLCDを使用する宣言を行い、lcd.clear()でディスプレイを一度初期化します。
lcd.setCursor(0, cursol)でカーソルの位置を左上に移動し(変数cursolの初期値は0のため、カーソルは左上に行きます)、lcd.print("Wait for input")でLCDにWait for inputと表示します。
シリアル通信を使って表示させる文字を入力するために、Serial.begin(9600)で9600bpsの通信を開始します。

void change_cursol(void) {
  cursol = 1 - cursol;
}

カーソルの位置を上下変更するための関数です。

void clr_display(byte t_cursol) {
  lcd.setCursor(0, t_cursol);
  lcd.print("                ");  //16文字の空白を表示させることで1行消去
}

指定した1行の表示内容を消すための関数です。lcd.clear()を使うと、LCD全体を消してしまいますがこの関数を使うことで指定した行数のみの内容を消すことができます。

void get_char(void) {
  int data_size;
  int i;

  delay(100); // データ受信待ち
  clr_display(cursol);  // 書き込み前に前の文字を消去
  data_size = Serial.available();  // 文字数を取得

  if (data_size <= MAX_LEN) {
    for (i = 0; i < data_size; i++) {
      char_buf[i] = Serial.read();
      if (i != (data_size - 1)) {
        lcd.setCursor(i, cursol);
        lcd.print(char_buf[i]);
      }
    }
    change_cursol();
  } else {
    lcd.setCursor(0, cursol);
    lcd.print("too long");
    for (i = 0; i < data_size; i++) {
      Serial.read(); // 受信データを削除
    }
  }
}

受信した文字を取得し、LCDに表示させるための関数です。
まず先頭のdelay()関数で、文字を完全に取得するまでの間待機します。
次にclr_display()関数によって、これから文字を表示させようとしている行に今書かれている内容を消します。
Serial.available()関数を使い受信した文字数を確認し、文字数が最大文字数の16文字以下であれば受信した文字を表示し、最大文字数を超えていれば"too long"と表示します。
受信した文字の末尾には改行コードが入っているため、LCDに表示させるのは受信した文字の最後から1つ前までです。

void loop() {
  if (Serial.available() != 0) {
    get_char();
  }
  delay(500);
}

Arduinoのループ処理で、シリアル通信から文字を受信するのを待っています。受信すると先ほど紹介した上の処理に入ります。

配線図の紹介

f:id:wakamelab:20201011161530j:plain

配線はこのような形です。

プログラムの実行

プログラムをArduinoに書き込み、シリアルモニタを開いてください。
シリアルモニタ上に文字を入力し、それがLCDに表示されれば成功です。

f:id:wakamelab:20201018133433p:plain

Arduino デジタル時計製作キットの紹介

当社では、Arduinoを使用した、プログラミング、電子工作初心者向けの学習キットを販売しております。
この記事に記載したLCDを使ってデジタル時計を作製するキットもありますので、ご興味あればご購入をお願い致します。

ホームページ:
www.wakamelab.com

販売サイト:https://wakamelab.thebase.in/items/28202226

メルカリ:https://www.mercari.com/jp/u/170119900/

Arduinoを使って距離を測定する

f:id:wakamelab:20200912175136j:plain

超音波センサーを使った距離の測定方法

こんにちは、wakamelabです。
Arduinoと超音波センサー HC-SR04を使って物体との距離を測定する方法を紹介します。

使用するもの

Arduino UNO 本体:1個
・USBケーブル:1本
・超音波センサー HC-SR04:1個
・ブレッドボード:1個
・ジャンパーワイヤ(オス-オス):6本

超音波とは

超音波とは人間の耳では聞き取ることが出来ない高い音のことを言います。
人間の耳で聞こえないだけであり、物理的な性質は人間の耳で聴くことが出来る可聴音と同じです。
人間の耳で聴きとれる可聴域は一般的に20Hz~20000Hzと言われており、超音波はそれよりも高い音のことを言います。
自然界ではコウモリやイルカが周囲の状況を把握するために使用しています。
私たちの身の回りでは、自動ドアのセンサーや自動で水が出る蛇口のセンサー等に使われており、超音波は非常に身近な存在です。

超音波を使って距離を測定する方法は、放出した超音波が物体に反射して戻ってくる時間を利用しています。
戻ってくるのにかかった時間に音速を掛けることで求めることができます。
図で説明すると、以下のようになります。
f:id:wakamelab:20200907004322p:plain

超音波センサー HC-SR04 について

f:id:wakamelab:20200907003615j:plain

では使用する超音波センサーについて説明します。
このHC-SR04は安価で使用方法も確立されていることから電子工作では非常によく使用されるセンサーです。
このセンサーは 40000Hz の超音波を使用します。
このセンサーの"T"と書かれた方から超音波を放出し、"R"と書かれた方で返ってきた超音波を検出します。
f:id:wakamelab:20200907004606p:plain

ピンアサインは以下のようになっています。
f:id:wakamelab:20200907004659p:plain
VCCピンにArduinoの5V端子、GNDピンにArduinoのGND端子を接続して使用します。
TrigピンへHIGH→LOWのパルスを与えると、超音波センサーから超音波が放出されます。
超音波放出と同時に、EchoピンからHIGHが出力され、超音波が跳ね返って戻ってくるとEchoピンからの出力がLOWとなります。
Echoピンの出力がHIGHからLOWに信号が変化するまでの時間を計測することで、超音波が物体との間を往復するのにかかった時間が分かるので、その時間の半分に音速を掛けることで距離を計測することができるという仕組みになっています。

では実際に距離を測定するプログラムを書いていきたいと思います。

超音波センサーを使った距離測定のプログラム

#define ECHO_TRIG 16
#define ECHO_IN 17

void setup() {
  Serial.begin(115200);
  
  pinMode(ECHO_TRIG, OUTPUT);
  pinMode(ECHO_IN, INPUT);
}

void loop() {

  double distance = 0.0;
  int ret_time = 0;

  digitalWrite(ECHO_TRIG, HIGH);    //超音波出力
  delayMicroseconds(10);
  digitalWrite(ECHO_TRIG, LOW);    //超音波出力停止

  ret_time = pulseIn(ECHO_IN, HIGH);

  distance = ret_time * 0.017;  // unit : cm

  Serial.print("物体との距離は : ");
  Serial.print(distance);
  Serial.println("cm");
  
  delay(1000);
}

ではここからは、プログラムの説明を行います。

#define ECHO_TRIG 16
#define ECHO_IN 17

超音波センサーのTrigピンをArduinoの16番ピン(A2)、Echoピンを17番ピン(A3)に接続しているため、ピンの番号の定義を行っています。

  Serial.begin(115200);

このプログラムでは、シリアル通信を使い温度をPCの画面上に表示します。
これはシリアル通信を始めるための宣言です。
ボーレート115200bpsで通信を行います。
シリアル通信について詳しく知りたい方は、以下の記事を参考にして下さい。
wakamelab.hatenadiary.com

  pinMode(ECHO_TRIG, OUTPUT);
  pinMode(ECHO_IN, INPUT);

Trigピンに接続した16番ピンを出力とすることで超音波を放出するためのトリガーとし、Echoピンに接続した17番ピンを入力に設定することで超音波が返ってきて17番ピンがHIGH→LOWとなるタイミングを知ることが出来ます。

  double distance = 0.0;
  int ret_time = 0;

変数"distance"は距離を計算した結果を格納するために使用し、"ret_time"は超音波が返ってきた時間を格納するために使用しています。
double型というのは、小数点を持つ値を計算することが出来る変数です。
int型は整数しか扱うことが出来ないため、計算結果が小数となった場合、小数点以下は切り捨てられますが、double型では小数点以下の値も切り捨てずに保持することが出来ます。
このように計算結果が整数とならない値を変数に格納するためには、小数点を扱う事が出来るdouble型やfloat型を使用します。

  digitalWrite(ECHO_TRIG, HIGH);    //超音波出力
  delayMicroseconds(10);
  digitalWrite(ECHO_TRIG, LOW);    //超音波出力停止

ECHO_TRIG(16番ピン)にHIGHを出力し、10μsec待ってからECHO_TRIG(16番ピン)をLOWにしています。こうすることで10μsecの間超音波を出し続けることが出来ます。
なぜ10μ秒間なのかというと、HC-SR04の仕様では10μ秒間超音波を放出することで、8個のパルスが放出されます。
8個のパルスがEchoに返ることで、EchoピンはLOWを出力するので、Echoピンが超音波の戻りを正常に検知するために8パルス出力させる必要があるからです。
ちなみにですが、μはマイクロと読みます。1μ秒は1/1000000(百万分の一)秒です。

  ret_time = pulseIn(ECHO_IN, HIGH);

この処理で、超音波を出力してからセンサーに返ってくるまでの時間を計測しています。
pulseIn(pin, value)関数では、引数pinで指定したピンの入力が、引数valueで指定した値(HIGH/LOW)となっている間の時間を返します。
返ってくる時間の単位はμ秒です。
この場合、Trigから超音波が出力され、Echoピンの出力がHIGHになることで時間の計測を開始し、超音波が返ってきてEchoピンの出力がLOWになることで計測を終了し、その間の時間を戻り値として返してくれています。

  distance = ret_time * 0.017;  // unit : cm

超音波が返ってくるまでの時間を距離に変換しています。
計算の根拠について説明します。
音速は15度の空気中での340m/sで計算しています。(1秒間に340m進む)
超音波が返ってくるまでには、超音波センサーから出力→跳ね返って戻ってくるという過程を踏むため、物体に到達するまでにかかった時間は計測した時間の半分でありret_timeを2で割ります。・・・1
ret_timeの単位はμ秒なので、秒に変換するために1000000で割ります。・・・2
1,2の計算で物体到達までの秒数が分かるため、音速の340m/sを掛けます・・・3
最後に、距離をmからcmに直すため、100を掛けます・・・4
1~4の計算を数式に表すと以下のようになります。
f:id:wakamelab:20200909002055p:plain

上記計算式により、計算式ret_time * 0.017で 距離がcm単位で計算できることが分かります。

  Serial.print("物体との距離は : ");
  Serial.print(distance);
  Serial.println("cm");

物体との距離は〇〇cm と表示させるための処理です。
超音波センサーで測定した値をPC上で確認するために行っています。

配線図紹介

プログラムの紹介も終わりましたので、実際に配線しましょう。
配線は以下の配線図の通りです。
f:id:wakamelab:20200912141730p:plain

A2ピンをTrigピン、A3ピンをEchoピンに接続しています。
配線図の表示の関係上、超音波センサーがArduinoの方を向いていますが超音波センサーの向きをArduinoと反対に向けた方が距離測定を行う上ではやりやすいかと思います。

プログラムの実行

接続も完了した所で、プログラムを実行してください。
このようにシリアルモニタ上に出力されれば完成です。
f:id:wakamelab:20200912173044p:plain

超音波センサーを接続したArduinoの前にモノを置いて、それを近づけたり遠ざけたりしてみて下さい。
実際に出力される距離がモノの移動と連動して変化するのではないでしょうか。
これで距離測定の方法の紹介は終了します。

Arduino 超音波距離計製作キットの紹介

当社では、Arduinoを使用した、プログラミング、電子工作初心者向けの学習キットを販売しております。
この記事に記載した温度センサーを使って温度計を作るキットもありますので、ご興味あれば是非購入をお願いします。

ホームページ:
www.wakamelab.com

販売サイト:https://wakamelab.thebase.in/items/30768809

メルカリ:https://www.mercari.com/jp/u/170119900/

Arduinoを使って温度を測定する

f:id:wakamelab:20200620154436j:plain

Arduinoを使って温度センサーから温度を取得する

こんにちは、wakamelabです。
Arduinoと温度センサー LM35DZ を使って温度を測定する方法を紹介します。

使用するもの

Arduino UNO 本体:1個
・USBケーブル:1本
・温度センサー LM35DZ:1個
・ブレッドボード:1個
・ジャンパーワイヤ(オス-オス):3本

温度センサー LM35DZ について

f:id:wakamelab:20200620114028j:plain

では、温度センサーのLM35DZを使用して、温度を測定する方法を説明します。
LM35DZの特性を見てみましょう。
f:id:wakamelab:20200620114251p:plain
これはLM35DZのデータシートの抜粋です。
上から3番目の項目、LM35Dに記載されているように、測定可能な範囲は0℃~100℃です。

f:id:wakamelab:20200620115231p:plain
データシート中のパラメーター設計を確認します。
これによると、LM35DZの出力は10mV/℃ということがわかります。
どういうことか説明すると、このセンサーは温度1℃につき、10mVを出力するという意味です。
つまり、温度が10℃の時は100mV、50℃の時は500mV、100℃の時は1000mV(=1V)を出力するという意味です。
LM35DZは、0~100℃の測定値を0~1000mVの電圧に変換して出力するセンサーとなります。

このように、測定した値を電圧に変換して出力するセンサーのことをアナログセンサーと言います。
代表的なものに、温度センサー、湿度センサー等があります。

逆に、測定結果によってON/OFFを出力するセンサーのことをデジタルセンサーといいます。
代表的なものに、タッチセンサー、人感センサー等があります。

アナログ値をArduinoで読み取る方法

温度センサーの特性は理解できましたか?
Arduinoで温度を測定するには、温度センサーから出力された電圧値を読み取り、それを温度に変換すれば良いことが分かりました。
ここからは、Arduinoを使って電圧を読み取る方法を紹介します。

f:id:wakamelab:20200620121058j:plain
Arduino本体の右下に"ANALOG IN"と書かれた、A0~A5の端子があります。
この6つの端子が、電圧値つまりアナログ値を読むことができる端子です。
これらの6つの端子は、0~5Vのアナログ値を読むことができます。
プログラムを書くときのピン番号は、A0が14番、A1が15、A2が16、A3が17、A4が18、A5が19番です。

センサーの出力ピンをA0~A5のどれかに接続することでアナログ値を読むことができます。

温度測定のプログラム

ここからは、実際にプログラムを書いてみましょう。

#define THERMO_IN 14  //A0に温度センサーを接続

void setup() {
  pinMode(THERMO_IN, INPUT);  // A0をインプットに設定
  Serial.begin(115200);
}

void loop() {
  float thermo;
  float thermo_sens;
  
  thermo_sens = analogRead(THERMO_IN); //センサー値取得
  thermo = ((5*thermo_sens)/1023) * 100; //電圧を温度へ温度へ変換

  Serial.print("温度は");
  Serial.print(thermo);
  Serial.println("℃です");
  delay(1000);
}

プログラムの説明を行います。

#define THERMO_IN 14  //A0に温度センサーを接続

温度センサーの出力端子をArduinoのA0ピン(14番ピン)に接続するための定義です。

  pinMode(THERMO_IN, INPUT);  // A0をインプットに設定

温度センサーから出力される電圧値を読み取るため、A0ピンをインプットに設定しています。

Serial.begin(115200);

このプログラムでは、シリアル通信を使い温度をPCの画面上に表示します。
これはシリアル通信を始めるための宣言です。
ボーレート115200bpsで通信を行います。
シリアル通信について詳しく知りたい方は、以下の記事を参考にして下さい。
wakamelab.hatenadiary.com

  float thermo;
  float thermo_sens;

floatというのは、小数点を扱うことができる型です。
温度を計算する過程で小数点が発生しますので、使用する変数も小数点を扱える型で宣言します。

  thermo_sens = analogRead(THERMO_IN); //センサー値取得

analogRead()関数を使用して、ピンの電圧値を読み込んでいます。
使用方法は、analogRead(ピン番号)として使用し、指定したピンの電圧を読み取ります。
この場合、温度センサーの出力を接続したA0ピンの電圧を読んでいます。

  thermo = ((5*thermo_sens)/1023) * 100; //電圧を温度へ温度へ変換

analogRead()関数を使用して読み込んだ値を温度に変換しています。
まず、analogRead()関数では、0~5Vの電圧を0~1023に変換しています。
つまり、5×(thermo_sens/1023)の計算によって、analogRead()関数で読み取った値を0~5Vの電圧に変換しています。
この温度センサーの出力特性は、10mV/℃でした。電圧値に100を掛けることで、電圧を温度に変換できます。
この計算全体としては、analogRead()関数によって読み取った0~1023という値を温度に変換しています。

  Serial.print("温度は");
  Serial.print(thermo);
  Serial.println("℃です");

測定した温度をシリアル通信によって出力ています。
(温度は25℃です)という形にして出力するための処理です。

配線図紹介

プログラムの紹介も終わりましたので、実際に配線しましょう。
配線は以下の配線図の通りです。
f:id:wakamelab:20200620145808p:plain

LM35DZは上から見ると、円を途中で切り取ったような形をしています。
端子は切り欠きの方を手前側に置いた状態で、左から、5V、出力、GNDとなっています。

プログラムの実行

接続も完了した所で、プログラムを実行してください。
このようにシリアルモニタ上に出力されれば完成です。
f:id:wakamelab:20200620150214p:plain

温度センサーを触ったりしてみて、温度が変化するかどうか試してみて下さい。
これで温度測定の方法の紹介は終了します。

Arduino 温度計製作キットの紹介

当社では、Arduinoを使用した、プログラミング、電子工作初心者向けの学習キットを販売しております。
この記事に記載した温度センサーを使って温度計を作るキットもありますので、ご興味あれば是非購入をお願いします。

ホームページ:
www.wakamelab.com

販売サイト:https://wakamelab.thebase.in/items/10739518

メルカリ:https://www.mercari.com/jp/u/170119900/

Arduinoを使ってシリアル通信を行う

f:id:wakamelab:20200520004021j:plain

Arduinoを使ったシリアル通信の方法を紹介

こんにちは、wakamelabです。
Arduinoを使ってシリアル通信をやってみたので、その方法を紹介します。

シリアル通信とは何か

シリアル通信とは、電気信号の伝送路を1本用意し、1bitずつ電気信号を送受信するとで情報のやり取りを行う通信の総称です。
シリアル通信の規格として、UART、I2C、SPIが有名です。
信号線を少なくして通信を行うことができるため、安価に実装することができ信頼性も高いため、非常に幅広く使用されています。
ではArduinoを使ったシリアル通信の具体的な方法を説明します。

使用するもの

Arduino UNO 本体 :1個
・USBケーブル:1本

ライブラリの紹介

Arduinoでは、シリアル通信を行うためのライブラリが用意されています。
ライブラリを使用することで、内部の複雑な処理を意識することなく簡単に実装を行うことができます。
先人の知恵に感謝ですね。

Serial.begin(speed)
シリアル通信を開始するための宣言を行う関数です。
引数である speedには、通信速度(bps)を指定します。
bpsは、"bit per second"の略であり、1秒当たりの転送bit数のことを指します。
bpsでよく使用する値は、300, 9600, 115200です。

Serial.end()
シリアル通信を終了させるための関数です。」

Serial.print(data)
シリアル通信を使用して、値を送信する関数です。
引数である、"data"に格納した値を送信します。
例えば、Serial.print("Hello, World")とした場合、Hello, World という文字列を送信し、Serial.print(10)とした場合、10という値を送信します。
簡単にシリアル通信でデータを送ることができる、非常に便利な関数です。

Serial.println(data)
基本的には上で紹介したSerial.print()と同じ機能ですが、Serial.println()ではデータの末尾に改行用のコードを送ることで改行を行います。
分かりにくいと思いますので、具体的に説明します。

Serial.print()とSerial.println()で"Hello, World."を2つに分けて出力してみます。
Serial.print() を使った場合
 Serial.print("Hello ");
 Serial.print("World.");
出力結果は
 Hello, World.
となります。

Serial.println()を使った場合
 Serial.println("Hello ");
 Serial.println("World");
出力結果は
 Hello,
 World.
となります。

Serial.print() と Serial.println() の使い分けは、シリアル通信の出力を見やすい形に整形する際に非常に重要になりますので、理解しておいた方が良いです。

シリアル通信のプログラム

ではシリアル通信を行うプログラムを紹介します。

int pass_time = 0;

void setup() {
  Serial.begin(9600);
  
  delay(1000);  //起動待ち

  Serial.println("Hello, World.");
}

void loop() {

  pass_time++;
  Serial.print("Pass Time : ");
  Serial.print(pass_time);
  Serial.println("Sec");
  
  delay(1000);  
}

このプログラムは、Arduinoの起動時に"Hello, World."と表示し、その後は"Pass Time : 10Sec"のように起動からの経過時間を表示させることを目的にしています。
では、プログラムの解説を行います。

int pass_time = 0;

時間を測定するための変数を宣言しています。

  Serial.begin(9600);

シリアル通信を開始するための宣言です。9600bpsで通信を行います。

  Serial.println("Hello, World.");

初回起動時に、Hello, World. と出力し改行します。

  pass_time++;

変数 pass_time に1を加算します。"++"はインクリメントと言い、対象の変数に1を加算する処理です。
この処理では、Arduinoを起動してからの経過時間を計測しています。

  Serial.print("Pass Time : ");
  Serial.print(pass_time);
  Serial.println("Sec");

この処理では、Arduinoを起動してからの時間を出力しています。
一番目の処理で、文字列 Pass Time : を出力します。
次の処理では、経過時間を測定している変数 pass_time の値を出力します。
最後に、文字列 Sec を出力し、改行しています。
この一連の処理で、Pass Time : 1Sec のように、経過時刻を出力するようになっています。
最後にSerial.println() を行い改行をしている理由は、ここで改行しないと次の処理でそのまま後ろに繋がる形で文字が出力されてしまうからです。

delay(1000);

プログラムを1秒間停止しています。こうすることで、変数pass_time で計測している値がおおよそArduinoの起動時間と一致します。

ArduinoをUSBケーブルでPCと接続し、このプログラムを書き込んで下さい。
そのままでは、特に何も出力されないと思います。次にArduinoから送信された値を確認する方法を紹介します。

シリアル出力をモニタする方法

Arduinoが接続された状態でシリアルモニタボタンをクリックしてください。
f:id:wakamelab:20200614140656p:plain

シリアルモニタボタンをクリックすると、このような画面が出てきますので通信レートを9600bpsに変更してください。
f:id:wakamelab:20200614141032p:plain

f:id:wakamelab:20200614141049p:plain

通信レート変更後、以下のように出力されたら成功です。
f:id:wakamelab:20200614141121p:plain

以上で説明を終わります。いかがでしたでしょうか。
シリアル通信はソフトを作ったときのテストであったり、センサーの軽く使ってみるための実験だったり、と多くの場面で活用するので是非覚えておいてください。

Arduino 基本学習キットの紹介

当社では、Arduinoを始めたい人に向けたスターターキットを販売しております。

気になる方は以下のURLよりアクセスしてみて下さい。

ホームページ:
www.wakamelab.com

販売サイト:https://wakamelab.thebase.in/items/25680573

PWM制御を使って LEDの明るさを変化させる

Arduinoを使ったPWM制御の方法を紹介

こんにちは、wakamelabです。
Arduinoを使ってPWM制御を行い、LEDの明るさを変化させたので、そのやり方を紹介します。

使用するもの

Arduino UNO 本体 :1個
・ブレッドボード:1個
・LED:2個
・330Ω抵抗:2個
・ジャンパー線(オス-オス):5本

PWM制御とは何か

PWMとは、Palse Width Modulation の略です。直訳すると、パルス幅の調整という意味になります。
その意味の通り、PWM制御とはパルス幅を制御することで単位時間あたりの電圧を調整するための制御です。
何故、パルス幅を調整することで電圧を調整できるのか詳しく説明していきます。


f:id:wakamelab:20200606154344p:plain
このようなONとOFFを繰り返す電気信号をパルスといいます。
Arduinoでは、ONの時に5V、OFFの時に0Vの電圧を出力します。
ONとOFFを合わせた時間を周期といいます。周期の逆数を取ったものが周波数です。
周期の単位は秒(s)で、周波数の単位はヘルツ(Hz)です。ヘルツは(1/s)と同じ意味です。
周期が1秒、つまり0.5秒ON、0.5秒OFFの場合、周波数は1 / 1 = 1ヘルツです。
周期が0.1秒の場合では、周波数は1 / 0.1 = 10ヘルツです。
周波数は、周期が短くなればなるほど大きくなります。

f:id:wakamelab:20200606154633p:plain
パルス1周期中のONとOFFの比率をDuty比(デューティー比)と言います。
この図のパルスは、ONとOFFの比が 5 : 5 (=1 : 1) のため、Duty比は50です。

f:id:wakamelab:20200606154945p:plain
このパルスでは、ONとOFFの比が 2 : 8 (=1 : 4)のため、Duty比は20です。

f:id:wakamelab:20200606155016p:plain
このパルスでは、ONとOFFの比が 9 : 1 のため、Duty比は90です。

PWM制御とはパルスの幅、つまりDuty比を制御する方法となります。
Duty比を変化させることで、なぜLEDの明るさが変化するのでしょうか。
例として、Duty比50の場合を考えてみます。
1周期が1秒だった場合、Duty比50では、ON(5V)が0.5秒、OFFが0.5秒となります。
1周期あたりの電圧の平均値は2.5Vとなり、常時ONであるDuty比100の場合(5.0V)の半分となります。
PWM制御とは、このようにパルス幅の比であるDuty比を調整し、1周期中の電圧の出力値の
平均を変化させる制御となります。

Duty比50のパルスでLEDを点灯させると、常に5Vを与えているLEDと比較し
明るさは半分になります。

プログラムの紹介

ではArduinoを使って、実際にPWM制御をさせるプログラムを書いてみましょう。

以下にPWM制御のサンプルプログラムを紹介します。
このプログラムをArduino IDEに記述してみてください。

#define LED 4
#define LED_PWM 5

byte pwm_value = 0;
byte decrement_flg = 0;

void setup() {

  pinMode(LED, OUTPUT);
  pinMode(LED_PWM, OUTPUT);

  delay(1000);
}

void loop() {

  if (decrement_flg == 0) {
    pwm_value++;
  } else {
    pwm_value--;
  }

  if (pwm_value == 255) {
    decrement_flg = 1;
  } else if (pwm_value == 0) {
    decrement_flg = 0;
  }

  digitalWrite(LED, HIGH);

  analogWrite(LED_PWM, pwm_value);

  delay(4);
}

では、プログラムの意味を解説します。

#define LED 4
#define LED_PWM 5

使用するピン番号の定義です。
通常通りに点灯させるLEDを4番ピンに、PWMで明るさを調整するLEDを5番ピンに接続します。
4番ピンに接続するLEDは明るさの比較のために使用します。
PWMを使えるピンは、3, 5, 6, 9, 10, 11 ピンに限定されています。
ピン番号の横に~が書いてあるピンです。

byte pwm_value = 0;
byte decrement_flg = 0;

1バイト型の変数を宣言しています。 Byte型もchar型と同じく1バイトの型宣言です。
変数"pwm_value"の値を変化させることで、デューティー比を変化させLEDの明るさを変更します。
変数"decrement_flg"は、明るくさせる(デューティー比をプラスする)のか、暗くさせる(デューティー比をマイナスする)のかを判定するための変数です。

  pinMode(LED, OUTPUT);
  pinMode(LED_PWM, OUTPUT);

LEDのピンとPWMに使うピンを出力に設定しています。
PWMに使用するピンは定する必要はありませんので、省略しても大丈夫です。

  if (decrement_flg == 0) {
    pwm_value++;
  } else {
    pwm_value--;
  }

変数"pwm_value"の値を変化させることで、デューティー比を変化させています。

    1. (インクリメント)は、変数の値に1を足す処理です。
    • (デクリメント)は、変数から1を引く処理です。
  if (pwm_value == 255) {
    decrement_flg = 1;
  } else if (pwm_value == 0) {
    decrement_flg = 0;
  }

pwm_valueの値によってdecrement_flgを1か0にしています。
まずpwm_valueは0、decrement_flgは0から始まります。
pwm_valueにどんどん1が足されていきpwm_valueの値が255となったときdecrement_flgが1となります。
そこからpwm_valueの値から1が引かれていき、0となったときdecrement_flgが0となります。
これを繰り返すことで、duty値を0→255、255→0と変化させ、明るさを変えているのです。

  digitalWrite(LED, HIGH);

4番ピンに接続したLEDを点灯させています。

  analogWrite(LED_PWM, pwm_value);

このanalogWrite() 関数がPWM制御を行うための関数です。
analogWrite(ピンの番号、 Duty比) として使用します。
かりにくいのですが、第2引数に入れた値がそのままDuty比になるわけではありません。
この値には 0 ~ 255までの値を入れることが可能で、0の時は0%、255の時に100%となります。
第2引数に入るDuty比 pwm_value が増減することで、LEDの明るさが変化しています。

  delay(4);

処理を4ms停止させます。変数 pwm_value は0~255の値を行ったり来たりするため、4ms*255で約1秒、つまり0V→5Vに1秒、5V→0Vに1秒かかるため、全体として2秒周期を繰り返すための待ち時間です。

配線方法

では配線方法を紹介します。

f:id:wakamelab:20200607000820j:plain

配線は単純で、4番ピンと5番ピンをLEDに接続するだけです。
LEDには配線の向きがあり、端子の長い方(アノード)を4番ピン、5番ピンと接続し、短い方(カソード)をArduinoのGNDに接続します。

実行する

配線が完了したらArduinoにソフトを書き込み、PWMを実行してください。

youtu.be

この動画のように、片方のLEDが常時点灯、片方のLEDの明るさが変化すれば成功です。

Arduino 基本学習キットの紹介

当社では、Arduinoを始めたい人に向けたスターターキットを販売しております。
このキットを使えば、当記事の内容であるPWM制御も試すことができます。

気になる方は以下のURLよりアクセスしてみて下さい。

ホームページ:
www.wakamelab.com

販売サイト:https://wakamelab.thebase.in/items/25680573

Arduinoを使ってLチカをする

f:id:wakamelab:20200531145803j:plain

Arduinoを使ったLチカの方法を紹介。

こんにちは、wakamelabです。
Arduinoを使ってLチカをやってみたので、その方法を紹介します。

Lチカとは何か?

Lチカとは、LEDを点滅させることです。
電子工作のキモは I/Oピンの制御です。
I/OピンにHIGH、LOWを出力しLEDを点灯、消灯させるLチカはまさにI/Oピン制御の基本です。
電子工作の初歩の初歩であり、プログラミングで言う所の『Hello world』にあたります。

使用するもの

Arduino UNO 本体 :1個
・ブレッドボード:1個
・LED:1個
・330Ω抵抗:1個
・ジャンパー線(オス-オス):2本

手順① Arduino IDE を使ってプログラムを作成する

Arduinoを使った開発では、Arduinoの標準的な開発環境であるArduino IDEを使用します。
Arduino IDE で使用するプログラミング言語C言語と一部のC++の機能です。
基本的には、C言語と同じ書き方で実装できます。

ここから以降は、Arduino IDEをインストールしていることを前提に説明を行います。
インストールがまだの方は、以下の記事を参考にインストールを行ってください。
wakamelab.hatenadiary.com

Arduino IDEのアイコンをダブルクリックして、Arduino IDE を起動してください。
f:id:wakamelab:20200522003008p:plain

Arduino IDE が起動すると、このようにテキストを入力できるウィンドウが立ち上がります。
f:id:wakamelab:20200522003037p:plain

setup()関数は、Arduinoが起動した時に一度だけ実行される関数です。
関数の名前の通り、I/O ピンやタイマーの初期化に使用します。

loop()関数は、Arduinoが起動している間繰り返し実行される関数です。
実行したい処理はこの関数の中に記述します。

では以下にLチカのサンプルプログラムを紹介します。
このプログラムをArduino IDEに記述してみてください。

#define LED 7

void setup() {
  pinMode(LED, OUTPUT); //7番ピンを出力に設定
}

void loop() {
  digitalWrite(LED, HIGH);  //LED点灯
  delay(1000);              //1秒待機
  digitalWrite(LED, LOW);   //LED消灯
  delay(1000);              //1秒待機
}

f:id:wakamelab:20200527010146p:plain

このプログラムの意味を解説します。

#define LED 7

#define は置き換えのマクロです。#define (A) (B) とすることで、A を B に置き換えるという意味になります。
この場合、"LED"という文字を、"7"に置き換ることを意味しています。

pinMode(LED, OUTPUT); 

pinMode(ピン番号, OUTPUT/INPUT) で指定したピンを入力/出力に設定します。
この場合、LED(7)番のピンを出力に設定しています。

digitalWrite(LED, HIGH); 

digitalWrite(ピン番号, HIGH) で指定したピンに5Vの電圧を出力します。
この場合、LED(7)番ピンに5Vの電圧を出力し、LEDを点灯させる処理です。

delay(1000); 

delay(数値) で、数値分の時間ミリ秒間処理を停止します。
1000ミリ秒→1秒間、処理を停止することを意味しており、LEDの点灯を1秒間キープします。

digitalWrite(LED, LOW); 

digitalWrite(ピン番号, LOW) で指定したピンの電圧の出力を止めます。
この場合、LED(7)番ピンの電圧を0Vにし、LEDを消灯させる処理です。

delay(1000); 

1000ミリ秒→1秒間、処理を停止することを意味しており、LEDの消灯を1秒間キープします。

このプログラムを書き終わったら、名前を付けて保存してください。
名前は何でもいいですが、必ず半角英数字のみを使ってください。
ここでは、仮に"LED_BLINK"としています。

プログラムをコンパイルする

プログラムが完成したのでコンパイルを行います。
コンパイルとは、プログラミング言語で書かれたプログラムを、コンピューターが実行可能な形式に変換することです。
コンパイルを行うことで、今作成したプログラムをArduinoが実行できる形式に変換することができます。

コンパイル方法は、Arduino IDE 上の"検証"ボタンを押すだけです。
f:id:wakamelab:20200531131220p:plain

検証ボタンを押してコンパイルを始めてください。
下の画像のように、"コンパイルが完了しました”と表示されればOKです。
f:id:wakamelab:20200531131710p:plain
もしこれ以外が表示された場合、プログラム上のどこかが間違えています。
どこが間違えているかをコンパイラーが教えてくれるので、根気よくエラー部分を修正してください。
最初はどうしてもエラーが出ると思いますが、だんだんと慣れてくるとエラーを出さないためのプログラムを書くことができるようになるので、ここは仕方ないと割り切って、地道にエラーを修正してください。

配線方法の紹介

LEDを光らせるために、Arduinoに線を接続します。
つなぎ方は単純で、LEDにArduinoの7番ピンとGNDのピンを接続してください。
LEDの端子は長さが違う2本の端子が出ていると思います。
長い方の端子はアノードといい、短い方の端子はカソードといいます。
アノードにはプラス側、カソードにはマイナス側を接続し、アノードからカソードへ電気が流れるように接続します。
つまり、長い方の端子(アノード)をArduinoの7番ピン、短い方の端子(カソード)をGNDのピンに接続します。
以下の配線図を参考にしてください。
f:id:wakamelab:20200531135715j:plain

プログラムをArduinoに書き込む

では接続も完了したので、Arduinoにプログラムを書き込みましょう。
まず、USBでArduinoとPCを接続します。

次にボードの設定を行います。今回はArduino UNOを使用しているので、Arduino UNOを設定します。
f:id:wakamelab:20200522003643p:plain

ポート番号を設定します。
ポートはUSBを接続すると選択することができるようになります。
f:id:wakamelab:20200531142621p:plain
※ポート番号は人によって違います。

では書き込みを行います。Arduinoを接続した状態で、”マイコンボードに書き込む”ボタンを押してください。
f:id:wakamelab:20200531144323p:plain
下の画像のように、"ボードへの書き込みが完了しました"と表示されれば書き込みは成功です。

LEDが1秒周期で点滅し始めましたか?
点滅しなければ、プログラムか配線が間違えていると思います。
根気よく原因を探してみてください。

youtu.be

Arduino 基本学習キットの紹介

当社では、Arduinoを始めたい人に向けたスターターキットを販売しております。

気になる方は以下のURLよりアクセスしてみて下さい。

ホームページ:
www.wakamelab.com

販売サイト:https://wakamelab.thebase.in/items/25680573

Arduinoのセットアップ方法について

 f:id:wakamelab:20200520004021j:plain

Arduinoのセットアップ方法の紹介

こんにちは、wakamelabです。

初心者の入門から製品のプロトタイプ作製まで、今や電子工作に関わるありとあらゆる問題を解決することが出来る魔法のようなツール、それがArduino(アルディーノ)です。

この記事では、Arduinoを初めて使う時に欠かせない開発環境の構築について分かりやすく説明していきます。

Windows PC であることを前提に説明を行います。

  

そもそもArduinoとは?

Arduinoとは、イタリアで開発された教育用のシングルボードコンピューターです。

色々なアクチュエータ、センサーを簡単に扱えるように設計されており、電子工作を勉強したり、試作品を作ったりするのに非常に扱いやすいマイコンです。 

 この扱いやすさから、今では世界中で使われています。

 

Arduino IDEのダウンロード

まずは、Arduino統合開発環境Integrated Development Environment)である

Arduino IDE をダウンロードします。

統合開発環境とは、開発に必要なツールをひとまとめにしたものです。

Arduino IDE を使うことで、プログラミング言語を使ってコードを書き、コードをArduinoに書き込むために翻訳(コンパイル)し、コンパイルによって生成されたオブジェクトをArduinoに書き込みArduinoに望み通りの動作を行わせる、といった一連の作業を行うことが出来ます。

 

Arduino IDE は以下のURLからダウンロードすることが出来ます。

https://www.arduino.cc/en/Main/Software

 

リンクをクリックすると、以下のページにアクセスできます。

f:id:wakamelab:20200521010024p:plain

 

下にスクロールし・・・・

f:id:wakamelab:20200521010530p:plain

赤枠で囲った、"Windows Installer, for Windows 7 and up"をクリックします。

 

f:id:wakamelab:20200522000059p:plain

 すぐにダウンロードを行う場合は、"JUST DOWNLOAD"を、Arduino財団に寄付を行ってダウンロードする場合は、"CONTRIBUTE & DOWNLOAD"をクリックして下さい。

どちらをクリックしても、同様のファイルをダウンロード可能です。

 

Arduino IDE のインストール

ダウンロードが完了した後は、インストールを行います。

 

先程ダウンロードしたexeファイルをダブルクリックして起動します。

f:id:wakamelab:20200522001052p:plain


ここでコンピューターに変更を加えることに対する許可を求められるため、”はい”を選択して許可をしてください。

コンピューターに変更の許可を与えると、以下の画面が表示されるので"I Agree" を選択してください。

f:id:wakamelab:20200522002126p:plain

 

"Next"をクリック

f:id:wakamelab:20200522002251p:plain

 

"Install"をクリックすると、インストールを開始します。

およそ3分で終了するので、少し待ちます。

f:id:wakamelab:20200522002334p:plain

 

インストールが完了すると、以下の画面が表示されます。

”Close"をクリックし、インストールを終了します。

f:id:wakamelab:20200522002501p:plain

 

Arduino のボード設定

 

インストールが完了すると、デスクトップ上に以下のショートカットが作成されるのでダブルクリックすると、Arduino IDE が起動します。

f:id:wakamelab:20200522003008p:plain

 

Arduino IDE 起動画面

f:id:wakamelab:20200522003037p:plain

 

これでArduino IDE を無事にインストールし、起動することが出来ました。

ここで使用するボードの設定を行いましょう。

説明は、最も一般的なArduinoである、Arduino UNO R3 を使用する前提で行います。

 

「ツール」→「ボード」を選択します。

ボードマネージャーの中の"Arduino UNO"を選択します。

f:id:wakamelab:20200522003643p:plain

これで、デフォルトのボードをArduino UNO に設定することが出来ました。

以上でArduino の初期セットアップ方法の紹介を終了します。

 

Arduino 基本学習キットの紹介

当社では、Arduinoを始めたい人に向けたスターターキットを販売しております。

気になる方は以下のURLよりアクセスしてみて下さい。

ホームページ: https://www.wakamelab.com/ 

販売サイト:https://wakamelab.thebase.in/items/25680573 

メルカリ : フリマアプリ「メルカリ」で販売してます
https://www.mercari.com/jp/u/170119900/