top of page

 シールド 

 Arduinoには IO のPINコネクタがありその上にいろいろな入出力ディバイスを取り付けることができます。はんだ付けやブレッドボードの配線をすることなく様々な実験をすることができます。完成された製品をのせることもできます。

LCD1602

 LCD Keypad シールド 

 液晶表示のシールドには幾つかの種類があります。

 LCD1602 

 16文字X2行の表示ができる手軽に使える液晶表示器です。たくさんの線をはんだ付けするのが難点です。今回は実験ですのでブレッドボードで配線しています。

 LCD Shieldです。液晶16文字2行表示のLCD1602を使い,Arguinoのポートのpinに結線したシールドです。スケッチを描けば表示がすぐに使えるので便利です。

2074円2022/10/20売り切れ

 表示実験 

PS 2017/1/14 

 LCD Keypad Shieldがとどきました。

 PIN接続はlcd(8,9,4,5,6,7);で成功しました。見にくいとは思いますが,写真を載せました。

 バックライトのLEDがD10pinにつながっていますので点灯消灯ができます。コントラストは左上に見える多回転式の半固定抵抗で調節します。データロガシールドとともに使用する場合はちょっと工夫が必要です。2017/6/15現在300円

590円2021/6/2

700円位2022/10/20

 PIN配列 

 基板には拡張のホールが有りデジタルPINやアナログPINにつながっているので便利に使えます。下向きにコネクタなどを付けるとボタンや液晶に影響が少ないと思います。

 値段による違いでしょうか?値段の高い方が配送が遅く雑のように見えます。少し違ったところが有りました。液晶のPINが長くてArduinoのICSPのPINと接触しそうです。d3,d2の2本を曲げておきました。(液晶のpinを切断すればいいことなのですが,何かに使えるかもしれないのでこのようにしました)

 VO用の半固定のバリオームが調整されていなく,表示されないので焦りました。

 それほど気になりませんでしたが,どちらも油汚れのようなものが有りました。ハンダ用のペーストかもしれません。

 Arduinoとの接続 

 Arduinoとの接続に配線はいりません。電源も信号線も全てつながっています。表面が液晶になっているので他の部品は拡張ホールに付けるか,Arduinoとの間にユニバーサルボード等を挟むようにします。

lcd(8,9,4,5,6,7);でインスタンスを動作させます。

A1~A5とデジタルpinの0,1,2,3,11,12,13が使えます。

 スケッチ例 

LCD01

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

/*
説明部分
*/

//宣言部分
#include <LiquidCrystal.h>//インクルード ファイルはArduino内臓

//LCD具現化
//RS,EnableとD4,6,D10~D13をArduinoとつなぎます。
LiquidCrystal lcd(8,9,4,5,6,7);//LCD Keypad シールドのpin

 

void setup() {//初期設定部分
  //16文字2行のLCDを使う設定です。
  lcd.begin(16, 2);
  //LCDへの文字出力です。
  lcd.print("hello, world!");
}

 

void loop() {//繰り返し部分
  //カーソルの移動です。
  lcd.setCursor(0, 1);//(x,y)です。
  //0文字目,1行目(0から数えます)です。

 

  //変数の表示です。
  lcd.print(millis() / 1000);
  //millis()はmsを求める関数です。
  //1000で割っているので1秒です。
}

 画面をクリアして"hello, world!"と表示した後2行目に1秒ごとの数字を表示するスケッチ例です。

 バックライトLEDの点滅 

 LCD Keypad ShieldはLEDのコントロールにデジタル10PINを使っているのでここで点滅させることができます。

pinMode(10,OUTPUT);

digitalWrite(10,LOW);

digitalWrite(10,HIGH);

​でコントロールします。

 LCDライブラリのコマンド一覧 

  LiquidCristal()

  begin()

  clear()

  home()

  setCursor()

  write()

  print()

  cursor()

  blink()

  noBlink()

  display()

  noDisplay()

  scrollDisplayLeft()

  scrollDisplayRight()

  autoscroll()

  noAutscroll()

  leftToRight()

  rightToLeft()

  createChar()  

生成

初期化

すべて消去

カーソルホーム

カーソル移動

表示BYTE

表示キャラクタ

点滅

点滅なし

表示する

表示しない

​ Keypadのボタンを活用 

 LCD Keypad Shieldに付いているKeypad=ボタンを使って時刻合わせやアラームセットをしようとしています。

​ Keypad 

 セレクトボタンがありますので,これで処理を選択して矢印キーで設定できるようにします。

​ LCD シールド ボタン 

 LCD Keypad ShieldのボタンによるA0の電圧をn/1023で表します。

​ ボタンは抵抗のつながりの中のそれぞれの接点につながっています。

​ 抵抗による分圧 

 RIGHTキーが

​ 押された時

 A0はVCC0V

​ 数値は      0

​ UPキーが

​ 押された時

​     330

5V×-------

   2000+330

 A0は  0.7V

​ 数値は   144

​ DOWNキーが

​ 押された時

​     950

5V×-------

   2000+950

 A0は  1.6V

​ 数値は   326

​ LEFTキーが

​ 押された時

​     1950

5V×-------

   2000+1950

 A0は  2.5V

​ 数値は   505

​ SELECTキーが

​ 押された時

​     5.25

5V×-------

     2+5.25

 A0は  3.6V

​ 数値は   740

SELECTキーが

​ 押された時

​     5.25

5V×-------

     2+5.25

 A0は  3.6V

​ 数値は   740

 各ボタンが押されるとGNDに短絡するようになっています。

 Key無押下 

 キーが何も押されていない時には2KΩでプルアップされているだけなのでA0はVcc

5Vで入力値は1023となります。

 RIGHT 

 RIGHTが押されるとA0はGNDに直結しますので0V入力値は0になります。

 UP 

 UPが押されると2000Ωと330Ωで分圧されて5Vよりも0Vの方が近いので1V以下になります。入力値は200以下でしょう。

 DOWN 

 DOWNが押されると2000Ωと950Ωで分圧されて約2:1の割合で5Vを分けることになるので1.6V位になります。入力値は300位でしょう。

​ LEFT 

 LEFTが押されると2000Ωと1950Ωで分圧されて1:1に近いので2.5V位になります。入力値は500位でしょう。

 SELECT 

 SELECTが押されると2000Ωと5250Ωで分圧されて0Vよりも5Vの方が近いので4V近くになります。入力値は700前後でしょう。

​ Keypad-A0の電圧表示 

 Sketch_jan13a 

#include <LiquidCrystal.h>//液晶表示使用

LiquidCrystal lcd(8,9,4,5,6,7);//表示器設定
int pin;//pinという整数の変数を使用

void setup() {
pinMode(10,OUTPUT);//液晶LED点灯用
digitalWrite(10,HIGH);//液晶点灯
  lcd.begin(16, 2);//液晶行数指示
  lcd.setCursor(0, 0);//液晶0行0桁
  lcd.print("Hello");//液晶テスト
}

void loop() {
  pin=analogRead(0);//A0入力pin変数へ
  lcd.setCursor(0,1);//表示下段へ
  lcd.print("     ");//以前の表示消去
  lcd.setCursor(0,1);//表示下段へ
  lcd.print(pin);//入力数値表示
  delay(1000);//1秒待つ
}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

​17

18

19

20

21

 A0の値がどれほどになるか測定するためにスケッチを書いてみました。

 上のスケッチで測定したLCD Keypad Shieldの実測値です。

 ボタンによるA0の電圧

     Shield1  Shield2

 NOKEY  1023 1023

SELECT    639    732

    ​LEFT    408    512

        UP     99    143 UPは200以下でした

  DOWN    254    342

  RIGHT       0        0

​ 2つのLCD Keypad Shieldを持っていますが,電圧はかなり違います。キャリブレーションなどの何か手立てを行わなければ正確にKey入力を行うことができません。

 int KeyIn()関数 

 KeyIn

1

2

3

4

5

6

7

8

9

10

int KeyIn(){//キー入力
  int pin;
  pin=analogRead(0);//pinにアナログ入力
  if(pin<50){return 0;}//電圧により値を返す
  else if(pin<200){return 1;}
  else if(pin<400){return 2;}
  else if(pin<600){return 3;}
  else if(pin<900){return 4;}
  else return 5;//入力がなければ5を返す
}

  KeyIn( ) スケッチをファンクションにしています。行番号は仮のものでスケッチに組み込むごとに変化します。

 KeyIN( )を呼んだところにキーの番号を返すようにしています。値がShield個体により変わってしまうので注意が必要です。(同じメーカの同じ型版なら誤差は少ないと思います)

 キー入力のスケッチ例 

 KeyIn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

void setup(){//初期設定部

  Serial.begin(9600);//serial初期化
}

void loop() {//繰り返し部

int key;

key=KeyIn();//ボタンの状態を読み込む

  Serial.println(key);//シリアル出力

}

//関数・補助部

int KeyIn(){//キー入力
  int pin;
  pin=analogRead(0);//pinにアナログ入力
  if(pin<50){return 0;}//電圧により値を返す
  else if(pin<200){return 1;}
  else if(pin<400){return 2;}
  else if(pin<600){return 3;}
  else if(pin<900){return 4;}
  else return 5;//入力がなければ5を返す
}

 関数の使い方の例になりました。

 このようにして関数やサブルーチンを作り使っていきます。同様にしてkeInWateを使うとキー入力まで待つプログラムができます。試してみてください。

 キー入力待ち関数 

 KeyInWaite

1

2

3

4

5

6

7

8

9

10

11

12

13

int KeyInWate(){//キー入力待ち
  int pin;
  while(1){
  pin=analogRead(0);//pinにアナログ入力
  if(pin<50){return 0;}//電圧により値を返す
  else if(pin<200){return 1;}
  else if(pin<400){return 2;}
  else if(pin<600){return 3;}
  else if(pin<900){return 4;}
  else pin=pin;//入力がなければ入力へ戻る
  }
  return;
}

  KeyInWaite( ) スケッチをファンクションにしています。行番号は仮のものでスケッチに組み込むごとに変化します。

 キーが押されるまで待ってKeyInWaite( )を呼んだところにキーの番号を返すようにしています。

 キー入力処理サブルーチン 

 処理1

1

2

3

4

5

6

7

8

9

10

11

12

13

​14

void Shori1(){//処理1
  int key;
  lcd.clear();
  lcd.print("Date");
  delay(500);  while(1){
    key=KeyIn();
    if(key==0)Shori13();
    if(key==1)return;
    if(key==2)return;
    if(key==3)Shori11();
    if(key==4)Shori2();
    }
  }

 処理3

1

2

3

4

5

6

7

8

9

10

11

12

13

​14

void Shori3(){//処理3
  int key;
  lcd.clear();
  lcd.print("Date");
  delay(500);  while(1){
    key=KeyIn();
    if(key==0)Shori33();
    if(key==1)return;
    if(key==2)return;
    if(key==3)Shori31();
    if(key==4)Shori1();
    }
  }

 処理1から処理3まで基本的な処理は同じです。処理1と処理3では8行目と9行目が反対になっていますが,サブルーチンから戻ってもkeyの内容は戻っていますから,処理は下端まで進み11行目はArduinoですので見えませんがreturn;で親ルーチンに戻ります。

​気になるようでしたら,処理1のように他の処理を先に行っておくと胸のつかえがとれます。return;も書いておいてもエラーになりません。

 キー入力スケッチ例 

 Sketch_jan13a 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

​17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

//宣言部
#include <LiquidCrystal.h>

 

#define LcdLed 10//LCDのLED pin設定

 

LiquidCrystal lcd(8,9,4,5,6,7);//LCD接続pin

 

void setup(){//初期設定部
pinMode(LcdLed,OUTPUT);//LcdLedのpinを出力
digitalWrite(LcdLed,HIGH);//LcdLedをON
  lcd.begin(16, 2);//16文字2行のLCD使用
  lcd.setCursor(0, 0);//カーソル移動
  lcd.print("Hello");//挨拶
  delay(1000);//1秒待機
}

 

void loop() {//繰り返し部
  int key;
  key=KeyIn();//キー入力
  lcd.clear();//液晶クリア
  switch(key){//ボタンによって処理の選択
    case 0:lcd.print("Hello 0");break;
    case 1:lcd.print("Hello 1");break;
    case 2:lcd.print("Hello 2");break;
    case 3:lcd.print("Hello 3");break;
    case 4:Shori1();break;
    default:Hyouji();
    }
    delay(1000);
}

 

//関数・補助部
void Shori1(){//処理1
  int key;
  lcd.clear();
  lcd.print("year");
  delay(500);
  while(1){
    key=KeyIn();
    if(key==0)Shori13();
    if(key==1)return;
    if(key==2)return;
    if(key==3)Shori11();
    if(key==4)Shori2();
    }
  }

void Shori2(){//処理2
  int key;
  lcd.clear();
  lcd.print("Month");
  delay(500);  while(1){
    key=KeyIn();
    if(key==0)Shori24();
    if(key==1)return;
    if(key==2)return;
    if(key==3)Shori21();
    if(key==4)Shori3();
    }
  }

 

void Shori3(){//処理3
  int key;
  lcd.clear();
  lcd.print("Date");
  delay(500);
  while(1){
    key=KeyIn();
    if(key==0)Shori33();
    if(key==1)return;
    if(key==2)return;
    if(key==3)Shori31();
    if(key==4)Shori1();
    }
  }

int KeyIn(){//キー入力
  int pin;
  pin=analogRead(0);//pinにアナログ入力
  if(pin<50){return 0;}//電圧により値を返す
  else if(pin<200){return 1;}
  else if(pin<400){return 2;}
  else if(pin<600){return 3;}
  else if(pin<900){return 4;}
  else return 5;//入力がなければ5を返す
}

int KeyInWate(){//キー入力待ち
  int pin;
  while(1){
  pin=analogRead(0);//pinにアナログ入力
  if(pin<50){return 0;}//電圧により値を返す
  else if(pin<200){return 1;}
  else if(pin<400){return 2;}
  else if(pin<600){return 3;}
  else if(pin<900){return 4;}
  else pin=pin;//入力がなければ入力へ戻る
  }
  return;
}

void Hyouji(){//表示
  lcd.print("Display");//表示内容
  }

 このスケッチでボタン入力によって処理を変えていくことができます。

​ もう一度Selectキーを押したときに処理2や処理3にも移動します。処理3でSelectキーを押すと処理1に移動しますがサブルーチンを呼ぶ形になっているのでネスティング(入れ子)が重なってしまいますが,他のキーで処理をした後returnで戻るため,瞬時にネスティングが解けます。

 処理1と処理2の間に時刻合わせのサブルーチンを作ります。処理2の後には日付合わせ,処理3の後にはアラームセットの処理を書きます。

 キー処理関数2段目 

 処理12

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

void Shori12(){//処理1-2
  int key;
  lcd.clear();lcd.print("Minute");//分合わせ
  delay(500);//前の処理のキー入力が残らない
  while(1){//永遠に繰り返す
    key=KeyIn();//キー入力
    minute=RTC.getMinute();//分読み込み
    lcd.setCursor(0,1);lcd.print(minute);
    if(key==0){Shori11();return;}
    if(key==1){//一分進める
      minute=minute+1;RTC.setMinute(minute);}
    if(key==2){//一分戻る
      minute=minute-1;RTC.setMinute(minute);}
    if(key==3){Shori13();return;}//次の処理へ移動
    if(key==4)return;//selectならば帰る
    delay(500);
    }
  }

​ 処理12 分合わせのサブルーチンです。分を時刻・秒、年月日に替えるとそれぞれの処理ができます。

​ なぜ「分」かというと,時刻の単独取得ができなかったからです。

プロトタイプシールド

 プロトタイプシールド 

 プロトタイプシールド 

 いろいろな部品を実験したり,ちょっとした回路を作ったりするために便利なシールドです。

 2017/6/15現在160円です。

 表面 

 Amazonではプロトタイプシ-ルドは200円以下で安価です。ピンソケットが上下で位置が違うので重ねることができません。

 裏面 

 基板中央には小さなブレッドボード構造がありますので20pinまでのDIP ICを乗せることができます。

 SOICエリア

 基板表面左上には14pinSOICのディバイスを実装するためのパターンがあり,2.54mmピッチに変換できるようになっています。

ユニバーサルシールド

 ユニバーサルシールド 

 ユニバーサル基板は秋月さんから発売されている基板です。

​ 2017/6/15現在1枚200円ですが送料がかかります。1回500円。pinソケットは別売でいろいろなものが選べます。

 pinソケット 

 Arduino用のユニバーサル基板が各社から提供されています。これは秋月電子から出されている基板の一部です。自由度が高く比較的安価なものです(秋月で200円)。Arduinoは6ピン,8ピン,8ピン,10ピンのピンソケットなのですがこの基盤は6p,6p,8p,8pが接続できるようになっています。10pinは刺そうとしても8pinまでしか穴がありません。

 ピンソケットは6,8,8,10は使えません6,6,8,8にします。ピンソケットは15mm(高価)と10mm(安価)がありますが10mmで十分です。

 ピンソケットは6,8,8,10で秋月さんでは160円です。

 ピンソケットは6,6,8,8で秋月さんで140円です。

 pinソケット取り付け 

 ハンダ付けする時に他のシールドにピンソケットを刺してから実行すると垂直に接合することができます。

 ハンダ付け 

 表面が比較的平坦なプロトタイプシールドにピンソケットを刺したところです。これにユニバーサル基板を取り付けます。ハンダ付けの際に安定します。

 ​できあがり 

 これでハンダ付けをするときれいな仕上がりになるのですが,最初のシールドはどこかのレビューで紹介された悪いハンダ付けの例と同じようになってしまいました。

 2つ目はハンダ付けも慣れてきて結構きれいに仕上がりました。

 重ねて使う 

 このように重ねることができます。3段目は結構広く使えます。当然液晶シールドも動作します。

データロガシールド

 データロガシールド 

​ SDカードドライブとRTCを備えてユーザーエリアを持ったシールドです。2017/6/15現在310円

 RTC1307Z 

 データロガーシールドにはRTCDS13072が載っています。時計機能だけならばDS3231と同じようスケッチを書いて使えます。すぐそばにバックアップ用のボタン電池のホルダがあって電源を切っても時計はバックアップできるようになっています。電池はCR1220を使います。LR44と同じくらいの大きさですが,うすくて3Vです。

​ このシールドではRTCとともにSDカードが使えます。その分,フリーエリアはせまくなっています。

 裏側を見るとリードがやわらかく曲がりやすくなっているので注意が必要です。

 pinは柔らかい 

 SDカードの使い方 

 SDカードはSPI接続になっているようです。

​11,12,13が信号線になります。chipSelectはD10pinに接続されていることを目視しました。サンプルプログラムにも接続先を替えるようにと書いてありますので,プログラムを変更します。

 SPI接続なのですが#include <SPI.h>ファイルは必要としません。また,D10pinを出力に設定しなくても動作しました。

 初めはSDカードを認識できませんでした。こすって磨いて,やっとイニシャライズはできましたがファイルが認識できません。ドライバーが悪いのか,機械が悪いのか,フォーマットのせいかよくわかりませんでした。2GのSDカードを8Gに替えてみると正常に動作しました。

​​ 2017/6/15追記ID.1.8.3でコンパイルすると正常に読み書きできます(これは1.8.0)。

 読み込み 

 SD_read

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

​38

//#include <SPI.h>
#include <SD.h>

File myFile;//読み書きするファイルの作成
int ss=10;

void setup() {
  Serial.begin(9600);
  Serial.println("Initializing SD card...");
  //pinMode(ss,OUTPUT);

  if (!SD.begin(ss)) {//SDが使えなかった時
    Serial.println("initialization failed!");
    return;//メッセージを出して終了
  }
  Serial.println("initialization done.");
  if (SD.exists("example.txt")) {//ファイル有
    Serial.println("example.txt exists.");
  } else {//ファイルがなければ
    Serial.println("example.txt doesn't exist.");
    return;//終了
  }

 

  //write書き込み
  myFile=SD.open("example.txt",FILE_WRITE);
  myFile.println("test3456");
  myFile.close();

 

  //read読み出し


  myFile=SD.open("example.txt");
    while (myFile.available()) {
      Serial.write(myFile.read());
    }
  myFile.close();
}

 

void loop() {

}

 CSはpin10,ファイル開く

 スケッチ例のコメントを削除して,少々手を加えました。

 ssの所は重要です。接続を確かめて変更します。SDカードによっては使えないものもあるので気を付けなくてはなりません。

​​ ssの10pinはLCD Keypad Shieldで表示用LEDの接続場所になっています。同時に使用するとLCDの表示が明暗します。使用はできます。

​ 26行目のSD.openでファイルを開くことができます。myFile= は読み書き用のファイルです。オプションのFILE_WRITEで書き込みできるようになります。省略すると読み込みになります。

 *書き込みモードにするとファイルがなければ 新規に作成されます。

 書き込み 

 書き込みモードでOPENしてあれば

 myFile.println("testing");

​ で追加書き込みできます。

 myFile.read()ではファイルの中の1文字を読みます。binaryなのでSerial.printではコードの数字になります。Serial.writeでキャラクタが表示されます。

​ 31,32,33行目のように

 while (myFile.available()) {

  Serial.write(myFile.read());

  }

​ と書くと,ファイルの中身全てを表示します。

 コマンド一覧 

begin()
exists()
mkdir()
open()
remove()
rmdir()

初期化

存在しているか

ディレクトリ作成

​開く

ファイル削除

ディレクトリ削除

available()

close()

flush()

peek()

position()

print()

println()

seek()

size()

read()

write()

isDirectory()

openNextFile()

rewindDirectory()

読み込み可能なバイトがあるか

クローズ

フラッシュ

ファイル内の同位置で読み取り

ファイル内の位置決め

書き込み

書き込み改行

最新位置への移動

サイズ取得

バイト読み込み

バイト書き込み

ディレクトリか?

次のファイルまたはフォルダ開く

​ディレクトリ初めへ

 DS1307 

 DS1307は使用する場合は1~4行のインクルードファイルが必要になります。tmElements_t構造体で時刻や日付のやり取りをします。使い方は下のプログラムの通りです。ArduinoとはI2C接続になります。

RTC DS1307

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include <DS1307RTC.h>

//DS1307RTC RTC;

 

void setup() {
    Serial.begin(9600);//serial初期化
    Wire.begin();      //wire初期化
    Serial.println("Test of DS1307");
}

 

void loop() {
tmElements_t tm;

    RTC.read(tm);
    Serial.print("Time = ");
    Serial.print(tm.Hour);//時刻(時)
    Serial.write(':');
    Serial.print(tm.Minute);//時刻(分)
    Serial.write(':');
    Serial.print(tm.Second);//時刻(秒)
    Serial.write(' ');
    Serial.print(tm.Day);//日付
    Serial.write('/');
    Serial.print(tm.Month);//月
    Serial.write('/');
    Serial.print(tmYearToCalendar(tm.Year));//年
    Serial.println();

    delay(1000);
}

 DS1307の評判はいいようですが,私の所に来たものは一週間で2分9秒進んでしまいました。

センサシールド

 センサシールド 

 センサシールドという名前でいろいろなセンサをつなぐことができるのか試したくなりました。

​ データpinとアナログpin 

 電源と入出力線1本をセットにした3端子のコンセントを全てのデジタル,アナログ入出力に繋いだものでアナログPINHA横からも取り出すことができます。

 3本一組の端子 

 3つの端子がセットになっています。上のpin Gがグランドで,真ん中のpinが+5Vです。下のpinはシルクの数字のデジタルpin又はアナログpinとつながっています。

 全てのデジタルpinとアナログpinの信号線に接続されています。赤い丸がデジタル信号で青い丸がアナログ信号です。アナログ信号はGNDと+5Vの電源と3pinのペアとして水平方向からも引き出すことができるようになっています(並列接続です)。

 他の使い方 

 センサだけでなくI2Cの接続にも使えます。電源はたくさんありますので便利です。

モータドライバシールド

 モータドライブシールド 

 モータドライバシールドを手に入れました。ステッパもDCモータもコントロールできるそうです。017年6月9日(金)入手

 L298N 

2017年7月17日(月)

2022年10月22日450円位

 L293N回路図 

 L293Dを2個使ったモーターシールドです。DCモータを4つまたは4端子ステッピングモータを2つコントロールすることができます。

 モータ電源36V600mA コントロール3.3V,5V

 L293Dは2回路のモータドライバICです。それぞれの回路は右のようにハーフブリッジのモータドライバになっています。

 上の写真は2つ使った4個のDC​モータ又は2個の4端子ステッピングモータをコントロールできるシールドです。

 L293モータシールドは4つのDCモータか2つのステッピングぐモータを駆動します。配線はシールドでされていますのでスケッチを書くだけでモータが動きます。

 モータドライバシールド回路図 

 シールド全体の回路図です。74HCT595Nがシフトレジスタです。直接データを転送するより信号線は少なくなりますが,仕組みが複雑になります。

 モータドライバシールドは直接信号を増幅するのではなくシフトレジスタによってデータ

他を転送する仕組みになっています。

 74HC595Nシフトレジスタを介していますのでpin数は少なくて済みますが,スケッチは少々複雑になります。

 真理値表 

 シリアル入力をシフトレジスタに蓄えて

 8bitレジスタに伝えて

​OE!シグナルによって解放します。

 74HS595N 

 タイミング図 

 データの書き込みと出力のタイミング図です。

*74HCT595Nデータシートより抜粋

 モニタ用LED 

 4個のLED​に電流制限用の抵抗を付けて出力をモニタします。

 M3M4出力 

 M3とM4の出力に繋ぎます。

 シールド全体の回路図 

 Adflt商品説明より抜粋

 モータドライバシールドの基板は上のようになっています。しかし,adfultでは販売終了になってしまいました。

*他のメーカーは同じものを作っています。

 pin配置 

 この表のとおりに8bitのレジスタにデータが書き込まれて出力されます。

​ 74HCT595Nの10番pinがVCCに接続されていることでシフトレジスタはクリアされず入力を受け入れ続けます。pin数は節約されます。

​ SERが入力信号になる。

*74HCT595Nデータシートより抜粋

 試験用スケッチ 

a0000_HC595_000_TEST

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

//宣言部
#define CLK 4       //pin4をCLK(クロック)
#define EN 7        //pin7をEN(イネーブル)
#define SER 8       //pin8をSER(シリアル)
#define LATCH 12    //pin12をLATCH(ラッチ)

//初期設定部
void setup() {
  pinMode(4,OUTPUT);  //pin4をアウトプット
  pinMode(7,OUTPUT);  //pin7をアウトプット
  pinMode(8,OUTPUT);  //pin8をアウトプット
  pinMode(12,OUTPUT); //pin12をアウトプット
 
  digitalWrite(EN,HIGH);//ENはHIGH
  digitalWrite(CLK,LOW);//CLKはLOW
  digitalWrite(LATCH,LOW);//LATCHはLOW
  digitalWrite(SER,HIGH);//SERはHIGH
  for(int i=0;i<8;i++){//8個シフトレジスタに
    digitalWrite(CLK,HIGH);//data書き込み
    delay(1);//待機1ms
    digitalWrite(CLK,LOW);//CLKを戻す
    delay(1);//待機1ms
  } 

 

  digitalWrite(LATCH,HIGH);//REGISTERに書きこむ
  delay(1);//待機1ms
  digitalWrite(LATCH,LOW);//準備
  delay(1);//待機1ms
}

//繰り返し部
void loop() {
  digitalWrite(EN,LOW);//出力
  delay(1000);//待機1秒
  digitalWrite(EN,HIGH);//出力しない
  delay(1000);//待機1秒
}

//関数・補助部
 

 外部電源 

​ スケッチを書いてみました。17行目のSERを"LOW"にしたり"HI"にしたりしてDATAが書き込まれているか調べました。

 なんということでしょう2個しか点灯しません。配線を変えてみると同じく真ん中の2つだけ点灯。

 LEDを取り変えると4つとも点灯しました。LEDが切れていたのでしょうか?緑だけ動作電流が大きいのでしょうか?

 とりあえず動作しているようなので良かったと思います。いろいろな実験ができます。後でよく見てみると弱く緑のLEDも点灯していました。

​ 実験1.delayは取ってしまっても大丈夫でした。

 レジスタのアドレスと出力は順番が一致しませんでした。対応表と出力ピンを示します。

 出力対応表 

 ステッピングモータ接続 

 ブレッドボードにステッピングモータをつなぎUSB電源で回してみました。200mA超の電流が流れましたが,パソコンは壊れませんでした(良い子はまねしてはいけません)。

 ステッピングモータ回転試験 

a0000_HC595_004_sutepper_TEST3

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

//宣言部
#define CLK 4       //pin4をCLK(クロック)
#define EN 7        //pin7をEN(イネーブル)
#define SER 8       //pin8をSER(シリアル)
#define LATCH 12    //pin12をLATCH(ラッチ)

//初期設定部
void setup() {
  pinMode(4,OUTPUT);  //pin4をアウトプット
  pinMode(7,OUTPUT);  //pin7をアウトプット
  pinMode(8,OUTPUT);  //pin8をアウトプット
  pinMode(12,OUTPUT); //pin12をアウトプット
 
  digitalWrite(EN,LOW);//ENはLOW
  digitalWrite(CLK,LOW);//CLKはLOW
  digitalWrite(LATCH,LOW);//LATCHはLOW
  digitalWrite (SER,LOW);//SER(DATA)はLOW
}

//繰り返し部
void loop() {
  int M=10000;
  arupin1(3);//M2L ON
  delayMicroseconds(M);
  arupin1(6);//M2R ON
  delayMicroseconds(M);
  arupin1(4);//M1L ON
  delayMicroseconds(M);
  arupin1(5);//M1R ON
  delayMicroseconds(M);
}

//関数・補助部
void subete0(){
  for(int i=0;i<8;i++){//8個シフトレジスタに
    digitalWrite(CLK,HIGH);//data書き込み
    digitalWrite(CLK,LOW);//CLKを戻す
  }
  digitalWrite(LATCH,HIGH);//REGISTERに書きこむ
  digitalWrite(LATCH,LOW);//準備
}

void arupin1(int n){
  for(int i=0;i<8;i++){//8個シフトレジスタに
  if(i==n){digitalWrite (SER,1);}
    digitalWrite(CLK,HIGH);//data書き込み
    digitalWrite(CLK,LOW);//CLKを戻す
    digitalWrite (SER,0);
  }
  digitalWrite(LATCH,HIGH);//REGISTERに書きこむ
  digitalWrite(LATCH,LOW);//準備
}

 ステッピングモータを回すための最低限のスケッチです。

​ 22行目のMの値を変えることで回転速度をコントロールできます。23から29行のpinナンバーを反対にすると逆回転します。

 USB電源では電圧が低いのか弱々しく力もありません。指先でつまむだけで回転は止まってしまいます。

 Mは4000がぎりぎりで3000で苦しそうで,2000ではカクカク,1000では震えるだけです。

 ステッピングモータの思い出 

 *6月9日から本日7月25日まで実に7カ月半かかりましたが,くるくる回るステッピングモータを見ているとうれしくなります。

 *もう何十年も前の話です。以前戦車を作ったことがあるのですが真っ直ぐに進ませようとしても直進させることはできませんでした。戦車と言っても戦争が好きなわけではありません。障害物を乗り越えていくことのできる運搬装置が素晴らしいと思ったのです。しかし,慎重に作っても真っ直ぐに進ませることは難しいことでした。

 ステッピングモータは1回転の何十分の1の角度を制御できると知り,このモータで車を作って直進させたいと思いました。

 秋月さんの販売していたステッピングモータ駆動装置を知ったのは10年くらい前のことです。キットを購入してステッピングモータを(ステッピングモータの方を先に入手していました)回しました。回転数はコントロールできましたがVRでの操作でした。

​ 当時はマイコンの存在(TK-80以外)の存在を知りませんでした。マイコンで制御できることもそのころ知ったのです。数十年の時の隔たりの成果です。

​ どんくさいやっちゃ!2017/7/26 もうすぐ8月1日Arduino歴一年です。

a0000_HC595_004_sutepper_TEST3

 古い電源装置で外部から12Vを供給してみます。

 回転試験2 

 ジャンパを外して外部電源入力に変更します。ステッピングモータも直接端子に接続します。

 直接接続 

 12Vの電源を加えると回転がスムーズになります。上のスケッチで24,26,28,30行目はdeleyであった部分をdelayMicrosecondsに替えてあります。1ms以下を試してみたかったからです。

 USB電源では3msで回転させることが限界でした。12Vの外部電源の供給によって回転はとてもスムーズになりました。最終的には802μsまで回転させることができました。快適な早さです。

 カクカクカクとステッピングモータ特有のステップ回転からクイーンという高速回転までできるようになりました。

 使用ステッピングモータ 

 今回使用したのはプリンタを分解したときに出てきたステップモータです。

 STP-42D163は12Vのステッピングモータで,1回転のステップ数は50でした。

 試験スケッチ 

19

20

21

22

23

24

25

26

27

28

29

30

31

​32

//繰り返し部
void loop() {
  int M=3000;
  arupin1(3);//M2L ON
  delayMicroseconds(M);
  arupin1(6);//M2R ON
  delayMicroseconds(M);
  arupin1(4);//M1L ON
  delayMicroseconds(M);
  arupin1(5);//M1R ON
  delayMicroseconds(M);

 delay(500);
}

 低速で回転するときにL293Dが発熱して高温になってしまいます。低速回転ではMを最低にしておいて,31行目を追加して速度を決めると発熱が少なくなります。

​ (30行は要りません。)

  モジュール 

 シールドではありませんがよく使うモジュールです。

アンカー 1

 LED Keyモジュール 

 8桁7segLEDと8個の単独LED更に8つにキーを持つモジュールです。

アンカー 1

 8X7segモジュール 

 8桁7セグメントのLED表示器をMAX7219でドライブしているモジュールです。

 有機ELモジュール 

有機EL_LCDモジュール

 有機ELのLED表示機です。消費電力も少なく,とても見やすい表示機です(高価です)。

I2C液晶モジュール

 I2C液晶モジュール 

 I2C接続の16X2LCD表示機です。配線が4本で済むのでとても便利です。

 RTCモジュール 

RTC DS3231

 RTC時計のモジュールです年間1,2分の誤差で動作します。バッテリーバックアプが裏のボタン電池で自動的になされます。EEPROMも付いています。

 右はDS3231だけをDIPの基板にしています。

 DS1302基本的なRTCです。基本機能を持っていて大きな2032ボタン電池でバックアップしています。

 モータドライバモジュール 

モータドライバ

 L298N 

L298N

​ L298Nを使ったモータドライブモジュールです。画面左がそのICです。放熱板も付いていかにも大出力という感じです。写真上と下の端子がモータ出力右下3pが電源右上4pは信号線です。

 モータ電源46V4A コントロール5V

L9110S

 左のヒートシンクを備えたものがL298Nです。1つ使って2個のDCモータ又は1つの4端子ステッピングモータをコントロールできます。構造は単純で写真右上の4本の入力pinに直接信号を送るとそのまま出力に反映ます。

 出力は写真の上下にある2端子のコネクタです。右の3端子のコネクタは電源端子で中央がGNDその上側の赤い線がつながっている端子が5V下は12Vの端子です。

​ 扱いがとても簡単なのでドラえもんのロボッターのように使えてしまいます。私はスマートカーに使いました。

 もっとも安価かつ小型なモータドライバの一つだと思います。

 L9110S 

 L9110Sもっとも安価?なモータドライバモジュールです。​​ 写真下のpinにArduinoを接続します。左の2pinがB入力,中央がGND,VCC右の2pinがA入力です。写真上の緑の端子がABそれぞれのモータ出力です。

 モータ電源12V800mA コントロール3.3V,5V

 上の2×2のコネクタはモータへの出力端子です。

 下の6pinコネクタは左が入力1,2 右が入力3,4です。中央の2pinはGNDとVCCです。

L9110S データシート

L9110S データシート

 L9110S回路が2組入っています。それぞれのICになります。

bottom of page